15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Nokia Inc.  All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Samsung Electronics. All rights reserved.
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) * 1. Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox}
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
31c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)WebInspector.DOMStorageItemsView = function(domStorage)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.VBox.call(this);
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.domStorage = domStorage;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this.element.classList.add("storage-view");
38a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this.element.classList.add("table");
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)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.refreshButton.addEventListener("click", this._refreshButtonClicked, this);
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
47c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    this.domStorage.addEventListener(WebInspector.DOMStorage.Events.DOMStorageItemsCleared, this._domStorageItemsCleared, this);
48c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    this.domStorage.addEventListener(WebInspector.DOMStorage.Events.DOMStorageItemRemoved, this._domStorageItemRemoved, this);
49c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    this.domStorage.addEventListener(WebInspector.DOMStorage.Events.DOMStorageItemAdded, this._domStorageItemAdded, this);
50c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    this.domStorage.addEventListener(WebInspector.DOMStorage.Events.DOMStorageItemUpdated, this._domStorageItemUpdated, this);
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.DOMStorageItemsView.prototype = {
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get statusBarItems()
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return [this.refreshButton.element, this.deleteButton.element];
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    wasShown: function()
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._update();
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    willHide: function()
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.deleteButton.visible = false;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
70a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Event} event
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _domStorageItemsCleared: function(event)
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
7453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!this.isShowing() || !this._dataGrid)
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._dataGrid.rootNode().removeChildren();
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._dataGrid.addCreationNode(false);
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.deleteButton.visible = false;
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        event.consume(true);
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
84a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Event} event
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _domStorageItemRemoved: function(event)
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!this.isShowing() || !this._dataGrid)
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var storageData = event.data;
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var rootNode = this._dataGrid.rootNode();
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var children = rootNode.children;
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        event.consume(true);
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < children.length; ++i) {
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var childNode = children[i];
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (childNode.data.key === storageData.key) {
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                rootNode.removeChild(childNode);
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                this.deleteButton.visible = (children.length > 1);
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return;
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
108a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Event} event
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _domStorageItemAdded: function(event)
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
11253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!this.isShowing() || !this._dataGrid)
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var storageData = event.data;
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var rootNode = this._dataGrid.rootNode();
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var children = rootNode.children;
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        event.consume(true);
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.deleteButton.visible = true;
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < children.length; ++i)
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (children[i].data.key === storageData.key)
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return;
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
126c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        var childNode = new WebInspector.DataGridNode({key: storageData.key, value: storageData.value}, false);
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        rootNode.insertChild(childNode, children.length - 1);
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
131a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Event} event
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _domStorageItemUpdated: function(event)
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
13553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!this.isShowing() || !this._dataGrid)
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var storageData = event.data;
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var rootNode = this._dataGrid.rootNode();
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var children = rootNode.children;
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        event.consume(true);
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var keyFound = false;
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < children.length; ++i) {
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var childNode = children[i];
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (childNode.data.key === storageData.key) {
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (keyFound) {
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    rootNode.removeChild(childNode);
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    return;
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                }
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                keyFound = true;
153c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)                if (childNode.data.value !== storageData.value) {
154c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)                    childNode.data.value = storageData.value;
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    childNode.refresh();
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    childNode.select();
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    childNode.reveal();
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                }
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                this.deleteButton.visible = true;
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _update: function()
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.detachChildViews();
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.domStorage.getItems(this._showDOMStorageItems.bind(this));
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _showDOMStorageItems: function(error, items)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (error)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._dataGrid = this._dataGridForDOMStorageItems(items);
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._dataGrid.show(this.element);
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.deleteButton.visible = (this._dataGrid.rootNode().children.length > 1);
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _dataGridForDOMStorageItems: function(items)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var columns = [
18353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            {id: "key", title: WebInspector.UIString("Key"), editable: true, weight: 50},
18453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            {id: "value", title: WebInspector.UIString("Value"), editable: true, weight: 50}
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ];
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var nodes = [];
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var keys = [];
190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var length = items.length;
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < items.length; i++) {
192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var key = items[i][0];
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var value = items[i][1];
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var node = new WebInspector.DataGridNode({key: key, value: value}, false);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            node.selectable = true;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            nodes.push(node);
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            keys.push(key);
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var dataGrid = new WebInspector.DataGrid(columns, this._editingCallback.bind(this), this._deleteCallback.bind(this));
20153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        dataGrid.setName("DOMStorageItemsView");
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        length = nodes.length;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < length; ++i)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dataGrid.rootNode().appendChild(nodes[i]);
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dataGrid.addCreationNode(false);
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (length > 0)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            nodes[0].selected = true;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return dataGrid;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _deleteButtonClicked: function(event)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._dataGrid || !this._dataGrid.selectedNode)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._deleteCallback(this._dataGrid.selectedNode);
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._dataGrid.changeNodeAfterDeletion();
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _refreshButtonClicked: function(event)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._update();
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _editingCallback: function(editingNode, columnIdentifier, oldText, newText)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var domStorage = this.domStorage;
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if ("key" === columnIdentifier) {
229e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)            if (typeof oldText === "string")
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                domStorage.removeItem(oldText);
231e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)            domStorage.setItem(newText, editingNode.data.value || '');
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._removeDupes(editingNode);
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        } else
234e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)            domStorage.setItem(editingNode.data.key || '', newText);
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {!WebInspector.DataGridNode} masterNode
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _removeDupes: function(masterNode)
241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var rootNode = this._dataGrid.rootNode();
243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var children = rootNode.children;
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = children.length - 1; i >= 0; --i) {
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var childNode = children[i];
246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if ((childNode.data.key === masterNode.data.key) && (masterNode !== childNode))
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                rootNode.removeChild(childNode);
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _deleteCallback: function(node)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!node || node.isCreationNode)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.domStorage)
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this.domStorage.removeItem(node.data.key);
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.VBox.prototype
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
262