- 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;