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 69e48f37ab2b678e670eebb4bdb9bf23615cc519..4a45c1b1485e1bb3c0d880addf06409425744aaa 100644 |
--- a/content/browser/service_worker/service_worker_storage.cc |
+++ b/content/browser/service_worker/service_worker_storage.cc |
@@ -27,6 +27,7 @@ |
#include "net/base/io_buffer.h" |
#include "net/base/net_errors.h" |
#include "storage/browser/quota/quota_manager_proxy.h" |
+#include "storage/browser/quota/special_storage_policy.h" |
namespace content { |
@@ -218,22 +219,26 @@ DidDeleteRegistrationParams::~DidDeleteRegistrationParams() { |
} |
ServiceWorkerStorage::~ServiceWorkerStorage() { |
+ ClearSessionOnlyOrigins(); |
weak_factory_.InvalidateWeakPtrs(); |
- database_task_runner_->DeleteSoon(FROM_HERE, database_.release()); |
+ database_task_manager_->GetTaskRunner()->DeleteSoon(FROM_HERE, |
+ database_.release()); |
} |
// static |
scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( |
const base::FilePath& path, |
base::WeakPtr<ServiceWorkerContextCore> context, |
- const scoped_refptr<base::SequencedTaskRunner>& database_task_runner, |
+ scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager, |
const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, |
- storage::QuotaManagerProxy* quota_manager_proxy) { |
+ storage::QuotaManagerProxy* quota_manager_proxy, |
+ storage::SpecialStoragePolicy* special_storage_policy) { |
return make_scoped_ptr(new ServiceWorkerStorage(path, |
context, |
- database_task_runner, |
+ database_task_manager.Pass(), |
disk_cache_thread, |
- quota_manager_proxy)); |
+ quota_manager_proxy, |
+ special_storage_policy)); |
} |
// static |
@@ -243,9 +248,10 @@ scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( |
return make_scoped_ptr( |
new ServiceWorkerStorage(old_storage->path_, |
context, |
- old_storage->database_task_runner_, |
+ old_storage->database_task_manager_->Clone(), |
old_storage->disk_cache_thread_, |
- old_storage->quota_manager_proxy_.get())); |
+ old_storage->quota_manager_proxy_.get(), |
+ old_storage->special_storage_policy_.get())); |
} |
void ServiceWorkerStorage::FindRegistrationForDocument( |
@@ -295,7 +301,7 @@ void ServiceWorkerStorage::FindRegistrationForDocument( |
"ServiceWorkerStorage::FindRegistrationForDocument", |
callback_id, |
"URL", document_url.spec()); |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind( |
&FindForDocumentInDB, |
@@ -337,7 +343,7 @@ void ServiceWorkerStorage::FindRegistrationForPattern( |
return; |
} |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind( |
&FindForPatternInDB, |
@@ -399,7 +405,7 @@ void ServiceWorkerStorage::FindRegistrationForId( |
return; |
} |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(&FindForIdInDB, |
database_.get(), |
@@ -424,7 +430,7 @@ void ServiceWorkerStorage::GetAllRegistrations( |
RegistrationList* registrations = new RegistrationList; |
PostTaskAndReplyWithResult( |
- database_task_runner_.get(), |
+ database_task_manager_->GetTaskRunner(), |
FROM_HERE, |
base::Bind(&ServiceWorkerDatabase::GetAllRegistrations, |
base::Unretained(database_.get()), |
@@ -463,7 +469,7 @@ void ServiceWorkerStorage::StoreRegistration( |
if (!has_checked_for_stale_resources_) |
DeleteStaleResources(); |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(&WriteRegistrationInDB, |
database_.get(), |
@@ -488,7 +494,7 @@ void ServiceWorkerStorage::UpdateToActiveState( |
} |
PostTaskAndReplyWithResult( |
- database_task_runner_.get(), |
+ database_task_manager_->GetTaskRunner(), |
FROM_HERE, |
base::Bind(&ServiceWorkerDatabase::UpdateVersionToActive, |
base::Unretained(database_.get()), |
@@ -507,7 +513,7 @@ void ServiceWorkerStorage::UpdateLastUpdateCheckTime( |
if (IsDisabled() || !context_) |
return; |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind( |
base::IgnoreResult(&ServiceWorkerDatabase::UpdateLastCheckTime), |
@@ -535,7 +541,7 @@ void ServiceWorkerStorage::DeleteRegistration( |
params.origin = origin; |
params.callback = callback; |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(&DeleteRegistrationFromDB, |
database_.get(), |
@@ -571,7 +577,7 @@ void ServiceWorkerStorage::StoreUncommittedResponseId(int64 id) { |
if (!has_checked_for_stale_resources_) |
DeleteStaleResources(); |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(base::IgnoreResult( |
&ServiceWorkerDatabase::WriteUncommittedResourceIds), |
@@ -581,7 +587,7 @@ void ServiceWorkerStorage::StoreUncommittedResponseId(int64 id) { |
void ServiceWorkerStorage::DoomUncommittedResponse(int64 id) { |
DCHECK_NE(kInvalidServiceWorkerResponseId, id); |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(base::IgnoreResult( |
&ServiceWorkerDatabase::PurgeUncommittedResourceIds), |
@@ -607,7 +613,7 @@ void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) { |
// Delete the database on the database thread. |
PostTaskAndReplyWithResult( |
- database_task_runner_.get(), |
+ database_task_manager_->GetTaskRunner(), |
FROM_HERE, |
base::Bind(&ServiceWorkerDatabase::DestroyDatabase, |
base::Unretained(database_.get())), |
@@ -657,7 +663,7 @@ void ServiceWorkerStorage::NotifyDoneInstallingRegistration( |
for (size_t i = 0; i < resources.size(); ++i) |
ids.insert(resources[i].resource_id); |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(base::IgnoreResult( |
&ServiceWorkerDatabase::PurgeUncommittedResourceIds), |
@@ -697,18 +703,20 @@ void ServiceWorkerStorage::PurgeResources(const ResourceList& resources) { |
ServiceWorkerStorage::ServiceWorkerStorage( |
const base::FilePath& path, |
base::WeakPtr<ServiceWorkerContextCore> context, |
- const scoped_refptr<base::SequencedTaskRunner>& database_task_runner, |
+ scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager, |
const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread, |
- storage::QuotaManagerProxy* quota_manager_proxy) |
+ storage::QuotaManagerProxy* quota_manager_proxy, |
+ storage::SpecialStoragePolicy* special_storage_policy) |
: next_registration_id_(kInvalidServiceWorkerRegistrationId), |
next_version_id_(kInvalidServiceWorkerVersionId), |
next_resource_id_(kInvalidServiceWorkerResourceId), |
state_(UNINITIALIZED), |
path_(path), |
context_(context), |
- database_task_runner_(database_task_runner), |
+ database_task_manager_(database_task_manager.Pass()), |
disk_cache_thread_(disk_cache_thread), |
quota_manager_proxy_(quota_manager_proxy), |
+ special_storage_policy_(special_storage_policy), |
is_purge_pending_(false), |
has_checked_for_stale_resources_(false), |
weak_factory_(this) { |
@@ -747,7 +755,7 @@ bool ServiceWorkerStorage::LazyInitialize(const base::Closure& callback) { |
} |
state_ = INITIALIZING; |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(&ReadInitialDataFromDB, |
database_.get(), |
@@ -1154,7 +1162,7 @@ void ServiceWorkerStorage::OnResourcePurged(int64 id, int rv) { |
DCHECK(is_purge_pending_); |
is_purge_pending_ = false; |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(base::IgnoreResult( |
&ServiceWorkerDatabase::ClearPurgeableResourceIds), |
@@ -1167,7 +1175,7 @@ void ServiceWorkerStorage::OnResourcePurged(int64 id, int rv) { |
void ServiceWorkerStorage::DeleteStaleResources() { |
DCHECK(!has_checked_for_stale_resources_); |
has_checked_for_stale_resources_ = true; |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(&ServiceWorkerStorage::CollectStaleResourcesFromDB, |
database_.get(), |
@@ -1185,6 +1193,27 @@ void ServiceWorkerStorage::DidCollectStaleResources( |
StartPurgingResources(stale_resource_ids); |
} |
+void ServiceWorkerStorage::ClearSessionOnlyOrigins() { |
+ // Can be null in tests. |
+ if (!special_storage_policy_.get()) |
+ return; |
+ |
+ if (!special_storage_policy_->HasSessionOnlyOrigins()) |
+ return; |
+ |
+ std::set<GURL> session_only_origins; |
+ for (const GURL& origin : registered_origins_) { |
+ if (special_storage_policy_->IsStorageSessionOnly(origin)) |
+ session_only_origins.insert(origin); |
+ } |
+ |
+ database_task_manager_->GetShutdownBlockingTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DeleteAllDataForOriginsFromDB, |
+ database_.get(), |
+ session_only_origins)); |
+} |
+ |
void ServiceWorkerStorage::CollectStaleResourcesFromDB( |
ServiceWorkerDatabase* database, |
scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
@@ -1391,6 +1420,15 @@ void ServiceWorkerStorage::FindForIdInDB( |
FROM_HERE, base::Bind(callback, data, resources, status)); |
} |
+void ServiceWorkerStorage::DeleteAllDataForOriginsFromDB( |
+ ServiceWorkerDatabase* database, |
+ const std::set<GURL>& origins) { |
+ DCHECK(database); |
+ |
+ std::vector<int64> newly_purgeable_resources; |
+ database->DeleteAllDataForOrigins(origins, &newly_purgeable_resources); |
+} |
+ |
// TODO(nhiroki): The corruption recovery should not be scheduled if the error |
// is transient and it can get healed soon (e.g. IO error). To do that, the |
// database should not disable itself when an error occurs and the storage |
@@ -1423,7 +1461,7 @@ void ServiceWorkerStorage::DidDeleteDatabase( |
// Deleting the directory could take a long time and restart could be delayed. |
// We should probably rename the directory and delete it later. |
PostTaskAndReplyWithResult( |
- database_task_runner_.get(), |
+ database_task_manager_->GetTaskRunner(), |
FROM_HERE, |
base::Bind(&base::DeleteFile, GetDiskCachePath(), true), |
base::Bind(&ServiceWorkerStorage::DidDeleteDiskCache, |