2121CustomElements . addModule ( function ( scope ) {
2222
2323// imports
24+ var isIE11OrOlder = scope . isIE11OrOlder ;
2425var upgradeDocumentTree = scope . upgradeDocumentTree ;
25- var upgrade = scope . upgrade ;
26+ var upgradeAll = scope . upgradeAll ;
2627var upgradeWithDefinition = scope . upgradeWithDefinition ;
2728var implementPrototype = scope . implementPrototype ;
2829var useNative = scope . useNative ;
@@ -291,20 +292,9 @@ function createElement(tag, typeExtension) {
291292 return element ;
292293}
293294
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-
303295// capture native createElement before we override it
304296var domCreateElement = document . createElement . bind ( document ) ;
305297var domCreateElementNS = document . createElementNS . bind ( document ) ;
306- // capture native cloneNode before we override it
307- var domCloneNode = Node . prototype . cloneNode ;
308298
309299// Create a custom 'instanceof'. This is necessary when CustomElements
310300// are implemented via a mixin strategy, as for example on IE10.
@@ -329,11 +319,44 @@ if (!Object.__proto__ && !useNative) {
329319 } ;
330320}
331321
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+
332356// exports
333357document . registerElement = register ;
334358document . createElement = createElement ; // override
335359document . createElementNS = createElementNS ; // override
336- Node . prototype . cloneNode = cloneNode ; // override
337360scope . registry = registry ;
338361scope . instanceof = isInstance ;
339362scope . reservedTagList = reservedTagList ;
0 commit comments