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 30cf2a70fc3e0d6e7ea472ecbd1c977df60fb78f..6cf880ca63884753df1b8e94fcfbb2cd0b28cffb 100644 |
--- a/content/browser/service_worker/service_worker_dispatcher_host.cc |
+++ b/content/browser/service_worker/service_worker_dispatcher_host.cc |
@@ -10,6 +10,7 @@ |
#include "content/browser/message_port_message_filter.h" |
#include "content/browser/message_port_service.h" |
#include "content/browser/service_worker/embedded_worker_registry.h" |
+#include "content/browser/service_worker/navigator_connect_message_handler.h" |
#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" |
@@ -18,6 +19,7 @@ |
#include "content/browser/service_worker/service_worker_utils.h" |
#include "content/common/service_worker/embedded_worker_messages.h" |
#include "content/common/service_worker/service_worker_messages.h" |
+#include "content/common/service_worker/service_worker_types.h" |
#include "content/public/browser/content_browser_client.h" |
#include "content/public/common/content_client.h" |
#include "ipc/ipc_message_macros.h" |
@@ -197,6 +199,8 @@ bool ServiceWorkerDispatcherHost::OnMessageReceived( |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, |
OnDecrementRegistrationRefCount) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NavigatorConnect, |
+ OnNavigatorConnect) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
@@ -869,4 +873,82 @@ void ServiceWorkerDispatcherHost::OnTerminateWorker(int handle_id) { |
base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
} |
+void ServiceWorkerDispatcherHost::OnNavigatorConnect(int thread_id, |
+ int request_id, |
+ const GURL& target_url, |
+ int message_port_id) { |
+ LOG(INFO) << "OnNavigatorConnect " << target_url << " " << message_port_id; |
+ if (!GetContext()) { |
+ LOG(INFO) << "No SW context"; |
+ MessagePortService::GetInstance()->ClosePort(message_port_id); |
+ Send(new ServiceWorkerMsg_NavigatorConnectResult(thread_id, request_id, |
+ false)); |
+ return; |
+ } |
+ NavigatorConnectMessageHandler* message_handler = |
+ GetContext()->navigator_connect_message_handler(); |
+ if (!message_handler) { |
+ LOG(INFO) << "No message handler"; |
+ MessagePortService::GetInstance()->ClosePort(message_port_id); |
+ Send(new ServiceWorkerMsg_NavigatorConnectResult(thread_id, request_id, |
+ false)); |
+ return; |
+ } |
+ |
+ message_handler->RegisterMessagePort( |
+ CrossOriginServiceWorkerClient(target_url, message_port_id)); |
+ |
+ GetContext()->storage()->FindRegistrationForDocument( |
+ target_url, |
+ base::Bind(&ServiceWorkerDispatcherHost::NavigatorConnectGotRegistration, |
+ this, |
+ NavigatorConnectParams(thread_id, request_id, message_port_id), |
+ target_url)); |
+} |
+ |
+void ServiceWorkerDispatcherHost::NavigatorConnectGotRegistration( |
+ const NavigatorConnectParams& params, |
+ const GURL& target_url, |
+ ServiceWorkerStatusCode status, |
+ const scoped_refptr<ServiceWorkerRegistration>& registration) { |
+ LOG(INFO) << status; |
+ if (status != SERVICE_WORKER_OK) { |
+ LOG(INFO) << "No SW found"; |
+ // No SW found, reject connection attempt. |
+ NavigatorConnectResult(params, registration, SERVICE_WORKER_OK, false); |
+ return; |
+ } |
+ |
+ ServiceWorkerVersion* active_version = registration->active_version(); |
+ if (!active_version) { |
+ LOG(INFO) << "No active version"; |
+ // No active version, reject connection attempt. |
+ NavigatorConnectResult(params, registration, SERVICE_WORKER_OK, false); |
+ return; |
+ } |
+ |
+ active_version->DispatchCrossOriginConnectEvent( |
+ base::Bind(&ServiceWorkerDispatcherHost::NavigatorConnectResult, this, |
+ params, registration), |
+ target_url, params.message_port_id); |
+} |
+ |
+void ServiceWorkerDispatcherHost::NavigatorConnectResult( |
+ const NavigatorConnectParams& params, |
+ const scoped_refptr<ServiceWorkerRegistration>& registration, |
+ ServiceWorkerStatusCode status, |
+ bool allow_connect) { |
+ LOG(INFO) << "Result " << status << " " << allow_connect; |
+ if (!allow_connect) { |
+ GetContext()->navigator_connect_message_handler()->ClearRegistration( |
+ params.message_port_id); |
+ } else { |
+ GetContext() |
+ ->navigator_connect_message_handler() |
+ ->SetServiceWorkerRegistation(params.message_port_id, registration); |
+ } |
+ Send(new ServiceWorkerMsg_NavigatorConnectResult( |
+ params.thread_id, params.request_id, allow_connect)); |
+} |
+ |
} // namespace content |