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" |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
171 // worker thread. | 171 // worker thread. |
172 struct ServiceWorkerContextClient::WorkerContextData { | 172 struct ServiceWorkerContextClient::WorkerContextData { |
173 using ClientsCallbacksMap = | 173 using ClientsCallbacksMap = |
174 IDMap<blink::WebServiceWorkerClientsCallbacks, IDMapOwnPointer>; | 174 IDMap<blink::WebServiceWorkerClientsCallbacks, IDMapOwnPointer>; |
175 using ClaimClientsCallbacksMap = | 175 using ClaimClientsCallbacksMap = |
176 IDMap<blink::WebServiceWorkerClientsClaimCallbacks, IDMapOwnPointer>; | 176 IDMap<blink::WebServiceWorkerClientsClaimCallbacks, IDMapOwnPointer>; |
177 using ClientCallbacksMap = | 177 using ClientCallbacksMap = |
178 IDMap<blink::WebServiceWorkerClientCallbacks, IDMapOwnPointer>; | 178 IDMap<blink::WebServiceWorkerClientCallbacks, IDMapOwnPointer>; |
179 using SkipWaitingCallbacksMap = | 179 using SkipWaitingCallbacksMap = |
180 IDMap<blink::WebServiceWorkerSkipWaitingCallbacks, IDMapOwnPointer>; | 180 IDMap<blink::WebServiceWorkerSkipWaitingCallbacks, IDMapOwnPointer>; |
181 using SyncEventCallbacksMap = | |
182 IDMap<const mojo::Callback<void(ServiceWorkerEventStatus)>, | |
183 IDMapExternalPointer>; | |
181 | 184 |
182 explicit WorkerContextData(ServiceWorkerContextClient* owner) | 185 explicit WorkerContextData(ServiceWorkerContextClient* owner) |
183 : weak_factory(owner) {} | 186 : weak_factory(owner) {} |
184 | 187 |
185 ~WorkerContextData() { | 188 ~WorkerContextData() { |
186 DCHECK(thread_checker.CalledOnValidThread()); | 189 DCHECK(thread_checker.CalledOnValidThread()); |
187 } | 190 } |
188 | 191 |
189 // Pending callbacks for GetClientDocuments(). | 192 // Pending callbacks for GetClientDocuments(). |
190 ClientsCallbacksMap clients_callbacks; | 193 ClientsCallbacksMap clients_callbacks; |
191 | 194 |
192 // Pending callbacks for OpenWindow() and FocusClient(). | 195 // Pending callbacks for OpenWindow() and FocusClient(). |
193 ClientCallbacksMap client_callbacks; | 196 ClientCallbacksMap client_callbacks; |
194 | 197 |
195 // Pending callbacks for SkipWaiting(). | 198 // Pending callbacks for SkipWaiting(). |
196 SkipWaitingCallbacksMap skip_waiting_callbacks; | 199 SkipWaitingCallbacksMap skip_waiting_callbacks; |
197 | 200 |
198 // Pending callbacks for ClaimClients(). | 201 // Pending callbacks for ClaimClients(). |
199 ClaimClientsCallbacksMap claim_clients_callbacks; | 202 ClaimClientsCallbacksMap claim_clients_callbacks; |
200 | 203 |
204 // Pending callbacks for Background Sync Events | |
205 SyncEventCallbacksMap sync_event_callbacks_; | |
jkarlin
2015/06/18 18:13:57
no trailing _ in struct member names.
iclelland
2015/06/19 13:44:32
Done.
| |
206 | |
201 base::ThreadChecker thread_checker; | 207 base::ThreadChecker thread_checker; |
202 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; | 208 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; |
203 }; | 209 }; |
204 | 210 |
205 ServiceWorkerContextClient* | 211 ServiceWorkerContextClient* |
206 ServiceWorkerContextClient::ThreadSpecificInstance() { | 212 ServiceWorkerContextClient::ThreadSpecificInstance() { |
207 return g_worker_client_tls.Pointer()->Get(); | 213 return g_worker_client_tls.Pointer()->Get(); |
208 } | 214 } |
209 | 215 |
210 ServiceWorkerContextClient::ServiceWorkerContextClient( | 216 ServiceWorkerContextClient::ServiceWorkerContextClient( |
(...skipping 25 matching lines...) Expand all Loading... | |
236 void ServiceWorkerContextClient::OnMessageReceived( | 242 void ServiceWorkerContextClient::OnMessageReceived( |
237 int thread_id, | 243 int thread_id, |
238 int embedded_worker_id, | 244 int embedded_worker_id, |
239 const IPC::Message& message) { | 245 const IPC::Message& message) { |
240 CHECK_EQ(embedded_worker_id_, embedded_worker_id); | 246 CHECK_EQ(embedded_worker_id_, embedded_worker_id); |
241 bool handled = true; | 247 bool handled = true; |
242 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) | 248 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) |
243 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) | 249 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) |
244 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) | 250 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) |
245 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) | 251 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) |
246 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent) | |
247 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, | 252 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, |
248 OnNotificationClickEvent) | 253 OnNotificationClickEvent) |
249 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) | 254 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) |
250 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent, OnGeofencingEvent) | 255 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent, OnGeofencingEvent) |
251 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginConnectEvent, | 256 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginConnectEvent, |
252 OnCrossOriginConnectEvent) | 257 OnCrossOriginConnectEvent) |
253 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage) | 258 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage) |
254 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker, | 259 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker, |
255 OnCrossOriginMessageToWorker) | 260 OnCrossOriginMessageToWorker) |
256 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SendStashedMessagePorts, | 261 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SendStashedMessagePorts, |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
519 } | 524 } |
520 | 525 |
521 // TODO(chasej): crbug.com/486890 - Remove when matching blink changes land | 526 // TODO(chasej): crbug.com/486890 - Remove when matching blink changes land |
522 void ServiceWorkerContextClient::didHandleSyncEvent(int request_id) { | 527 void ServiceWorkerContextClient::didHandleSyncEvent(int request_id) { |
523 didHandleSyncEvent(request_id, blink::WebServiceWorkerEventResultCompleted); | 528 didHandleSyncEvent(request_id, blink::WebServiceWorkerEventResultCompleted); |
524 } | 529 } |
525 | 530 |
526 void ServiceWorkerContextClient::didHandleSyncEvent( | 531 void ServiceWorkerContextClient::didHandleSyncEvent( |
527 int request_id, | 532 int request_id, |
528 blink::WebServiceWorkerEventResult result) { | 533 blink::WebServiceWorkerEventResult result) { |
529 Send(new ServiceWorkerHostMsg_SyncEventFinished(GetRoutingID(), request_id, | 534 const SyncCallback* callback = |
530 result)); | 535 context_->sync_event_callbacks_.Lookup(request_id); |
536 if (!callback) | |
537 return; | |
538 if (result == blink::WebServiceWorkerEventResultCompleted) { | |
539 callback->Run(SERVICE_WORKER_EVENT_STATUS_COMPLETED); | |
540 } else { | |
541 callback->Run(SERVICE_WORKER_EVENT_STATUS_REJECTED); | |
542 } | |
543 context_->sync_event_callbacks_.Remove(request_id); | |
531 } | 544 } |
532 | 545 |
533 void ServiceWorkerContextClient::didHandleCrossOriginConnectEvent( | 546 void ServiceWorkerContextClient::didHandleCrossOriginConnectEvent( |
534 int request_id, | 547 int request_id, |
535 bool accept_connection) { | 548 bool accept_connection) { |
536 Send(new ServiceWorkerHostMsg_CrossOriginConnectEventFinished( | 549 Send(new ServiceWorkerHostMsg_CrossOriginConnectEventFinished( |
537 GetRoutingID(), request_id, accept_connection)); | 550 GetRoutingID(), request_id, accept_connection)); |
538 } | 551 } |
539 | 552 |
540 blink::WebServiceWorkerNetworkProvider* | 553 blink::WebServiceWorkerNetworkProvider* |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
641 WebMessagePortChannelImpl* channel_impl = | 654 WebMessagePortChannelImpl* channel_impl = |
642 static_cast<WebMessagePortChannelImpl*>(channel); | 655 static_cast<WebMessagePortChannelImpl*>(channel); |
643 main_thread_task_runner_->PostTask( | 656 main_thread_task_runner_->PostTask( |
644 FROM_HERE, | 657 FROM_HERE, |
645 base::Bind(&StashMessagePortOnMainThread, | 658 base::Bind(&StashMessagePortOnMainThread, |
646 sender_, GetRoutingID(), | 659 sender_, GetRoutingID(), |
647 base::Unretained(channel_impl), | 660 base::Unretained(channel_impl), |
648 static_cast<base::string16>(name))); | 661 static_cast<base::string16>(name))); |
649 } | 662 } |
650 | 663 |
664 void ServiceWorkerContextClient::DispatchSyncEvent( | |
665 const SyncCallback& callbacks) { | |
666 TRACE_EVENT0("ServiceWorker", | |
667 "ServiceWorkerScriptContext::DispatchSyncEvent"); | |
668 int request_id = context_->sync_event_callbacks_.Add(&callbacks); | |
669 proxy_->dispatchSyncEvent(request_id); | |
670 } | |
671 | |
651 void ServiceWorkerContextClient::Send(IPC::Message* message) { | 672 void ServiceWorkerContextClient::Send(IPC::Message* message) { |
652 sender_->Send(message); | 673 sender_->Send(message); |
653 } | 674 } |
654 | 675 |
655 void ServiceWorkerContextClient::SendWorkerStarted() { | 676 void ServiceWorkerContextClient::SendWorkerStarted() { |
656 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 677 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
657 TRACE_EVENT_ASYNC_END0("ServiceWorker", | 678 TRACE_EVENT_ASYNC_END0("ServiceWorker", |
658 "ServiceWorkerContextClient::StartingWorkerContext", | 679 "ServiceWorkerContextClient::StartingWorkerContext", |
659 this); | 680 this); |
660 Send(new EmbeddedWorkerHostMsg_WorkerStarted(embedded_worker_id_)); | 681 Send(new EmbeddedWorkerHostMsg_WorkerStarted(embedded_worker_id_)); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
727 webRequest.setCredentialsMode( | 748 webRequest.setCredentialsMode( |
728 GetBlinkFetchCredentialsMode(request.credentials_mode)); | 749 GetBlinkFetchCredentialsMode(request.credentials_mode)); |
729 webRequest.setRequestContext( | 750 webRequest.setRequestContext( |
730 GetBlinkRequestContext(request.request_context_type)); | 751 GetBlinkRequestContext(request.request_context_type)); |
731 webRequest.setFrameType(GetBlinkFrameType(request.frame_type)); | 752 webRequest.setFrameType(GetBlinkFrameType(request.frame_type)); |
732 webRequest.setIsReload(request.is_reload); | 753 webRequest.setIsReload(request.is_reload); |
733 fetch_start_timings_[request_id] = base::TimeTicks::Now(); | 754 fetch_start_timings_[request_id] = base::TimeTicks::Now(); |
734 proxy_->dispatchFetchEvent(request_id, webRequest); | 755 proxy_->dispatchFetchEvent(request_id, webRequest); |
735 } | 756 } |
736 | 757 |
737 void ServiceWorkerContextClient::OnSyncEvent(int request_id) { | 758 void ServiceWorkerContextClient::OnSyncEvent(int request_id) { |
jkarlin
2015/06/18 18:13:57
I believe you need to remove this.
iclelland
2015/06/19 13:44:32
Done.
| |
738 TRACE_EVENT0("ServiceWorker", | 759 TRACE_EVENT0("ServiceWorker", |
739 "ServiceWorkerContextClient::OnSyncEvent"); | 760 "ServiceWorkerContextClient::OnSyncEvent"); |
740 proxy_->dispatchSyncEvent(request_id); | 761 proxy_->dispatchSyncEvent(request_id); |
741 } | 762 } |
742 | 763 |
743 void ServiceWorkerContextClient::OnNotificationClickEvent( | 764 void ServiceWorkerContextClient::OnNotificationClickEvent( |
744 int request_id, | 765 int request_id, |
745 int64_t persistent_notification_id, | 766 int64_t persistent_notification_id, |
746 const PlatformNotificationData& notification_data) { | 767 const PlatformNotificationData& notification_data) { |
747 TRACE_EVENT0("ServiceWorker", | 768 TRACE_EVENT0("ServiceWorker", |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
976 } | 997 } |
977 | 998 |
978 base::WeakPtr<ServiceWorkerContextClient> | 999 base::WeakPtr<ServiceWorkerContextClient> |
979 ServiceWorkerContextClient::GetWeakPtr() { | 1000 ServiceWorkerContextClient::GetWeakPtr() { |
980 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 1001 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
981 DCHECK(context_); | 1002 DCHECK(context_); |
982 return context_->weak_factory.GetWeakPtr(); | 1003 return context_->weak_factory.GetWeakPtr(); |
983 } | 1004 } |
984 | 1005 |
985 } // namespace content | 1006 } // namespace content |
OLD | NEW |