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 54eacd657f51bf4593d953a1f8bdf61a97cf6656..d16e3380459da99887774358a4a53d68e3605b7c 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(), |
michaeln
2014/10/16 01:15:04
Ah, I was wondering what clone() was for.
|
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( |
@@ -281,7 +287,7 @@ void ServiceWorkerStorage::FindRegistrationForDocument( |
return; |
} |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind( |
&FindForDocumentInDB, |
@@ -320,7 +326,7 @@ void ServiceWorkerStorage::FindRegistrationForPattern( |
return; |
} |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind( |
&FindForPatternInDB, |
@@ -382,7 +388,7 @@ void ServiceWorkerStorage::FindRegistrationForId( |
return; |
} |
- database_task_runner_->PostTask( |
+ database_task_manager_->GetTaskRunner()->PostTask( |
FROM_HERE, |
base::Bind(&FindForIdInDB, |
database_.get(), |
@@ -407,7 +413,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()), |
@@ -446,7 +452,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(), |
@@ -471,7 +477,7 @@ void ServiceWorkerStorage::UpdateToActiveState( |
} |
PostTaskAndReplyWithResult( |
- database_task_runner_.get(), |
+ database_task_manager_->GetTaskRunner(), |
FROM_HERE, |
base::Bind(&ServiceWorkerDatabase::UpdateVersionToActive, |
base::Unretained(database_.get()), |
@@ -490,7 +496,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), |
@@ -518,7 +524,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(), |
@@ -554,7 +560,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), |
@@ -564,7 +570,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), |
@@ -590,7 +596,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())), |
@@ -640,7 +646,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), |
@@ -680,18 +686,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) { |
@@ -730,7 +738,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(), |
@@ -1136,7 +1144,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), |
@@ -1149,7 +1157,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(), |
@@ -1167,6 +1175,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, |
@@ -1373,6 +1402,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 |
@@ -1405,7 +1443,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, |