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 05e65323ca88818b8e574aa08c3cc9ff314d22c1..bc5a82aef2e091fa80aaafa7a67264334eb64ad2 100644 |
--- a/content/browser/service_worker/service_worker_storage.cc |
+++ b/content/browser/service_worker/service_worker_storage.cc |
@@ -271,8 +271,8 @@ void ServiceWorkerStorage::StoreRegistration( |
DCHECK(registration); |
DCHECK(version); |
- DCHECK(state_ == INITIALIZED || state_ == DISABLED); |
- if (state_ != INITIALIZED || !context_) { |
+ DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
+ if (IsDisabled() || !context_) { |
RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
return; |
} |
@@ -289,6 +289,9 @@ void ServiceWorkerStorage::StoreRegistration( |
ResourceList resources; |
version->script_cache_map()->GetResources(&resources); |
+ if (!has_checked_for_stale_resources_) |
+ DeleteStaleResources(); |
+ |
database_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&WriteRegistrationInDB, |
@@ -305,8 +308,8 @@ void ServiceWorkerStorage::UpdateToActiveState( |
const StatusCallback& callback) { |
DCHECK(registration); |
- DCHECK(state_ == INITIALIZED || state_ == DISABLED); |
- if (state_ != INITIALIZED || !context_) { |
+ DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
+ if (IsDisabled() || !context_) { |
RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
return; |
} |
@@ -327,12 +330,15 @@ void ServiceWorkerStorage::DeleteRegistration( |
int64 registration_id, |
const GURL& origin, |
const StatusCallback& callback) { |
- DCHECK(state_ == INITIALIZED || state_ == DISABLED); |
- if (state_ != INITIALIZED || !context_) { |
+ DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
+ if (IsDisabled() || !context_) { |
RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
return; |
} |
+ if (!has_checked_for_stale_resources_) |
+ DeleteStaleResources(); |
+ |
database_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&DeleteRegistrationFromDB, |
@@ -360,8 +366,13 @@ ServiceWorkerStorage::CreateResponseWriter(int64 response_id) { |
new ServiceWorkerResponseWriter(response_id, disk_cache())); |
} |
-void ServiceWorkerStorage::StoreUncommittedReponseId(int64 id) { |
+void ServiceWorkerStorage::StoreUncommittedResponseId(int64 id) { |
DCHECK_NE(kInvalidServiceWorkerResponseId, id); |
+ DCHECK_EQ(INITIALIZED, state_); |
+ |
+ if (!has_checked_for_stale_resources_) |
+ DeleteStaleResources(); |
+ |
database_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(base::IgnoreResult( |
@@ -470,6 +481,7 @@ ServiceWorkerStorage::ServiceWorkerStorage( |
disk_cache_thread_(disk_cache_thread), |
quota_manager_proxy_(quota_manager_proxy), |
is_purge_pending_(false), |
+ has_checked_for_stale_resources_(false), |
weak_factory_(this) { |
database_.reset(new ServiceWorkerDatabase(GetDatabasePath())); |
} |
@@ -526,9 +538,6 @@ void ServiceWorkerStorage::DidReadInitialData( |
next_resource_id_ = data->next_resource_id; |
registered_origins_.swap(data->origins); |
state_ = INITIALIZED; |
- StartPurgingResources( |
- std::vector<int64>(data->purgeable_resource_ids.begin(), |
- data->purgeable_resource_ids.end())); |
} else { |
// TODO(nhiroki): Stringify |status| using StatusToString() defined in |
// service_worker_database.cc. |
@@ -863,6 +872,7 @@ void ServiceWorkerStorage::SchedulePurgeResources( |
void ServiceWorkerStorage::StartPurgingResources( |
const std::vector<int64>& ids) { |
+ DCHECK(has_checked_for_stale_resources_); |
for (size_t i = 0; i < ids.size(); ++i) |
purgeable_resource_ids_.push_back(ids[i]); |
ContinuePurgingResources(); |
@@ -870,6 +880,7 @@ void ServiceWorkerStorage::StartPurgingResources( |
void ServiceWorkerStorage::StartPurgingResources( |
const ResourceList& resources) { |
+ DCHECK(has_checked_for_stale_resources_); |
for (size_t i = 0; i < resources.size(); ++i) |
purgeable_resource_ids_.push_back(resources[i].resource_id); |
ContinuePurgingResources(); |
@@ -912,6 +923,58 @@ void ServiceWorkerStorage::OnResourcePurged(int64 id, int rv) { |
ContinuePurgingResources(); |
} |
+void ServiceWorkerStorage::DeleteStaleResources() { |
+ DCHECK(!has_checked_for_stale_resources_); |
+ has_checked_for_stale_resources_ = true; |
+ database_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ServiceWorkerStorage::CollectStaleResourcesFromDB, |
+ database_.get(), |
+ base::MessageLoopProxy::current(), |
+ base::Bind(&ServiceWorkerStorage::DidCollectStaleResources, |
+ weak_factory_.GetWeakPtr()))); |
+} |
+ |
+void ServiceWorkerStorage::DidCollectStaleResources( |
+ const std::vector<int64>& stale_resource_ids, |
+ ServiceWorkerDatabase::Status status) { |
+ DCHECK_EQ(ServiceWorkerDatabase::STATUS_OK, status); |
+ if (status != ServiceWorkerDatabase::STATUS_OK) |
+ return; |
+ StartPurgingResources(stale_resource_ids); |
+} |
+ |
+void ServiceWorkerStorage::CollectStaleResourcesFromDB( |
+ ServiceWorkerDatabase* database, |
+ scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
+ const GetResourcesCallback& callback) { |
+ std::set<int64> ids; |
+ ServiceWorkerDatabase::Status status = |
+ database->GetUncommittedResourceIds(&ids); |
+ if (status != ServiceWorkerDatabase::STATUS_OK) { |
+ original_task_runner->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ callback, std::vector<int64>(ids.begin(), ids.end()), status)); |
+ return; |
+ } |
+ |
+ status = database->PurgeUncommittedResourceIds(ids); |
+ if (status != ServiceWorkerDatabase::STATUS_OK) { |
+ original_task_runner->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ callback, std::vector<int64>(ids.begin(), ids.end()), status)); |
+ return; |
+ } |
+ |
+ ids.clear(); |
+ status = database->GetPurgeableResourceIds(&ids); |
+ original_task_runner->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, std::vector<int64>(ids.begin(), ids.end()), status)); |
+} |
+ |
void ServiceWorkerStorage::ReadInitialDataFromDB( |
ServiceWorkerDatabase* database, |
scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
@@ -931,14 +994,6 @@ void ServiceWorkerStorage::ReadInitialDataFromDB( |
} |
status = database->GetOriginsWithRegistrations(&data->origins); |
- if (status != ServiceWorkerDatabase::STATUS_OK) { |
- original_task_runner->PostTask( |
- FROM_HERE, base::Bind(callback, base::Owned(data.release()), status)); |
- return; |
- } |
- |
- // TODO: Also purge uncommitted resources. |
- status = database->GetPurgeableResourceIds(&data->purgeable_resource_ids); |
original_task_runner->PostTask( |
FROM_HERE, base::Bind(callback, base::Owned(data.release()), status)); |
} |