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
28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox}
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.ApplicationCacheItemsView = function(model, frameId)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.VBox.call(this);
33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
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();
63f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var status = this._model.frameManifestStatus(frameId);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.updateStatus(status);
66f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
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;
98f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
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;
115f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var statusInformation = {};
117f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        // 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;
165f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
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)) {
22143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            case 0: comparator = localeCompare.bind(null, "name"); break;
22243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            case 1: comparator = localeCompare.bind(null, "type"); break;
22343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            case 2: comparator = numberCompare.bind(null, "size"); break;
22443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            default: localeCompare.bind(null, "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)
267d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.VBox.prototype
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
270