| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2012 Google Inc. All rights reserved. | |
| 3 * | |
| 4 * Redistribution and use in source and binary forms, with or without | |
| 5 * modification, are permitted provided that the following conditions are | |
| 6 * met: | |
| 7 * | |
| 8 * * Redistributions of source code must retain the above copyright | |
| 9 * notice, this list of conditions and the following disclaimer. | |
| 10 * * Redistributions in binary form must reproduce the above | |
| 11 * copyright notice, this list of conditions and the following disclaimer | |
| 12 * in the documentation and/or other materials provided with the | |
| 13 * distribution. | |
| 14 * * Neither the name of Google Inc. nor the names of its | |
| 15 * contributors may be used to endorse or promote products derived from | |
| 16 * this software without specific prior written permission. | |
| 17 * | |
| 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 29 */ | |
| 30 | |
| 31 /** | |
| 32 * @unrestricted | |
| 33 */ | |
| 34 Workspace.IsolatedFileSystemManager = class extends Common.Object { | |
| 35 constructor() { | |
| 36 super(); | |
| 37 | |
| 38 /** @type {!Map<string, !Workspace.IsolatedFileSystem>} */ | |
| 39 this._fileSystems = new Map(); | |
| 40 /** @type {!Map<number, function(!Array.<string>)>} */ | |
| 41 this._callbacks = new Map(); | |
| 42 /** @type {!Map<number, !Common.Progress>} */ | |
| 43 this._progresses = new Map(); | |
| 44 | |
| 45 InspectorFrontendHost.events.addEventListener( | |
| 46 InspectorFrontendHostAPI.Events.FileSystemRemoved, this._onFileSystemRem
oved, this); | |
| 47 InspectorFrontendHost.events.addEventListener( | |
| 48 InspectorFrontendHostAPI.Events.FileSystemAdded, this._onFileSystemAdded
, this); | |
| 49 InspectorFrontendHost.events.addEventListener( | |
| 50 InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved, this
._onFileSystemFilesChanged, this); | |
| 51 InspectorFrontendHost.events.addEventListener( | |
| 52 InspectorFrontendHostAPI.Events.IndexingTotalWorkCalculated, this._onInd
exingTotalWorkCalculated, this); | |
| 53 InspectorFrontendHost.events.addEventListener( | |
| 54 InspectorFrontendHostAPI.Events.IndexingWorked, this._onIndexingWorked,
this); | |
| 55 InspectorFrontendHost.events.addEventListener( | |
| 56 InspectorFrontendHostAPI.Events.IndexingDone, this._onIndexingDone, this
); | |
| 57 InspectorFrontendHost.events.addEventListener( | |
| 58 InspectorFrontendHostAPI.Events.SearchCompleted, this._onSearchCompleted
, this); | |
| 59 | |
| 60 this._initExcludePatterSetting(); | |
| 61 | |
| 62 this._fileSystemsLoadedPromise = this._requestFileSystems(); | |
| 63 } | |
| 64 | |
| 65 /** | |
| 66 * @return {!Promise<!Array<!Workspace.IsolatedFileSystem>>} | |
| 67 */ | |
| 68 _requestFileSystems() { | |
| 69 var fulfill; | |
| 70 var promise = new Promise(f => fulfill = f); | |
| 71 InspectorFrontendHost.events.addEventListener( | |
| 72 InspectorFrontendHostAPI.Events.FileSystemsLoaded, onFileSystemsLoaded,
this); | |
| 73 InspectorFrontendHost.requestFileSystems(); | |
| 74 return promise; | |
| 75 | |
| 76 /** | |
| 77 * @param {!Common.Event} event | |
| 78 * @this {Workspace.IsolatedFileSystemManager} | |
| 79 */ | |
| 80 function onFileSystemsLoaded(event) { | |
| 81 var fileSystems = /** @type {!Array.<!Workspace.IsolatedFileSystemManager.
FileSystem>} */ (event.data); | |
| 82 var promises = []; | |
| 83 for (var i = 0; i < fileSystems.length; ++i) | |
| 84 promises.push(this._innerAddFileSystem(fileSystems[i], false)); | |
| 85 Promise.all(promises).then(onFileSystemsAdded); | |
| 86 } | |
| 87 | |
| 88 /** | |
| 89 * @param {!Array<?Workspace.IsolatedFileSystem>} fileSystems | |
| 90 */ | |
| 91 function onFileSystemsAdded(fileSystems) { | |
| 92 fulfill(fileSystems.filter(fs => !!fs)); | |
| 93 } | |
| 94 } | |
| 95 | |
| 96 addFileSystem() { | |
| 97 InspectorFrontendHost.addFileSystem(''); | |
| 98 } | |
| 99 | |
| 100 /** | |
| 101 * @param {!Workspace.IsolatedFileSystem} fileSystem | |
| 102 */ | |
| 103 removeFileSystem(fileSystem) { | |
| 104 InspectorFrontendHost.removeFileSystem(fileSystem.embedderPath()); | |
| 105 } | |
| 106 | |
| 107 /** | |
| 108 * @return {!Promise<!Array<!Workspace.IsolatedFileSystem>>} | |
| 109 */ | |
| 110 waitForFileSystems() { | |
| 111 return this._fileSystemsLoadedPromise; | |
| 112 } | |
| 113 | |
| 114 /** | |
| 115 * @param {!Workspace.IsolatedFileSystemManager.FileSystem} fileSystem | |
| 116 * @param {boolean} dispatchEvent | |
| 117 * @return {!Promise<?Workspace.IsolatedFileSystem>} | |
| 118 */ | |
| 119 _innerAddFileSystem(fileSystem, dispatchEvent) { | |
| 120 var embedderPath = fileSystem.fileSystemPath; | |
| 121 var fileSystemURL = Common.ParsedURL.platformPathToURL(fileSystem.fileSystem
Path); | |
| 122 var promise = Workspace.IsolatedFileSystem.create( | |
| 123 this, fileSystemURL, embedderPath, fileSystem.fileSystemName, fileSystem
.rootURL); | |
| 124 return promise.then(storeFileSystem.bind(this)); | |
| 125 | |
| 126 /** | |
| 127 * @param {?Workspace.IsolatedFileSystem} fileSystem | |
| 128 * @this {Workspace.IsolatedFileSystemManager} | |
| 129 */ | |
| 130 function storeFileSystem(fileSystem) { | |
| 131 if (!fileSystem) | |
| 132 return null; | |
| 133 this._fileSystems.set(fileSystemURL, fileSystem); | |
| 134 if (dispatchEvent) | |
| 135 this.dispatchEventToListeners(Workspace.IsolatedFileSystemManager.Events
.FileSystemAdded, fileSystem); | |
| 136 return fileSystem; | |
| 137 } | |
| 138 } | |
| 139 | |
| 140 /** | |
| 141 * @param {!Common.Event} event | |
| 142 */ | |
| 143 _onFileSystemAdded(event) { | |
| 144 var errorMessage = /** @type {string} */ (event.data['errorMessage']); | |
| 145 var fileSystem = /** @type {?Workspace.IsolatedFileSystemManager.FileSystem}
*/ (event.data['fileSystem']); | |
| 146 if (errorMessage) | |
| 147 Common.console.error(errorMessage); | |
| 148 else if (fileSystem) | |
| 149 this._innerAddFileSystem(fileSystem, true); | |
| 150 } | |
| 151 | |
| 152 /** | |
| 153 * @param {!Common.Event} event | |
| 154 */ | |
| 155 _onFileSystemRemoved(event) { | |
| 156 var embedderPath = /** @type {string} */ (event.data); | |
| 157 var fileSystemPath = Common.ParsedURL.platformPathToURL(embedderPath); | |
| 158 var isolatedFileSystem = this._fileSystems.get(fileSystemPath); | |
| 159 if (!isolatedFileSystem) | |
| 160 return; | |
| 161 this._fileSystems.delete(fileSystemPath); | |
| 162 isolatedFileSystem.fileSystemRemoved(); | |
| 163 this.dispatchEventToListeners(Workspace.IsolatedFileSystemManager.Events.Fil
eSystemRemoved, isolatedFileSystem); | |
| 164 } | |
| 165 | |
| 166 /** | |
| 167 * @param {!Common.Event} event | |
| 168 */ | |
| 169 _onFileSystemFilesChanged(event) { | |
| 170 var paths = /** @type {!Workspace.IsolatedFileSystemManager.FilesChangedData
} */ (event.data); | |
| 171 var urlPaths = {}; | |
| 172 urlPaths.changed = paths.changed.map(embedderPath => Common.ParsedURL.platfo
rmPathToURL(embedderPath)); | |
| 173 urlPaths.added = paths.added.map(embedderPath => Common.ParsedURL.platformPa
thToURL(embedderPath)); | |
| 174 urlPaths.removed = paths.removed.map(embedderPath => Common.ParsedURL.platfo
rmPathToURL(embedderPath)); | |
| 175 this.dispatchEventToListeners(Workspace.IsolatedFileSystemManager.Events.Fil
eSystemFilesChanged, urlPaths); | |
| 176 } | |
| 177 | |
| 178 /** | |
| 179 * @return {!Array<!Workspace.IsolatedFileSystem>} | |
| 180 */ | |
| 181 fileSystems() { | |
| 182 return this._fileSystems.valuesArray(); | |
| 183 } | |
| 184 | |
| 185 /** | |
| 186 * @param {string} fileSystemPath | |
| 187 * @return {?Workspace.IsolatedFileSystem} | |
| 188 */ | |
| 189 fileSystem(fileSystemPath) { | |
| 190 return this._fileSystems.get(fileSystemPath) || null; | |
| 191 } | |
| 192 | |
| 193 _initExcludePatterSetting() { | |
| 194 var defaultCommonExcludedFolders = [ | |
| 195 '/node_modules/', '/bower_components/', '/\\.devtools', '/\\.git/', '/\\.s
ass-cache/', '/\\.hg/', '/\\.idea/', | |
| 196 '/\\.svn/', '/\\.cache/', '/\\.project/' | |
| 197 ]; | |
| 198 var defaultWinExcludedFolders = ['/Thumbs.db$', '/ehthumbs.db$', '/Desktop.i
ni$', '/\\$RECYCLE.BIN/']; | |
| 199 var defaultMacExcludedFolders = [ | |
| 200 '/\\.DS_Store$', '/\\.Trashes$', '/\\.Spotlight-V100$', '/\\.AppleDouble$'
, '/\\.LSOverride$', '/Icon$', | |
| 201 '/\\._.*$' | |
| 202 ]; | |
| 203 var defaultLinuxExcludedFolders = ['/.*~$']; | |
| 204 var defaultExcludedFolders = defaultCommonExcludedFolders; | |
| 205 if (Host.isWin()) | |
| 206 defaultExcludedFolders = defaultExcludedFolders.concat(defaultWinExcludedF
olders); | |
| 207 else if (Host.isMac()) | |
| 208 defaultExcludedFolders = defaultExcludedFolders.concat(defaultMacExcludedF
olders); | |
| 209 else | |
| 210 defaultExcludedFolders = defaultExcludedFolders.concat(defaultLinuxExclude
dFolders); | |
| 211 var defaultExcludedFoldersPattern = defaultExcludedFolders.join('|'); | |
| 212 this._workspaceFolderExcludePatternSetting = Common.settings.createRegExpSet
ting( | |
| 213 'workspaceFolderExcludePattern', defaultExcludedFoldersPattern, Host.isW
in() ? 'i' : ''); | |
| 214 } | |
| 215 | |
| 216 /** | |
| 217 * @return {!Common.Setting} | |
| 218 */ | |
| 219 workspaceFolderExcludePatternSetting() { | |
| 220 return this._workspaceFolderExcludePatternSetting; | |
| 221 } | |
| 222 | |
| 223 /** | |
| 224 * @param {function(!Array.<string>)} callback | |
| 225 * @return {number} | |
| 226 */ | |
| 227 registerCallback(callback) { | |
| 228 var requestId = ++Workspace.IsolatedFileSystemManager._lastRequestId; | |
| 229 this._callbacks.set(requestId, callback); | |
| 230 return requestId; | |
| 231 } | |
| 232 | |
| 233 /** | |
| 234 * @param {!Common.Progress} progress | |
| 235 * @return {number} | |
| 236 */ | |
| 237 registerProgress(progress) { | |
| 238 var requestId = ++Workspace.IsolatedFileSystemManager._lastRequestId; | |
| 239 this._progresses.set(requestId, progress); | |
| 240 return requestId; | |
| 241 } | |
| 242 | |
| 243 /** | |
| 244 * @param {!Common.Event} event | |
| 245 */ | |
| 246 _onIndexingTotalWorkCalculated(event) { | |
| 247 var requestId = /** @type {number} */ (event.data['requestId']); | |
| 248 var totalWork = /** @type {number} */ (event.data['totalWork']); | |
| 249 | |
| 250 var progress = this._progresses.get(requestId); | |
| 251 if (!progress) | |
| 252 return; | |
| 253 progress.setTotalWork(totalWork); | |
| 254 } | |
| 255 | |
| 256 /** | |
| 257 * @param {!Common.Event} event | |
| 258 */ | |
| 259 _onIndexingWorked(event) { | |
| 260 var requestId = /** @type {number} */ (event.data['requestId']); | |
| 261 var worked = /** @type {number} */ (event.data['worked']); | |
| 262 | |
| 263 var progress = this._progresses.get(requestId); | |
| 264 if (!progress) | |
| 265 return; | |
| 266 progress.worked(worked); | |
| 267 if (progress.isCanceled()) { | |
| 268 InspectorFrontendHost.stopIndexing(requestId); | |
| 269 this._onIndexingDone(event); | |
| 270 } | |
| 271 } | |
| 272 | |
| 273 /** | |
| 274 * @param {!Common.Event} event | |
| 275 */ | |
| 276 _onIndexingDone(event) { | |
| 277 var requestId = /** @type {number} */ (event.data['requestId']); | |
| 278 | |
| 279 var progress = this._progresses.get(requestId); | |
| 280 if (!progress) | |
| 281 return; | |
| 282 progress.done(); | |
| 283 this._progresses.delete(requestId); | |
| 284 } | |
| 285 | |
| 286 /** | |
| 287 * @param {!Common.Event} event | |
| 288 */ | |
| 289 _onSearchCompleted(event) { | |
| 290 var requestId = /** @type {number} */ (event.data['requestId']); | |
| 291 var files = /** @type {!Array.<string>} */ (event.data['files']); | |
| 292 | |
| 293 var callback = this._callbacks.get(requestId); | |
| 294 if (!callback) | |
| 295 return; | |
| 296 callback.call(null, files); | |
| 297 this._callbacks.delete(requestId); | |
| 298 } | |
| 299 }; | |
| 300 | |
| 301 /** @typedef {!{fileSystemName: string, rootURL: string, fileSystemPath: string}
} */ | |
| 302 Workspace.IsolatedFileSystemManager.FileSystem; | |
| 303 | |
| 304 /** @typedef {!{changed:!Array<string>, added:!Array<string>, removed:!Array<str
ing>}} */ | |
| 305 Workspace.IsolatedFileSystemManager.FilesChangedData; | |
| 306 | |
| 307 /** @enum {symbol} */ | |
| 308 Workspace.IsolatedFileSystemManager.Events = { | |
| 309 FileSystemAdded: Symbol('FileSystemAdded'), | |
| 310 FileSystemRemoved: Symbol('FileSystemRemoved'), | |
| 311 FileSystemFilesChanged: Symbol('FileSystemFilesChanged'), | |
| 312 ExcludedFolderAdded: Symbol('ExcludedFolderAdded'), | |
| 313 ExcludedFolderRemoved: Symbol('ExcludedFolderRemoved') | |
| 314 }; | |
| 315 | |
| 316 Workspace.IsolatedFileSystemManager._lastRequestId = 0; | |
| 317 | |
| 318 /** | |
| 319 * @type {!Workspace.IsolatedFileSystemManager} | |
| 320 */ | |
| 321 Workspace.isolatedFileSystemManager; | |
| OLD | NEW |