| Index: content/browser/service_worker/service_worker_dispatcher_host.cc
|
| diff --git a/content/browser/service_worker/service_worker_dispatcher_host.cc b/content/browser/service_worker/service_worker_dispatcher_host.cc
|
| index 0a93b4469dd818480803b1ae5b61c859bd828e69..b3a058e9f32fff051fe3d2d6b68dbfe9a8dd1bc8 100644
|
| --- a/content/browser/service_worker/service_worker_dispatcher_host.cc
|
| +++ b/content/browser/service_worker/service_worker_dispatcher_host.cc
|
| @@ -12,6 +12,7 @@
|
| #include "content/browser/service_worker/service_worker_context_core.h"
|
| #include "content/browser/service_worker/service_worker_context_wrapper.h"
|
| #include "content/browser/service_worker/service_worker_handle.h"
|
| +#include "content/browser/service_worker/service_worker_provider_host_registry.h"
|
| #include "content/browser/service_worker/service_worker_registration.h"
|
| #include "content/browser/service_worker/service_worker_utils.h"
|
| #include "content/common/service_worker/embedded_worker_messages.h"
|
| @@ -49,8 +50,8 @@ ServiceWorkerDispatcherHost::ServiceWorkerDispatcherHost(
|
| }
|
|
|
| ServiceWorkerDispatcherHost::~ServiceWorkerDispatcherHost() {
|
| + GetProviderRegistry()->RemoveAllProviderHostsForProcess(render_process_id_);
|
| if (GetContext()) {
|
| - GetContext()->RemoveAllProviderHostsForProcess(render_process_id_);
|
| GetContext()->embedded_worker_registry()->RemoveChildProcessSender(
|
| render_process_id_);
|
| }
|
| @@ -173,12 +174,20 @@ void ServiceWorkerDispatcherHost::OnRegisterServiceWorker(
|
| return;
|
| }
|
|
|
| - ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost(
|
| - render_process_id_, provider_id);
|
| + ServiceWorkerProviderHost* provider_host =
|
| + GetProviderRegistry()->GetProviderHost(render_process_id_, provider_id);
|
| if (!provider_host) {
|
| BadMessageReceived();
|
| return;
|
| }
|
| + if (!provider_host->IsAlive()) {
|
| + Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError(
|
| + thread_id,
|
| + request_id,
|
| + WebServiceWorkerError::ErrorTypeDisabled,
|
| + base::ASCIIToUTF16(kDisabledErrorMessage)));
|
| + return;
|
| + }
|
|
|
| GetContext()->RegisterServiceWorker(
|
| pattern,
|
| @@ -208,12 +217,20 @@ void ServiceWorkerDispatcherHost::OnUnregisterServiceWorker(
|
| return;
|
| }
|
|
|
| - ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost(
|
| - render_process_id_, provider_id);
|
| + ServiceWorkerProviderHost* provider_host =
|
| + GetProviderRegistry()->GetProviderHost(render_process_id_, provider_id);
|
| if (!provider_host) {
|
| BadMessageReceived();
|
| return;
|
| }
|
| + if (!provider_host->IsAlive()) {
|
| + Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError(
|
| + thread_id,
|
| + request_id,
|
| + WebServiceWorkerError::ErrorTypeDisabled,
|
| + base::ASCIIToUTF16(kDisabledErrorMessage)));
|
| + return;
|
| + }
|
|
|
| GetContext()->UnregisterServiceWorker(
|
| pattern,
|
| @@ -249,24 +266,25 @@ void ServiceWorkerDispatcherHost::OnPostMessageToWorker(
|
| void ServiceWorkerDispatcherHost::OnProviderCreated(int provider_id) {
|
| if (!GetContext())
|
| return;
|
| - if (GetContext()->GetProviderHost(render_process_id_, provider_id)) {
|
| + if (GetProviderRegistry()->GetProviderHost(render_process_id_, provider_id)) {
|
| BadMessageReceived();
|
| return;
|
| }
|
| scoped_ptr<ServiceWorkerProviderHost> provider_host(
|
| new ServiceWorkerProviderHost(
|
| render_process_id_, provider_id, GetContext()->AsWeakPtr(), this));
|
| - GetContext()->AddProviderHost(provider_host.Pass());
|
| + GetProviderRegistry()->AddProviderHost(provider_host.Pass());
|
| }
|
|
|
| void ServiceWorkerDispatcherHost::OnProviderDestroyed(int provider_id) {
|
| if (!GetContext())
|
| return;
|
| - if (!GetContext()->GetProviderHost(render_process_id_, provider_id)) {
|
| + if (!GetProviderRegistry()->GetProviderHost(render_process_id_,
|
| + provider_id)) {
|
| BadMessageReceived();
|
| return;
|
| }
|
| - GetContext()->RemoveProviderHost(render_process_id_, provider_id);
|
| + GetProviderRegistry()->RemoveProviderHost(render_process_id_, provider_id);
|
| }
|
|
|
| void ServiceWorkerDispatcherHost::OnSetHostedVersionId(
|
| @@ -274,11 +292,15 @@ void ServiceWorkerDispatcherHost::OnSetHostedVersionId(
|
| if (!GetContext())
|
| return;
|
| ServiceWorkerProviderHost* provider_host =
|
| - GetContext()->GetProviderHost(render_process_id_, provider_id);
|
| - if (!provider_host || !provider_host->SetHostedVersionId(version_id)) {
|
| + GetProviderRegistry()->GetProviderHost(render_process_id_, provider_id);
|
| + if (!provider_host) {
|
| BadMessageReceived();
|
| return;
|
| }
|
| + if (!provider_host->IsAlive())
|
| + return;
|
| + if (!provider_host->SetHostedVersionId(version_id))
|
| + BadMessageReceived();
|
| }
|
|
|
| void ServiceWorkerDispatcherHost::RegistrationComplete(
|
| @@ -306,6 +328,9 @@ void ServiceWorkerDispatcherHost::RegistrationComplete(
|
| RegisterServiceWorkerHandle(handle.Pass());
|
| }
|
|
|
| +// TODO(nhiroki): These message handlers that take |embedded_worker_id| as an
|
| +// input should check if the worker refers to the live context. If the context
|
| +// was deleted, handle the messege gracefully (http://crbug.com/371675).
|
| void ServiceWorkerDispatcherHost::OnWorkerScriptLoaded(int embedded_worker_id) {
|
| if (!GetContext())
|
| return;
|
| @@ -416,4 +441,9 @@ ServiceWorkerContextCore* ServiceWorkerDispatcherHost::GetContext() {
|
| return context_wrapper_->context();
|
| }
|
|
|
| +ServiceWorkerProviderHostRegistry*
|
| +ServiceWorkerDispatcherHost::GetProviderRegistry() {
|
| + return context_wrapper_->provider_registry();
|
| +}
|
| +
|
| } // namespace content
|
|
|