Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/bindings/FileSystemWorkspaceBinding.js

Issue 2466123002: DevTools: reformat front-end code to match chromium style. (Closed)
Patch Set: all done Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer 11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the 12 * in the documentation and/or other materials provided with the
13 * distribution. 13 * distribution.
14 * * Neither the name of Google Inc. nor the names of its 14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from 15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission. 16 * this software without specific prior written permission.
17 * 17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 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. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30
31 /** 30 /**
32 * @constructor 31 * @unrestricted
33 * @param {!WebInspector.IsolatedFileSystemManager} isolatedFileSystemManager
34 * @param {!WebInspector.Workspace} workspace
35 */ 32 */
36 WebInspector.FileSystemWorkspaceBinding = function(isolatedFileSystemManager, wo rkspace) 33 WebInspector.FileSystemWorkspaceBinding = class {
37 { 34 /**
35 * @param {!WebInspector.IsolatedFileSystemManager} isolatedFileSystemManager
36 * @param {!WebInspector.Workspace} workspace
37 */
38 constructor(isolatedFileSystemManager, workspace) {
38 this._isolatedFileSystemManager = isolatedFileSystemManager; 39 this._isolatedFileSystemManager = isolatedFileSystemManager;
39 this._workspace = workspace; 40 this._workspace = workspace;
40 this._eventListeners = [ 41 this._eventListeners = [
41 this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFi leSystemManager.Events.FileSystemAdded, this._onFileSystemAdded, this), 42 this._isolatedFileSystemManager.addEventListener(
42 this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFi leSystemManager.Events.FileSystemRemoved, this._onFileSystemRemoved, this), 43 WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded, this._o nFileSystemAdded, this),
43 this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFi leSystemManager.Events.FileSystemFilesChanged, this._fileSystemFilesChanged, thi s) 44 this._isolatedFileSystemManager.addEventListener(
45 WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved, this. _onFileSystemRemoved, this),
46 this._isolatedFileSystemManager.addEventListener(
47 WebInspector.IsolatedFileSystemManager.Events.FileSystemFilesChanged, this._fileSystemFilesChanged, this)
44 ]; 48 ];
45 /** @type {!Map.<string, !WebInspector.FileSystemWorkspaceBinding.FileSystem >} */ 49 /** @type {!Map.<string, !WebInspector.FileSystemWorkspaceBinding.FileSystem >} */
46 this._boundFileSystems = new Map(); 50 this._boundFileSystems = new Map();
47 this._isolatedFileSystemManager.waitForFileSystems() 51 this._isolatedFileSystemManager.waitForFileSystems().then(this._onFileSystem sLoaded.bind(this));
48 .then(this._onFileSystemsLoaded.bind(this)); 52 }
53
54 /**
55 * @param {string} fileSystemPath
56 * @return {string}
57 */
58 static projectId(fileSystemPath) {
59 return fileSystemPath;
60 }
61
62 /**
63 * @param {!WebInspector.UISourceCode} uiSourceCode
64 * @return {!Array<string>}
65 */
66 static relativePath(uiSourceCode) {
67 var baseURL =
68 /** @type {!WebInspector.FileSystemWorkspaceBinding.FileSystem}*/ (uiSou rceCode.project())._fileSystemBaseURL;
69 return uiSourceCode.url().substring(baseURL.length).split('/');
70 }
71
72 /**
73 * @param {!WebInspector.Project} project
74 * @param {string} relativePath
75 * @return {string}
76 */
77 static completeURL(project, relativePath) {
78 var fsProject = /** @type {!WebInspector.FileSystemWorkspaceBinding.FileSyst em}*/ (project);
79 return fsProject._fileSystemBaseURL + relativePath;
80 }
81
82 /**
83 * @param {string} extension
84 * @return {!WebInspector.ResourceType}
85 */
86 static _contentTypeForExtension(extension) {
87 if (WebInspector.FileSystemWorkspaceBinding._styleSheetExtensions.has(extens ion))
88 return WebInspector.resourceTypes.Stylesheet;
89 if (WebInspector.FileSystemWorkspaceBinding._documentExtensions.has(extensio n))
90 return WebInspector.resourceTypes.Document;
91 if (WebInspector.FileSystemWorkspaceBinding._imageExtensions.has(extension))
92 return WebInspector.resourceTypes.Image;
93 if (WebInspector.FileSystemWorkspaceBinding._scriptExtensions.has(extension) )
94 return WebInspector.resourceTypes.Script;
95 return WebInspector.resourceTypes.Other;
96 }
97
98 /**
99 * @param {string} projectId
100 * @return {string}
101 */
102 static fileSystemPath(projectId) {
103 return projectId;
104 }
105
106 /**
107 * @return {!WebInspector.IsolatedFileSystemManager}
108 */
109 fileSystemManager() {
110 return this._isolatedFileSystemManager;
111 }
112
113 /**
114 * @param {!Array<!WebInspector.IsolatedFileSystem>} fileSystems
115 */
116 _onFileSystemsLoaded(fileSystems) {
117 for (var fileSystem of fileSystems)
118 this._addFileSystem(fileSystem);
119 }
120
121 /**
122 * @param {!WebInspector.Event} event
123 */
124 _onFileSystemAdded(event) {
125 var fileSystem = /** @type {!WebInspector.IsolatedFileSystem} */ (event.data );
126 this._addFileSystem(fileSystem);
127 }
128
129 /**
130 * @param {!WebInspector.IsolatedFileSystem} fileSystem
131 */
132 _addFileSystem(fileSystem) {
133 var boundFileSystem = new WebInspector.FileSystemWorkspaceBinding.FileSystem (this, fileSystem, this._workspace);
134 this._boundFileSystems.set(fileSystem.path(), boundFileSystem);
135 }
136
137 /**
138 * @param {!WebInspector.Event} event
139 */
140 _onFileSystemRemoved(event) {
141 var fileSystem = /** @type {!WebInspector.IsolatedFileSystem} */ (event.data );
142 var boundFileSystem = this._boundFileSystems.get(fileSystem.path());
143 boundFileSystem.dispose();
144 this._boundFileSystems.remove(fileSystem.path());
145 }
146
147 /**
148 * @param {!WebInspector.Event} event
149 */
150 _fileSystemFilesChanged(event) {
151 var paths = /** @type {!Array<string>} */ (event.data);
152 for (var path of paths) {
153 for (var key of this._boundFileSystems.keys()) {
154 if (!path.startsWith(key))
155 continue;
156 this._boundFileSystems.get(key)._fileChanged(path);
157 }
158 }
159 }
160
161 dispose() {
162 WebInspector.EventTarget.removeEventListeners(this._eventListeners);
163 for (var fileSystem of this._boundFileSystems.values()) {
164 fileSystem.dispose();
165 this._boundFileSystems.remove(fileSystem._fileSystem.path());
166 }
167 }
49 }; 168 };
50 169
51 WebInspector.FileSystemWorkspaceBinding._styleSheetExtensions = new Set(["css", "scss", "sass", "less"]); 170 WebInspector.FileSystemWorkspaceBinding._styleSheetExtensions = new Set(['css', 'scss', 'sass', 'less']);
52 WebInspector.FileSystemWorkspaceBinding._documentExtensions = new Set(["htm", "h tml", "asp", "aspx", "phtml", "jsp"]); 171 WebInspector.FileSystemWorkspaceBinding._documentExtensions = new Set(['htm', 'h tml', 'asp', 'aspx', 'phtml', 'jsp']);
53 WebInspector.FileSystemWorkspaceBinding._scriptExtensions = new Set(["asp", "asp x", "c", "cc", "cljs", "coffee", "cpp", "cs", "dart", "java", "js", "jsp", "jsx" , "h", "m", "mm", "py", "sh", "ts", "tsx", "ls"]); 172 WebInspector.FileSystemWorkspaceBinding._scriptExtensions = new Set([
173 'asp', 'aspx', 'c', 'cc', 'cljs', 'coffee', 'cpp', 'cs', 'dart', 'java', 'js',
174 'jsp', 'jsx', 'h', 'm', 'mm', 'py', 'sh', 'ts', 'tsx', 'ls'
175 ]);
54 176
55 WebInspector.FileSystemWorkspaceBinding._imageExtensions = WebInspector.Isolated FileSystem.ImageExtensions; 177 WebInspector.FileSystemWorkspaceBinding._imageExtensions = WebInspector.Isolated FileSystem.ImageExtensions;
56 178
179
57 /** 180 /**
58 * @param {string} fileSystemPath 181 * @implements {WebInspector.Project}
59 * @return {string} 182 * @unrestricted
60 */ 183 */
61 WebInspector.FileSystemWorkspaceBinding.projectId = function(fileSystemPath) 184 WebInspector.FileSystemWorkspaceBinding.FileSystem = class extends WebInspector. ProjectStore {
62 { 185 /**
63 return fileSystemPath; 186 * @param {!WebInspector.FileSystemWorkspaceBinding} fileSystemWorkspaceBindin g
64 }; 187 * @param {!WebInspector.IsolatedFileSystem} isolatedFileSystem
65 188 * @param {!WebInspector.Workspace} workspace
66 /** 189 */
67 * @param {!WebInspector.UISourceCode} uiSourceCode 190 constructor(fileSystemWorkspaceBinding, isolatedFileSystem, workspace) {
68 * @return {!Array<string>}
69 */
70 WebInspector.FileSystemWorkspaceBinding.relativePath = function(uiSourceCode)
71 {
72 var baseURL = /** @type {!WebInspector.FileSystemWorkspaceBinding.FileSystem }*/(uiSourceCode.project())._fileSystemBaseURL;
73 return uiSourceCode.url().substring(baseURL.length).split("/");
74 };
75
76 /**
77 * @param {!WebInspector.Project} project
78 * @param {string} relativePath
79 * @return {string}
80 */
81 WebInspector.FileSystemWorkspaceBinding.completeURL = function(project, relative Path)
82 {
83 var fsProject = /** @type {!WebInspector.FileSystemWorkspaceBinding.FileSyst em}*/(project);
84 return fsProject._fileSystemBaseURL + relativePath;
85 };
86
87 /**
88 * @param {string} extension
89 * @return {!WebInspector.ResourceType}
90 */
91 WebInspector.FileSystemWorkspaceBinding._contentTypeForExtension = function(exte nsion)
92 {
93 if (WebInspector.FileSystemWorkspaceBinding._styleSheetExtensions.has(extens ion))
94 return WebInspector.resourceTypes.Stylesheet;
95 if (WebInspector.FileSystemWorkspaceBinding._documentExtensions.has(extensio n))
96 return WebInspector.resourceTypes.Document;
97 if (WebInspector.FileSystemWorkspaceBinding._imageExtensions.has(extension))
98 return WebInspector.resourceTypes.Image;
99 if (WebInspector.FileSystemWorkspaceBinding._scriptExtensions.has(extension) )
100 return WebInspector.resourceTypes.Script;
101 return WebInspector.resourceTypes.Other;
102 };
103
104 WebInspector.FileSystemWorkspaceBinding.prototype = {
105 /**
106 * @return {!WebInspector.IsolatedFileSystemManager}
107 */
108 fileSystemManager: function()
109 {
110 return this._isolatedFileSystemManager;
111 },
112
113 /**
114 * @param {!Array<!WebInspector.IsolatedFileSystem>} fileSystems
115 */
116 _onFileSystemsLoaded: function(fileSystems)
117 {
118 for (var fileSystem of fileSystems)
119 this._addFileSystem(fileSystem);
120 },
121
122 /**
123 * @param {!WebInspector.Event} event
124 */
125 _onFileSystemAdded: function(event)
126 {
127 var fileSystem = /** @type {!WebInspector.IsolatedFileSystem} */ (event. data);
128 this._addFileSystem(fileSystem);
129 },
130
131 /**
132 * @param {!WebInspector.IsolatedFileSystem} fileSystem
133 */
134 _addFileSystem: function(fileSystem)
135 {
136 var boundFileSystem = new WebInspector.FileSystemWorkspaceBinding.FileSy stem(this, fileSystem, this._workspace);
137 this._boundFileSystems.set(fileSystem.path(), boundFileSystem);
138 },
139
140 /**
141 * @param {!WebInspector.Event} event
142 */
143 _onFileSystemRemoved: function(event)
144 {
145 var fileSystem = /** @type {!WebInspector.IsolatedFileSystem} */ (event. data);
146 var boundFileSystem = this._boundFileSystems.get(fileSystem.path());
147 boundFileSystem.dispose();
148 this._boundFileSystems.remove(fileSystem.path());
149 },
150
151 /**
152 * @param {!WebInspector.Event} event
153 */
154 _fileSystemFilesChanged: function(event)
155 {
156 var paths = /** @type {!Array<string>} */ (event.data);
157 for (var path of paths) {
158 for (var key of this._boundFileSystems.keys()) {
159 if (!path.startsWith(key))
160 continue;
161 this._boundFileSystems.get(key)._fileChanged(path);
162 }
163 }
164 },
165
166 dispose: function()
167 {
168 WebInspector.EventTarget.removeEventListeners(this._eventListeners);
169 for (var fileSystem of this._boundFileSystems.values()) {
170 fileSystem.dispose();
171 this._boundFileSystems.remove(fileSystem._fileSystem.path());
172 }
173 }
174 };
175
176 /**
177 * @param {string} projectId
178 * @return {string}
179 */
180 WebInspector.FileSystemWorkspaceBinding.fileSystemPath = function(projectId)
181 {
182 return projectId;
183 };
184
185 /**
186 * @constructor
187 * @extends {WebInspector.ProjectStore}
188 * @implements {WebInspector.Project}
189 * @param {!WebInspector.FileSystemWorkspaceBinding} fileSystemWorkspaceBinding
190 * @param {!WebInspector.IsolatedFileSystem} isolatedFileSystem
191 * @param {!WebInspector.Workspace} workspace
192 */
193 WebInspector.FileSystemWorkspaceBinding.FileSystem = function(fileSystemWorkspac eBinding, isolatedFileSystem, workspace)
194 {
195 var fileSystemPath = isolatedFileSystem.path(); 191 var fileSystemPath = isolatedFileSystem.path();
196 var id = WebInspector.FileSystemWorkspaceBinding.projectId(fileSystemPath); 192 var id = WebInspector.FileSystemWorkspaceBinding.projectId(fileSystemPath);
197 console.assert(!workspace.project(id)); 193 console.assert(!workspace.project(id));
198 var displayName = fileSystemPath.substr(fileSystemPath.lastIndexOf("/") + 1) ; 194 var displayName = fileSystemPath.substr(fileSystemPath.lastIndexOf('/') + 1) ;
199 195
200 WebInspector.ProjectStore.call(this, workspace, id, WebInspector.projectType s.FileSystem, displayName); 196 super(workspace, id, WebInspector.projectTypes.FileSystem, displayName);
201 197
202 this._fileSystem = isolatedFileSystem; 198 this._fileSystem = isolatedFileSystem;
203 this._fileSystemBaseURL = this._fileSystem.path() + "/"; 199 this._fileSystemBaseURL = this._fileSystem.path() + '/';
204 this._fileSystemWorkspaceBinding = fileSystemWorkspaceBinding; 200 this._fileSystemWorkspaceBinding = fileSystemWorkspaceBinding;
205 this._fileSystemPath = fileSystemPath; 201 this._fileSystemPath = fileSystemPath;
206 202
207 workspace.addProject(this); 203 workspace.addProject(this);
208 this.populate(); 204 this.populate();
205 }
206
207 /**
208 * @return {string}
209 */
210 fileSystemPath() {
211 return this._fileSystemPath;
212 }
213
214 /**
215 * @return {!Array<string>}
216 */
217 gitFolders() {
218 return this._fileSystem.gitFolders().map(folder => this._fileSystemPath + '/ ' + folder);
219 }
220
221 /**
222 * @param {!WebInspector.UISourceCode} uiSourceCode
223 * @return {string}
224 */
225 _filePathForUISourceCode(uiSourceCode) {
226 return uiSourceCode.url().substring(this._fileSystemPath.length);
227 }
228
229 /**
230 * @override
231 * @param {!WebInspector.UISourceCode} uiSourceCode
232 * @return {!Promise<?WebInspector.UISourceCodeMetadata>}
233 */
234 requestMetadata(uiSourceCode) {
235 if (uiSourceCode[WebInspector.FileSystemWorkspaceBinding._metadata])
236 return uiSourceCode[WebInspector.FileSystemWorkspaceBinding._metadata];
237 var relativePath = this._filePathForUISourceCode(uiSourceCode);
238 var promise = this._fileSystem.getMetadata(relativePath).then(onMetadata);
239 uiSourceCode[WebInspector.FileSystemWorkspaceBinding._metadata] = promise;
240 return promise;
241
242 /**
243 * @param {?{modificationTime: !Date, size: number}} metadata
244 * @return {?WebInspector.UISourceCodeMetadata}
245 */
246 function onMetadata(metadata) {
247 if (!metadata)
248 return null;
249 return new WebInspector.UISourceCodeMetadata(metadata.modificationTime, me tadata.size);
250 }
251 }
252
253 /**
254 * @override
255 * @param {!WebInspector.UISourceCode} uiSourceCode
256 * @param {function(?string)} callback
257 */
258 requestFileContent(uiSourceCode, callback) {
259 var filePath = this._filePathForUISourceCode(uiSourceCode);
260 var isImage =
261 WebInspector.FileSystemWorkspaceBinding._imageExtensions.has(WebInspecto r.ParsedURL.extractExtension(filePath));
262
263 this._fileSystem.requestFileContent(filePath, isImage ? base64CallbackWrappe r : callback);
264
265 /**
266 * @param {?string} result
267 */
268 function base64CallbackWrapper(result) {
269 if (!result) {
270 callback(result);
271 return;
272 }
273 var index = result.indexOf(',');
274 callback(result.substring(index + 1));
275 }
276 }
277
278 /**
279 * @override
280 * @return {boolean}
281 */
282 canSetFileContent() {
283 return true;
284 }
285
286 /**
287 * @override
288 * @param {!WebInspector.UISourceCode} uiSourceCode
289 * @param {string} newContent
290 * @param {function(?string)} callback
291 */
292 setFileContent(uiSourceCode, newContent, callback) {
293 var filePath = this._filePathForUISourceCode(uiSourceCode);
294 this._fileSystem.setFileContent(filePath, newContent, callback.bind(this, '' ));
295 }
296
297 /**
298 * @override
299 * @return {boolean}
300 */
301 canRename() {
302 return true;
303 }
304
305 /**
306 * @override
307 * @param {!WebInspector.UISourceCode} uiSourceCode
308 * @param {string} newName
309 * @param {function(boolean, string=, string=, !WebInspector.ResourceType=)} c allback
310 */
311 rename(uiSourceCode, newName, callback) {
312 if (newName === uiSourceCode.name()) {
313 callback(true, uiSourceCode.name(), uiSourceCode.url(), uiSourceCode.conte ntType());
314 return;
315 }
316
317 var filePath = this._filePathForUISourceCode(uiSourceCode);
318 this._fileSystem.renameFile(filePath, newName, innerCallback.bind(this));
319
320 /**
321 * @param {boolean} success
322 * @param {string=} newName
323 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
324 */
325 function innerCallback(success, newName) {
326 if (!success || !newName) {
327 callback(false, newName);
328 return;
329 }
330 console.assert(newName);
331 var slash = filePath.lastIndexOf('/');
332 var parentPath = filePath.substring(0, slash);
333 filePath = parentPath + '/' + newName;
334 filePath = filePath.substr(1);
335 var extension = this._extensionForPath(newName);
336 var newURL = this._fileSystemBaseURL + filePath;
337 var newContentType = WebInspector.FileSystemWorkspaceBinding._contentTypeF orExtension(extension);
338 this.renameUISourceCode(uiSourceCode, newName);
339 callback(true, newName, newURL, newContentType);
340 }
341 }
342
343 /**
344 * @override
345 * @param {!WebInspector.UISourceCode} uiSourceCode
346 * @param {string} query
347 * @param {boolean} caseSensitive
348 * @param {boolean} isRegex
349 * @param {function(!Array.<!WebInspector.ContentProvider.SearchMatch>)} callb ack
350 */
351 searchInFileContent(uiSourceCode, query, caseSensitive, isRegex, callback) {
352 var filePath = this._filePathForUISourceCode(uiSourceCode);
353 this._fileSystem.requestFileContent(filePath, contentCallback);
354
355 /**
356 * @param {?string} content
357 */
358 function contentCallback(content) {
359 var result = [];
360 if (content !== null)
361 result = WebInspector.ContentProvider.performSearchInContent(content, qu ery, caseSensitive, isRegex);
362 callback(result);
363 }
364 }
365
366 /**
367 * @override
368 * @param {!WebInspector.ProjectSearchConfig} searchConfig
369 * @param {!Array.<string>} filesMathingFileQuery
370 * @param {!WebInspector.Progress} progress
371 * @param {function(!Array.<string>)} callback
372 */
373 findFilesMatchingSearchRequest(searchConfig, filesMathingFileQuery, progress, callback) {
374 var result = filesMathingFileQuery;
375 var queriesToRun = searchConfig.queries().slice();
376 if (!queriesToRun.length)
377 queriesToRun.push('');
378 progress.setTotalWork(queriesToRun.length);
379 searchNextQuery.call(this);
380
381 /**
382 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
383 */
384 function searchNextQuery() {
385 if (!queriesToRun.length) {
386 progress.done();
387 callback(result);
388 return;
389 }
390 var query = queriesToRun.shift();
391 this._fileSystem.searchInPath(searchConfig.isRegex() ? '' : query, progres s, innerCallback.bind(this));
392 }
393
394 /**
395 * @param {!Array.<string>} files
396 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
397 */
398 function innerCallback(files) {
399 files = files.sort();
400 progress.worked(1);
401 result = result.intersectOrdered(files, String.naturalOrderComparator);
402 searchNextQuery.call(this);
403 }
404 }
405
406 /**
407 * @override
408 * @param {!WebInspector.Progress} progress
409 */
410 indexContent(progress) {
411 this._fileSystem.indexContent(progress);
412 }
413
414 /**
415 * @param {string} path
416 * @return {string}
417 */
418 _extensionForPath(path) {
419 var extensionIndex = path.lastIndexOf('.');
420 if (extensionIndex === -1)
421 return '';
422 return path.substring(extensionIndex + 1).toLowerCase();
423 }
424
425 populate() {
426 var chunkSize = 1000;
427 var filePaths = this._fileSystem.filePaths();
428 reportFileChunk.call(this, 0);
429
430 /**
431 * @param {number} from
432 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
433 */
434 function reportFileChunk(from) {
435 var to = Math.min(from + chunkSize, filePaths.length);
436 for (var i = from; i < to; ++i)
437 this._addFile(filePaths[i]);
438 if (to < filePaths.length)
439 setTimeout(reportFileChunk.bind(this, to), 100);
440 }
441 }
442
443 /**
444 * @override
445 * @param {string} url
446 */
447 excludeFolder(url) {
448 var relativeFolder = url.substring(this._fileSystemBaseURL.length);
449 if (!relativeFolder.startsWith('/'))
450 relativeFolder = '/' + relativeFolder;
451 if (!relativeFolder.endsWith('/'))
452 relativeFolder += '/';
453 this._fileSystem.addExcludedFolder(relativeFolder);
454
455 var uiSourceCodes = this.uiSourceCodes().slice();
456 for (var i = 0; i < uiSourceCodes.length; ++i) {
457 var uiSourceCode = uiSourceCodes[i];
458 if (uiSourceCode.url().startsWith(url))
459 this.removeUISourceCode(uiSourceCode.url());
460 }
461 }
462
463 /**
464 * @override
465 * @param {string} path
466 * @param {?string} name
467 * @param {string} content
468 * @param {function(?WebInspector.UISourceCode)} callback
469 */
470 createFile(path, name, content, callback) {
471 this._fileSystem.createFile(path, name, innerCallback.bind(this));
472 var createFilePath;
473
474 /**
475 * @param {?string} filePath
476 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
477 */
478 function innerCallback(filePath) {
479 if (!filePath) {
480 callback(null);
481 return;
482 }
483 createFilePath = filePath;
484 if (!content) {
485 contentSet.call(this);
486 return;
487 }
488 this._fileSystem.setFileContent(filePath, content, contentSet.bind(this));
489 }
490
491 /**
492 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
493 */
494 function contentSet() {
495 callback(this._addFile(createFilePath));
496 }
497 }
498
499 /**
500 * @override
501 * @param {string} path
502 */
503 deleteFile(path) {
504 this._fileSystem.deleteFile(path);
505 this.removeUISourceCode(path);
506 }
507
508 /**
509 * @override
510 */
511 remove() {
512 this._fileSystemWorkspaceBinding._isolatedFileSystemManager.removeFileSystem (this._fileSystem);
513 }
514
515 /**
516 * @param {string} filePath
517 * @return {!WebInspector.UISourceCode}
518 */
519 _addFile(filePath) {
520 var extension = this._extensionForPath(filePath);
521 var contentType = WebInspector.FileSystemWorkspaceBinding._contentTypeForExt ension(extension);
522
523 var uiSourceCode = this.createUISourceCode(this._fileSystemBaseURL + filePat h, contentType);
524 this.addUISourceCode(uiSourceCode);
525 return uiSourceCode;
526 }
527
528 /**
529 * @param {string} path
530 */
531 _fileChanged(path) {
532 var uiSourceCode = this.uiSourceCodeForURL(path);
533 if (!uiSourceCode) {
534 var contentType = WebInspector.FileSystemWorkspaceBinding._contentTypeForE xtension(this._extensionForPath(path));
535 this.addUISourceCode(this.createUISourceCode(path, contentType));
536 return;
537 }
538 uiSourceCode[WebInspector.FileSystemWorkspaceBinding._metadata] = null;
539 uiSourceCode.checkContentUpdated();
540 }
541
542 dispose() {
543 this.removeProject();
544 }
209 }; 545 };
210 546
211 WebInspector.FileSystemWorkspaceBinding._metadata = Symbol("FileSystemWorkspaceB inding.Metadata"); 547 WebInspector.FileSystemWorkspaceBinding._metadata = Symbol('FileSystemWorkspaceB inding.Metadata');
212
213 WebInspector.FileSystemWorkspaceBinding.FileSystem.prototype = {
214 /**
215 * @return {string}
216 */
217 fileSystemPath: function()
218 {
219 return this._fileSystemPath;
220 },
221
222 /**
223 * @return {!Array<string>}
224 */
225 gitFolders: function()
226 {
227 return this._fileSystem.gitFolders().map(folder => this._fileSystemPath + "/" + folder);
228 },
229
230 /**
231 * @param {!WebInspector.UISourceCode} uiSourceCode
232 * @return {string}
233 */
234 _filePathForUISourceCode: function(uiSourceCode)
235 {
236 return uiSourceCode.url().substring(this._fileSystemPath.length);
237 },
238
239 /**
240 * @override
241 * @param {!WebInspector.UISourceCode} uiSourceCode
242 * @return {!Promise<?WebInspector.UISourceCodeMetadata>}
243 */
244 requestMetadata: function(uiSourceCode)
245 {
246 if (uiSourceCode[WebInspector.FileSystemWorkspaceBinding._metadata])
247 return uiSourceCode[WebInspector.FileSystemWorkspaceBinding._metadat a];
248 var relativePath = this._filePathForUISourceCode(uiSourceCode);
249 var promise = this._fileSystem.getMetadata(relativePath).then(onMetadata );
250 uiSourceCode[WebInspector.FileSystemWorkspaceBinding._metadata] = promis e;
251 return promise;
252
253 /**
254 * @param {?{modificationTime: !Date, size: number}} metadata
255 * @return {?WebInspector.UISourceCodeMetadata}
256 */
257 function onMetadata(metadata)
258 {
259 if (!metadata)
260 return null;
261 return new WebInspector.UISourceCodeMetadata(metadata.modificationTi me, metadata.size);
262 }
263 },
264
265 /**
266 * @override
267 * @param {!WebInspector.UISourceCode} uiSourceCode
268 * @param {function(?string)} callback
269 */
270 requestFileContent: function(uiSourceCode, callback)
271 {
272 var filePath = this._filePathForUISourceCode(uiSourceCode);
273 var isImage = WebInspector.FileSystemWorkspaceBinding._imageExtensions.h as(WebInspector.ParsedURL.extractExtension(filePath));
274
275 this._fileSystem.requestFileContent(filePath, isImage ? base64CallbackWr apper : callback);
276
277 /**
278 * @param {?string} result
279 */
280 function base64CallbackWrapper(result)
281 {
282 if (!result) {
283 callback(result);
284 return;
285 }
286 var index = result.indexOf(",");
287 callback(result.substring(index + 1));
288 }
289 },
290
291 /**
292 * @override
293 * @return {boolean}
294 */
295 canSetFileContent: function()
296 {
297 return true;
298 },
299
300 /**
301 * @override
302 * @param {!WebInspector.UISourceCode} uiSourceCode
303 * @param {string} newContent
304 * @param {function(?string)} callback
305 */
306 setFileContent: function(uiSourceCode, newContent, callback)
307 {
308 var filePath = this._filePathForUISourceCode(uiSourceCode);
309 this._fileSystem.setFileContent(filePath, newContent, callback.bind(this , ""));
310 },
311
312 /**
313 * @override
314 * @return {boolean}
315 */
316 canRename: function()
317 {
318 return true;
319 },
320
321 /**
322 * @override
323 * @param {!WebInspector.UISourceCode} uiSourceCode
324 * @param {string} newName
325 * @param {function(boolean, string=, string=, !WebInspector.ResourceType=)} callback
326 */
327 rename: function(uiSourceCode, newName, callback)
328 {
329 if (newName === uiSourceCode.name()) {
330 callback(true, uiSourceCode.name(), uiSourceCode.url(), uiSourceCode .contentType());
331 return;
332 }
333
334 var filePath = this._filePathForUISourceCode(uiSourceCode);
335 this._fileSystem.renameFile(filePath, newName, innerCallback.bind(this)) ;
336
337 /**
338 * @param {boolean} success
339 * @param {string=} newName
340 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
341 */
342 function innerCallback(success, newName)
343 {
344 if (!success || !newName) {
345 callback(false, newName);
346 return;
347 }
348 console.assert(newName);
349 var slash = filePath.lastIndexOf("/");
350 var parentPath = filePath.substring(0, slash);
351 filePath = parentPath + "/" + newName;
352 filePath = filePath.substr(1);
353 var extension = this._extensionForPath(newName);
354 var newURL = this._fileSystemBaseURL + filePath;
355 var newContentType = WebInspector.FileSystemWorkspaceBinding._conten tTypeForExtension(extension);
356 this.renameUISourceCode(uiSourceCode, newName);
357 callback(true, newName, newURL, newContentType);
358 }
359 },
360
361 /**
362 * @override
363 * @param {!WebInspector.UISourceCode} uiSourceCode
364 * @param {string} query
365 * @param {boolean} caseSensitive
366 * @param {boolean} isRegex
367 * @param {function(!Array.<!WebInspector.ContentProvider.SearchMatch>)} cal lback
368 */
369 searchInFileContent: function(uiSourceCode, query, caseSensitive, isRegex, c allback)
370 {
371 var filePath = this._filePathForUISourceCode(uiSourceCode);
372 this._fileSystem.requestFileContent(filePath, contentCallback);
373
374 /**
375 * @param {?string} content
376 */
377 function contentCallback(content)
378 {
379 var result = [];
380 if (content !== null)
381 result = WebInspector.ContentProvider.performSearchInContent(con tent, query, caseSensitive, isRegex);
382 callback(result);
383 }
384 },
385
386 /**
387 * @override
388 * @param {!WebInspector.ProjectSearchConfig} searchConfig
389 * @param {!Array.<string>} filesMathingFileQuery
390 * @param {!WebInspector.Progress} progress
391 * @param {function(!Array.<string>)} callback
392 */
393 findFilesMatchingSearchRequest: function(searchConfig, filesMathingFileQuery , progress, callback)
394 {
395 var result = filesMathingFileQuery;
396 var queriesToRun = searchConfig.queries().slice();
397 if (!queriesToRun.length)
398 queriesToRun.push("");
399 progress.setTotalWork(queriesToRun.length);
400 searchNextQuery.call(this);
401
402 /**
403 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
404 */
405 function searchNextQuery()
406 {
407 if (!queriesToRun.length) {
408 progress.done();
409 callback(result);
410 return;
411 }
412 var query = queriesToRun.shift();
413 this._fileSystem.searchInPath(searchConfig.isRegex() ? "" : query, p rogress, innerCallback.bind(this));
414 }
415
416 /**
417 * @param {!Array.<string>} files
418 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
419 */
420 function innerCallback(files)
421 {
422 files = files.sort();
423 progress.worked(1);
424 result = result.intersectOrdered(files, String.naturalOrderComparato r);
425 searchNextQuery.call(this);
426 }
427 },
428
429 /**
430 * @override
431 * @param {!WebInspector.Progress} progress
432 */
433 indexContent: function(progress)
434 {
435 this._fileSystem.indexContent(progress);
436 },
437
438 /**
439 * @param {string} path
440 * @return {string}
441 */
442 _extensionForPath: function(path)
443 {
444 var extensionIndex = path.lastIndexOf(".");
445 if (extensionIndex === -1)
446 return "";
447 return path.substring(extensionIndex + 1).toLowerCase();
448 },
449
450 populate: function()
451 {
452 var chunkSize = 1000;
453 var filePaths = this._fileSystem.filePaths();
454 reportFileChunk.call(this, 0);
455
456 /**
457 * @param {number} from
458 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
459 */
460 function reportFileChunk(from)
461 {
462 var to = Math.min(from + chunkSize, filePaths.length);
463 for (var i = from; i < to; ++i)
464 this._addFile(filePaths[i]);
465 if (to < filePaths.length)
466 setTimeout(reportFileChunk.bind(this, to), 100);
467 }
468 },
469
470 /**
471 * @override
472 * @param {string} url
473 */
474 excludeFolder: function(url)
475 {
476 var relativeFolder = url.substring(this._fileSystemBaseURL.length);
477 if (!relativeFolder.startsWith("/"))
478 relativeFolder = "/" + relativeFolder;
479 if (!relativeFolder.endsWith("/"))
480 relativeFolder += "/";
481 this._fileSystem.addExcludedFolder(relativeFolder);
482
483 var uiSourceCodes = this.uiSourceCodes().slice();
484 for (var i = 0; i < uiSourceCodes.length; ++i) {
485 var uiSourceCode = uiSourceCodes[i];
486 if (uiSourceCode.url().startsWith(url))
487 this.removeUISourceCode(uiSourceCode.url());
488 }
489 },
490
491 /**
492 * @override
493 * @param {string} path
494 * @param {?string} name
495 * @param {string} content
496 * @param {function(?WebInspector.UISourceCode)} callback
497 */
498 createFile: function(path, name, content, callback)
499 {
500 this._fileSystem.createFile(path, name, innerCallback.bind(this));
501 var createFilePath;
502
503 /**
504 * @param {?string} filePath
505 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
506 */
507 function innerCallback(filePath)
508 {
509 if (!filePath) {
510 callback(null);
511 return;
512 }
513 createFilePath = filePath;
514 if (!content) {
515 contentSet.call(this);
516 return;
517 }
518 this._fileSystem.setFileContent(filePath, content, contentSet.bind(t his));
519 }
520
521 /**
522 * @this {WebInspector.FileSystemWorkspaceBinding.FileSystem}
523 */
524 function contentSet()
525 {
526 callback(this._addFile(createFilePath));
527 }
528 },
529
530 /**
531 * @override
532 * @param {string} path
533 */
534 deleteFile: function(path)
535 {
536 this._fileSystem.deleteFile(path);
537 this.removeUISourceCode(path);
538 },
539
540 /**
541 * @override
542 */
543 remove: function()
544 {
545 this._fileSystemWorkspaceBinding._isolatedFileSystemManager.removeFileSy stem(this._fileSystem);
546 },
547
548 /**
549 * @param {string} filePath
550 * @return {!WebInspector.UISourceCode}
551 */
552 _addFile: function(filePath)
553 {
554 var extension = this._extensionForPath(filePath);
555 var contentType = WebInspector.FileSystemWorkspaceBinding._contentTypeFo rExtension(extension);
556
557 var uiSourceCode = this.createUISourceCode(this._fileSystemBaseURL + fil ePath, contentType);
558 this.addUISourceCode(uiSourceCode);
559 return uiSourceCode;
560 },
561
562 /**
563 * @param {string} path
564 */
565 _fileChanged: function(path)
566 {
567 var uiSourceCode = this.uiSourceCodeForURL(path);
568 if (!uiSourceCode) {
569 var contentType = WebInspector.FileSystemWorkspaceBinding._contentTy peForExtension(this._extensionForPath(path));
570 this.addUISourceCode(this.createUISourceCode(path, contentType));
571 return;
572 }
573 uiSourceCode[WebInspector.FileSystemWorkspaceBinding._metadata] = null;
574 uiSourceCode.checkContentUpdated();
575 },
576
577 dispose: function()
578 {
579 this.removeProject();
580 },
581
582 __proto__: WebInspector.ProjectStore.prototype
583 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698