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