Index: content/renderer/service_worker/service_worker_context_client.cc |
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc |
index 93edf9847eca5c96a45939f8004dace04551a531..0123123592db2e85e4d92b51779338257969c207 100644 |
--- a/content/renderer/service_worker/service_worker_context_client.cc |
+++ b/content/renderer/service_worker/service_worker_context_client.cc |
@@ -178,6 +178,9 @@ struct ServiceWorkerContextClient::WorkerContextData { |
IDMap<blink::WebServiceWorkerClientCallbacks, IDMapOwnPointer>; |
using SkipWaitingCallbacksMap = |
IDMap<blink::WebServiceWorkerSkipWaitingCallbacks, IDMapOwnPointer>; |
+ using SyncEventCallbacksMap = |
+ IDMap<const mojo::Callback<void(ServiceWorkerEventStatus)>, |
+ IDMapOwnPointer>; |
explicit WorkerContextData(ServiceWorkerContextClient* owner) |
: weak_factory(owner) {} |
@@ -198,6 +201,9 @@ struct ServiceWorkerContextClient::WorkerContextData { |
// Pending callbacks for ClaimClients(). |
ClaimClientsCallbacksMap claim_clients_callbacks; |
+ // Pending callbacks for Background Sync Events |
+ SyncEventCallbacksMap sync_event_callbacks; |
+ |
base::ThreadChecker thread_checker; |
base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; |
}; |
@@ -243,7 +249,6 @@ void ServiceWorkerContextClient::OnMessageReceived( |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) |
- IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, |
OnNotificationClickEvent) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) |
@@ -521,8 +526,16 @@ void ServiceWorkerContextClient::didHandlePushEvent( |
void ServiceWorkerContextClient::didHandleSyncEvent( |
int request_id, |
blink::WebServiceWorkerEventResult result) { |
- Send(new ServiceWorkerHostMsg_SyncEventFinished(GetRoutingID(), request_id, |
- result)); |
+ const SyncCallback* callback = |
+ context_->sync_event_callbacks.Lookup(request_id); |
+ if (!callback) |
+ return; |
+ if (result == blink::WebServiceWorkerEventResultCompleted) { |
+ callback->Run(SERVICE_WORKER_EVENT_STATUS_COMPLETED); |
+ } else { |
+ callback->Run(SERVICE_WORKER_EVENT_STATUS_REJECTED); |
+ } |
+ context_->sync_event_callbacks.Remove(request_id); |
} |
void ServiceWorkerContextClient::didHandleCrossOriginConnectEvent( |
@@ -643,6 +656,15 @@ void ServiceWorkerContextClient::stashMessagePort( |
static_cast<base::string16>(name))); |
} |
+void ServiceWorkerContextClient::DispatchSyncEvent( |
+ const SyncCallback& callback) { |
+ TRACE_EVENT0("ServiceWorker", |
+ "ServiceWorkerScriptContext::DispatchSyncEvent"); |
+ int request_id = |
+ context_->sync_event_callbacks.Add(new SyncCallback(callback)); |
+ proxy_->dispatchSyncEvent(request_id); |
+} |
+ |
void ServiceWorkerContextClient::Send(IPC::Message* message) { |
sender_->Send(message); |
} |
@@ -729,12 +751,6 @@ void ServiceWorkerContextClient::OnFetchEvent( |
proxy_->dispatchFetchEvent(request_id, webRequest); |
} |
-void ServiceWorkerContextClient::OnSyncEvent(int request_id) { |
- TRACE_EVENT0("ServiceWorker", |
- "ServiceWorkerContextClient::OnSyncEvent"); |
- proxy_->dispatchSyncEvent(request_id); |
-} |
- |
void ServiceWorkerContextClient::OnNotificationClickEvent( |
int request_id, |
int64_t persistent_notification_id, |