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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/resources/ResourcesSection.js

Issue 2712043002: [DevTools] Separate frames and resources handling (Closed)
Patch Set: [DevTools] Separate frames and resources handling Created 3 years, 9 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
OLDNEW
1 /* 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 * Copyright (C) 2007, 2008, 2010 Apple Inc. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be
3 * Copyright (C) 2009 Joseph Pecoraro 3 // found in the LICENSE file.
4 * Copyright (C) 2013 Samsung Electronics. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
16 * its contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 /**
31 * @implements {SDK.TargetManager.Observer}
32 * @unrestricted
33 */
34 Resources.ResourcesPanel = class extends UI.PanelWithSidebar {
35 constructor() {
36 super('resources');
37 this.registerRequiredCSS('resources/resourcesPanel.css');
38 4
39 this._resourcesLastSelectedItemSetting = Common.settings.createSetting('reso urcesLastSelectedItem', {}); 5 Resources.ResourcesSection = class {
6 /**
7 * @param {!Resources.ResourcesPanel} storagePanel
8 * @param {!UI.TreeElement} treeElement
9 */
10 constructor(storagePanel, treeElement) {
11 this._panel = storagePanel;
12 this._treeElement = treeElement;
13 /** @type {!Map<string, !Resources.FrameTreeElement>} */
14 this._treeElementForFrameId = new Map();
40 15
41 this._sidebarTree = new UI.TreeOutlineInShadow(); 16 function addListener(eventType, handler, target) {
42 this._sidebarTree.element.classList.add('resources-sidebar'); 17 SDK.targetManager.addModelListener(SDK.ResourceTreeModel, eventType, event => handler.call(target, event.data));
43 this._sidebarTree.registerRequiredCSS('resources/resourcesSidebar.css'); 18 }
44 this._sidebarTree.element.classList.add('filter-all'); 19 addListener(SDK.ResourceTreeModel.Events.FrameAdded, this._frameAdded, this) ;
45 this.panelSidebarElement().appendChild(this._sidebarTree.element); 20 addListener(SDK.ResourceTreeModel.Events.FrameNavigated, this._frameNavigate d, this);
21 addListener(SDK.ResourceTreeModel.Events.FrameDetached, this._frameDetached, this);
22 addListener(SDK.ResourceTreeModel.Events.ResourceAdded, this._resourceAdded, this);
46 23
47 this._applicationTreeElement = this._addSidebarSection(Common.UIString('Appl ication')); 24 var mainTarget = SDK.targetManager.mainTarget();
48 this._manifestTreeElement = new Resources.AppManifestTreeElement(this); 25 var resourceTreeModel = mainTarget && mainTarget.hasDOMCapability() && SDK.R esourceTreeModel.fromTarget(mainTarget);
49 this._applicationTreeElement.appendChild(this._manifestTreeElement); 26 var mainFrame = resourceTreeModel && resourceTreeModel.mainFrame;
50 this.serviceWorkersTreeElement = new Resources.ServiceWorkersTreeElement(thi s); 27 if (mainFrame)
51 this._applicationTreeElement.appendChild(this.serviceWorkersTreeElement); 28 this.populateFrame(mainFrame);
52 var clearStorageTreeElement = new Resources.ClearStorageTreeElement(this);
53 this._applicationTreeElement.appendChild(clearStorageTreeElement);
54
55 var storageTreeElement = this._addSidebarSection(Common.UIString('Storage')) ;
56 this.localStorageListTreeElement =
57 new Resources.StorageCategoryTreeElement(this, Common.UIString('Local St orage'), 'LocalStorage');
58 var localStorageIcon = UI.Icon.create('mediumicon-table', 'resource-tree-ite m');
59 this.localStorageListTreeElement.setLeadingIcons([localStorageIcon]);
60
61 storageTreeElement.appendChild(this.localStorageListTreeElement);
62 this.sessionStorageListTreeElement =
63 new Resources.StorageCategoryTreeElement(this, Common.UIString('Session Storage'), 'SessionStorage');
64 var sessionStorageIcon = UI.Icon.create('mediumicon-table', 'resource-tree-i tem');
65 this.sessionStorageListTreeElement.setLeadingIcons([sessionStorageIcon]);
66
67 storageTreeElement.appendChild(this.sessionStorageListTreeElement);
68 this.indexedDBListTreeElement = new Resources.IndexedDBTreeElement(this);
69 storageTreeElement.appendChild(this.indexedDBListTreeElement);
70 this.databasesListTreeElement =
71 new Resources.StorageCategoryTreeElement(this, Common.UIString('Web SQL' ), 'Databases');
72 var databaseIcon = UI.Icon.create('mediumicon-database', 'resource-tree-item ');
73 this.databasesListTreeElement.setLeadingIcons([databaseIcon]);
74
75 storageTreeElement.appendChild(this.databasesListTreeElement);
76 this.cookieListTreeElement = new Resources.StorageCategoryTreeElement(this, Common.UIString('Cookies'), 'Cookies');
77 var cookieIcon = UI.Icon.create('mediumicon-cookie', 'resource-tree-item');
78 this.cookieListTreeElement.setLeadingIcons([cookieIcon]);
79 storageTreeElement.appendChild(this.cookieListTreeElement);
80
81 var cacheTreeElement = this._addSidebarSection(Common.UIString('Cache'));
82 this.cacheStorageListTreeElement = new Resources.ServiceWorkerCacheTreeEleme nt(this);
83 cacheTreeElement.appendChild(this.cacheStorageListTreeElement);
84 this.applicationCacheListTreeElement =
85 new Resources.StorageCategoryTreeElement(this, Common.UIString('Applicat ion Cache'), 'ApplicationCache');
86 var applicationCacheIcon = UI.Icon.create('mediumicon-table', 'resource-tree -item');
87 this.applicationCacheListTreeElement.setLeadingIcons([applicationCacheIcon]) ;
88
89 cacheTreeElement.appendChild(this.applicationCacheListTreeElement);
90
91 this.resourcesListTreeElement = this._addSidebarSection(Common.UIString('Fra mes'));
92
93 var mainContainer = new UI.VBox();
94 this.storageViews = mainContainer.element.createChild('div', 'vbox flex-auto ');
95 this._storageViewToolbar = new UI.Toolbar('resources-toolbar', mainContainer .element);
96 this.splitWidget().setMainWidget(mainContainer);
97
98 /** @type {!Map.<!Resources.Database, !Object.<string, !Resources.DatabaseTa bleView>>} */
99 this._databaseTableViews = new Map();
100 /** @type {!Map.<!Resources.Database, !Resources.DatabaseQueryView>} */
101 this._databaseQueryViews = new Map();
102 /** @type {!Map.<!Resources.Database, !Resources.DatabaseTreeElement>} */
103 this._databaseTreeElements = new Map();
104 /** @type {!Map.<!Resources.DOMStorage, !Resources.DOMStorageTreeElement>} * /
105 this._domStorageTreeElements = new Map();
106 /** @type {!Object.<string, boolean>} */
107 this._domains = {};
108
109 /** @type {?Resources.DOMStorageItemsView} */
110 this._domStorageView = null;
111 /** @type {?Resources.CookieItemsView} */
112 this._cookieView = null;
113
114 this.panelSidebarElement().addEventListener('mousemove', this._onmousemove.b ind(this), false);
115 this.panelSidebarElement().addEventListener('mouseleave', this._onmouseleave .bind(this), false);
116
117 SDK.targetManager.observeTargets(this);
118 } 29 }
119 30
120 /** 31 /**
121 * @return {!Resources.ResourcesPanel} 32 * @param {!SDK.ResourceTreeFrame} frame
33 * @returns {?SDK.ResourceTreeFrame}
122 */ 34 */
123 static _instance() { 35 static _getParentFrame(frame) {
124 return /** @type {!Resources.ResourcesPanel} */ (self.runtime.sharedInstance (Resources.ResourcesPanel)); 36 var parentFrame = frame.parentFrame;
37 if (parentFrame)
38 return parentFrame;
39 var parentTarget = frame.target().parentTarget();
40 if (!parentTarget)
41 return null;
42 console.assert(parentTarget.hasDOMCapability());
43 return SDK.ResourceTreeModel.fromTarget(parentTarget).mainFrame;
125 } 44 }
126 45
127 /** 46 /**
128 * @param {string} title 47 * @param {!SDK.ResourceTreeFrame} frame
129 * @return {!UI.TreeElement}
130 */ 48 */
131 _addSidebarSection(title) { 49 _frameAdded(frame) {
132 var treeElement = new UI.TreeElement(title, true); 50 var parentFrame = Resources.ResourcesSection._getParentFrame(frame);
133 treeElement.listItemElement.classList.add('storage-group-list-item'); 51 var parentTreeElement = parentFrame ? this._treeElementForFrameId.get(parent Frame.id) : this._treeElement;
134 treeElement.setCollapsible(false); 52 if (!parentTreeElement) {
135 treeElement.selectable = false; 53 console.warn(`No frame to route ${frame.url} to.`);
136 this._sidebarTree.appendChild(treeElement); 54 return;
137 return treeElement; 55 }
56
57 var frameTreeElement = new Resources.FrameTreeElement(this._panel, frame);
58 this._treeElementForFrameId.set(frame.id, frameTreeElement);
59 parentTreeElement.appendChild(frameTreeElement);
138 } 60 }
139 61
140 /** 62 /**
141 * @override 63 * @param {!SDK.ResourceTreeFrame} frame
142 * @param {!SDK.Target} target
143 */ 64 */
144 targetAdded(target) { 65 _frameDetached(frame) {
145 if (this._target) 66 var frameTreeElement = this._treeElementForFrameId.get(frame.id);
146 return;
147 this._target = target;
148 this._databaseModel = Resources.DatabaseModel.fromTarget(target);
149
150 this._databaseModel.on(Resources.DatabaseModel.DatabaseAddedEvent, this._dat abaseAdded, this);
151 this._databaseModel.on(Resources.DatabaseModel.DatabasesRemovedEvent, this._ resetWebSQL, this);
152
153 var resourceTreeModel = SDK.ResourceTreeModel.fromTarget(target);
154 if (!resourceTreeModel)
155 return;
156
157 if (resourceTreeModel.cachedResourcesLoaded())
158 this._initialize();
159
160 resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.CachedResour cesLoaded, this._initialize, this);
161 resourceTreeModel.addEventListener(
162 SDK.ResourceTreeModel.Events.WillLoadCachedResources, this._resetWithFra mes, this);
163 }
164
165 /**
166 * @override
167 * @param {!SDK.Target} target
168 */
169 targetRemoved(target) {
170 if (target !== this._target)
171 return;
172 delete this._target;
173
174 var resourceTreeModel = SDK.ResourceTreeModel.fromTarget(target);
175 if (resourceTreeModel) {
176 resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.CachedR esourcesLoaded, this._initialize, this);
177 resourceTreeModel.removeEventListener(
178 SDK.ResourceTreeModel.Events.WillLoadCachedResources, this._resetWithF rames, this);
179 }
180 this._databaseModel.off(Resources.DatabaseModel.DatabaseAddedEvent, this._da tabaseAdded, this);
181 this._databaseModel.off(Resources.DatabaseModel.DatabasesRemovedEvent, this. _resetWebSQL, this);
182
183 this._resetWithFrames();
184 }
185
186 /**
187 * @override
188 */
189 focus() {
190 this._sidebarTree.focus();
191 }
192
193 _initialize() {
194 this._databaseModel.enable();
195
196 var indexedDBModel = Resources.IndexedDBModel.fromTarget(this._target);
197 if (indexedDBModel)
198 indexedDBModel.enable();
199
200 var cacheStorageModel = SDK.ServiceWorkerCacheModel.fromTarget(this._target) ;
201 if (cacheStorageModel)
202 cacheStorageModel.enable();
203 var resourceTreeModel = SDK.ResourceTreeModel.fromTarget(this._target);
204 if (resourceTreeModel) {
205 this._populateResourceTree(resourceTreeModel);
206 this._populateApplicationCacheTree(resourceTreeModel);
207 }
208 var domStorageModel = Resources.DOMStorageModel.fromTarget(this._target);
209 if (domStorageModel)
210 this._populateDOMStorageTree(domStorageModel);
211 this.indexedDBListTreeElement._initialize();
212 this.cacheStorageListTreeElement._initialize();
213 this._initDefaultSelection();
214 }
215
216 _initDefaultSelection() {
217 var itemURL = this._resourcesLastSelectedItemSetting.get();
218 if (itemURL) {
219 var rootElement = this._sidebarTree.rootElement();
220 for (var treeElement = rootElement.firstChild(); treeElement;
221 treeElement = treeElement.traverseNextTreeElement(false, rootElement, true)) {
222 if (treeElement.itemURL === itemURL) {
223 treeElement.revealAndSelect(true);
224 return;
225 }
226 }
227 }
228 this._manifestTreeElement.select();
229 }
230
231 _resetWithFrames() {
232 this.resourcesListTreeElement.removeChildren();
233 this._treeElementForFrameId = {};
234 this._reset();
235 }
236
237 _resetWebSQL() {
238 if (this.visibleView instanceof Resources.DatabaseQueryView ||
239 this.visibleView instanceof Resources.DatabaseTableView) {
240 this.visibleView.detach();
241 delete this.visibleView;
242 }
243
244 var queryViews = this._databaseQueryViews.valuesArray();
245 for (var i = 0; i < queryViews.length; ++i) {
246 queryViews[i].removeEventListener(
247 Resources.DatabaseQueryView.Events.SchemaUpdated, this._updateDatabase Tables, this);
248 }
249 this._databaseTableViews.clear();
250 this._databaseQueryViews.clear();
251 this._databaseTreeElements.clear();
252 this.databasesListTreeElement.removeChildren();
253 this.databasesListTreeElement.setExpandable(false);
254 }
255
256 _resetDOMStorage() {
257 if (this.visibleView === this._domStorageView) {
258 this.visibleView.detach();
259 delete this.visibleView;
260 }
261
262 this._domStorageTreeElements.clear();
263 this.localStorageListTreeElement.removeChildren();
264 this.sessionStorageListTreeElement.removeChildren();
265 }
266
267 _resetCookies() {
268 if (this.visibleView instanceof Resources.CookieItemsView) {
269 this.visibleView.detach();
270 delete this.visibleView;
271 }
272 this.cookieListTreeElement.removeChildren();
273 }
274
275 _resetCacheStorage() {
276 if (this.visibleView instanceof Resources.ServiceWorkerCacheView) {
277 this.visibleView.detach();
278 delete this.visibleView;
279 }
280 this.cacheStorageListTreeElement.removeChildren();
281 this.cacheStorageListTreeElement.setExpandable(false);
282 }
283
284 _resetAppCache() {
285 for (var frameId of Object.keys(this._applicationCacheFrameElements))
286 this._applicationCacheFrameManifestRemoved({data: frameId});
287 this.applicationCacheListTreeElement.setExpandable(false);
288 }
289
290 _reset() {
291 this._domains = {};
292 this._resetWebSQL();
293 this._resetDOMStorage();
294 this._resetCookies();
295 this._resetCacheStorage();
296 // No need to this._resetAppCache.
297
298 if ((this.visibleView instanceof SourceFrame.ResourceSourceFrame) ||
299 (this.visibleView instanceof SourceFrame.ImageView) || (this.visibleView instanceof SourceFrame.FontView)) {
300 this.visibleView.detach();
301 delete this.visibleView;
302 }
303
304 this._storageViewToolbar.removeToolbarItems();
305
306 if (this._sidebarTree.selectedTreeElement)
307 this._sidebarTree.selectedTreeElement.deselect();
308 }
309
310 /**
311 * @param {!SDK.ResourceTreeModel} resourceTreeModel
312 */
313 _populateResourceTree(resourceTreeModel) {
314 this._treeElementForFrameId = {};
315 resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.FrameAdded, this._frameAdded, this);
316 resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.FrameNavigat ed, this._frameNavigated, this);
317 resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.FrameDetache d, this._frameDetached, this);
318 resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.ResourceAdde d, this._resourceAdded, this);
319
320 /**
321 * @param {!SDK.ResourceTreeFrame} frame
322 * @this {Resources.ResourcesPanel}
323 */
324 function populateFrame(frame) {
325 this._frameAdded({data: frame});
326 for (var i = 0; i < frame.childFrames.length; ++i)
327 populateFrame.call(this, frame.childFrames[i]);
328
329 var resources = frame.resources();
330 for (var i = 0; i < resources.length; ++i)
331 this._resourceAdded({data: resources[i]});
332 }
333 populateFrame.call(this, resourceTreeModel.mainFrame);
334 }
335
336 _frameAdded(event) {
337 var frame = event.data;
338 var parentFrame = frame.parentFrame;
339
340 var parentTreeElement = parentFrame ? this._treeElementForFrameId[parentFram e.id] : this.resourcesListTreeElement;
341 if (!parentTreeElement) {
342 console.warn('No frame to route ' + frame.url + ' to.');
343 return;
344 }
345
346 var frameTreeElement = new Resources.FrameTreeElement(this, frame);
347 this._treeElementForFrameId[frame.id] = frameTreeElement;
348 parentTreeElement.appendChild(frameTreeElement);
349 }
350
351 _frameDetached(event) {
352 var frame = event.data;
353 var frameTreeElement = this._treeElementForFrameId[frame.id];
354 if (!frameTreeElement) 67 if (!frameTreeElement)
355 return; 68 return;
356 69
357 delete this._treeElementForFrameId[frame.id]; 70 this._treeElementForFrameId.remove(frame.id);
358 if (frameTreeElement.parent) 71 if (frameTreeElement.parent)
359 frameTreeElement.parent.removeChild(frameTreeElement); 72 frameTreeElement.parent.removeChild(frameTreeElement);
360 } 73 }
361 74
362 _resourceAdded(event) { 75 /**
363 var resource = event.data; 76 * @param {!SDK.ResourceTreeFrame} frame
364 var frameId = resource.frameId; 77 */
78 _frameNavigated(frame) {
79 if (!Resources.ResourcesSection._getParentFrame(frame))
80 return;
81 var frameTreeElement = this._treeElementForFrameId.get(frame.id);
82 if (frameTreeElement)
83 frameTreeElement.frameNavigated(frame);
84 }
365 85
366 if (resource.statusCode >= 301 && resource.statusCode <= 303) 86 /**
87 * @param {!SDK.Resource} resource
88 */
89 _resourceAdded(resource) {
90 var statusCode = resource['statusCode'];
91 if (statusCode >= 301 && statusCode <= 303)
367 return; 92 return;
368 93
369 var frameTreeElement = this._treeElementForFrameId[frameId]; 94 var frameTreeElement = this._treeElementForFrameId.get(resource.frameId);
370 if (!frameTreeElement) { 95 if (!frameTreeElement) {
371 // This is a frame's main resource, it will be retained 96 // This is a frame's main resource, it will be retained
372 // and re-added by the resource manager; 97 // and re-added by the resource manager;
373 return; 98 return;
374 } 99 }
375 100
376 frameTreeElement.appendResource(resource); 101 frameTreeElement.appendResource(resource);
377 } 102 }
378 103
379 _frameNavigated(event) { 104 reset() {
380 var frame = event.data; 105 this._treeElement.removeChildren();
381 106 this._treeElementForFrameId.clear();
382 if (!frame.parentFrame)
383 this._reset();
384
385 var frameId = frame.id;
386 var frameTreeElement = this._treeElementForFrameId[frameId];
387 if (frameTreeElement)
388 frameTreeElement.frameNavigated(frame);
389
390 var applicationCacheFrameTreeElement = this._applicationCacheFrameElements[f rameId];
391 if (applicationCacheFrameTreeElement)
392 applicationCacheFrameTreeElement.frameNavigated(frame);
393 }
394
395 /**
396 * @param {!Resources.DatabaseModel.DatabaseAddedEvent} event
397 */
398 _databaseAdded(event) {
399 var databaseTreeElement = new Resources.DatabaseTreeElement(this, event.data base);
400 this._databaseTreeElements.set(event.database, databaseTreeElement);
401 this.databasesListTreeElement.appendChild(databaseTreeElement);
402 } 107 }
403 108
404 /** 109 /**
405 * @param {!SDK.ResourceTreeFrame} frame 110 * @param {!SDK.ResourceTreeFrame} frame
406 */ 111 */
407 addCookieDocument(frame) { 112 populateFrame(frame) {
caseq 2017/03/04 01:46:06 _populateFrame(frame)?
eostroukhov 2017/03/04 02:11:40 Done.
408 var parsedURL = frame.url.asParsedURL(); 113 this._frameAdded(frame);
409 if (!parsedURL || (parsedURL.scheme !== 'http' && parsedURL.scheme !== 'http s' && parsedURL.scheme !== 'file')) 114 for (var child of frame.childFrames)
410 return; 115 this.populateFrame(child);
116 for (var resource of frame.resources())
117 this._resourceAdded(resource);
118 }
119 };
411 120
412 var domain = parsedURL.securityOrigin(); 121 Resources.FrameTreeElement = class extends Resources.BaseStorageTreeElement {
413 if (!this._domains[domain]) { 122 /**
414 this._domains[domain] = true; 123 * @param {!Resources.ResourcesPanel} storagePanel
415 var cookieDomainTreeElement = new Resources.CookieTreeElement(this, frame, domain); 124 * @param {!SDK.ResourceTreeFrame} frame
416 this.cookieListTreeElement.appendChild(cookieDomainTreeElement); 125 */
417 } 126 constructor(storagePanel, frame) {
127 super(storagePanel, '', false);
128 this._panel = storagePanel;
129 this._frame = frame;
130 this._frameId = frame.id;
131 this._categoryElements = {};
132 this._treeElementForResource = {};
133 this.frameNavigated(frame);
134
135 var icon = UI.Icon.create('largeicon-navigator-frame', 'navigator-tree-item' );
136 icon.classList.add('navigator-frame-tree-item');
137 this.setLeadingIcons([icon]);
138 }
139
140 frameNavigated(frame) {
141 this.removeChildren();
142 this._frameId = frame.id;
143 this.title = frame.displayName();
144 this._categoryElements = {};
145 this._treeElementForResource = {};
146 }
147
148 get itemURL() {
149 return 'frame://' + encodeURI(this.titleAsText());
418 } 150 }
419 151
420 /** 152 /**
421 * @param {!Common.Event} event 153 * @override
154 * @return {boolean}
422 */ 155 */
423 _domStorageAdded(event) { 156 onselect(selectedByUser) {
424 var domStorage = /** @type {!Resources.DOMStorage} */ (event.data); 157 super.onselect(selectedByUser);
425 this._addDOMStorage(domStorage); 158 this._panel.showCategoryView(this.titleAsText());
159
160 this.listItemElement.classList.remove('hovered');
161 SDK.DOMModel.hideDOMNodeHighlight();
162 return false;
426 } 163 }
427 164
428 /** 165 set hovered(hovered) {
429 * @param {!Resources.DOMStorage} domStorage 166 if (hovered) {
430 */ 167 this.listItemElement.classList.add('hovered');
431 _addDOMStorage(domStorage) { 168 var domModel = SDK.DOMModel.fromTarget(this._frame.target());
432 console.assert(!this._domStorageTreeElements.get(domStorage)); 169 if (domModel)
433 170 domModel.highlightFrame(this._frameId);
434 var domStorageTreeElement = new Resources.DOMStorageTreeElement(this, domSto rage); 171 } else {
435 this._domStorageTreeElements.set(domStorage, domStorageTreeElement); 172 this.listItemElement.classList.remove('hovered');
436 if (domStorage.isLocalStorage) 173 SDK.DOMModel.hideDOMNodeHighlight();
437 this.localStorageListTreeElement.appendChild(domStorageTreeElement);
438 else
439 this.sessionStorageListTreeElement.appendChild(domStorageTreeElement);
440 }
441
442 /**
443 * @param {!Common.Event} event
444 */
445 _domStorageRemoved(event) {
446 var domStorage = /** @type {!Resources.DOMStorage} */ (event.data);
447 this._removeDOMStorage(domStorage);
448 }
449
450 /**
451 * @param {!Resources.DOMStorage} domStorage
452 */
453 _removeDOMStorage(domStorage) {
454 var treeElement = this._domStorageTreeElements.get(domStorage);
455 if (!treeElement)
456 return;
457 var wasSelected = treeElement.selected;
458 var parentListTreeElement = treeElement.parent;
459 parentListTreeElement.removeChild(treeElement);
460 if (wasSelected)
461 parentListTreeElement.select();
462 this._domStorageTreeElements.remove(domStorage);
463 }
464
465 /**
466 * @param {!Resources.Database} database
467 */
468 selectDatabase(database) {
469 if (database) {
470 this._showDatabase(database);
471 this._databaseTreeElements.get(database).select();
472 }
473 }
474
475 /**
476 * @param {!Resources.DOMStorage} domStorage
477 */
478 selectDOMStorage(domStorage) {
479 if (domStorage) {
480 this._showDOMStorage(domStorage);
481 this._domStorageTreeElements.get(domStorage).select();
482 } 174 }
483 } 175 }
484 176
485 /** 177 /**
486 * @param {!SDK.Resource} resource 178 * @param {!SDK.Resource} resource
487 * @param {number=} line
488 * @param {number=} column
489 * @return {boolean}
490 */ 179 */
491 showResource(resource, line, column) { 180 appendResource(resource) {
492 var resourceTreeElement = this._findTreeElementForResource(resource); 181 var resourceType = resource.resourceType();
493 if (resourceTreeElement) 182 var categoryName = resourceType.name();
494 resourceTreeElement.revealAndSelect(true); 183 var categoryElement = resourceType === Common.resourceTypes.Document ? this : this._categoryElements[categoryName];
495 184 if (!categoryElement) {
496 if (typeof line === 'number') { 185 categoryElement =
497 var resourceSourceFrame = this._resourceSourceFrameViewForResource(resourc e); 186 new Resources.StorageCategoryTreeElement(this._panel, resource.resourc eType().category().title, categoryName);
498 if (resourceSourceFrame) 187 this._categoryElements[resourceType.name()] = categoryElement;
499 resourceSourceFrame.revealPosition(line, column, true); 188 this._insertInPresentationOrder(this, categoryElement);
500 } 189 }
501 return true; 190 var resourceTreeElement = new Resources.FrameResourceTreeElement(this._panel , resource);
191 this._insertInPresentationOrder(categoryElement, resourceTreeElement);
192 this._treeElementForResource[resource.url] = resourceTreeElement;
502 } 193 }
503 194
504 _showResourceView(resource) { 195 /**
505 var view = this._resourceViewForResource(resource); 196 * @param {string} url
506 if (!view) { 197 * @return {?SDK.Resource}
507 this.visibleView.detach(); 198 */
508 return; 199 resourceByURL(url) {
200 var treeElement = this._treeElementForResource[url];
201 return treeElement ? treeElement._resource : null;
202 }
203
204 /**
205 * @override
206 */
207 appendChild(treeElement) {
208 this._insertInPresentationOrder(this, treeElement);
209 }
210
211 _insertInPresentationOrder(parentTreeElement, childTreeElement) {
212 // Insert in the alphabetical order, first frames, then resources. Document resource goes last.
213 function typeWeight(treeElement) {
214 if (treeElement instanceof Resources.StorageCategoryTreeElement)
215 return 2;
216 if (treeElement instanceof Resources.FrameTreeElement)
217 return 1;
218 return 3;
509 } 219 }
510 this._innerShowView(view); 220
221 function compare(treeElement1, treeElement2) {
222 var typeWeight1 = typeWeight(treeElement1);
223 var typeWeight2 = typeWeight(treeElement2);
224
225 var result;
226 if (typeWeight1 > typeWeight2)
227 result = 1;
228 else if (typeWeight1 < typeWeight2)
229 result = -1;
230 else
231 result = treeElement1.titleAsText().localeCompare(treeElement2.titleAsTe xt());
232 return result;
233 }
234
235 var childCount = parentTreeElement.childCount();
236 var i;
237 for (i = 0; i < childCount; ++i) {
238 if (compare(childTreeElement, parentTreeElement.childAt(i)) < 0)
239 break;
240 }
241 parentTreeElement.insertChild(childTreeElement, i);
242 }
243 };
244
245 Resources.FrameResourceTreeElement = class extends Resources.BaseStorageTreeElem ent {
246 /**
247 * @param {!Resources.ResourcesPanel} storagePanel
248 * @param {!SDK.Resource} resource
249 */
250 constructor(storagePanel, resource) {
251 super(storagePanel, resource.displayName, false);
252 this._panel = storagePanel;
253 /** @type {!SDK.Resource} */
254 this._resource = resource;
255 /** @type {?SourceFrame.ResourceSourceFrame} */
256 this._sourceFrame = null;
257 this.tooltip = resource.url;
258 this._resource[Resources.FrameResourceTreeElement._symbol] = this;
259
260 var icon = UI.Icon.create('largeicon-navigator-file', 'navigator-tree-item') ;
261 icon.classList.add('navigator-file-tree-item');
262 icon.classList.add('navigator-' + resource.resourceType().name() + '-tree-it em');
263 this.setLeadingIcons([icon]);
264 }
265
266 /**
267 * @param {!SDK.Resource} resource
268 */
269 static forResource(resource) {
270 return resource[Resources.FrameResourceTreeElement._symbol];
511 } 271 }
512 272
513 /** 273 /**
514 * @param {!SDK.Resource} resource 274 * @param {!SDK.Resource} resource
515 * @return {?UI.Widget} 275 * @return {?UI.Widget}
516 */ 276 */
517 _resourceViewForResource(resource) { 277 static resourceViewForResource(resource) {
caseq 2017/03/04 01:46:06 could remain private as well.
eostroukhov 2017/03/04 02:11:40 It is referenced from ResourcesPanel.js.
518 if (resource.hasTextContent()) { 278 if (resource.hasTextContent()) {
519 var treeElement = this._findTreeElementForResource(resource); 279 var treeElement = Resources.FrameResourceTreeElement.forResource(resource) ;
520 if (!treeElement) 280 if (!treeElement)
521 return null; 281 return null;
522 return treeElement.sourceView(); 282 return treeElement._sourceView();
523 } 283 }
524 284
525 switch (resource.resourceType()) { 285 switch (resource.resourceType()) {
526 case Common.resourceTypes.Image: 286 case Common.resourceTypes.Image:
527 return new SourceFrame.ImageView(resource.mimeType, resource); 287 return new SourceFrame.ImageView(resource.mimeType, resource);
528 case Common.resourceTypes.Font: 288 case Common.resourceTypes.Font:
529 return new SourceFrame.FontView(resource.mimeType, resource); 289 return new SourceFrame.FontView(resource.mimeType, resource);
530 default: 290 default:
531 return new UI.EmptyWidget(resource.url); 291 return new UI.EmptyWidget(resource.url);
532 } 292 }
533 } 293 }
534 294
535 /**
536 * @param {!SDK.Resource} resource
537 * @return {?SourceFrame.ResourceSourceFrame}
538 */
539 _resourceSourceFrameViewForResource(resource) {
540 var resourceView = this._resourceViewForResource(resource);
541 if (resourceView && resourceView instanceof SourceFrame.ResourceSourceFrame)
542 return /** @type {!SourceFrame.ResourceSourceFrame} */ (resourceView);
543 return null;
544 }
545
546 /**
547 * @param {!Resources.Database} database
548 * @param {string=} tableName
549 */
550 _showDatabase(database, tableName) {
551 if (!database)
552 return;
553
554 var view;
555 if (tableName) {
556 var tableViews = this._databaseTableViews.get(database);
557 if (!tableViews) {
558 tableViews = /** @type {!Object.<string, !Resources.DatabaseTableView>} */ ({});
559 this._databaseTableViews.set(database, tableViews);
560 }
561 view = tableViews[tableName];
562 if (!view) {
563 view = new Resources.DatabaseTableView(database, tableName);
564 tableViews[tableName] = view;
565 }
566 } else {
567 view = this._databaseQueryViews.get(database);
568 if (!view) {
569 view = new Resources.DatabaseQueryView(database);
570 this._databaseQueryViews.set(database, view);
571 view.addEventListener(Resources.DatabaseQueryView.Events.SchemaUpdated, this._updateDatabaseTables, this);
572 }
573 }
574
575 this._innerShowView(view);
576 }
577
578 /**
579 * @param {!Resources.DOMStorage} domStorage
580 */
581 _showDOMStorage(domStorage) {
582 if (!domStorage)
583 return;
584
585 if (!this._domStorageView)
586 this._domStorageView = new Resources.DOMStorageItemsView(domStorage);
587 else
588 this._domStorageView.setStorage(domStorage);
589 this._innerShowView(this._domStorageView);
590 }
591
592 /**
593 * @param {!Resources.CookieTreeElement} treeElement
594 * @param {string} cookieDomain
595 * @param {!SDK.Target} cookieFrameTarget
596 */
597 showCookies(treeElement, cookieDomain, cookieFrameTarget) {
598 var model = SDK.CookieModel.fromTarget(cookieFrameTarget);
599 if (!this._cookieView)
600 this._cookieView = new Resources.CookieItemsView(treeElement, model, cooki eDomain);
601 else
602 this._cookieView.setCookiesDomain(model, cookieDomain);
603 this._innerShowView(this._cookieView);
604 }
605
606 /**
607 * @param {!SDK.Target} target
608 * @param {string} cookieDomain
609 */
610 _clearCookies(target, cookieDomain) {
611 SDK.CookieModel.fromTarget(target).clear(cookieDomain, () => {
612 if (this._cookieView)
613 this._cookieView.refreshItems();
614 });
615 }
616
617 showApplicationCache(frameId) {
618 if (!this._applicationCacheViews[frameId]) {
619 this._applicationCacheViews[frameId] =
620 new Resources.ApplicationCacheItemsView(this._applicationCacheModel, f rameId);
621 }
622
623 this._innerShowView(this._applicationCacheViews[frameId]);
624 }
625
626 /**
627 * @param {!UI.Widget} view
628 */
629 showFileSystem(view) {
630 this._innerShowView(view);
631 }
632
633 showCategoryView(categoryName) {
634 if (!this._categoryView)
635 this._categoryView = new Resources.StorageCategoryView();
636 this._categoryView.setText(categoryName);
637 this._innerShowView(this._categoryView);
638 }
639
640 _innerShowView(view) {
641 if (this.visibleView === view)
642 return;
643
644 if (this.visibleView)
645 this.visibleView.detach();
646
647 view.show(this.storageViews);
648 this.visibleView = view;
649
650 this._storageViewToolbar.removeToolbarItems();
651 var toolbarItems = (view instanceof UI.SimpleView && view.syncToolbarItems() ) || [];
652 for (var i = 0; i < toolbarItems.length; ++i)
653 this._storageViewToolbar.appendToolbarItem(toolbarItems[i]);
654 this._storageViewToolbar.element.classList.toggle('hidden', !toolbarItems.le ngth);
655 }
656
657 closeVisibleView() {
658 if (!this.visibleView)
659 return;
660 this.visibleView.detach();
661 delete this.visibleView;
662 }
663
664 _updateDatabaseTables(event) {
665 var database = event.data;
666
667 if (!database)
668 return;
669
670 var databasesTreeElement = this._databaseTreeElements.get(database);
671 if (!databasesTreeElement)
672 return;
673
674 databasesTreeElement.invalidateChildren();
675 var tableViews = this._databaseTableViews.get(database);
676
677 if (!tableViews)
678 return;
679
680 var tableNamesHash = {};
681 var self = this;
682 function tableNamesCallback(tableNames) {
683 var tableNamesLength = tableNames.length;
684 for (var i = 0; i < tableNamesLength; ++i)
685 tableNamesHash[tableNames[i]] = true;
686
687 for (var tableName in tableViews) {
688 if (!(tableName in tableNamesHash)) {
689 if (self.visibleView === tableViews[tableName])
690 self.closeVisibleView();
691 delete tableViews[tableName];
692 }
693 }
694 }
695 database.getTableNames(tableNamesCallback);
696 }
697
698 /**
699 * @param {!Resources.DOMStorageModel} domStorageModel
700 */
701 _populateDOMStorageTree(domStorageModel) {
702 domStorageModel.enable();
703 domStorageModel.storages().forEach(this._addDOMStorage.bind(this));
704 domStorageModel.addEventListener(Resources.DOMStorageModel.Events.DOMStorage Added, this._domStorageAdded, this);
705 domStorageModel.addEventListener(Resources.DOMStorageModel.Events.DOMStorage Removed, this._domStorageRemoved, this);
706 }
707
708 /**
709 * @param {!SDK.ResourceTreeModel} resourceTreeModel
710 */
711 _populateApplicationCacheTree(resourceTreeModel) {
712 this._applicationCacheModel = Resources.ApplicationCacheModel.fromTarget(thi s._target);
713
714 this._applicationCacheViews = {};
715 this._applicationCacheFrameElements = {};
716 this._applicationCacheManifestElements = {};
717
718 this._applicationCacheModel.addEventListener(
719 Resources.ApplicationCacheModel.Events.FrameManifestAdded, this._applica tionCacheFrameManifestAdded, this);
720 this._applicationCacheModel.addEventListener(
721 Resources.ApplicationCacheModel.Events.FrameManifestRemoved, this._appli cationCacheFrameManifestRemoved, this);
722 this._applicationCacheModel.addEventListener(
723 Resources.ApplicationCacheModel.Events.FrameManifestsReset, this._resetA ppCache, this);
724
725 this._applicationCacheModel.addEventListener(
726 Resources.ApplicationCacheModel.Events.FrameManifestStatusUpdated,
727 this._applicationCacheFrameManifestStatusChanged, this);
728 this._applicationCacheModel.addEventListener(
729 Resources.ApplicationCacheModel.Events.NetworkStateChanged, this._applic ationCacheNetworkStateChanged, this);
730 }
731
732 _applicationCacheFrameManifestAdded(event) {
733 var frameId = event.data;
734 var manifestURL = this._applicationCacheModel.frameManifestURL(frameId);
735
736 var manifestTreeElement = this._applicationCacheManifestElements[manifestURL ];
737 if (!manifestTreeElement) {
738 manifestTreeElement = new Resources.ApplicationCacheManifestTreeElement(th is, manifestURL);
739 this.applicationCacheListTreeElement.appendChild(manifestTreeElement);
740 this._applicationCacheManifestElements[manifestURL] = manifestTreeElement;
741 }
742
743 var frameTreeElement = new Resources.ApplicationCacheFrameTreeElement(this, frameId, manifestURL);
744 manifestTreeElement.appendChild(frameTreeElement);
745 manifestTreeElement.expand();
746 this._applicationCacheFrameElements[frameId] = frameTreeElement;
747 }
748
749 _applicationCacheFrameManifestRemoved(event) {
750 var frameId = event.data;
751 var frameTreeElement = this._applicationCacheFrameElements[frameId];
752 if (!frameTreeElement)
753 return;
754
755 var manifestURL = frameTreeElement.manifestURL;
756 delete this._applicationCacheFrameElements[frameId];
757 delete this._applicationCacheViews[frameId];
758 frameTreeElement.parent.removeChild(frameTreeElement);
759
760 var manifestTreeElement = this._applicationCacheManifestElements[manifestURL ];
761 if (manifestTreeElement.childCount())
762 return;
763
764 delete this._applicationCacheManifestElements[manifestURL];
765 manifestTreeElement.parent.removeChild(manifestTreeElement);
766 }
767
768 _applicationCacheFrameManifestStatusChanged(event) {
769 var frameId = event.data;
770 var status = this._applicationCacheModel.frameManifestStatus(frameId);
771
772 if (this._applicationCacheViews[frameId])
773 this._applicationCacheViews[frameId].updateStatus(status);
774 }
775
776 _applicationCacheNetworkStateChanged(event) {
777 var isNowOnline = event.data;
778
779 for (var manifestURL in this._applicationCacheViews)
780 this._applicationCacheViews[manifestURL].updateNetworkState(isNowOnline);
781 }
782
783 _findTreeElementForResource(resource) {
784 return resource[Resources.FrameResourceTreeElement._symbol];
785 }
786
787 showView(view) {
788 if (view)
789 this.showResource(view.resource);
790 }
791
792 _onmousemove(event) {
793 var nodeUnderMouse = event.target;
794 if (!nodeUnderMouse)
795 return;
796
797 var listNode = nodeUnderMouse.enclosingNodeOrSelfWithNodeName('li');
798 if (!listNode)
799 return;
800
801 var element = listNode.treeElement;
802 if (this._previousHoveredElement === element)
803 return;
804
805 if (this._previousHoveredElement) {
806 this._previousHoveredElement.hovered = false;
807 delete this._previousHoveredElement;
808 }
809
810 if (element instanceof Resources.FrameTreeElement) {
811 this._previousHoveredElement = element;
812 element.hovered = true;
813 }
814 }
815
816 _onmouseleave(event) {
817 if (this._previousHoveredElement) {
818 this._previousHoveredElement.hovered = false;
819 delete this._previousHoveredElement;
820 }
821 }
822 };
823
824 /**
825 * @implements {Common.Revealer}
826 * @unrestricted
827 */
828 Resources.ResourcesPanel.ResourceRevealer = class {
829 /**
830 * @override
831 * @param {!Object} resource
832 * @return {!Promise}
833 */
834 reveal(resource) {
835 if (!(resource instanceof SDK.Resource))
836 return Promise.reject(new Error('Internal error: not a resource'));
837 var panel = Resources.ResourcesPanel._instance();
838 return UI.viewManager.showView('resources').then(panel.showResource.bind(pan el, resource));
839 }
840 };
841
842 /**
843 * @unrestricted
844 */
845 Resources.BaseStorageTreeElement = class extends UI.TreeElement {
846 /**
847 * @param {!Resources.ResourcesPanel} storagePanel
848 * @param {string} title
849 * @param {boolean} expandable
850 */
851 constructor(storagePanel, title, expandable) {
852 super(title, expandable);
853 this._storagePanel = storagePanel;
854 }
855
856 /**
857 * @override
858 * @return {boolean}
859 */
860 onselect(selectedByUser) {
861 if (!selectedByUser)
862 return false;
863 var itemURL = this.itemURL;
864 if (itemURL)
865 this._storagePanel._resourcesLastSelectedItemSetting.set(itemURL);
866 return false;
867 }
868 };
869
870 /**
871 * @unrestricted
872 */
873 Resources.StorageCategoryTreeElement = class extends Resources.BaseStorageTreeEl ement {
874 /**
875 * @param {!Resources.ResourcesPanel} storagePanel
876 * @param {string} categoryName
877 * @param {string} settingsKey
878 */
879 constructor(storagePanel, categoryName, settingsKey) {
880 super(storagePanel, categoryName, false);
881 this._expandedSetting =
882 Common.settings.createSetting('resources' + settingsKey + 'Expanded', se ttingsKey === 'Frames');
883 this._categoryName = categoryName;
884 }
885
886 /**
887 * @return {!SDK.Target}
888 */
889 target() {
890 return this._storagePanel._target;
891 }
892
893 get itemURL() {
894 return 'category://' + this._categoryName;
895 }
896
897 /**
898 * @override
899 * @return {boolean}
900 */
901 onselect(selectedByUser) {
902 super.onselect(selectedByUser);
903 this._storagePanel.showCategoryView(this._categoryName);
904 return false;
905 }
906
907 /**
908 * @override
909 */
910 onattach() {
911 super.onattach();
912 if (this._expandedSetting.get())
913 this.expand();
914 }
915
916 /**
917 * @override
918 */
919 onexpand() {
920 this._expandedSetting.set(true);
921 }
922
923 /**
924 * @override
925 */
926 oncollapse() {
927 this._expandedSetting.set(false);
928 }
929 };
930
931 /**
932 * @unrestricted
933 */
934 Resources.FrameTreeElement = class extends Resources.BaseStorageTreeElement {
935 /**
936 * @param {!Resources.ResourcesPanel} storagePanel
937 * @param {!SDK.ResourceTreeFrame} frame
938 */
939 constructor(storagePanel, frame) {
940 super(storagePanel, '', false);
941 this._frame = frame;
942 this.frameNavigated(frame);
943
944 var icon = UI.Icon.create('largeicon-navigator-frame', 'navigator-tree-item' );
945 icon.classList.add('navigator-frame-tree-item');
946 this.setLeadingIcons([icon]);
947 }
948
949 frameNavigated(frame) {
950 this.removeChildren();
951 this._frameId = frame.id;
952 this.title = frame.displayName();
953 this._categoryElements = {};
954 this._treeElementForResource = {};
955
956 this._storagePanel.addCookieDocument(frame);
957 }
958
959 get itemURL() {
960 return 'frame://' + encodeURI(this.titleAsText());
961 }
962
963 /**
964 * @override
965 * @return {boolean}
966 */
967 onselect(selectedByUser) {
968 super.onselect(selectedByUser);
969 this._storagePanel.showCategoryView(this.titleAsText());
970
971 this.listItemElement.classList.remove('hovered');
972 SDK.DOMModel.hideDOMNodeHighlight();
973 return false;
974 }
975
976 set hovered(hovered) {
977 if (hovered) {
978 this.listItemElement.classList.add('hovered');
979 var domModel = SDK.DOMModel.fromTarget(this._frame.target());
980 if (domModel)
981 domModel.highlightFrame(this._frameId);
982 } else {
983 this.listItemElement.classList.remove('hovered');
984 SDK.DOMModel.hideDOMNodeHighlight();
985 }
986 }
987
988 /**
989 * @param {!SDK.Resource} resource
990 */
991 appendResource(resource) {
992 var resourceType = resource.resourceType();
993 var categoryName = resourceType.name();
994 var categoryElement = resourceType === Common.resourceTypes.Document ? this : this._categoryElements[categoryName];
995 if (!categoryElement) {
996 categoryElement = new Resources.StorageCategoryTreeElement(
997 this._storagePanel, resource.resourceType().category().title, category Name);
998 this._categoryElements[resourceType.name()] = categoryElement;
999 this._insertInPresentationOrder(this, categoryElement);
1000 }
1001 var resourceTreeElement = new Resources.FrameResourceTreeElement(this._stora gePanel, resource);
1002 this._insertInPresentationOrder(categoryElement, resourceTreeElement);
1003 this._treeElementForResource[resource.url] = resourceTreeElement;
1004 }
1005
1006 /**
1007 * @param {string} url
1008 * @return {?SDK.Resource}
1009 */
1010 resourceByURL(url) {
1011 var treeElement = this._treeElementForResource[url];
1012 return treeElement ? treeElement._resource : null;
1013 }
1014
1015 /**
1016 * @override
1017 */
1018 appendChild(treeElement) {
1019 this._insertInPresentationOrder(this, treeElement);
1020 }
1021
1022 _insertInPresentationOrder(parentTreeElement, childTreeElement) {
1023 // Insert in the alphabetical order, first frames, then resources. Document resource goes last.
1024 function typeWeight(treeElement) {
1025 if (treeElement instanceof Resources.StorageCategoryTreeElement)
1026 return 2;
1027 if (treeElement instanceof Resources.FrameTreeElement)
1028 return 1;
1029 return 3;
1030 }
1031
1032 function compare(treeElement1, treeElement2) {
1033 var typeWeight1 = typeWeight(treeElement1);
1034 var typeWeight2 = typeWeight(treeElement2);
1035
1036 var result;
1037 if (typeWeight1 > typeWeight2)
1038 result = 1;
1039 else if (typeWeight1 < typeWeight2)
1040 result = -1;
1041 else
1042 result = treeElement1.titleAsText().localeCompare(treeElement2.titleAsTe xt());
1043 return result;
1044 }
1045
1046 var childCount = parentTreeElement.childCount();
1047 var i;
1048 for (i = 0; i < childCount; ++i) {
1049 if (compare(childTreeElement, parentTreeElement.childAt(i)) < 0)
1050 break;
1051 }
1052 parentTreeElement.insertChild(childTreeElement, i);
1053 }
1054 };
1055
1056 /**
1057 * @unrestricted
1058 */
1059 Resources.FrameResourceTreeElement = class extends Resources.BaseStorageTreeElem ent {
1060 /**
1061 * @param {!Resources.ResourcesPanel} storagePanel
1062 * @param {!SDK.Resource} resource
1063 */
1064 constructor(storagePanel, resource) {
1065 super(storagePanel, resource.displayName, false);
1066 /** @type {!SDK.Resource} */
1067 this._resource = resource;
1068 this.tooltip = resource.url;
1069 this._resource[Resources.FrameResourceTreeElement._symbol] = this;
1070
1071 var icon = UI.Icon.create('largeicon-navigator-file', 'navigator-tree-item') ;
1072 icon.classList.add('navigator-file-tree-item');
1073 icon.classList.add('navigator-' + resource.resourceType().name() + '-tree-it em');
1074 this.setLeadingIcons([icon]);
1075 }
1076
1077 get itemURL() { 295 get itemURL() {
1078 return this._resource.url; 296 return this._resource.url;
1079 } 297 }
1080 298
1081 /** 299 /**
1082 * @override 300 * @override
1083 * @return {boolean} 301 * @return {boolean}
1084 */ 302 */
1085 onselect(selectedByUser) { 303 onselect(selectedByUser) {
1086 super.onselect(selectedByUser); 304 super.onselect(selectedByUser);
1087 this._storagePanel._showResourceView(this._resource); 305 this.showView(Resources.FrameResourceTreeElement.resourceViewForResource(thi s._resource));
1088 return false; 306 return false;
1089 } 307 }
1090 308
1091 /** 309 /**
1092 * @override 310 * @override
1093 * @return {boolean} 311 * @return {boolean}
1094 */ 312 */
1095 ondblclick(event) { 313 ondblclick(event) {
1096 InspectorFrontendHost.openInNewTab(this._resource.url); 314 InspectorFrontendHost.openInNewTab(this._resource.url);
1097 return false; 315 return false;
(...skipping 21 matching lines...) Expand all
1119 337
1120 _handleContextMenuEvent(event) { 338 _handleContextMenuEvent(event) {
1121 var contextMenu = new UI.ContextMenu(event); 339 var contextMenu = new UI.ContextMenu(event);
1122 contextMenu.appendApplicableItems(this._resource); 340 contextMenu.appendApplicableItems(this._resource);
1123 contextMenu.show(); 341 contextMenu.show();
1124 } 342 }
1125 343
1126 /** 344 /**
1127 * @return {!SourceFrame.ResourceSourceFrame} 345 * @return {!SourceFrame.ResourceSourceFrame}
1128 */ 346 */
1129 sourceView() { 347 _sourceView() {
1130 if (!this._sourceView) { 348 if (!this._sourceFrame) {
1131 var sourceFrame = new SourceFrame.ResourceSourceFrame(this._resource); 349 this._sourceFrame = new SourceFrame.ResourceSourceFrame(this._resource);
1132 sourceFrame.setHighlighterType(this._resource.canonicalMimeType()); 350 this._sourceFrame.setHighlighterType(this._resource.canonicalMimeType());
1133 this._sourceView = sourceFrame;
1134 } 351 }
1135 return this._sourceView; 352 return this._sourceFrame;
1136 } 353 }
1137 }; 354 };
1138 355
1139 Resources.FrameResourceTreeElement._symbol = Symbol('treeElement'); 356 Resources.FrameResourceTreeElement._symbol = Symbol('treeElement');
1140
1141 /**
1142 * @unrestricted
1143 */
1144 Resources.DatabaseTreeElement = class extends Resources.BaseStorageTreeElement {
1145 /**
1146 * @param {!Resources.ResourcesPanel} storagePanel
1147 * @param {!Resources.Database} database
1148 */
1149 constructor(storagePanel, database) {
1150 super(storagePanel, database.name, true);
1151 this._database = database;
1152
1153 var icon = UI.Icon.create('mediumicon-database', 'resource-tree-item');
1154 this.setLeadingIcons([icon]);
1155 }
1156
1157 get itemURL() {
1158 return 'database://' + encodeURI(this._database.name);
1159 }
1160
1161 /**
1162 * @override
1163 * @return {boolean}
1164 */
1165 onselect(selectedByUser) {
1166 super.onselect(selectedByUser);
1167 this._storagePanel._showDatabase(this._database);
1168 return false;
1169 }
1170
1171 /**
1172 * @override
1173 */
1174 onexpand() {
1175 this._updateChildren();
1176 }
1177
1178 _updateChildren() {
1179 this.removeChildren();
1180
1181 /**
1182 * @param {!Array.<string>} tableNames
1183 * @this {Resources.DatabaseTreeElement}
1184 */
1185 function tableNamesCallback(tableNames) {
1186 var tableNamesLength = tableNames.length;
1187 for (var i = 0; i < tableNamesLength; ++i)
1188 this.appendChild(new Resources.DatabaseTableTreeElement(this._storagePan el, this._database, tableNames[i]));
1189 }
1190 this._database.getTableNames(tableNamesCallback.bind(this));
1191 }
1192 };
1193
1194 /**
1195 * @unrestricted
1196 */
1197 Resources.DatabaseTableTreeElement = class extends Resources.BaseStorageTreeElem ent {
1198 constructor(storagePanel, database, tableName) {
1199 super(storagePanel, tableName, false);
1200 this._database = database;
1201 this._tableName = tableName;
1202 var icon = UI.Icon.create('mediumicon-table', 'resource-tree-item');
1203 this.setLeadingIcons([icon]);
1204 }
1205
1206 get itemURL() {
1207 return 'database://' + encodeURI(this._database.name) + '/' + encodeURI(this ._tableName);
1208 }
1209
1210 /**
1211 * @override
1212 * @return {boolean}
1213 */
1214 onselect(selectedByUser) {
1215 super.onselect(selectedByUser);
1216 this._storagePanel._showDatabase(this._database, this._tableName);
1217 return false;
1218 }
1219 };
1220
1221 /**
1222 * @unrestricted
1223 */
1224 Resources.ServiceWorkerCacheTreeElement = class extends Resources.StorageCategor yTreeElement {
1225 /**
1226 * @param {!Resources.ResourcesPanel} storagePanel
1227 */
1228 constructor(storagePanel) {
1229 super(storagePanel, Common.UIString('Cache Storage'), 'CacheStorage');
1230 var icon = UI.Icon.create('mediumicon-database', 'resource-tree-item');
1231 this.setLeadingIcons([icon]);
1232 }
1233
1234 _initialize() {
1235 /** @type {!Array.<!Resources.SWCacheTreeElement>} */
1236 this._swCacheTreeElements = [];
1237 var target = this._storagePanel._target;
1238 var model = target && SDK.ServiceWorkerCacheModel.fromTarget(target);
1239 if (model) {
1240 for (var cache of model.caches())
1241 this._addCache(model, cache);
1242 }
1243 SDK.targetManager.addModelListener(
1244 SDK.ServiceWorkerCacheModel, SDK.ServiceWorkerCacheModel.Events.CacheAdd ed, this._cacheAdded, this);
1245 SDK.targetManager.addModelListener(
1246 SDK.ServiceWorkerCacheModel, SDK.ServiceWorkerCacheModel.Events.CacheRem oved, this._cacheRemoved, this);
1247 }
1248
1249 /**
1250 * @override
1251 */
1252 onattach() {
1253 super.onattach();
1254 this.listItemElement.addEventListener('contextmenu', this._handleContextMenu Event.bind(this), true);
1255 }
1256
1257 _handleContextMenuEvent(event) {
1258 var contextMenu = new UI.ContextMenu(event);
1259 contextMenu.appendItem(Common.UIString('Refresh Caches'), this._refreshCache s.bind(this));
1260 contextMenu.show();
1261 }
1262
1263 _refreshCaches() {
1264 var target = this._storagePanel._target;
1265 if (target) {
1266 var model = SDK.ServiceWorkerCacheModel.fromTarget(target);
1267 if (!model)
1268 return;
1269 model.refreshCacheNames();
1270 }
1271 }
1272
1273 /**
1274 * @param {!Common.Event} event
1275 */
1276 _cacheAdded(event) {
1277 var cache = /** @type {!SDK.ServiceWorkerCacheModel.Cache} */ (event.data.ca che);
1278 var model = /** @type {!SDK.ServiceWorkerCacheModel} */ (event.data.model);
1279 this._addCache(model, cache);
1280 }
1281
1282 /**
1283 * @param {!SDK.ServiceWorkerCacheModel} model
1284 * @param {!SDK.ServiceWorkerCacheModel.Cache} cache
1285 */
1286 _addCache(model, cache) {
1287 var swCacheTreeElement = new Resources.SWCacheTreeElement(this._storagePanel , model, cache);
1288 this._swCacheTreeElements.push(swCacheTreeElement);
1289 this.appendChild(swCacheTreeElement);
1290 }
1291
1292 /**
1293 * @param {!Common.Event} event
1294 */
1295 _cacheRemoved(event) {
1296 var cache = /** @type {!SDK.ServiceWorkerCacheModel.Cache} */ (event.data.ca che);
1297 var model = /** @type {!SDK.ServiceWorkerCacheModel} */ (event.data.model);
1298
1299 var swCacheTreeElement = this._cacheTreeElement(model, cache);
1300 if (!swCacheTreeElement)
1301 return;
1302
1303 swCacheTreeElement.clear();
1304 this.removeChild(swCacheTreeElement);
1305 this._swCacheTreeElements.remove(swCacheTreeElement);
1306 }
1307
1308 /**
1309 * @param {!SDK.ServiceWorkerCacheModel} model
1310 * @param {!SDK.ServiceWorkerCacheModel.Cache} cache
1311 * @return {?Resources.SWCacheTreeElement}
1312 */
1313 _cacheTreeElement(model, cache) {
1314 var index = -1;
1315 for (var i = 0; i < this._swCacheTreeElements.length; ++i) {
1316 if (this._swCacheTreeElements[i]._cache.equals(cache) && this._swCacheTree Elements[i]._model === model) {
1317 index = i;
1318 break;
1319 }
1320 }
1321 if (index !== -1)
1322 return this._swCacheTreeElements[i];
1323 return null;
1324 }
1325 };
1326
1327 /**
1328 * @unrestricted
1329 */
1330 Resources.SWCacheTreeElement = class extends Resources.BaseStorageTreeElement {
1331 /**
1332 * @param {!Resources.ResourcesPanel} storagePanel
1333 * @param {!SDK.ServiceWorkerCacheModel} model
1334 * @param {!SDK.ServiceWorkerCacheModel.Cache} cache
1335 */
1336 constructor(storagePanel, model, cache) {
1337 super(storagePanel, cache.cacheName + ' - ' + cache.securityOrigin, false);
1338 this._model = model;
1339 this._cache = cache;
1340 var icon = UI.Icon.create('mediumicon-table', 'resource-tree-item');
1341 this.setLeadingIcons([icon]);
1342 }
1343
1344 get itemURL() {
1345 // I don't think this will work at all.
1346 return 'cache://' + this._cache.cacheId;
1347 }
1348
1349 /**
1350 * @override
1351 */
1352 onattach() {
1353 super.onattach();
1354 this.listItemElement.addEventListener('contextmenu', this._handleContextMenu Event.bind(this), true);
1355 }
1356
1357 _handleContextMenuEvent(event) {
1358 var contextMenu = new UI.ContextMenu(event);
1359 contextMenu.appendItem(Common.UIString('Delete'), this._clearCache.bind(this ));
1360 contextMenu.show();
1361 }
1362
1363 _clearCache() {
1364 this._model.deleteCache(this._cache);
1365 }
1366
1367 /**
1368 * @param {!SDK.ServiceWorkerCacheModel.Cache} cache
1369 */
1370 update(cache) {
1371 this._cache = cache;
1372 if (this._view)
1373 this._view.update(cache);
1374 }
1375
1376 /**
1377 * @override
1378 * @return {boolean}
1379 */
1380 onselect(selectedByUser) {
1381 super.onselect(selectedByUser);
1382 if (!this._view)
1383 this._view = new Resources.ServiceWorkerCacheView(this._model, this._cache );
1384
1385 this._storagePanel._innerShowView(this._view);
1386 return false;
1387 }
1388
1389 clear() {
1390 if (this._view)
1391 this._view.clear();
1392 }
1393 };
1394
1395 /**
1396 * @unrestricted
1397 */
1398 Resources.ServiceWorkersTreeElement = class extends Resources.BaseStorageTreeEle ment {
1399 /**
1400 * @param {!Resources.ResourcesPanel} storagePanel
1401 */
1402 constructor(storagePanel) {
1403 super(storagePanel, Common.UIString('Service Workers'), false);
1404 var icon = UI.Icon.create('mediumicon-service-worker', 'resource-tree-item') ;
1405 this.setLeadingIcons([icon]);
1406 }
1407
1408 /**
1409 * @return {string}
1410 */
1411 get itemURL() {
1412 return 'service-workers://';
1413 }
1414
1415 /**
1416 * @override
1417 * @return {boolean}
1418 */
1419 onselect(selectedByUser) {
1420 super.onselect(selectedByUser);
1421 if (!this._view)
1422 this._view = new Resources.ServiceWorkersView();
1423 this._storagePanel._innerShowView(this._view);
1424 return false;
1425 }
1426 };
1427
1428 /**
1429 * @unrestricted
1430 */
1431 Resources.AppManifestTreeElement = class extends Resources.BaseStorageTreeElemen t {
1432 /**
1433 * @param {!Resources.ResourcesPanel} storagePanel
1434 */
1435 constructor(storagePanel) {
1436 super(storagePanel, Common.UIString('Manifest'), false);
1437 var icon = UI.Icon.create('mediumicon-manifest', 'resource-tree-item');
1438 this.setLeadingIcons([icon]);
1439 }
1440
1441 /**
1442 * @return {string}
1443 */
1444 get itemURL() {
1445 return 'manifest://';
1446 }
1447
1448 /**
1449 * @override
1450 * @return {boolean}
1451 */
1452 onselect(selectedByUser) {
1453 super.onselect(selectedByUser);
1454 if (!this._view)
1455 this._view = new Resources.AppManifestView();
1456 this._storagePanel._innerShowView(this._view);
1457 return false;
1458 }
1459 };
1460
1461 /**
1462 * @unrestricted
1463 */
1464 Resources.ClearStorageTreeElement = class extends Resources.BaseStorageTreeEleme nt {
1465 /**
1466 * @param {!Resources.ResourcesPanel} storagePanel
1467 */
1468 constructor(storagePanel) {
1469 super(storagePanel, Common.UIString('Clear storage'), false);
1470 var icon = UI.Icon.create('mediumicon-clear-storage', 'resource-tree-item');
1471 this.setLeadingIcons([icon]);
1472 }
1473
1474 /**
1475 * @return {string}
1476 */
1477 get itemURL() {
1478 return 'clear-storage://';
1479 }
1480
1481 /**
1482 * @override
1483 * @return {boolean}
1484 */
1485 onselect(selectedByUser) {
1486 super.onselect(selectedByUser);
1487 if (!this._view)
1488 this._view = new Resources.ClearStorageView(this._storagePanel);
1489 this._storagePanel._innerShowView(this._view);
1490 return false;
1491 }
1492 };
1493
1494 /**
1495 * @unrestricted
1496 */
1497 Resources.IndexedDBTreeElement = class extends Resources.StorageCategoryTreeElem ent {
1498 /**
1499 * @param {!Resources.ResourcesPanel} storagePanel
1500 */
1501 constructor(storagePanel) {
1502 super(storagePanel, Common.UIString('IndexedDB'), 'IndexedDB');
1503 var icon = UI.Icon.create('mediumicon-database', 'resource-tree-item');
1504 this.setLeadingIcons([icon]);
1505 }
1506
1507 _initialize() {
1508 SDK.targetManager.addModelListener(
1509 Resources.IndexedDBModel, Resources.IndexedDBModel.Events.DatabaseAdded, this._indexedDBAdded, this);
1510 SDK.targetManager.addModelListener(
1511 Resources.IndexedDBModel, Resources.IndexedDBModel.Events.DatabaseRemove d, this._indexedDBRemoved, this);
1512 SDK.targetManager.addModelListener(
1513 Resources.IndexedDBModel, Resources.IndexedDBModel.Events.DatabaseLoaded , this._indexedDBLoaded, this);
1514 /** @type {!Array.<!Resources.IDBDatabaseTreeElement>} */
1515 this._idbDatabaseTreeElements = [];
1516
1517 var targets = SDK.targetManager.targets(SDK.Target.Capability.Browser);
1518 for (var i = 0; i < targets.length; ++i) {
1519 var indexedDBModel = Resources.IndexedDBModel.fromTarget(targets[i]);
1520 var databases = indexedDBModel.databases();
1521 for (var j = 0; j < databases.length; ++j)
1522 this._addIndexedDB(indexedDBModel, databases[j]);
1523 }
1524 }
1525
1526 /**
1527 * @override
1528 */
1529 onattach() {
1530 super.onattach();
1531 this.listItemElement.addEventListener('contextmenu', this._handleContextMenu Event.bind(this), true);
1532 }
1533
1534 _handleContextMenuEvent(event) {
1535 var contextMenu = new UI.ContextMenu(event);
1536 contextMenu.appendItem(Common.UIString('Refresh IndexedDB'), this.refreshInd exedDB.bind(this));
1537 contextMenu.show();
1538 }
1539
1540 refreshIndexedDB() {
1541 var targets = SDK.targetManager.targets(SDK.Target.Capability.Browser);
1542 for (var i = 0; i < targets.length; ++i)
1543 Resources.IndexedDBModel.fromTarget(targets[i]).refreshDatabaseNames();
1544 }
1545
1546 /**
1547 * @param {!Common.Event} event
1548 */
1549 _indexedDBAdded(event) {
1550 var databaseId = /** @type {!Resources.IndexedDBModel.DatabaseId} */ (event. data.databaseId);
1551 var model = /** @type {!Resources.IndexedDBModel} */ (event.data.model);
1552 this._addIndexedDB(model, databaseId);
1553 }
1554
1555 /**
1556 * @param {!Resources.IndexedDBModel} model
1557 * @param {!Resources.IndexedDBModel.DatabaseId} databaseId
1558 */
1559 _addIndexedDB(model, databaseId) {
1560 var idbDatabaseTreeElement = new Resources.IDBDatabaseTreeElement(this._stor agePanel, model, databaseId);
1561 this._idbDatabaseTreeElements.push(idbDatabaseTreeElement);
1562 this.appendChild(idbDatabaseTreeElement);
1563 model.refreshDatabase(databaseId);
1564 }
1565
1566 /**
1567 * @param {!Common.Event} event
1568 */
1569 _indexedDBRemoved(event) {
1570 var databaseId = /** @type {!Resources.IndexedDBModel.DatabaseId} */ (event. data.databaseId);
1571 var model = /** @type {!Resources.IndexedDBModel} */ (event.data.model);
1572
1573 var idbDatabaseTreeElement = this._idbDatabaseTreeElement(model, databaseId) ;
1574 if (!idbDatabaseTreeElement)
1575 return;
1576
1577 idbDatabaseTreeElement.clear();
1578 this.removeChild(idbDatabaseTreeElement);
1579 this._idbDatabaseTreeElements.remove(idbDatabaseTreeElement);
1580 }
1581
1582 /**
1583 * @param {!Common.Event} event
1584 */
1585 _indexedDBLoaded(event) {
1586 var database = /** @type {!Resources.IndexedDBModel.Database} */ (event.data .database);
1587 var model = /** @type {!Resources.IndexedDBModel} */ (event.data.model);
1588
1589 var idbDatabaseTreeElement = this._idbDatabaseTreeElement(model, database.da tabaseId);
1590 if (!idbDatabaseTreeElement)
1591 return;
1592
1593 idbDatabaseTreeElement.update(database);
1594 }
1595
1596 /**
1597 * @param {!Resources.IndexedDBModel.DatabaseId} databaseId
1598 * @param {!Resources.IndexedDBModel} model
1599 * @return {?Resources.IDBDatabaseTreeElement}
1600 */
1601 _idbDatabaseTreeElement(model, databaseId) {
1602 var index = -1;
1603 for (var i = 0; i < this._idbDatabaseTreeElements.length; ++i) {
1604 if (this._idbDatabaseTreeElements[i]._databaseId.equals(databaseId) &&
1605 this._idbDatabaseTreeElements[i]._model === model) {
1606 index = i;
1607 break;
1608 }
1609 }
1610 if (index !== -1)
1611 return this._idbDatabaseTreeElements[i];
1612 return null;
1613 }
1614 };
1615
1616 /**
1617 * @unrestricted
1618 */
1619 Resources.IDBDatabaseTreeElement = class extends Resources.BaseStorageTreeElemen t {
1620 /**
1621 * @param {!Resources.ResourcesPanel} storagePanel
1622 * @param {!Resources.IndexedDBModel} model
1623 * @param {!Resources.IndexedDBModel.DatabaseId} databaseId
1624 */
1625 constructor(storagePanel, model, databaseId) {
1626 super(storagePanel, databaseId.name + ' - ' + databaseId.securityOrigin, fal se);
1627 this._model = model;
1628 this._databaseId = databaseId;
1629 this._idbObjectStoreTreeElements = {};
1630 var icon = UI.Icon.create('mediumicon-database', 'resource-tree-item');
1631 this.setLeadingIcons([icon]);
1632 }
1633
1634 get itemURL() {
1635 return 'indexedDB://' + this._databaseId.securityOrigin + '/' + this._databa seId.name;
1636 }
1637
1638 /**
1639 * @override
1640 */
1641 onattach() {
1642 super.onattach();
1643 this.listItemElement.addEventListener('contextmenu', this._handleContextMenu Event.bind(this), true);
1644 }
1645
1646 _handleContextMenuEvent(event) {
1647 var contextMenu = new UI.ContextMenu(event);
1648 contextMenu.appendItem(Common.UIString('Refresh IndexedDB'), this._refreshIn dexedDB.bind(this));
1649 contextMenu.show();
1650 }
1651
1652 _refreshIndexedDB() {
1653 this._model.refreshDatabaseNames();
1654 }
1655
1656 /**
1657 * @param {!Resources.IndexedDBModel.Database} database
1658 */
1659 update(database) {
1660 this._database = database;
1661 var objectStoreNames = {};
1662 for (var objectStoreName in this._database.objectStores) {
1663 var objectStore = this._database.objectStores[objectStoreName];
1664 objectStoreNames[objectStore.name] = true;
1665 if (!this._idbObjectStoreTreeElements[objectStore.name]) {
1666 var idbObjectStoreTreeElement =
1667 new Resources.IDBObjectStoreTreeElement(this._storagePanel, this._mo del, this._databaseId, objectStore);
1668 this._idbObjectStoreTreeElements[objectStore.name] = idbObjectStoreTreeE lement;
1669 this.appendChild(idbObjectStoreTreeElement);
1670 }
1671 this._idbObjectStoreTreeElements[objectStore.name].update(objectStore);
1672 }
1673 for (var objectStoreName in this._idbObjectStoreTreeElements) {
1674 if (!objectStoreNames[objectStoreName])
1675 this._objectStoreRemoved(objectStoreName);
1676 }
1677
1678 if (this._view)
1679 this._view.update(database);
1680
1681 this._updateTooltip();
1682 }
1683
1684 _updateTooltip() {
1685 this.tooltip = Common.UIString('Version') + ': ' + this._database.version;
1686 }
1687
1688 /**
1689 * @override
1690 * @return {boolean}
1691 */
1692 onselect(selectedByUser) {
1693 super.onselect(selectedByUser);
1694 if (!this._view)
1695 this._view = new Resources.IDBDatabaseView(this._model, this._database);
1696
1697 this._storagePanel._innerShowView(this._view);
1698 return false;
1699 }
1700
1701 /**
1702 * @param {string} objectStoreName
1703 */
1704 _objectStoreRemoved(objectStoreName) {
1705 var objectStoreTreeElement = this._idbObjectStoreTreeElements[objectStoreNam e];
1706 objectStoreTreeElement.clear();
1707 this.removeChild(objectStoreTreeElement);
1708 delete this._idbObjectStoreTreeElements[objectStoreName];
1709 }
1710
1711 clear() {
1712 for (var objectStoreName in this._idbObjectStoreTreeElements)
1713 this._objectStoreRemoved(objectStoreName);
1714 }
1715 };
1716
1717 /**
1718 * @unrestricted
1719 */
1720 Resources.IDBObjectStoreTreeElement = class extends Resources.BaseStorageTreeEle ment {
1721 /**
1722 * @param {!Resources.ResourcesPanel} storagePanel
1723 * @param {!Resources.IndexedDBModel} model
1724 * @param {!Resources.IndexedDBModel.DatabaseId} databaseId
1725 * @param {!Resources.IndexedDBModel.ObjectStore} objectStore
1726 */
1727 constructor(storagePanel, model, databaseId, objectStore) {
1728 super(storagePanel, objectStore.name, false);
1729 this._model = model;
1730 this._databaseId = databaseId;
1731 this._idbIndexTreeElements = {};
1732 var icon = UI.Icon.create('mediumicon-table', 'resource-tree-item');
1733 this.setLeadingIcons([icon]);
1734 }
1735
1736 get itemURL() {
1737 return 'indexedDB://' + this._databaseId.securityOrigin + '/' + this._databa seId.name + '/' +
1738 this._objectStore.name;
1739 }
1740
1741 /**
1742 * @override
1743 */
1744 onattach() {
1745 super.onattach();
1746 this.listItemElement.addEventListener('contextmenu', this._handleContextMenu Event.bind(this), true);
1747 }
1748
1749 _handleContextMenuEvent(event) {
1750 var contextMenu = new UI.ContextMenu(event);
1751 contextMenu.appendItem(Common.UIString('Clear'), this._clearObjectStore.bind (this));
1752 contextMenu.show();
1753 }
1754
1755 _clearObjectStore() {
1756 /**
1757 * @this {Resources.IDBObjectStoreTreeElement}
1758 */
1759 function callback() {
1760 this.update(this._objectStore);
1761 }
1762 this._model.clearObjectStore(this._databaseId, this._objectStore.name, callb ack.bind(this));
1763 }
1764
1765 /**
1766 * @param {!Resources.IndexedDBModel.ObjectStore} objectStore
1767 */
1768 update(objectStore) {
1769 this._objectStore = objectStore;
1770
1771 var indexNames = {};
1772 for (var indexName in this._objectStore.indexes) {
1773 var index = this._objectStore.indexes[indexName];
1774 indexNames[index.name] = true;
1775 if (!this._idbIndexTreeElements[index.name]) {
1776 var idbIndexTreeElement = new Resources.IDBIndexTreeElement(
1777 this._storagePanel, this._model, this._databaseId, this._objectStore , index);
1778 this._idbIndexTreeElements[index.name] = idbIndexTreeElement;
1779 this.appendChild(idbIndexTreeElement);
1780 }
1781 this._idbIndexTreeElements[index.name].update(index);
1782 }
1783 for (var indexName in this._idbIndexTreeElements) {
1784 if (!indexNames[indexName])
1785 this._indexRemoved(indexName);
1786 }
1787 for (var indexName in this._idbIndexTreeElements) {
1788 if (!indexNames[indexName]) {
1789 this.removeChild(this._idbIndexTreeElements[indexName]);
1790 delete this._idbIndexTreeElements[indexName];
1791 }
1792 }
1793
1794 if (this.childCount())
1795 this.expand();
1796
1797 if (this._view)
1798 this._view.update(this._objectStore);
1799
1800 this._updateTooltip();
1801 }
1802
1803 _updateTooltip() {
1804 var keyPathString = this._objectStore.keyPathString;
1805 var tooltipString = keyPathString !== null ? (Common.UIString('Key path: ') + keyPathString) : '';
1806 if (this._objectStore.autoIncrement)
1807 tooltipString += '\n' + Common.UIString('autoIncrement');
1808 this.tooltip = tooltipString;
1809 }
1810
1811 /**
1812 * @override
1813 * @return {boolean}
1814 */
1815 onselect(selectedByUser) {
1816 super.onselect(selectedByUser);
1817 if (!this._view)
1818 this._view = new Resources.IDBDataView(this._model, this._databaseId, this ._objectStore, null);
1819
1820 this._storagePanel._innerShowView(this._view);
1821 return false;
1822 }
1823
1824 /**
1825 * @param {string} indexName
1826 */
1827 _indexRemoved(indexName) {
1828 var indexTreeElement = this._idbIndexTreeElements[indexName];
1829 indexTreeElement.clear();
1830 this.removeChild(indexTreeElement);
1831 delete this._idbIndexTreeElements[indexName];
1832 }
1833
1834 clear() {
1835 for (var indexName in this._idbIndexTreeElements)
1836 this._indexRemoved(indexName);
1837 if (this._view)
1838 this._view.clear();
1839 }
1840 };
1841
1842 /**
1843 * @unrestricted
1844 */
1845 Resources.IDBIndexTreeElement = class extends Resources.BaseStorageTreeElement {
1846 /**
1847 * @param {!Resources.ResourcesPanel} storagePanel
1848 * @param {!Resources.IndexedDBModel} model
1849 * @param {!Resources.IndexedDBModel.DatabaseId} databaseId
1850 * @param {!Resources.IndexedDBModel.ObjectStore} objectStore
1851 * @param {!Resources.IndexedDBModel.Index} index
1852 */
1853 constructor(storagePanel, model, databaseId, objectStore, index) {
1854 super(storagePanel, index.name, false);
1855 this._model = model;
1856 this._databaseId = databaseId;
1857 this._objectStore = objectStore;
1858 this._index = index;
1859 }
1860
1861 get itemURL() {
1862 return 'indexedDB://' + this._databaseId.securityOrigin + '/' + this._databa seId.name + '/' +
1863 this._objectStore.name + '/' + this._index.name;
1864 }
1865
1866 /**
1867 * @param {!Resources.IndexedDBModel.Index} index
1868 */
1869 update(index) {
1870 this._index = index;
1871
1872 if (this._view)
1873 this._view.update(this._index);
1874
1875 this._updateTooltip();
1876 }
1877
1878 _updateTooltip() {
1879 var tooltipLines = [];
1880 var keyPathString = this._index.keyPathString;
1881 tooltipLines.push(Common.UIString('Key path: ') + keyPathString);
1882 if (this._index.unique)
1883 tooltipLines.push(Common.UIString('unique'));
1884 if (this._index.multiEntry)
1885 tooltipLines.push(Common.UIString('multiEntry'));
1886 this.tooltip = tooltipLines.join('\n');
1887 }
1888
1889 /**
1890 * @override
1891 * @return {boolean}
1892 */
1893 onselect(selectedByUser) {
1894 super.onselect(selectedByUser);
1895 if (!this._view)
1896 this._view = new Resources.IDBDataView(this._model, this._databaseId, this ._objectStore, this._index);
1897
1898 this._storagePanel._innerShowView(this._view);
1899 return false;
1900 }
1901
1902 clear() {
1903 if (this._view)
1904 this._view.clear();
1905 }
1906 };
1907
1908 /**
1909 * @unrestricted
1910 */
1911 Resources.DOMStorageTreeElement = class extends Resources.BaseStorageTreeElement {
1912 constructor(storagePanel, domStorage) {
1913 super(storagePanel, domStorage.securityOrigin ? domStorage.securityOrigin : Common.UIString('Local Files'), false);
1914 this._domStorage = domStorage;
1915 var icon = UI.Icon.create('mediumicon-table', 'resource-tree-item');
1916 this.setLeadingIcons([icon]);
1917 }
1918
1919 get itemURL() {
1920 return 'storage://' + this._domStorage.securityOrigin + '/' +
1921 (this._domStorage.isLocalStorage ? 'local' : 'session');
1922 }
1923
1924 /**
1925 * @override
1926 * @return {boolean}
1927 */
1928 onselect(selectedByUser) {
1929 super.onselect(selectedByUser);
1930 this._storagePanel._showDOMStorage(this._domStorage);
1931 return false;
1932 }
1933
1934 /**
1935 * @override
1936 */
1937 onattach() {
1938 super.onattach();
1939 this.listItemElement.addEventListener('contextmenu', this._handleContextMenu Event.bind(this), true);
1940 }
1941
1942 _handleContextMenuEvent(event) {
1943 var contextMenu = new UI.ContextMenu(event);
1944 contextMenu.appendItem(Common.UIString('Clear'), () => this._domStorage.clea r());
1945 contextMenu.show();
1946 }
1947 };
1948
1949 Resources.CookieTreeElement = class extends Resources.BaseStorageTreeElement {
1950 /**
1951 * @param {!Resources.ResourcesPanel} storagePanel
1952 * @param {!SDK.ResourceTreeFrame} frame
1953 * @param {string} cookieDomain
1954 */
1955 constructor(storagePanel, frame, cookieDomain) {
1956 super(storagePanel, cookieDomain ? cookieDomain : Common.UIString('Local Fil es'), false);
1957 this._target = frame.target();
1958 this._cookieDomain = cookieDomain;
1959 var icon = UI.Icon.create('mediumicon-cookie', 'resource-tree-item');
1960 this.setLeadingIcons([icon]);
1961 }
1962
1963 get itemURL() {
1964 return 'cookies://' + this._cookieDomain;
1965 }
1966
1967 /**
1968 * @override
1969 */
1970 onattach() {
1971 super.onattach();
1972 this.listItemElement.addEventListener('contextmenu', this._handleContextMenu Event.bind(this), true);
1973 }
1974
1975 /**
1976 * @param {!Event} event
1977 */
1978 _handleContextMenuEvent(event) {
1979 var contextMenu = new UI.ContextMenu(event);
1980 contextMenu.appendItem(
1981 Common.UIString('Clear'), () => this._storagePanel._clearCookies(this._t arget, this._cookieDomain));
1982 contextMenu.show();
1983 }
1984
1985 /**
1986 * @override
1987 * @return {boolean}
1988 */
1989 onselect(selectedByUser) {
1990 super.onselect(selectedByUser);
1991 this._storagePanel.showCookies(this, this._cookieDomain, this._target);
1992 return false;
1993 }
1994 };
1995
1996 /**
1997 * @unrestricted
1998 */
1999 Resources.ApplicationCacheManifestTreeElement = class extends Resources.BaseStor ageTreeElement {
2000 constructor(storagePanel, manifestURL) {
2001 var title = new Common.ParsedURL(manifestURL).displayName;
2002 super(storagePanel, title, false);
2003 this.tooltip = manifestURL;
2004 this._manifestURL = manifestURL;
2005 }
2006
2007 get itemURL() {
2008 return 'appcache://' + this._manifestURL;
2009 }
2010
2011 get manifestURL() {
2012 return this._manifestURL;
2013 }
2014
2015 /**
2016 * @override
2017 * @return {boolean}
2018 */
2019 onselect(selectedByUser) {
2020 super.onselect(selectedByUser);
2021 this._storagePanel.showCategoryView(this._manifestURL);
2022 return false;
2023 }
2024 };
2025
2026 /**
2027 * @unrestricted
2028 */
2029 Resources.ApplicationCacheFrameTreeElement = class extends Resources.BaseStorage TreeElement {
2030 /**
2031 * @param {!Resources.ResourcesPanel} storagePanel
2032 * @param {!Protocol.Page.FrameId} frameId
2033 * @param {string} manifestURL
2034 */
2035 constructor(storagePanel, frameId, manifestURL) {
2036 super(storagePanel, '', false);
2037 this._frameId = frameId;
2038 this._manifestURL = manifestURL;
2039 this._refreshTitles();
2040
2041 var icon = UI.Icon.create('largeicon-navigator-folder', 'navigator-tree-item ');
2042 icon.classList.add('navigator-folder-tree-item');
2043 this.setLeadingIcons([icon]);
2044 }
2045
2046 get itemURL() {
2047 return 'appcache://' + this._manifestURL + '/' + encodeURI(this.titleAsText( ));
2048 }
2049
2050 get frameId() {
2051 return this._frameId;
2052 }
2053
2054 get manifestURL() {
2055 return this._manifestURL;
2056 }
2057
2058 _refreshTitles() {
2059 var resourceTreeModel = SDK.ResourceTreeModel.fromTarget(this._storagePanel. _target);
2060 var frame = resourceTreeModel.frameForId(this._frameId);
2061 this.title = frame.displayName();
2062 }
2063
2064 frameNavigated() {
2065 this._refreshTitles();
2066 }
2067
2068 /**
2069 * @override
2070 * @return {boolean}
2071 */
2072 onselect(selectedByUser) {
2073 super.onselect(selectedByUser);
2074 this._storagePanel.showApplicationCache(this._frameId);
2075 return false;
2076 }
2077 };
2078
2079 /**
2080 * @unrestricted
2081 */
2082 Resources.StorageCategoryView = class extends UI.VBox {
2083 constructor() {
2084 super();
2085
2086 this.element.classList.add('storage-view');
2087 this._emptyWidget = new UI.EmptyWidget('');
2088 this._emptyWidget.show(this.element);
2089 }
2090
2091 setText(text) {
2092 this._emptyWidget.text = text;
2093 }
2094 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698