| Index: third_party/WebKit/Source/devtools/front_end/sources/SourcesSearchScope.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/sources/SourcesSearchScope.js b/third_party/WebKit/Source/devtools/front_end/sources/SourcesSearchScope.js
|
| index b050993f17857229a0b283acb259f3f971b01fd1..e7a4094929caec88673bdfca8e0c8f2bef9c9f37 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/sources/SourcesSearchScope.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/sources/SourcesSearchScope.js
|
| @@ -25,290 +25,279 @@
|
| * (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
|
| * @implements {WebInspector.SearchScope}
|
| + * @unrestricted
|
| */
|
| -WebInspector.SourcesSearchScope = function()
|
| -{
|
| +WebInspector.SourcesSearchScope = class {
|
| + constructor() {
|
| // FIXME: Add title once it is used by search controller.
|
| this._searchId = 0;
|
| -};
|
| + }
|
|
|
| -/**
|
| - * @param {!WebInspector.UISourceCode} uiSourceCode1
|
| - * @param {!WebInspector.UISourceCode} uiSourceCode2
|
| - * @return {number}
|
| - */
|
| -WebInspector.SourcesSearchScope._filesComparator = function(uiSourceCode1, uiSourceCode2)
|
| -{
|
| + /**
|
| + * @param {!WebInspector.UISourceCode} uiSourceCode1
|
| + * @param {!WebInspector.UISourceCode} uiSourceCode2
|
| + * @return {number}
|
| + */
|
| + static _filesComparator(uiSourceCode1, uiSourceCode2) {
|
| if (uiSourceCode1.isDirty() && !uiSourceCode2.isDirty())
|
| - return -1;
|
| + return -1;
|
| if (!uiSourceCode1.isDirty() && uiSourceCode2.isDirty())
|
| - return 1;
|
| + return 1;
|
| var url1 = uiSourceCode1.url();
|
| var url2 = uiSourceCode2.url();
|
| if (url1 && !url2)
|
| - return -1;
|
| + return -1;
|
| if (!url1 && url2)
|
| - return 1;
|
| + return 1;
|
| return String.naturalOrderComparator(uiSourceCode1.fullDisplayName(), uiSourceCode2.fullDisplayName());
|
| -};
|
| -
|
| + }
|
|
|
| -WebInspector.SourcesSearchScope.prototype = {
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.Progress} progress
|
| - */
|
| - performIndexing: function(progress)
|
| - {
|
| - this.stopSearch();
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.Progress} progress
|
| + */
|
| + performIndexing(progress) {
|
| + this.stopSearch();
|
|
|
| - var projects = this._projects();
|
| - var compositeProgress = new WebInspector.CompositeProgress(progress);
|
| - for (var i = 0; i < projects.length; ++i) {
|
| - var project = projects[i];
|
| - var projectProgress = compositeProgress.createSubProgress(project.uiSourceCodes().length);
|
| - project.indexContent(projectProgress);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @return {!Array.<!WebInspector.Project>}
|
| - */
|
| - _projects: function()
|
| - {
|
| - /**
|
| - * @param {!WebInspector.Project} project
|
| - * @return {boolean}
|
| - */
|
| - function filterOutServiceProjects(project)
|
| - {
|
| - return project.type() !== WebInspector.projectTypes.Service;
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.Project} project
|
| - * @return {boolean}
|
| - */
|
| - function filterOutContentScriptsIfNeeded(project)
|
| - {
|
| - return WebInspector.moduleSetting("searchInContentScripts").get() || project.type() !== WebInspector.projectTypes.ContentScripts;
|
| - }
|
| -
|
| - return WebInspector.workspace.projects().filter(filterOutServiceProjects).filter(filterOutContentScriptsIfNeeded);
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {!WebInspector.ProjectSearchConfig} searchConfig
|
| - * @param {!WebInspector.Progress} progress
|
| - * @param {function(!WebInspector.FileBasedSearchResult)} searchResultCallback
|
| - * @param {function(boolean)} searchFinishedCallback
|
| - */
|
| - performSearch: function(searchConfig, progress, searchResultCallback, searchFinishedCallback)
|
| - {
|
| - this.stopSearch();
|
| - this._searchResultCandidates = [];
|
| - this._searchResultCallback = searchResultCallback;
|
| - this._searchFinishedCallback = searchFinishedCallback;
|
| - this._searchConfig = searchConfig;
|
| -
|
| - var projects = this._projects();
|
| - var barrier = new CallbackBarrier();
|
| - var compositeProgress = new WebInspector.CompositeProgress(progress);
|
| - var searchContentProgress = compositeProgress.createSubProgress();
|
| - var findMatchingFilesProgress = new WebInspector.CompositeProgress(compositeProgress.createSubProgress());
|
| - for (var i = 0; i < projects.length; ++i) {
|
| - var project = projects[i];
|
| - var weight = project.uiSourceCodes().length;
|
| - var findMatchingFilesInProjectProgress = findMatchingFilesProgress.createSubProgress(weight);
|
| - var barrierCallback = barrier.createCallback();
|
| - var filesMathingFileQuery = this._projectFilesMatchingFileQuery(project, searchConfig);
|
| - var callback = this._processMatchingFilesForProject.bind(this, this._searchId, project, filesMathingFileQuery, barrierCallback);
|
| - project.findFilesMatchingSearchRequest(searchConfig, filesMathingFileQuery, findMatchingFilesInProjectProgress, callback);
|
| - }
|
| - barrier.callWhenDone(this._processMatchingFiles.bind(this, this._searchId, searchContentProgress, this._searchFinishedCallback.bind(this, true)));
|
| - },
|
| + var projects = this._projects();
|
| + var compositeProgress = new WebInspector.CompositeProgress(progress);
|
| + for (var i = 0; i < projects.length; ++i) {
|
| + var project = projects[i];
|
| + var projectProgress = compositeProgress.createSubProgress(project.uiSourceCodes().length);
|
| + project.indexContent(projectProgress);
|
| + }
|
| + }
|
|
|
| + /**
|
| + * @return {!Array.<!WebInspector.Project>}
|
| + */
|
| + _projects() {
|
| /**
|
| * @param {!WebInspector.Project} project
|
| - * @param {!WebInspector.ProjectSearchConfig} searchConfig
|
| - * @param {boolean=} dirtyOnly
|
| - * @return {!Array.<string>}
|
| + * @return {boolean}
|
| */
|
| - _projectFilesMatchingFileQuery: function(project, searchConfig, dirtyOnly)
|
| - {
|
| - var result = [];
|
| - var uiSourceCodes = project.uiSourceCodes();
|
| - for (var i = 0; i < uiSourceCodes.length; ++i) {
|
| - var uiSourceCode = uiSourceCodes[i];
|
| - var binding = WebInspector.persistence.binding(uiSourceCode);
|
| - if (binding && binding.fileSystem === uiSourceCode)
|
| - continue;
|
| - if (dirtyOnly && !uiSourceCode.isDirty())
|
| - continue;
|
| - if (this._searchConfig.filePathMatchesFileQuery(uiSourceCode.fullDisplayName()))
|
| - result.push(uiSourceCode.url());
|
| - }
|
| - result.sort(String.naturalOrderComparator);
|
| - return result;
|
| - },
|
| + function filterOutServiceProjects(project) {
|
| + return project.type() !== WebInspector.projectTypes.Service;
|
| + }
|
|
|
| /**
|
| - * @param {number} searchId
|
| * @param {!WebInspector.Project} project
|
| - * @param {!Array.<string>} filesMathingFileQuery
|
| - * @param {function()} callback
|
| - * @param {!Array.<string>} files
|
| + * @return {boolean}
|
| */
|
| - _processMatchingFilesForProject: function(searchId, project, filesMathingFileQuery, callback, files)
|
| - {
|
| - if (searchId !== this._searchId) {
|
| - this._searchFinishedCallback(false);
|
| - return;
|
| - }
|
| + function filterOutContentScriptsIfNeeded(project) {
|
| + return WebInspector.moduleSetting('searchInContentScripts').get() ||
|
| + project.type() !== WebInspector.projectTypes.ContentScripts;
|
| + }
|
|
|
| - files.sort(String.naturalOrderComparator);
|
| - files = files.intersectOrdered(filesMathingFileQuery, String.naturalOrderComparator);
|
| - var dirtyFiles = this._projectFilesMatchingFileQuery(project, this._searchConfig, true);
|
| - files = files.mergeOrdered(dirtyFiles, String.naturalOrderComparator);
|
| + return WebInspector.workspace.projects().filter(filterOutServiceProjects).filter(filterOutContentScriptsIfNeeded);
|
| + }
|
|
|
| - var uiSourceCodes = [];
|
| - for (var i = 0; i < files.length; ++i) {
|
| - var uiSourceCode = project.uiSourceCodeForURL(files[i]);
|
| - if (uiSourceCode) {
|
| - var script = WebInspector.DefaultScriptMapping.scriptForUISourceCode(uiSourceCode);
|
| - if (script && !script.isAnonymousScript())
|
| - continue;
|
| - uiSourceCodes.push(uiSourceCode);
|
| - }
|
| - }
|
| - uiSourceCodes.sort(WebInspector.SourcesSearchScope._filesComparator);
|
| - this._searchResultCandidates = this._searchResultCandidates.mergeOrdered(uiSourceCodes, WebInspector.SourcesSearchScope._filesComparator);
|
| - callback();
|
| - },
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.ProjectSearchConfig} searchConfig
|
| + * @param {!WebInspector.Progress} progress
|
| + * @param {function(!WebInspector.FileBasedSearchResult)} searchResultCallback
|
| + * @param {function(boolean)} searchFinishedCallback
|
| + */
|
| + performSearch(searchConfig, progress, searchResultCallback, searchFinishedCallback) {
|
| + this.stopSearch();
|
| + this._searchResultCandidates = [];
|
| + this._searchResultCallback = searchResultCallback;
|
| + this._searchFinishedCallback = searchFinishedCallback;
|
| + this._searchConfig = searchConfig;
|
|
|
| - /**
|
| - * @param {number} searchId
|
| - * @param {!WebInspector.Progress} progress
|
| - * @param {function()} callback
|
| - */
|
| - _processMatchingFiles: function(searchId, progress, callback)
|
| - {
|
| - if (searchId !== this._searchId) {
|
| - this._searchFinishedCallback(false);
|
| - return;
|
| - }
|
| + var projects = this._projects();
|
| + var barrier = new CallbackBarrier();
|
| + var compositeProgress = new WebInspector.CompositeProgress(progress);
|
| + var searchContentProgress = compositeProgress.createSubProgress();
|
| + var findMatchingFilesProgress = new WebInspector.CompositeProgress(compositeProgress.createSubProgress());
|
| + for (var i = 0; i < projects.length; ++i) {
|
| + var project = projects[i];
|
| + var weight = project.uiSourceCodes().length;
|
| + var findMatchingFilesInProjectProgress = findMatchingFilesProgress.createSubProgress(weight);
|
| + var barrierCallback = barrier.createCallback();
|
| + var filesMathingFileQuery = this._projectFilesMatchingFileQuery(project, searchConfig);
|
| + var callback = this._processMatchingFilesForProject.bind(
|
| + this, this._searchId, project, filesMathingFileQuery, barrierCallback);
|
| + project.findFilesMatchingSearchRequest(
|
| + searchConfig, filesMathingFileQuery, findMatchingFilesInProjectProgress, callback);
|
| + }
|
| + barrier.callWhenDone(this._processMatchingFiles.bind(
|
| + this, this._searchId, searchContentProgress, this._searchFinishedCallback.bind(this, true)));
|
| + }
|
|
|
| - var files = this._searchResultCandidates;
|
| - if (!files.length) {
|
| - progress.done();
|
| - callback();
|
| - return;
|
| - }
|
| + /**
|
| + * @param {!WebInspector.Project} project
|
| + * @param {!WebInspector.ProjectSearchConfig} searchConfig
|
| + * @param {boolean=} dirtyOnly
|
| + * @return {!Array.<string>}
|
| + */
|
| + _projectFilesMatchingFileQuery(project, searchConfig, dirtyOnly) {
|
| + var result = [];
|
| + var uiSourceCodes = project.uiSourceCodes();
|
| + for (var i = 0; i < uiSourceCodes.length; ++i) {
|
| + var uiSourceCode = uiSourceCodes[i];
|
| + var binding = WebInspector.persistence.binding(uiSourceCode);
|
| + if (binding && binding.fileSystem === uiSourceCode)
|
| + continue;
|
| + if (dirtyOnly && !uiSourceCode.isDirty())
|
| + continue;
|
| + if (this._searchConfig.filePathMatchesFileQuery(uiSourceCode.fullDisplayName()))
|
| + result.push(uiSourceCode.url());
|
| + }
|
| + result.sort(String.naturalOrderComparator);
|
| + return result;
|
| + }
|
|
|
| - progress.setTotalWork(files.length);
|
| + /**
|
| + * @param {number} searchId
|
| + * @param {!WebInspector.Project} project
|
| + * @param {!Array.<string>} filesMathingFileQuery
|
| + * @param {function()} callback
|
| + * @param {!Array.<string>} files
|
| + */
|
| + _processMatchingFilesForProject(searchId, project, filesMathingFileQuery, callback, files) {
|
| + if (searchId !== this._searchId) {
|
| + this._searchFinishedCallback(false);
|
| + return;
|
| + }
|
|
|
| - var fileIndex = 0;
|
| - var maxFileContentRequests = 20;
|
| - var callbacksLeft = 0;
|
| + files.sort(String.naturalOrderComparator);
|
| + files = files.intersectOrdered(filesMathingFileQuery, String.naturalOrderComparator);
|
| + var dirtyFiles = this._projectFilesMatchingFileQuery(project, this._searchConfig, true);
|
| + files = files.mergeOrdered(dirtyFiles, String.naturalOrderComparator);
|
|
|
| - for (var i = 0; i < maxFileContentRequests && i < files.length; ++i)
|
| - scheduleSearchInNextFileOrFinish.call(this);
|
| + var uiSourceCodes = [];
|
| + for (var i = 0; i < files.length; ++i) {
|
| + var uiSourceCode = project.uiSourceCodeForURL(files[i]);
|
| + if (uiSourceCode) {
|
| + var script = WebInspector.DefaultScriptMapping.scriptForUISourceCode(uiSourceCode);
|
| + if (script && !script.isAnonymousScript())
|
| + continue;
|
| + uiSourceCodes.push(uiSourceCode);
|
| + }
|
| + }
|
| + uiSourceCodes.sort(WebInspector.SourcesSearchScope._filesComparator);
|
| + this._searchResultCandidates =
|
| + this._searchResultCandidates.mergeOrdered(uiSourceCodes, WebInspector.SourcesSearchScope._filesComparator);
|
| + callback();
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.UISourceCode} uiSourceCode
|
| - * @this {WebInspector.SourcesSearchScope}
|
| - */
|
| - function searchInNextFile(uiSourceCode)
|
| - {
|
| - if (uiSourceCode.isDirty())
|
| - contentLoaded.call(this, uiSourceCode, uiSourceCode.workingCopy());
|
| - else
|
| - uiSourceCode.checkContentUpdated(true, contentUpdated.bind(this, uiSourceCode));
|
| - }
|
| + /**
|
| + * @param {number} searchId
|
| + * @param {!WebInspector.Progress} progress
|
| + * @param {function()} callback
|
| + */
|
| + _processMatchingFiles(searchId, progress, callback) {
|
| + if (searchId !== this._searchId) {
|
| + this._searchFinishedCallback(false);
|
| + return;
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.UISourceCode} uiSourceCode
|
| - * @this {WebInspector.SourcesSearchScope}
|
| - */
|
| - function contentUpdated(uiSourceCode)
|
| - {
|
| - uiSourceCode.requestContent().then(contentLoaded.bind(this, uiSourceCode));
|
| - }
|
| + var files = this._searchResultCandidates;
|
| + if (!files.length) {
|
| + progress.done();
|
| + callback();
|
| + return;
|
| + }
|
|
|
| - /**
|
| - * @this {WebInspector.SourcesSearchScope}
|
| - */
|
| - function scheduleSearchInNextFileOrFinish()
|
| - {
|
| - if (fileIndex >= files.length) {
|
| - if (!callbacksLeft) {
|
| - progress.done();
|
| - callback();
|
| - return;
|
| - }
|
| - return;
|
| - }
|
| + progress.setTotalWork(files.length);
|
|
|
| - ++callbacksLeft;
|
| - var uiSourceCode = files[fileIndex++];
|
| - setTimeout(searchInNextFile.bind(this, uiSourceCode), 0);
|
| - }
|
| + var fileIndex = 0;
|
| + var maxFileContentRequests = 20;
|
| + var callbacksLeft = 0;
|
|
|
| - /**
|
| - * @param {!WebInspector.UISourceCode} uiSourceCode
|
| - * @param {?string} content
|
| - * @this {WebInspector.SourcesSearchScope}
|
| - */
|
| - function contentLoaded(uiSourceCode, content)
|
| - {
|
| - /**
|
| - * @param {!WebInspector.ContentProvider.SearchMatch} a
|
| - * @param {!WebInspector.ContentProvider.SearchMatch} b
|
| - */
|
| - function matchesComparator(a, b)
|
| - {
|
| - return a.lineNumber - b.lineNumber;
|
| - }
|
| + for (var i = 0; i < maxFileContentRequests && i < files.length; ++i)
|
| + scheduleSearchInNextFileOrFinish.call(this);
|
|
|
| - progress.worked(1);
|
| - var matches = [];
|
| - var queries = this._searchConfig.queries();
|
| - if (content !== null) {
|
| - for (var i = 0; i < queries.length; ++i) {
|
| - var nextMatches = WebInspector.ContentProvider.performSearchInContent(content, queries[i], !this._searchConfig.ignoreCase(), this._searchConfig.isRegex());
|
| - matches = matches.mergeOrdered(nextMatches, matchesComparator);
|
| - }
|
| - }
|
| - if (matches) {
|
| - var searchResult = new WebInspector.FileBasedSearchResult(uiSourceCode, matches);
|
| - this._searchResultCallback(searchResult);
|
| - }
|
| + /**
|
| + * @param {!WebInspector.UISourceCode} uiSourceCode
|
| + * @this {WebInspector.SourcesSearchScope}
|
| + */
|
| + function searchInNextFile(uiSourceCode) {
|
| + if (uiSourceCode.isDirty())
|
| + contentLoaded.call(this, uiSourceCode, uiSourceCode.workingCopy());
|
| + else
|
| + uiSourceCode.checkContentUpdated(true, contentUpdated.bind(this, uiSourceCode));
|
| + }
|
|
|
| - --callbacksLeft;
|
| - scheduleSearchInNextFileOrFinish.call(this);
|
| - }
|
| - },
|
| + /**
|
| + * @param {!WebInspector.UISourceCode} uiSourceCode
|
| + * @this {WebInspector.SourcesSearchScope}
|
| + */
|
| + function contentUpdated(uiSourceCode) {
|
| + uiSourceCode.requestContent().then(contentLoaded.bind(this, uiSourceCode));
|
| + }
|
|
|
| /**
|
| - * @override
|
| + * @this {WebInspector.SourcesSearchScope}
|
| */
|
| - stopSearch: function()
|
| - {
|
| - ++this._searchId;
|
| - },
|
| + function scheduleSearchInNextFileOrFinish() {
|
| + if (fileIndex >= files.length) {
|
| + if (!callbacksLeft) {
|
| + progress.done();
|
| + callback();
|
| + return;
|
| + }
|
| + return;
|
| + }
|
| +
|
| + ++callbacksLeft;
|
| + var uiSourceCode = files[fileIndex++];
|
| + setTimeout(searchInNextFile.bind(this, uiSourceCode), 0);
|
| + }
|
|
|
| /**
|
| - * @override
|
| - * @param {!WebInspector.ProjectSearchConfig} searchConfig
|
| - * @return {!WebInspector.FileBasedSearchResultsPane}
|
| + * @param {!WebInspector.UISourceCode} uiSourceCode
|
| + * @param {?string} content
|
| + * @this {WebInspector.SourcesSearchScope}
|
| */
|
| - createSearchResultsPane: function(searchConfig)
|
| - {
|
| - return new WebInspector.FileBasedSearchResultsPane(searchConfig);
|
| + function contentLoaded(uiSourceCode, content) {
|
| + /**
|
| + * @param {!WebInspector.ContentProvider.SearchMatch} a
|
| + * @param {!WebInspector.ContentProvider.SearchMatch} b
|
| + */
|
| + function matchesComparator(a, b) {
|
| + return a.lineNumber - b.lineNumber;
|
| + }
|
| +
|
| + progress.worked(1);
|
| + var matches = [];
|
| + var queries = this._searchConfig.queries();
|
| + if (content !== null) {
|
| + for (var i = 0; i < queries.length; ++i) {
|
| + var nextMatches = WebInspector.ContentProvider.performSearchInContent(
|
| + content, queries[i], !this._searchConfig.ignoreCase(), this._searchConfig.isRegex());
|
| + matches = matches.mergeOrdered(nextMatches, matchesComparator);
|
| + }
|
| + }
|
| + if (matches) {
|
| + var searchResult = new WebInspector.FileBasedSearchResult(uiSourceCode, matches);
|
| + this._searchResultCallback(searchResult);
|
| + }
|
| +
|
| + --callbacksLeft;
|
| + scheduleSearchInNextFileOrFinish.call(this);
|
| }
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + stopSearch() {
|
| + ++this._searchId;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {!WebInspector.ProjectSearchConfig} searchConfig
|
| + * @return {!WebInspector.FileBasedSearchResultsPane}
|
| + */
|
| + createSearchResultsPane(searchConfig) {
|
| + return new WebInspector.FileBasedSearchResultsPane(searchConfig);
|
| + }
|
| };
|
| +
|
| +
|
|
|