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 <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 using ClientsCallbacksMap = | 173 using ClientsCallbacksMap = |
174 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsCallbacks>>; | 174 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsCallbacks>>; |
175 using ClaimClientsCallbacksMap = | 175 using ClaimClientsCallbacksMap = |
176 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks>>; | 176 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks>>; |
177 using ClientCallbacksMap = | 177 using ClientCallbacksMap = |
178 IDMap<std::unique_ptr<blink::WebServiceWorkerClientCallbacks>>; | 178 IDMap<std::unique_ptr<blink::WebServiceWorkerClientCallbacks>>; |
179 using SkipWaitingCallbacksMap = | 179 using SkipWaitingCallbacksMap = |
180 IDMap<std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks>>; | 180 IDMap<std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks>>; |
181 using SyncEventCallbacksMap = IDMap<std::unique_ptr<const SyncCallback>>; | 181 using SyncEventCallbacksMap = IDMap<std::unique_ptr<const SyncCallback>>; |
182 using FetchEventCallbacksMap = IDMap<std::unique_ptr<const FetchCallback>>; | 182 using FetchEventCallbacksMap = IDMap<std::unique_ptr<const FetchCallback>>; |
| 183 using ExtendableMessageEventCallbacksMap = |
| 184 IDMap<std::unique_ptr<const DispatchExtendableMessageEventCallback>>; |
183 using NavigationPreloadRequestsMap = IDMap< | 185 using NavigationPreloadRequestsMap = IDMap< |
184 std::unique_ptr<ServiceWorkerContextClient::NavigationPreloadRequest>>; | 186 std::unique_ptr<ServiceWorkerContextClient::NavigationPreloadRequest>>; |
185 | 187 |
186 explicit WorkerContextData(ServiceWorkerContextClient* owner) | 188 explicit WorkerContextData(ServiceWorkerContextClient* owner) |
187 : event_dispatcher_binding(owner), | 189 : event_dispatcher_binding(owner), |
188 weak_factory(owner), | 190 weak_factory(owner), |
189 proxy_weak_factory(owner->proxy_) {} | 191 proxy_weak_factory(owner->proxy_) {} |
190 | 192 |
191 ~WorkerContextData() { | 193 ~WorkerContextData() { |
192 DCHECK(thread_checker.CalledOnValidThread()); | 194 DCHECK(thread_checker.CalledOnValidThread()); |
(...skipping 12 matching lines...) Expand all Loading... |
205 | 207 |
206 // Pending callbacks for ClaimClients(). | 208 // Pending callbacks for ClaimClients(). |
207 ClaimClientsCallbacksMap claim_clients_callbacks; | 209 ClaimClientsCallbacksMap claim_clients_callbacks; |
208 | 210 |
209 // Pending callbacks for Background Sync Events. | 211 // Pending callbacks for Background Sync Events. |
210 SyncEventCallbacksMap sync_event_callbacks; | 212 SyncEventCallbacksMap sync_event_callbacks; |
211 | 213 |
212 // Pending callbacks for Fetch Events. | 214 // Pending callbacks for Fetch Events. |
213 FetchEventCallbacksMap fetch_event_callbacks; | 215 FetchEventCallbacksMap fetch_event_callbacks; |
214 | 216 |
| 217 // Pending callbacks for Extendable Message Events. |
| 218 ExtendableMessageEventCallbacksMap message_event_callbacks; |
| 219 |
215 // Pending navigation preload requests. | 220 // Pending navigation preload requests. |
216 NavigationPreloadRequestsMap preload_requests; | 221 NavigationPreloadRequestsMap preload_requests; |
217 | 222 |
218 base::ThreadChecker thread_checker; | 223 base::ThreadChecker thread_checker; |
219 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; | 224 base::WeakPtrFactory<ServiceWorkerContextClient> weak_factory; |
220 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; | 225 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; |
221 }; | 226 }; |
222 | 227 |
223 class ServiceWorkerContextClient::NavigationPreloadRequest final | 228 class ServiceWorkerContextClient::NavigationPreloadRequest final |
224 : public mojom::URLLoaderClient { | 229 : public mojom::URLLoaderClient { |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 ServiceWorkerContextClient::~ServiceWorkerContextClient() {} | 394 ServiceWorkerContextClient::~ServiceWorkerContextClient() {} |
390 | 395 |
391 void ServiceWorkerContextClient::OnMessageReceived( | 396 void ServiceWorkerContextClient::OnMessageReceived( |
392 int thread_id, | 397 int thread_id, |
393 int embedded_worker_id, | 398 int embedded_worker_id, |
394 const IPC::Message& message) { | 399 const IPC::Message& message) { |
395 CHECK_EQ(embedded_worker_id_, embedded_worker_id); | 400 CHECK_EQ(embedded_worker_id_, embedded_worker_id); |
396 bool handled = true; | 401 bool handled = true; |
397 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) | 402 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) |
398 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) | 403 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) |
399 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ExtendableMessageEvent, | |
400 OnExtendableMessageEvent) | |
401 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) | 404 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) |
402 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, | 405 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, |
403 OnNotificationClickEvent) | 406 OnNotificationClickEvent) |
404 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationCloseEvent, | 407 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationCloseEvent, |
405 OnNotificationCloseEvent) | 408 OnNotificationCloseEvent) |
406 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) | 409 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) |
407 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClient, OnDidGetClient) | 410 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClient, OnDidGetClient) |
408 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients) | 411 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients) |
409 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse, | 412 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse, |
410 OnOpenWindowResponse) | 413 OnOpenWindowResponse) |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 &context_->sync_event_callbacks); | 573 &context_->sync_event_callbacks); |
571 !it.IsAtEnd(); it.Advance()) { | 574 !it.IsAtEnd(); it.Advance()) { |
572 it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); | 575 it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); |
573 } | 576 } |
574 // Aborts the all pending fetch event callbacks. | 577 // Aborts the all pending fetch event callbacks. |
575 for (WorkerContextData::FetchEventCallbacksMap::iterator it( | 578 for (WorkerContextData::FetchEventCallbacksMap::iterator it( |
576 &context_->fetch_event_callbacks); | 579 &context_->fetch_event_callbacks); |
577 !it.IsAtEnd(); it.Advance()) { | 580 !it.IsAtEnd(); it.Advance()) { |
578 it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); | 581 it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); |
579 } | 582 } |
| 583 // Aborts the all pending extendable message event callbacks. |
| 584 for (WorkerContextData::ExtendableMessageEventCallbacksMap::iterator it( |
| 585 &context_->message_event_callbacks); |
| 586 !it.IsAtEnd(); it.Advance()) { |
| 587 it.GetCurrentValue()->Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); |
| 588 } |
580 | 589 |
581 // We have to clear callbacks now, as they need to be freed on the | 590 // We have to clear callbacks now, as they need to be freed on the |
582 // same thread. | 591 // same thread. |
583 context_.reset(); | 592 context_.reset(); |
584 | 593 |
585 // This also lets the message filter stop dispatching messages to | 594 // This also lets the message filter stop dispatching messages to |
586 // this client. | 595 // this client. |
587 g_worker_client_tls.Pointer()->Set(NULL); | 596 g_worker_client_tls.Pointer()->Set(NULL); |
588 | 597 |
589 GetContentClient()->renderer()->WillDestroyServiceWorkerContextOnWorkerThread( | 598 GetContentClient()->renderer()->WillDestroyServiceWorkerContextOnWorkerThread( |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 double event_dispatch_time) { | 668 double event_dispatch_time) { |
660 Send(new ServiceWorkerHostMsg_ActivateEventFinished( | 669 Send(new ServiceWorkerHostMsg_ActivateEventFinished( |
661 GetRoutingID(), request_id, result, | 670 GetRoutingID(), request_id, result, |
662 base::Time::FromDoubleT(event_dispatch_time))); | 671 base::Time::FromDoubleT(event_dispatch_time))); |
663 } | 672 } |
664 | 673 |
665 void ServiceWorkerContextClient::didHandleExtendableMessageEvent( | 674 void ServiceWorkerContextClient::didHandleExtendableMessageEvent( |
666 int request_id, | 675 int request_id, |
667 blink::WebServiceWorkerEventResult result, | 676 blink::WebServiceWorkerEventResult result, |
668 double event_dispatch_time) { | 677 double event_dispatch_time) { |
669 Send(new ServiceWorkerHostMsg_ExtendableMessageEventFinished( | 678 const DispatchExtendableMessageEventCallback* callback = |
670 GetRoutingID(), request_id, result, | 679 context_->message_event_callbacks.Lookup(request_id); |
671 base::Time::FromDoubleT(event_dispatch_time))); | 680 DCHECK(callback); |
| 681 if (result == blink::WebServiceWorkerEventResultCompleted) { |
| 682 callback->Run(SERVICE_WORKER_OK, |
| 683 base::Time::FromDoubleT(event_dispatch_time)); |
| 684 } else { |
| 685 callback->Run(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, |
| 686 base::Time::FromDoubleT(event_dispatch_time)); |
| 687 } |
| 688 context_->message_event_callbacks.Remove(request_id); |
672 } | 689 } |
673 | 690 |
674 void ServiceWorkerContextClient::didHandleInstallEvent( | 691 void ServiceWorkerContextClient::didHandleInstallEvent( |
675 int request_id, | 692 int request_id, |
676 blink::WebServiceWorkerEventResult result, | 693 blink::WebServiceWorkerEventResult result, |
677 double event_dispatch_time) { | 694 double event_dispatch_time) { |
678 Send(new ServiceWorkerHostMsg_InstallEventFinished( | 695 Send(new ServiceWorkerHostMsg_InstallEventFinished( |
679 GetRoutingID(), request_id, result, proxy_->hasFetchEventHandler(), | 696 GetRoutingID(), request_id, result, proxy_->hasFetchEventHandler(), |
680 base::Time::FromDoubleT(event_dispatch_time))); | 697 base::Time::FromDoubleT(event_dispatch_time))); |
681 } | 698 } |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
920 proxy_->setRegistration( | 937 proxy_->setRegistration( |
921 WebServiceWorkerRegistrationImpl::CreateHandle(registration)); | 938 WebServiceWorkerRegistrationImpl::CreateHandle(registration)); |
922 } | 939 } |
923 | 940 |
924 void ServiceWorkerContextClient::OnActivateEvent(int request_id) { | 941 void ServiceWorkerContextClient::OnActivateEvent(int request_id) { |
925 TRACE_EVENT0("ServiceWorker", | 942 TRACE_EVENT0("ServiceWorker", |
926 "ServiceWorkerContextClient::OnActivateEvent"); | 943 "ServiceWorkerContextClient::OnActivateEvent"); |
927 proxy_->dispatchActivateEvent(request_id); | 944 proxy_->dispatchActivateEvent(request_id); |
928 } | 945 } |
929 | 946 |
930 void ServiceWorkerContextClient::OnExtendableMessageEvent( | 947 void ServiceWorkerContextClient::DispatchExtendableMessageEvent( |
931 int request_id, | 948 mojom::ExtendableMessageEventPtr event, |
932 const ServiceWorkerMsg_ExtendableMessageEvent_Params& params) { | 949 const DispatchExtendableMessageEventCallback& callback) { |
933 TRACE_EVENT0("ServiceWorker", | 950 TRACE_EVENT0("ServiceWorker", |
934 "ServiceWorkerContextClient::OnExtendableMessageEvent"); | 951 "ServiceWorkerContextClient::DispatchExtendableMessageEvent"); |
| 952 int request_id = context_->message_event_callbacks.Add( |
| 953 base::MakeUnique<DispatchExtendableMessageEventCallback>(callback)); |
| 954 |
935 blink::WebMessagePortChannelArray ports = | 955 blink::WebMessagePortChannelArray ports = |
936 WebMessagePortChannelImpl::CreatePorts(params.message_ports, | 956 WebMessagePortChannelImpl::CreatePorts(event->message_ports, |
937 params.new_routing_ids, | 957 event->new_routing_ids, |
938 main_thread_task_runner_); | 958 main_thread_task_runner_); |
939 if (params.source.client_info.IsValid()) { | 959 if (event->source.client_info.IsValid()) { |
940 blink::WebServiceWorkerClientInfo web_client = | 960 blink::WebServiceWorkerClientInfo web_client = |
941 ToWebServiceWorkerClientInfo(params.source.client_info); | 961 ToWebServiceWorkerClientInfo(event->source.client_info); |
942 proxy_->dispatchExtendableMessageEvent( | 962 proxy_->dispatchExtendableMessageEvent( |
943 request_id, params.message, params.source_origin, ports, web_client); | 963 request_id, event->message, event->source_origin, ports, web_client); |
944 return; | 964 return; |
945 } | 965 } |
946 | 966 |
947 DCHECK(params.source.service_worker_info.IsValid()); | 967 DCHECK(event->source.service_worker_info.IsValid()); |
948 std::unique_ptr<ServiceWorkerHandleReference> handle = | 968 std::unique_ptr<ServiceWorkerHandleReference> handle = |
949 ServiceWorkerHandleReference::Adopt(params.source.service_worker_info, | 969 ServiceWorkerHandleReference::Adopt(event->source.service_worker_info, |
950 sender_.get()); | 970 sender_.get()); |
951 ServiceWorkerDispatcher* dispatcher = | 971 ServiceWorkerDispatcher* dispatcher = |
952 ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance( | 972 ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance( |
953 sender_.get(), main_thread_task_runner_.get()); | 973 sender_.get(), main_thread_task_runner_.get()); |
954 scoped_refptr<WebServiceWorkerImpl> worker = | 974 scoped_refptr<WebServiceWorkerImpl> worker = |
955 dispatcher->GetOrCreateServiceWorker(std::move(handle)); | 975 dispatcher->GetOrCreateServiceWorker(std::move(handle)); |
956 proxy_->dispatchExtendableMessageEvent( | 976 proxy_->dispatchExtendableMessageEvent( |
957 request_id, params.message, params.source_origin, ports, | 977 request_id, event->message, event->source_origin, ports, |
958 WebServiceWorkerImpl::CreateHandle(worker)); | 978 WebServiceWorkerImpl::CreateHandle(worker)); |
959 } | 979 } |
960 | 980 |
961 void ServiceWorkerContextClient::OnInstallEvent(int request_id) { | 981 void ServiceWorkerContextClient::OnInstallEvent(int request_id) { |
962 TRACE_EVENT0("ServiceWorker", | 982 TRACE_EVENT0("ServiceWorker", |
963 "ServiceWorkerContextClient::OnInstallEvent"); | 983 "ServiceWorkerContextClient::OnInstallEvent"); |
964 proxy_->dispatchInstallEvent(request_id); | 984 proxy_->dispatchInstallEvent(request_id); |
965 } | 985 } |
966 | 986 |
967 void ServiceWorkerContextClient::DispatchFetchEvent( | 987 void ServiceWorkerContextClient::DispatchFetchEvent( |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1263 } | 1283 } |
1264 | 1284 |
1265 base::WeakPtr<ServiceWorkerContextClient> | 1285 base::WeakPtr<ServiceWorkerContextClient> |
1266 ServiceWorkerContextClient::GetWeakPtr() { | 1286 ServiceWorkerContextClient::GetWeakPtr() { |
1267 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 1287 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
1268 DCHECK(context_); | 1288 DCHECK(context_); |
1269 return context_->weak_factory.GetWeakPtr(); | 1289 return context_->weak_factory.GetWeakPtr(); |
1270 } | 1290 } |
1271 | 1291 |
1272 } // namespace content | 1292 } // namespace content |
OLD | NEW |