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

Unified Diff: content/browser/service_worker/service_worker_dispatcher_host.cc

Issue 325173002: ServiceWorker: Confirm the liveness of the associated context before handling message (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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/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

Powered by Google App Engine
This is Rietveld 408576698