Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(997)

Side by Side Diff: content/renderer/service_worker/service_worker_context_client.cc

Issue 1171173002: [Background Sync] Use Mojo IPC to fire background sync events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add OWNERS and PRESUBMIT.py Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698