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 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.
| |
681 return; | |
682 if (result == blink::WebServiceWorkerEventResultCompleted) { | |
683 callback->Run(SERVICE_WORKER_OK, | |
684 base::Time::FromDoubleT(event_dispatch_time)); | |
685 } else { | |
686 callback->Run(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, | |
687 base::Time::FromDoubleT(event_dispatch_time)); | |
688 } | |
689 context_->message_event_callbacks.Remove(request_id); | |
672 } | 690 } |
673 | 691 |
674 void ServiceWorkerContextClient::didHandleInstallEvent( | 692 void ServiceWorkerContextClient::didHandleInstallEvent( |
675 int request_id, | 693 int request_id, |
676 blink::WebServiceWorkerEventResult result, | 694 blink::WebServiceWorkerEventResult result, |
677 double event_dispatch_time) { | 695 double event_dispatch_time) { |
678 Send(new ServiceWorkerHostMsg_InstallEventFinished( | 696 Send(new ServiceWorkerHostMsg_InstallEventFinished( |
679 GetRoutingID(), request_id, result, proxy_->hasFetchEventHandler(), | 697 GetRoutingID(), request_id, result, proxy_->hasFetchEventHandler(), |
680 base::Time::FromDoubleT(event_dispatch_time))); | 698 base::Time::FromDoubleT(event_dispatch_time))); |
681 } | 699 } |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
932 proxy_->setRegistration( | 950 proxy_->setRegistration( |
933 WebServiceWorkerRegistrationImpl::CreateHandle(registration)); | 951 WebServiceWorkerRegistrationImpl::CreateHandle(registration)); |
934 } | 952 } |
935 | 953 |
936 void ServiceWorkerContextClient::OnActivateEvent(int request_id) { | 954 void ServiceWorkerContextClient::OnActivateEvent(int request_id) { |
937 TRACE_EVENT0("ServiceWorker", | 955 TRACE_EVENT0("ServiceWorker", |
938 "ServiceWorkerContextClient::OnActivateEvent"); | 956 "ServiceWorkerContextClient::OnActivateEvent"); |
939 proxy_->dispatchActivateEvent(request_id); | 957 proxy_->dispatchActivateEvent(request_id); |
940 } | 958 } |
941 | 959 |
942 void ServiceWorkerContextClient::OnExtendableMessageEvent( | 960 void ServiceWorkerContextClient::DispatchExtendableMessageEvent( |
943 int request_id, | 961 mojom::ExtendableMessageEventPtr event, |
944 const ServiceWorkerMsg_ExtendableMessageEvent_Params& params) { | 962 const DispatchExtendableMessageEventCallback& callback) { |
945 TRACE_EVENT0("ServiceWorker", | 963 TRACE_EVENT0("ServiceWorker", |
946 "ServiceWorkerContextClient::OnExtendableMessageEvent"); | 964 "ServiceWorkerContextClient::DispatchExtendableMessageEvent"); |
965 int request_id = context_->message_event_callbacks.Add( | |
966 base::MakeUnique<DispatchExtendableMessageEventCallback>(callback)); | |
967 | |
947 blink::WebMessagePortChannelArray ports = | 968 blink::WebMessagePortChannelArray ports = |
948 WebMessagePortChannelImpl::CreatePorts(params.message_ports, | 969 WebMessagePortChannelImpl::CreatePorts(event->message_ports, |
949 params.new_routing_ids, | 970 event->new_routing_ids, |
950 main_thread_task_runner_); | 971 main_thread_task_runner_); |
951 if (params.source.client_info.IsValid()) { | 972 if (event->source.client_info.IsValid()) { |
952 blink::WebServiceWorkerClientInfo web_client = | 973 blink::WebServiceWorkerClientInfo web_client = |
953 ToWebServiceWorkerClientInfo(params.source.client_info); | 974 ToWebServiceWorkerClientInfo(event->source.client_info); |
954 proxy_->dispatchExtendableMessageEvent( | 975 proxy_->dispatchExtendableMessageEvent( |
955 request_id, params.message, params.source_origin, ports, web_client); | 976 request_id, event->message, event->source_origin, ports, web_client); |
956 return; | 977 return; |
957 } | 978 } |
958 | 979 |
959 DCHECK(params.source.service_worker_info.IsValid()); | 980 DCHECK(event->source.service_worker_info.IsValid()); |
960 std::unique_ptr<ServiceWorkerHandleReference> handle = | 981 std::unique_ptr<ServiceWorkerHandleReference> handle = |
961 ServiceWorkerHandleReference::Adopt(params.source.service_worker_info, | 982 ServiceWorkerHandleReference::Adopt(event->source.service_worker_info, |
962 sender_.get()); | 983 sender_.get()); |
963 ServiceWorkerDispatcher* dispatcher = | 984 ServiceWorkerDispatcher* dispatcher = |
964 ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance( | 985 ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance( |
965 sender_.get(), main_thread_task_runner_.get()); | 986 sender_.get(), main_thread_task_runner_.get()); |
966 scoped_refptr<WebServiceWorkerImpl> worker = | 987 scoped_refptr<WebServiceWorkerImpl> worker = |
967 dispatcher->GetOrCreateServiceWorker(std::move(handle)); | 988 dispatcher->GetOrCreateServiceWorker(std::move(handle)); |
968 proxy_->dispatchExtendableMessageEvent( | 989 proxy_->dispatchExtendableMessageEvent( |
969 request_id, params.message, params.source_origin, ports, | 990 request_id, event->message, event->source_origin, ports, |
970 WebServiceWorkerImpl::CreateHandle(worker)); | 991 WebServiceWorkerImpl::CreateHandle(worker)); |
971 } | 992 } |
972 | 993 |
973 void ServiceWorkerContextClient::OnInstallEvent(int request_id) { | 994 void ServiceWorkerContextClient::OnInstallEvent(int request_id) { |
974 TRACE_EVENT0("ServiceWorker", | 995 TRACE_EVENT0("ServiceWorker", |
975 "ServiceWorkerContextClient::OnInstallEvent"); | 996 "ServiceWorkerContextClient::OnInstallEvent"); |
976 proxy_->dispatchInstallEvent(request_id); | 997 proxy_->dispatchInstallEvent(request_id); |
977 } | 998 } |
978 | 999 |
979 void ServiceWorkerContextClient::DispatchFetchEvent( | 1000 void ServiceWorkerContextClient::DispatchFetchEvent( |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1275 } | 1296 } |
1276 | 1297 |
1277 base::WeakPtr<ServiceWorkerContextClient> | 1298 base::WeakPtr<ServiceWorkerContextClient> |
1278 ServiceWorkerContextClient::GetWeakPtr() { | 1299 ServiceWorkerContextClient::GetWeakPtr() { |
1279 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 1300 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
1280 DCHECK(context_); | 1301 DCHECK(context_); |
1281 return context_->weak_factory.GetWeakPtr(); | 1302 return context_->weak_factory.GetWeakPtr(); |
1282 } | 1303 } |
1283 | 1304 |
1284 } // namespace content | 1305 } // namespace content |
OLD | NEW |