From 215e23d3088bf974fdbd8fa3108aec4fa0bb8bbb Mon Sep 17 00:00:00 2001 From: Erik Luo Date: Wed, 9 May 2018 10:10:41 +0000 Subject: [PATCH] DevTools: fix mismatch between DOMNode childNodeCount and children Expanding an ElementsTreeElement used to immediately set a populated flag to true before requesting getChildNodes(). If a ChildNodeCountUpdated event arrives before the children are set, we may call updateModifiedParentNode() and try to create visibleChildren when they are null, breaking the tree. This CL moves the place where 'populated' is set, so that updateModifiedParentNode() does not update tree children before they are available. Bug: 829884 Change-Id: Id68e71fb7a58336d781207b298a53354af3e5cfc Reviewed-on: https://chromium-review.googlesource.com/1049113 Commit-Queue: Erik Luo Reviewed-by: Andrey Lushnikov Reviewed-by: Joel Einbinder Cr-Original-Commit-Position: refs/heads/master@{#557132} Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src Cr-Mirrored-Commit: 2e5ad0a88b7d04fe1aac8b2fd0c26b2d3475e4c2 --- front_end/elements/ElementsTreeElement.js | 1 - front_end/elements/ElementsTreeOutline.js | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/front_end/elements/ElementsTreeElement.js b/front_end/elements/ElementsTreeElement.js index 70c10f3551..441adb24d0 100644 --- a/front_end/elements/ElementsTreeElement.js +++ b/front_end/elements/ElementsTreeElement.js @@ -287,7 +287,6 @@ Elements.ElementsTreeElement = class extends UI.TreeElement { * @override */ onpopulate() { - this.populated = true; this.treeOutline.populateTreeElement(this); } diff --git a/front_end/elements/ElementsTreeOutline.js b/front_end/elements/ElementsTreeOutline.js index cc0bd898b5..cef69395cc 100644 --- a/front_end/elements/ElementsTreeOutline.js +++ b/front_end/elements/ElementsTreeOutline.js @@ -1154,7 +1154,10 @@ Elements.ElementsTreeOutline = class extends UI.TreeOutline { populateTreeElement(treeElement) { if (treeElement.childCount() || !treeElement.isExpandable()) return; - treeElement.node().getChildNodes(() => this._updateModifiedParentNode(treeElement.node())); + treeElement.node().getChildNodes(() => { + treeElement.populated = true; + this._updateModifiedParentNode(treeElement.node()); + }); } /**