@@ -17,6 +17,15 @@ class InElementSupportProvider {
1717 // nope
1818 }
1919
20+ try {
21+ requireModule (
22+ '@glimmer/manager'
23+ ) . CustomModifierManager . prototype . getDebugInstance = ( args ) =>
24+ args . modifier || args . delegate ;
25+ } catch ( e ) {
26+ // nope
27+ }
28+
2029 this . DESTROY = emberSafeRequire ( '@glimmer/util' ) ?. DESTROY ;
2130 this . registerDestructor =
2231 emberSafeRequire ( '@glimmer/destroyable' ) ?. registerDestructor ||
@@ -42,7 +51,13 @@ class InElementSupportProvider {
4251 const NewElementBuilder = this . NewElementBuilder ;
4352 const componentStack = [ ] ;
4453
45- const enableModifierSupport = isInVersionSpecifier ( '>3.28.0' , VERSION ) ;
54+ const enableModifierSupport =
55+ isInVersionSpecifier ( '>3.28.0' , VERSION ) &&
56+ ! isInVersionSpecifier ( '>5.9.0' , VERSION ) ;
57+ const hasModifierAndInElementSupport = isInVersionSpecifier (
58+ '>5.9.0' ,
59+ VERSION
60+ ) ;
4661
4762 function createRef ( value ) {
4863 if ( self . reference . createUnboundRef ) {
@@ -64,21 +79,43 @@ class InElementSupportProvider {
6479
6580 const appendChild = this . debugRenderTree . appendChild ;
6681 this . debugRenderTree . appendChild = function ( node , state ) {
67- if ( node . type === 'component' ) {
82+ if ( node . type === 'component' || node . type === 'keyword' ) {
6883 componentStack . push ( node ) ;
6984 }
7085 return appendChild . call ( this , node , state ) ;
7186 } ;
7287
88+ let currentElement = null ;
89+
90+ const captureNode = this . debugRenderTree . captureNode ;
91+ this . debugRenderTree . captureNode = function ( id , state ) {
92+ const node = this . nodeFor ( state ) ;
93+ const res = captureNode . call ( this , id , state ) ;
94+ res . meta = node . meta ;
95+ return res ;
96+ } ;
97+
7398 const exit = this . debugRenderTree . exit ;
7499 this . debugRenderTree . exit = function ( state ) {
75100 const node = this . nodeFor ( this . stack . current ) ;
76- if ( node ?. type === 'component' ) {
101+ if ( node ?. type === 'component' || node . type === 'keyword' ) {
77102 componentStack . pop ( ) ;
78103 }
79104 return exit . call ( this , state ) ;
80105 } ;
81106
107+ const enter = this . debugRenderTree . enter ;
108+ this . debugRenderTree . enter = function ( ...args ) {
109+ enter . call ( this , ...args ) ;
110+ const node = this . nodeFor ( args [ 0 ] ) ;
111+ if ( node ?. type === 'keyword' && node . name === 'in-element' ) {
112+ node . meta = {
113+ parentElement : currentElement ,
114+ } ;
115+ }
116+ return node ;
117+ } ;
118+
82119 const didAppendNode = NewElementBuilder . prototype . didAppendNode ;
83120 NewElementBuilder . prototype . didAppendNode = function ( ...args ) {
84121 args [ 0 ] . __emberInspectorParentNode = componentStack . at ( - 1 ) ;
@@ -92,7 +129,7 @@ class InElementSupportProvider {
92129 } ;
93130
94131 const pushModifiers = NewElementBuilder . prototype . pushModifiers ;
95- if ( enableModifierSupport ) {
132+ if ( enableModifierSupport && ! hasModifierAndInElementSupport ) {
96133 NewElementBuilder . prototype . pushModifiers = function ( modifiers ) {
97134 const debugRenderTree = self . debugRenderTree ;
98135 if ( debugRenderTree ) {
@@ -171,68 +208,63 @@ class InElementSupportProvider {
171208 }
172209
173210 const pushRemoteElement = NewElementBuilder . prototype . pushRemoteElement ;
174- NewElementBuilder . prototype . pushRemoteElement = function (
175- element ,
176- guid ,
177- insertBefore
178- ) {
179- const ref = createRef ( element ) ;
180- const capturedArgs = {
181- positional : [ ref ] ,
182- named : { } ,
183- } ;
184- if ( insertBefore ) {
185- capturedArgs . named . insertBefore = insertBefore ;
186- }
187- const debugRenderTree = self . debugRenderTree ;
188-
189- const r = pushRemoteElement . call ( this , element , guid , insertBefore ) ;
190- const block = this . blockStack . current ;
191-
192- if ( this . DESTROY ) {
193- const destructor = block [ this . DESTROY ] ;
194- block [ this . DESTROY ] = function ( ) {
195- self . debugRenderTree ?. willDestroy ( block ) ;
196- destructor . call ( this ) ;
211+ const popRemoteElement = NewElementBuilder . prototype . popRemoteElement ;
212+ if ( ! hasModifierAndInElementSupport ) {
213+ NewElementBuilder . prototype . pushRemoteElement = function (
214+ element ,
215+ guid ,
216+ insertBefore
217+ ) {
218+ const ref = createRef ( element ) ;
219+ const capturedArgs = {
220+ positional : [ ref ] ,
221+ named : { } ,
197222 } ;
198- } else {
199- self . registerDestructor ?. ( block , ( ) => {
200- self . debugRenderTree ?. willDestroy ( block ) ;
201- } ) ;
202- }
223+ if ( insertBefore ) {
224+ capturedArgs . named . insertBefore = insertBefore ;
225+ }
226+ const debugRenderTree = self . debugRenderTree ;
203227
204- debugRenderTree ?. create ( block , {
205- type : 'keyword' ,
206- name : 'in-element' ,
207- args : createArgs ( capturedArgs ) ,
208- instance : {
209- args : {
210- named : {
211- insertBefore,
212- } ,
213- positional : [ element ] ,
214- } ,
215- constructor : {
216- name : 'InElement' ,
217- } ,
218- } ,
219- } ) ;
220- return r ;
221- } ;
228+ const r = pushRemoteElement . call ( this , element , guid , insertBefore ) ;
229+ const block = this . blockStack . current ;
230+
231+ if ( this . DESTROY ) {
232+ const destructor = block [ this . DESTROY ] ;
233+ block [ this . DESTROY ] = function ( ) {
234+ self . debugRenderTree ?. willDestroy ( block ) ;
235+ destructor . call ( this ) ;
236+ } ;
237+ } else {
238+ self . registerDestructor ?. ( block , ( ) => {
239+ self . debugRenderTree ?. willDestroy ( block ) ;
240+ } ) ;
241+ }
222242
223- const popRemoteElement = NewElementBuilder . prototype . popRemoteElement ;
224- NewElementBuilder . prototype . popRemoteElement = function ( ...args ) {
225- const block = this . blockStack . current ;
226- popRemoteElement . call ( this , ...args ) ;
227- const parentElement = this . element ;
228- const debugRenderTree = self . debugRenderTree ;
229- debugRenderTree ?. didRender ( block , {
230- parentElement : ( ) => parentElement ,
231- firstNode : ( ) => block . firstNode ( ) ,
232- lastNode : ( ) => block . lastNode ( ) ,
233- } ) ;
234- } ;
243+ debugRenderTree ?. create ( block , {
244+ type : 'keyword' ,
245+ name : 'in-element' ,
246+ args : createArgs ( capturedArgs ) ,
247+ } ) ;
248+ return r ;
249+ } ;
235250
251+ NewElementBuilder . prototype . popRemoteElement = function ( ...args ) {
252+ const block = this . blockStack . current ;
253+ popRemoteElement . call ( this , ...args ) ;
254+ const parentElement = this . element ;
255+ const debugRenderTree = self . debugRenderTree ;
256+ debugRenderTree ?. didRender ( block , {
257+ parentElement : ( ) => parentElement ,
258+ firstNode : ( ) => block . firstNode ( ) ,
259+ lastNode : ( ) => block . lastNode ( ) ,
260+ } ) ;
261+ } ;
262+ } else {
263+ NewElementBuilder . prototype . pushRemoteElement = function ( ...args ) {
264+ currentElement = this . element ;
265+ return pushRemoteElement . call ( this , ...args ) ;
266+ } ;
267+ }
236268 this . debugRenderTreeFunctions = {
237269 appendChild,
238270 exit,
@@ -568,8 +600,14 @@ export default class RenderTree {
568600
569601 if ( serialized === undefined ) {
570602 this . nodes [ node . id ] = node ;
571- if ( node . type === 'keyword' ) {
603+ if ( node . type === 'keyword' && node . name === 'in-element' ) {
572604 node . type = 'component' ;
605+ node . instance = {
606+ args : node . args ,
607+ constructor : {
608+ name : 'InElement' ,
609+ } ,
610+ } ;
573611 this . inElementSupport ?. nodeMap . set ( node , node . id ) ;
574612 this . inElementSupport ?. remoteRoots . push ( node ) ;
575613 }
@@ -607,6 +645,7 @@ export default class RenderTree {
607645 parentNode . children . forEach ( ( child ) => {
608646 if (
609647 child . bounds . parentElement === node . instance ||
648+ child . meta ?. parentElement === node . instance ||
610649 ( child . type === 'modifier' &&
611650 child . bounds . firstNode === node . instance )
612651 ) {
@@ -629,6 +668,10 @@ export default class RenderTree {
629668 }
630669
631670 if ( node . type === 'modifier' ) {
671+ node . name = node . name
672+ ?. replace ( / [ A - Z ] / g, ( m ) => '-' + m . toLowerCase ( ) )
673+ . replace ( / ^ - / , '' )
674+ . replace ( '-modifier' , '' ) ;
632675 node . instance =
633676 node . instance || this . _createSimpleInstance ( node . name , node . args ) ;
634677 node . instance . toString = ( ) => node . name ;
@@ -639,6 +682,7 @@ export default class RenderTree {
639682
640683 this . serialized [ node . id ] = serialized = {
641684 ...node ,
685+ meta : null ,
642686 args : this . _serializeArgs ( node . args ) ,
643687 instance : this . _serializeItem ( node . instance ) ,
644688 bounds : this . _serializeBounds ( node . bounds ) ,
@@ -790,22 +834,26 @@ export default class RenderTree {
790834 }
791835 } while ( node && node !== bounds . lastNode ) ;
792836
793- return bounds . parentElement ;
837+ return node . meta ?. parentElement || bounds . parentElement ;
794838 }
795839
796840 _findUp ( node ) {
797841 // Find the first parent render node with a different enclosing DOM element.
798842 // Usually, this is just the first parent render node, but there are cases where
799843 // multiple render nodes share the same bounds (e.g. outlet -> route template).
800- let parentElement = node && node . bounds && node . bounds . parentElement ;
844+ let parentElement =
845+ node ?. meta ?. parentElement || node ?. bounds ?. parentElement ;
801846
802847 while ( node && parentElement ) {
803848 let parentNode = this . _getParent ( node . id ) ;
804849
805850 if ( parentNode ) {
806851 node = parentNode ;
807852
808- if ( parentElement === node . bounds && node . bounds . parentElement ) {
853+ if (
854+ parentElement ===
855+ ( node ?. meta ?. parentElement || node ?. bounds ?. parentElement )
856+ ) {
809857 continue ;
810858 }
811859 }
0 commit comments