Chromium Code Reviews| Index: content/child/service_worker/web_service_worker_provider_impl.cc |
| diff --git a/content/child/service_worker/web_service_worker_provider_impl.cc b/content/child/service_worker/web_service_worker_provider_impl.cc |
| index 5b6edbff80fa45c45105718a9d3b62e1a9ddf50d..c416440b052bbc1b55e44a600d505b5c168ddb40 100644 |
| --- a/content/child/service_worker/web_service_worker_provider_impl.cc |
| +++ b/content/child/service_worker/web_service_worker_provider_impl.cc |
| @@ -10,7 +10,9 @@ |
| #include "content/child/service_worker/service_worker_dispatcher.h" |
| #include "content/child/service_worker/service_worker_handle_reference.h" |
| #include "content/child/service_worker/service_worker_provider_context.h" |
| +#include "content/child/service_worker/service_worker_registration_handle_reference.h" |
| #include "content/child/service_worker/web_service_worker_impl.h" |
| +#include "content/child/service_worker/web_service_worker_registration_impl.h" |
| #include "content/child/thread_safe_sender.h" |
| #include "content/common/service_worker/service_worker_messages.h" |
| #include "third_party/WebKit/public/platform/WebServiceWorkerProviderClient.h" |
| @@ -47,6 +49,30 @@ void WebServiceWorkerProviderImpl::setClient( |
| // for more context) |
| GetDispatcher()->AddScriptClient(provider_id_, client); |
| + if (!context_->registration()) { |
| + // This provider is not associated with any registration. |
| + return; |
| + } |
| + |
| + // Set .ready if the associated registration has the active service worker. |
| + if (context_->active_handle_id() != kInvalidServiceWorkerHandleId) { |
| + WebServiceWorkerRegistrationImpl* registration = |
| + GetDispatcher()->FindServiceWorkerRegistration( |
| + context_->registration()->info(), false); |
| + if (!registration) { |
| + registration = GetDispatcher()->CreateServiceWorkerRegistration( |
| + context_->registration()->info(), false); |
| + ServiceWorkerVersionAttributes attrs = context_->GetVersionAttributes(); |
| + registration->SetInstalling( |
| + GetDispatcher()->GetServiceWorker(attrs.installing, false)); |
| + registration->SetWaiting( |
| + GetDispatcher()->GetServiceWorker(attrs.waiting, false)); |
| + registration->SetActive( |
| + GetDispatcher()->GetServiceWorker(attrs.active, false)); |
| + } |
| + client->setReadyRegistration(registration); |
|
michaeln
2014/09/09 02:22:02
an example of a corner case, this logic assumes th
|
| + } |
| + |
| if (context_->controller_handle_id() != kInvalidServiceWorkerHandleId) { |
| client->setController(GetDispatcher()->GetServiceWorker( |
| context_->controller()->info(), false)); |