| // Copyright 2017 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| Resources.ResourcesPanel = class extends UI.PanelWithSidebar { | |
| constructor() { | |
| super('resources'); | |
| this.registerRequiredCSS('resources/resourcesPanel.css'); | |
| this._resourcesLastSelectedItemSetting = Common.settings.createSetting('resourcesLastSelectedElementPath', []); | |
| /** @type {?UI.Widget} */ | |
| this.visibleView = null; | |
| /** @type {?Promise<!UI.Widget>} */ | |
| this._pendingViewPromise = null; | |
| /** @type {?Resources.StorageCategoryView} */ | |
| this._categoryView = null; | |
| const mainContainer = new UI.VBox(); | |
| this.storageViews = mainContainer.element.createChild('div', 'vbox flex-auto'); | |
| this._storageViewToolbar = new UI.Toolbar('resources-toolbar', mainContainer.element); | |
| this.splitWidget().setMainWidget(mainContainer); | |
| /** @type {?Resources.DOMStorageItemsView} */ | |
| this._domStorageView = null; | |
| /** @type {?Resources.CookieItemsView} */ | |
| this._cookieView = null; | |
| /** @type {?UI.EmptyWidget} */ | |
| this._emptyWidget = null; | |
| this._sidebar = new Resources.ApplicationPanelSidebar(this); | |
| this._sidebar.show(this.panelSidebarElement()); | |
| } | |
| /** | |
| * @return {!Resources.ResourcesPanel} | |
| */ | |
| static _instance() { | |
| return /** @type {!Resources.ResourcesPanel} */ (self.runtime.sharedInstance(Resources.ResourcesPanel)); | |
| } | |
| /** | |
| * @param {!UI.Widget} view | |
| * @return {boolean} | |
| */ | |
| static _shouldCloseOnReset(view) { | |
| const viewClassesToClose = [ | |
| SourceFrame.ResourceSourceFrame, SourceFrame.ImageView, SourceFrame.FontView, Resources.StorageItemsView, | |
| Resources.DatabaseQueryView, Resources.DatabaseTableView | |
| ]; | |
| return viewClassesToClose.some(type => view instanceof type); | |
| } | |
| /** | |
| * @override | |
| */ | |
| focus() { | |
| this._sidebar.focus(); | |
| } | |
| /** | |
| * @return {!Array<string>} | |
| */ | |
| lastSelectedItemPath() { | |
| return this._resourcesLastSelectedItemSetting.get(); | |
| } | |
| /** | |
| * @param {!Array<string>} path | |
| */ | |
| setLastSelectedItemPath(path) { | |
| this._resourcesLastSelectedItemSetting.set(path); | |
| } | |
| resetView() { | |
| if (this.visibleView && Resources.ResourcesPanel._shouldCloseOnReset(this.visibleView)) { | |
| this.showView(null); | |
| } | |
| } | |
| /** | |
| * @param {?UI.Widget} view | |
| */ | |
| showView(view) { | |
| this._pendingViewPromise = null; | |
| if (this.visibleView === view) { | |
| return; | |
| } | |
| if (this.visibleView) { | |
| this.visibleView.detach(); | |
| } | |
| if (view) { | |
| view.show(this.storageViews); | |
| } | |
| this.visibleView = view; | |
| this._storageViewToolbar.removeToolbarItems(); | |
| const toolbarItems = (view instanceof UI.SimpleView && view.syncToolbarItems()) || []; | |
| for (let i = 0; i < toolbarItems.length; ++i) { | |
| this._storageViewToolbar.appendToolbarItem(toolbarItems[i]); | |
| } | |
| this._storageViewToolbar.element.classList.toggle('hidden', !toolbarItems.length); | |
| } | |
| /** | |
| * @param {!Promise<!UI.Widget>} viewPromise | |
| * @return {!Promise<?UI.Widget>} | |
| */ | |
| async scheduleShowView(viewPromise) { | |
| this._pendingViewPromise = viewPromise; | |
| const view = await viewPromise; | |
| if (this._pendingViewPromise !== viewPromise) { | |
| return null; | |
| } | |
| this.showView(view); | |
| return view; | |
| } | |
| /** | |
| * @param {string} categoryName | |
| * @param {string|null} categoryLink | |
| */ | |
| showCategoryView(categoryName, categoryLink) { | |
| if (!this._categoryView) { | |
| this._categoryView = new Resources.StorageCategoryView(); | |
| } | |
| this._categoryView.setText(categoryName); | |
| this._categoryView.setLink(categoryLink); | |
| this.showView(this._categoryView); | |
| } | |
| /** | |
| * @param {!Resources.DOMStorage} domStorage | |
| */ | |
| showDOMStorage(domStorage) { | |
| if (!domStorage) { | |
| return; | |
| } | |
| if (!this._domStorageView) { | |
| this._domStorageView = new Resources.DOMStorageItemsView(domStorage); | |
| } else { | |
| this._domStorageView.setStorage(domStorage); | |
| } | |
| this.showView(this._domStorageView); | |
| } | |
| /** | |
| * @param {!SDK.Target} cookieFrameTarget | |
| * @param {string} cookieDomain | |
| */ | |
| showCookies(cookieFrameTarget, cookieDomain) { | |
| const model = cookieFrameTarget.model(SDK.CookieModel); | |
| if (!model) { | |
| return; | |
| } | |
| if (!this._cookieView) { | |
| this._cookieView = new Resources.CookieItemsView(model, cookieDomain); | |
| } else { | |
| this._cookieView.setCookiesDomain(model, cookieDomain); | |
| } | |
| this.showView(this._cookieView); | |
| } | |
| /** | |
| * @param {!SDK.Target} target | |
| * @param {string} cookieDomain | |
| */ | |
| clearCookies(target, cookieDomain) { | |
| const model = target.model(SDK.CookieModel); | |
| if (!model) { | |
| return; | |
| } | |
| model.clear(cookieDomain, () => { | |
| if (this._cookieView) { | |
| this._cookieView.refreshItems(); | |
| } | |
| }); | |
| } | |
| }; | |
| /** | |
| * @implements {Common.Revealer} | |
| */ | |
| Resources.ResourcesPanel.ResourceRevealer = class { | |
| /** | |
| * @override | |
| * @param {!Object} resource | |
| * @return {!Promise} | |
| */ | |
| async reveal(resource) { | |
| if (!(resource instanceof SDK.Resource)) { | |
| return Promise.reject(new Error('Internal error: not a resource')); | |
| } | |
| const sidebar = Resources.ResourcesPanel._instance()._sidebar; | |
| await UI.viewManager.showView('resources'); | |
| await sidebar.showResource(resource); | |
| } | |
| }; |