Chromium Code Reviews| 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; | |
| 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 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 514 } | 519 } |
| 515 push_start_timings_.erase(request_id); | 520 push_start_timings_.erase(request_id); |
| 516 | 521 |
| 517 Send(new ServiceWorkerHostMsg_PushEventFinished( | 522 Send(new ServiceWorkerHostMsg_PushEventFinished( |
| 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 const SyncCallback* callback = |
| 525 result)); | 530 context_->sync_event_callbacks.Lookup(request_id); |
| 531 if (!callback) | |
| 532 return; | |
| 533 if (result == blink::WebServiceWorkerEventResultCompleted) { | |
| 534 callback->Run(SERVICE_WORKER_EVENT_STATUS_COMPLETED); | |
| 535 } else { | |
| 536 callback->Run(SERVICE_WORKER_EVENT_STATUS_REJECTED); | |
| 537 } | |
| 538 context_->sync_event_callbacks.Remove(request_id); | |
| 526 } | 539 } |
| 527 | 540 |
| 528 void ServiceWorkerContextClient::didHandleCrossOriginConnectEvent( | 541 void ServiceWorkerContextClient::didHandleCrossOriginConnectEvent( |
| 529 int request_id, | 542 int request_id, |
| 530 bool accept_connection) { | 543 bool accept_connection) { |
| 531 Send(new ServiceWorkerHostMsg_CrossOriginConnectEventFinished( | 544 Send(new ServiceWorkerHostMsg_CrossOriginConnectEventFinished( |
| 532 GetRoutingID(), request_id, accept_connection)); | 545 GetRoutingID(), request_id, accept_connection)); |
| 533 } | 546 } |
| 534 | 547 |
| 535 blink::WebServiceWorkerNetworkProvider* | 548 blink::WebServiceWorkerNetworkProvider* |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 636 WebMessagePortChannelImpl* channel_impl = | 649 WebMessagePortChannelImpl* channel_impl = |
| 637 static_cast<WebMessagePortChannelImpl*>(channel); | 650 static_cast<WebMessagePortChannelImpl*>(channel); |
| 638 main_thread_task_runner_->PostTask( | 651 main_thread_task_runner_->PostTask( |
| 639 FROM_HERE, | 652 FROM_HERE, |
| 640 base::Bind(&StashMessagePortOnMainThread, | 653 base::Bind(&StashMessagePortOnMainThread, |
| 641 sender_, GetRoutingID(), | 654 sender_, GetRoutingID(), |
| 642 base::Unretained(channel_impl), | 655 base::Unretained(channel_impl), |
| 643 static_cast<base::string16>(name))); | 656 static_cast<base::string16>(name))); |
| 644 } | 657 } |
| 645 | 658 |
| 659 void ServiceWorkerContextClient::DispatchSyncEvent( | |
| 660 const SyncCallback& callback) { | |
| 661 TRACE_EVENT0("ServiceWorker", | |
| 662 "ServiceWorkerScriptContext::DispatchSyncEvent"); | |
| 663 int request_id = context_->sync_event_callbacks.Add(&callback); | |
|
jkarlin
2015/06/23 17:48:12
This is why mojo is complaining about the callback
iclelland
2015/06/23 20:30:04
Thanks for spotting that! I was staring at everyth
| |
| 664 proxy_->dispatchSyncEvent(request_id); | |
| 665 } | |
| 666 | |
| 646 void ServiceWorkerContextClient::Send(IPC::Message* message) { | 667 void ServiceWorkerContextClient::Send(IPC::Message* message) { |
| 647 sender_->Send(message); | 668 sender_->Send(message); |
| 648 } | 669 } |
| 649 | 670 |
| 650 void ServiceWorkerContextClient::SendWorkerStarted() { | 671 void ServiceWorkerContextClient::SendWorkerStarted() { |
| 651 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 672 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
| 652 TRACE_EVENT_ASYNC_END0("ServiceWorker", | 673 TRACE_EVENT_ASYNC_END0("ServiceWorker", |
| 653 "ServiceWorkerContextClient::StartingWorkerContext", | 674 "ServiceWorkerContextClient::StartingWorkerContext", |
| 654 this); | 675 this); |
| 655 Send(new EmbeddedWorkerHostMsg_WorkerStarted(embedded_worker_id_)); | 676 Send(new EmbeddedWorkerHostMsg_WorkerStarted(embedded_worker_id_)); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 722 webRequest.setCredentialsMode( | 743 webRequest.setCredentialsMode( |
| 723 GetBlinkFetchCredentialsMode(request.credentials_mode)); | 744 GetBlinkFetchCredentialsMode(request.credentials_mode)); |
| 724 webRequest.setRequestContext( | 745 webRequest.setRequestContext( |
| 725 GetBlinkRequestContext(request.request_context_type)); | 746 GetBlinkRequestContext(request.request_context_type)); |
| 726 webRequest.setFrameType(GetBlinkFrameType(request.frame_type)); | 747 webRequest.setFrameType(GetBlinkFrameType(request.frame_type)); |
| 727 webRequest.setIsReload(request.is_reload); | 748 webRequest.setIsReload(request.is_reload); |
| 728 fetch_start_timings_[request_id] = base::TimeTicks::Now(); | 749 fetch_start_timings_[request_id] = base::TimeTicks::Now(); |
| 729 proxy_->dispatchFetchEvent(request_id, webRequest); | 750 proxy_->dispatchFetchEvent(request_id, webRequest); |
| 730 } | 751 } |
| 731 | 752 |
| 732 void ServiceWorkerContextClient::OnSyncEvent(int request_id) { | |
| 733 TRACE_EVENT0("ServiceWorker", | |
| 734 "ServiceWorkerContextClient::OnSyncEvent"); | |
| 735 proxy_->dispatchSyncEvent(request_id); | |
| 736 } | |
| 737 | |
| 738 void ServiceWorkerContextClient::OnNotificationClickEvent( | 753 void ServiceWorkerContextClient::OnNotificationClickEvent( |
| 739 int request_id, | 754 int request_id, |
| 740 int64_t persistent_notification_id, | 755 int64_t persistent_notification_id, |
| 741 const PlatformNotificationData& notification_data) { | 756 const PlatformNotificationData& notification_data) { |
| 742 TRACE_EVENT0("ServiceWorker", | 757 TRACE_EVENT0("ServiceWorker", |
| 743 "ServiceWorkerContextClient::OnNotificationClickEvent"); | 758 "ServiceWorkerContextClient::OnNotificationClickEvent"); |
| 744 notification_click_start_timings_[request_id] = base::TimeTicks::Now(); | 759 notification_click_start_timings_[request_id] = base::TimeTicks::Now(); |
| 745 proxy_->dispatchNotificationClickEvent( | 760 proxy_->dispatchNotificationClickEvent( |
| 746 request_id, | 761 request_id, |
| 747 persistent_notification_id, | 762 persistent_notification_id, |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 971 } | 986 } |
| 972 | 987 |
| 973 base::WeakPtr<ServiceWorkerContextClient> | 988 base::WeakPtr<ServiceWorkerContextClient> |
| 974 ServiceWorkerContextClient::GetWeakPtr() { | 989 ServiceWorkerContextClient::GetWeakPtr() { |
| 975 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 990 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
| 976 DCHECK(context_); | 991 DCHECK(context_); |
| 977 return context_->weak_factory.GetWeakPtr(); | 992 return context_->weak_factory.GetWeakPtr(); |
| 978 } | 993 } |
| 979 | 994 |
| 980 } // namespace content | 995 } // namespace content |
| OLD | NEW |