21
21
CustomElements . addModule ( function ( scope ) {
22
22
23
23
// imports
24
+ var isIE11OrOlder = scope . isIE11OrOlder ;
24
25
var upgradeDocumentTree = scope . upgradeDocumentTree ;
25
- var upgrade = scope . upgrade ;
26
+ var upgradeAll = scope . upgradeAll ;
26
27
var upgradeWithDefinition = scope . upgradeWithDefinition ;
27
28
var implementPrototype = scope . implementPrototype ;
28
29
var useNative = scope . useNative ;
@@ -291,20 +292,9 @@ function createElement(tag, typeExtension) {
291
292
return element ;
292
293
}
293
294
294
- function cloneNode ( deep ) {
295
- // call original clone
296
- var n = domCloneNode . call ( this , deep ) ;
297
- // upgrade the element and subtree
298
- upgrade ( n ) ;
299
- // return the clone
300
- return n ;
301
- }
302
-
303
295
// capture native createElement before we override it
304
296
var domCreateElement = document . createElement . bind ( document ) ;
305
297
var domCreateElementNS = document . createElementNS . bind ( document ) ;
306
- // capture native cloneNode before we override it
307
- var domCloneNode = Node . prototype . cloneNode ;
308
298
309
299
// Create a custom 'instanceof'. This is necessary when CustomElements
310
300
// are implemented via a mixin strategy, as for example on IE10.
@@ -329,11 +319,44 @@ if (!Object.__proto__ && !useNative) {
329
319
} ;
330
320
}
331
321
322
+ // wrap a dom object method that works on nodes such that it forces upgrade
323
+ function wrapDomMethodToForceUpgrade ( obj , methodName ) {
324
+ var orig = obj [ methodName ] ;
325
+ obj [ methodName ] = function ( ) {
326
+ var n = orig . apply ( this , arguments ) ;
327
+ upgradeAll ( n ) ;
328
+ return n ;
329
+ } ;
330
+ }
331
+
332
+ wrapDomMethodToForceUpgrade ( Node . prototype , 'cloneNode' ) ;
333
+ wrapDomMethodToForceUpgrade ( document , 'importNode' ) ;
334
+
335
+ // Patch document.importNode to work around IE11 bug that
336
+ // casues children of a document fragment imported while
337
+ // there is a mutation observer to not have a parentNode (!?!)
338
+ if ( isIE11OrOlder ) {
339
+ ( function ( ) {
340
+ var importNode = document . importNode ;
341
+ document . importNode = function ( ) {
342
+ var n = importNode . apply ( document , arguments ) ;
343
+ // Copy all children to a new document fragment since
344
+ // this one may be broken
345
+ if ( n . nodeType == n . DOCUMENT_FRAGMENT_NODE ) {
346
+ var f = document . createDocumentFragment ( ) ;
347
+ f . appendChild ( n ) ;
348
+ return f ;
349
+ } else {
350
+ return n ;
351
+ }
352
+ } ;
353
+ } ) ( ) ;
354
+ }
355
+
332
356
// exports
333
357
document . registerElement = register ;
334
358
document . createElement = createElement ; // override
335
359
document . createElementNS = createElementNS ; // override
336
- Node . prototype . cloneNode = cloneNode ; // override
337
360
scope . registry = registry ;
338
361
scope . instanceof = isInstance ;
339
362
scope . reservedTagList = reservedTagList ;
0 commit comments