15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifndef CONTENT_RENDERER_DOM_STORAGE_DOM_STORAGE_CACHED_AREA_H_ 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define CONTENT_RENDERER_DOM_STORAGE_DOM_STORAGE_CACHED_AREA_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/nullable_string16.h" 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/common/content_export.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace content { 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 18bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass DOMStorageMap; 19bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass DOMStorageProxy; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unlike the other classes in the dom_storage library, this one is intended 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for use in renderer processes. It maintains a complete cache of the 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// origin's Map of key/value pairs for fast access. The cache is primed on 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first access and changes are written to the backend thru the |proxy|. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mutations originating in other processes are applied to the cache via 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the ApplyMutation method. 27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass CONTENT_EXPORT DOMStorageCachedArea 28bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch : public base::RefCounted<DOMStorageCachedArea> { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DOMStorageCachedArea(int64 namespace_id, 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const GURL& origin, 32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DOMStorageProxy* proxy); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 namespace_id() const { return namespace_id_; } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& origin() const { return origin_; } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned GetLength(int connection_id); 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::NullableString16 GetKey(int connection_id, unsigned index); 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::NullableString16 GetItem(int connection_id, const base::string16& key); 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool SetItem(int connection_id, 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& key, 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& value, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url); 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void RemoveItem(int connection_id, 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::string16& key, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(int connection_id, const GURL& page_url); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void ApplyMutation(const base::NullableString16& key, 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::NullableString16& new_value); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t MemoryBytesUsedByCache() const; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Resets the object back to its newly constructed state. 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Reset(); 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 58bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch friend class DOMStorageCachedAreaTest; 59bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch friend class base::RefCounted<DOMStorageCachedArea>; 60bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch ~DOMStorageCachedArea(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Primes the cache, loading all values for the area. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Prime(int connection_id); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrimeIfNeeded(int connection_id) { 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!map_.get()) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Prime(connection_id); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Async completion callbacks for proxied operations. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are used to maintain cache consistency by preventing 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mutation events from other processes from overwriting local 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changes made after the mutation. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnLoadComplete(bool success); 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnSetItemComplete(const base::string16& key, bool success); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnClearComplete(bool success); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnRemoveItemComplete(const base::string16& key, bool success); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool should_ignore_key_mutation(const base::string16& key) const { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ignore_key_mutations_.find(key) != ignore_key_mutations_.end(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ignore_all_mutations_; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::map<base::string16, int> ignore_key_mutations_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 namespace_id_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL origin_; 87bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<DOMStorageMap> map_; 88bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<DOMStorageProxy> proxy_; 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Sometimes, we need to send messages to the browser for each get access, 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // for logging purposes. However, we only do this for a fixed maximum number 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // of gets. Here, we keep track of how many remaining get log messages we 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // need to send. 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int remaining_log_get_messages_; 94bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::WeakPtrFactory<DOMStorageCachedArea> weak_factory_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace content 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif // CONTENT_RENDERER_DOM_STORAGE_DOM_STORAGE_CACHED_AREA_H_ 100