Commit 86c42e1a authored by Kenichi Ishibashi's avatar Kenichi Ishibashi Committed by Commit Bot

service worker: Move GetOrCreateRegistration to ServiceWorkerRegistry

This method depends on in memory representation of some service
worker objects (e.g. ServiceWorkerRegistration and
ServiceWorkerVersion). Move it to ServiceWorkerRegistry.

Bug: 1039200
Change-Id: I2c11ff418504289c85ffbeb570b934069899b56c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2004355
Commit-Queue: Kenichi Ishibashi <bashi@chromium.org>
Reviewed-by: default avatarHiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/heads/master@{#732319}
parent 43ad7d94
......@@ -7,6 +7,7 @@
#include "base/memory/ptr_util.h"
#include "base/memory/weak_ptr.h"
#include "base/trace_event/trace_event.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_registration.h"
#include "content/browser/service_worker/service_worker_version.h"
#include "content/common/service_worker/service_worker_utils.h"
......@@ -35,19 +36,25 @@ ServiceWorkerRegistry::ServiceWorkerRegistry(
scoped_refptr<base::SequencedTaskRunner> database_task_runner,
storage::QuotaManagerProxy* quota_manager_proxy,
storage::SpecialStoragePolicy* special_storage_policy)
: storage_(ServiceWorkerStorage::Create(user_data_directory,
: context_(context),
storage_(ServiceWorkerStorage::Create(user_data_directory,
context,
std::move(database_task_runner),
quota_manager_proxy,
special_storage_policy,
this)) {}
this)) {
DCHECK(context_);
}
ServiceWorkerRegistry::ServiceWorkerRegistry(
ServiceWorkerContextCore* context,
ServiceWorkerRegistry* old_registry)
: storage_(ServiceWorkerStorage::Create(context,
: context_(context),
storage_(ServiceWorkerStorage::Create(context,
old_registry->storage(),
this)) {}
this)) {
DCHECK(context_);
}
ServiceWorkerRegistry::~ServiceWorkerRegistry() = default;
......@@ -164,6 +171,59 @@ ServiceWorkerRegistry::FindInstallingRegistrationForId(
return found->second.get();
}
scoped_refptr<ServiceWorkerRegistration>
ServiceWorkerRegistry::GetOrCreateRegistration(
const ServiceWorkerDatabase::RegistrationData& data,
const ResourceList& resources) {
scoped_refptr<ServiceWorkerRegistration> registration =
context_->GetLiveRegistration(data.registration_id);
if (registration)
return registration;
blink::mojom::ServiceWorkerRegistrationOptions options(
data.scope, data.script_type, data.update_via_cache);
registration = base::MakeRefCounted<ServiceWorkerRegistration>(
options, data.registration_id, context_->AsWeakPtr());
registration->set_resources_total_size_bytes(data.resources_total_size_bytes);
registration->set_last_update_check(data.last_update_check);
DCHECK(uninstalling_registrations().find(data.registration_id) ==
uninstalling_registrations().end());
scoped_refptr<ServiceWorkerVersion> version =
context_->GetLiveVersion(data.version_id);
if (!version) {
version = base::MakeRefCounted<ServiceWorkerVersion>(
registration.get(), data.script, data.script_type, data.version_id,
context_->AsWeakPtr());
version->set_fetch_handler_existence(
data.has_fetch_handler
? ServiceWorkerVersion::FetchHandlerExistence::EXISTS
: ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
version->SetStatus(data.is_active ? ServiceWorkerVersion::ACTIVATED
: ServiceWorkerVersion::INSTALLED);
version->script_cache_map()->SetResources(resources);
if (data.origin_trial_tokens)
version->SetValidOriginTrialTokens(*data.origin_trial_tokens);
version->set_used_features(data.used_features);
version->set_cross_origin_embedder_policy(
data.cross_origin_embedder_policy);
}
version->set_script_response_time_for_devtools(data.script_response_time);
if (version->status() == ServiceWorkerVersion::ACTIVATED)
registration->SetActiveVersion(version);
else if (version->status() == ServiceWorkerVersion::INSTALLED)
registration->SetWaitingVersion(version);
else
NOTREACHED();
registration->EnableNavigationPreload(data.navigation_preload_state.enabled);
registration->SetNavigationPreloadHeader(
data.navigation_preload_state.header);
return registration;
}
void ServiceWorkerRegistry::DidFindRegistrationForClientUrl(
const GURL& client_url,
int64_t trace_event_id,
......
......@@ -9,6 +9,7 @@
#include "base/files/file_path.h"
#include "base/memory/scoped_refptr.h"
#include "content/browser/service_worker/service_worker_database.h"
#include "content/browser/service_worker/service_worker_storage.h"
#include "content/common/content_export.h"
......@@ -92,6 +93,13 @@ class CONTENT_EXPORT ServiceWorkerRegistry {
ServiceWorkerRegistration* FindInstallingRegistrationForId(
int64_t registration_id);
// TODO(crbug.com/1039200): Make this private once methods/fields related to
// ServiceWorkerRegistration in ServiceWorkerStorage are moved into this
// class.
scoped_refptr<ServiceWorkerRegistration> GetOrCreateRegistration(
const ServiceWorkerDatabase::RegistrationData& data,
const ResourceList& resources);
using RegistrationRefsById =
std::map<int64_t, scoped_refptr<ServiceWorkerRegistration>>;
// TODO(crbug.com/1039200): Remove these accessors. These are tentatively
......@@ -112,6 +120,9 @@ class CONTENT_EXPORT ServiceWorkerRegistry {
blink::ServiceWorkerStatusCode status,
scoped_refptr<ServiceWorkerRegistration> registration);
// The ServiceWorkerContextCore object must outlive this.
ServiceWorkerContextCore* const context_;
std::unique_ptr<ServiceWorkerStorage> storage_;
// For finding registrations being installed or uninstalled.
......
......@@ -1258,7 +1258,7 @@ void ServiceWorkerStorage::ReturnFoundRegistration(
const ResourceList& resources) {
DCHECK(!resources.empty());
scoped_refptr<ServiceWorkerRegistration> registration =
GetOrCreateRegistration(data, resources);
registry_->GetOrCreateRegistration(data, resources);
CompleteFindNow(std::move(registration), blink::ServiceWorkerStatusCode::kOk,
std::move(callback));
}
......@@ -1288,7 +1288,7 @@ void ServiceWorkerStorage::DidGetRegistrationsForOrigin(
size_t index = 0;
for (const auto& registration_data : *registration_data_list) {
registration_ids.insert(registration_data.registration_id);
registrations.push_back(GetOrCreateRegistration(
registrations.push_back(registry_->GetOrCreateRegistration(
registration_data, resources_list->at(index++)));
}
......@@ -1546,59 +1546,6 @@ void ServiceWorkerStorage::DidGetUserDataForAllRegistrations(
std::move(callback).Run(user_data, DatabaseStatusToStatusCode(status));
}
scoped_refptr<ServiceWorkerRegistration>
ServiceWorkerStorage::GetOrCreateRegistration(
const ServiceWorkerDatabase::RegistrationData& data,
const ResourceList& resources) {
scoped_refptr<ServiceWorkerRegistration> registration =
context_->GetLiveRegistration(data.registration_id);
if (registration)
return registration;
blink::mojom::ServiceWorkerRegistrationOptions options(
data.scope, data.script_type, data.update_via_cache);
registration = new ServiceWorkerRegistration(options, data.registration_id,
context_->AsWeakPtr());
registration->set_resources_total_size_bytes(data.resources_total_size_bytes);
registration->set_last_update_check(data.last_update_check);
DCHECK(registry_->uninstalling_registrations().find(data.registration_id) ==
registry_->uninstalling_registrations().end());
scoped_refptr<ServiceWorkerVersion> version =
context_->GetLiveVersion(data.version_id);
if (!version) {
version = base::MakeRefCounted<ServiceWorkerVersion>(
registration.get(), data.script, data.script_type, data.version_id,
context_->AsWeakPtr());
version->set_fetch_handler_existence(
data.has_fetch_handler
? ServiceWorkerVersion::FetchHandlerExistence::EXISTS
: ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
version->SetStatus(data.is_active ?
ServiceWorkerVersion::ACTIVATED : ServiceWorkerVersion::INSTALLED);
version->script_cache_map()->SetResources(resources);
if (data.origin_trial_tokens)
version->SetValidOriginTrialTokens(*data.origin_trial_tokens);
version->set_used_features(data.used_features);
version->set_cross_origin_embedder_policy(
data.cross_origin_embedder_policy);
}
version->set_script_response_time_for_devtools(data.script_response_time);
if (version->status() == ServiceWorkerVersion::ACTIVATED)
registration->SetActiveVersion(version);
else if (version->status() == ServiceWorkerVersion::INSTALLED)
registration->SetWaitingVersion(version);
else
NOTREACHED();
registration->EnableNavigationPreload(data.navigation_preload_state.enabled);
registration->SetNavigationPreloadHeader(
data.navigation_preload_state.header);
return registration;
}
ServiceWorkerDiskCache* ServiceWorkerStorage::disk_cache() {
DCHECK(STORAGE_STATE_INITIALIZED == state_ ||
STORAGE_STATE_DISABLED == state_)
......
......@@ -447,10 +447,6 @@ class CONTENT_EXPORT ServiceWorkerStorage {
const ServiceWorkerDatabase::RegistrationData& data,
const ResourceList& resources);
scoped_refptr<ServiceWorkerRegistration> GetOrCreateRegistration(
const ServiceWorkerDatabase::RegistrationData& data,
const ResourceList& resources);
// Lazy disk_cache getter.
ServiceWorkerDiskCache* disk_cache();
void InitializeDiskCache();
......
......@@ -1259,7 +1259,7 @@ class ServiceWorkerResourceStorageTest : public ServiceWorkerStorageTest {
ResourceRecord(resource_id1_, script_, resource_id1_size_));
resources.push_back(
ResourceRecord(resource_id2_, import_, resource_id2_size_));
registration_ = storage()->GetOrCreateRegistration(data, resources);
registration_ = registry()->GetOrCreateRegistration(data, resources);
registration_->waiting_version()->SetStatus(ServiceWorkerVersion::NEW);
// Add the resources ids to the uncommitted list.
......
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