summaryrefslogtreecommitdiffstats
path: root/webkit/dom_storage/dom_storage_cached_area.h
blob: fc1968ed30f6f1f250944ec86c5bdd5ae6f76089 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef WEBKIT_DOM_STORAGE_DOM_STORAGE_CACHED_AREA_H_
#define WEBKIT_DOM_STORAGE_DOM_STORAGE_CACHED_AREA_H_

#include <map>

#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/nullable_string16.h"
#include "googleurl/src/gurl.h"

namespace dom_storage {

class DomStorageMap;
class DomStorageProxy;

// Unlike the other classes in the dom_storage library, this one is intended
// for use in renderer processes. It maintains a complete cache of the
// origin's Map of key/value pairs for fast access. The cache is primed on
// first access and changes are written to the backend thru the |proxy|.
// Mutations originating in other processes are applied to the cache via
// the ApplyMutation method.
class DomStorageCachedArea : public base::RefCounted<DomStorageCachedArea> {
 public:
  DomStorageCachedArea(int64 namespace_id, const GURL& origin,
                       DomStorageProxy* proxy);

  int64 namespace_id() const { return namespace_id_; }
  const GURL& origin() const { return origin_; }

  unsigned GetLength(int connection_id);
  NullableString16 GetKey(int connection_id, unsigned index);
  NullableString16 GetItem(int connection_id, const string16& key);
  bool SetItem(int connection_id, const string16& key, const string16& value,
               const GURL& page_url);
  void RemoveItem(int connection_id, const string16& key,
                  const GURL& page_url);
  void Clear(int connection_id, const GURL& page_url);

  void ApplyMutation(const NullableString16& key,
                     const NullableString16& new_value);

  size_t MemoryBytesUsedByCache() const;

 private:
  friend class DomStorageCachedAreaTest;
  friend class base::RefCounted<DomStorageCachedArea>;
  ~DomStorageCachedArea();

  // Primes the cache, loading all values for the area.
  void Prime(int connection_id);
  void PrimeIfNeeded(int connection_id) {
    if (!map_)
      Prime(connection_id);
  }

  // Resets the object back to its newly constructed state.
  void Reset();

  // Async completion callbacks for proxied operations.
  // These are used to maintain cache consistency by preventing
  // mutation events from other processes from overwriting local
  // changes made after the mutation.
  void OnLoadComplete(bool success);
  void OnSetItemComplete(const string16& key, bool success);
  void OnClearComplete(bool success);
  void OnRemoveItemComplete(const string16& key, bool success);

  bool should_ignore_key_mutation(const string16& key) const {
    return ignore_key_mutations_.find(key) != ignore_key_mutations_.end();
  }

  bool ignore_all_mutations_;
  std::map<string16, int> ignore_key_mutations_;

  int64 namespace_id_;
  GURL origin_;
  scoped_refptr<DomStorageMap> map_;
  scoped_refptr<DomStorageProxy> proxy_;
  base::WeakPtrFactory<DomStorageCachedArea> weak_factory_;
};

}  // namespace dom_storage

#endif  // WEBKIT_DOM_STORAGE_DOM_STORAGE_CACHED_AREA_H_