@@ -85,8 +85,44 @@ class XREngineTemplate extends HTMLTemplateElement {
8585 for ( let i = 0 ; i < childNodes . length ; i ++ ) {
8686 const childNode = childNodes [ i ] ;
8787 if ( childNode . nodeType === Node . ELEMENT_NODE ) {
88- const xrIframe = document . importNode ( childNode , true ) ;
89- this . insertAdjacentElement ( 'afterend' , xrIframe ) ;
88+ let node = document . importNode ( childNode , true ) ;
89+ let scripts = node . matches ( 'script' ) ? [ node ] : Array . from ( node . querySelectorAll ( 'script' ) ) ;
90+ scripts = scripts . map ( oldScript => {
91+ const { src, innerHTML} = oldScript ;
92+ const script = document . createElement ( 'script' ) ;
93+ if ( src ) {
94+ script . spec = {
95+ type : 'src' ,
96+ data : src ,
97+ } ;
98+ } else {
99+ script . spec = {
100+ type : 'innerHTML' ,
101+ data : innerHTML ,
102+ } ;
103+ }
104+ if ( oldScript . parentNode ) {
105+ oldScript . parentNode . replaceChild ( script , oldScript ) ;
106+ }
107+ if ( oldScript === node ) {
108+ node = script ;
109+ }
110+ return script ;
111+ } ) ;
112+ this . insertAdjacentElement ( 'afterend' , node ) ;
113+ for ( let i = 0 ; i < scripts . length ; i ++ ) {
114+ const script = scripts [ i ] ;
115+ const p = new Promise ( ( accept , reject ) => {
116+ script . addEventListener ( 'load' , accept ) ;
117+ script . addEventListener ( 'error' , reject ) ;
118+ } ) ;
119+ if ( script . spec . type === 'src' ) {
120+ script . src = script . spec . data ;
121+ } else if ( script . spec . type === 'innerHTML' ) {
122+ script . innerHTML = script . spec . data ;
123+ }
124+ await p ;
125+ }
90126 }
91127 }
92128 } ) ( ) ;
0 commit comments