WebKit Bugzilla
Attachment 356875 Details for
Bug 192527
: Web Inspector: provide a way to make searches case sensitive or use a regular expression
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-192527-20181208103952.patch (text/plain), 31.08 KB, created by
Devin Rousso
on 2018-12-08 10:39:52 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Devin Rousso
Created:
2018-12-08 10:39:52 PST
Size:
31.08 KB
patch
obsolete
>diff --git a/Source/WebInspectorUI/ChangeLog b/Source/WebInspectorUI/ChangeLog >index 698900f5b78315bdfa783156075faab1e48711a6..285006d52e5578d5e9cf350474135651c1b01a9a 100644 >--- a/Source/WebInspectorUI/ChangeLog >+++ b/Source/WebInspectorUI/ChangeLog >@@ -1,3 +1,81 @@ >+2018-12-08 Devin Rousso <drousso@apple.com> >+ >+ Web Inspector: provide a way to make searches case sensitive or use a regular expression >+ https://bugs.webkit.org/show_bug.cgi?id=192527 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * UserInterface/Base/SearchUtilities.js: Added. >+ (WI.SearchUtilities.get defaultSettings): >+ (WI.SearchUtilities.createSettings): >+ (WI.SearchUtilities.regExpForString): >+ (WI.SearchUtilities.createSettingsButton): >+ (WI.SearchUtilities.createSettingsButton.toggleActive): >+ * UserInterface/Views/Main.css: >+ (.search-settings): Added. >+ (.search-settings > .glyph): Added. >+ (.search-settings:active > .glyph): Added. >+ (.search-settings.active > .glyph): Added. >+ (.search-settings:active.active > .glyph): Added. >+ Create static utility class for handling settings related to searching/filtering. >+ >+ * UserInterface/Base/Setting.js: >+ * UserInterface/Views/SettingsTabContentView.js: >+ (WI.SettingsTabContentView.prototype._createGeneralSettingsView): >+ Create default search settings that apply across WebInspector, unless a more specific >+ setting has been created that overrides it (e.g. the navigation sidebar or Search tab). >+ >+ * UserInterface/Views/NavigationSidebarPanel.js: >+ (WI.NavigationSidebarPanel): >+ (WI.NavigationSidebarPanel.prototype.updateFilter): >+ * UserInterface/Views/NavigationSidebarPanel.css: >+ (.sidebar > .panel.navigation > .filter-container): >+ (.sidebar > .panel.navigation > .filter-container > .filter-bar): Added. >+ (.sidebar > .panel.navigation > .filter-container > .search-settings): Added. >+ (.sidebar > .panel.navigation > .filter-bar): Deleted. >+ * UserInterface/Views/SearchSidebarPanel.js: >+ (WI.SearchSidebarPanel): >+ (WI.SearchSidebarPanel.prototype.performSearch.forEachMatch): >+ (WI.SearchSidebarPanel.prototype.performSearch.resourceCallback): >+ (WI.SearchSidebarPanel.prototype.performSearch.resourcesCallback): >+ (WI.SearchSidebarPanel.prototype.performSearch.searchScripts.scriptCallback): >+ (WI.SearchSidebarPanel.prototype.performSearch.searchScripts): >+ (WI.SearchSidebarPanel.prototype.performSearch.domSearchResults): >+ (WI.SearchSidebarPanel.prototype.performSearch.domCallback): >+ (WI.SearchSidebarPanel.prototype.performSearch): >+ * UserInterface/Views/SearchSidebarPanel.css: >+ (.sidebar > .panel.navigation.search > .search-bar): >+ (.sidebar > .panel.navigation.search > .search-bar > input[type="search"]): >+ Add a (*) settings "gear" after each `<input type="search">` that shows a contextmenu with >+ checkboxes for each search setting. Any settings changed for each input take precedence over >+ the default settings, but will match the corresponding default setting if it's changed. >+ >+ * UserInterface/Views/DOMTreeElement.js: >+ (WI.DOMTreeElement.prototype._highlightSearchResults): >+ * UserInterface/Views/DataGrid.js: >+ (WI.DataGrid.prototype._updateFilter): >+ * UserInterface/Views/LogContentView.js: >+ (WI.LogContentView.prototype.performSearch): >+ * UserInterface/Views/NetworkTableContentView.js: >+ (WI.NetworkTableContentView.prototype._urlFilterDidChange): >+ * UserInterface/Views/ResourceHeadersContentView.js: >+ (WI.ResourceHeadersContentView.prototype._perfomSearchOnKeyValuePairs): >+ * UserInterface/Views/ResourceSecurityContentView.js: >+ (WI.ResourceSecurityContentView.prototype._perfomSearchOnKeyValuePairs): >+ * UserInterface/Views/SourceCodeTextEditor.js: >+ (WI.SourceCodeTextEditor.prototype.customPerformSearch.searchResultCallback): >+ (WI.SourceCodeTextEditor.prototype.customPerformSearch): >+ * UserInterface/Views/TextEditor.js: >+ (WI.TextEditor.prototype.performSearch): >+ Use the default search settings when searching/filtering. >+ >+ * UserInterface/Views/SearchBar.css: >+ (.search-bar > input[type="search"]:placeholder-shown::-webkit-search-cancel-button): Added. >+ Drive-by: prevent the (x) from appearing when no text has been entered. >+ >+ * Localizations/en.lproj/localizedStrings.js: >+ * UserInterface/Main.html: >+ > 2018-12-06 Matt Baker <mattbaker@apple.com> > > Web Inspector: REGRESSION(r238602): Elements: collapsing a DOM node with the left arrow doesn't work >diff --git a/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js b/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js >index 0d1dba8a59daa7756ec278f99be8e01629e0f550..eefef1304b38746e277ffff7d104c33f5153fcd5 100644 >--- a/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js >+++ b/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js >@@ -175,6 +175,7 @@ localizedStrings["Canvas Element"] = "Canvas Element"; > localizedStrings["Canvases"] = "Canvases"; > localizedStrings["Capture Screenshot"] = "Capture Screenshot"; > localizedStrings["Capturing"] = "Capturing"; >+localizedStrings["Case Sensitive"] = "Case Sensitive"; > localizedStrings["Catch Variables"] = "Catch Variables"; > localizedStrings["Categories"] = "Categories"; > localizedStrings["Certificate"] = "Certificate"; >@@ -790,6 +791,7 @@ localizedStrings["Scroll Into View"] = "Scroll Into View"; > localizedStrings["Search"] = "Search"; > localizedStrings["Search Again"] = "Search Again"; > localizedStrings["Search Resource Content"] = "Search Resource Content"; >+localizedStrings["Search:"] = "Search:"; > localizedStrings["Secure"] = "Secure"; > localizedStrings["Security"] = "Security"; > localizedStrings["Security Issue"] = "Security Issue"; >diff --git a/Source/WebInspectorUI/UserInterface/Base/SearchUtilities.js b/Source/WebInspectorUI/UserInterface/Base/SearchUtilities.js >new file mode 100644 >index 0000000000000000000000000000000000000000..b55a7f7b4c1dc50abd1f60caf6120c795739d786 >--- /dev/null >+++ b/Source/WebInspectorUI/UserInterface/Base/SearchUtilities.js >@@ -0,0 +1,105 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+WI.SearchUtilities = class SearchUtilities { >+ static get defaultSettings() >+ { >+ return { >+ caseSensitive: WI.settings.searchCaseSensitive, >+ regularExpression: WI.settings.searchRegularExpression, >+ }; >+ } >+ >+ static createSettings(namePrefix, options = {}) >+ { >+ let settings = {}; >+ for (let [key, defaultSetting] of Object.entries(WI.SearchUtilities.defaultSettings)) { >+ let setting = new WI.Setting(namePrefix + "-" + defaultSetting.name, defaultSetting.value); >+ defaultSetting.addEventListener(WI.Setting.Event.Changed, (event) => { >+ setting.value = defaultSetting.value; >+ }); >+ settings[key] = setting; >+ >+ if (options.handleChanged) >+ setting.addEventListener(WI.Setting.Event.Changed, options.handleChanged); >+ } >+ return settings; >+ } >+ >+ static regExpForString(query, settings = {}) >+ { >+ function checkSetting(setting) { >+ return setting instanceof WI.Setting ? setting.value : !!setting; >+ } >+ >+ if (!checkSetting(settings.regularExpression)) >+ query = simpleGlobStringToRegExp(query); >+ >+ let flags = "g"; >+ if (!checkSetting(settings.caseSensitive)) >+ flags += "i"; >+ >+ return new RegExp(query, flags); >+ } >+ >+ static createSettingsButton(settings) >+ { >+ console.assert(!isEmptyObject(settings)); >+ >+ let button = document.createElement("button"); >+ button.addEventListener("click", (event) => { >+ event.stop(); >+ >+ let contextMenu = WI.ContextMenu.createFromEvent(event); >+ >+ if (settings.caseSensitive) { >+ contextMenu.appendCheckboxItem(WI.UIString("Case Sensitive"), () => { >+ settings.caseSensitive.value = !settings.caseSensitive.value; >+ }, settings.caseSensitive.value); >+ } >+ >+ if (settings.regularExpression) { >+ contextMenu.appendCheckboxItem(WI.UIString("Regular Expression"), () => { >+ settings.regularExpression.value = !settings.regularExpression.value; >+ }, settings.regularExpression.value); >+ } >+ >+ contextMenu.show(); >+ }); >+ button.classList.add("search-settings"); >+ button.tabIndex = -1; >+ >+ button.appendChild(WI.ImageUtilities.useSVGSymbol("Images/Gear.svg", "glyph")); >+ >+ function toggleActive() { >+ button.classList.toggle("active", Object.values(settings).some((setting) => !!setting.value)); >+ } >+ settings.caseSensitive.addEventListener(WI.Setting.Event.Changed, toggleActive); >+ settings.regularExpression.addEventListener(WI.Setting.Event.Changed, toggleActive); >+ toggleActive(); >+ >+ return button; >+ } >+}; >diff --git a/Source/WebInspectorUI/UserInterface/Base/Setting.js b/Source/WebInspectorUI/UserInterface/Base/Setting.js >index d0508a3317005c9354f571424d56ed90f61c17bd..93aa8e6c2ec4eccee1aa9b9c4485a6f85cec6569 100644 >--- a/Source/WebInspectorUI/UserInterface/Base/Setting.js >+++ b/Source/WebInspectorUI/UserInterface/Base/Setting.js >@@ -113,6 +113,8 @@ WI.settings = { > indentUnit: new WI.Setting("indent-unit", 4), > indentWithTabs: new WI.Setting("indent-with-tabs", false), > resourceCachingDisabled: new WI.Setting("disable-resource-caching", false), >+ searchCaseSensitive: new WI.Setting("search-case-sensitive", false), >+ searchRegularExpression: new WI.Setting("search-regular-expression", false), > selectedNetworkDetailContentViewIdentifier: new WI.Setting("network-detail-content-view-identifier", "preview"), > showAllRequestsBreakpoint: new WI.Setting("show-all-requests-breakpoint", true), > showAssertionFailuresBreakpoint: new WI.Setting("show-assertion-failures-breakpoint", true), >diff --git a/Source/WebInspectorUI/UserInterface/Main.html b/Source/WebInspectorUI/UserInterface/Main.html >index 5636599176baba8abe6f92fe27d0cf923e1ab667..0dfb73284c36864837451522504deb6d22fd127b 100644 >--- a/Source/WebInspectorUI/UserInterface/Main.html >+++ b/Source/WebInspectorUI/UserInterface/Main.html >@@ -287,6 +287,7 @@ > <script src="Base/ObjectStore.js"></script> > <script src="Base/URLUtilities.js"></script> > <script src="Base/Utilities.js"></script> >+ <script src="Base/SearchUtilities.js"></script> > <script src="Base/Setting.js"></script> > <script src="Base/YieldableTask.js"></script> > >diff --git a/Source/WebInspectorUI/UserInterface/Views/DOMTreeElement.js b/Source/WebInspectorUI/UserInterface/Views/DOMTreeElement.js >index 942b0c7eca9bc4b044492dd451272c798c9b9f33..6b65c7701f5906c7533ce0c20794c4cae0597346 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/DOMTreeElement.js >+++ b/Source/WebInspectorUI/UserInterface/Views/DOMTreeElement.js >@@ -1709,7 +1709,7 @@ WI.DOMTreeElement = class DOMTreeElement extends WI.TreeElement > } > > var text = this.title.textContent; >- var searchRegex = new RegExp(this._searchQuery.escapeForRegExp(), "gi"); >+ let searchRegex = WI.SearchUtilities.regExpForString(this._searchQuery, WI.SearchUtilities.defaultSettings); > > var match = searchRegex.exec(text); > var matchRanges = []; >diff --git a/Source/WebInspectorUI/UserInterface/Views/DataGrid.js b/Source/WebInspectorUI/UserInterface/Views/DataGrid.js >index 1355ed1f3a1bf7e454e93aabb333c58e674ff5d0..c49e1aaa2b3e6c9ae976efcf3bda35a41bf388b7 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/DataGrid.js >+++ b/Source/WebInspectorUI/UserInterface/Views/DataGrid.js >@@ -1834,7 +1834,7 @@ WI.DataGrid = class DataGrid extends WI.View > if (!this._rows.length) > return; > >- this._textFilterRegex = simpleGlobStringToRegExp(this._filterText, "i"); >+ this._textFilterRegex = WI.SearchUtilities.regExpForString(this._filterText, WI.SearchUtilities.defaultSettings); > > if (this._applyFilterToNodesTask && this._applyFilterToNodesTask.processing) > this._applyFilterToNodesTask.cancel(); >diff --git a/Source/WebInspectorUI/UserInterface/Views/LogContentView.js b/Source/WebInspectorUI/UserInterface/Views/LogContentView.js >index 1caca5c4d30bf9d153310511e3f56499503ace0a..a7b53535b1c163967c273c24f35677ec71fa3f26 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/LogContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/LogContentView.js >@@ -1045,7 +1045,7 @@ WI.LogContentView = class LogContentView extends WI.ContentView > > this.element.classList.add(WI.LogContentView.SearchInProgressStyleClassName); > >- let searchRegex = new RegExp(this._currentSearchQuery.escapeForRegExp(), "gi"); >+ let searchRegex = WI.SearchUtilities.regExpForString(this._currentSearchQuery, WI.SearchUtilities.defaultSettings); > this._unfilteredMessageElements().forEach(function(message) { > let matchRanges = []; > let text = message.textContent; >diff --git a/Source/WebInspectorUI/UserInterface/Views/Main.css b/Source/WebInspectorUI/UserInterface/Views/Main.css >index 5323d417b70c723c555347086ef2dd7e946add10..183ec7bfb9ea6f387b2444e063e9c8c8056333a4 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/Main.css >+++ b/Source/WebInspectorUI/UserInterface/Views/Main.css >@@ -291,6 +291,33 @@ body[dir=rtl] .go-to-arrow { > background-image: url(../Images/GoToArrow.svg#selected-active); > } > >+.search-settings { >+ display: inline-block; >+ margin: 0; >+ padding: 0; >+ background-color: transparent; >+ border: none; >+ -webkit-appearance: none; >+} >+ >+.search-settings > .glyph { >+ width: 16px; >+ height: 16px; >+ color: var(--glyph-color); >+} >+ >+.search-settings:active > .glyph { >+ color: var(--glyph-color-pressed); >+} >+ >+.search-settings.active > .glyph { >+ color: var(--glyph-color-active); >+} >+ >+.search-settings:active.active > .glyph { >+ color: var(--glyph-color-active-pressed); >+} >+ > .hidden { > display: none !important; > } >diff --git a/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.css b/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.css >index be454c107a8b4419abbed38d1163b7e38cd7951a..49e460bec233dae293e781f0918ecb4fc52c56dc 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.css >+++ b/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.css >@@ -27,13 +27,23 @@ > bottom: var(--navigation-bar-height); > } > >-.sidebar > .panel.navigation > .filter-bar { >+.sidebar > .panel.navigation > .filter-container { >+ display: flex; >+ align-items: center; > position: absolute; > bottom: 0; > left: 0; > right: 0; > } > >+.sidebar > .panel.navigation > .filter-container > .filter-bar { >+ width: 100%; >+} >+ >+.sidebar > .panel.navigation > .filter-container > .search-settings { >+ -webkit-margin-end: 6px; >+} >+ > .sidebar > .panel.navigation > .overflow-shadow { > position: absolute; > bottom: calc(var(--console-prompt-min-height) - 1px); >diff --git a/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js b/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js >index 477480bfc5cc48a97d48879cdf778da571394aae..8f0e0e9ccce619fcb0935572b0f1bcb525dedbb3 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js >+++ b/Source/WebInspectorUI/UserInterface/Views/NavigationSidebarPanel.js >@@ -29,6 +29,21 @@ WI.NavigationSidebarPanel = class NavigationSidebarPanel extends WI.SidebarPanel > { > super(identifier, displayName); > >+ this._filtersSetting = new WI.Setting(identifier + "-navigation-sidebar-filters", {}); >+ this._filterSearchSettings = WI.SearchUtilities.createSettings("navigation-sidebar", { >+ handleChanged: (event) => { >+ this.updateFilter(); >+ }, >+ }); >+ >+ this._emptyContentPlaceholderElements = new Map; >+ this._emptyFilterResults = new Set; >+ >+ this._shouldAutoPruneStaleTopLevelResourceTreeElements = shouldAutoPruneStaleTopLevelResourceTreeElements || false; >+ >+ this._pendingViewStateCookie = null; >+ this._restoringState = false; >+ > this.element.classList.add("navigation"); > > this.contentView.element.addEventListener("scroll", this.soon._updateContentOverflowShadowVisibility); >@@ -36,9 +51,15 @@ WI.NavigationSidebarPanel = class NavigationSidebarPanel extends WI.SidebarPanel > this._contentTreeOutlineGroup = new WI.TreeOutlineGroup; > this._contentTreeOutline = this.createContentTreeOutline(); > >+ let filterContainer = this.element.appendChild(document.createElement("div")); >+ filterContainer.classList.add("filter-container"); >+ > this._filterBar = new WI.FilterBar; >+ this._filterBar.filters = this._filtersSetting.value; > this._filterBar.addEventListener(WI.FilterBar.Event.FilterDidChange, this._filterDidChange, this); >- this.element.appendChild(this._filterBar.element); >+ filterContainer.appendChild(this._filterBar.element); >+ >+ filterContainer.appendChild(WI.SearchUtilities.createSettingsButton(this._filterSearchSettings)); > > this._bottomOverflowShadowElement = document.createElement("div"); > this._bottomOverflowShadowElement.className = WI.NavigationSidebarPanel.OverflowShadowElementStyleClassName; >@@ -52,22 +73,11 @@ WI.NavigationSidebarPanel = class NavigationSidebarPanel extends WI.SidebarPanel > this._boundUpdateContentOverflowShadowVisibility = this.soon._updateContentOverflowShadowVisibility; > window.addEventListener("resize", this._boundUpdateContentOverflowShadowVisibility); > >- this._filtersSetting = new WI.Setting(identifier + "-navigation-sidebar-filters", {}); >- this._filterBar.filters = this._filtersSetting.value; >- >- this._emptyContentPlaceholderElements = new Map; >- this._emptyFilterResults = new Set; >- >- this._shouldAutoPruneStaleTopLevelResourceTreeElements = shouldAutoPruneStaleTopLevelResourceTreeElements || false; >- > if (this._shouldAutoPruneStaleTopLevelResourceTreeElements) { > WI.Frame.addEventListener(WI.Frame.Event.MainResourceDidChange, this._checkForStaleResources, this); > WI.Frame.addEventListener(WI.Frame.Event.ChildFrameWasRemoved, this._checkForStaleResources, this); > WI.Frame.addEventListener(WI.Frame.Event.ResourceWasRemoved, this._checkForStaleResources, this); > } >- >- this._pendingViewStateCookie = null; >- this._restoringState = false; > } > > // Public >@@ -318,7 +328,7 @@ WI.NavigationSidebarPanel = class NavigationSidebarPanel extends WI.SidebarPanel > } > > let filters = this._filterBar.filters; >- this._textFilterRegex = simpleGlobStringToRegExp(filters.text, "i"); >+ this._textFilterRegex = WI.SearchUtilities.regExpForString(filters.text, this._filterSearchSettings); > this._filtersSetting.value = filters; > this._filterFunctions = filters.functions; > >diff --git a/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js b/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js >index 6af19bf7ddfc6e7185cd8f4e1dc372d39f06de82..332cf3fcfdf6a6d1eb38c7c07386496cab493161 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js >@@ -1840,7 +1840,7 @@ WI.NetworkTableContentView = class NetworkTableContentView extends WI.ContentVie > > this._urlFilterIsActive = true; > this._urlFilterSearchText = searchQuery; >- this._urlFilterSearchRegex = new RegExp(searchQuery.escapeForRegExp(), "i"); >+ this._urlFilterSearchRegex = WI.SearchUtilities.regExpForString(searchQuery, WI.SearchUtilities.defaultSettings); > > this._activeURLFilterResources.clear(); > >diff --git a/Source/WebInspectorUI/UserInterface/Views/ResourceHeadersContentView.js b/Source/WebInspectorUI/UserInterface/Views/ResourceHeadersContentView.js >index d1a7e09b677a34acf7953187ade07bccd73958f2..3870dabae880a1d287cb9bd4ac10f43b80187d19 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ResourceHeadersContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ResourceHeadersContentView.js >@@ -419,7 +419,7 @@ WI.ResourceHeadersContentView = class ResourceHeadersContentView extends WI.Cont > > _perfomSearchOnKeyValuePairs() > { >- let searchRegex = new RegExp(this._searchQuery.escapeForRegExp(), "gi"); >+ let searchRegex = WI.SearchUtilities.regExpForString(this._searchQuery, WI.SearchUtilities.defaultSettings); > > let elements = this.element.querySelectorAll(".key, .value"); > for (let element of elements) { >diff --git a/Source/WebInspectorUI/UserInterface/Views/ResourceSecurityContentView.js b/Source/WebInspectorUI/UserInterface/Views/ResourceSecurityContentView.js >index da431a0d6dba503026a80a69ee19e5261ac99498..d68a7f969cbc2d41650b47222e562f4f32c5ffbf 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/ResourceSecurityContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/ResourceSecurityContentView.js >@@ -255,7 +255,7 @@ WI.ResourceSecurityContentView = class ResourceSecurityContentView extends WI.Co > > _perfomSearchOnKeyValuePairs() > { >- let searchRegex = new RegExp(this._searchQuery.escapeForRegExp(), "gi"); >+ let searchRegex = WI.SearchUtilities.regExpForString(this._searchQuery, WI.SearchUtilities.defaultSettings); > > let elements = this.element.querySelectorAll(".key, .value"); > for (let element of elements) { >diff --git a/Source/WebInspectorUI/UserInterface/Views/SearchBar.css b/Source/WebInspectorUI/UserInterface/Views/SearchBar.css >index 1969ea354b06ff05816add7644f42aa6b92ed924..606f8d6dec70bde3311a7eba90ee866efee5d86f 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/SearchBar.css >+++ b/Source/WebInspectorUI/UserInterface/Views/SearchBar.css >@@ -53,6 +53,10 @@ > background-color: white; > } > >+.search-bar > input[type="search"]:placeholder-shown::-webkit-search-cancel-button { >+ display: none; >+} >+ > @media (prefers-dark-interface) { > :matches(.search-bar, .filter-bar) > input[type="search"], > .search-bar > input[type="search"]:not(:placeholder-shown) { >diff --git a/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.css b/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.css >index 717a2bb48fb18699b5082b88befffe1c58787769..3c9d46941401182710f626b83e180867632acb23 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.css >+++ b/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.css >@@ -28,15 +28,14 @@ > } > > .sidebar > .panel.navigation.search > .search-bar { >+ display: flex; >+ align-items: center; > position: absolute; > top: 0; > left: 0; > right: 0; >- >- display: flex; >- > height: calc(var(--navigation-bar-height) - 1px); >- >+ margin: 3px 6px; > white-space: nowrap; > overflow: hidden; > } >@@ -44,8 +43,9 @@ > .sidebar > .panel.navigation.search > .search-bar > input[type="search"] { > display: flex; > flex: 1; >- >- margin: 3px 6px; >+ width: 100%; >+ margin: 0; >+ -webkit-margin-end: 4px; > } > > .sidebar > .panel.navigation.search > .search-bar > input[type="search"]::-webkit-search-results-button { >diff --git a/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js b/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js >index bce2c71a57c57ec40516c9d1a064d6adb099fe73..fa5817fa6718f81dedbcdadb14cd503d4cce9699 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js >+++ b/Source/WebInspectorUI/UserInterface/Views/SearchSidebarPanel.js >@@ -29,6 +29,12 @@ WI.SearchSidebarPanel = class SearchSidebarPanel extends WI.NavigationSidebarPan > { > super("search", WI.UIString("Search"), true, true); > >+ this._searchInputSettings = WI.SearchUtilities.createSettings("search-sidebar", { >+ handleChanged: (event) => { >+ this.focusSearchField(true); >+ }, >+ }); >+ > var searchElement = document.createElement("div"); > searchElement.classList.add("search-bar"); > this.element.appendChild(searchElement); >@@ -43,6 +49,8 @@ WI.SearchSidebarPanel = class SearchSidebarPanel extends WI.NavigationSidebarPan > this._inputElement.setAttribute("placeholder", WI.UIString("Search Resource Content")); > searchElement.appendChild(this._inputElement); > >+ searchElement.appendChild(WI.SearchUtilities.createSettingsButton(this._searchInputSettings)); >+ > this._searchQuerySetting = new WI.Setting("search-sidebar-query", ""); > this._inputElement.value = this._searchQuerySetting.value; > >@@ -93,9 +101,8 @@ WI.SearchSidebarPanel = class SearchSidebarPanel extends WI.NavigationSidebarPan > if (!searchQuery.length) > return; > >- // FIXME: Provide UI to toggle regex and case sensitive searches. >- var isCaseSensitive = false; >- var isRegex = false; >+ let isCaseSensitive = !!this._searchInputSettings.caseSensitive.value; >+ let isRegex = !!this._searchInputSettings.regularExpression.value; > > var updateEmptyContentPlaceholderTimeout = null; > >@@ -130,7 +137,10 @@ WI.SearchSidebarPanel = class SearchSidebarPanel extends WI.NavigationSidebarPan > function forEachMatch(searchQuery, lineContent, callback) > { > var lineMatch; >- var searchRegex = new RegExp(searchQuery.escapeForRegExp(), "gi"); >+ let searchRegex = WI.SearchUtilities.regExpForString(searchQuery, { >+ caseSensitive: isCaseSensitive, >+ regularExpression: isRegex, >+ }); > while ((searchRegex.lastIndex < lineContent.length) && (lineMatch = searchRegex.exec(lineContent))) > callback(lineMatch, searchRegex.lastIndex); > } >@@ -167,6 +177,9 @@ WI.SearchSidebarPanel = class SearchSidebarPanel extends WI.NavigationSidebarPan > }); > } > >+ if (!resourceTreeElement.children.length) >+ this.contentTreeOutline.removeChild(resourceTreeElement); >+ > updateEmptyContentPlaceholder.call(this); > } > >@@ -220,6 +233,9 @@ WI.SearchSidebarPanel = class SearchSidebarPanel extends WI.NavigationSidebarPan > }); > } > >+ if (!scriptTreeElement.children.length) >+ this.contentTreeOutline.removeChild(scriptTreeElement); >+ > updateEmptyContentPlaceholder.call(this); > } > >@@ -280,6 +296,9 @@ WI.SearchSidebarPanel = class SearchSidebarPanel extends WI.NavigationSidebarPan > createTreeElementForMatchObject.call(this, matchObject, resourceTreeElement); > } > >+ if (!resourceTreeElement.children.length) >+ this.contentTreeOutline.removeChild(resourceTreeElement); >+ > updateEmptyContentPlaceholder.call(this); > } > } >diff --git a/Source/WebInspectorUI/UserInterface/Views/SettingsTabContentView.js b/Source/WebInspectorUI/UserInterface/Views/SettingsTabContentView.js >index 8a740216ab38d0477f52d788fa35eafb9d23a4c6..15de5c3ea25cfe56cb57eae8d36d2123f7cabe4f 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/SettingsTabContentView.js >+++ b/Source/WebInspectorUI/UserInterface/Views/SettingsTabContentView.js >@@ -202,6 +202,12 @@ WI.SettingsTabContentView = class SettingsTabContentView extends WI.TabContentVi > > generalSettingsView.addSeparator(); > >+ let searchGroup = generalSettingsView.addGroup(WI.UIString("Search:")); >+ searchGroup.addSetting(WI.settings.searchCaseSensitive, WI.UIString("Case Sensitive")); >+ searchGroup.addSetting(WI.settings.searchRegularExpression, WI.UIString("Regular Expression")); >+ >+ generalSettingsView.addSeparator(); >+ > const zoomLevels = [0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4]; > const zoomValues = zoomLevels.map((level) => [level, Number.percentageString(level, 0)]); > >diff --git a/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js b/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js >index 7f286ae390574944c2fba27725bb7498ebfe36e4..742c4957462bd67f413cfd4afac610c37f86f67d 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js >+++ b/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js >@@ -224,7 +224,7 @@ WI.SourceCodeTextEditor = class SourceCodeTextEditor extends WI.TextEditor > return; > } > >- var queryRegex = new RegExp(query.escapeForRegExp(), "gi"); >+ let queryRegex = WI.SearchUtilities.regExpForString(query, WI.SearchUtilities.defaultSettings); > var searchResults = []; > > for (var i = 0; i < matches.length; ++i) { >diff --git a/Source/WebInspectorUI/UserInterface/Views/TextEditor.js b/Source/WebInspectorUI/UserInterface/Views/TextEditor.js >index 3ffe502a145852710450630bed8ec7c4dc36e2b6..bc6e6b3e5f5c29387175f79c535c98a7baa1b2bc 100644 >--- a/Source/WebInspectorUI/UserInterface/Views/TextEditor.js >+++ b/Source/WebInspectorUI/UserInterface/Views/TextEditor.js >@@ -338,7 +338,7 @@ WI.TextEditor = class TextEditor extends WI.View > } > > // Go down the slow patch for all other text content. >- var queryRegex = new RegExp(query.escapeForRegExp(), "gi"); >+ let queryRegex = WI.SearchUtilities.regExpForString(query, WI.SearchUtilities.defaultSettings); > var searchCursor = this._codeMirror.getSearchCursor(queryRegex, {line: 0, ch: 0}, false); > var boundBatchSearch = batchSearch.bind(this); > var numberOfSearchResultsDidChangeTimeout = null;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 192527
:
356875
|
356876
|
356877
|
358180
|
358575
|
362058
|
362075
|
362872