Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(196)

Unified Diff: content/browser/service_worker/service_worker_storage.cc

Issue 633873002: Service Worker: Respect the "clear on exit" content setting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@contentsettings
Patch Set: self review Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698