OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this |
2 // source code is governed by a BSD-style license that can be found in the | 2 // source code is governed by a BSD-style license that can be found in the |
3 // LICENSE file. | 3 // LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_IN_PROCESS_WEBKIT_DOM_STORAGE_CONTEXT_H_ | 5 #ifndef CHROME_BROWSER_IN_PROCESS_WEBKIT_DOM_STORAGE_CONTEXT_H_ |
6 #define CHROME_BROWSER_IN_PROCESS_WEBKIT_DOM_STORAGE_CONTEXT_H_ | 6 #define CHROME_BROWSER_IN_PROCESS_WEBKIT_DOM_STORAGE_CONTEXT_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <set> | 9 #include <set> |
10 | 10 |
(...skipping 10 matching lines...) Expand all Loading... |
21 // the same profile. The specifics of responsibilities are fairly well | 21 // the same profile. The specifics of responsibilities are fairly well |
22 // documented here and in StorageNamespace and StorageArea. Everything is only | 22 // documented here and in StorageNamespace and StorageArea. Everything is only |
23 // to be accessed on the WebKit thread unless noted otherwise. | 23 // to be accessed on the WebKit thread unless noted otherwise. |
24 // | 24 // |
25 // NOTE: Virtual methods facilitate mocking functions for testing. | 25 // NOTE: Virtual methods facilitate mocking functions for testing. |
26 class DOMStorageContext { | 26 class DOMStorageContext { |
27 public: | 27 public: |
28 explicit DOMStorageContext(WebKitContext* webkit_context); | 28 explicit DOMStorageContext(WebKitContext* webkit_context); |
29 virtual ~DOMStorageContext(); | 29 virtual ~DOMStorageContext(); |
30 | 30 |
31 // Get the local storage instance. The pointer is owned by this class. | 31 // Allocate a new storage area id. Only call on the WebKit thread. |
32 DOMStorageNamespace* LocalStorage(); | 32 int64 AllocateStorageAreaId(); |
33 | 33 |
34 // Get a new session storage namespace (but it's still owned by this class). | 34 // Allocate a new session storage id. Only call on the UI or IO thread. |
35 DOMStorageNamespace* NewSessionStorage(); | 35 int64 AllocateSessionStorageNamespaceId(); |
36 | 36 |
37 // Allocate a new storage ___ id. | 37 // Clones a session storage namespace and returns the cloned namespaces' id. |
38 int64 AllocateStorageAreaId() { return ++last_storage_area_id_; } | 38 // Only call on the IO thread. |
39 int64 AllocateStorageNamespaceId() { return ++last_storage_namespace_id_; } | 39 int64 CloneSessionStorage(int64 original_id); |
40 | 40 |
41 // Various storage area methods. The storage area is owned by one of the | 41 // Various storage area methods. The storage area is owned by one of the |
42 // namespaces that's owned by this class. | 42 // namespaces that's owned by this class. |
43 void RegisterStorageArea(DOMStorageArea* storage_area); | 43 void RegisterStorageArea(DOMStorageArea* storage_area); |
44 void UnregisterStorageArea(DOMStorageArea* storage_area); | 44 void UnregisterStorageArea(DOMStorageArea* storage_area); |
45 DOMStorageArea* GetStorageArea(int64 id); | 45 DOMStorageArea* GetStorageArea(int64 id); |
46 | 46 |
47 // Get a namespace from an id. What's returned is owned by this class. The | 47 // Called on WebKit thread when a session storage namespace can be deleted. |
48 // caller of GetStorageNamespace must immediately register itself with the | 48 void DeleteSessionStorageNamespace(int64 namespace_id); |
49 // returned StorageNamespace. | 49 |
50 void RegisterStorageNamespace(DOMStorageNamespace* storage_namespace); | 50 // Get a namespace from an id. What's returned is owned by this class. If |
51 void UnregisterStorageNamespace(DOMStorageNamespace* storage_namespace); | 51 // allocation_allowed is true, then this function will create the storage |
52 DOMStorageNamespace* GetStorageNamespace(int64 id); | 52 // namespace if it hasn't been already. |
| 53 DOMStorageNamespace* GetStorageNamespace(int64 id, bool allocation_allowed); |
53 | 54 |
54 // Sometimes an event from one DOM storage dispatcher host requires | 55 // Sometimes an event from one DOM storage dispatcher host requires |
55 // communication to all of them. | 56 // communication to all of them. |
56 typedef std::set<DOMStorageDispatcherHost*> DispatcherHostSet; | 57 typedef std::set<DOMStorageDispatcherHost*> DispatcherHostSet; |
57 void RegisterDispatcherHost(DOMStorageDispatcherHost* dispatcher_host); | 58 void RegisterDispatcherHost(DOMStorageDispatcherHost* dispatcher_host); |
58 void UnregisterDispatcherHost(DOMStorageDispatcherHost* dispatcher_host); | 59 void UnregisterDispatcherHost(DOMStorageDispatcherHost* dispatcher_host); |
59 const DispatcherHostSet* GetDispatcherHostSet() const; | 60 const DispatcherHostSet* GetDispatcherHostSet() const; |
60 | 61 |
61 // Tells storage namespaces to purge any memory they do not need. | 62 // Tells storage namespaces to purge any memory they do not need. |
62 virtual void PurgeMemory(); | 63 virtual void PurgeMemory(); |
63 | 64 |
64 // Delete any local storage files that have been touched since the cutoff | 65 // Delete any local storage files that have been touched since the cutoff |
65 // date that's supplied. | 66 // date that's supplied. |
66 void DeleteDataModifiedSince(const base::Time& cutoff); | 67 void DeleteDataModifiedSince(const base::Time& cutoff); |
67 | 68 |
68 // The special ID used for local storage. | 69 private: |
69 static const int64 kLocalStorageNamespaceId = 0; | 70 // Get the local storage instance. The object is owned by this class. |
| 71 DOMStorageNamespace* CreateLocalStorage(); |
70 | 72 |
71 private: | 73 // Get a new session storage namespace. The object is owned by this class. |
72 // The last used storage_area_id and storage_namespace_id's. | 74 DOMStorageNamespace* CreateSessionStorage(int64 namespace_id); |
73 static const int64 kFirstStorageAreaId = 1; | 75 |
| 76 // Used internally to register storage namespaces we create. |
| 77 void RegisterStorageNamespace(DOMStorageNamespace* storage_namespace); |
| 78 |
| 79 // The WebKit thread half of CloneSessionStorage above. Static because we |
| 80 // DOMStorageContext isn't ref counted and so we can't use a runnable method. |
| 81 // That said, we know this is safe because this class is destroyed on the |
| 82 // WebKit thread, so there's no way it could be destroyed before this is run. |
| 83 static void CompleteCloningSessionStorage(DOMStorageContext* context, |
| 84 int64 existing_id, int64 clone_id); |
| 85 |
| 86 // The last used storage_area_id and storage_namespace_id's. For the storage |
| 87 // namespaces, IDs allocated on the UI thread are positive and count up while |
| 88 // IDs allocated on the IO thread are negative and count down. This allows us |
| 89 // to allocate unique IDs on both without any locking. All storage area ids |
| 90 // are allocated on the WebKit thread. |
74 int64 last_storage_area_id_; | 91 int64 last_storage_area_id_; |
75 static const int64 kFirstStorageNamespaceId = 1; | 92 int64 last_session_storage_namespace_id_on_ui_thread_; |
76 int64 last_storage_namespace_id_; | 93 int64 last_session_storage_namespace_id_on_io_thread_; |
77 | 94 |
78 // We're owned by this WebKit context. Used while instantiating LocalStorage. | 95 // We're owned by this WebKit context. Used while instantiating LocalStorage. |
79 WebKitContext* webkit_context_; | 96 WebKitContext* webkit_context_; |
80 | 97 |
81 // All the DOMStorageDispatcherHosts that are attached to us. ONLY USE ON THE | 98 // All the DOMStorageDispatcherHosts that are attached to us. ONLY USE ON THE |
82 // IO THREAD! | 99 // IO THREAD! |
83 DispatcherHostSet dispatcher_host_set_; | 100 DispatcherHostSet dispatcher_host_set_; |
84 | 101 |
85 // Maps ids to StorageAreas. We do NOT own these objects. StorageNamespace | 102 // Maps ids to StorageAreas. We do NOT own these objects. StorageNamespace |
86 // (which does own them) will notify us when we should remove the entries. | 103 // (which does own them) will notify us when we should remove the entries. |
87 typedef std::map<int64, DOMStorageArea*> StorageAreaMap; | 104 typedef std::map<int64, DOMStorageArea*> StorageAreaMap; |
88 StorageAreaMap storage_area_map_; | 105 StorageAreaMap storage_area_map_; |
89 | 106 |
90 // Maps ids to StorageNamespaces. We own these objects. | 107 // Maps ids to StorageNamespaces. We own these objects. |
91 typedef std::map<int64, DOMStorageNamespace*> StorageNamespaceMap; | 108 typedef std::map<int64, DOMStorageNamespace*> StorageNamespaceMap; |
92 StorageNamespaceMap storage_namespace_map_; | 109 StorageNamespaceMap storage_namespace_map_; |
93 | 110 |
94 DISALLOW_IMPLICIT_CONSTRUCTORS(DOMStorageContext); | 111 DISALLOW_IMPLICIT_CONSTRUCTORS(DOMStorageContext); |
95 }; | 112 }; |
96 | 113 |
97 #endif // CHROME_BROWSER_IN_PROCESS_WEBKIT_DOM_STORAGE_CONTEXT_H_ | 114 #endif // CHROME_BROWSER_IN_PROCESS_WEBKIT_DOM_STORAGE_CONTEXT_H_ |
OLD | NEW |