OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 The Polymer Authors. All rights reserved. | 2 * Copyright 2013 The Polymer Authors. All rights reserved. |
3 * Use of this source code is goverened by a BSD-style | 3 * Use of this source code is goverened by a BSD-style |
4 * license that can be found in the LICENSE file. | 4 * license that can be found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 // TODO(jmesserly): polyfill does not have feature testing or the definition of | 7 // TODO(jmesserly): polyfill does not have feature testing or the definition of |
8 // SideTable. The extra code is from: | 8 // SideTable. The extra code is from: |
9 // https://github.com/Polymer/CustomElements/blob/master/src/MutationObserver.js | 9 // https://github.com/Polymer/CustomElements/blob/master/src/MutationObserver.js |
10 // https://github.com/Polymer/CustomElements/blob/master/src/sidetable.js | 10 // https://github.com/Polymer/CustomElements/blob/master/src/sidetable.js |
11 // I also renamed JsMutationObserver -> MutationObserver to correctly interact | 11 // I also renamed JsMutationObserver -> MutationObserver to correctly interact |
12 // with dart2js interceptors. | 12 // with dart2js interceptors. |
| 13 |
13 if (!window.MutationObserver && !window.WebKitMutationObserver) { | 14 if (!window.MutationObserver && !window.WebKitMutationObserver) { |
14 | 15 |
15 (function(global) { | 16 (function(global) { |
16 // SideTable is a weak map where possible. If WeakMap is not available the | 17 // SideTable is a weak map where possible. If WeakMap is not available the |
17 // association is stored as an expando property. | 18 // association is stored as an expando property. |
18 var SideTable; | 19 var SideTable; |
19 // TODO(arv): WeakMap does not allow for Node etc to be keys in Firefox | 20 // TODO(arv): WeakMap does not allow for Node etc to be keys in Firefox |
20 if (typeof WeakMap !== 'undefined' && navigator.userAgent.indexOf('Firefox/')
< 0) { | 21 if (typeof WeakMap !== 'undefined' && navigator.userAgent.indexOf('Firefox/')
< 0) { |
21 SideTable = WeakMap; | 22 SideTable = WeakMap; |
22 } else { | 23 } else { |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 * @constructor | 177 * @constructor |
177 */ | 178 */ |
178 function MutationObserver(callback) { | 179 function MutationObserver(callback) { |
179 this.callback_ = callback; | 180 this.callback_ = callback; |
180 this.nodes_ = []; | 181 this.nodes_ = []; |
181 this.records_ = []; | 182 this.records_ = []; |
182 this.uid_ = ++uidCounter; | 183 this.uid_ = ++uidCounter; |
183 } | 184 } |
184 | 185 |
185 MutationObserver.prototype = { | 186 MutationObserver.prototype = { |
186 // TODO(jmesserly): why is this necessary? | |
187 get constructor() { return MutationObserver; }, | |
188 | |
189 observe: function(target, options) { | 187 observe: function(target, options) { |
190 target = wrapIfNeeded(target); | 188 target = wrapIfNeeded(target); |
191 | 189 |
192 // 1.1 | 190 // 1.1 |
193 if (!options.childList && !options.attributes && !options.characterData || | 191 if (!options.childList && !options.attributes && !options.characterData || |
194 | 192 |
195 // 1.2 | 193 // 1.2 |
196 options.attributeOldValue && !options.attributes || | 194 options.attributeOldValue && !options.attributes || |
197 | 195 |
198 // 1.3 | 196 // 1.3 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 this.target = target; | 269 this.target = target; |
272 this.addedNodes = []; | 270 this.addedNodes = []; |
273 this.removedNodes = []; | 271 this.removedNodes = []; |
274 this.previousSibling = null; | 272 this.previousSibling = null; |
275 this.nextSibling = null; | 273 this.nextSibling = null; |
276 this.attributeName = null; | 274 this.attributeName = null; |
277 this.attributeNamespace = null; | 275 this.attributeNamespace = null; |
278 this.oldValue = null; | 276 this.oldValue = null; |
279 } | 277 } |
280 | 278 |
| 279 // TODO(jmesserly): this fixes the interceptor dispatch on IE. |
| 280 // Not sure why this is necessary. |
| 281 MutationObserver.prototype.constructor = MutationObserver; |
| 282 MutationObserver.name = 'MutationObserver'; |
| 283 MutationRecord.prototype.constructor = MutationRecord; |
| 284 MutationRecord.name = 'MutationRecord'; |
| 285 |
281 function copyMutationRecord(original) { | 286 function copyMutationRecord(original) { |
282 var record = new MutationRecord(original.type, original.target); | 287 var record = new MutationRecord(original.type, original.target); |
283 record.addedNodes = original.addedNodes.slice(); | 288 record.addedNodes = original.addedNodes.slice(); |
284 record.removedNodes = original.removedNodes.slice(); | 289 record.removedNodes = original.removedNodes.slice(); |
285 record.previousSibling = original.previousSibling; | 290 record.previousSibling = original.previousSibling; |
286 record.nextSibling = original.nextSibling; | 291 record.nextSibling = original.nextSibling; |
287 record.attributeName = original.attributeName; | 292 record.attributeName = original.attributeName; |
288 record.attributeNamespace = original.attributeNamespace; | 293 record.attributeNamespace = original.attributeNamespace; |
289 record.oldValue = original.oldValue; | 294 record.oldValue = original.oldValue; |
290 return record; | 295 return record; |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
574 } | 579 } |
575 | 580 |
576 clearRecords(); | 581 clearRecords(); |
577 } | 582 } |
578 }; | 583 }; |
579 | 584 |
580 global.MutationObserver = MutationObserver; | 585 global.MutationObserver = MutationObserver; |
581 })(window); | 586 })(window); |
582 | 587 |
583 } | 588 } |
OLD | NEW |