@@ -17,6 +17,15 @@ class InElementSupportProvider {
17
17
// nope
18
18
}
19
19
20
+ try {
21
+ requireModule (
22
+ '@glimmer/manager'
23
+ ) . CustomModifierManager . prototype . getDebugInstance = ( args ) =>
24
+ args . modifier || args . delegate ;
25
+ } catch ( e ) {
26
+ // nope
27
+ }
28
+
20
29
this . DESTROY = emberSafeRequire ( '@glimmer/util' ) ?. DESTROY ;
21
30
this . registerDestructor =
22
31
emberSafeRequire ( '@glimmer/destroyable' ) ?. registerDestructor ||
@@ -42,7 +51,13 @@ class InElementSupportProvider {
42
51
const NewElementBuilder = this . NewElementBuilder ;
43
52
const componentStack = [ ] ;
44
53
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
+ ) ;
46
61
47
62
function createRef ( value ) {
48
63
if ( self . reference . createUnboundRef ) {
@@ -64,21 +79,43 @@ class InElementSupportProvider {
64
79
65
80
const appendChild = this . debugRenderTree . appendChild ;
66
81
this . debugRenderTree . appendChild = function ( node , state ) {
67
- if ( node . type === 'component' ) {
82
+ if ( node . type === 'component' || node . type === 'keyword' ) {
68
83
componentStack . push ( node ) ;
69
84
}
70
85
return appendChild . call ( this , node , state ) ;
71
86
} ;
72
87
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
+
73
98
const exit = this . debugRenderTree . exit ;
74
99
this . debugRenderTree . exit = function ( state ) {
75
100
const node = this . nodeFor ( this . stack . current ) ;
76
- if ( node ?. type === 'component' ) {
101
+ if ( node ?. type === 'component' || node . type === 'keyword' ) {
77
102
componentStack . pop ( ) ;
78
103
}
79
104
return exit . call ( this , state ) ;
80
105
} ;
81
106
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
+
82
119
const didAppendNode = NewElementBuilder . prototype . didAppendNode ;
83
120
NewElementBuilder . prototype . didAppendNode = function ( ...args ) {
84
121
args [ 0 ] . __emberInspectorParentNode = componentStack . at ( - 1 ) ;
@@ -92,7 +129,7 @@ class InElementSupportProvider {
92
129
} ;
93
130
94
131
const pushModifiers = NewElementBuilder . prototype . pushModifiers ;
95
- if ( enableModifierSupport ) {
132
+ if ( enableModifierSupport && ! hasModifierAndInElementSupport ) {
96
133
NewElementBuilder . prototype . pushModifiers = function ( modifiers ) {
97
134
const debugRenderTree = self . debugRenderTree ;
98
135
if ( debugRenderTree ) {
@@ -171,68 +208,63 @@ class InElementSupportProvider {
171
208
}
172
209
173
210
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 : { } ,
197
222
} ;
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 ;
203
227
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
+ }
222
242
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
+ } ;
235
250
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
+ }
236
268
this . debugRenderTreeFunctions = {
237
269
appendChild,
238
270
exit,
@@ -568,8 +600,14 @@ export default class RenderTree {
568
600
569
601
if ( serialized === undefined ) {
570
602
this . nodes [ node . id ] = node ;
571
- if ( node . type === 'keyword' ) {
603
+ if ( node . type === 'keyword' && node . name === 'in-element' ) {
572
604
node . type = 'component' ;
605
+ node . instance = {
606
+ args : node . args ,
607
+ constructor : {
608
+ name : 'InElement' ,
609
+ } ,
610
+ } ;
573
611
this . inElementSupport ?. nodeMap . set ( node , node . id ) ;
574
612
this . inElementSupport ?. remoteRoots . push ( node ) ;
575
613
}
@@ -607,6 +645,7 @@ export default class RenderTree {
607
645
parentNode . children . forEach ( ( child ) => {
608
646
if (
609
647
child . bounds . parentElement === node . instance ||
648
+ child . meta ?. parentElement === node . instance ||
610
649
( child . type === 'modifier' &&
611
650
child . bounds . firstNode === node . instance )
612
651
) {
@@ -629,6 +668,10 @@ export default class RenderTree {
629
668
}
630
669
631
670
if ( node . type === 'modifier' ) {
671
+ node . name = node . name
672
+ ?. replace ( / [ A - Z ] / g, ( m ) => '-' + m . toLowerCase ( ) )
673
+ . replace ( / ^ - / , '' )
674
+ . replace ( '-modifier' , '' ) ;
632
675
node . instance =
633
676
node . instance || this . _createSimpleInstance ( node . name , node . args ) ;
634
677
node . instance . toString = ( ) => node . name ;
@@ -639,6 +682,7 @@ export default class RenderTree {
639
682
640
683
this . serialized [ node . id ] = serialized = {
641
684
...node ,
685
+ meta : null ,
642
686
args : this . _serializeArgs ( node . args ) ,
643
687
instance : this . _serializeItem ( node . instance ) ,
644
688
bounds : this . _serializeBounds ( node . bounds ) ,
@@ -790,22 +834,26 @@ export default class RenderTree {
790
834
}
791
835
} while ( node && node !== bounds . lastNode ) ;
792
836
793
- return bounds . parentElement ;
837
+ return node . meta ?. parentElement || bounds . parentElement ;
794
838
}
795
839
796
840
_findUp ( node ) {
797
841
// Find the first parent render node with a different enclosing DOM element.
798
842
// Usually, this is just the first parent render node, but there are cases where
799
843
// 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 ;
801
846
802
847
while ( node && parentElement ) {
803
848
let parentNode = this . _getParent ( node . id ) ;
804
849
805
850
if ( parentNode ) {
806
851
node = parentNode ;
807
852
808
- if ( parentElement === node . bounds && node . bounds . parentElement ) {
853
+ if (
854
+ parentElement ===
855
+ ( node ?. meta ?. parentElement || node ?. bounds ?. parentElement )
856
+ ) {
809
857
continue ;
810
858
}
811
859
}
0 commit comments