| 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 |