Skip to content

Commit 6bc3e64

Browse files
OrKoNDevtools-frontend LUCI CQ
authored andcommitted
Use DOMTreeWidget for HeapDetachedElementsDataGridNode
Drive-by: fixes the single-node deindent logic that did not work previously. Bug: 427378053 Change-Id: Ida6f31aadf30b9d48439ec0552a297fe41864d98 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6850131 Reviewed-by: Philip Pfaffe <[email protected]> Commit-Queue: Alex Rudenko <[email protected]>
1 parent c658bfa commit 6bc3e64

File tree

3 files changed

+40
-21
lines changed

3 files changed

+40
-21
lines changed

front_end/panels/elements/ElementsTreeOutline.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ interface ViewInput {
9191
visibleWidth?: number;
9292
visible?: boolean;
9393
wrap: boolean;
94+
showSelectionOnKeyboardFocus: boolean;
95+
preventTabOrder: boolean;
96+
deindentSingleNode: boolean;
9497

9598
onSelectedNodeChanged:
9699
(event: Common.EventTarget.EventTargetEvent<{node: SDK.DOMModel.DOMNode | null, focus: boolean}>) => void;
@@ -121,6 +124,10 @@ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLE
121124
output.elementsTreeOutline.setVisible(input.visible);
122125
}
123126
output.elementsTreeOutline.setWordWrap(input.wrap);
127+
output.elementsTreeOutline.setShowSelectionOnKeyboardFocus(input.showSelectionOnKeyboardFocus, input.preventTabOrder);
128+
if (input.deindentSingleNode) {
129+
output.elementsTreeOutline.deindentSingleNode();
130+
}
124131
};
125132

126133
/**
@@ -134,6 +141,9 @@ export class DOMTreeWidget extends UI.Widget.Widget {
134141
omitRootDOMNode = false;
135142
selectEnabled = false;
136143
hideGutter = false;
144+
showSelectionOnKeyboardFocus = false;
145+
preventTabOrder = false;
146+
deindentSingleNode = false;
137147
onSelectedNodeChanged:
138148
(event:
139149
Common.EventTarget.EventTargetEvent<{node: SDK.DOMModel.DOMNode | null, focus: boolean}>) => void = () => {};
@@ -212,6 +222,9 @@ export class DOMTreeWidget extends UI.Widget.Widget {
212222
visibleWidth: this.#visibleWidth,
213223
visible: this.#visible,
214224
wrap: this.#wrap,
225+
showSelectionOnKeyboardFocus: this.showSelectionOnKeyboardFocus,
226+
preventTabOrder: this.preventTabOrder,
227+
deindentSingleNode: this.deindentSingleNode,
215228
onElementsTreeUpdated: this.onElementsTreeUpdated.bind(this),
216229
onSelectedNodeChanged: this.onSelectedNodeChanged.bind(this),
217230
},
@@ -536,6 +549,13 @@ export class ElementsTreeOutline extends
536549
}
537550
}
538551

552+
deindentSingleNode(): void {
553+
const firstChild = this.firstChild();
554+
if (!firstChild || (firstChild && !firstChild.isExpandable())) {
555+
this.shadowRoot.querySelector('.elements-disclosure')?.classList.add('single-node');
556+
}
557+
}
558+
539559
updateNodeElementToIssue(element: Element, issues: IssuesManager.Issue.Issue[]): void {
540560
this.#nodeElementToIssues.set(element, issues);
541561
}

front_end/panels/elements/ElementsTreeOutlineRenderer.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,10 @@ export class Renderer implements UI.UIUtils.Renderer {
7070
const treeOutline = new ElementsTreeOutline(
7171
/* omitRootDOMNode: */ false, /* selectEnabled: */ true, /* hideGutter: */ true);
7272
treeOutline.rootDOMNode = node;
73-
const firstChild = treeOutline.firstChild();
74-
if (firstChild && !firstChild.isExpandable()) {
75-
treeOutline.element.classList.add('single-node');
76-
}
73+
treeOutline.deindentSingleNode();
7774
treeOutline.setVisible(true);
7875
// @ts-expect-error used in console_test_runner
79-
treeOutline.element.treeElementForTest = firstChild;
76+
treeOutline.element.treeElementForTest = treeOutline.firstChild();
8077
treeOutline.setShowSelectionOnKeyboardFocus(/* show: */ true, /* preventTabOrder: */ true);
8178
return {node: treeOutline.element, tree: treeOutline};
8279
}

front_end/panels/profiler/HeapDetachedElementsDataGrid.ts

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ export class HeapDetachedElementsDataGridNode extends DataGrid.DataGrid.DataGrid
7272
const cell = this.createTD(columnId);
7373
switch (columnId) {
7474
case 'detached-node': {
75-
const DOMNode = SDK.DOMModel.DOMNode.create(this.domModel, null, false, this.detachedElementInfo.treeNode);
76-
cell.appendChild(this.#nodeRenderer(DOMNode));
75+
const node = SDK.DOMModel.DOMNode.create(this.domModel, null, false, this.detachedElementInfo.treeNode);
76+
this.#renderNode(node, cell);
7777
return cell;
7878
}
7979

@@ -109,22 +109,26 @@ export class HeapDetachedElementsDataGridNode extends DataGrid.DataGrid.DataGrid
109109
return count;
110110
}
111111

112-
#nodeRenderer(node: SDK.DOMModel.DOMNode): HTMLElement {
113-
const treeOutline = new Elements.ElementsTreeOutline.ElementsTreeOutline(
114-
/* omitRootDOMNode: */ false, /* selectEnabled: */ false, /* hideGutter: */ true);
115-
treeOutline.rootDOMNode = node;
116-
const firstChild = treeOutline.firstChild();
117-
if (!firstChild || (firstChild && !firstChild.isExpandable())) {
118-
treeOutline.element.classList.add('single-node');
112+
// FIXME: is it a partial dupe of front_end/panels/elements/ElementsTreeOutlineRenderer.ts?
113+
#renderNode(node: SDK.DOMModel.DOMNode, target: HTMLElement): void {
114+
const domTree = new Elements.ElementsTreeOutline.DOMTreeWidget();
115+
domTree.omitRootDOMNode = false;
116+
domTree.selectEnabled = true;
117+
domTree.hideGutter = true;
118+
domTree.rootDOMNode = node;
119+
domTree.showSelectionOnKeyboardFocus = true;
120+
domTree.preventTabOrder = true;
121+
domTree.deindentSingleNode = true;
122+
domTree.show(target, undefined, true);
123+
124+
const treeOutline = domTree.getTreeOutlineForTesting();
125+
if (!treeOutline) {
126+
return;
119127
}
120-
treeOutline.setVisible(true);
121-
// @ts-expect-error used in console_test_runner
122-
treeOutline.element.treeElementForTest = firstChild;
123-
treeOutline.setShowSelectionOnKeyboardFocus(/* show: */ true, /* preventTabOrder: */ true);
124-
125128
const nodes: SDK.DOMModel.DOMNode[] = [node];
126129

127130
// Iterate through descendants to mark the nodes that were specifically retained in JS references.
131+
// FIXME: support this in DOMTreeWidget or move to SDK.DOMModel.DOMNode.
128132
while (nodes.length > 0) {
129133
const descendantNode = nodes.shift() as SDK.DOMModel.DOMNode;
130134
const descendantsChildren = descendantNode.children();
@@ -154,7 +158,5 @@ export class HeapDetachedElementsDataGridNode extends DataGrid.DataGrid.DataGrid
154158
}
155159

156160
treeOutline.findTreeElement(node)?.listItemNode.setAttribute('title', 'Detached Tree Node');
157-
158-
return treeOutline.element;
159161
}
160162
}

0 commit comments

Comments
 (0)