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

Side by Side Diff: Source/devtools/front_end/EditFileSystemDialog.js

Issue 283063003: DevTools: Implement extension-based status bar buttons (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Address comments Created 6 years, 6 months 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 /*
2 * Copyright (C) 2013 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 * @constructor
33 * @extends {WebInspector.DialogDelegate}
34 * @param {string} fileSystemPath
35 */
36 WebInspector.EditFileSystemDialog = function(fileSystemPath)
37 {
38 WebInspector.DialogDelegate.call(this);
39 this._fileSystemPath = fileSystemPath;
40
41 this.element = document.createElement("div");
42 this.element.className = "edit-file-system-dialog";
43
44 var header = this.element.createChild("div", "header");
45 var headerText = header.createChild("span");
46 headerText.textContent = WebInspector.UIString("Edit file system");
47
48 var closeButton = header.createChild("div", "close-button-gray done-button") ;
49 closeButton.addEventListener("click", this._onDoneClick.bind(this), false);
50
51 var contents = this.element.createChild("div", "contents");
52
53 WebInspector.isolatedFileSystemManager.mapping().addEventListener(WebInspect or.FileSystemMapping.Events.FileMappingAdded, this._fileMappingAdded, this);
54 WebInspector.isolatedFileSystemManager.mapping().addEventListener(WebInspect or.FileSystemMapping.Events.FileMappingRemoved, this._fileMappingRemoved, this);
55 WebInspector.isolatedFileSystemManager.mapping().addEventListener(WebInspect or.FileSystemMapping.Events.ExcludedFolderAdded, this._excludedFolderAdded, this );
56 WebInspector.isolatedFileSystemManager.mapping().addEventListener(WebInspect or.FileSystemMapping.Events.ExcludedFolderRemoved, this._excludedFolderRemoved, this);
57
58 var blockHeader = contents.createChild("div", "block-header");
59 blockHeader.textContent = WebInspector.UIString("Mappings");
60 this._fileMappingsSection = contents.createChild("div", "section file-mappin gs-section");
61 this._fileMappingsListContainer = this._fileMappingsSection.createChild("div ", "settings-list-container");
62 var entries = WebInspector.isolatedFileSystemManager.mapping().mappingEntrie s(this._fileSystemPath);
63
64 this._fileMappingsList = new WebInspector.EditableSettingsList(["url", "path "], this._fileMappingValuesProvider.bind(this), this._fileMappingValidate.bind(t his), this._fileMappingEdit.bind(this));
65 this._fileMappingsList.addEventListener(WebInspector.SettingsList.Events.Rem oved, this._fileMappingRemovedfromList.bind(this));
66
67 this._fileMappingsList.element.classList.add("file-mappings-list");
68 this._fileMappingsListContainer.appendChild(this._fileMappingsList.element);
69
70 this._entries = {};
71 for (var i = 0; i < entries.length; ++i)
72 this._addMappingRow(entries[i]);
73
74 blockHeader = contents.createChild("div", "block-header");
75 blockHeader.textContent = WebInspector.UIString("Excluded folders");
76 this._excludedFolderListSection = contents.createChild("div", "section exclu ded-folders-section");
77 this._excludedFolderListContainer = this._excludedFolderListSection.createCh ild("div", "settings-list-container");
78 var excludedFolderEntries = WebInspector.isolatedFileSystemManager.mapping() .excludedFolders(fileSystemPath);
79
80 this._excludedFolderList = new WebInspector.EditableSettingsList(["path"], t his._excludedFolderValueProvider.bind(this), this._excludedFolderValidate.bind(t his), this._excludedFolderEdit.bind(this));
81 this._excludedFolderList.addEventListener(WebInspector.SettingsList.Events.R emoved, this._excludedFolderRemovedfromList.bind(this));
82 this._excludedFolderList.element.classList.add("excluded-folders-list");
83 this._excludedFolderListContainer.appendChild(this._excludedFolderList.eleme nt);
84 this._excludedFolderEntries = new StringMap();
85 for (var i = 0; i < excludedFolderEntries.length; ++i)
86 this._addExcludedFolderRow(excludedFolderEntries[i]);
87
88 this.element.tabIndex = 0;
89 }
90
91 WebInspector.EditFileSystemDialog.show = function(element, fileSystemPath)
92 {
93 WebInspector.Dialog.show(element, new WebInspector.EditFileSystemDialog(file SystemPath));
94 var glassPane = document.getElementById("glass-pane");
95 glassPane.classList.add("settings-glass-pane");
96 }
97
98 WebInspector.EditFileSystemDialog.prototype = {
99 /**
100 * @param {!Element} element
101 */
102 show: function(element)
103 {
104 element.appendChild(this.element);
105 this.element.classList.add("dialog-contents");
106 element.classList.add("settings-dialog");
107 element.classList.add("settings-tab");
108 this._dialogElement = element;
109 },
110
111 _resize: function()
112 {
113 if (!this._dialogElement || !this._relativeToElement)
114 return;
115
116 const minWidth = 200;
117 const minHeight = 150;
118 var maxHeight = this._relativeToElement.offsetHeight - 10;
119 maxHeight = Math.max(minHeight, maxHeight);
120 var maxWidth = Math.min(540, this._relativeToElement.offsetWidth - 10);
121 maxWidth = Math.max(minWidth, maxWidth);
122 this._dialogElement.style.maxHeight = maxHeight + "px";
123 this._dialogElement.style.width = maxWidth + "px";
124
125 WebInspector.DialogDelegate.prototype.position(this._dialogElement, this ._relativeToElement);
126 },
127
128 /**
129 * @param {!Element} element
130 * @param {!Element} relativeToElement
131 */
132 position: function(element, relativeToElement)
133 {
134 this._relativeToElement = relativeToElement;
135 this._resize();
136 },
137
138 willHide: function(event)
139 {
140 },
141
142 _fileMappingAdded: function(event)
143 {
144 var entry = /** @type {!WebInspector.FileSystemMapping.Entry} */ (event. data);
145 this._addMappingRow(entry);
146 },
147
148 _fileMappingRemoved: function(event)
149 {
150 var entry = /** @type {!WebInspector.FileSystemMapping.Entry} */ (event. data);
151 if (this._fileSystemPath !== entry.fileSystemPath)
152 return;
153 delete this._entries[entry.urlPrefix];
154 if (this._fileMappingsList.itemForId(entry.urlPrefix))
155 this._fileMappingsList.removeItem(entry.urlPrefix);
156 this._resize();
157 },
158
159 _fileMappingValuesProvider: function(itemId, columnId)
160 {
161 if (!itemId)
162 return "";
163 var entry = this._entries[itemId];
164 switch (columnId) {
165 case "url":
166 return entry.urlPrefix;
167 case "path":
168 return entry.pathPrefix;
169 default:
170 console.assert("Should not be reached.");
171 }
172 return "";
173 },
174
175 /**
176 * @param {?string} itemId
177 * @param {!Object} data
178 */
179 _fileMappingValidate: function(itemId, data)
180 {
181 var oldPathPrefix = itemId ? this._entries[itemId].pathPrefix : null;
182 return this._validateMapping(data["url"], itemId, data["path"], oldPathP refix);
183 },
184
185 /**
186 * @param {?string} itemId
187 * @param {!Object} data
188 */
189 _fileMappingEdit: function(itemId, data)
190 {
191 if (itemId) {
192 var urlPrefix = itemId;
193 var pathPrefix = this._entries[itemId].pathPrefix;
194 var fileSystemPath = this._entries[itemId].fileSystemPath;
195 WebInspector.isolatedFileSystemManager.mapping().removeFileMapping(f ileSystemPath, urlPrefix, pathPrefix);
196 }
197 this._addFileMapping(data["url"], data["path"]);
198 },
199
200 /**
201 * @param {string} urlPrefix
202 * @param {?string} allowedURLPrefix
203 * @param {string} path
204 * @param {?string} allowedPathPrefix
205 */
206 _validateMapping: function(urlPrefix, allowedURLPrefix, path, allowedPathPre fix)
207 {
208 var columns = [];
209 if (!this._checkURLPrefix(urlPrefix, allowedURLPrefix))
210 columns.push("url");
211 if (!this._checkPathPrefix(path, allowedPathPrefix))
212 columns.push("path");
213 return columns;
214 },
215
216 /**
217 * @param {!WebInspector.Event} event
218 */
219 _fileMappingRemovedfromList: function(event)
220 {
221 var urlPrefix = /** @type{?string} */ (event.data);
222 if (!urlPrefix)
223 return;
224
225 var entry = this._entries[urlPrefix];
226 WebInspector.isolatedFileSystemManager.mapping().removeFileMapping(entry .fileSystemPath, entry.urlPrefix, entry.pathPrefix);
227 },
228
229 /**
230 * @param {string} urlPrefix
231 * @param {string} pathPrefix
232 * @return {boolean}
233 */
234 _addFileMapping: function(urlPrefix, pathPrefix)
235 {
236 var normalizedURLPrefix = this._normalizePrefix(urlPrefix);
237 var normalizedPathPrefix = this._normalizePrefix(pathPrefix);
238 WebInspector.isolatedFileSystemManager.mapping().addFileMapping(this._fi leSystemPath, normalizedURLPrefix, normalizedPathPrefix);
239 this._fileMappingsList.selectItem(normalizedURLPrefix);
240 return true;
241 },
242
243 /**
244 * @param {string} prefix
245 * @return {string}
246 */
247 _normalizePrefix: function(prefix)
248 {
249 if (!prefix)
250 return "";
251 return prefix + (prefix[prefix.length - 1] === "/" ? "" : "/");
252 },
253
254 _addMappingRow: function(entry)
255 {
256 var fileSystemPath = entry.fileSystemPath;
257 var urlPrefix = entry.urlPrefix;
258 if (!this._fileSystemPath || this._fileSystemPath !== fileSystemPath)
259 return;
260
261 this._entries[urlPrefix] = entry;
262 var fileMappingListItem = this._fileMappingsList.addItem(urlPrefix, null );
263 this._resize();
264 },
265
266 _excludedFolderAdded: function(event)
267 {
268 var entry = /** @type {!WebInspector.FileSystemMapping.ExcludedFolderEnt ry} */ (event.data);
269 this._addExcludedFolderRow(entry);
270 },
271
272 _excludedFolderRemoved: function(event)
273 {
274 var entry = /** @type {!WebInspector.FileSystemMapping.ExcludedFolderEnt ry} */ (event.data);
275 var fileSystemPath = entry.fileSystemPath;
276 if (!fileSystemPath || this._fileSystemPath !== fileSystemPath)
277 return;
278 delete this._excludedFolderEntries[entry.path];
279 if (this._excludedFolderList.itemForId(entry.path))
280 this._excludedFolderList.removeItem(entry.path);
281 },
282
283 _excludedFolderValueProvider: function(itemId, columnId)
284 {
285 return itemId;
286 },
287
288 /**
289 * @param {?string} itemId
290 * @param {!Object} data
291 */
292 _excludedFolderValidate: function(itemId, data)
293 {
294 var fileSystemPath = this._fileSystemPath;
295 var columns = [];
296 if (!this._validateExcludedFolder(data["path"], itemId))
297 columns.push("path");
298 return columns;
299 },
300
301 /**
302 * @param {string} path
303 * @param {?string} allowedPath
304 * @return {boolean}
305 */
306 _validateExcludedFolder: function(path, allowedPath)
307 {
308 return !!path && (path === allowedPath || !this._excludedFolderEntries.c ontains(path));
309 },
310
311 /**
312 * @param {?string} itemId
313 * @param {!Object} data
314 */
315 _excludedFolderEdit: function(itemId, data)
316 {
317 var fileSystemPath = this._fileSystemPath;
318 if (itemId)
319 WebInspector.isolatedFileSystemManager.mapping().removeExcludedFolde r(fileSystemPath, itemId);
320 var excludedFolderPath = data["path"];
321 WebInspector.isolatedFileSystemManager.mapping().addExcludedFolder(fileS ystemPath, excludedFolderPath);
322 },
323
324 /**
325 * @param {!WebInspector.Event} event
326 */
327 _excludedFolderRemovedfromList: function(event)
328 {
329 var itemId = /** @type{?string} */ (event.data);
330 if (!itemId)
331 return;
332 WebInspector.isolatedFileSystemManager.mapping().removeExcludedFolder(th is._fileSystemPath, itemId);
333 },
334
335 /**
336 * @param {!WebInspector.FileSystemMapping.ExcludedFolderEntry} entry
337 */
338 _addExcludedFolderRow: function(entry)
339 {
340 var fileSystemPath = entry.fileSystemPath;
341 if (!fileSystemPath || this._fileSystemPath !== fileSystemPath)
342 return;
343 var path = entry.path;
344 this._excludedFolderEntries.put(path, entry);
345 this._excludedFolderList.addItem(path, null);
346 this._resize();
347 },
348
349 /**
350 * @param {string} value
351 * @param {?string} allowedPrefix
352 * @return {boolean}
353 */
354 _checkURLPrefix: function(value, allowedPrefix)
355 {
356 var prefix = this._normalizePrefix(value);
357 return !!prefix && (prefix === allowedPrefix || !this._entries[prefix]);
358 },
359
360 /**
361 * @param {string} value
362 * @param {?string} allowedPrefix
363 * @return {boolean}
364 */
365 _checkPathPrefix: function(value, allowedPrefix)
366 {
367 var prefix = this._normalizePrefix(value);
368 if (!prefix)
369 return false;
370 if (prefix === allowedPrefix)
371 return true;
372 for (var urlPrefix in this._entries) {
373 var entry = this._entries[urlPrefix];
374 if (urlPrefix && entry.pathPrefix === prefix)
375 return false;
376 }
377 return true;
378 },
379
380 focus: function()
381 {
382 WebInspector.setCurrentFocusElement(this.element);
383 },
384
385 _onDoneClick: function()
386 {
387 WebInspector.Dialog.hide();
388 },
389
390 onEnter: function()
391 {
392 },
393
394 __proto__: WebInspector.DialogDelegate.prototype
395 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698