Skip to content

Commit e0f0fa8

Browse files
authored
fix beta & canary tests (#2571)
1 parent 0557cb8 commit e0f0fa8

File tree

1 file changed

+114
-66
lines changed

1 file changed

+114
-66
lines changed

ember_debug/libs/render-tree.js

+114-66
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)