| 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..70030834d8c88f4a41160e334c5e5c4fb9406d6a 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 (const GURL& origin : registered_origins_) {
|
| + 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
|
|
|