Web Inspector: In a DataGrid, store value of columnIdentifier to DOM node representin...
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / DOMStorageContentView.js
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  * Copyright (C) 2013 Samsung Electronics. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24  * THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 WebInspector.DOMStorageContentView = function(representedObject)
28 {
29     WebInspector.ContentView.call(this, representedObject);
30
31     this.element.classList.add(WebInspector.DOMStorageContentView.StyleClassName);
32
33     this.update();
34 };
35
36 WebInspector.DOMStorageContentView.StyleClassName = "dom-storage";
37
38 WebInspector.DOMStorageContentView.prototype = {
39     constructor: WebInspector.DOMStorageContentView,
40
41     // Public
42
43     update: function()
44     {
45         this.representedObject.getEntries(this._showDOMStorageEntries.bind(this));
46     },
47
48     saveToCookie: function(cookie)
49     {
50         cookie.type = WebInspector.ContentViewCookieType.DOMStorage;
51         cookie.isLocalStorage = this.representedObject.isLocalStorage();
52         cookie.host = this.representedObject.host;
53     },
54
55     itemsCleared: function()
56     {
57         this._dataGrid.removeChildren();
58         this._dataGrid.addCreationNode(false);
59     },
60
61     itemRemoved: function(key)
62     {
63         for (var i = 0; i < this._dataGrid.children.length; ++i) {
64             var childNode = this._dataGrid.children[i];
65             if (childNode.data[0] === key) {
66                 this._dataGrid.removeChild(childNode);
67                 return;
68             }
69         }
70     },
71
72     itemAdded: function(key, value)
73     {
74         for (var i = 0; i < this._dataGrid.children.length; ++i) {
75             if (this._dataGrid.children[i][0] === key)
76                 return;
77         }
78
79         var data = {};
80         data[0] = key;
81         data[1] = value;
82
83         var childNode = new WebInspector.DataGridNode(data, false);
84
85         this._dataGrid.insertChild(childNode, this._dataGrid.children.length - 1);
86         if (this._dataGrid.sortOrder)
87             this._sortDataGrid();
88     },
89
90     itemUpdated: function(key, oldValue, value)
91     {
92         var keyFound = false;
93         for (var i = 0; i < this._dataGrid.children.length; ++i) {
94             var childNode = this._dataGrid.children[i];
95             if (childNode.data[0] === key) {
96                 if (keyFound) {
97                     this._dataGrid.removeChild(childNode);
98                     return;
99                 }
100
101                 keyFound = true;
102                 childNode.data[1] = value;
103                 childNode.refresh();
104             }
105         }
106     },
107
108     updateLayout: function()
109     {
110         if (this._dataGrid)
111             this._dataGrid.updateLayout();
112     },
113
114     get scrollableElements()
115     {
116         if (!this._dataGrid)
117             return [];
118         return [this._dataGrid.scrollContainer];
119     },
120
121     // Private
122
123     _showDOMStorageEntries: function(error, entries)
124     {
125         if (error)
126             return;
127
128         this._updateDataGridForDOMStorageEntries(entries);
129
130         this._dataGrid.updateLayout();
131     },
132
133     _updateDataGridForDOMStorageEntries: function(entries)
134     {
135         if (!this._dataGrid) {
136             var columns = {};
137             columns[0] = {title: WebInspector.UIString("Key"), sortable: true};
138             columns[1] = {title: WebInspector.UIString("Value"), sortable: true};
139
140             this._dataGrid = new WebInspector.DataGrid(columns, this._editingCallback.bind(this), this._deleteCallback.bind(this));
141             this._dataGrid.addEventListener(WebInspector.DataGrid.Event.SortChanged, this._sortDataGrid, this);
142
143             this.element.appendChild(this._dataGrid.element);
144         }
145
146         console.assert(this._dataGrid);
147
148         var nodes = [];
149         for (var i = 0; i < entries.length; ++i) {
150             var data = {};
151
152             var key = entries[i][0];
153             var value = entries[i][1];
154
155             data[0] = key;
156             data[1] = value;
157
158             var node = new WebInspector.DataGridNode(data, false);
159             node.selectable = true;
160
161             nodes.push(node);
162         }
163
164         if (this._dataGrid.creationNode)
165             this._dataGrid.removeChild(this._dataGrid.creationNode);
166
167         this._insertNodesIntoDataGridWithSort(nodes);
168
169         if (nodes.length > 0)
170             nodes[0].selected = true;
171     },
172
173     _sortDataGrid: function()
174     {
175         if (this._dataGrid.creationNode)
176             this._dataGrid.removeChild(this._dataGrid.creationNode);
177
178         var nodes = this._dataGrid.children.slice();
179         this._insertNodesIntoDataGridWithSort(nodes);
180     },
181
182     _insertNodesIntoDataGridWithSort: function(nodes)
183     {
184         console.assert(!this._dataGrid.creationNode);
185
186         var sortColumnIdentifier = this._dataGrid.sortColumnIdentifier;
187         var sortAscending = this._dataGrid.sortOrder === "ascending";
188
189         function comparator(a, b)
190         {
191             var result = b.data[sortColumnIdentifier].localeCompare(a.data[sortColumnIdentifier]);
192             return sortAscending ? -result : result;
193         }
194
195         if (sortColumnIdentifier)
196             nodes.sort(comparator);
197
198         this._dataGrid.removeChildren();
199         for (var i = 0; i < nodes.length; i++)
200             this._dataGrid.appendChild(nodes[i]);
201         this._dataGrid.addCreationNode(false);
202     },
203
204     _deleteCallback: function(node)
205     {
206         if (!node || node.isCreationNode)
207             return;
208
209         if (this.representedObject)
210             this.representedObject.removeItem(node.data[0]);
211
212         this.update();
213     },
214
215     _editingCallback: function(editingNode, columnIdentifier, oldText, newText)
216     {
217         var domStorage = this.representedObject;
218         if (columnIdentifier === "0") {
219             if (oldText)
220                 domStorage.removeItem(oldText);
221
222             domStorage.setItem(newText, editingNode.data[1]);
223         } else
224             domStorage.setItem(editingNode.data[0], newText);
225
226         this.update();
227     }
228 };
229
230 WebInspector.DOMStorageContentView.prototype.__proto__ = WebInspector.ContentView.prototype;