Index: Source/devtools/blink/chromeServerProfile/Default/Cache/f_000048 |
diff --git a/Source/devtools/blink/chromeServerProfile/Default/Cache/f_000048 b/Source/devtools/blink/chromeServerProfile/Default/Cache/f_000048 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..868aa0643697b69edb48f48074ec443624790e4f |
--- /dev/null |
+++ b/Source/devtools/blink/chromeServerProfile/Default/Cache/f_000048 |
@@ -0,0 +1,800 @@ |
+/* |
+ * Copyright (C) 2011 Google 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 GOOGLE 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 GOOGLE 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. |
+ */ |
+ |
+/** |
+ * @constructor |
+ */ |
+WebInspector.AdvancedSearchController = function() |
+{ |
+ this._shortcut = WebInspector.AdvancedSearchController.createShortcut(); |
+ this._searchId = 0; |
+ |
+ WebInspector.settings.advancedSearchConfig = WebInspector.settings.createSetting("advancedSearchConfig", new WebInspector.SearchConfig("", true, false)); |
+ |
+ WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated, this._frameNavigated, this); |
+} |
+ |
+/** |
+ * @return {!WebInspector.KeyboardShortcut.Descriptor} |
+ */ |
+WebInspector.AdvancedSearchController.createShortcut = function() |
+{ |
+ if (WebInspector.isMac()) |
+ return WebInspector.KeyboardShortcut.makeDescriptor("f", WebInspector.KeyboardShortcut.Modifiers.Meta | WebInspector.KeyboardShortcut.Modifiers.Alt); |
+ else |
+ return WebInspector.KeyboardShortcut.makeDescriptor("f", WebInspector.KeyboardShortcut.Modifiers.Ctrl | WebInspector.KeyboardShortcut.Modifiers.Shift); |
+} |
+ |
+WebInspector.AdvancedSearchController.prototype = { |
+ /** |
+ * @param {!KeyboardEvent} event |
+ * @return {boolean} |
+ */ |
+ handleShortcut: function(event) |
+ { |
+ if (WebInspector.KeyboardShortcut.makeKeyFromEvent(event) === this._shortcut.key) { |
+ if (!this._searchView || !this._searchView.isShowing() || this._searchView._search !== document.activeElement) { |
+ WebInspector.inspectorView.showPanel("sources"); |
+ this.show(); |
+ } else { |
+ WebInspector.inspectorView.closeDrawer(); |
+ } |
+ event.consume(true); |
+ return true; |
+ } |
+ return false; |
+ }, |
+ |
+ _frameNavigated: function() |
+ { |
+ this.resetSearch(); |
+ }, |
+ |
+ show: function() |
+ { |
+ var selection = window.getSelection(); |
+ var queryCandidate; |
+ if (selection.rangeCount) |
+ queryCandidate = selection.toString().replace(/\r?\n.*/, ""); |
+ |
+ if (!this._searchView || !this._searchView.isShowing()) |
+ WebInspector.inspectorView.showViewInDrawer("search"); |
+ if (queryCandidate) |
+ this._searchView._search.value = queryCandidate; |
+ this._searchView.focus(); |
+ |
+ this.startIndexing(); |
+ }, |
+ |
+ /** |
+ * @param {boolean} finished |
+ */ |
+ _onIndexingFinished: function(finished) |
+ { |
+ delete this._isIndexing; |
+ this._searchView.indexingFinished(finished); |
+ if (!finished) |
+ delete this._pendingSearchConfig; |
+ if (!this._pendingSearchConfig) |
+ return; |
+ var searchConfig = this._pendingSearchConfig |
+ delete this._pendingSearchConfig; |
+ this._innerStartSearch(searchConfig); |
+ }, |
+ |
+ startIndexing: function() |
+ { |
+ this._isIndexing = true; |
+ // FIXME: this._currentSearchScope should be initialized based on searchConfig |
+ this._currentSearchScope = this._searchScopes()[0]; |
+ if (this._progressIndicator) |
+ this._progressIndicator.done(); |
+ this._progressIndicator = new WebInspector.ProgressIndicator(); |
+ this._searchView.indexingStarted(this._progressIndicator); |
+ this._currentSearchScope.performIndexing(this._progressIndicator, this._onIndexingFinished.bind(this)); |
+ }, |
+ |
+ /** |
+ * @param {number} searchId |
+ * @param {!WebInspector.FileBasedSearchResultsPane.SearchResult} searchResult |
+ */ |
+ _onSearchResult: function(searchId, searchResult) |
+ { |
+ if (searchId !== this._searchId) |
+ return; |
+ this._searchView.addSearchResult(searchResult); |
+ if (!searchResult.searchMatches.length) |
+ return; |
+ if (!this._searchResultsPane) |
+ this._searchResultsPane = this._currentSearchScope.createSearchResultsPane(this._searchConfig); |
+ this._searchView.resultsPane = this._searchResultsPane; |
+ this._searchResultsPane.addSearchResult(searchResult); |
+ }, |
+ |
+ /** |
+ * @param {number} searchId |
+ * @param {boolean} finished |
+ */ |
+ _onSearchFinished: function(searchId, finished) |
+ { |
+ if (searchId !== this._searchId) |
+ return; |
+ if (!this._searchResultsPane) |
+ this._searchView.nothingFound(); |
+ this._searchView.searchFinished(finished); |
+ delete this._searchConfig; |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.SearchConfig} searchConfig |
+ */ |
+ startSearch: function(searchConfig) |
+ { |
+ this.resetSearch(); |
+ ++this._searchId; |
+ if (!this._isIndexing) |
+ this.startIndexing(); |
+ this._pendingSearchConfig = searchConfig; |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.SearchConfig} searchConfig |
+ */ |
+ _innerStartSearch: function(searchConfig) |
+ { |
+ this._searchConfig = searchConfig; |
+ // FIXME: this._currentSearchScope should be initialized based on searchConfig |
+ this._currentSearchScope = this._searchScopes()[0]; |
+ |
+ if (this._progressIndicator) |
+ this._progressIndicator.done(); |
+ this._progressIndicator = new WebInspector.ProgressIndicator(); |
+ this._searchView.searchStarted(this._progressIndicator); |
+ this._currentSearchScope.performSearch(searchConfig, this._progressIndicator, this._onSearchResult.bind(this, this._searchId), this._onSearchFinished.bind(this, this._searchId)); |
+ }, |
+ |
+ resetSearch: function() |
+ { |
+ this.stopSearch(); |
+ |
+ if (this._searchResultsPane) { |
+ this._searchView.resetResults(); |
+ delete this._searchResultsPane; |
+ } |
+ }, |
+ |
+ stopSearch: function() |
+ { |
+ if (this._progressIndicator) |
+ this._progressIndicator.cancel(); |
+ if (this._currentSearchScope) |
+ this._currentSearchScope.stopSearch(); |
+ delete this._searchConfig; |
+ }, |
+ |
+ /** |
+ * @return {!Array.<!WebInspector.SearchScope>} |
+ */ |
+ _searchScopes: function() |
+ { |
+ // FIXME: implement multiple search scopes. |
+ return /** @type {!Array.<!WebInspector.SearchScope>} */ (WebInspector.moduleManager.instances(WebInspector.SearchScope)); |
+ } |
+} |
+ |
+/** |
+ * @constructor |
+ * @extends {WebInspector.VBox} |
+ * @param {!WebInspector.AdvancedSearchController} controller |
+ */ |
+WebInspector.SearchView = function(controller) |
+{ |
+ WebInspector.VBox.call(this); |
+ |
+ this._controller = WebInspector.advancedSearchController; |
+ WebInspector.advancedSearchController._searchView = this; |
+ |
+ this.element.classList.add("search-view"); |
+ |
+ this._searchPanelElement = this.element.createChild("div", "search-drawer-header"); |
+ this._searchPanelElement.addEventListener("keydown", this._onKeyDown.bind(this), false); |
+ |
+ this._searchResultsElement = this.element.createChild("div"); |
+ this._searchResultsElement.className = "search-results"; |
+ |
+ this._search = this._searchPanelElement.createChild("input"); |
+ this._search.placeholder = WebInspector.UIString("Search sources"); |
+ this._search.setAttribute("type", "text"); |
+ this._search.classList.add("search-config-search"); |
+ this._search.setAttribute("results", "0"); |
+ this._search.setAttribute("size", 30); |
+ |
+ this._ignoreCaseLabel = this._searchPanelElement.createChild("label"); |
+ this._ignoreCaseLabel.classList.add("search-config-label"); |
+ this._ignoreCaseCheckbox = this._ignoreCaseLabel.createChild("input"); |
+ this._ignoreCaseCheckbox.setAttribute("type", "checkbox"); |
+ this._ignoreCaseCheckbox.classList.add("search-config-checkbox"); |
+ this._ignoreCaseLabel.appendChild(document.createTextNode(WebInspector.UIString("Ignore case"))); |
+ |
+ this._regexLabel = this._searchPanelElement.createChild("label"); |
+ this._regexLabel.classList.add("search-config-label"); |
+ this._regexCheckbox = this._regexLabel.createChild("input"); |
+ this._regexCheckbox.setAttribute("type", "checkbox"); |
+ this._regexCheckbox.classList.add("search-config-checkbox"); |
+ this._regexLabel.appendChild(document.createTextNode(WebInspector.UIString("Regular expression"))); |
+ |
+ this._searchStatusBarElement = this.element.createChild("div", "search-status-bar-summary"); |
+ this._searchMessageElement = this._searchStatusBarElement.createChild("span"); |
+ this._searchResultsMessageElement = document.createElement("span"); |
+ |
+ this._load(); |
+} |
+ |
+// Number of recent search queries to store. |
+WebInspector.SearchView.maxQueriesCount = 20; |
+ |
+WebInspector.SearchView.prototype = { |
+ /** |
+ * @return {!WebInspector.SearchConfig} |
+ */ |
+ get searchConfig() |
+ { |
+ return new WebInspector.SearchConfig(this._search.value, this._ignoreCaseCheckbox.checked, this._regexCheckbox.checked); |
+ }, |
+ |
+ /** |
+ * @type {!WebInspector.SearchResultsPane} |
+ */ |
+ set resultsPane(resultsPane) |
+ { |
+ this.resetResults(); |
+ this._searchResultsElement.appendChild(resultsPane.element); |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.ProgressIndicator} progressIndicator |
+ */ |
+ searchStarted: function(progressIndicator) |
+ { |
+ this.resetResults(); |
+ this._resetCounters(); |
+ |
+ this._searchMessageElement.textContent = WebInspector.UIString("Searching..."); |
+ progressIndicator.show(this._searchStatusBarElement); |
+ this._updateSearchResultsMessage(); |
+ |
+ if (!this._searchingView) |
+ this._searchingView = new WebInspector.EmptyView(WebInspector.UIString("Searching...")); |
+ this._searchingView.show(this._searchResultsElement); |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.ProgressIndicator} progressIndicator |
+ */ |
+ indexingStarted: function(progressIndicator) |
+ { |
+ this._searchMessageElement.textContent = WebInspector.UIString("Indexing..."); |
+ progressIndicator.show(this._searchStatusBarElement); |
+ }, |
+ |
+ /** |
+ * @param {boolean} finished |
+ */ |
+ indexingFinished: function(finished) |
+ { |
+ this._searchMessageElement.textContent = finished ? "" : WebInspector.UIString("Indexing interrupted."); |
+ }, |
+ |
+ _updateSearchResultsMessage: function() |
+ { |
+ if (this._searchMatchesCount && this._searchResultsCount) |
+ this._searchResultsMessageElement.textContent = WebInspector.UIString("Found %d matches in %d files.", this._searchMatchesCount, this._nonEmptySearchResultsCount); |
+ else |
+ this._searchResultsMessageElement.textContent = ""; |
+ }, |
+ |
+ resetResults: function() |
+ { |
+ if (this._searchingView) |
+ this._searchingView.detach(); |
+ if (this._notFoundView) |
+ this._notFoundView.detach(); |
+ this._searchResultsElement.removeChildren(); |
+ }, |
+ |
+ _resetCounters: function() |
+ { |
+ this._searchMatchesCount = 0; |
+ this._searchResultsCount = 0; |
+ this._nonEmptySearchResultsCount = 0; |
+ }, |
+ |
+ nothingFound: function() |
+ { |
+ this.resetResults(); |
+ |
+ if (!this._notFoundView) |
+ this._notFoundView = new WebInspector.EmptyView(WebInspector.UIString("No matches found.")); |
+ this._notFoundView.show(this._searchResultsElement); |
+ this._searchResultsMessageElement.textContent = WebInspector.UIString("No matches found."); |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.FileBasedSearchResultsPane.SearchResult} searchResult |
+ */ |
+ addSearchResult: function(searchResult) |
+ { |
+ this._searchMatchesCount += searchResult.searchMatches.length; |
+ this._searchResultsCount++; |
+ if (searchResult.searchMatches.length) |
+ this._nonEmptySearchResultsCount++; |
+ this._updateSearchResultsMessage(); |
+ }, |
+ |
+ /** |
+ * @param {boolean} finished |
+ */ |
+ searchFinished: function(finished) |
+ { |
+ this._searchMessageElement.textContent = finished ? WebInspector.UIString("Search finished.") : WebInspector.UIString("Search interrupted."); |
+ }, |
+ |
+ focus: function() |
+ { |
+ WebInspector.setCurrentFocusElement(this._search); |
+ this._search.select(); |
+ }, |
+ |
+ willHide: function() |
+ { |
+ this._controller.stopSearch(); |
+ }, |
+ |
+ /** |
+ * @param {?Event} event |
+ */ |
+ _onKeyDown: function(event) |
+ { |
+ switch (event.keyCode) { |
+ case WebInspector.KeyboardShortcut.Keys.Enter.code: |
+ this._onAction(); |
+ break; |
+ } |
+ }, |
+ |
+ _save: function() |
+ { |
+ WebInspector.settings.advancedSearchConfig.set(this.searchConfig); |
+ }, |
+ |
+ _load: function() |
+ { |
+ var searchConfig = WebInspector.settings.advancedSearchConfig.get(); |
+ this._search.value = searchConfig.query; |
+ this._ignoreCaseCheckbox.checked = searchConfig.ignoreCase; |
+ this._regexCheckbox.checked = searchConfig.isRegex; |
+ }, |
+ |
+ _onAction: function() |
+ { |
+ var searchConfig = this.searchConfig; |
+ if (!searchConfig.query || !searchConfig.query.length) |
+ return; |
+ |
+ this._save(); |
+ this._controller.startSearch(searchConfig); |
+ }, |
+ |
+ __proto__: WebInspector.VBox.prototype |
+} |
+ |
+ |
+/** |
+ * @constructor |
+ * @param {string} query |
+ * @param {boolean} ignoreCase |
+ * @param {boolean} isRegex |
+ */ |
+WebInspector.SearchConfig = function(query, ignoreCase, isRegex) |
+{ |
+ this.query = query; |
+ this.ignoreCase = ignoreCase; |
+ this.isRegex = isRegex; |
+ this._parse(); |
+} |
+ |
+WebInspector.SearchConfig.prototype = { |
+ _parse: function() |
+ { |
+ var filePattern = "file:(([^\\\\ ]|\\\\.)+)"; // After file: prefix: any symbol except space and backslash or any symbol escaped with a backslash. |
+ var quotedPattern = "\"(([^\\\\\"]|\\\\.)+)\""; // Inside double quotes: any symbol except double quote and backslash or any symbol escaped with a backslash. |
+ var unquotedPattern = "(([^\\\\ ]|\\\\.)+)"; // any symbol except space and backslash or any symbol escaped with a backslash. |
+ |
+ var pattern = "(" + filePattern + ")|(" + quotedPattern + ")|(" + unquotedPattern + ")"; |
+ var regexp = new RegExp(pattern, "g"); |
+ var queryParts = this.query.match(regexp) || []; |
+ |
+ /** |
+ * @type {!Array.<string>} |
+ */ |
+ this._fileQueries = []; |
+ |
+ /** |
+ * @type {!Array.<string>} |
+ */ |
+ this._queries = []; |
+ |
+ for (var i = 0; i < queryParts.length; ++i) { |
+ var queryPart = queryParts[i]; |
+ if (!queryPart) |
+ continue; |
+ if (queryPart.startsWith("file:")) { |
+ this._fileQueries.push(this._parseFileQuery(queryPart)); |
+ continue; |
+ } |
+ if (queryPart.startsWith("\"")) { |
+ if (!queryPart.endsWith("\"")) |
+ continue; |
+ this._queries.push(this._parseQuotedQuery(queryPart)); |
+ continue; |
+ } |
+ this._queries.push(this._parseUnquotedQuery(queryPart)); |
+ } |
+ }, |
+ |
+ /** |
+ * @return {!Array.<string>} |
+ */ |
+ fileQueries: function() |
+ { |
+ return this._fileQueries; |
+ }, |
+ |
+ /** |
+ * @return {!Array.<string>} |
+ */ |
+ queries: function() |
+ { |
+ return this._queries; |
+ }, |
+ |
+ _parseUnquotedQuery: function(query) |
+ { |
+ return query.replace(/\\(.)/g, "$1"); |
+ }, |
+ |
+ _parseQuotedQuery: function(query) |
+ { |
+ return query.substring(1, query.length - 1).replace(/\\(.)/g, "$1"); |
+ }, |
+ |
+ _parseFileQuery: function(query) |
+ { |
+ query = query.substr("file:".length); |
+ var result = ""; |
+ for (var i = 0; i < query.length; ++i) { |
+ var char = query[i]; |
+ if (char === "*") { |
+ result += ".*"; |
+ } else if (char === "\\") { |
+ ++i; |
+ var nextChar = query[i]; |
+ if (nextChar === " ") |
+ result += " "; |
+ } else { |
+ if (String.regexSpecialCharacters().indexOf(query.charAt(i)) !== -1) |
+ result += "\\"; |
+ result += query.charAt(i); |
+ } |
+ } |
+ return result; |
+ } |
+} |
+ |
+/** |
+ * @interface |
+ */ |
+WebInspector.SearchScope = function() |
+{ |
+} |
+ |
+WebInspector.SearchScope.prototype = { |
+ /** |
+ * @param {!WebInspector.SearchConfig} searchConfig |
+ * @param {!WebInspector.Progress} progress |
+ * @param {function(!WebInspector.FileBasedSearchResultsPane.SearchResult)} searchResultCallback |
+ * @param {function(boolean)} searchFinishedCallback |
+ */ |
+ performSearch: function(searchConfig, progress, searchResultCallback, searchFinishedCallback) { }, |
+ |
+ /** |
+ * @param {!WebInspector.ProgressIndicator} progressIndicator |
+ * @param {function(boolean)} callback |
+ */ |
+ performIndexing: function(progressIndicator, callback) { }, |
+ |
+ stopSearch: function() { }, |
+ |
+ /** |
+ * @param {!WebInspector.SearchConfig} searchConfig |
+ * @return {!WebInspector.SearchResultsPane} |
+ */ |
+ createSearchResultsPane: function(searchConfig) { } |
+} |
+ |
+/** |
+ * @constructor |
+ * @param {!WebInspector.SearchConfig} searchConfig |
+ */ |
+WebInspector.SearchResultsPane = function(searchConfig) |
+{ |
+ this._searchConfig = searchConfig; |
+ this.element = document.createElement("div"); |
+} |
+ |
+WebInspector.SearchResultsPane.prototype = { |
+ /** |
+ * @return {!WebInspector.SearchConfig} |
+ */ |
+ get searchConfig() |
+ { |
+ return this._searchConfig; |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.FileBasedSearchResultsPane.SearchResult} searchResult |
+ */ |
+ addSearchResult: function(searchResult) { } |
+} |
+ |
+/** |
+ * @constructor |
+ * @extends {WebInspector.SearchResultsPane} |
+ * @param {!WebInspector.SearchConfig} searchConfig |
+ */ |
+WebInspector.FileBasedSearchResultsPane = function(searchConfig) |
+{ |
+ WebInspector.SearchResultsPane.call(this, searchConfig); |
+ |
+ this._searchResults = []; |
+ |
+ this.element.id = "search-results-pane-file-based"; |
+ |
+ this._treeOutlineElement = document.createElement("ol"); |
+ this._treeOutlineElement.className = "search-results-outline-disclosure"; |
+ this.element.appendChild(this._treeOutlineElement); |
+ this._treeOutline = new TreeOutline(this._treeOutlineElement); |
+ |
+ this._matchesExpandedCount = 0; |
+} |
+ |
+WebInspector.FileBasedSearchResultsPane.matchesExpandedByDefaultCount = 20; |
+WebInspector.FileBasedSearchResultsPane.fileMatchesShownAtOnce = 20; |
+ |
+WebInspector.FileBasedSearchResultsPane.prototype = { |
+ /** |
+ * @param {!WebInspector.UISourceCode} uiSourceCode |
+ * @param {number} lineNumber |
+ * @param {number} columnNumber |
+ * @return {!Element} |
+ */ |
+ _createAnchor: function(uiSourceCode, lineNumber, columnNumber) |
+ { |
+ return WebInspector.Linkifier.linkifyUsingRevealer(new WebInspector.UILocation(uiSourceCode, lineNumber, columnNumber), "", uiSourceCode.url, lineNumber); |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.FileBasedSearchResultsPane.SearchResult} searchResult |
+ */ |
+ addSearchResult: function(searchResult) |
+ { |
+ this._searchResults.push(searchResult); |
+ var uiSourceCode = searchResult.uiSourceCode; |
+ if (!uiSourceCode) |
+ return; |
+ var searchMatches = searchResult.searchMatches; |
+ |
+ var fileTreeElement = this._addFileTreeElement(uiSourceCode.fullDisplayName(), searchMatches.length, this._searchResults.length - 1); |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.FileBasedSearchResultsPane.SearchResult} searchResult |
+ * @param {!TreeElement} fileTreeElement |
+ */ |
+ _fileTreeElementExpanded: function(searchResult, fileTreeElement) |
+ { |
+ if (fileTreeElement._initialized) |
+ return; |
+ |
+ var toIndex = Math.min(searchResult.searchMatches.length, WebInspector.FileBasedSearchResultsPane.fileMatchesShownAtOnce); |
+ if (toIndex < searchResult.searchMatches.length) { |
+ this._appendSearchMatches(fileTreeElement, searchResult, 0, toIndex - 1); |
+ this._appendShowMoreMatchesElement(fileTreeElement, searchResult, toIndex - 1); |
+ } else |
+ this._appendSearchMatches(fileTreeElement, searchResult, 0, toIndex); |
+ |
+ fileTreeElement._initialized = true; |
+ }, |
+ |
+ /** |
+ * @param {!TreeElement} fileTreeElement |
+ * @param {!WebInspector.FileBasedSearchResultsPane.SearchResult} searchResult |
+ * @param {number} fromIndex |
+ * @param {number} toIndex |
+ */ |
+ _appendSearchMatches: function(fileTreeElement, searchResult, fromIndex, toIndex) |
+ { |
+ var uiSourceCode = searchResult.uiSourceCode; |
+ var searchMatches = searchResult.searchMatches; |
+ |
+ var queries = this._searchConfig.queries(); |
+ var regexes = []; |
+ for (var i = 0; i < queries.length; ++i) |
+ regexes.push(createSearchRegex(queries[i], !this._searchConfig.ignoreCase, this._searchConfig.isRegex)); |
+ |
+ for (var i = fromIndex; i < toIndex; ++i) { |
+ var lineNumber = searchMatches[i].lineNumber; |
+ var lineContent = searchMatches[i].lineContent; |
+ var matchRanges = []; |
+ for (var j = 0; j < regexes.length; ++j) |
+ matchRanges = matchRanges.concat(this._regexMatchRanges(lineContent, regexes[j])); |
+ |
+ var anchor = this._createAnchor(uiSourceCode, lineNumber, matchRanges[0].offset); |
+ |
+ var numberString = numberToStringWithSpacesPadding(lineNumber + 1, 4); |
+ var lineNumberSpan = document.createElement("span"); |
+ lineNumberSpan.classList.add("search-match-line-number"); |
+ lineNumberSpan.textContent = numberString; |
+ anchor.appendChild(lineNumberSpan); |
+ |
+ var contentSpan = this._createContentSpan(lineContent, matchRanges); |
+ anchor.appendChild(contentSpan); |
+ |
+ var searchMatchElement = new TreeElement(""); |
+ searchMatchElement.selectable = false; |
+ fileTreeElement.appendChild(searchMatchElement); |
+ searchMatchElement.listItemElement.className = "search-match source-code"; |
+ searchMatchElement.listItemElement.appendChild(anchor); |
+ } |
+ }, |
+ |
+ /** |
+ * @param {!TreeElement} fileTreeElement |
+ * @param {!WebInspector.FileBasedSearchResultsPane.SearchResult} searchResult |
+ * @param {number} startMatchIndex |
+ */ |
+ _appendShowMoreMatchesElement: function(fileTreeElement, searchResult, startMatchIndex) |
+ { |
+ var matchesLeftCount = searchResult.searchMatches.length - startMatchIndex; |
+ var showMoreMatchesText = WebInspector.UIString("Show all matches (%d more).", matchesLeftCount); |
+ var showMoreMatchesElement = new TreeElement(showMoreMatchesText); |
+ fileTreeElement.appendChild(showMoreMatchesElement); |
+ showMoreMatchesElement.listItemElement.classList.add("show-more-matches"); |
+ showMoreMatchesElement.onselect = this._showMoreMatchesElementSelected.bind(this, searchResult, startMatchIndex, showMoreMatchesElement); |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.FileBasedSearchResultsPane.SearchResult} searchResult |
+ * @param {number} startMatchIndex |
+ * @param {!TreeElement} showMoreMatchesElement |
+ * @return {boolean} |
+ */ |
+ _showMoreMatchesElementSelected: function(searchResult, startMatchIndex, showMoreMatchesElement) |
+ { |
+ var fileTreeElement = showMoreMatchesElement.parent; |
+ fileTreeElement.removeChild(showMoreMatchesElement); |
+ this._appendSearchMatches(fileTreeElement, searchResult, startMatchIndex, searchResult.searchMatches.length); |
+ return false; |
+ }, |
+ |
+ /** |
+ * @param {string} fileName |
+ * @param {number} searchMatchesCount |
+ * @param {number} searchResultIndex |
+ */ |
+ _addFileTreeElement: function(fileName, searchMatchesCount, searchResultIndex) |
+ { |
+ var fileTreeElement = new TreeElement("", null, true); |
+ fileTreeElement.toggleOnClick = true; |
+ fileTreeElement.selectable = false; |
+ |
+ this._treeOutline.appendChild(fileTreeElement); |
+ fileTreeElement.listItemElement.classList.add("search-result"); |
+ |
+ var fileNameSpan = document.createElement("span"); |
+ fileNameSpan.className = "search-result-file-name"; |
+ fileNameSpan.textContent = fileName; |
+ fileTreeElement.listItemElement.appendChild(fileNameSpan); |
+ |
+ var matchesCountSpan = document.createElement("span"); |
+ matchesCountSpan.className = "search-result-matches-count"; |
+ if (searchMatchesCount === 1) |
+ matchesCountSpan.textContent = WebInspector.UIString("(%d match)", searchMatchesCount); |
+ else |
+ matchesCountSpan.textContent = WebInspector.UIString("(%d matches)", searchMatchesCount); |
+ |
+ fileTreeElement.listItemElement.appendChild(matchesCountSpan); |
+ |
+ var searchResult = this._searchResults[searchResultIndex]; |
+ fileTreeElement.onexpand = this._fileTreeElementExpanded.bind(this, searchResult, fileTreeElement); |
+ |
+ // Expand until at least certain amount of matches is expanded. |
+ if (this._matchesExpandedCount < WebInspector.FileBasedSearchResultsPane.matchesExpandedByDefaultCount) |
+ fileTreeElement.expand(); |
+ this._matchesExpandedCount += searchResult.searchMatches.length; |
+ |
+ return fileTreeElement; |
+ }, |
+ |
+ /** |
+ * @param {string} lineContent |
+ * @param {!RegExp} regex |
+ * @return {!Array.<!WebInspector.SourceRange>} |
+ */ |
+ _regexMatchRanges: function(lineContent, regex) |
+ { |
+ regex.lastIndex = 0; |
+ var match; |
+ var offset = 0; |
+ var matchRanges = []; |
+ while ((regex.lastIndex < lineContent.length) && (match = regex.exec(lineContent))) |
+ matchRanges.push(new WebInspector.SourceRange(match.index, match[0].length)); |
+ |
+ return matchRanges; |
+ }, |
+ |
+ /** |
+ * @param {string} lineContent |
+ * @param {!Array.<!WebInspector.SourceRange>} matchRanges |
+ */ |
+ _createContentSpan: function(lineContent, matchRanges) |
+ { |
+ var contentSpan = document.createElement("span"); |
+ contentSpan.className = "search-match-content"; |
+ contentSpan.textContent = lineContent; |
+ WebInspector.highlightRangesWithStyleClass(contentSpan, matchRanges, "highlighted-match"); |
+ return contentSpan; |
+ }, |
+ |
+ __proto__: WebInspector.SearchResultsPane.prototype |
+} |
+ |
+/** |
+ * @constructor |
+ * @param {!WebInspector.UISourceCode} uiSourceCode |
+ * @param {!Array.<!Object>} searchMatches |
+ */ |
+WebInspector.FileBasedSearchResultsPane.SearchResult = function(uiSourceCode, searchMatches) { |
+ this.uiSourceCode = uiSourceCode; |
+ this.searchMatches = searchMatches; |
+} |
+ |
+/** |
+ * @type {!WebInspector.AdvancedSearchController} |
+ */ |
+WebInspector.advancedSearchController; |