Chromium Code Reviews| 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 |