Commit 5094fa02 authored by Leon Han's avatar Leon Han Committed by Commit Bot

[OnionSoup] Make SWContainer a supplement of Document

After https://crrev.com/c/1238079, blink::SWContainerClient becomes a
supplement of Document and its only user is blink::SWContainer.
This indirection looks redundant, so this CL refactors SWContainer to be
also a supplement of Document and makes it take over all code logic of
SWContainerClient, then removes SWContainerClient completely.

BUG=789857

Change-Id: If2ecede8530c5d3a922f2388853b46b860fbbb2f
Reviewed-on: https://chromium-review.googlesource.com/c/1286434
Commit-Queue: Leon Han <leon.han@intel.com>
Reviewed-by: default avatarMakoto Shimazu <shimazu@chromium.org>
Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#604175}
parent e70b5b06
...@@ -50,10 +50,9 @@ struct WebServiceWorkerError; ...@@ -50,10 +50,9 @@ struct WebServiceWorkerError;
// //
// It is implemented by content::WebServiceWorkerProviderImpl. // It is implemented by content::WebServiceWorkerProviderImpl.
// //
// WebServiceWorkerProvider is created in ServiceWorkerContainerClient::From(), // WebServiceWorkerProvider is created in ServiceWorkerContainer::From(),
// which is used to instantiate navigator.serviceWorker. It is // which is used to instantiate navigator.serviceWorker. It is owned by
// owned by ServiceWorkerContainerClient, which is a // ServiceWorkerContainer, which is a garbage collected Supplement for Document.
// garbage collected Supplement for Document.
// //
// Each ServiceWorkerContainer instance has a WebServiceWorkerProvider. // Each ServiceWorkerContainer instance has a WebServiceWorkerProvider.
// ServiceWorkerContainer is called the "client" of the // ServiceWorkerContainer is called the "client" of the
......
...@@ -30,8 +30,6 @@ blink_modules_sources("service_worker") { ...@@ -30,8 +30,6 @@ blink_modules_sources("service_worker") {
"service_worker_clients.h", "service_worker_clients.h",
"service_worker_container.cc", "service_worker_container.cc",
"service_worker_container.h", "service_worker_container.h",
"service_worker_container_client.cc",
"service_worker_container_client.h",
"service_worker_content_settings_proxy.cc", "service_worker_content_settings_proxy.cc",
"service_worker_content_settings_proxy.h", "service_worker_content_settings_proxy.h",
"service_worker_error.cc", "service_worker_error.cc",
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include "third_party/blink/renderer/bindings/core/v8/callback_promise_adapter.h" #include "third_party/blink/renderer/bindings/core/v8/callback_promise_adapter.h"
#include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/dom/dom_exception.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker_container_client.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h" #include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h"
#include "third_party/blink/renderer/platform/network/http_parsers.h" #include "third_party/blink/renderer/platform/network/http_parsers.h"
......
...@@ -122,23 +122,13 @@ ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker( ...@@ -122,23 +122,13 @@ ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(
frame->GetSecurityContext()->GetSecurityOrigin()->IsLocal()) { frame->GetSecurityContext()->GetSecurityOrigin()->IsLocal()) {
UseCounter::Count(frame, WebFeature::kFileAccessedServiceWorker); UseCounter::Count(frame, WebFeature::kFileAccessedServiceWorker);
} }
if (!service_worker_ && frame) { if (!frame)
// We need to create a new ServiceWorkerContainer when the frame return nullptr;
// navigates to a new document. In practice, this happens only when the return ServiceWorkerContainer::From(
// frame navigates from the initial empty page to a new same-origin page. To<Document>(frame->DomWindow()->GetExecutionContext()));
DCHECK(frame->DomWindow());
service_worker_ = ServiceWorkerContainer::Create(
frame->DomWindow()->GetExecutionContext(), this);
}
return service_worker_.Get();
}
void NavigatorServiceWorker::ClearServiceWorker() {
service_worker_ = nullptr;
} }
void NavigatorServiceWorker::Trace(blink::Visitor* visitor) { void NavigatorServiceWorker::Trace(blink::Visitor* visitor) {
visitor->Trace(service_worker_);
Supplement<Navigator>::Trace(visitor); Supplement<Navigator>::Trace(visitor);
} }
......
...@@ -35,16 +35,12 @@ class MODULES_EXPORT NavigatorServiceWorker final ...@@ -35,16 +35,12 @@ class MODULES_EXPORT NavigatorServiceWorker final
static ServiceWorkerContainer* serviceWorker(ScriptState*, static ServiceWorkerContainer* serviceWorker(ScriptState*,
Navigator&, Navigator&,
String& error_message); String& error_message);
void ClearServiceWorker();
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
private: private:
explicit NavigatorServiceWorker(Navigator&); explicit NavigatorServiceWorker(Navigator&);
ServiceWorkerContainer* serviceWorker(LocalFrame*, ExceptionState&); ServiceWorkerContainer* serviceWorker(LocalFrame*, ExceptionState&);
ServiceWorkerContainer* serviceWorker(LocalFrame*, String& error_message); ServiceWorkerContainer* serviceWorker(LocalFrame*, String& error_message);
Member<ServiceWorkerContainer> service_worker_;
}; };
} // namespace blink } // namespace blink
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
#include "third_party/blink/renderer/core/messaging/message_port.h" #include "third_party/blink/renderer/core/messaging/message_port.h"
#include "third_party/blink/renderer/core/messaging/post_message_options.h" #include "third_party/blink/renderer/core/messaging/post_message_options.h"
#include "third_party/blink/renderer/modules/event_target_modules.h" #include "third_party/blink/renderer/modules/event_target_modules.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker_container_client.h" #include "third_party/blink/renderer/modules/service_worker/service_worker_container.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h" #include "third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h"
...@@ -161,7 +161,7 @@ ServiceWorker* ServiceWorker::From(ExecutionContext* context, ...@@ -161,7 +161,7 @@ ServiceWorker* ServiceWorker::From(ExecutionContext* context,
return scope->GetOrCreateServiceWorker(std::move(info)); return scope->GetOrCreateServiceWorker(std::move(info));
} }
return ServiceWorkerContainerClient::From(To<Document>(context)) return ServiceWorkerContainer::From(To<Document>(context))
->GetOrCreateServiceWorker(std::move(info)); ->GetOrCreateServiceWorker(std::move(info));
} }
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include "base/macros.h" #include "base/macros.h"
#include "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom-blink.h" #include "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom-blink.h"
#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_provider.h"
#include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/platform/web_url.h"
#include "third_party/blink/renderer/bindings/core/v8/callback_promise_adapter.h" #include "third_party/blink/renderer/bindings/core/v8/callback_promise_adapter.h"
...@@ -49,14 +48,14 @@ ...@@ -49,14 +48,14 @@
#include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
#include "third_party/blink/renderer/core/frame/deprecation.h" #include "third_party/blink/renderer/core/frame/deprecation.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/local_frame_client.h"
#include "third_party/blink/renderer/core/frame/use_counter.h" #include "third_party/blink/renderer/core/frame/use_counter.h"
#include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/inspector/console_message.h"
#include "third_party/blink/renderer/core/messaging/blink_transferable_message.h" #include "third_party/blink/renderer/core/messaging/blink_transferable_message.h"
#include "third_party/blink/renderer/core/messaging/message_port.h" #include "third_party/blink/renderer/core/messaging/message_port.h"
#include "third_party/blink/renderer/modules/event_target_modules.h" #include "third_party/blink/renderer/modules/event_target_modules.h"
#include "third_party/blink/renderer/modules/service_worker/navigator_service_worker.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker.h" #include "third_party/blink/renderer/modules/service_worker/service_worker.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker_container_client.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker_error.h" #include "third_party/blink/renderer/modules/service_worker/service_worker_error.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h" #include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h"
...@@ -137,7 +136,7 @@ class ServiceWorkerContainer::GetRegistrationForReadyCallback ...@@ -137,7 +136,7 @@ class ServiceWorkerContainer::GetRegistrationForReadyCallback
if (ready_->GetExecutionContext() && if (ready_->GetExecutionContext() &&
!ready_->GetExecutionContext()->IsContextDestroyed()) { !ready_->GetExecutionContext()->IsContextDestroyed()) {
ready_->Resolve( ready_->Resolve(
ServiceWorkerContainerClient::From( ServiceWorkerContainer::From(
To<Document>(ready_->GetExecutionContext())) To<Document>(ready_->GetExecutionContext()))
->GetOrCreateServiceWorkerRegistration(std::move(info))); ->GetOrCreateServiceWorkerRegistration(std::move(info)));
} }
...@@ -148,10 +147,37 @@ class ServiceWorkerContainer::GetRegistrationForReadyCallback ...@@ -148,10 +147,37 @@ class ServiceWorkerContainer::GetRegistrationForReadyCallback
DISALLOW_COPY_AND_ASSIGN(GetRegistrationForReadyCallback); DISALLOW_COPY_AND_ASSIGN(GetRegistrationForReadyCallback);
}; };
ServiceWorkerContainer* ServiceWorkerContainer::Create( const char ServiceWorkerContainer::kSupplementName[] = "ServiceWorkerContainer";
ExecutionContext* execution_context,
NavigatorServiceWorker* navigator) { ServiceWorkerContainer* ServiceWorkerContainer::From(Document* document) {
return new ServiceWorkerContainer(execution_context, navigator); if (!document)
return nullptr;
ServiceWorkerContainer* container =
Supplement<Document>::From<ServiceWorkerContainer>(document);
if (!container) {
// TODO(leonhsl): Figure out whether it's really necessary to create an
// instance when there's no frame or frame client for |document|.
container = new ServiceWorkerContainer(document);
Supplement<Document>::ProvideTo(*document, container);
if (document->GetFrame() && document->GetFrame()->Client()) {
std::unique_ptr<WebServiceWorkerProvider> provider =
document->GetFrame()->Client()->CreateServiceWorkerProvider();
if (provider) {
provider->SetClient(container);
container->provider_ = std::move(provider);
}
}
}
return container;
}
ServiceWorkerContainer* ServiceWorkerContainer::CreateForTesting(
Document* document,
std::unique_ptr<WebServiceWorkerProvider> provider) {
ServiceWorkerContainer* container = new ServiceWorkerContainer(document);
container->provider_ = std::move(provider);
return container;
} }
ServiceWorkerContainer::~ServiceWorkerContainer() { ServiceWorkerContainer::~ServiceWorkerContainer() {
...@@ -164,14 +190,15 @@ void ServiceWorkerContainer::ContextDestroyed(ExecutionContext*) { ...@@ -164,14 +190,15 @@ void ServiceWorkerContainer::ContextDestroyed(ExecutionContext*) {
provider_ = nullptr; provider_ = nullptr;
} }
controller_ = nullptr; controller_ = nullptr;
navigator_->ClearServiceWorker();
} }
void ServiceWorkerContainer::Trace(blink::Visitor* visitor) { void ServiceWorkerContainer::Trace(blink::Visitor* visitor) {
visitor->Trace(controller_); visitor->Trace(controller_);
visitor->Trace(ready_); visitor->Trace(ready_);
visitor->Trace(navigator_); visitor->Trace(service_worker_registration_objects_);
visitor->Trace(service_worker_objects_);
EventTargetWithInlineData::Trace(visitor); EventTargetWithInlineData::Trace(visitor);
Supplement<Document>::Trace(visitor);
ContextLifecycleObserver::Trace(visitor); ContextLifecycleObserver::Trace(visitor);
} }
...@@ -476,27 +503,48 @@ void ServiceWorkerContainer::CountFeature(mojom::WebFeature feature) { ...@@ -476,27 +503,48 @@ void ServiceWorkerContainer::CountFeature(mojom::WebFeature feature) {
Deprecation::CountDeprecation(GetExecutionContext(), feature); Deprecation::CountDeprecation(GetExecutionContext(), feature);
} }
ExecutionContext* ServiceWorkerContainer::GetExecutionContext() const {
return GetSupplementable();
}
const AtomicString& ServiceWorkerContainer::InterfaceName() const { const AtomicString& ServiceWorkerContainer::InterfaceName() const {
return EventTargetNames::ServiceWorkerContainer; return EventTargetNames::ServiceWorkerContainer;
} }
ServiceWorkerContainer::ServiceWorkerContainer( ServiceWorkerRegistration*
ExecutionContext* execution_context, ServiceWorkerContainer::GetOrCreateServiceWorkerRegistration(
NavigatorServiceWorker* navigator) WebServiceWorkerRegistrationObjectInfo info) {
: ContextLifecycleObserver(execution_context), if (info.registration_id == mojom::blink::kInvalidServiceWorkerRegistrationId)
provider_(nullptr), return nullptr;
navigator_(navigator) {
if (!execution_context) ServiceWorkerRegistration* registration =
return; service_worker_registration_objects_.at(info.registration_id);
if (registration) {
registration->Attach(std::move(info));
return registration;
}
if (ServiceWorkerContainerClient* client = registration =
ServiceWorkerContainerClient::From(To<Document>(execution_context))) { new ServiceWorkerRegistration(GetSupplementable(), std::move(info));
provider_ = client->Provider(); service_worker_registration_objects_.Set(info.registration_id, registration);
if (provider_) return registration;
provider_->SetClient(this); }
ServiceWorker* ServiceWorkerContainer::GetOrCreateServiceWorker(
WebServiceWorkerObjectInfo info) {
if (info.version_id == mojom::blink::kInvalidServiceWorkerVersionId)
return nullptr;
ServiceWorker* worker = service_worker_objects_.at(info.version_id);
if (!worker) {
worker = new ServiceWorker(GetSupplementable(), std::move(info));
service_worker_objects_.Set(info.version_id, worker);
} }
return worker;
} }
ServiceWorkerContainer::ServiceWorkerContainer(Document* document)
: Supplement<Document>(*document), ContextLifecycleObserver(document) {}
ServiceWorkerContainer::ReadyProperty* ServiceWorkerContainer::ReadyProperty*
ServiceWorkerContainer::CreateReadyProperty() { ServiceWorkerContainer::CreateReadyProperty() {
return new ReadyProperty(GetExecutionContext(), this, ReadyProperty::kReady); return new ReadyProperty(GetExecutionContext(), this, ReadyProperty::kReady);
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_property.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_property.h"
#include "third_party/blink/renderer/core/dom/context_lifecycle_observer.h" #include "third_party/blink/renderer/core/dom/context_lifecycle_observer.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/events/event_target.h" #include "third_party/blink/renderer/core/dom/events/event_target.h"
#include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/modules/service_worker/registration_options.h" #include "third_party/blink/renderer/modules/service_worker/registration_options.h"
...@@ -50,11 +51,10 @@ ...@@ -50,11 +51,10 @@
namespace blink { namespace blink {
class ExecutionContext; class ExecutionContext;
class NavigatorServiceWorker;
class WebServiceWorkerProvider;
class MODULES_EXPORT ServiceWorkerContainer final class MODULES_EXPORT ServiceWorkerContainer final
: public EventTargetWithInlineData, : public EventTargetWithInlineData,
public Supplement<Document>,
public ContextLifecycleObserver, public ContextLifecycleObserver,
public WebServiceWorkerProviderClient { public WebServiceWorkerProviderClient {
DEFINE_WRAPPERTYPEINFO(); DEFINE_WRAPPERTYPEINFO();
...@@ -64,15 +64,19 @@ class MODULES_EXPORT ServiceWorkerContainer final ...@@ -64,15 +64,19 @@ class MODULES_EXPORT ServiceWorkerContainer final
using RegistrationCallbacks = using RegistrationCallbacks =
WebServiceWorkerProvider::WebServiceWorkerRegistrationCallbacks; WebServiceWorkerProvider::WebServiceWorkerRegistrationCallbacks;
static ServiceWorkerContainer* Create(ExecutionContext*, static const char kSupplementName[];
NavigatorServiceWorker*);
static ServiceWorkerContainer* From(Document*);
static ServiceWorkerContainer* CreateForTesting(
Document*,
std::unique_ptr<WebServiceWorkerProvider>);
~ServiceWorkerContainer() override; ~ServiceWorkerContainer() override;
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
ServiceWorker* controller() { return controller_; } ServiceWorker* controller() { return controller_; }
ScriptPromise ready(ScriptState*); ScriptPromise ready(ScriptState*);
WebServiceWorkerProvider* Provider() { return provider_; }
ScriptPromise registerServiceWorker(ScriptState*, ScriptPromise registerServiceWorker(ScriptState*,
const String& pattern, const String& pattern,
...@@ -90,16 +94,23 @@ class MODULES_EXPORT ServiceWorkerContainer final ...@@ -90,16 +94,23 @@ class MODULES_EXPORT ServiceWorkerContainer final
void CountFeature(mojom::WebFeature) override; void CountFeature(mojom::WebFeature) override;
// EventTarget overrides. // EventTarget overrides.
ExecutionContext* GetExecutionContext() const override { ExecutionContext* GetExecutionContext() const override;
return ContextLifecycleObserver::GetExecutionContext();
}
const AtomicString& InterfaceName() const override; const AtomicString& InterfaceName() const override;
DEFINE_ATTRIBUTE_EVENT_LISTENER(controllerchange); DEFINE_ATTRIBUTE_EVENT_LISTENER(controllerchange);
DEFINE_ATTRIBUTE_EVENT_LISTENER(message); DEFINE_ATTRIBUTE_EVENT_LISTENER(message);
// Returns the ServiceWorkerRegistration object described by the given info.
// Creates a new object if needed, or else returns the existing one.
ServiceWorkerRegistration* GetOrCreateServiceWorkerRegistration(
WebServiceWorkerRegistrationObjectInfo);
// Returns the ServiceWorker object described by the given info. Creates a new
// object if needed, or else returns the existing one.
ServiceWorker* GetOrCreateServiceWorker(WebServiceWorkerObjectInfo);
private: private:
ServiceWorkerContainer(ExecutionContext*, NavigatorServiceWorker*); explicit ServiceWorkerContainer(Document*);
class GetRegistrationForReadyCallback; class GetRegistrationForReadyCallback;
using ReadyProperty = using ReadyProperty =
...@@ -108,10 +119,24 @@ class MODULES_EXPORT ServiceWorkerContainer final ...@@ -108,10 +119,24 @@ class MODULES_EXPORT ServiceWorkerContainer final
Member<ServiceWorkerRegistration>>; Member<ServiceWorkerRegistration>>;
ReadyProperty* CreateReadyProperty(); ReadyProperty* CreateReadyProperty();
WebServiceWorkerProvider* provider_; std::unique_ptr<WebServiceWorkerProvider> provider_;
Member<ServiceWorker> controller_; Member<ServiceWorker> controller_;
Member<ReadyProperty> ready_; Member<ReadyProperty> ready_;
Member<NavigatorServiceWorker> navigator_;
// Map from service worker registration id to JavaScript
// ServiceWorkerRegistration object in current execution context.
HeapHashMap<int64_t,
WeakMember<ServiceWorkerRegistration>,
WTF::IntHash<int64_t>,
WTF::UnsignedWithZeroKeyHashTraits<int64_t>>
service_worker_registration_objects_;
// Map from service worker version id to JavaScript ServiceWorker object in
// current execution context.
HeapHashMap<int64_t,
WeakMember<ServiceWorker>,
WTF::IntHash<int64_t>,
WTF::UnsignedWithZeroKeyHashTraits<int64_t>>
service_worker_objects_;
}; };
} // namespace blink } // namespace blink
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/service_worker/service_worker_container_client.h"
#include <memory>
#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_provider.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/local_frame_client.h"
namespace blink {
ServiceWorkerContainerClient::ServiceWorkerContainerClient(
Document& document,
std::unique_ptr<WebServiceWorkerProvider> provider)
: Supplement<Document>(document), provider_(std::move(provider)) {}
ServiceWorkerContainerClient::~ServiceWorkerContainerClient() = default;
const char ServiceWorkerContainerClient::kSupplementName[] =
"ServiceWorkerContainerClient";
ServiceWorkerRegistration*
ServiceWorkerContainerClient::GetOrCreateServiceWorkerRegistration(
WebServiceWorkerRegistrationObjectInfo info) {
if (info.registration_id == mojom::blink::kInvalidServiceWorkerRegistrationId)
return nullptr;
ServiceWorkerRegistration* registration =
service_worker_registration_objects_.at(info.registration_id);
if (registration) {
registration->Attach(std::move(info));
return registration;
}
registration =
new ServiceWorkerRegistration(GetSupplementable(), std::move(info));
service_worker_registration_objects_.Set(info.registration_id, registration);
return registration;
}
ServiceWorker* ServiceWorkerContainerClient::GetOrCreateServiceWorker(
WebServiceWorkerObjectInfo info) {
if (info.version_id == mojom::blink::kInvalidServiceWorkerVersionId)
return nullptr;
ServiceWorker* worker = service_worker_objects_.at(info.version_id);
if (!worker) {
worker = new ServiceWorker(GetSupplementable(), std::move(info));
service_worker_objects_.Set(info.version_id, worker);
}
return worker;
}
ServiceWorkerContainerClient* ServiceWorkerContainerClient::From(
Document* document) {
if (!document)
return nullptr;
if (!document->GetFrame() || !document->GetFrame()->Client())
return nullptr;
ServiceWorkerContainerClient* client =
Supplement<Document>::From<ServiceWorkerContainerClient>(document);
if (!client) {
client = new ServiceWorkerContainerClient(
*document,
document->GetFrame()->Client()->CreateServiceWorkerProvider());
Supplement<Document>::ProvideTo(*document, client);
}
return client;
}
void ServiceWorkerContainerClient::Trace(blink::Visitor* visitor) {
visitor->Trace(service_worker_registration_objects_);
visitor->Trace(service_worker_objects_);
Supplement<Document>::Trace(visitor);
}
} // namespace blink
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICE_WORKER_SERVICE_WORKER_CONTAINER_CLIENT_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICE_WORKER_SERVICE_WORKER_CONTAINER_CLIENT_H_
#include <memory>
#include "base/macros.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h"
#include "third_party/blink/renderer/platform/bindings/name_client.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/wtf/forward.h"
namespace blink {
class WebServiceWorkerProvider;
// This mainly exists to provide access to WebServiceWorkerProvider.
// Owned by Document.
class MODULES_EXPORT ServiceWorkerContainerClient final
: public GarbageCollectedFinalized<ServiceWorkerContainerClient>,
public Supplement<Document>,
public NameClient {
USING_GARBAGE_COLLECTED_MIXIN(ServiceWorkerContainerClient);
public:
static const char kSupplementName[];
ServiceWorkerContainerClient(Document&,
std::unique_ptr<WebServiceWorkerProvider>);
virtual ~ServiceWorkerContainerClient();
// Returns the ServiceWorkerRegistration object described by the object info
// in current execution context. Creates a new object if needed, or else
// returns the existing one.
ServiceWorkerRegistration* GetOrCreateServiceWorkerRegistration(
WebServiceWorkerRegistrationObjectInfo);
// Returns the ServiceWorker object described by the object info in current
// execution context. Creates a new object if needed, or else returns the
// existing one.
ServiceWorker* GetOrCreateServiceWorker(WebServiceWorkerObjectInfo);
WebServiceWorkerProvider* Provider() { return provider_.get(); }
static ServiceWorkerContainerClient* From(Document*);
void Trace(blink::Visitor* visitor) override;
const char* NameInHeapSnapshot() const override {
return "ServiceWorkerContainerClient";
}
private:
std::unique_ptr<WebServiceWorkerProvider> provider_;
// Map from service worker registration id to JavaScript
// ServiceWorkerRegistration object in current execution context.
HeapHashMap<int64_t,
WeakMember<ServiceWorkerRegistration>,
WTF::IntHash<int64_t>,
WTF::UnsignedWithZeroKeyHashTraits<int64_t>>
service_worker_registration_objects_;
// Map from service worker version id to JavaScript ServiceWorker object in
// current execution context.
HeapHashMap<int64_t,
WeakMember<ServiceWorker>,
WTF::IntHash<int64_t>,
WTF::UnsignedWithZeroKeyHashTraits<int64_t>>
service_worker_objects_;
DISALLOW_COPY_AND_ASSIGN(ServiceWorkerContainerClient);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICE_WORKER_SERVICE_WORKER_CONTAINER_CLIENT_H_
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
#include "third_party/blink/renderer/core/page/focus_controller.h" #include "third_party/blink/renderer/core/page/focus_controller.h"
#include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/core/testing/page_test_base.h"
#include "third_party/blink/renderer/modules/service_worker/navigator_service_worker.h" #include "third_party/blink/renderer/modules/service_worker/navigator_service_worker.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker_container_client.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
...@@ -154,21 +153,11 @@ class ServiceWorkerContainerTest : public PageTestBase { ...@@ -154,21 +153,11 @@ class ServiceWorkerContainerTest : public PageTestBase {
V8GCController::CollectAllGarbageForTesting(GetIsolate()); V8GCController::CollectAllGarbageForTesting(GetIsolate());
} }
ExecutionContext* GetExecutionContext() { return &GetDocument(); }
NavigatorServiceWorker* GetNavigatorServiceWorker() {
return NavigatorServiceWorker::From(GetDocument());
}
v8::Isolate* GetIsolate() { return v8::Isolate::GetCurrent(); } v8::Isolate* GetIsolate() { return v8::Isolate::GetCurrent(); }
ScriptState* GetScriptState() { ScriptState* GetScriptState() {
return ToScriptStateForMainWorld(GetDocument().GetFrame()); return ToScriptStateForMainWorld(GetDocument().GetFrame());
} }
void Provide(std::unique_ptr<WebServiceWorkerProvider> provider) {
Supplement<Document>::ProvideTo(
GetDocument(),
new ServiceWorkerContainerClient(GetDocument(), std::move(provider)));
}
void SetPageURL(const String& url) { void SetPageURL(const String& url) {
// For URL completion. // For URL completion.
GetDocument().SetURL(KURL(NullURL(), url)); GetDocument().SetURL(KURL(NullURL(), url));
...@@ -187,10 +176,10 @@ class ServiceWorkerContainerTest : public PageTestBase { ...@@ -187,10 +176,10 @@ class ServiceWorkerContainerTest : public PageTestBase {
const ScriptValueTest& value_test) { const ScriptValueTest& value_test) {
// When the registration is rejected, a register call must not reach // When the registration is rejected, a register call must not reach
// the provider. // the provider.
Provide(std::make_unique<NotReachedWebServiceWorkerProvider>()); ServiceWorkerContainer* container =
ServiceWorkerContainer::CreateForTesting(
ServiceWorkerContainer* container = ServiceWorkerContainer::Create( &GetDocument(),
GetExecutionContext(), GetNavigatorServiceWorker()); std::make_unique<NotReachedWebServiceWorkerProvider>());
ScriptState::Scope script_scope(GetScriptState()); ScriptState::Scope script_scope(GetScriptState());
RegistrationOptions options; RegistrationOptions options;
options.setScope(scope); options.setScope(scope);
...@@ -201,10 +190,10 @@ class ServiceWorkerContainerTest : public PageTestBase { ...@@ -201,10 +190,10 @@ class ServiceWorkerContainerTest : public PageTestBase {
void TestGetRegistrationRejected(const String& document_url, void TestGetRegistrationRejected(const String& document_url,
const ScriptValueTest& value_test) { const ScriptValueTest& value_test) {
Provide(std::make_unique<NotReachedWebServiceWorkerProvider>()); ServiceWorkerContainer* container =
ServiceWorkerContainer::CreateForTesting(
ServiceWorkerContainer* container = ServiceWorkerContainer::Create( &GetDocument(),
GetExecutionContext(), GetNavigatorServiceWorker()); std::make_unique<NotReachedWebServiceWorkerProvider>());
ScriptState::Scope script_scope(GetScriptState()); ScriptState::Scope script_scope(GetScriptState());
ScriptPromise promise = ScriptPromise promise =
container->getRegistration(GetScriptState(), document_url); container->getRegistration(GetScriptState(), document_url);
...@@ -334,10 +323,8 @@ TEST_F(ServiceWorkerContainerTest, ...@@ -334,10 +323,8 @@ TEST_F(ServiceWorkerContainerTest,
SetPageURL("http://localhost/x/index.html"); SetPageURL("http://localhost/x/index.html");
StubWebServiceWorkerProvider stub_provider; StubWebServiceWorkerProvider stub_provider;
Provide(stub_provider.Provider()); ServiceWorkerContainer* container = ServiceWorkerContainer::CreateForTesting(
&GetDocument(), stub_provider.Provider());
ServiceWorkerContainer* container = ServiceWorkerContainer::Create(
GetExecutionContext(), GetNavigatorServiceWorker());
// register // register
{ {
...@@ -363,10 +350,8 @@ TEST_F(ServiceWorkerContainerTest, ...@@ -363,10 +350,8 @@ TEST_F(ServiceWorkerContainerTest,
SetPageURL("http://localhost/x/index.html"); SetPageURL("http://localhost/x/index.html");
StubWebServiceWorkerProvider stub_provider; StubWebServiceWorkerProvider stub_provider;
Provide(stub_provider.Provider()); ServiceWorkerContainer* container = ServiceWorkerContainer::CreateForTesting(
&GetDocument(), stub_provider.Provider());
ServiceWorkerContainer* container = ServiceWorkerContainer::Create(
GetExecutionContext(), GetNavigatorServiceWorker());
{ {
ScriptState::Scope script_scope(GetScriptState()); ScriptState::Scope script_scope(GetScriptState());
...@@ -385,10 +370,8 @@ TEST_F(ServiceWorkerContainerTest, ...@@ -385,10 +370,8 @@ TEST_F(ServiceWorkerContainerTest,
SetPageURL("http://localhost/x/index.html"); SetPageURL("http://localhost/x/index.html");
StubWebServiceWorkerProvider stub_provider; StubWebServiceWorkerProvider stub_provider;
Provide(stub_provider.Provider()); ServiceWorkerContainer* container = ServiceWorkerContainer::CreateForTesting(
&GetDocument(), stub_provider.Provider());
ServiceWorkerContainer* container = ServiceWorkerContainer::Create(
GetExecutionContext(), GetNavigatorServiceWorker());
// register // register
{ {
...@@ -413,10 +396,8 @@ TEST_F(ServiceWorkerContainerTest, Register_TypeOptionDelegatesToProvider) { ...@@ -413,10 +396,8 @@ TEST_F(ServiceWorkerContainerTest, Register_TypeOptionDelegatesToProvider) {
SetPageURL("http://localhost/x/index.html"); SetPageURL("http://localhost/x/index.html");
StubWebServiceWorkerProvider stub_provider; StubWebServiceWorkerProvider stub_provider;
Provide(stub_provider.Provider()); ServiceWorkerContainer* container = ServiceWorkerContainer::CreateForTesting(
&GetDocument(), stub_provider.Provider());
ServiceWorkerContainer* container = ServiceWorkerContainer::Create(
GetExecutionContext(), GetNavigatorServiceWorker());
// register // register
{ {
......
...@@ -109,9 +109,8 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope { ...@@ -109,9 +109,8 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope {
void SetRegistration(WebServiceWorkerRegistrationObjectInfo info); void SetRegistration(WebServiceWorkerRegistrationObjectInfo info);
// Returns the ServiceWorker object described by the object info in current // Returns the ServiceWorker object described by the given info. Creates a new
// execution context. Creates a new object if needed, or else returns the // object if needed, or else returns the existing one.
// existing one.
ServiceWorker* GetOrCreateServiceWorker(WebServiceWorkerObjectInfo); ServiceWorker* GetOrCreateServiceWorker(WebServiceWorkerObjectInfo);
// EventTarget // EventTarget
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/modules/event_target_modules.h" #include "third_party/blink/renderer/modules/event_target_modules.h"
#include "third_party/blink/renderer/modules/service_worker/navigation_preload_state.h" #include "third_party/blink/renderer/modules/service_worker/navigation_preload_state.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker_container_client.h" #include "third_party/blink/renderer/modules/service_worker/service_worker_container.h"
#include "third_party/blink/renderer/modules/service_worker/service_worker_error.h" #include "third_party/blink/renderer/modules/service_worker/service_worker_error.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h"
...@@ -120,7 +120,7 @@ void DidSetNavigationPreloadHeader(ScriptPromiseResolver* resolver, ...@@ -120,7 +120,7 @@ void DidSetNavigationPreloadHeader(ScriptPromiseResolver* resolver,
ServiceWorkerRegistration* ServiceWorkerRegistration::Take( ServiceWorkerRegistration* ServiceWorkerRegistration::Take(
ScriptPromiseResolver* resolver, ScriptPromiseResolver* resolver,
WebServiceWorkerRegistrationObjectInfo info) { WebServiceWorkerRegistrationObjectInfo info) {
return ServiceWorkerContainerClient::From( return ServiceWorkerContainer::From(
To<Document>(resolver->GetExecutionContext())) To<Document>(resolver->GetExecutionContext()))
->GetOrCreateServiceWorkerRegistration(std::move(info)); ->GetOrCreateServiceWorkerRegistration(std::move(info));
} }
......
...@@ -46,7 +46,7 @@ class ServiceWorkerRegistration final ...@@ -46,7 +46,7 @@ class ServiceWorkerRegistration final
// Eager finalization needed to promptly invalidate the corresponding entry of // Eager finalization needed to promptly invalidate the corresponding entry of
// the (registration id, WeakMember<ServiceWorkerRegistration>) map inside // the (registration id, WeakMember<ServiceWorkerRegistration>) map inside
// ServiceWorkerContainerClient. // ServiceWorkerContainer.
EAGERLY_FINALIZE(); EAGERLY_FINALIZE();
// Called in 2 scenarios: // Called in 2 scenarios:
......
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