Title: [260291] trunk/Source/WebInspectorUI
Revision
260291
Author
[email protected]
Date
2020-04-17 15:33:05 -0700 (Fri, 17 Apr 2020)

Log Message

Web Inspector: REGRESSION(r242018): using `RegExp.prototype.test` with a global `RegExp` will ignore one potential match after each successful match
https://bugs.webkit.org/show_bug.cgi?id=210671

Reviewed by Timothy Hatcher.

* UserInterface/Base/SearchUtilities.js:
(WI.SearchUtilities.searchRegExpForString):
(WI.SearchUtilities.filterRegExpForString):
(WI.SearchUtilities._regExpForString):
(WI.SearchUtilities.regExpForString): Deleted.
Many uses of `WI.SearchUtilities.regExpForString` use the returned `RegExp` multiple times,
expecting each use to be done in isolation from every other use (e.g. filtering). In these
cases, the global flag `g` should not be set on the `RegExp`, as otherwise it will keep a
state of the last matched index, thereby breaking this isolation. As such, it is necessary
to split `WI.SearchUtilities.regExpForString` into two versions, one for each use case.

* UserInterface/Views/DOMTreeElement.js:
(WI.DOMTreeElement.prototype._highlightSearchResults):
* UserInterface/Views/LogContentView.js:
(WI.LogContentView.prototype.performSearch):
* UserInterface/Views/ResourceHeadersContentView.js:
(WI.ResourceHeadersContentView.prototype._perfomSearchOnKeyValuePairs):
* UserInterface/Views/ResourceSecurityContentView.js:
(WI.ResourceSecurityContentView.prototype._perfomSearchOnKeyValuePairs):
* UserInterface/Views/SearchSidebarPanel.js:
(WI.SearchSidebarPanel.prototype.performSearch.forEachMatch):
Use `WI.SearchUtilities.searchRegExpForString` as these views expect the search to maintain
its current position throughout the contents of the view.

* UserInterface/Views/DataGrid.js:
(WI.DataGrid.prototype._updateFilter):
* UserInterface/Views/IndexedDatabaseObjectStoreContentView.js:
(WI.IndexedDatabaseObjectStoreContentView.prototype.dataGridMatchNodeAgainstCustomFilters):
* UserInterface/Views/NetworkTableContentView.js:
(WI.NetworkTableContentView.prototype._urlFilterDidChange):
* UserInterface/Views/SourceCodeTextEditor.js:
(WI.SourceCodeTextEditor.prototype.customPerformSearch.searchResultCallback):
* UserInterface/Views/TextEditor.js:
(WI.TextEditor.prototype.performSearch):
Use `WI.SearchUtilities.filterRegExpForString` as these views expect each search to be done
in isolation from every other search (e.g. filtering).

Modified Paths

Diff

Modified: trunk/Source/WebInspectorUI/ChangeLog (260290 => 260291)


--- trunk/Source/WebInspectorUI/ChangeLog	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/ChangeLog	2020-04-17 22:33:05 UTC (rev 260291)
@@ -1,5 +1,49 @@
 2020-04-17  Devin Rousso  <[email protected]>
 
+        Web Inspector: REGRESSION(r242018): using `RegExp.prototype.test` with a global `RegExp` will ignore one potential match after each successful match
+        https://bugs.webkit.org/show_bug.cgi?id=210671
+
+        Reviewed by Timothy Hatcher.
+
+        * UserInterface/Base/SearchUtilities.js:
+        (WI.SearchUtilities.searchRegExpForString):
+        (WI.SearchUtilities.filterRegExpForString):
+        (WI.SearchUtilities._regExpForString):
+        (WI.SearchUtilities.regExpForString): Deleted.
+        Many uses of `WI.SearchUtilities.regExpForString` use the returned `RegExp` multiple times,
+        expecting each use to be done in isolation from every other use (e.g. filtering). In these
+        cases, the global flag `g` should not be set on the `RegExp`, as otherwise it will keep a
+        state of the last matched index, thereby breaking this isolation. As such, it is necessary
+        to split `WI.SearchUtilities.regExpForString` into two versions, one for each use case.
+
+        * UserInterface/Views/DOMTreeElement.js:
+        (WI.DOMTreeElement.prototype._highlightSearchResults):
+        * UserInterface/Views/LogContentView.js:
+        (WI.LogContentView.prototype.performSearch):
+        * UserInterface/Views/ResourceHeadersContentView.js:
+        (WI.ResourceHeadersContentView.prototype._perfomSearchOnKeyValuePairs):
+        * UserInterface/Views/ResourceSecurityContentView.js:
+        (WI.ResourceSecurityContentView.prototype._perfomSearchOnKeyValuePairs):
+        * UserInterface/Views/SearchSidebarPanel.js:
+        (WI.SearchSidebarPanel.prototype.performSearch.forEachMatch):
+        Use `WI.SearchUtilities.searchRegExpForString` as these views expect the search to maintain
+        its current position throughout the contents of the view.
+
+        * UserInterface/Views/DataGrid.js:
+        (WI.DataGrid.prototype._updateFilter):
+        * UserInterface/Views/IndexedDatabaseObjectStoreContentView.js:
+        (WI.IndexedDatabaseObjectStoreContentView.prototype.dataGridMatchNodeAgainstCustomFilters):
+        * UserInterface/Views/NetworkTableContentView.js:
+        (WI.NetworkTableContentView.prototype._urlFilterDidChange):
+        * UserInterface/Views/SourceCodeTextEditor.js:
+        (WI.SourceCodeTextEditor.prototype.customPerformSearch.searchResultCallback):
+        * UserInterface/Views/TextEditor.js:
+        (WI.TextEditor.prototype.performSearch):
+        Use `WI.SearchUtilities.filterRegExpForString` as these views expect each search to be done
+        in isolation from every other search (e.g. filtering).
+
+2020-04-17  Devin Rousso  <[email protected]>
+
         Implement Promise.any and AggregateError
         https://bugs.webkit.org/show_bug.cgi?id=202566
 

Modified: trunk/Source/WebInspectorUI/UserInterface/Base/SearchUtilities.js (260290 => 260291)


--- trunk/Source/WebInspectorUI/UserInterface/Base/SearchUtilities.js	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/UserInterface/Base/SearchUtilities.js	2020-04-17 22:33:05 UTC (rev 260291)
@@ -48,24 +48,14 @@
         return settings;
     }
 
-    static regExpForString(query, settings = {})
+    static searchRegExpForString(query, settings = {})
     {
-        function checkSetting(setting) {
-            return setting instanceof WI.Setting ? setting.value : !!setting;
-        }
+        return WI.SearchUtilities._regExpForString(query, settings, {global: true});
+    }
 
-        console.assert((typeof query === "string" && query) || query instanceof RegExp);
-
-        if (!checkSetting(settings.regularExpression))
-            query = simpleGlobStringToRegExp(String(query));
-
-        console.assert((typeof query === "string" && query) || query instanceof RegExp);
-
-        let flags = "g";
-        if (!checkSetting(settings.caseSensitive))
-            flags += "i";
-
-        return new RegExp(query, flags);
+    static filterRegExpForString(query, settings = {})
+    {
+        return WI.SearchUtilities._regExpForString(query, settings);
     }
 
     static createSettingsButton(settings)
@@ -100,4 +90,26 @@
 
         return button;
     }
+
+    static _regExpForString(query, settings = {}, options = {})
+    {
+        function checkSetting(setting) {
+            return setting instanceof WI.Setting ? setting.value : !!setting;
+        }
+
+        console.assert((typeof query === "string" && query) || query instanceof RegExp);
+
+        if (!checkSetting(settings.regularExpression))
+            query = simpleGlobStringToRegExp(String(query));
+
+        console.assert((typeof query === "string" && query) || query instanceof RegExp);
+
+        let flags = "";
+        if (options.global)
+            flags += "g"
+        if (!checkSetting(settings.caseSensitive))
+            flags += "i";
+
+        return new RegExp(query, flags);
+    }
 };

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/DOMTreeElement.js (260290 => 260291)


--- trunk/Source/WebInspectorUI/UserInterface/Views/DOMTreeElement.js	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/DOMTreeElement.js	2020-04-17 22:33:05 UTC (rev 260291)
@@ -1810,7 +1810,7 @@
         }
 
         var text = this.title.textContent;
-        let searchRegex = WI.SearchUtilities.regExpForString(this._searchQuery, WI.SearchUtilities.defaultSettings);
+        let searchRegex = WI.SearchUtilities.searchRegExpForString(this._searchQuery, WI.SearchUtilities.defaultSettings);
 
         var match = searchRegex.exec(text);
         var matchRanges = [];

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/DataGrid.js (260290 => 260291)


--- trunk/Source/WebInspectorUI/UserInterface/Views/DataGrid.js	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/DataGrid.js	2020-04-17 22:33:05 UTC (rev 260291)
@@ -1874,7 +1874,7 @@
         if (!this._rows.length)
             return;
 
-        this._textFilterRegex = this._filterText ? WI.SearchUtilities.regExpForString(this._filterText, WI.SearchUtilities.defaultSettings) : null;
+        this._textFilterRegex = this._filterText ? WI.SearchUtilities.filterRegExpForString(this._filterText, WI.SearchUtilities.defaultSettings) : null;
 
         if (this._applyFilterToNodesTask && this._applyFilterToNodesTask.processing)
             this._applyFilterToNodesTask.cancel();

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/IndexedDatabaseObjectStoreContentView.js (260290 => 260291)


--- trunk/Source/WebInspectorUI/UserInterface/Views/IndexedDatabaseObjectStoreContentView.js	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/IndexedDatabaseObjectStoreContentView.js	2020-04-17 22:33:05 UTC (rev 260291)
@@ -140,7 +140,7 @@
         if (!filterText)
             return true;
 
-        let regex = WI.SearchUtilities.regExpForString(filterText, WI.SearchUtilities.defaultSettings);
+        let regex = WI.SearchUtilities.filterRegExpForString(filterText, WI.SearchUtilities.defaultSettings);
 
         // Iterate over each cell.
         for (let child of node.element.children) {

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/LogContentView.js (260290 => 260291)


--- trunk/Source/WebInspectorUI/UserInterface/Views/LogContentView.js	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/LogContentView.js	2020-04-17 22:33:05 UTC (rev 260291)
@@ -1099,7 +1099,7 @@
 
         this.element.classList.add(WI.LogContentView.SearchInProgressStyleClassName);
 
-        let searchRegex = WI.SearchUtilities.regExpForString(this._currentSearchQuery, WI.SearchUtilities.defaultSettings);
+        let searchRegex = WI.SearchUtilities.searchRegExpForString(this._currentSearchQuery, WI.SearchUtilities.defaultSettings);
         this._unfilteredMessageElements().forEach(function(message) {
             let matchRanges = [];
             let text = message.textContent;

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js (260290 => 260291)


--- trunk/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js	2020-04-17 22:33:05 UTC (rev 260291)
@@ -2310,7 +2310,7 @@
 
         this._urlFilterIsActive = true;
         this._urlFilterSearchText = searchQuery;
-        this._urlFilterSearchRegex = WI.SearchUtilities.regExpForString(searchQuery, WI.SearchUtilities.defaultSettings);
+        this._urlFilterSearchRegex = WI.SearchUtilities.filterRegExpForString(searchQuery, WI.SearchUtilities.defaultSettings);
 
         this._updateActiveFilterResources();
         this._updateFilteredEntries();

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ResourceHeadersContentView.js (260290 => 260291)


--- trunk/Source/WebInspectorUI/UserInterface/Views/ResourceHeadersContentView.js	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ResourceHeadersContentView.js	2020-04-17 22:33:05 UTC (rev 260291)
@@ -477,7 +477,7 @@
 
     _perfomSearchOnKeyValuePairs()
     {
-        let searchRegex = WI.SearchUtilities.regExpForString(this._searchQuery, WI.SearchUtilities.defaultSettings);
+        let searchRegex = WI.SearchUtilities.searchRegExpForString(this._searchQuery, WI.SearchUtilities.defaultSettings);
 
         let elements = this.element.querySelectorAll(".key, .value");
         for (let element of elements) {

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSecurityContentView.js (260290 => 260291)


--- trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSecurityContentView.js	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ResourceSecurityContentView.js	2020-04-17 22:33:05 UTC (rev 260291)
@@ -286,7 +286,7 @@
 
     _perfomSearchOnKeyValuePairs()
     {
-        let searchRegex = WI.SearchUtilities.regExpForString(this._searchQuery, WI.SearchUtilities.defaultSettings);
+        let searchRegex = WI.SearchUtilities.searchRegExpForString(this._searchQuery, WI.SearchUtilities.defaultSettings);
 
         let elements = this.element.querySelectorAll(".key, .value");
         for (let element of elements) {

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js (260290 => 260291)


--- trunk/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js	2020-04-17 22:33:05 UTC (rev 260291)
@@ -176,7 +176,7 @@
         function forEachMatch(searchQuery, lineContent, callback)
         {
             var lineMatch;
-            let searchRegex = WI.SearchUtilities.regExpForString(searchQuery, {
+            let searchRegex = WI.SearchUtilities.searchRegExpForString(searchQuery, {
                 caseSensitive: isCaseSensitive,
                 regularExpression: isRegex,
             });

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js (260290 => 260291)


--- trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js	2020-04-17 22:33:05 UTC (rev 260291)
@@ -220,7 +220,7 @@
                 return;
             }
 
-            let queryRegex = WI.SearchUtilities.regExpForString(query, WI.SearchUtilities.defaultSettings);
+            let queryRegex = WI.SearchUtilities.searchRegExpForString(query, WI.SearchUtilities.defaultSettings);
             var searchResults = [];
 
             for (var i = 0; i < matches.length; ++i) {

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TextEditor.js (260290 => 260291)


--- trunk/Source/WebInspectorUI/UserInterface/Views/TextEditor.js	2020-04-17 22:08:31 UTC (rev 260290)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TextEditor.js	2020-04-17 22:33:05 UTC (rev 260291)
@@ -314,7 +314,7 @@
         }
 
         // Go down the slow patch for all other text content.
-        let queryRegex = WI.SearchUtilities.regExpForString(query, WI.SearchUtilities.defaultSettings);
+        let queryRegex = WI.SearchUtilities.searchRegExpForString(query, WI.SearchUtilities.defaultSettings);
         var searchCursor = this._codeMirror.getSearchCursor(queryRegex, {line: 0, ch: 0}, false);
         var boundBatchSearch = batchSearch.bind(this);
         var numberOfSearchResultsDidChangeTimeout = null;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to