OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_STORAGE_H_ | 5 #ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_STORAGE_H_ |
6 #define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_STORAGE_H_ | 6 #define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_STORAGE_H_ |
7 | 7 |
| 8 #include <deque> |
8 #include <map> | 9 #include <map> |
9 #include <set> | 10 #include <set> |
10 #include <vector> | 11 #include <vector> |
11 | 12 |
12 #include "base/bind.h" | 13 #include "base/bind.h" |
13 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
14 #include "base/gtest_prod_util.h" | 15 #include "base/gtest_prod_util.h" |
15 #include "base/memory/scoped_vector.h" | 16 #include "base/memory/scoped_vector.h" |
16 #include "base/memory/weak_ptr.h" | 17 #include "base/memory/weak_ptr.h" |
17 #include "content/browser/service_worker/service_worker_database.h" | 18 #include "content/browser/service_worker/service_worker_database.h" |
(...skipping 28 matching lines...) Expand all Loading... |
46 typedef base::Callback<void(ServiceWorkerStatusCode status, | 47 typedef base::Callback<void(ServiceWorkerStatusCode status, |
47 const scoped_refptr<ServiceWorkerRegistration>& | 48 const scoped_refptr<ServiceWorkerRegistration>& |
48 registration)> FindRegistrationCallback; | 49 registration)> FindRegistrationCallback; |
49 typedef base::Callback< | 50 typedef base::Callback< |
50 void(const std::vector<ServiceWorkerRegistrationInfo>& registrations)> | 51 void(const std::vector<ServiceWorkerRegistrationInfo>& registrations)> |
51 GetAllRegistrationInfosCallback; | 52 GetAllRegistrationInfosCallback; |
52 typedef base::Callback< | 53 typedef base::Callback< |
53 void(ServiceWorkerStatusCode status, int result)> | 54 void(ServiceWorkerStatusCode status, int result)> |
54 CompareCallback; | 55 CompareCallback; |
55 | 56 |
56 struct InitialData { | |
57 int64 next_registration_id; | |
58 int64 next_version_id; | |
59 int64 next_resource_id; | |
60 std::set<GURL> origins; | |
61 | |
62 InitialData(); | |
63 ~InitialData(); | |
64 }; | |
65 | |
66 ServiceWorkerStorage(const base::FilePath& path, | 57 ServiceWorkerStorage(const base::FilePath& path, |
67 base::WeakPtr<ServiceWorkerContextCore> context, | 58 base::WeakPtr<ServiceWorkerContextCore> context, |
68 base::SequencedTaskRunner* database_task_runner, | 59 base::SequencedTaskRunner* database_task_runner, |
69 base::MessageLoopProxy* disk_cache_thread, | 60 base::MessageLoopProxy* disk_cache_thread, |
70 quota::QuotaManagerProxy* quota_manager_proxy); | 61 quota::QuotaManagerProxy* quota_manager_proxy); |
71 ~ServiceWorkerStorage(); | 62 ~ServiceWorkerStorage(); |
72 | 63 |
73 // Finds registration for |document_url| or |pattern| or |registration_id|. | 64 // Finds registration for |document_url| or |pattern| or |registration_id|. |
74 // The Find methods will find stored and initially installing registrations. | 65 // The Find methods will find stored and initially installing registrations. |
75 // Returns SERVICE_WORKER_OK with non-null registration if registration | 66 // Returns SERVICE_WORKER_OK with non-null registration if registration |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 | 115 |
125 // Intended for use only by ServiceWorkerRegisterJob. | 116 // Intended for use only by ServiceWorkerRegisterJob. |
126 void NotifyInstallingRegistration( | 117 void NotifyInstallingRegistration( |
127 ServiceWorkerRegistration* registration); | 118 ServiceWorkerRegistration* registration); |
128 void NotifyDoneInstallingRegistration( | 119 void NotifyDoneInstallingRegistration( |
129 ServiceWorkerRegistration* registration); | 120 ServiceWorkerRegistration* registration); |
130 | 121 |
131 private: | 122 private: |
132 friend class ServiceWorkerStorageTest; | 123 friend class ServiceWorkerStorageTest; |
133 | 124 |
| 125 struct InitialData { |
| 126 int64 next_registration_id; |
| 127 int64 next_version_id; |
| 128 int64 next_resource_id; |
| 129 std::set<GURL> origins; |
| 130 |
| 131 InitialData(); |
| 132 ~InitialData(); |
| 133 }; |
| 134 |
134 typedef std::vector<ServiceWorkerDatabase::RegistrationData> RegistrationList; | 135 typedef std::vector<ServiceWorkerDatabase::RegistrationData> RegistrationList; |
135 typedef std::vector<ServiceWorkerDatabase::ResourceRecord> ResourceList; | 136 typedef std::vector<ServiceWorkerDatabase::ResourceRecord> ResourceList; |
| 137 typedef std::map<int64, scoped_refptr<ServiceWorkerRegistration> > |
| 138 RegistrationRefsById; |
| 139 typedef base::Callback<void( |
| 140 ServiceWorkerStorage::InitialData* data, |
| 141 ServiceWorkerDatabase::Status status)> InitializeCallback; |
| 142 typedef base::Callback<void( |
| 143 const GURL& origin, |
| 144 const std::vector<int64>& newly_purgeable_resources, |
| 145 ServiceWorkerDatabase::Status status)> WriteRegistrationCallback; |
| 146 typedef base::Callback<void( |
| 147 bool origin_is_deletable, |
| 148 const std::vector<int64>& newly_purgeable_resources, |
| 149 ServiceWorkerDatabase::Status status)> DeleteRegistrationCallback; |
| 150 typedef base::Callback<void( |
| 151 const ServiceWorkerDatabase::RegistrationData& data, |
| 152 const ResourceList& resources, |
| 153 ServiceWorkerDatabase::Status status)> FindInDBCallback; |
| 154 |
| 155 base::FilePath GetDatabasePath(); |
| 156 base::FilePath GetDiskCachePath(); |
136 | 157 |
137 bool LazyInitialize( | 158 bool LazyInitialize( |
138 const base::Closure& callback); | 159 const base::Closure& callback); |
139 void DidReadInitialData( | 160 void DidReadInitialData( |
140 InitialData* data, | 161 InitialData* data, |
141 ServiceWorkerDatabase::Status status); | 162 ServiceWorkerDatabase::Status status); |
142 void DidGetRegistrationsForPattern( | 163 void DidFindRegistrationForDocument( |
| 164 const GURL& document_url, |
| 165 const FindRegistrationCallback& callback, |
| 166 const ServiceWorkerDatabase::RegistrationData& data, |
| 167 const ResourceList& resources, |
| 168 ServiceWorkerDatabase::Status status); |
| 169 void DidFindRegistrationForPattern( |
143 const GURL& scope, | 170 const GURL& scope, |
144 const FindRegistrationCallback& callback, | 171 const FindRegistrationCallback& callback, |
145 RegistrationList* registrations, | 172 const ServiceWorkerDatabase::RegistrationData& data, |
| 173 const ResourceList& resources, |
146 ServiceWorkerDatabase::Status status); | 174 ServiceWorkerDatabase::Status status); |
147 void DidGetRegistrationsForDocument( | 175 void DidFindRegistrationForId( |
148 const GURL& scope, | |
149 const FindRegistrationCallback& callback, | 176 const FindRegistrationCallback& callback, |
150 RegistrationList* registrations, | 177 const ServiceWorkerDatabase::RegistrationData& data, |
151 ServiceWorkerDatabase::Status status); | 178 const ResourceList& resources, |
152 void DidReadRegistrationForId( | |
153 const FindRegistrationCallback& callback, | |
154 ServiceWorkerDatabase::RegistrationData* registration, | |
155 ResourceList* resources, | |
156 ServiceWorkerDatabase::Status status); | 179 ServiceWorkerDatabase::Status status); |
157 void DidGetAllRegistrations( | 180 void DidGetAllRegistrations( |
158 const GetAllRegistrationInfosCallback& callback, | 181 const GetAllRegistrationInfosCallback& callback, |
159 RegistrationList* registrations, | 182 RegistrationList* registrations, |
160 ServiceWorkerDatabase::Status status); | 183 ServiceWorkerDatabase::Status status); |
161 void DidStoreRegistration( | 184 void DidStoreRegistration( |
| 185 const StatusCallback& callback, |
162 const GURL& origin, | 186 const GURL& origin, |
163 const StatusCallback& callback, | 187 const std::vector<int64>& newly_purgeable_resources, |
164 ServiceWorkerDatabase::Status status); | 188 ServiceWorkerDatabase::Status status); |
165 void DidUpdateToActiveState( | 189 void DidUpdateToActiveState( |
166 const StatusCallback& callback, | 190 const StatusCallback& callback, |
167 ServiceWorkerDatabase::Status status); | 191 ServiceWorkerDatabase::Status status); |
168 void DidDeleteRegistration( | 192 void DidDeleteRegistration( |
169 const GURL& origin, | 193 const GURL& origin, |
170 const StatusCallback& callback, | 194 const StatusCallback& callback, |
171 bool origin_is_deletable, | 195 bool origin_is_deletable, |
| 196 const std::vector<int64>& newly_purgeable_resources, |
172 ServiceWorkerDatabase::Status status); | 197 ServiceWorkerDatabase::Status status); |
173 | 198 |
174 scoped_refptr<ServiceWorkerRegistration> CreateRegistration( | 199 scoped_refptr<ServiceWorkerRegistration> GetOrCreateRegistration( |
175 const ServiceWorkerDatabase::RegistrationData& data); | 200 const ServiceWorkerDatabase::RegistrationData& data, |
| 201 const ResourceList& resources); |
176 ServiceWorkerRegistration* FindInstallingRegistrationForDocument( | 202 ServiceWorkerRegistration* FindInstallingRegistrationForDocument( |
177 const GURL& document_url); | 203 const GURL& document_url); |
178 ServiceWorkerRegistration* FindInstallingRegistrationForPattern( | 204 ServiceWorkerRegistration* FindInstallingRegistrationForPattern( |
179 const GURL& scope); | 205 const GURL& scope); |
180 ServiceWorkerRegistration* FindInstallingRegistrationForId( | 206 ServiceWorkerRegistration* FindInstallingRegistrationForId( |
181 int64 registration_id); | 207 int64 registration_id); |
182 | 208 |
183 // For finding registrations being installed. | |
184 typedef std::map<int64, scoped_refptr<ServiceWorkerRegistration> > | |
185 RegistrationRefsById; | |
186 RegistrationRefsById installing_registrations_; | |
187 | |
188 // Lazy disk_cache getter. | 209 // Lazy disk_cache getter. |
189 ServiceWorkerDiskCache* disk_cache(); | 210 ServiceWorkerDiskCache* disk_cache(); |
| 211 void OnDiskCacheInitialized(int rv); |
| 212 |
| 213 void StartPurgingResources(const std::vector<int64>& ids); |
| 214 void PurgeResource(int64 id); |
| 215 void OnResourcePurged(int64 id, int rv); |
| 216 |
| 217 // Static cross-thread helpers. |
| 218 static void ReadInitialDataFromDB( |
| 219 ServiceWorkerDatabase* database, |
| 220 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| 221 const InitializeCallback& callback); |
| 222 static void ServiceWorkerStorage::DeleteRegistrationFromDB( |
| 223 ServiceWorkerDatabase* database, |
| 224 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| 225 int64 registration_id, |
| 226 const GURL& origin, |
| 227 const DeleteRegistrationCallback& callback); |
| 228 static void WriteRegistrationInDB( |
| 229 ServiceWorkerDatabase* database, |
| 230 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| 231 const ServiceWorkerDatabase::RegistrationData& registration, |
| 232 const ResourceList& resources, |
| 233 const WriteRegistrationCallback& callback); |
| 234 static void FindForDocumentInDB( |
| 235 ServiceWorkerDatabase* database, |
| 236 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| 237 const GURL& document_url, |
| 238 const FindInDBCallback& callback); |
| 239 static void FindForPatternInDB( |
| 240 ServiceWorkerDatabase* database, |
| 241 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| 242 const GURL& scope, |
| 243 const FindInDBCallback& callback); |
| 244 static void FindForIdInDB( |
| 245 ServiceWorkerDatabase* database, |
| 246 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| 247 int64 registration_id, |
| 248 const GURL& origin, |
| 249 const FindInDBCallback& callback); |
| 250 |
| 251 // For finding registrations being installed. |
| 252 RegistrationRefsById installing_registrations_; |
190 | 253 |
191 // Origins having registations. | 254 // Origins having registations. |
192 std::set<GURL> registered_origins_; | 255 std::set<GURL> registered_origins_; |
193 | 256 |
194 // Pending database tasks waiting for initialization. | 257 // Pending database tasks waiting for initialization. |
195 std::vector<base::Closure> pending_tasks_; | 258 std::vector<base::Closure> pending_tasks_; |
196 | 259 |
197 int64 next_registration_id_; | 260 int64 next_registration_id_; |
198 int64 next_version_id_; | 261 int64 next_version_id_; |
199 int64 next_resource_id_; | 262 int64 next_resource_id_; |
200 | 263 |
201 enum State { | 264 enum State { |
202 UNINITIALIZED, | 265 UNINITIALIZED, |
203 INITIALIZING, | 266 INITIALIZING, |
204 INITIALIZED, | 267 INITIALIZED, |
205 DISABLED, | 268 DISABLED, |
206 }; | 269 }; |
207 State state_; | 270 State state_; |
208 | 271 |
209 base::FilePath path_; | 272 base::FilePath path_; |
210 base::WeakPtr<ServiceWorkerContextCore> context_; | 273 base::WeakPtr<ServiceWorkerContextCore> context_; |
211 | 274 |
212 // Only accessed on |database_task_runner_|. | 275 // Only accessed on |database_task_runner_|. |
213 scoped_ptr<ServiceWorkerDatabase> database_; | 276 scoped_ptr<ServiceWorkerDatabase> database_; |
214 | 277 |
215 scoped_refptr<base::SequencedTaskRunner> database_task_runner_; | 278 scoped_refptr<base::SequencedTaskRunner> database_task_runner_; |
216 scoped_refptr<base::MessageLoopProxy> disk_cache_thread_; | 279 scoped_refptr<base::MessageLoopProxy> disk_cache_thread_; |
217 scoped_refptr<quota::QuotaManagerProxy> quota_manager_proxy_; | 280 scoped_refptr<quota::QuotaManagerProxy> quota_manager_proxy_; |
218 scoped_ptr<ServiceWorkerDiskCache> disk_cache_; | 281 scoped_ptr<ServiceWorkerDiskCache> disk_cache_; |
| 282 std::deque<int64> purgeable_reource_ids_; |
| 283 bool is_purge_pending_; |
219 | 284 |
220 base::WeakPtrFactory<ServiceWorkerStorage> weak_factory_; | 285 base::WeakPtrFactory<ServiceWorkerStorage> weak_factory_; |
221 | 286 |
222 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerStorage); | 287 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerStorage); |
223 }; | 288 }; |
224 | 289 |
225 } // namespace content | 290 } // namespace content |
226 | 291 |
227 #endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_STORAGE_H_ | 292 #endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_STORAGE_H_ |
OLD | NEW |