OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/service_worker/service_worker_dispatcher_host.h" | 5 #include "content/browser/service_worker/service_worker_dispatcher_host.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "content/browser/message_port_message_filter.h" | 10 #include "content/browser/message_port_message_filter.h" |
11 #include "content/browser/message_port_service.h" | 11 #include "content/browser/message_port_service.h" |
12 #include "content/browser/service_worker/embedded_worker_registry.h" | 12 #include "content/browser/service_worker/embedded_worker_registry.h" |
| 13 #include "content/browser/service_worker/navigator_connect_message_handler.h" |
13 #include "content/browser/service_worker/service_worker_context_core.h" | 14 #include "content/browser/service_worker/service_worker_context_core.h" |
14 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 15 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
15 #include "content/browser/service_worker/service_worker_handle.h" | 16 #include "content/browser/service_worker/service_worker_handle.h" |
16 #include "content/browser/service_worker/service_worker_registration.h" | 17 #include "content/browser/service_worker/service_worker_registration.h" |
17 #include "content/browser/service_worker/service_worker_registration_handle.h" | 18 #include "content/browser/service_worker/service_worker_registration_handle.h" |
18 #include "content/browser/service_worker/service_worker_utils.h" | 19 #include "content/browser/service_worker/service_worker_utils.h" |
19 #include "content/common/service_worker/embedded_worker_messages.h" | 20 #include "content/common/service_worker/embedded_worker_messages.h" |
20 #include "content/common/service_worker/service_worker_messages.h" | 21 #include "content/common/service_worker/service_worker_messages.h" |
| 22 #include "content/common/service_worker/service_worker_types.h" |
21 #include "content/public/browser/content_browser_client.h" | 23 #include "content/public/browser/content_browser_client.h" |
22 #include "content/public/common/content_client.h" | 24 #include "content/public/common/content_client.h" |
23 #include "ipc/ipc_message_macros.h" | 25 #include "ipc/ipc_message_macros.h" |
24 #include "net/base/net_util.h" | 26 #include "net/base/net_util.h" |
25 #include "third_party/WebKit/public/platform/WebServiceWorkerError.h" | 27 #include "third_party/WebKit/public/platform/WebServiceWorkerError.h" |
26 #include "url/gurl.h" | 28 #include "url/gurl.h" |
27 | 29 |
28 using blink::WebServiceWorkerError; | 30 using blink::WebServiceWorkerError; |
29 | 31 |
30 namespace content { | 32 namespace content { |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 OnReportConsoleMessage) | 192 OnReportConsoleMessage) |
191 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementServiceWorkerRefCount, | 193 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementServiceWorkerRefCount, |
192 OnIncrementServiceWorkerRefCount) | 194 OnIncrementServiceWorkerRefCount) |
193 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementServiceWorkerRefCount, | 195 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementServiceWorkerRefCount, |
194 OnDecrementServiceWorkerRefCount) | 196 OnDecrementServiceWorkerRefCount) |
195 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementRegistrationRefCount, | 197 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_IncrementRegistrationRefCount, |
196 OnIncrementRegistrationRefCount) | 198 OnIncrementRegistrationRefCount) |
197 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, | 199 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, |
198 OnDecrementRegistrationRefCount) | 200 OnDecrementRegistrationRefCount) |
199 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) | 201 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) |
| 202 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NavigatorConnect, |
| 203 OnNavigatorConnect) |
200 IPC_MESSAGE_UNHANDLED(handled = false) | 204 IPC_MESSAGE_UNHANDLED(handled = false) |
201 IPC_END_MESSAGE_MAP() | 205 IPC_END_MESSAGE_MAP() |
202 | 206 |
203 if (!handled && GetContext()) { | 207 if (!handled && GetContext()) { |
204 handled = | 208 handled = |
205 GetContext()->embedded_worker_registry()->OnMessageReceived(message); | 209 GetContext()->embedded_worker_registry()->OnMessageReceived(message); |
206 if (!handled) | 210 if (!handled) |
207 BadMessageReceived(); | 211 BadMessageReceived(); |
208 } | 212 } |
209 | 213 |
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 void ServiceWorkerDispatcherHost::OnTerminateWorker(int handle_id) { | 866 void ServiceWorkerDispatcherHost::OnTerminateWorker(int handle_id) { |
863 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); | 867 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); |
864 if (!handle) { | 868 if (!handle) { |
865 BadMessageReceived(); | 869 BadMessageReceived(); |
866 return; | 870 return; |
867 } | 871 } |
868 handle->version()->StopWorker( | 872 handle->version()->StopWorker( |
869 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 873 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
870 } | 874 } |
871 | 875 |
| 876 void ServiceWorkerDispatcherHost::OnNavigatorConnect(int thread_id, |
| 877 int request_id, |
| 878 const GURL& target_url, |
| 879 int message_port_id) { |
| 880 LOG(INFO) << "OnNavigatorConnect " << target_url << " " << message_port_id; |
| 881 if (!GetContext()) { |
| 882 LOG(INFO) << "No SW context"; |
| 883 MessagePortService::GetInstance()->ClosePort(message_port_id); |
| 884 Send(new ServiceWorkerMsg_NavigatorConnectResult(thread_id, request_id, |
| 885 false)); |
| 886 return; |
| 887 } |
| 888 NavigatorConnectMessageHandler* message_handler = |
| 889 GetContext()->navigator_connect_message_handler(); |
| 890 if (!message_handler) { |
| 891 LOG(INFO) << "No message handler"; |
| 892 MessagePortService::GetInstance()->ClosePort(message_port_id); |
| 893 Send(new ServiceWorkerMsg_NavigatorConnectResult(thread_id, request_id, |
| 894 false)); |
| 895 return; |
| 896 } |
| 897 |
| 898 message_handler->RegisterMessagePort( |
| 899 CrossOriginServiceWorkerClient(target_url, message_port_id)); |
| 900 |
| 901 GetContext()->storage()->FindRegistrationForDocument( |
| 902 target_url, |
| 903 base::Bind(&ServiceWorkerDispatcherHost::NavigatorConnectGotRegistration, |
| 904 this, |
| 905 NavigatorConnectParams(thread_id, request_id, message_port_id), |
| 906 target_url)); |
| 907 } |
| 908 |
| 909 void ServiceWorkerDispatcherHost::NavigatorConnectGotRegistration( |
| 910 const NavigatorConnectParams& params, |
| 911 const GURL& target_url, |
| 912 ServiceWorkerStatusCode status, |
| 913 const scoped_refptr<ServiceWorkerRegistration>& registration) { |
| 914 LOG(INFO) << status; |
| 915 if (status != SERVICE_WORKER_OK) { |
| 916 LOG(INFO) << "No SW found"; |
| 917 // No SW found, reject connection attempt. |
| 918 NavigatorConnectResult(params, registration, SERVICE_WORKER_OK, false); |
| 919 return; |
| 920 } |
| 921 |
| 922 ServiceWorkerVersion* active_version = registration->active_version(); |
| 923 if (!active_version) { |
| 924 LOG(INFO) << "No active version"; |
| 925 // No active version, reject connection attempt. |
| 926 NavigatorConnectResult(params, registration, SERVICE_WORKER_OK, false); |
| 927 return; |
| 928 } |
| 929 |
| 930 active_version->DispatchCrossOriginConnectEvent( |
| 931 base::Bind(&ServiceWorkerDispatcherHost::NavigatorConnectResult, this, |
| 932 params, registration), |
| 933 target_url, params.message_port_id); |
| 934 } |
| 935 |
| 936 void ServiceWorkerDispatcherHost::NavigatorConnectResult( |
| 937 const NavigatorConnectParams& params, |
| 938 const scoped_refptr<ServiceWorkerRegistration>& registration, |
| 939 ServiceWorkerStatusCode status, |
| 940 bool allow_connect) { |
| 941 LOG(INFO) << "Result " << status << " " << allow_connect; |
| 942 if (!allow_connect) { |
| 943 GetContext()->navigator_connect_message_handler()->ClearRegistration( |
| 944 params.message_port_id); |
| 945 } else { |
| 946 GetContext() |
| 947 ->navigator_connect_message_handler() |
| 948 ->SetServiceWorkerRegistation(params.message_port_id, registration); |
| 949 } |
| 950 Send(new ServiceWorkerMsg_NavigatorConnectResult( |
| 951 params.thread_id, params.request_id, allow_connect)); |
| 952 } |
| 953 |
872 } // namespace content | 954 } // namespace content |
OLD | NEW |