Modified: trunk/Source/WebInspectorUI/ChangeLog (260374 => 260375)
--- trunk/Source/WebInspectorUI/ChangeLog 2020-04-20 17:59:42 UTC (rev 260374)
+++ trunk/Source/WebInspectorUI/ChangeLog 2020-04-20 18:02:03 UTC (rev 260375)
@@ -1,3 +1,17 @@
+2020-04-20 Devin Rousso <drou...@apple.com>
+
+ Web Inspector: removing a `WI.TreeElement` in a `WI.NavigationSidebar` doesn't check if the `WI.TreeOutline` still matches the current filter
+ https://bugs.webkit.org/show_bug.cgi?id=210672
+
+ Reviewed by Joseph Pecoraro.
+
+ * UserInterface/Views/NavigationSidebarPanel.js:
+ (WI.NavigationSidebarPanel.prototype.createContentTreeOutline):
+ (WI.NavigationSidebarPanel.prototype.updateFilter):
+ (WI.NavigationSidebarPanel.prototype._checkForEmptyFilterResults):
+ (WI.NavigationSidebarPanel.prototype._treeElementAddedOrChanged):
+ (WI.NavigationSidebarPanel.prototype._handleTreeElementRemoved): Added.
+
2020-04-17 Devin Rousso <drou...@apple.com>
Web Inspector: REGRESSION(r242018): using `RegExp.prototype.test` with a global `RegExp` will ignore one potential match after each successful match
Modified: trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js (260374 => 260375)
--- trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js 2020-04-20 17:59:42 UTC (rev 260374)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js 2020-04-20 18:02:03 UTC (rev 260375)
@@ -144,6 +144,7 @@
contentTreeOutline.addEventListener(WI.TreeOutline.Event.ElementAdded, this._treeElementAddedOrChanged, this);
contentTreeOutline.addEventListener(WI.TreeOutline.Event.ElementDidChange, this._treeElementAddedOrChanged, this);
contentTreeOutline.addEventListener(WI.TreeOutline.Event.ElementDisclosureDidChanged, this._treeElementDisclosureDidChange, this);
+ contentTreeOutline.addEventListener(WI.TreeOutline.Event.ElementRemoved, this._handleTreeElementRemoved, this);
}
contentTreeOutline[WI.NavigationSidebarPanel.IgnoreCookieRestoration] = ignoreCookieRestoration;
@@ -315,16 +316,6 @@
updateFilter()
{
- let selectedTreeElement;
- for (let treeOutline of this.contentTreeOutlines) {
- if (treeOutline.hidden || treeOutline[WI.NavigationSidebarPanel.SuppressFilteringSymbol])
- continue;
-
- selectedTreeElement = treeOutline.selectedTreeElement;
- if (selectedTreeElement)
- break;
- }
-
let filters = this._filterBar.filters;
this._textFilterRegex = simpleGlobStringToRegExp(filters.text, "i");
this._filtersSetting.value = filters;
@@ -350,9 +341,10 @@
currentTreeElement = currentTreeElement.traverseNextTreeElement(false, null, dontPopulate);
}
+
+ this._checkForEmptyFilterResults(treeOutline);
}
- this._checkForEmptyFilterResults();
this._updateContentOverflowShadowVisibilityDebouncer.force();
}
@@ -536,57 +528,50 @@
this._bottomOverflowShadowElement.style.opacity = (1 - (bottomCoverage / edgeThreshold)).toFixed(1);
}
- _checkForEmptyFilterResults()
+ _checkForEmptyFilterResults(treeOutline)
{
- function checkTreeOutlineForEmptyFilterResults(treeOutline)
- {
- // No tree elements, so don't touch the empty content placeholder.
- if (!treeOutline.children.length)
- return;
+ if (treeOutline[WI.NavigationSidebarPanel.SuppressFilteringSymbol])
+ return;
- // Iterate over all the top level tree elements. If any filterable elements are visible, return early.
- let filterableTreeElementFound = false;
- let unfilteredTreeElementFound = false;
- let currentTreeElement = treeOutline.children[0];
- while (currentTreeElement) {
- let suppressFilteringForTreeElement = currentTreeElement[WI.NavigationSidebarPanel.SuppressFilteringSymbol];
- if (!suppressFilteringForTreeElement) {
- filterableTreeElementFound = true;
+ // No tree elements, so don't touch the empty content placeholder.
+ if (!treeOutline.children.length)
+ return;
- if (!currentTreeElement.hidden) {
- unfilteredTreeElementFound = true;
- break;
- }
+ // Iterate over all the top level tree elements. If any filterable elements are visible, return early.
+ let filterableTreeElementFound = false;
+ let unfilteredTreeElementFound = false;
+ let currentTreeElement = treeOutline.children[0];
+ while (currentTreeElement) {
+ let suppressFilteringForTreeElement = currentTreeElement[WI.NavigationSidebarPanel.SuppressFilteringSymbol];
+ if (!suppressFilteringForTreeElement) {
+ filterableTreeElementFound = true;
+
+ if (!currentTreeElement.hidden) {
+ unfilteredTreeElementFound = true;
+ break;
}
-
- currentTreeElement = currentTreeElement.nextSibling;
}
- if (unfilteredTreeElementFound || !filterableTreeElementFound) {
- this.hideEmptyContentPlaceholder(treeOutline);
- this._emptyFilterResults.delete(treeOutline);
- return;
- }
+ currentTreeElement = currentTreeElement.nextSibling;
+ }
- let message = WI.createMessageTextView(WI.UIString("No Filter Results"));
+ if (unfilteredTreeElementFound || !filterableTreeElementFound) {
+ this.hideEmptyContentPlaceholder(treeOutline);
+ this._emptyFilterResults.delete(treeOutline);
+ return;
+ }
- let buttonElement = message.appendChild(document.createElement("button"));
- buttonElement.textContent = WI.UIString("Clear Filters");
- buttonElement.addEventListener("click", () => {
- this.resetFilter();
- });
+ let message = WI.createMessageTextView(WI.UIString("No Filter Results"));
- // All top level tree elements are hidden, so filtering hid everything. Show a message.
- this.showEmptyContentPlaceholder(message, treeOutline);
- this._emptyFilterResults.add(treeOutline);
- }
+ let buttonElement = message.appendChild(document.createElement("button"));
+ buttonElement.textContent = WI.UIString("Clear Filters");
+ buttonElement.addEventListener("click", () => {
+ this.resetFilter();
+ });
- for (let treeOutline of this.contentTreeOutlines) {
- if (treeOutline[WI.NavigationSidebarPanel.SuppressFilteringSymbol])
- continue;
-
- checkTreeOutlineForEmptyFilterResults.call(this, treeOutline);
- }
+ // All top level tree elements are hidden, so filtering hid everything. Show a message.
+ this.showEmptyContentPlaceholder(message, treeOutline);
+ this._emptyFilterResults.add(treeOutline);
}
_filterDidChange()
@@ -614,7 +599,7 @@
currentTreeElement = currentTreeElement.traverseNextTreeElement(false, treeElement, dontPopulate);
}
- this._checkForEmptyFilterResults();
+ this._checkForEmptyFilterResults(event.target);
if (this.visible)
this._updateContentOverflowShadowVisibilityDebouncer.delayForTime(0);
@@ -628,6 +613,14 @@
this._updateContentOverflowShadowVisibilityDebouncer.delayForTime(0);
}
+ _handleTreeElementRemoved(event)
+ {
+ this._checkForEmptyFilterResults(event.target);
+
+ if (this.visible)
+ this._updateContentOverflowShadowVisibilityDebouncer.delayForTime(0);
+ }
+
_checkForStaleResourcesIfNeeded()
{
if (!this._checkForStaleResourcesTimeoutIdentifier || !this._shouldAutoPruneStaleTopLevelResourceTreeElements)