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 54eacd657f51bf4593d953a1f8bdf61a97cf6656..2c0d4a3169ad41c45f05671da0a039abf4697b3e 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,6 +219,7 @@ DidDeleteRegistrationParams::~DidDeleteRegistrationParams() { |
| } |
| ServiceWorkerStorage::~ServiceWorkerStorage() { |
| + ClearSessionOnlyOrigins(); |
| weak_factory_.InvalidateWeakPtrs(); |
| database_task_runner_->DeleteSoon(FROM_HERE, database_.release()); |
| } |
| @@ -228,12 +230,14 @@ scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( |
| base::WeakPtr<ServiceWorkerContextCore> context, |
| const scoped_refptr<base::SequencedTaskRunner>& database_task_runner, |
| 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, |
| disk_cache_thread, |
| - quota_manager_proxy)); |
| + quota_manager_proxy, |
| + special_storage_policy)); |
| } |
| // static |
| @@ -245,7 +249,8 @@ scoped_ptr<ServiceWorkerStorage> ServiceWorkerStorage::Create( |
| context, |
| old_storage->database_task_runner_, |
| 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( |
| @@ -682,7 +687,8 @@ ServiceWorkerStorage::ServiceWorkerStorage( |
| base::WeakPtr<ServiceWorkerContextCore> context, |
| const scoped_refptr<base::SequencedTaskRunner>& database_task_runner, |
| 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), |
| @@ -692,6 +698,7 @@ ServiceWorkerStorage::ServiceWorkerStorage( |
| database_task_runner_(database_task_runner), |
| 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) { |
| @@ -1167,6 +1174,27 @@ void ServiceWorkerStorage::DidCollectStaleResources( |
| StartPurgingResources(stale_resource_ids); |
| } |
| +void ServiceWorkerStorage::ClearSessionOnlyOrigins() { |
| + // Can be null in unittests. |
| + if (!special_storage_policy_.get()) |
| + return; |
| + |
| + if (!special_storage_policy_->HasSessionOnlyOrigins()) |
| + return; |
| + |
| + std::set<GURL> session_only_origins; |
| + for (auto origin : registered_origins_) { |
|
michaeln
2014/10/08 01:22:27
ditto const GURL&
falken
2014/10/08 02:36:44
Done.
|
| + if (special_storage_policy_->IsStorageSessionOnly(origin)) |
| + session_only_origins.insert(origin); |
| + } |
| + database_task_runner_->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 +1401,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 |