15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.View} 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ApplicationCacheItemsView = function(model, frameId) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInspector.View.call(this); 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._model = model; 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this.element.classList.add("storage-view"); 37a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this.element.classList.add("table"); 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Needs better tooltip. (Localized) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item"); 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.deleteButton.visible = false; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.deleteButton.addEventListener("click", this._deleteButtonClicked, this); 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) this.connectivityIcon = document.createElement("div"); 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.connectivityMessage = document.createElement("span"); 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.connectivityMessage.className = "storage-application-cache-connectivity"; 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.connectivityMessage.textContent = ""; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.divider = document.createElement("span"); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.divider.className = "status-bar-item status-bar-divider"; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) this.statusIcon = document.createElement("div"); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.statusMessage = document.createElement("span"); 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.statusMessage.className = "storage-application-cache-status"; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.statusMessage.textContent = ""; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._frameId = frameId; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._emptyView = new WebInspector.EmptyView(WebInspector.UIString("No Application Cache information available.")); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._emptyView.show(this.element); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._markDirty(); 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var status = this._model.frameManifestStatus(frameId); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.updateStatus(status); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.updateNetworkState(this._model.onLine); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Status bar items don't work well enough yet, so they are being hidden. 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://webkit.org/b/41637 Web Inspector: Give Semantics to "Refresh" and "Delete" Buttons in ApplicationCache DataGrid 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.deleteButton.element.style.display = "none"; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ApplicationCacheItemsView.prototype = { 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) get statusBarItems() 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return [ 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.deleteButton.element, 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.connectivityIcon, this.connectivityMessage, this.divider, 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.statusIcon, this.statusMessage 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ]; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) wasShown: function() 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._maybeUpdate(); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) willHide: function() 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.deleteButton.visible = false; 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _maybeUpdate: function() 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!this.isShowing() || !this._viewDirty) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._update(); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._viewDirty = false; 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _markDirty: function() 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._viewDirty = true; 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {number} status 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateStatus: function(status) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var oldStatus = this._status; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._status = status; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var statusInformation = {}; 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We should never have UNCACHED status, since we remove frames with UNCACHED application cache status from the tree. 11853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) statusInformation[applicationCache.UNCACHED] = { className: "red-ball", text: "UNCACHED" }; 11953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) statusInformation[applicationCache.IDLE] = { className: "green-ball", text: "IDLE" }; 12053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) statusInformation[applicationCache.CHECKING] = { className: "orange-ball", text: "CHECKING" }; 12153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) statusInformation[applicationCache.DOWNLOADING] = { className: "orange-ball", text: "DOWNLOADING" }; 12253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) statusInformation[applicationCache.UPDATEREADY] = { className: "green-ball", text: "UPDATEREADY" }; 12353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) statusInformation[applicationCache.OBSOLETE] = { className: "red-ball", text: "OBSOLETE" }; 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var info = statusInformation[status] || statusInformation[applicationCache.UNCACHED]; 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) this.statusIcon.className = "storage-application-cache-status-icon " + info.className; 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.statusMessage.textContent = info.text; 12953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this.isShowing() && this._status === applicationCache.IDLE && (oldStatus === applicationCache.UPDATEREADY || !this._resources)) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._markDirty(); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._maybeUpdate(); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {boolean} isNowOnline 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateNetworkState: function(isNowOnline) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isNowOnline) { 14153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) this.connectivityIcon.className = "storage-application-cache-connectivity-icon green-ball"; 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.connectivityMessage.textContent = WebInspector.UIString("Online"); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 14453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) this.connectivityIcon.className = "storage-application-cache-connectivity-icon red-ball"; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.connectivityMessage.textContent = WebInspector.UIString("Offline"); 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _update: function() 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._model.requestApplicationCache(this._frameId, this._updateCallback.bind(this)); 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 155a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {?ApplicationCacheAgent.ApplicationCache} applicationCache 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _updateCallback: function(applicationCache) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!applicationCache || !applicationCache.manifestURL) { 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete this._manifest; 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete this._creationTime; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete this._updateTime; 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete this._size; 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete this._resources; 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._emptyView.show(this.element); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.deleteButton.visible = false; 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._dataGrid) 169a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this._dataGrid.element.classList.add("hidden"); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: are these variables needed anywhere else? 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._manifest = applicationCache.manifestURL; 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._creationTime = applicationCache.creationTime; 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._updateTime = applicationCache.updateTime; 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._size = applicationCache.size; 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._resources = applicationCache.resources; 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!this._dataGrid) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._createDataGrid(); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._populateDataGrid(); 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._dataGrid.autoSizeColumns(20, 80); 184a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) this._dataGrid.element.classList.remove("hidden"); 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._emptyView.detach(); 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.deleteButton.visible = true; 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: For Chrome, put creationTime and updateTime somewhere. 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NOTE: localizedString has not yet been added. 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // WebInspector.UIString("(%s) Created: %s Updated: %s", this._size, this._creationTime, this._updateTime); 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _createDataGrid: function() 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) var columns = [ 196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) {title: WebInspector.UIString("Resource"), sort: WebInspector.DataGrid.Order.Ascending, sortable: true}, 197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) {title: WebInspector.UIString("Type"), sortable: true}, 198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) {title: WebInspector.UIString("Size"), align: WebInspector.DataGrid.Align.Right, sortable: true} 199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ]; 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._dataGrid = new WebInspector.DataGrid(columns); 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._dataGrid.show(this.element); 202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged, this._populateDataGrid, this); 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _populateDataGrid: function() 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var selectedResource = this._dataGrid.selectedNode ? this._dataGrid.selectedNode.resource : null; 208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) var sortDirection = this._dataGrid.isSortOrderAscending() ? 1 : -1; 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function numberCompare(field, resource1, resource2) 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return sortDirection * (resource1[field] - resource2[field]); 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function localeCompare(field, resource1, resource2) 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return sortDirection * (resource1[field] + "").localeCompare(resource2[field] + "") 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var comparator; 220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) switch (parseInt(this._dataGrid.sortColumnIdentifier(), 10)) { 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 0: comparator = localeCompare.bind(this, "name"); break; 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 1: comparator = localeCompare.bind(this, "type"); break; 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 2: comparator = numberCompare.bind(this, "size"); break; 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: localeCompare.bind(this, "resource"); // FIXME: comparator = ? 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._resources.sort(comparator); 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._dataGrid.rootNode().removeChildren(); 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var nodeToSelect; 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < this._resources.length; ++i) { 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var data = {}; 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var resource = this._resources[i]; 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) data[0] = resource.url; 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) data[1] = resource.type; 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) data[2] = Number.bytesToString(resource.size); 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var node = new WebInspector.DataGridNode(data); 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.resource = resource; 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) node.selectable = true; 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._dataGrid.rootNode().appendChild(node); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (resource === selectedResource) { 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nodeToSelect = node; 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nodeToSelect.selected = true; 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!nodeToSelect && this._dataGrid.rootNode().children.length) 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._dataGrid.rootNode().children[0].selected = true; 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _deleteButtonClicked: function(event) 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!this._dataGrid || !this._dataGrid.selectedNode) 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Delete Button semantics are not yet defined. (Delete a single, or all?) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._deleteCallback(this._dataGrid.selectedNode); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _deleteCallback: function(node) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Should we delete a single (selected) resource or all resources? 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // InspectorBackend.deleteCachedResource(...) 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // this._update(); 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) __proto__: WebInspector.View.prototype 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 270