Chromium Code Reviews| 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 f74bf10124736443b384b9317c6a103ae3e31fe8..32739db760154ee4f06f5c9da1f3bfbba2a0b2e4 100644 |
| --- a/content/renderer/service_worker/service_worker_context_client.cc |
| +++ b/content/renderer/service_worker/service_worker_context_client.cc |
| @@ -180,6 +180,8 @@ struct ServiceWorkerContextClient::WorkerContextData { |
| IDMap<std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks>>; |
| using SyncEventCallbacksMap = IDMap<std::unique_ptr<const SyncCallback>>; |
| using FetchEventCallbacksMap = IDMap<std::unique_ptr<const FetchCallback>>; |
| + using ExtendableMessageEventCallbacksMap = |
| + IDMap<std::unique_ptr<const DispatchExtendableMessageEventCallback>>; |
| using NavigationPreloadRequestsMap = IDMap< |
| std::unique_ptr<ServiceWorkerContextClient::NavigationPreloadRequest>>; |
| @@ -212,6 +214,9 @@ struct ServiceWorkerContextClient::WorkerContextData { |
| // Pending callbacks for Fetch Events. |
| FetchEventCallbacksMap fetch_event_callbacks; |
| + // Pending callbacks for Extendable Message Events. |
| + ExtendableMessageEventCallbacksMap message_event_callbacks; |
| + |
| // Pending navigation preload requests. |
| NavigationPreloadRequestsMap preload_requests; |
| @@ -396,8 +401,6 @@ void ServiceWorkerContextClient::OnMessageReceived( |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) |
| IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) |
| - IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ExtendableMessageEvent, |
| - OnExtendableMessageEvent) |
| IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) |
| IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, |
| OnNotificationClickEvent) |
| @@ -577,6 +580,12 @@ void ServiceWorkerContextClient::willDestroyWorkerContext( |
| !it.IsAtEnd(); it.Advance()) { |
| it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); |
| } |
| + // Aborts the all pending extendable message event callbacks. |
| + for (WorkerContextData::ExtendableMessageEventCallbacksMap::iterator it( |
| + &context_->message_event_callbacks); |
| + !it.IsAtEnd(); it.Advance()) { |
| + it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); |
| + } |
| // We have to clear callbacks now, as they need to be freed on the |
| // same thread. |
| @@ -666,9 +675,18 @@ void ServiceWorkerContextClient::didHandleExtendableMessageEvent( |
| int request_id, |
| blink::WebServiceWorkerEventResult result, |
| double event_dispatch_time) { |
| - Send(new ServiceWorkerHostMsg_ExtendableMessageEventFinished( |
| - GetRoutingID(), request_id, result, |
| - base::Time::FromDoubleT(event_dispatch_time))); |
| + const DispatchExtendableMessageEventCallback* callback = |
| + context_->message_event_callbacks.Lookup(request_id); |
| + if (!callback) |
|
shimazu
2016/12/02 04:00:33
DCHECK(callback) is better here because IIUC callb
leonhsl(Using Gerrit)
2016/12/02 08:36:44
This is following didHandleSyncEvent(), |callback|
shimazu
2016/12/05 03:40:21
Oops, I didn't realize that.
Hmm.. I don't want t
horo
2016/12/05 04:13:16
I prefer DCHECK(callback) too.
leonhsl(Using Gerrit)
2016/12/06 08:54:39
Done.
|
| + return; |
| + if (result == blink::WebServiceWorkerEventResultCompleted) { |
| + callback->Run(SERVICE_WORKER_OK, |
| + base::Time::FromDoubleT(event_dispatch_time)); |
| + } else { |
| + callback->Run(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, |
| + base::Time::FromDoubleT(event_dispatch_time)); |
| + } |
| + context_->message_event_callbacks.Remove(request_id); |
| } |
| void ServiceWorkerContextClient::didHandleInstallEvent( |
| @@ -939,26 +957,29 @@ void ServiceWorkerContextClient::OnActivateEvent(int request_id) { |
| proxy_->dispatchActivateEvent(request_id); |
| } |
| -void ServiceWorkerContextClient::OnExtendableMessageEvent( |
| - int request_id, |
| - const ServiceWorkerMsg_ExtendableMessageEvent_Params& params) { |
| +void ServiceWorkerContextClient::DispatchExtendableMessageEvent( |
| + mojom::ExtendableMessageEventPtr event, |
| + const DispatchExtendableMessageEventCallback& callback) { |
| TRACE_EVENT0("ServiceWorker", |
| - "ServiceWorkerContextClient::OnExtendableMessageEvent"); |
| + "ServiceWorkerContextClient::DispatchExtendableMessageEvent"); |
| + int request_id = context_->message_event_callbacks.Add( |
| + base::MakeUnique<DispatchExtendableMessageEventCallback>(callback)); |
| + |
| blink::WebMessagePortChannelArray ports = |
| - WebMessagePortChannelImpl::CreatePorts(params.message_ports, |
| - params.new_routing_ids, |
| + WebMessagePortChannelImpl::CreatePorts(event->message_ports, |
| + event->new_routing_ids, |
| main_thread_task_runner_); |
| - if (params.source.client_info.IsValid()) { |
| + if (event->source.client_info.IsValid()) { |
| blink::WebServiceWorkerClientInfo web_client = |
| - ToWebServiceWorkerClientInfo(params.source.client_info); |
| + ToWebServiceWorkerClientInfo(event->source.client_info); |
| proxy_->dispatchExtendableMessageEvent( |
| - request_id, params.message, params.source_origin, ports, web_client); |
| + request_id, event->message, event->source_origin, ports, web_client); |
| return; |
| } |
| - DCHECK(params.source.service_worker_info.IsValid()); |
| + DCHECK(event->source.service_worker_info.IsValid()); |
| std::unique_ptr<ServiceWorkerHandleReference> handle = |
| - ServiceWorkerHandleReference::Adopt(params.source.service_worker_info, |
| + ServiceWorkerHandleReference::Adopt(event->source.service_worker_info, |
| sender_.get()); |
| ServiceWorkerDispatcher* dispatcher = |
| ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance( |
| @@ -966,7 +987,7 @@ void ServiceWorkerContextClient::OnExtendableMessageEvent( |
| scoped_refptr<WebServiceWorkerImpl> worker = |
| dispatcher->GetOrCreateServiceWorker(std::move(handle)); |
| proxy_->dispatchExtendableMessageEvent( |
| - request_id, params.message, params.source_origin, ports, |
| + request_id, event->message, event->source_origin, ports, |
| WebServiceWorkerImpl::CreateHandle(worker)); |
| } |