Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Side by Side Diff: content/browser/service_worker/service_worker_storage.h

Issue 1152543002: ServiceWorker: Migrate the script cache backend from BlockFile to Simple (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: use PostAfterStartupTask Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698