OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/renderer/service_worker/service_worker_context_client.h" | 5 #include "content/renderer/service_worker/service_worker_context_client.h" |
6 | 6 |
7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
11 #include "base/thread_task_runner_handle.h" | 11 #include "base/thread_task_runner_handle.h" |
12 #include "base/threading/thread_checker.h" | 12 #include "base/threading/thread_checker.h" |
13 #include "base/threading/thread_local.h" | 13 #include "base/threading/thread_local.h" |
14 #include "base/trace_event/trace_event.h" | 14 #include "base/trace_event/trace_event.h" |
| 15 #include "content/child/navigator_connect/service_port_dispatcher_impl.h" |
15 #include "content/child/notifications/notification_data_conversions.h" | 16 #include "content/child/notifications/notification_data_conversions.h" |
16 #include "content/child/request_extra_data.h" | 17 #include "content/child/request_extra_data.h" |
17 #include "content/child/service_worker/service_worker_dispatcher.h" | 18 #include "content/child/service_worker/service_worker_dispatcher.h" |
18 #include "content/child/service_worker/service_worker_network_provider.h" | 19 #include "content/child/service_worker/service_worker_network_provider.h" |
19 #include "content/child/service_worker/service_worker_provider_context.h" | 20 #include "content/child/service_worker/service_worker_provider_context.h" |
20 #include "content/child/service_worker/service_worker_registration_handle_refere
nce.h" | 21 #include "content/child/service_worker/service_worker_registration_handle_refere
nce.h" |
21 #include "content/child/service_worker/web_service_worker_impl.h" | 22 #include "content/child/service_worker/web_service_worker_impl.h" |
22 #include "content/child/service_worker/web_service_worker_provider_impl.h" | 23 #include "content/child/service_worker/web_service_worker_provider_impl.h" |
23 #include "content/child/service_worker/web_service_worker_registration_impl.h" | 24 #include "content/child/service_worker/web_service_worker_registration_impl.h" |
24 #include "content/child/thread_safe_sender.h" | 25 #include "content/child/thread_safe_sender.h" |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 using ClientsCallbacksMap = | 174 using ClientsCallbacksMap = |
174 IDMap<blink::WebServiceWorkerClientsCallbacks, IDMapOwnPointer>; | 175 IDMap<blink::WebServiceWorkerClientsCallbacks, IDMapOwnPointer>; |
175 using ClaimClientsCallbacksMap = | 176 using ClaimClientsCallbacksMap = |
176 IDMap<blink::WebServiceWorkerClientsClaimCallbacks, IDMapOwnPointer>; | 177 IDMap<blink::WebServiceWorkerClientsClaimCallbacks, IDMapOwnPointer>; |
177 using ClientCallbacksMap = | 178 using ClientCallbacksMap = |
178 IDMap<blink::WebServiceWorkerClientCallbacks, IDMapOwnPointer>; | 179 IDMap<blink::WebServiceWorkerClientCallbacks, IDMapOwnPointer>; |
179 using SkipWaitingCallbacksMap = | 180 using SkipWaitingCallbacksMap = |
180 IDMap<blink::WebServiceWorkerSkipWaitingCallbacks, IDMapOwnPointer>; | 181 IDMap<blink::WebServiceWorkerSkipWaitingCallbacks, IDMapOwnPointer>; |
181 | 182 |
182 explicit WorkerContextData(ServiceWorkerContextClient* owner) | 183 explicit WorkerContextData(ServiceWorkerContextClient* owner) |
183 : weak_factory(owner) {} | 184 : weak_factory(owner), proxy_weak_factory(owner->proxy_) {} |
184 | 185 |
185 ~WorkerContextData() { | 186 ~WorkerContextData() { |
186 DCHECK(thread_checker.CalledOnValidThread()); | 187 DCHECK(thread_checker.CalledOnValidThread()); |
187 } | 188 } |
188 | 189 |
189 // Pending callbacks for GetClientDocuments(). | 190 // Pending callbacks for GetClientDocuments(). |
190 ClientsCallbacksMap clients_callbacks; | 191 ClientsCallbacksMap clients_callbacks; |
191 | 192 |
192 // Pending callbacks for OpenWindow() and FocusClient(). | 193 // Pending callbacks for OpenWindow() and FocusClient(). |
193 ClientCallbacksMap client_callbacks; | 194 ClientCallbacksMap client_callbacks; |
194 | 195 |
195 // Pending callbacks for SkipWaiting(). | 196 // Pending callbacks for SkipWaiting(). |
196 SkipWaitingCallbacksMap skip_waiting_callbacks; | 197 SkipWaitingCallbacksMap skip_waiting_callbacks; |
197 | 198 |
198 // Pending callbacks for ClaimClients(). | 199 // Pending callbacks for ClaimClients(). |
199 ClaimClientsCallbacksMap claim_clients_callbacks; | 200 ClaimClientsCallbacksMap claim_clients_callbacks; |
200 | 201 |
201 base::ThreadChecker thread_checker; | 202 base::ThreadChecker thread_checker; |
202 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; | 203 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; |
| 204 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; |
203 }; | 205 }; |
204 | 206 |
205 ServiceWorkerContextClient* | 207 ServiceWorkerContextClient* |
206 ServiceWorkerContextClient::ThreadSpecificInstance() { | 208 ServiceWorkerContextClient::ThreadSpecificInstance() { |
207 return g_worker_client_tls.Pointer()->Get(); | 209 return g_worker_client_tls.Pointer()->Get(); |
208 } | 210 } |
209 | 211 |
210 ServiceWorkerContextClient::ServiceWorkerContextClient( | 212 ServiceWorkerContextClient::ServiceWorkerContextClient( |
211 int embedded_worker_id, | 213 int embedded_worker_id, |
212 int64 service_worker_version_id, | 214 int64 service_worker_version_id, |
(...skipping 28 matching lines...) Expand all Loading... |
241 bool handled = true; | 243 bool handled = true; |
242 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) | 244 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) |
243 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) | 245 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) |
244 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) | 246 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) |
245 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) | 247 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) |
246 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent) | 248 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent) |
247 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, | 249 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, |
248 OnNotificationClickEvent) | 250 OnNotificationClickEvent) |
249 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) | 251 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) |
250 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent, OnGeofencingEvent) | 252 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent, OnGeofencingEvent) |
251 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginConnectEvent, | |
252 OnCrossOriginConnectEvent) | |
253 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage) | 253 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage) |
254 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker, | 254 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker, |
255 OnCrossOriginMessageToWorker) | 255 OnCrossOriginMessageToWorker) |
256 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SendStashedMessagePorts, | 256 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SendStashedMessagePorts, |
257 OnSendStashedMessagePorts) | 257 OnSendStashedMessagePorts) |
258 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients) | 258 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients) |
259 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse, | 259 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse, |
260 OnOpenWindowResponse) | 260 OnOpenWindowResponse) |
261 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowError, | 261 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowError, |
262 OnOpenWindowError) | 262 OnOpenWindowError) |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 DCHECK(g_worker_client_tls.Pointer()->Get() == NULL); | 339 DCHECK(g_worker_client_tls.Pointer()->Get() == NULL); |
340 DCHECK(!proxy_); | 340 DCHECK(!proxy_); |
341 g_worker_client_tls.Pointer()->Set(this); | 341 g_worker_client_tls.Pointer()->Set(this); |
342 proxy_ = proxy; | 342 proxy_ = proxy; |
343 | 343 |
344 // Initialize pending callback maps. This needs to be freed on the | 344 // Initialize pending callback maps. This needs to be freed on the |
345 // same thread before the worker context goes away in | 345 // same thread before the worker context goes away in |
346 // willDestroyWorkerContext. | 346 // willDestroyWorkerContext. |
347 context_.reset(new WorkerContextData(this)); | 347 context_.reset(new WorkerContextData(this)); |
348 | 348 |
| 349 // Register Mojo services. |
| 350 service_registry_.ServiceRegistry::AddService( |
| 351 base::Bind(&ServicePortDispatcherImpl::Create, |
| 352 context_->proxy_weak_factory.GetWeakPtr())); |
| 353 |
349 SetRegistrationInServiceWorkerGlobalScope(); | 354 SetRegistrationInServiceWorkerGlobalScope(); |
350 | 355 |
351 Send(new EmbeddedWorkerHostMsg_WorkerScriptLoaded( | 356 Send(new EmbeddedWorkerHostMsg_WorkerScriptLoaded( |
352 embedded_worker_id_, | 357 embedded_worker_id_, |
353 WorkerTaskRunner::Instance()->CurrentWorkerId(), | 358 WorkerTaskRunner::Instance()->CurrentWorkerId(), |
354 provider_context_->provider_id())); | 359 provider_context_->provider_id())); |
355 | 360 |
356 TRACE_EVENT_ASYNC_STEP_INTO0( | 361 TRACE_EVENT_ASYNC_STEP_INTO0( |
357 "ServiceWorker", | 362 "ServiceWorker", |
358 "ServiceWorkerContextClient::StartingWorkerContext", | 363 "ServiceWorkerContextClient::StartingWorkerContext", |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 GetRoutingID(), request_id, result)); | 523 GetRoutingID(), request_id, result)); |
519 } | 524 } |
520 | 525 |
521 void ServiceWorkerContextClient::didHandleSyncEvent( | 526 void ServiceWorkerContextClient::didHandleSyncEvent( |
522 int request_id, | 527 int request_id, |
523 blink::WebServiceWorkerEventResult result) { | 528 blink::WebServiceWorkerEventResult result) { |
524 Send(new ServiceWorkerHostMsg_SyncEventFinished(GetRoutingID(), request_id, | 529 Send(new ServiceWorkerHostMsg_SyncEventFinished(GetRoutingID(), request_id, |
525 result)); | 530 result)); |
526 } | 531 } |
527 | 532 |
528 void ServiceWorkerContextClient::didHandleCrossOriginConnectEvent( | |
529 int request_id, | |
530 bool accept_connection) { | |
531 Send(new ServiceWorkerHostMsg_CrossOriginConnectEventFinished( | |
532 GetRoutingID(), request_id, accept_connection)); | |
533 } | |
534 | |
535 blink::WebServiceWorkerNetworkProvider* | 533 blink::WebServiceWorkerNetworkProvider* |
536 ServiceWorkerContextClient::createServiceWorkerNetworkProvider( | 534 ServiceWorkerContextClient::createServiceWorkerNetworkProvider( |
537 blink::WebDataSource* data_source) { | 535 blink::WebDataSource* data_source) { |
538 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); | 536 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); |
539 | 537 |
540 // Create a content::ServiceWorkerNetworkProvider for this data source so | 538 // Create a content::ServiceWorkerNetworkProvider for this data source so |
541 // we can observe its requests. | 539 // we can observe its requests. |
542 scoped_ptr<ServiceWorkerNetworkProvider> provider( | 540 scoped_ptr<ServiceWorkerNetworkProvider> provider( |
543 new ServiceWorkerNetworkProvider( | 541 new ServiceWorkerNetworkProvider( |
544 MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_CONTROLLER)); | 542 MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_CONTROLLER)); |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 const std::string& region_id, | 760 const std::string& region_id, |
763 const blink::WebCircularGeofencingRegion& region) { | 761 const blink::WebCircularGeofencingRegion& region) { |
764 TRACE_EVENT0("ServiceWorker", | 762 TRACE_EVENT0("ServiceWorker", |
765 "ServiceWorkerContextClient::OnGeofencingEvent"); | 763 "ServiceWorkerContextClient::OnGeofencingEvent"); |
766 proxy_->dispatchGeofencingEvent( | 764 proxy_->dispatchGeofencingEvent( |
767 request_id, event_type, blink::WebString::fromUTF8(region_id), region); | 765 request_id, event_type, blink::WebString::fromUTF8(region_id), region); |
768 Send(new ServiceWorkerHostMsg_GeofencingEventFinished(GetRoutingID(), | 766 Send(new ServiceWorkerHostMsg_GeofencingEventFinished(GetRoutingID(), |
769 request_id)); | 767 request_id)); |
770 } | 768 } |
771 | 769 |
772 void ServiceWorkerContextClient::OnCrossOriginConnectEvent( | |
773 int request_id, | |
774 const NavigatorConnectClient& client) { | |
775 TRACE_EVENT0("ServiceWorker", | |
776 "ServiceWorkerContextClient::OnCrossOriginConnectEvent"); | |
777 blink::WebCrossOriginServiceWorkerClient web_client; | |
778 web_client.origin = client.origin; | |
779 web_client.targetURL = client.target_url; | |
780 web_client.clientID = client.message_port_id; | |
781 proxy_->dispatchCrossOriginConnectEvent(request_id, web_client); | |
782 } | |
783 | |
784 void ServiceWorkerContextClient::OnPostMessage( | 770 void ServiceWorkerContextClient::OnPostMessage( |
785 const base::string16& message, | 771 const base::string16& message, |
786 const std::vector<TransferredMessagePort>& sent_message_ports, | 772 const std::vector<TransferredMessagePort>& sent_message_ports, |
787 const std::vector<int>& new_routing_ids) { | 773 const std::vector<int>& new_routing_ids) { |
788 TRACE_EVENT0("ServiceWorker", | 774 TRACE_EVENT0("ServiceWorker", |
789 "ServiceWorkerContextClient::OnPostEvent"); | 775 "ServiceWorkerContextClient::OnPostEvent"); |
790 blink::WebMessagePortChannelArray ports = | 776 blink::WebMessagePortChannelArray ports = |
791 WebMessagePortChannelImpl::CreatePorts( | 777 WebMessagePortChannelImpl::CreatePorts( |
792 sent_message_ports, new_routing_ids, | 778 sent_message_ports, new_routing_ids, |
793 main_thread_task_runner_); | 779 main_thread_task_runner_); |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
971 } | 957 } |
972 | 958 |
973 base::WeakPtr<ServiceWorkerContextClient> | 959 base::WeakPtr<ServiceWorkerContextClient> |
974 ServiceWorkerContextClient::GetWeakPtr() { | 960 ServiceWorkerContextClient::GetWeakPtr() { |
975 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 961 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
976 DCHECK(context_); | 962 DCHECK(context_); |
977 return context_->weak_factory.GetWeakPtr(); | 963 return context_->weak_factory.GetWeakPtr(); |
978 } | 964 } |
979 | 965 |
980 } // namespace content | 966 } // namespace content |
OLD | NEW |