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 <deque> |
9 #include <map> | 9 #include <map> |
10 #include <set> | 10 #include <set> |
11 #include <string> | 11 #include <string> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "base/bind.h" | 14 #include "base/bind.h" |
15 #include "base/files/file_path.h" | 15 #include "base/files/file_path.h" |
16 #include "base/gtest_prod_util.h" | 16 #include "base/gtest_prod_util.h" |
17 #include "base/memory/scoped_vector.h" | 17 #include "base/memory/scoped_vector.h" |
18 #include "base/memory/weak_ptr.h" | 18 #include "base/memory/weak_ptr.h" |
19 #include "content/browser/service_worker/service_worker_database.h" | 19 #include "content/browser/service_worker/service_worker_database.h" |
20 #include "content/browser/service_worker/service_worker_database_task_manager.h" | 20 #include "content/browser/service_worker/service_worker_database_task_manager.h" |
| 21 #include "content/browser/service_worker/service_worker_metrics.h" |
21 #include "content/browser/service_worker/service_worker_version.h" | 22 #include "content/browser/service_worker/service_worker_version.h" |
22 #include "content/common/content_export.h" | 23 #include "content/common/content_export.h" |
23 #include "content/common/service_worker/service_worker_status_code.h" | 24 #include "content/common/service_worker/service_worker_status_code.h" |
24 #include "url/gurl.h" | 25 #include "url/gurl.h" |
25 | 26 |
26 namespace base { | 27 namespace base { |
27 class SequencedTaskRunner; | 28 class SequencedTaskRunner; |
28 class SingleThreadTaskRunner; | 29 class SingleThreadTaskRunner; |
29 } | 30 } |
30 | 31 |
31 namespace storage { | 32 namespace storage { |
32 class QuotaManagerProxy; | 33 class QuotaManagerProxy; |
33 class SpecialStoragePolicy; | 34 class SpecialStoragePolicy; |
34 } | 35 } |
35 | 36 |
36 namespace content { | 37 namespace content { |
37 | 38 |
38 class ServiceWorkerContextCore; | 39 class ServiceWorkerContextCore; |
39 class ServiceWorkerDiskCache; | 40 class ServiceWorkerDiskCache; |
| 41 class ServiceWorkerDiskCacheMigrator; |
40 class ServiceWorkerRegistration; | 42 class ServiceWorkerRegistration; |
41 class ServiceWorkerResponseMetadataWriter; | 43 class ServiceWorkerResponseMetadataWriter; |
42 class ServiceWorkerResponseReader; | 44 class ServiceWorkerResponseReader; |
43 class ServiceWorkerResponseWriter; | 45 class ServiceWorkerResponseWriter; |
44 struct ServiceWorkerRegistrationInfo; | 46 struct ServiceWorkerRegistrationInfo; |
45 | 47 |
46 // This class provides an interface to store and retrieve ServiceWorker | 48 // This class provides an interface to store and retrieve ServiceWorker |
47 // registration data. | 49 // registration data. |
48 class CONTENT_EXPORT ServiceWorkerStorage | 50 class CONTENT_EXPORT ServiceWorkerStorage |
49 : NON_EXPORTED_BASE(public ServiceWorkerVersion::Listener) { | 51 : NON_EXPORTED_BASE(public ServiceWorkerVersion::Listener) { |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 | 208 |
207 // |resources| must already be on the purgeable list. | 209 // |resources| must already be on the purgeable list. |
208 void PurgeResources(const ResourceList& resources); | 210 void PurgeResources(const ResourceList& resources); |
209 | 211 |
210 private: | 212 private: |
211 friend class ServiceWorkerHandleTest; | 213 friend class ServiceWorkerHandleTest; |
212 friend class ServiceWorkerStorageTest; | 214 friend class ServiceWorkerStorageTest; |
213 friend class ServiceWorkerResourceStorageTest; | 215 friend class ServiceWorkerResourceStorageTest; |
214 friend class ServiceWorkerControlleeRequestHandlerTest; | 216 friend class ServiceWorkerControlleeRequestHandlerTest; |
215 friend class ServiceWorkerContextRequestHandlerTest; | 217 friend class ServiceWorkerContextRequestHandlerTest; |
| 218 friend class ServiceWorkerDiskCacheMigratorTest; |
216 friend class ServiceWorkerRequestHandlerTest; | 219 friend class ServiceWorkerRequestHandlerTest; |
217 friend class ServiceWorkerURLRequestJobTest; | 220 friend class ServiceWorkerURLRequestJobTest; |
218 friend class ServiceWorkerVersionBrowserTest; | 221 friend class ServiceWorkerVersionBrowserTest; |
219 friend class ServiceWorkerVersionTest; | 222 friend class ServiceWorkerVersionTest; |
220 friend class ServiceWorkerWriteToCacheJobTest; | 223 friend class ServiceWorkerWriteToCacheJobTest; |
| 224 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerDiskCacheMigratorTest, |
| 225 MigrateOnDiskCacheAccess); |
| 226 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerDiskCacheMigratorTest, |
| 227 NotMigrateOnDatabaseAccess); |
| 228 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerDiskCacheMigratorTest, |
| 229 NotMigrateForEmptyDatabase); |
221 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerDispatcherHostTest, | 230 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerDispatcherHostTest, |
222 CleanupOnRendererCrash); | 231 CleanupOnRendererCrash); |
223 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageTest, | 232 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageTest, |
224 DeleteRegistration_NoLiveVersion); | 233 DeleteRegistration_NoLiveVersion); |
225 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageTest, | 234 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageTest, |
226 DeleteRegistration_WaitingVersion); | 235 DeleteRegistration_WaitingVersion); |
227 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageTest, | 236 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageTest, |
228 DeleteRegistration_ActiveVersion); | 237 DeleteRegistration_ActiveVersion); |
229 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageTest, | 238 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageTest, |
230 UpdateRegistration); | 239 UpdateRegistration); |
231 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageDiskTest, | 240 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageDiskTest, |
232 CleanupOnRestart); | 241 CleanupOnRestart); |
233 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageDiskTest, | 242 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerResourceStorageDiskTest, |
234 ClearOnExit); | 243 ClearOnExit); |
235 | 244 |
236 struct InitialData { | 245 struct InitialData { |
237 int64 next_registration_id; | 246 int64 next_registration_id; |
238 int64 next_version_id; | 247 int64 next_version_id; |
239 int64 next_resource_id; | 248 int64 next_resource_id; |
240 std::set<GURL> origins; | 249 std::set<GURL> origins; |
| 250 ServiceWorkerDatabase::DiskCacheMigrationState migration_state; |
241 | 251 |
242 InitialData(); | 252 InitialData(); |
243 ~InitialData(); | 253 ~InitialData(); |
244 }; | 254 }; |
245 | 255 |
246 // Because there are too many params for base::Bind to wrap a closure around. | 256 // Because there are too many params for base::Bind to wrap a closure around. |
247 struct DidDeleteRegistrationParams { | 257 struct DidDeleteRegistrationParams { |
248 int64 registration_id; | 258 int64 registration_id; |
249 GURL origin; | 259 GURL origin; |
250 StatusCallback callback; | 260 StatusCallback callback; |
251 | 261 |
252 DidDeleteRegistrationParams(); | 262 DidDeleteRegistrationParams(); |
253 ~DidDeleteRegistrationParams(); | 263 ~DidDeleteRegistrationParams(); |
254 }; | 264 }; |
255 | 265 |
256 typedef std::vector<ServiceWorkerDatabase::RegistrationData> RegistrationList; | 266 typedef std::vector<ServiceWorkerDatabase::RegistrationData> RegistrationList; |
257 typedef std::map<int64, scoped_refptr<ServiceWorkerRegistration> > | 267 typedef std::map<int64, scoped_refptr<ServiceWorkerRegistration> > |
258 RegistrationRefsById; | 268 RegistrationRefsById; |
259 typedef base::Callback<void( | 269 typedef base::Callback<void(InitialData* data, |
260 InitialData* data, | 270 ServiceWorkerDatabase::Status status)> |
261 ServiceWorkerDatabase::Status status)> InitializeCallback; | 271 InitializeCallback; |
| 272 typedef base::Callback<void(ServiceWorkerDatabase::Status status)> |
| 273 DatabaseStatusCallback; |
262 typedef base::Callback<void( | 274 typedef base::Callback<void( |
263 const GURL& origin, | 275 const GURL& origin, |
264 const ServiceWorkerDatabase::RegistrationData& deleted_version_data, | 276 const ServiceWorkerDatabase::RegistrationData& deleted_version_data, |
265 const std::vector<int64>& newly_purgeable_resources, | 277 const std::vector<int64>& newly_purgeable_resources, |
266 ServiceWorkerDatabase::Status status)> WriteRegistrationCallback; | 278 ServiceWorkerDatabase::Status status)> WriteRegistrationCallback; |
267 typedef base::Callback<void( | 279 typedef base::Callback<void( |
268 bool origin_is_deletable, | 280 bool origin_is_deletable, |
269 const ServiceWorkerDatabase::RegistrationData& deleted_version_data, | 281 const ServiceWorkerDatabase::RegistrationData& deleted_version_data, |
270 const std::vector<int64>& newly_purgeable_resources, | 282 const std::vector<int64>& newly_purgeable_resources, |
271 ServiceWorkerDatabase::Status status)> DeleteRegistrationCallback; | 283 ServiceWorkerDatabase::Status status)> DeleteRegistrationCallback; |
(...skipping 16 matching lines...) Expand all Loading... |
288 const base::FilePath& path, | 300 const base::FilePath& path, |
289 base::WeakPtr<ServiceWorkerContextCore> context, | 301 base::WeakPtr<ServiceWorkerContextCore> context, |
290 scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager, | 302 scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager, |
291 const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, | 303 const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, |
292 storage::QuotaManagerProxy* quota_manager_proxy, | 304 storage::QuotaManagerProxy* quota_manager_proxy, |
293 storage::SpecialStoragePolicy* special_storage_policy); | 305 storage::SpecialStoragePolicy* special_storage_policy); |
294 | 306 |
295 base::FilePath GetDatabasePath(); | 307 base::FilePath GetDatabasePath(); |
296 base::FilePath GetDiskCachePath(); | 308 base::FilePath GetDiskCachePath(); |
297 | 309 |
298 // Loads the registration data from backend storage. This must be called | 310 // Returns a path to an old diskcache backed with BlockFile. This is used for |
299 // before any method that requires registration data. | 311 // the diskcache migration (see service_worker_disk_cache_migrator.h). |
| 312 // TODO(nhiroki): Remove this after several milestones pass |
| 313 // (http://crbug.com/487482) |
| 314 base::FilePath GetOldDiskCachePath(); |
| 315 |
300 bool LazyInitialize( | 316 bool LazyInitialize( |
301 const base::Closure& callback); | 317 const base::Closure& callback); |
302 void DidReadInitialData( | 318 void DidReadInitialData(InitialData* data, |
303 InitialData* data, | 319 ServiceWorkerDatabase::Status status); |
304 ServiceWorkerDatabase::Status status); | |
305 void DidFindRegistrationForDocument( | 320 void DidFindRegistrationForDocument( |
306 const GURL& document_url, | 321 const GURL& document_url, |
307 const FindRegistrationCallback& callback, | 322 const FindRegistrationCallback& callback, |
308 int64 callback_id, | 323 int64 callback_id, |
309 const ServiceWorkerDatabase::RegistrationData& data, | 324 const ServiceWorkerDatabase::RegistrationData& data, |
310 const ResourceList& resources, | 325 const ResourceList& resources, |
311 ServiceWorkerDatabase::Status status); | 326 ServiceWorkerDatabase::Status status); |
312 void DidFindRegistrationForPattern( | 327 void DidFindRegistrationForPattern( |
313 const GURL& scope, | 328 const GURL& scope, |
314 const FindRegistrationCallback& callback, | 329 const FindRegistrationCallback& callback, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 ServiceWorkerDatabase::Status status); | 372 ServiceWorkerDatabase::Status status); |
358 void DidGetUserDataForAllRegistrations( | 373 void DidGetUserDataForAllRegistrations( |
359 const GetUserDataForAllRegistrationsCallback& callback, | 374 const GetUserDataForAllRegistrationsCallback& callback, |
360 const std::vector<std::pair<int64, std::string>>& user_data, | 375 const std::vector<std::pair<int64, std::string>>& user_data, |
361 ServiceWorkerDatabase::Status status); | 376 ServiceWorkerDatabase::Status status); |
362 void ReturnFoundRegistration( | 377 void ReturnFoundRegistration( |
363 const FindRegistrationCallback& callback, | 378 const FindRegistrationCallback& callback, |
364 const ServiceWorkerDatabase::RegistrationData& data, | 379 const ServiceWorkerDatabase::RegistrationData& data, |
365 const ResourceList& resources); | 380 const ResourceList& resources); |
366 | 381 |
| 382 // |continuation| is called only when |status| is OK. |
| 383 void DidWriteDatabase(const base::Closure& continuation, |
| 384 ServiceWorkerDatabase::Status status); |
| 385 |
367 scoped_refptr<ServiceWorkerRegistration> GetOrCreateRegistration( | 386 scoped_refptr<ServiceWorkerRegistration> GetOrCreateRegistration( |
368 const ServiceWorkerDatabase::RegistrationData& data, | 387 const ServiceWorkerDatabase::RegistrationData& data, |
369 const ResourceList& resources); | 388 const ResourceList& resources); |
370 ServiceWorkerRegistration* FindInstallingRegistrationForDocument( | 389 ServiceWorkerRegistration* FindInstallingRegistrationForDocument( |
371 const GURL& document_url); | 390 const GURL& document_url); |
372 ServiceWorkerRegistration* FindInstallingRegistrationForPattern( | 391 ServiceWorkerRegistration* FindInstallingRegistrationForPattern( |
373 const GURL& scope); | 392 const GURL& scope); |
374 ServiceWorkerRegistration* FindInstallingRegistrationForId( | 393 ServiceWorkerRegistration* FindInstallingRegistrationForId( |
375 int64 registration_id); | 394 int64 registration_id); |
376 | 395 |
377 // Lazy disk_cache getter. | 396 // Lazy disk_cache getter. |
378 ServiceWorkerDiskCache* disk_cache(); | 397 ServiceWorkerDiskCache* disk_cache(); |
| 398 void MigrateDiskCache(); |
| 399 void DidMigrateDiskCache(ServiceWorkerStatusCode status); |
| 400 void InitializeDiskCache(); |
379 void OnDiskCacheInitialized(int rv); | 401 void OnDiskCacheInitialized(int rv); |
380 | 402 |
381 void StartPurgingResources(const std::vector<int64>& ids); | 403 void StartPurgingResources(const std::vector<int64>& ids); |
382 void StartPurgingResources(const ResourceList& resources); | 404 void StartPurgingResources(const ResourceList& resources); |
383 void ContinuePurgingResources(); | 405 void ContinuePurgingResources(); |
384 void PurgeResource(int64 id); | 406 void PurgeResource(int64 id); |
385 void OnResourcePurged(int64 id, int rv); | 407 void OnResourcePurged(int64 id, int rv); |
386 | 408 |
387 // Deletes purgeable and uncommitted resources left over from the previous | 409 // Deletes purgeable and uncommitted resources left over from the previous |
388 // browser session. This must be called once per session before any database | 410 // browser session. This must be called once per session before any database |
389 // operation that may mutate the purgeable or uncommitted resource lists. | 411 // operation that may mutate the purgeable or uncommitted resource lists. |
390 void DeleteStaleResources(); | 412 void DeleteStaleResources(); |
391 void DidCollectStaleResources(const std::vector<int64>& stale_resource_ids, | 413 void DidCollectStaleResources(const std::vector<int64>& stale_resource_ids, |
392 ServiceWorkerDatabase::Status status); | 414 ServiceWorkerDatabase::Status status); |
393 | 415 |
394 void ClearSessionOnlyOrigins(); | 416 void ClearSessionOnlyOrigins(); |
395 | 417 |
396 // Static cross-thread helpers. | 418 // Static cross-thread helpers. |
397 static void CollectStaleResourcesFromDB( | 419 static void CollectStaleResourcesFromDB( |
398 ServiceWorkerDatabase* database, | 420 ServiceWorkerDatabase* database, |
399 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 421 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
400 const GetResourcesCallback& callback); | 422 const GetResourcesCallback& callback); |
401 static void ReadInitialDataFromDB( | 423 static void ReadInitialDataFromDB( |
402 ServiceWorkerDatabase* database, | 424 ServiceWorkerDatabase* database, |
403 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 425 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
404 const InitializeCallback& callback); | 426 const InitializeCallback& callback); |
| 427 static void DeleteOldDiskCacheInDB( |
| 428 ServiceWorkerDatabase* database, |
| 429 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| 430 const base::FilePath& disk_cache_path, |
| 431 const DatabaseStatusCallback& callback); |
405 static void DeleteRegistrationFromDB( | 432 static void DeleteRegistrationFromDB( |
406 ServiceWorkerDatabase* database, | 433 ServiceWorkerDatabase* database, |
407 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 434 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
408 int64 registration_id, | 435 int64 registration_id, |
409 const GURL& origin, | 436 const GURL& origin, |
410 const DeleteRegistrationCallback& callback); | 437 const DeleteRegistrationCallback& callback); |
411 static void WriteRegistrationInDB( | 438 static void WriteRegistrationInDB( |
412 ServiceWorkerDatabase* database, | 439 ServiceWorkerDatabase* database, |
413 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 440 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
414 const ServiceWorkerDatabase::RegistrationData& registration, | 441 const ServiceWorkerDatabase::RegistrationData& registration, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 base::FilePath path_; | 510 base::FilePath path_; |
484 base::WeakPtr<ServiceWorkerContextCore> context_; | 511 base::WeakPtr<ServiceWorkerContextCore> context_; |
485 | 512 |
486 // Only accessed using |database_task_manager_|. | 513 // Only accessed using |database_task_manager_|. |
487 scoped_ptr<ServiceWorkerDatabase> database_; | 514 scoped_ptr<ServiceWorkerDatabase> database_; |
488 | 515 |
489 scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager_; | 516 scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager_; |
490 scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread_; | 517 scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread_; |
491 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_; | 518 scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_; |
492 scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy_; | 519 scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy_; |
| 520 |
493 scoped_ptr<ServiceWorkerDiskCache> disk_cache_; | 521 scoped_ptr<ServiceWorkerDiskCache> disk_cache_; |
| 522 scoped_ptr<ServiceWorkerDiskCacheMigrator> disk_cache_migrator_; |
| 523 ServiceWorkerDatabase::DiskCacheMigrationState disk_cache_migration_state_; |
| 524 |
494 std::deque<int64> purgeable_resource_ids_; | 525 std::deque<int64> purgeable_resource_ids_; |
495 bool is_purge_pending_; | 526 bool is_purge_pending_; |
496 bool has_checked_for_stale_resources_; | 527 bool has_checked_for_stale_resources_; |
497 std::set<int64> pending_deletions_; | 528 std::set<int64> pending_deletions_; |
498 | 529 |
499 base::WeakPtrFactory<ServiceWorkerStorage> weak_factory_; | 530 base::WeakPtrFactory<ServiceWorkerStorage> weak_factory_; |
500 | 531 |
501 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerStorage); | 532 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerStorage); |
502 }; | 533 }; |
503 | 534 |
504 } // namespace content | 535 } // namespace content |
505 | 536 |
506 #endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_STORAGE_H_ | 537 #endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_STORAGE_H_ |
OLD | NEW |