diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/devtools/front_end/sdk/ContentProviderBasedProjectDelegate.js')
-rw-r--r-- | chromium/third_party/WebKit/Source/devtools/front_end/sdk/ContentProviderBasedProjectDelegate.js | 342 |
1 files changed, 342 insertions, 0 deletions
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/sdk/ContentProviderBasedProjectDelegate.js b/chromium/third_party/WebKit/Source/devtools/front_end/sdk/ContentProviderBasedProjectDelegate.js new file mode 100644 index 00000000000..528c31d8a6d --- /dev/null +++ b/chromium/third_party/WebKit/Source/devtools/front_end/sdk/ContentProviderBasedProjectDelegate.js @@ -0,0 +1,342 @@ +/* + * Copyright (C) 2013 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT + * OWNER OR 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 + * @implements {WebInspector.ProjectDelegate} + * @param {!WebInspector.Workspace} workspace + * @param {string} id + * @param {!WebInspector.projectTypes} type + */ +WebInspector.ContentProviderBasedProjectDelegate = function(workspace, id, type) +{ + this._type = type; + /** @type {!Object.<string, !WebInspector.ContentProvider>} */ + this._contentProviders = {}; + this._workspace = workspace; + this._id = id; + this._projectStore = workspace.addProject(id, this); +} + +WebInspector.ContentProviderBasedProjectDelegate.prototype = { + /** + * @return {string} + */ + type: function() + { + return this._type; + }, + + /** + * @return {string} + */ + displayName: function() + { + // Overriddden by subclasses + return ""; + }, + + /** + * @param {string} path + * @param {function(?Date, ?number)} callback + */ + requestMetadata: function(path, callback) + { + callback(null, null); + }, + + /** + * @param {string} path + * @param {function(?string)} callback + */ + requestFileContent: function(path, callback) + { + var contentProvider = this._contentProviders[path]; + contentProvider.requestContent(callback); + + /** + * @param {?string} content + * @param {boolean} encoded + * @param {string} mimeType + */ + function innerCallback(content, encoded, mimeType) + { + callback(content); + } + }, + + /** + * @return {boolean} + */ + canSetFileContent: function() + { + return false; + }, + + /** + * @param {string} path + * @param {string} newContent + * @param {function(?string)} callback + */ + setFileContent: function(path, newContent, callback) + { + callback(null); + }, + + /** + * @return {boolean} + */ + canRename: function() + { + return false; + }, + + /** + * @param {string} path + * @param {string} newName + * @param {function(boolean, string=, string=, string=, !WebInspector.ResourceType=)} callback + */ + rename: function(path, newName, callback) + { + this.performRename(path, newName, innerCallback.bind(this)); + + /** + * @param {boolean} success + * @param {string=} newName + * @this {WebInspector.ContentProviderBasedProjectDelegate} + */ + function innerCallback(success, newName) + { + if (success) + this._updateName(path, /** @type {string} */ (newName)); + callback(success, newName); + } + }, + + /** + * @param {string} path + */ + refresh: function(path) + { + }, + + /** + * @param {string} path + */ + excludeFolder: function(path) + { + }, + + /** + * @param {string} path + * @param {?string} name + * @param {string} content + * @param {function(?string)} callback + */ + createFile: function(path, name, content, callback) + { + }, + + /** + * @param {string} path + */ + deleteFile: function(path) + { + }, + + remove: function() + { + }, + + /** + * @param {string} path + * @param {string} newName + * @param {function(boolean, string=)} callback + */ + performRename: function(path, newName, callback) + { + callback(false); + }, + + /** + * @param {string} path + * @param {string} newName + */ + _updateName: function(path, newName) + { + var oldPath = path; + var copyOfPath = path.split("/"); + copyOfPath[copyOfPath.length - 1] = newName; + var newPath = copyOfPath.join("/"); + this._contentProviders[newPath] = this._contentProviders[oldPath]; + delete this._contentProviders[oldPath]; + }, + + /** + * @param {string} path + * @param {string} query + * @param {boolean} caseSensitive + * @param {boolean} isRegex + * @param {function(!Array.<!WebInspector.ContentProvider.SearchMatch>)} callback + */ + searchInFileContent: function(path, query, caseSensitive, isRegex, callback) + { + var contentProvider = this._contentProviders[path]; + contentProvider.searchInContent(query, caseSensitive, isRegex, callback); + }, + + /** + * @param {!WebInspector.ProjectSearchConfig} searchConfig + * @param {!WebInspector.Progress} progress + * @param {function(!Array.<string>)} callback + */ + findFilesMatchingSearchRequest: function(searchConfig, progress, callback) + { + var result = []; + var paths = Object.keys(this._contentProviders); + var totalCount = paths.length; + if (totalCount === 0) { + // searchInContent should call back later. + setTimeout(doneCallback, 0); + return; + } + + paths = paths.filter(searchConfig.filePathMatchesFileQuery.bind(searchConfig)); + var barrier = new CallbackBarrier(); + progress.setTotalWork(paths.length); + for (var i = 0; i < paths.length; ++i) + searchInContent.call(this, paths[i], barrier.createCallback(searchInContentCallback.bind(null, paths[i]))); + barrier.callWhenDone(doneCallback); + + /** + * @param {string} path + * @param {function(boolean)} callback + * @this {WebInspector.ContentProviderBasedProjectDelegate} + */ + function searchInContent(path, callback) + { + var queriesToRun = searchConfig.queries().slice(); + searchNextQuery.call(this); + + /** + * @this {WebInspector.ContentProviderBasedProjectDelegate} + */ + function searchNextQuery() + { + if (!queriesToRun.length) { + callback(true); + return; + } + var query = queriesToRun.shift(); + this._contentProviders[path].searchInContent(query, !searchConfig.ignoreCase(), searchConfig.isRegex(), contentCallback.bind(this)); + } + + /** + * @param {!Array.<!WebInspector.ContentProvider.SearchMatch>} searchMatches + * @this {WebInspector.ContentProviderBasedProjectDelegate} + */ + function contentCallback(searchMatches) + { + if (!searchMatches.length) { + callback(false); + return; + } + searchNextQuery.call(this); + } + } + + /** + * @param {string} path + * @param {boolean} matches + */ + function searchInContentCallback(path, matches) + { + if (matches) + result.push(path); + progress.worked(1); + } + + function doneCallback() + { + callback(result); + progress.done(); + } + }, + + /** + * @param {!WebInspector.Progress} progress + */ + indexContent: function(progress) + { + setTimeout(progress.done.bind(progress), 0); + }, + + /** + * @param {string} parentPath + * @param {string} name + * @param {string} url + * @param {!WebInspector.ContentProvider} contentProvider + * @return {string} + */ + addContentProvider: function(parentPath, name, url, contentProvider) + { + var path = parentPath ? parentPath + "/" + name : name; + if (this._contentProviders[path]) + return path; + var fileDescriptor = new WebInspector.FileDescriptor(parentPath, name, url, url, contentProvider.contentType()); + this._contentProviders[path] = contentProvider; + this._projectStore.addFile(fileDescriptor); + return path; + }, + + /** + * @param {string} path + */ + removeFile: function(path) + { + delete this._contentProviders[path]; + this._projectStore.removeFile(path); + }, + + /** + * @return {!Object.<string, !WebInspector.ContentProvider>} + */ + contentProviders: function() + { + return this._contentProviders; + }, + + reset: function() + { + this._contentProviders = {}; + this._workspace.removeProject(this._id); + this._projectStore = this._workspace.addProject(this._id, this); + } +} |