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

Unified Diff: content/child/service_worker/service_worker_provider_context.cc

Issue 1344783002: ServiceWorker: Carve out methods of ServiceWorkerProviderContext to delegate classes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add class comments more Created 5 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/child/service_worker/service_worker_provider_context.cc
diff --git a/content/child/service_worker/service_worker_provider_context.cc b/content/child/service_worker/service_worker_provider_context.cc
index a4b89db4327194b016131657989fc4af3c254e76..375f564d66214c8d1149c0756b2014fd367eaa61 100644
--- a/content/child/service_worker/service_worker_provider_context.cc
+++ b/content/child/service_worker/service_worker_provider_context.cc
@@ -14,16 +14,145 @@
namespace content {
-ServiceWorkerProviderContext::ServiceWorkerProviderContext(int provider_id)
+class ServiceWorkerProviderContext::Delegate {
+ public:
+ virtual ~Delegate(){};
+ virtual void AssociateRegistration(
+ scoped_ptr<ServiceWorkerRegistrationHandleReference> registration,
+ scoped_ptr<ServiceWorkerHandleReference> installing,
+ scoped_ptr<ServiceWorkerHandleReference> waiting,
+ scoped_ptr<ServiceWorkerHandleReference> active) = 0;
+ virtual void DisassociateRegistration() = 0;
+ virtual void GetAssociatedRegistration(
+ ServiceWorkerRegistrationObjectInfo* info,
+ ServiceWorkerVersionAttributes* attrs) = 0;
+ virtual void SetController(
+ scoped_ptr<ServiceWorkerHandleReference> controller) = 0;
+ virtual ServiceWorkerHandleReference* controller() = 0;
+};
+
+// Delegate class for ServiceWorker client (Document, SharedWorker, etc) to
+// keep the associated registration and the controller until
+// ServiceWorkerContainer is initialized.
+class ServiceWorkerProviderContext::ControlleeDelegate
+ : public ServiceWorkerProviderContext::Delegate {
+ public:
+ ControlleeDelegate() {}
+ ~ControlleeDelegate() override {}
+
+ void AssociateRegistration(
+ scoped_ptr<ServiceWorkerRegistrationHandleReference> registration,
+ scoped_ptr<ServiceWorkerHandleReference> installing,
+ scoped_ptr<ServiceWorkerHandleReference> waiting,
+ scoped_ptr<ServiceWorkerHandleReference> active) override {
+ DCHECK(!registration_);
+ registration_ = registration.Pass();
+ }
+
+ void DisassociateRegistration() override {
+ controller_.reset();
+ registration_.reset();
+ }
+
+ void SetController(
+ scoped_ptr<ServiceWorkerHandleReference> controller) override {
+ DCHECK(registration_);
+ controller_ = controller.Pass();
+ }
+
+ void GetAssociatedRegistration(
+ ServiceWorkerRegistrationObjectInfo* info,
+ ServiceWorkerVersionAttributes* attrs) override {
+ NOTREACHED();
+ }
+
+ ServiceWorkerHandleReference* controller() override {
+ return controller_.get();
+ }
+
+ private:
+ scoped_ptr<ServiceWorkerRegistrationHandleReference> registration_;
+ scoped_ptr<ServiceWorkerHandleReference> controller_;
+
+ DISALLOW_COPY_AND_ASSIGN(ControlleeDelegate);
+};
+
+// Delegate class for ServiceWorkerGlobalScope to keep the associated
+// registration and its versions until the execution context is initialized.
+class ServiceWorkerProviderContext::ControllerDelegate
+ : public ServiceWorkerProviderContext::Delegate {
+ public:
+ ControllerDelegate() {}
+ ~ControllerDelegate() override {}
+
+ void AssociateRegistration(
+ scoped_ptr<ServiceWorkerRegistrationHandleReference> registration,
+ scoped_ptr<ServiceWorkerHandleReference> installing,
+ scoped_ptr<ServiceWorkerHandleReference> waiting,
+ scoped_ptr<ServiceWorkerHandleReference> active) override {
+ DCHECK(!registration_);
+ registration_ = registration.Pass();
+ installing_ = active.Pass();
+ waiting_ = waiting.Pass();
+ active_ = active.Pass();
+ }
+
+ void DisassociateRegistration() override {
+ // ServiceWorkerGlobalScope is never disassociated.
+ NOTREACHED();
+ }
+
+ void SetController(
+ scoped_ptr<ServiceWorkerHandleReference> controller) override {
+ NOTREACHED();
+ }
+
+ void GetAssociatedRegistration(
+ ServiceWorkerRegistrationObjectInfo* info,
+ ServiceWorkerVersionAttributes* attrs) override {
+ DCHECK(registration_);
+ *info = registration_->info();
+ if (installing_)
+ attrs->installing = installing_->info();
+ if (waiting_)
+ attrs->waiting = waiting_->info();
+ if (active_)
+ attrs->active = active_->info();
+ }
+
+ ServiceWorkerHandleReference* controller() override {
+ NOTREACHED();
+ return nullptr;
+ }
+
+ private:
+ scoped_ptr<ServiceWorkerRegistrationHandleReference> registration_;
+ scoped_ptr<ServiceWorkerHandleReference> installing_;
+ scoped_ptr<ServiceWorkerHandleReference> waiting_;
+ scoped_ptr<ServiceWorkerHandleReference> active_;
+
+ ServiceWorkerProviderContext* context_;
+
+ DISALLOW_COPY_AND_ASSIGN(ControllerDelegate);
+};
+
+ServiceWorkerProviderContext::ServiceWorkerProviderContext(
+ int provider_id,
+ ServiceWorkerProviderType provider_type)
: provider_id_(provider_id),
main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()) {
+ if (provider_type == SERVICE_WORKER_PROVIDER_FOR_CONTROLLER)
+ delegate_.reset(new ControllerDelegate);
+ else
+ delegate_.reset(new ControlleeDelegate);
+
if (!ChildThreadImpl::current())
return; // May be null in some tests.
thread_safe_sender_ = ChildThreadImpl::current()->thread_safe_sender();
+
ServiceWorkerDispatcher* dispatcher =
ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance(
thread_safe_sender_.get(), main_thread_task_runner_.get());
- DCHECK(dispatcher);
dispatcher->AddProviderContext(this);
}
@@ -35,74 +164,47 @@ ServiceWorkerProviderContext::~ServiceWorkerProviderContext() {
}
}
-ServiceWorkerHandleReference* ServiceWorkerProviderContext::controller() {
- DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread());
- return controller_.get();
-}
-
-bool ServiceWorkerProviderContext::GetRegistrationInfoAndVersionAttributes(
- ServiceWorkerRegistrationObjectInfo* info,
- ServiceWorkerVersionAttributes* attrs) {
- DCHECK(!main_thread_task_runner_->RunsTasksOnCurrentThread());
- base::AutoLock lock(lock_);
- if (!registration_)
- return false;
-
- *info = registration_->info();
- if (installing_)
- attrs->installing = installing_->info();
- if (waiting_)
- attrs->waiting = waiting_->info();
- if (active_)
- attrs->active = active_->info();
- return true;
-}
-
void ServiceWorkerProviderContext::OnAssociateRegistration(
const ServiceWorkerRegistrationObjectInfo& info,
const ServiceWorkerVersionAttributes& attrs) {
- base::AutoLock lock(lock_);
DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread());
- DCHECK(!registration_);
- DCHECK_NE(kInvalidServiceWorkerRegistrationId, info.registration_id);
- DCHECK_NE(kInvalidServiceWorkerRegistrationHandleId, info.handle_id);
-
- registration_ = ServiceWorkerRegistrationHandleReference::Adopt(
- info, thread_safe_sender_.get());
- installing_ = ServiceWorkerHandleReference::Adopt(
- attrs.installing, thread_safe_sender_.get());
- waiting_ = ServiceWorkerHandleReference::Adopt(
- attrs.waiting, thread_safe_sender_.get());
- active_ = ServiceWorkerHandleReference::Adopt(
- attrs.active, thread_safe_sender_.get());
+ delegate_->AssociateRegistration(
+ ServiceWorkerRegistrationHandleReference::Adopt(
+ info, thread_safe_sender_.get()),
+ ServiceWorkerHandleReference::Adopt(attrs.installing,
+ thread_safe_sender_.get()),
+ ServiceWorkerHandleReference::Adopt(attrs.waiting,
+ thread_safe_sender_.get()),
+ ServiceWorkerHandleReference::Adopt(attrs.active,
+ thread_safe_sender_.get()));
}
void ServiceWorkerProviderContext::OnDisassociateRegistration() {
- base::AutoLock lock(lock_);
DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread());
-
- controller_.reset();
- active_.reset();
- waiting_.reset();
- installing_.reset();
- registration_.reset();
+ delegate_->DisassociateRegistration();
}
void ServiceWorkerProviderContext::OnSetControllerServiceWorker(
const ServiceWorkerObjectInfo& info) {
DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread());
- DCHECK(registration_);
-
if (info.version_id == kInvalidServiceWorkerVersionId) {
- controller_.reset();
- } else {
- // This context is is the primary owner of this handle, keeps the
- // initial reference until it goes away.
- controller_ =
- ServiceWorkerHandleReference::Adopt(info, thread_safe_sender_.get());
+ delegate_->SetController(scoped_ptr<ServiceWorkerHandleReference>());
+ return;
}
- // TODO(kinuko): We can forward the message to other threads here
- // when we support navigator.serviceWorker in dedicated workers.
+ delegate_->SetController(
+ ServiceWorkerHandleReference::Adopt(info, thread_safe_sender_.get()));
+}
+
+void ServiceWorkerProviderContext::GetAssociatedRegistration(
+ ServiceWorkerRegistrationObjectInfo* info,
+ ServiceWorkerVersionAttributes* attrs) {
+ DCHECK(!main_thread_task_runner_->RunsTasksOnCurrentThread());
+ delegate_->GetAssociatedRegistration(info, attrs);
+}
+
+ServiceWorkerHandleReference* ServiceWorkerProviderContext::controller() {
+ DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread());
+ return delegate_->controller();
}
void ServiceWorkerProviderContext::DestructOnMainThread() const {

Powered by Google App Engine
This is Rietveld 408576698