1 /* 2 * Copyright (C) 2008 Nokia 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 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 15 * its contributors may be used to endorse or promote products derived 16 * from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY 19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 /** 31 * @constructor 32 * @extends {WebInspector.Object} 33 * @param {string} securityOrigin 34 * @param {boolean} isLocalStorage 35 */ 36 WebInspector.DOMStorage = function(securityOrigin, isLocalStorage) 37 { 38 this._securityOrigin = securityOrigin; 39 this._isLocalStorage = isLocalStorage; 40 } 41 42 /** 43 * @param {string} securityOrigin 44 * @param {boolean} isLocalStorage 45 * @return {!DOMStorageAgent.StorageId} 46 */ 47 WebInspector.DOMStorage.storageId = function(securityOrigin, isLocalStorage) 48 { 49 return { securityOrigin: securityOrigin, isLocalStorage: isLocalStorage }; 50 } 51 52 WebInspector.DOMStorage.Events = { 53 DOMStorageItemsCleared: "DOMStorageItemsCleared", 54 DOMStorageItemRemoved: "DOMStorageItemRemoved", 55 DOMStorageItemAdded: "DOMStorageItemAdded", 56 DOMStorageItemUpdated: "DOMStorageItemUpdated" 57 } 58 59 WebInspector.DOMStorage.prototype = { 60 61 /** @return {!DOMStorageAgent.StorageId} */ 62 get id() 63 { 64 return WebInspector.DOMStorage.storageId(this._securityOrigin, this._isLocalStorage); 65 }, 66 67 /** @return {string} */ 68 get securityOrigin() 69 { 70 return this._securityOrigin; 71 }, 72 73 /** @return {boolean} */ 74 get isLocalStorage() 75 { 76 return this._isLocalStorage; 77 }, 78 79 /** 80 * @param {function(?Protocol.Error, !Array.<!DOMStorageAgent.Item>):void=} callback 81 */ 82 getItems: function(callback) 83 { 84 DOMStorageAgent.getDOMStorageItems(this.id, callback); 85 }, 86 87 /** 88 * @param {string} key 89 * @param {string} value 90 */ 91 setItem: function(key, value) 92 { 93 DOMStorageAgent.setDOMStorageItem(this.id, key, value); 94 }, 95 96 /** 97 * @param {string} key 98 */ 99 removeItem: function(key) 100 { 101 DOMStorageAgent.removeDOMStorageItem(this.id, key); 102 }, 103 104 __proto__: WebInspector.Object.prototype 105 } 106 107 /** 108 * @constructor 109 * @extends {WebInspector.Object} 110 */ 111 WebInspector.DOMStorageModel = function() 112 { 113 /** @type {!Object.<string, !WebInspector.DOMStorage>} */ 114 this._storages = {}; 115 InspectorBackend.registerDOMStorageDispatcher(new WebInspector.DOMStorageDispatcher(this)); 116 DOMStorageAgent.enable(); 117 WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this); 118 WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this); 119 } 120 121 WebInspector.DOMStorageModel.Events = { 122 DOMStorageAdded: "DOMStorageAdded", 123 DOMStorageRemoved: "DOMStorageRemoved" 124 } 125 126 WebInspector.DOMStorageModel.prototype = { 127 128 /** 129 * @param {!WebInspector.Event} event 130 */ 131 _securityOriginAdded: function(event) 132 { 133 var securityOrigin = /** @type {string} */ (event.data); 134 var localStorageKey = this._storageKey(securityOrigin, true); 135 console.assert(!this._storages[localStorageKey]); 136 var localStorage = new WebInspector.DOMStorage(securityOrigin, true); 137 this._storages[localStorageKey] = localStorage; 138 this.dispatchEventToListeners(WebInspector.DOMStorageModel.Events.DOMStorageAdded, localStorage); 139 140 var sessionStorageKey = this._storageKey(securityOrigin, false); 141 console.assert(!this._storages[sessionStorageKey]); 142 var sessionStorage = new WebInspector.DOMStorage(securityOrigin, false); 143 this._storages[sessionStorageKey] = sessionStorage; 144 this.dispatchEventToListeners(WebInspector.DOMStorageModel.Events.DOMStorageAdded, sessionStorage); 145 }, 146 147 /** 148 * @param {!WebInspector.Event} event 149 */ 150 _securityOriginRemoved: function(event) 151 { 152 var securityOrigin = /** @type {string} */ (event.data); 153 var localStorageKey = this._storageKey(securityOrigin, true); 154 var localStorage = this._storages[localStorageKey]; 155 console.assert(localStorage); 156 delete this._storages[localStorageKey]; 157 this.dispatchEventToListeners(WebInspector.DOMStorageModel.Events.DOMStorageRemoved, localStorage); 158 159 var sessionStorageKey = this._storageKey(securityOrigin, false); 160 var sessionStorage = this._storages[sessionStorageKey]; 161 console.assert(sessionStorage); 162 delete this._storages[sessionStorageKey]; 163 this.dispatchEventToListeners(WebInspector.DOMStorageModel.Events.DOMStorageRemoved, sessionStorage); 164 }, 165 166 /** 167 * @param {string} securityOrigin 168 * @param {boolean} isLocalStorage 169 * @return {string} 170 */ 171 _storageKey: function(securityOrigin, isLocalStorage) 172 { 173 return JSON.stringify(WebInspector.DOMStorage.storageId(securityOrigin, isLocalStorage)); 174 }, 175 176 /** 177 * @param {!DOMStorageAgent.StorageId} storageId 178 */ 179 _domStorageItemsCleared: function(storageId) 180 { 181 var domStorage = this.storageForId(storageId); 182 if (!domStorage) 183 return; 184 185 var eventData = {}; 186 domStorage.dispatchEventToListeners(WebInspector.DOMStorage.Events.DOMStorageItemsCleared, eventData); 187 }, 188 189 /** 190 * @param {!DOMStorageAgent.StorageId} storageId 191 * @param {string} key 192 */ 193 _domStorageItemRemoved: function(storageId, key) 194 { 195 var domStorage = this.storageForId(storageId); 196 if (!domStorage) 197 return; 198 199 var eventData = { key: key }; 200 domStorage.dispatchEventToListeners(WebInspector.DOMStorage.Events.DOMStorageItemRemoved, eventData); 201 }, 202 203 /** 204 * @param {!DOMStorageAgent.StorageId} storageId 205 * @param {string} key 206 * @param {string} value 207 */ 208 _domStorageItemAdded: function(storageId, key, value) 209 { 210 var domStorage = this.storageForId(storageId); 211 if (!domStorage) 212 return; 213 214 var eventData = { key: key, value: value }; 215 domStorage.dispatchEventToListeners(WebInspector.DOMStorage.Events.DOMStorageItemAdded, eventData); 216 }, 217 218 /** 219 * @param {!DOMStorageAgent.StorageId} storageId 220 * @param {string} key 221 * @param {string} oldValue 222 * @param {string} value 223 */ 224 _domStorageItemUpdated: function(storageId, key, oldValue, value) 225 { 226 var domStorage = this.storageForId(storageId); 227 if (!domStorage) 228 return; 229 230 var eventData = { key: key, oldValue: oldValue, value: value }; 231 domStorage.dispatchEventToListeners(WebInspector.DOMStorage.Events.DOMStorageItemUpdated, eventData); 232 }, 233 234 /** 235 * @param {!DOMStorageAgent.StorageId} storageId 236 * @return {!WebInspector.DOMStorage} 237 */ 238 storageForId: function(storageId) 239 { 240 return this._storages[JSON.stringify(storageId)]; 241 }, 242 243 /** 244 * @return {!Array.<!WebInspector.DOMStorage>} 245 */ 246 storages: function() 247 { 248 var result = []; 249 for (var id in this._storages) 250 result.push(this._storages[id]); 251 return result; 252 }, 253 254 __proto__: WebInspector.Object.prototype 255 } 256 257 /** 258 * @constructor 259 * @implements {DOMStorageAgent.Dispatcher} 260 * @param {!WebInspector.DOMStorageModel} model 261 */ 262 WebInspector.DOMStorageDispatcher = function(model) 263 { 264 this._model = model; 265 } 266 267 WebInspector.DOMStorageDispatcher.prototype = { 268 269 /** 270 * @param {!DOMStorageAgent.StorageId} storageId 271 */ 272 domStorageItemsCleared: function(storageId) 273 { 274 this._model._domStorageItemsCleared(storageId); 275 }, 276 277 /** 278 * @param {!DOMStorageAgent.StorageId} storageId 279 * @param {string} key 280 */ 281 domStorageItemRemoved: function(storageId, key) 282 { 283 this._model._domStorageItemRemoved(storageId, key); 284 }, 285 286 /** 287 * @param {!DOMStorageAgent.StorageId} storageId 288 * @param {string} key 289 * @param {string} value 290 */ 291 domStorageItemAdded: function(storageId, key, value) 292 { 293 this._model._domStorageItemAdded(storageId, key, value); 294 }, 295 296 /** 297 * @param {!DOMStorageAgent.StorageId} storageId 298 * @param {string} key 299 * @param {string} oldValue 300 * @param {string} value 301 */ 302 domStorageItemUpdated: function(storageId, key, oldValue, value) 303 { 304 this._model._domStorageItemUpdated(storageId, key, oldValue, value); 305 }, 306 } 307 308 /** 309 * @type {!WebInspector.DOMStorageModel} 310 */ 311 WebInspector.domStorageModel; 312