Chromium Code Reviews| Index: content/browser/service_worker/service_worker_storage.cc |
| diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc |
| index c758f866928f4f5f46b8192e6c03f3ddf1280f07..3b16f71e98431eb8f6bfe6a9b9f2636050cd26b2 100644 |
| --- a/content/browser/service_worker/service_worker_storage.cc |
| +++ b/content/browser/service_worker/service_worker_storage.cc |
| @@ -116,7 +116,6 @@ scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( |
| old_storage->quota_manager_proxy_)); |
| } |
| - |
| void ServiceWorkerStorage::FindRegistrationForDocument( |
| const GURL& document_url, |
| const FindRegistrationCallback& callback) { |
| @@ -349,6 +348,26 @@ void ServiceWorkerStorage::DeleteRegistration( |
| // thereafter. |
| } |
| +void ServiceWorkerStorage::DeleteVersionResources( |
| + int64 version_id, |
| + const StatusCallback& callback) { |
| + DCHECK(state_ == INITIALIZED || state_ == DISABLED); |
| + if (state_ != INITIALIZED || !context_) { |
| + RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
| + return; |
| + } |
| + |
| + database_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&DeleteVersionResourcesFromDB, |
| + database_.get(), |
| + base::MessageLoopProxy::current(), |
| + version_id, |
| + base::Bind(&ServiceWorkerStorage::DidDeleteVersionResources, |
| + weak_factory_.GetWeakPtr(), |
| + callback))); |
| +} |
| + |
| scoped_ptr<ServiceWorkerResponseReader> |
| ServiceWorkerStorage::CreateResponseReader(int64 response_id) { |
| return make_scoped_ptr( |
| @@ -709,7 +728,6 @@ void ServiceWorkerStorage::DidDeleteRegistration( |
| const GURL& origin, |
| const StatusCallback& callback, |
| bool origin_is_deletable, |
| - const std::vector<int64>& newly_purgeable_resources, |
| ServiceWorkerDatabase::Status status) { |
| if (status != ServiceWorkerDatabase::STATUS_OK) { |
| ScheduleDeleteAndStartOver(); |
| @@ -719,6 +737,18 @@ void ServiceWorkerStorage::DidDeleteRegistration( |
| if (origin_is_deletable) |
| registered_origins_.erase(origin); |
| callback.Run(SERVICE_WORKER_OK); |
| +} |
| + |
| +void ServiceWorkerStorage::DidDeleteVersionResources( |
| + const StatusCallback& callback, |
| + const std::vector<int64>& newly_purgeable_resources, |
| + ServiceWorkerDatabase::Status status) { |
| + if (status != ServiceWorkerDatabase::STATUS_OK) { |
| + ScheduleDeleteAndStartOver(); |
| + callback.Run(DatabaseStatusToStatusCode(status)); |
| + return; |
| + } |
| + callback.Run(SERVICE_WORKER_OK); |
| StartPurgingResources(newly_purgeable_resources); |
|
michaeln
2014/06/28 02:29:31
Just the startpurging should be deferred till nomo
|
| } |
| @@ -832,26 +862,26 @@ void ServiceWorkerStorage::OnDiskCacheInitialized(int rv) { |
| void ServiceWorkerStorage::StartPurgingResources( |
| const std::vector<int64>& ids) { |
| for (size_t i = 0; i < ids.size(); ++i) |
| - purgeable_reource_ids_.push_back(ids[i]); |
| + purgeable_resource_ids_.push_back(ids[i]); |
| ContinuePurgingResources(); |
| } |
| void ServiceWorkerStorage::StartPurgingResources( |
| const ResourceList& resources) { |
| for (size_t i = 0; i < resources.size(); ++i) |
| - purgeable_reource_ids_.push_back(resources[i].resource_id); |
| + purgeable_resource_ids_.push_back(resources[i].resource_id); |
| ContinuePurgingResources(); |
| } |
| void ServiceWorkerStorage::ContinuePurgingResources() { |
| - if (purgeable_reource_ids_.empty() || is_purge_pending_) |
| + if (purgeable_resource_ids_.empty() || is_purge_pending_) |
| return; |
| // Do one at a time until we're done, use RunSoon to avoid recursion when |
| // DoomEntry returns immediately. |
| is_purge_pending_ = true; |
| - int64 id = purgeable_reource_ids_.front(); |
| - purgeable_reource_ids_.pop_front(); |
| + int64 id = purgeable_resource_ids_.front(); |
| + purgeable_resource_ids_.pop_front(); |
| RunSoon(FROM_HERE, |
| base::Bind(&ServiceWorkerStorage::PurgeResource, |
| weak_factory_.GetWeakPtr(), id)); |
| @@ -913,11 +943,10 @@ void ServiceWorkerStorage::DeleteRegistrationFromDB( |
| std::vector<int64> newly_purgeable_resources; |
| ServiceWorkerDatabase::Status status = |
| - database->DeleteRegistration(registration_id, origin, |
| - &newly_purgeable_resources); |
| + database->DeleteRegistration(registration_id, origin); |
| if (status != ServiceWorkerDatabase::STATUS_OK) { |
| - original_task_runner->PostTask( |
| - FROM_HERE, base::Bind(callback, false, std::vector<int64>(), status)); |
| + original_task_runner->PostTask(FROM_HERE, |
| + base::Bind(callback, false, status)); |
| return; |
| } |
| @@ -926,15 +955,34 @@ void ServiceWorkerStorage::DeleteRegistrationFromDB( |
| std::vector<ServiceWorkerDatabase::RegistrationData> registrations; |
| status = database->GetRegistrationsForOrigin(origin, ®istrations); |
| if (status != ServiceWorkerDatabase::STATUS_OK) { |
| - original_task_runner->PostTask( |
| - FROM_HERE, base::Bind(callback, false, std::vector<int64>(), status)); |
| + original_task_runner->PostTask(FROM_HERE, |
| + base::Bind(callback, false, status)); |
| return; |
| } |
| bool deletable = registrations.empty(); |
| + original_task_runner->PostTask(FROM_HERE, |
| + base::Bind(callback, deletable, status)); |
| +} |
| + |
| +void ServiceWorkerStorage::DeleteVersionResourcesFromDB( |
| + ServiceWorkerDatabase* database, |
| + scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
| + int64 version_id, |
| + const DeleteVersionResourcesCallback& callback) { |
| + DCHECK(database); |
| + |
| + std::vector<int64> newly_purgeable_resources; |
| + ServiceWorkerDatabase::Status status = |
| + database->DeleteVersionResources(version_id, &newly_purgeable_resources); |
| + if (status != ServiceWorkerDatabase::STATUS_OK) { |
| + original_task_runner->PostTask( |
| + FROM_HERE, base::Bind(callback, std::vector<int64>(), status)); |
| + return; |
| + } |
| + |
| original_task_runner->PostTask( |
| - FROM_HERE, base::Bind(callback, deletable, |
| - newly_purgeable_resources, status)); |
| + FROM_HERE, base::Bind(callback, newly_purgeable_resources, status)); |
| } |
| void ServiceWorkerStorage::WriteRegistrationInDB( |