Skip to content

Commit f9edcee

Browse files
pfaffeDevtools-frontend LUCI CQ
authored andcommitted
[treeoutline] small fixes
- Handle hidden/selected attribute changes correctly. - Prevent nullref error when expansion bubbles to the root node. - Correctly add tree nodes when adding an li. Bug: 436136172 Change-Id: I5736eb3e683a58565ef4607cddab754ae1a65494 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6894998 Reviewed-by: Alex Rudenko <alexrudenko@chromium.org> Commit-Queue: Philip Pfaffe <pfaffe@chromium.org>
1 parent 9c2fa49 commit f9edcee

1 file changed

Lines changed: 37 additions & 17 deletions

File tree

front_end/ui/legacy/Treeoutline.ts

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,7 +1453,7 @@ function getTreeNodes(nodeList: NodeList|Node[]): HTMLLIElement[] {
14531453
return nodeList.values()
14541454
.flatMap(node => {
14551455
if (node instanceof HTMLLIElement && node.role === 'treeitem') {
1456-
return [node];
1456+
return [node, ...node.querySelectorAll<HTMLLIElement>('ul[role="group"] li[role="treeitem"]')];
14571457
}
14581458
if (node instanceof HTMLElement) {
14591459
return node.querySelectorAll<HTMLLIElement>('li[role="treeitem"]');
@@ -1508,20 +1508,23 @@ export class TreeViewElement extends HTMLElementWithLightDOMTemplate {
15081508

15091509
constructor() {
15101510
super();
1511-
this.#treeOutline.addEventListener(
1512-
Events.ElementSelected,
1513-
event =>
1514-
this.dispatchEvent(new TreeViewElement.SelectEvent((event.data as TreeViewTreeElement).configElement)));
1515-
this.#treeOutline.addEventListener(
1516-
Events.ElementExpanded,
1517-
event => (event.data as TreeViewTreeElement)
1518-
.configElement.dispatchEvent(new TreeViewElement.ExpandEvent(
1519-
{expanded: true, target: (event.data as TreeViewTreeElement).configElement})));
1520-
this.#treeOutline.addEventListener(
1521-
Events.ElementCollapsed,
1522-
event => (event.data as TreeViewTreeElement)
1523-
.configElement.dispatchEvent(new TreeViewElement.ExpandEvent(
1524-
{expanded: false, target: (event.data as TreeViewTreeElement).configElement})));
1511+
this.#treeOutline.addEventListener(Events.ElementSelected, event => {
1512+
if (event.data instanceof TreeViewTreeElement) {
1513+
this.dispatchEvent(new TreeViewElement.SelectEvent(event.data.configElement));
1514+
}
1515+
});
1516+
this.#treeOutline.addEventListener(Events.ElementExpanded, event => {
1517+
if (event.data instanceof TreeViewTreeElement) {
1518+
event.data.configElement.dispatchEvent(new TreeViewElement.ExpandEvent(
1519+
{expanded: true, target: (event.data as TreeViewTreeElement).configElement}));
1520+
}
1521+
});
1522+
this.#treeOutline.addEventListener(Events.ElementCollapsed, event => {
1523+
if (event.data instanceof TreeViewTreeElement) {
1524+
event.data.configElement.dispatchEvent(new TreeViewElement.ExpandEvent(
1525+
{expanded: false, target: (event.data as TreeViewTreeElement).configElement}));
1526+
}
1527+
});
15251528
this.addNodes(getTreeNodes([this]));
15261529
}
15271530

@@ -1545,12 +1548,29 @@ export class TreeViewElement extends HTMLElementWithLightDOMTemplate {
15451548
return treeElement ? {expanded, treeElement} : null;
15461549
}
15471550

1548-
protected override updateNodes(node: Node, _attributeName: string|null): void {
1551+
protected override updateNodes(node: Node, attributeName: string|null): void {
15491552
while (node?.parentNode && !(node instanceof HTMLElement)) {
15501553
node = node.parentNode;
15511554
}
15521555
const treeNode = node instanceof HTMLElement ? node.closest('li[role="treeitem"]') : null;
1553-
treeNode && TreeViewTreeElement.get(treeNode)?.refresh();
1556+
if (!treeNode) {
1557+
return;
1558+
}
1559+
const treeElement = TreeViewTreeElement.get(treeNode);
1560+
if (!treeElement) {
1561+
return;
1562+
}
1563+
treeElement.refresh();
1564+
if (node === treeNode && attributeName === 'selected' && hasBooleanAttribute(treeNode, 'selected')) {
1565+
treeElement.revealAndSelect(true);
1566+
}
1567+
if (attributeName === 'hidden' && node instanceof HTMLUListElement && node.role === 'group') {
1568+
if (hasBooleanAttribute(node, 'hidden')) {
1569+
treeElement.collapse();
1570+
} else {
1571+
treeElement.expand();
1572+
}
1573+
}
15541574
}
15551575

15561576
protected override addNodes(nodes: NodeList|Node[]): void {

0 commit comments

Comments
 (0)