Commit 830cf2c5 authored by Kenichi Ishibashi's avatar Kenichi Ishibashi Committed by Commit Bot

Add ServiceWorkerStorageControl::ApplyPolicyUpdates()

This is a wrapper of ServiceWorkerStorage::ApplyPolicyUpdates().

Bug: 1055677
Change-Id: I85329c4651dc53851c77183b889b2abb76d2f9ad
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2154638
Commit-Queue: Kenichi Ishibashi <bashi@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarMakoto Shimazu <shimazu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#760402}
parent 6a3b5738
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
module storage.mojom; module storage.mojom;
import "components/services/storage/public/mojom/local_storage_control.mojom";
import "components/services/storage/public/mojom/service_worker_database.mojom"; import "components/services/storage/public/mojom/service_worker_database.mojom";
import "mojo/public/mojom/base/big_buffer.mojom"; import "mojo/public/mojom/base/big_buffer.mojom";
import "mojo/public/mojom/base/time.mojom"; import "mojo/public/mojom/base/time.mojom";
...@@ -187,4 +188,8 @@ interface ServiceWorkerStorageControl { ...@@ -187,4 +188,8 @@ interface ServiceWorkerStorageControl {
// of keys. // of keys.
ClearUserDataForAllRegistrationsByKeyPrefix(string key_prefix) => ClearUserDataForAllRegistrationsByKeyPrefix(string key_prefix) =>
(ServiceWorkerDatabaseStatus status); (ServiceWorkerDatabaseStatus status);
// Applies changes to data retention policy which are relevant at shutdown.
// This is analogous to LocalStorageControl::ApplyPolicyUpdates.
ApplyPolicyUpdates(array<LocalStoragePolicyUpdate> policy_updates);
}; };
...@@ -56,8 +56,7 @@ void MaybeNotifyWriteFailed( ...@@ -56,8 +56,7 @@ void MaybeNotifyWriteFailed(
} }
} }
const base::FilePath::CharType kDatabaseName[] = const base::FilePath::CharType kDatabaseName[] = FILE_PATH_LITERAL("Database");
FILE_PATH_LITERAL("Database");
const base::FilePath::CharType kDiskCacheName[] = const base::FilePath::CharType kDiskCacheName[] =
FILE_PATH_LITERAL("ScriptCache"); FILE_PATH_LITERAL("ScriptCache");
...@@ -68,8 +67,7 @@ ServiceWorkerStorage::InitialData::InitialData() ...@@ -68,8 +67,7 @@ ServiceWorkerStorage::InitialData::InitialData()
next_version_id(blink::mojom::kInvalidServiceWorkerVersionId), next_version_id(blink::mojom::kInvalidServiceWorkerVersionId),
next_resource_id(blink::mojom::kInvalidServiceWorkerResourceId) {} next_resource_id(blink::mojom::kInvalidServiceWorkerResourceId) {}
ServiceWorkerStorage::InitialData::~InitialData() { ServiceWorkerStorage::InitialData::~InitialData() = default;
}
ServiceWorkerStorage::DidDeleteRegistrationParams::DidDeleteRegistrationParams( ServiceWorkerStorage::DidDeleteRegistrationParams::DidDeleteRegistrationParams(
int64_t registration_id, int64_t registration_id,
...@@ -896,7 +894,8 @@ void ServiceWorkerStorage::PurgeResources( ...@@ -896,7 +894,8 @@ void ServiceWorkerStorage::PurgeResources(
} }
void ServiceWorkerStorage::ApplyPolicyUpdates( void ServiceWorkerStorage::ApplyPolicyUpdates(
std::vector<storage::mojom::LocalStoragePolicyUpdatePtr> policy_updates) { const std::vector<storage::mojom::LocalStoragePolicyUpdatePtr>&
policy_updates) {
for (const auto& update : policy_updates) { for (const auto& update : policy_updates) {
GURL url = update->origin.GetURL(); GURL url = update->origin.GetURL();
if (!update->purge_on_shutdown) if (!update->purge_on_shutdown)
...@@ -1303,10 +1302,9 @@ void ServiceWorkerStorage::ReadInitialDataFromDB( ...@@ -1303,10 +1302,9 @@ void ServiceWorkerStorage::ReadInitialDataFromDB(
std::unique_ptr<ServiceWorkerStorage::InitialData> data( std::unique_ptr<ServiceWorkerStorage::InitialData> data(
new ServiceWorkerStorage::InitialData()); new ServiceWorkerStorage::InitialData());
ServiceWorkerDatabase::Status status = ServiceWorkerDatabase::Status status = database->GetNextAvailableIds(
database->GetNextAvailableIds(&data->next_registration_id, &data->next_registration_id, &data->next_version_id,
&data->next_version_id, &data->next_resource_id);
&data->next_resource_id);
if (status != ServiceWorkerDatabase::Status::kOk) { if (status != ServiceWorkerDatabase::Status::kOk) {
original_task_runner->PostTask( original_task_runner->PostTask(
FROM_HERE, FROM_HERE,
......
...@@ -295,7 +295,8 @@ class CONTENT_EXPORT ServiceWorkerStorage { ...@@ -295,7 +295,8 @@ class CONTENT_EXPORT ServiceWorkerStorage {
// Applies |policy_updates|. // Applies |policy_updates|.
void ApplyPolicyUpdates( void ApplyPolicyUpdates(
std::vector<storage::mojom::LocalStoragePolicyUpdatePtr> policy_updates); const std::vector<storage::mojom::LocalStoragePolicyUpdatePtr>&
policy_updates);
void LazyInitializeForTest(); void LazyInitializeForTest();
...@@ -500,9 +501,8 @@ class CONTENT_EXPORT ServiceWorkerStorage { ...@@ -500,9 +501,8 @@ class CONTENT_EXPORT ServiceWorkerStorage {
scoped_refptr<base::SequencedTaskRunner> original_task_runner, scoped_refptr<base::SequencedTaskRunner> original_task_runner,
const std::string& key_prefix, const std::string& key_prefix,
GetUserDataForAllRegistrationsInDBCallback callback); GetUserDataForAllRegistrationsInDBCallback callback);
static void DeleteAllDataForOriginsFromDB( static void DeleteAllDataForOriginsFromDB(ServiceWorkerDatabase* database,
ServiceWorkerDatabase* database, const std::set<GURL>& origins);
const std::set<GURL>& origins);
static void PerformStorageCleanupInDB(ServiceWorkerDatabase* database); static void PerformStorageCleanupInDB(ServiceWorkerDatabase* database);
// Posted by the underlying cache implementation after it finishes making // Posted by the underlying cache implementation after it finishes making
......
...@@ -310,4 +310,10 @@ void ServiceWorkerStorageControlImpl:: ...@@ -310,4 +310,10 @@ void ServiceWorkerStorageControlImpl::
std::move(callback)); std::move(callback));
} }
void ServiceWorkerStorageControlImpl::ApplyPolicyUpdates(
const std::vector<storage::mojom::LocalStoragePolicyUpdatePtr>
policy_updates) {
storage_->ApplyPolicyUpdates(std::move(policy_updates));
}
} // namespace content } // namespace content
...@@ -109,6 +109,9 @@ class CONTENT_EXPORT ServiceWorkerStorageControlImpl ...@@ -109,6 +109,9 @@ class CONTENT_EXPORT ServiceWorkerStorageControlImpl
void ClearUserDataForAllRegistrationsByKeyPrefix( void ClearUserDataForAllRegistrationsByKeyPrefix(
const std::string& key_prefix, const std::string& key_prefix,
ClearUserDataForAllRegistrationsByKeyPrefixCallback callback) override; ClearUserDataForAllRegistrationsByKeyPrefixCallback callback) override;
void ApplyPolicyUpdates(
const std::vector<storage::mojom::LocalStoragePolicyUpdatePtr>
policy_updates) override;
const std::unique_ptr<ServiceWorkerStorage> storage_; const std::unique_ptr<ServiceWorkerStorage> storage_;
}; };
......
...@@ -152,7 +152,12 @@ class ServiceWorkerStorageControlImplTest : public testing::Test { ...@@ -152,7 +152,12 @@ class ServiceWorkerStorageControlImplTest : public testing::Test {
void SetUp() override { void SetUp() override {
ASSERT_TRUE(user_data_directory_.CreateUniqueTempDir()); ASSERT_TRUE(user_data_directory_.CreateUniqueTempDir());
SetUpStorage();
}
void TearDown() override { DestroyStorage(); }
void SetUpStorage() {
auto storage = ServiceWorkerStorage::Create( auto storage = ServiceWorkerStorage::Create(
user_data_directory_.GetPath(), user_data_directory_.GetPath(),
/*database_task_runner=*/base::ThreadTaskRunnerHandle::Get(), /*database_task_runner=*/base::ThreadTaskRunnerHandle::Get(),
...@@ -161,12 +166,18 @@ class ServiceWorkerStorageControlImplTest : public testing::Test { ...@@ -161,12 +166,18 @@ class ServiceWorkerStorageControlImplTest : public testing::Test {
std::make_unique<ServiceWorkerStorageControlImpl>(std::move(storage)); std::make_unique<ServiceWorkerStorageControlImpl>(std::move(storage));
} }
void TearDown() override { void DestroyStorage() {
storage_impl_.reset(); storage_impl_.reset();
disk_cache::FlushCacheThreadForTesting(); disk_cache::FlushCacheThreadForTesting();
content::RunAllTasksUntilIdle(); content::RunAllTasksUntilIdle();
} }
void RestartStorage() {
DestroyStorage();
SetUpStorage();
LazyInitializeForTest();
}
storage::mojom::ServiceWorkerStorageControl* storage() { storage::mojom::ServiceWorkerStorageControl* storage() {
return storage_impl_.get(); return storage_impl_.get();
} }
...@@ -1099,4 +1110,46 @@ TEST_F(ServiceWorkerStorageControlImplTest, ...@@ -1099,4 +1110,46 @@ TEST_F(ServiceWorkerStorageControlImplTest,
EXPECT_EQ(result.values.size(), 0UL); EXPECT_EQ(result.values.size(), 0UL);
} }
// Tests that apply policy updates work.
TEST_F(ServiceWorkerStorageControlImplTest, ApplyPolicyUpdates) {
const GURL kScope1("https://foo.example.com/");
const GURL kScriptUrl1("https://foo.example.com/sw.js");
const GURL kScope2("https://bar.example.com/");
const GURL kScriptUrl2("https://bar.example.com/sw.js");
const int64_t kScriptSize = 10;
LazyInitializeForTest();
// Preparation: Create and store two registrations.
DatabaseStatus status;
const int64_t registration_id1 = GetNewRegistrationId();
const int64_t version_id1 = GetNewVersionId();
status = CreateAndStoreRegistration(registration_id1, version_id1, kScope1,
kScriptUrl1, kScriptSize);
ASSERT_EQ(status, DatabaseStatus::kOk);
const int64_t registration_id2 = GetNewRegistrationId();
const int64_t version_id2 = GetNewVersionId();
status = CreateAndStoreRegistration(registration_id2, version_id2, kScope2,
kScriptUrl2, kScriptSize);
ASSERT_EQ(status, DatabaseStatus::kOk);
// Update policies to purge the registration for |kScope2| on shutdown.
std::vector<storage::mojom::LocalStoragePolicyUpdatePtr> updates;
updates.push_back(storage::mojom::LocalStoragePolicyUpdate::New(
url::Origin::Create(kScope2.GetOrigin()), /*purge_on_shutdown=*/true));
storage()->ApplyPolicyUpdates(std::move(updates));
// Restart the storage and check the registration for |kScope1| exists
// but not for |kScope2|.
RestartStorage();
{
FindRegistrationResult result = FindRegistrationForScope(kScope1);
ASSERT_EQ(result->status, DatabaseStatus::kOk);
}
{
FindRegistrationResult result = FindRegistrationForScope(kScope2);
ASSERT_EQ(result->status, DatabaseStatus::kErrorNotFound);
}
}
} // namespace content } // namespace content
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment