15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Apple Inc.  All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Joseph Pecoraro
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     its contributors may be used to endorse or promote products derived
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     from this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox}
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.CookieItemsView = function(treeElement, cookieDomain)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.VBox.call(this);
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this.element.classList.add("storage-view");
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
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._clearButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear"), "clear-storage-status-bar-item");
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._clearButton.visible = false;
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._clearButton.addEventListener("click", this._clearButtonClicked, this);
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._refreshButton.addEventListener("click", this._refreshButtonClicked, this);
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._treeElement = treeElement;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._cookieDomain = cookieDomain;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._emptyView = new WebInspector.EmptyView(WebInspector.UIString("This site has no cookies."));
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._emptyView.show(this.element);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.addEventListener("contextmenu", this._contextMenu.bind(this), true);
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.CookieItemsView.prototype = {
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get statusBarItems()
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return [this._refreshButton.element, this._clearButton.element, this._deleteButton.element];
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    wasShown: function()
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._update();
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    willHide: function()
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._deleteButton.visible = false;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _update: function()
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.Cookies.getCookiesAsync(this._updateWithCookies.bind(this));
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
82a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Array.<!WebInspector.Cookie>} allCookies
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
8453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _updateWithCookies: function(allCookies)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._cookies = this._filterCookiesForDomain(allCookies);
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._cookies.length) {
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Nothing to show.
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._emptyView.show(this.element);
9153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._clearButton.visible = false;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._deleteButton.visible = false;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (this._cookiesTable)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._cookiesTable.detach();
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._cookiesTable)
9953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._cookiesTable = new WebInspector.CookiesTable(false, this._update.bind(this), this._showDeleteButton.bind(this));
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._cookiesTable.setCookies(this._cookies);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._emptyView.detach();
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._cookiesTable.show(this.element);
10453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._treeElement.subtitle = String.sprintf(WebInspector.UIString("%d cookies (%s)"), this._cookies.length,
10553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            Number.bytesToString(this._totalSize));
10653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._clearButton.visible = true;
10753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._deleteButton.visible = !!this._cookiesTable.selectedCookie();
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
111a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Array.<!WebInspector.Cookie>} allCookies
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _filterCookiesForDomain: function(allCookies)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var cookies = [];
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var resourceURLsForDocumentURL = [];
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._totalSize = 0;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.CookieItemsView}
12109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function populateResourcesForDocuments(resource)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var url = resource.documentURL.asParsedURL();
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (url && url.host == this._cookieDomain)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                resourceURLsForDocumentURL.push(resource.url);
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.forAllResources(populateResourcesForDocuments.bind(this));
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < allCookies.length; ++i) {
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var pushed = false;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var size = allCookies[i].size();
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var j = 0; j < resourceURLsForDocumentURL.length; ++j) {
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var resourceURL = resourceURLsForDocumentURL[j];
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (WebInspector.Cookies.cookieMatchesResourceURL(allCookies[i], resourceURL)) {
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    this._totalSize += size;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (!pushed) {
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        pushed = true;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        cookies.push(allCookies[i]);
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    }
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return cookies;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    clear: function()
14853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
14953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._cookiesTable.clear();
15053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._update();
15153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
15253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
15353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _clearButtonClicked: function()
15453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
15553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this.clear();
15653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
15753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
15853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _showDeleteButton: function()
15953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
16053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._deleteButton.visible = true;
16153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
16253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _deleteButtonClicked: function()
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var selectedCookie = this._cookiesTable.selectedCookie();
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (selectedCookie) {
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            selectedCookie.remove();
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._update();
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _refreshButtonClicked: function(event)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._update();
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _contextMenu: function(event)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._cookies.length) {
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var contextMenu = new WebInspector.ContextMenu(event);
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            contextMenu.appendItem(WebInspector.UIString("Refresh"), this._update.bind(this));
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            contextMenu.show();
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
186d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.VBox.prototype
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
188