/* * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. * Copyright (C) 2009 Joseph Pecoraro * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ WebInspector.StoragePanel = function(database) { WebInspector.Panel.call(this); this.createSidebar(); this.databasesListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("DATABASES"), {}, true); this.sidebarTree.appendChild(this.databasesListTreeElement); this.databasesListTreeElement.expand(); this.localStorageListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("LOCAL STORAGE"), {}, true); this.sidebarTree.appendChild(this.localStorageListTreeElement); this.localStorageListTreeElement.expand(); this.sessionStorageListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("SESSION STORAGE"), {}, true); this.sidebarTree.appendChild(this.sessionStorageListTreeElement); this.sessionStorageListTreeElement.expand(); this.cookieListTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("COOKIES"), {}, true); this.sidebarTree.appendChild(this.cookieListTreeElement); this.cookieListTreeElement.expand(); this.storageViews = document.createElement("div"); this.storageViews.id = "storage-views"; this.element.appendChild(this.storageViews); this.storageViewStatusBarItemsContainer = document.createElement("div"); this.storageViewStatusBarItemsContainer.id = "storage-view-status-bar-items"; this.reset(); } WebInspector.StoragePanel.prototype = { toolbarItemClass: "storage", get toolbarItemLabel() { return WebInspector.UIString("Storage"); }, get statusBarItems() { return [this.storageViewStatusBarItemsContainer]; }, reset: function() { if (this._databases) { var databasesLength = this._databases.length; for (var i = 0; i < databasesLength; ++i) { var database = this._databases[i]; delete database._tableViews; delete database._queryView; } } this._databases = []; if (this._domStorage) { var domStorageLength = this._domStorage.length; for (var i = 0; i < domStorageLength; ++i) { var domStorage = this._domStorage[i]; delete domStorage._domStorageView; } } this._domStorage = []; this._cookieViews = {}; this.databasesListTreeElement.removeChildren(); this.localStorageListTreeElement.removeChildren(); this.sessionStorageListTreeElement.removeChildren(); this.cookieListTreeElement.removeChildren(); this.storageViews.removeChildren(); this.storageViewStatusBarItemsContainer.removeChildren(); if (this.sidebarTree.selectedTreeElement) this.sidebarTree.selectedTreeElement.deselect(); }, addDatabase: function(database) { this._databases.push(database); var databaseTreeElement = new WebInspector.DatabaseSidebarTreeElement(database); database._databasesTreeElement = databaseTreeElement; this.databasesListTreeElement.appendChild(databaseTreeElement); }, addCookieDomain: function(domain) { var cookieDomainTreeElement = new WebInspector.CookieSidebarTreeElement(domain); this.cookieListTreeElement.appendChild(cookieDomainTreeElement); }, addDOMStorage: function(domStorage) { this._domStorage.push(domStorage); var domStorageTreeElement = new WebInspector.DOMStorageSidebarTreeElement(domStorage, (domStorage.isLocalStorage ? "local-storage" : "session-storage")); domStorage._domStorageTreeElement = domStorageTreeElement; if (domStorage.isLocalStorage) this.localStorageListTreeElement.appendChild(domStorageTreeElement); else this.sessionStorageListTreeElement.appendChild(domStorageTreeElement); }, selectDatabase: function(databaseId) { var database; for (var i = 0, len = this._databases.length; i < len; ++i) { database = this._databases[i]; if (database.id === databaseId) { this.showDatabase(database); database._databasesTreeElement.select(); return; } } }, selectDOMStorage: function(storageId) { var domStorage = this._domStorageForId(storageId); if (domStorage) { this.showDOMStorage(domStorage); domStorage._domStorageTreeElement.select(); } }, showDatabase: function(database, tableName) { if (!database) return; if (this.visibleView) this.visibleView.hide(); var view; if (tableName) { if (!("_tableViews" in database)) database._tableViews = {}; view = database._tableViews[tableName]; if (!view) { view = new WebInspector.DatabaseTableView(database, tableName); database._tableViews[tableName] = view; } } else { view = database._queryView; if (!view) { view = new WebInspector.DatabaseQueryView(database); database._queryView = view; } } view.show(this.storageViews); this.visibleView = view; this.storageViewStatusBarItemsContainer.removeChildren(); var statusBarItems = view.statusBarItems || []; for (var i = 0; i < statusBarItems.length; ++i) this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i].element); }, showDOMStorage: function(domStorage) { if (!domStorage) return; if (this.visibleView) this.visibleView.hide(); var view; view = domStorage._domStorageView; if (!view) { view = new WebInspector.DOMStorageItemsView(domStorage); domStorage._domStorageView = view; } view.show(this.storageViews); this.visibleView = view; this.storageViewStatusBarItemsContainer.removeChildren(); var statusBarItems = view.statusBarItems; for (var i = 0; i < statusBarItems.length; ++i) this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]); }, showCookies: function(treeElement, cookieDomain) { if (this.visibleView) this.visibleView.hide(); var view = this._cookieViews[cookieDomain]; if (!view) { view = new WebInspector.CookieItemsView(treeElement, cookieDomain); this._cookieViews[cookieDomain] = view; } view.show(this.storageViews); this.visibleView = view; this.storageViewStatusBarItemsContainer.removeChildren(); var statusBarItems = view.statusBarItems; for (var i = 0; i < statusBarItems.length; ++i) this.storageViewStatusBarItemsContainer.appendChild(statusBarItems[i]); }, closeVisibleView: function() { if (this.visibleView) this.visibleView.hide(); delete this.visibleView; }, updateDatabaseTables: function(database) { if (!database || !database._databasesTreeElement) return; database._databasesTreeElement.shouldRefreshChildren = true; if (!("_tableViews" in database)) return; var tableNamesHash = {}; var self = this; function tableNamesCallback(tableNames) { var tableNamesLength = tableNames.length; for (var i = 0; i < tableNamesLength; ++i) tableNamesHash[tableNames[i]] = true; for (var tableName in database._tableViews) { if (!(tableName in tableNamesHash)) { if (self.visibleView === database._tableViews[tableName]) self.closeVisibleView(); delete database._tableViews[tableName]; } } } database.getTableNames(tableNamesCallback); }, dataGridForResult: function(rows) { if (!rows.length) return null; var columns = {}; var numColumns = 0; for (var columnIdentifier in rows[0]) { var column = {}; column.width = columnIdentifier.length; column.title = columnIdentifier; columns[columnIdentifier] = column; ++numColumns; } var nodes = []; var length = rows.length; for (var i = 0; i < length; ++i) { var data = {}; var row = rows[i]; for (var columnIdentifier in row) data[columnIdentifier] = row[columnIdentifier]; var node = new WebInspector.DataGridNode(data, false); node.selectable = false; nodes.push(node); } var dataGrid = new WebInspector.DataGrid(columns); var length = nodes.length; for (var i = 0; i < length; ++i) dataGrid.appendChild(nodes[i]); return dataGrid; }, updateDOMStorage: function(storageId) { var domStorage = this._domStorageForId(storageId); if (!domStorage) return; var view = domStorage._domStorageView; if (this.visibleView && view === this.visibleView) domStorage._domStorageView.update(); }, _domStorageForId: function(storageId) { if (!this._domStorage) return null; var domStorageLength = this._domStorage.length; for (var i = 0; i < domStorageLength; ++i) { var domStorage = this._domStorage[i]; if (domStorage.id == storageId) return domStorage; } return null; }, updateMainViewWidth: function(width) { this.storageViews.style.left = width + "px"; this.storageViewStatusBarItemsContainer.style.left = width + "px"; this.resize(); } } WebInspector.StoragePanel.prototype.__proto__ = WebInspector.Panel.prototype; WebInspector.DatabaseSidebarTreeElement = function(database) { this.database = database; WebInspector.SidebarTreeElement.call(this, "database-sidebar-tree-item", "", "", database, true); this.refreshTitles(); } WebInspector.DatabaseSidebarTreeElement.prototype = { onselect: function() { WebInspector.panels.storage.showDatabase(this.database); }, oncollapse: function() { // Request a refresh after every collapse so the next // expand will have an updated table list. this.shouldRefreshChildren = true; }, onpopulate: function() { this.removeChildren(); var self = this; function tableNamesCallback(tableNames) { var tableNamesLength = tableNames.length; for (var i = 0; i < tableNamesLength; ++i) self.appendChild(new WebInspector.SidebarDatabaseTableTreeElement(self.database, tableNames[i])); } this.database.getTableNames(tableNamesCallback); }, get mainTitle() { return this.database.name; }, set mainTitle(x) { // Do nothing. }, get subtitle() { return this.database.displayDomain; }, set subtitle(x) { // Do nothing. } } WebInspector.DatabaseSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype; WebInspector.SidebarDatabaseTableTreeElement = function(database, tableName) { this.database = database; this.tableName = tableName; WebInspector.SidebarTreeElement.call(this, "database-table-sidebar-tree-item small", tableName, "", null, false); } WebInspector.SidebarDatabaseTableTreeElement.prototype = { onselect: function() { WebInspector.panels.storage.showDatabase(this.database, this.tableName); } } WebInspector.SidebarDatabaseTableTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype; WebInspector.DOMStorageSidebarTreeElement = function(domStorage, className) { this.domStorage = domStorage; WebInspector.SidebarTreeElement.call(this, "domstorage-sidebar-tree-item " + className, domStorage, "", null, false); this.refreshTitles(); } WebInspector.DOMStorageSidebarTreeElement.prototype = { onselect: function() { WebInspector.panels.storage.showDOMStorage(this.domStorage); }, get mainTitle() { return this.domStorage.domain ? this.domStorage.domain : WebInspector.UIString("Local Files"); }, set mainTitle(x) { // Do nothing. }, get subtitle() { return ""; //this.database.displayDomain; }, set subtitle(x) { // Do nothing. } } WebInspector.DOMStorageSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype; WebInspector.CookieSidebarTreeElement = function(cookieDomain) { WebInspector.SidebarTreeElement.call(this, "cookie-sidebar-tree-item", cookieDomain, "", null, false); this._cookieDomain = cookieDomain; this._subtitle = ""; this.refreshTitles(); } WebInspector.CookieSidebarTreeElement.prototype = { onselect: function() { WebInspector.panels.storage.showCookies(this, this._cookieDomain); }, get mainTitle() { return this._cookieDomain ? this._cookieDomain : WebInspector.UIString("Local Files"); }, set mainTitle(x) { // Do nothing. }, get subtitle() { return this._subtitle; }, set subtitle(x) { this._subtitle = x; this.refreshTitles(); } } WebInspector.CookieSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;