| 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 c531e915e888504b1396aa27dab35bf4db51b7a3..9bca7e243e1a21a4af869cf8f155562d9f9c3100 100644
|
| --- a/content/browser/service_worker/service_worker_dispatcher_host.cc
|
| +++ b/content/browser/service_worker/service_worker_dispatcher_host.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "content/browser/service_worker/service_worker_dispatcher_host.h"
|
|
|
| +#include "content/browser/child_process_security_policy_impl.h"
|
| #include "content/browser/service_worker/service_worker_context.h"
|
| #include "content/common/service_worker_messages.h"
|
| #include "ipc/ipc_message_macros.h"
|
| @@ -12,14 +13,14 @@
|
| namespace content {
|
|
|
| ServiceWorkerDispatcherHost::ServiceWorkerDispatcherHost(
|
| + int render_process_id,
|
| ServiceWorkerContext* context)
|
| - : context_(context) {}
|
| + : render_process_id_(render_process_id), context_(context) {}
|
|
|
| ServiceWorkerDispatcherHost::~ServiceWorkerDispatcherHost() {}
|
|
|
| bool ServiceWorkerDispatcherHost::OnMessageReceived(const IPC::Message& message,
|
| bool* message_was_ok) {
|
| -
|
| if (IPC_MESSAGE_CLASS(message) != ServiceWorkerMsgStart)
|
| return false;
|
|
|
| @@ -36,15 +37,46 @@ bool ServiceWorkerDispatcherHost::OnMessageReceived(const IPC::Message& message,
|
| return handled;
|
| }
|
|
|
| -void ServiceWorkerDispatcherHost::OnRegisterServiceWorker(int32 registry_id,
|
| - const string16& scope,
|
| - const GURL& script_url) {
|
| - // TODO(alecflett): Enforce that script_url must have the same
|
| - // origin as the registering document.
|
| +// TODO(alecflett): Store the worker_id keyed by (domain+pattern,
|
| +// script) so we don't always return a new service worker id.
|
| +static int32 NextWorkerId() {
|
| + static int32 worker_id = 0;
|
| + return worker_id++;
|
| +}
|
| +
|
| +void ServiceWorkerDispatcherHost::OnRegisterServiceWorker(
|
| + int32 thread_id,
|
| + int32 request_id,
|
| + const GURL& security_origin,
|
| + const string16& scope,
|
| + const GURL& script_url) {
|
| + // We're using cookie access as a proxy for ServiceWorker
|
| + // registration permission.
|
| + // TODO(alecflett): add a ServiceWorker-specific policy query.
|
| + ChildProcessSecurityPolicyImpl* policy =
|
| + ChildProcessSecurityPolicyImpl::GetInstance();
|
| + if (!policy->CanAccessCookiesForOrigin(render_process_id_, security_origin))
|
| + return;
|
| +
|
| + Send(new ServiceWorkerMsg_ServiceWorkerRegistered(
|
| + thread_id, request_id, NextWorkerId()));
|
| }
|
|
|
| void ServiceWorkerDispatcherHost::OnUnregisterServiceWorker(
|
| - int32 registry_id,
|
| - const string16& scope) {}
|
| + int32 thread_id,
|
| + int32 request_id,
|
| + const GURL& security_origin,
|
| + const string16& scope) {
|
| + // We're using cookie access as a proxy for ServiceWorker
|
| + // registration permission.
|
| + // TODO(alecflett): add a ServiceWorker-specific policy query.
|
| + ChildProcessSecurityPolicyImpl* policy =
|
| + ChildProcessSecurityPolicyImpl::GetInstance();
|
| + if (!policy->CanAccessCookiesForOrigin(render_process_id_, security_origin))
|
| + return;
|
| +
|
| + Send(new ServiceWorkerMsg_ServiceWorkerUnregistered(
|
| + thread_id, request_id, NextWorkerId()));
|
| +}
|
|
|
| } // namespace content
|
|
|