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 @@ ...@@ -7,6 +7,7 @@
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/trace_event/trace_event.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_registration.h"
#include "content/browser/service_worker/service_worker_version.h" #include "content/browser/service_worker/service_worker_version.h"
#include "content/common/service_worker/service_worker_utils.h" #include "content/common/service_worker/service_worker_utils.h"
...@@ -35,19 +36,25 @@ ServiceWorkerRegistry::ServiceWorkerRegistry( ...@@ -35,19 +36,25 @@ ServiceWorkerRegistry::ServiceWorkerRegistry(
scoped_refptr<base::SequencedTaskRunner> database_task_runner, scoped_refptr<base::SequencedTaskRunner> database_task_runner,
storage::QuotaManagerProxy* quota_manager_proxy, storage::QuotaManagerProxy* quota_manager_proxy,
storage::SpecialStoragePolicy* special_storage_policy) storage::SpecialStoragePolicy* special_storage_policy)
: storage_(ServiceWorkerStorage::Create(user_data_directory, : context_(context),
storage_(ServiceWorkerStorage::Create(user_data_directory,
context, context,
std::move(database_task_runner), std::move(database_task_runner),
quota_manager_proxy, quota_manager_proxy,
special_storage_policy, special_storage_policy,
this)) {} this)) {
DCHECK(context_);
}
ServiceWorkerRegistry::ServiceWorkerRegistry( ServiceWorkerRegistry::ServiceWorkerRegistry(
ServiceWorkerContextCore* context, ServiceWorkerContextCore* context,
ServiceWorkerRegistry* old_registry) ServiceWorkerRegistry* old_registry)
: storage_(ServiceWorkerStorage::Create(context, : context_(context),
storage_(ServiceWorkerStorage::Create(context,
old_registry->storage(), old_registry->storage(),
this)) {} this)) {
DCHECK(context_);
}
ServiceWorkerRegistry::~ServiceWorkerRegistry() = default; ServiceWorkerRegistry::~ServiceWorkerRegistry() = default;
...@@ -164,6 +171,59 @@ ServiceWorkerRegistry::FindInstallingRegistrationForId( ...@@ -164,6 +171,59 @@ ServiceWorkerRegistry::FindInstallingRegistrationForId(
return found->second.get(); 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( void ServiceWorkerRegistry::DidFindRegistrationForClientUrl(
const GURL& client_url, const GURL& client_url,
int64_t trace_event_id, int64_t trace_event_id,
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/memory/scoped_refptr.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/browser/service_worker/service_worker_storage.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
...@@ -92,6 +93,13 @@ class CONTENT_EXPORT ServiceWorkerRegistry { ...@@ -92,6 +93,13 @@ class CONTENT_EXPORT ServiceWorkerRegistry {
ServiceWorkerRegistration* FindInstallingRegistrationForId( ServiceWorkerRegistration* FindInstallingRegistrationForId(
int64_t registration_id); 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 = using RegistrationRefsById =
std::map<int64_t, scoped_refptr<ServiceWorkerRegistration>>; std::map<int64_t, scoped_refptr<ServiceWorkerRegistration>>;
// TODO(crbug.com/1039200): Remove these accessors. These are tentatively // TODO(crbug.com/1039200): Remove these accessors. These are tentatively
...@@ -112,6 +120,9 @@ class CONTENT_EXPORT ServiceWorkerRegistry { ...@@ -112,6 +120,9 @@ class CONTENT_EXPORT ServiceWorkerRegistry {
blink::ServiceWorkerStatusCode status, blink::ServiceWorkerStatusCode status,
scoped_refptr<ServiceWorkerRegistration> registration); scoped_refptr<ServiceWorkerRegistration> registration);
// The ServiceWorkerContextCore object must outlive this.
ServiceWorkerContextCore* const context_;
std::unique_ptr<ServiceWorkerStorage> storage_; std::unique_ptr<ServiceWorkerStorage> storage_;
// For finding registrations being installed or uninstalled. // For finding registrations being installed or uninstalled.
......
...@@ -1258,7 +1258,7 @@ void ServiceWorkerStorage::ReturnFoundRegistration( ...@@ -1258,7 +1258,7 @@ void ServiceWorkerStorage::ReturnFoundRegistration(
const ResourceList& resources) { const ResourceList& resources) {
DCHECK(!resources.empty()); DCHECK(!resources.empty());
scoped_refptr<ServiceWorkerRegistration> registration = scoped_refptr<ServiceWorkerRegistration> registration =
GetOrCreateRegistration(data, resources); registry_->GetOrCreateRegistration(data, resources);
CompleteFindNow(std::move(registration), blink::ServiceWorkerStatusCode::kOk, CompleteFindNow(std::move(registration), blink::ServiceWorkerStatusCode::kOk,
std::move(callback)); std::move(callback));
} }
...@@ -1288,7 +1288,7 @@ void ServiceWorkerStorage::DidGetRegistrationsForOrigin( ...@@ -1288,7 +1288,7 @@ void ServiceWorkerStorage::DidGetRegistrationsForOrigin(
size_t index = 0; size_t index = 0;
for (const auto& registration_data : *registration_data_list) { for (const auto& registration_data : *registration_data_list) {
registration_ids.insert(registration_data.registration_id); registration_ids.insert(registration_data.registration_id);
registrations.push_back(GetOrCreateRegistration( registrations.push_back(registry_->GetOrCreateRegistration(
registration_data, resources_list->at(index++))); registration_data, resources_list->at(index++)));
} }
...@@ -1546,59 +1546,6 @@ void ServiceWorkerStorage::DidGetUserDataForAllRegistrations( ...@@ -1546,59 +1546,6 @@ void ServiceWorkerStorage::DidGetUserDataForAllRegistrations(
std::move(callback).Run(user_data, DatabaseStatusToStatusCode(status)); 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() { ServiceWorkerDiskCache* ServiceWorkerStorage::disk_cache() {
DCHECK(STORAGE_STATE_INITIALIZED == state_ || DCHECK(STORAGE_STATE_INITIALIZED == state_ ||
STORAGE_STATE_DISABLED == state_) STORAGE_STATE_DISABLED == state_)
......
...@@ -447,10 +447,6 @@ class CONTENT_EXPORT ServiceWorkerStorage { ...@@ -447,10 +447,6 @@ class CONTENT_EXPORT ServiceWorkerStorage {
const ServiceWorkerDatabase::RegistrationData& data, const ServiceWorkerDatabase::RegistrationData& data,
const ResourceList& resources); const ResourceList& resources);
scoped_refptr<ServiceWorkerRegistration> GetOrCreateRegistration(
const ServiceWorkerDatabase::RegistrationData& data,
const ResourceList& resources);
// Lazy disk_cache getter. // Lazy disk_cache getter.
ServiceWorkerDiskCache* disk_cache(); ServiceWorkerDiskCache* disk_cache();
void InitializeDiskCache(); void InitializeDiskCache();
......
...@@ -1259,7 +1259,7 @@ class ServiceWorkerResourceStorageTest : public ServiceWorkerStorageTest { ...@@ -1259,7 +1259,7 @@ class ServiceWorkerResourceStorageTest : public ServiceWorkerStorageTest {
ResourceRecord(resource_id1_, script_, resource_id1_size_)); ResourceRecord(resource_id1_, script_, resource_id1_size_));
resources.push_back( resources.push_back(
ResourceRecord(resource_id2_, import_, resource_id2_size_)); ResourceRecord(resource_id2_, import_, resource_id2_size_));
registration_ = storage()->GetOrCreateRegistration(data, resources); registration_ = registry()->GetOrCreateRegistration(data, resources);
registration_->waiting_version()->SetStatus(ServiceWorkerVersion::NEW); registration_->waiting_version()->SetStatus(ServiceWorkerVersion::NEW);
// Add the resources ids to the uncommitted list. // 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