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 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 201 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsCallbacks>>; | 201 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsCallbacks>>; |
| 202 using ClaimClientsCallbacksMap = | 202 using ClaimClientsCallbacksMap = |
| 203 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks>>; | 203 IDMap<std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks>>; |
| 204 using ClientCallbacksMap = | 204 using ClientCallbacksMap = |
| 205 IDMap<std::unique_ptr<blink::WebServiceWorkerClientCallbacks>>; | 205 IDMap<std::unique_ptr<blink::WebServiceWorkerClientCallbacks>>; |
| 206 using SkipWaitingCallbacksMap = | 206 using SkipWaitingCallbacksMap = |
| 207 IDMap<std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks>>; | 207 IDMap<std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks>>; |
| 208 using SyncEventCallbacksMap = IDMap<std::unique_ptr<const SyncCallback>>; | 208 using SyncEventCallbacksMap = IDMap<std::unique_ptr<const SyncCallback>>; |
| 209 using PaymentRequestEventCallbacksMap = | 209 using PaymentRequestEventCallbacksMap = |
| 210 IDMap<std::unique_ptr<const PaymentRequestEventCallback>>; | 210 IDMap<std::unique_ptr<const PaymentRequestEventCallback>>; |
| 211 using NotificationClickEventCallbacksMap = | |
| 212 IDMap<std::unique_ptr<const DispatchNotificationClickEventCallback>>; | |
| 213 using NotificationCloseEventCallbacksMap = | |
| 214 IDMap<std::unique_ptr<const DispatchNotificationCloseEventCallback>>; | |
| 211 using PushEventCallbacksMap = | 215 using PushEventCallbacksMap = |
| 212 IDMap<std::unique_ptr<const DispatchPushEventCallback>>; | 216 IDMap<std::unique_ptr<const DispatchPushEventCallback>>; |
| 213 using FetchEventCallbacksMap = IDMap<std::unique_ptr<const FetchCallback>>; | 217 using FetchEventCallbacksMap = IDMap<std::unique_ptr<const FetchCallback>>; |
| 214 using ExtendableMessageEventCallbacksMap = | 218 using ExtendableMessageEventCallbacksMap = |
| 215 IDMap<std::unique_ptr<const DispatchExtendableMessageEventCallback>>; | 219 IDMap<std::unique_ptr<const DispatchExtendableMessageEventCallback>>; |
| 216 using NavigationPreloadRequestsMap = IDMap< | 220 using NavigationPreloadRequestsMap = IDMap< |
| 217 std::unique_ptr<ServiceWorkerContextClient::NavigationPreloadRequest>>; | 221 std::unique_ptr<ServiceWorkerContextClient::NavigationPreloadRequest>>; |
| 218 | 222 |
| 219 explicit WorkerContextData(ServiceWorkerContextClient* owner) | 223 explicit WorkerContextData(ServiceWorkerContextClient* owner) |
| 220 : event_dispatcher_binding(owner), | 224 : event_dispatcher_binding(owner), |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 238 | 242 |
| 239 // Pending callbacks for ClaimClients(). | 243 // Pending callbacks for ClaimClients(). |
| 240 ClaimClientsCallbacksMap claim_clients_callbacks; | 244 ClaimClientsCallbacksMap claim_clients_callbacks; |
| 241 | 245 |
| 242 // Pending callbacks for Background Sync Events. | 246 // Pending callbacks for Background Sync Events. |
| 243 SyncEventCallbacksMap sync_event_callbacks; | 247 SyncEventCallbacksMap sync_event_callbacks; |
| 244 | 248 |
| 245 // Pending callbacks for Payment Request Events. | 249 // Pending callbacks for Payment Request Events. |
| 246 PaymentRequestEventCallbacksMap payment_request_event_callbacks; | 250 PaymentRequestEventCallbacksMap payment_request_event_callbacks; |
| 247 | 251 |
| 252 // Pending callbacks for Notification Click Events. | |
| 253 NotificationClickEventCallbacksMap notification_click_event_callbacks; | |
| 254 | |
| 255 // Pending callbacks for Notification Close Events. | |
| 256 NotificationCloseEventCallbacksMap notification_close_event_callbacks; | |
| 257 | |
| 248 // Pending callbacks for Push Events. | 258 // Pending callbacks for Push Events. |
| 249 PushEventCallbacksMap push_event_callbacks; | 259 PushEventCallbacksMap push_event_callbacks; |
| 250 | 260 |
| 251 // Pending callbacks for Fetch Events. | 261 // Pending callbacks for Fetch Events. |
| 252 FetchEventCallbacksMap fetch_event_callbacks; | 262 FetchEventCallbacksMap fetch_event_callbacks; |
| 253 | 263 |
| 254 // Pending callbacks for Extendable Message Events. | 264 // Pending callbacks for Extendable Message Events. |
| 255 ExtendableMessageEventCallbacksMap message_event_callbacks; | 265 ExtendableMessageEventCallbacksMap message_event_callbacks; |
| 256 | 266 |
| 257 // Pending navigation preload requests. | 267 // Pending navigation preload requests. |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 404 | 414 |
| 405 void ServiceWorkerContextClient::OnMessageReceived( | 415 void ServiceWorkerContextClient::OnMessageReceived( |
| 406 int thread_id, | 416 int thread_id, |
| 407 int embedded_worker_id, | 417 int embedded_worker_id, |
| 408 const IPC::Message& message) { | 418 const IPC::Message& message) { |
| 409 CHECK_EQ(embedded_worker_id_, embedded_worker_id); | 419 CHECK_EQ(embedded_worker_id_, embedded_worker_id); |
| 410 bool handled = true; | 420 bool handled = true; |
| 411 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) | 421 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerContextClient, message) |
| 412 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) | 422 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) |
| 413 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) | 423 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) |
| 414 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, | |
| 415 OnNotificationClickEvent) | |
| 416 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationCloseEvent, | |
| 417 OnNotificationCloseEvent) | |
| 418 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClient, OnDidGetClient) | 424 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClient, OnDidGetClient) |
| 419 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients) | 425 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients) |
| 420 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse, | 426 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse, |
| 421 OnOpenWindowResponse) | 427 OnOpenWindowResponse) |
| 422 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowError, | 428 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowError, |
| 423 OnOpenWindowError) | 429 OnOpenWindowError) |
| 424 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FocusClientResponse, | 430 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FocusClientResponse, |
| 425 OnFocusClientResponse) | 431 OnFocusClientResponse) |
| 426 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NavigateClientResponse, | 432 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NavigateClientResponse, |
| 427 OnNavigateClientResponse) | 433 OnNavigateClientResponse) |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 571 | 577 |
| 572 void ServiceWorkerContextClient::willDestroyWorkerContext( | 578 void ServiceWorkerContextClient::willDestroyWorkerContext( |
| 573 v8::Local<v8::Context> context) { | 579 v8::Local<v8::Context> context) { |
| 574 // At this point WillStopCurrentWorkerThread is already called, so | 580 // At this point WillStopCurrentWorkerThread is already called, so |
| 575 // worker_task_runner_->RunsTasksOnCurrentThread() returns false | 581 // worker_task_runner_->RunsTasksOnCurrentThread() returns false |
| 576 // (while we're still on the worker thread). | 582 // (while we're still on the worker thread). |
| 577 proxy_ = NULL; | 583 proxy_ = NULL; |
| 578 | 584 |
| 579 // Aborts all the pending events callbacks. | 585 // Aborts all the pending events callbacks. |
| 580 AbortPendingEventCallbacks(context_->sync_event_callbacks); | 586 AbortPendingEventCallbacks(context_->sync_event_callbacks); |
| 587 AbortPendingEventCallbacks(context_->notification_click_event_callbacks); | |
| 588 AbortPendingEventCallbacks(context_->notification_close_event_callbacks); | |
| 581 AbortPendingEventCallbacks(context_->push_event_callbacks); | 589 AbortPendingEventCallbacks(context_->push_event_callbacks); |
| 582 AbortPendingEventCallbacks(context_->fetch_event_callbacks); | 590 AbortPendingEventCallbacks(context_->fetch_event_callbacks); |
| 583 AbortPendingEventCallbacks(context_->message_event_callbacks); | 591 AbortPendingEventCallbacks(context_->message_event_callbacks); |
| 584 | 592 |
| 585 // We have to clear callbacks now, as they need to be freed on the | 593 // We have to clear callbacks now, as they need to be freed on the |
| 586 // same thread. | 594 // same thread. |
| 587 context_.reset(); | 595 context_.reset(); |
| 588 | 596 |
| 589 // This also lets the message filter stop dispatching messages to | 597 // This also lets the message filter stop dispatching messages to |
| 590 // this client. | 598 // this client. |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 715 DCHECK(callback); | 723 DCHECK(callback); |
| 716 callback->Run(EventResultToStatus(result), | 724 callback->Run(EventResultToStatus(result), |
| 717 base::Time::FromDoubleT(event_dispatch_time)); | 725 base::Time::FromDoubleT(event_dispatch_time)); |
| 718 context_->fetch_event_callbacks.Remove(fetch_event_id); | 726 context_->fetch_event_callbacks.Remove(fetch_event_id); |
| 719 } | 727 } |
| 720 | 728 |
| 721 void ServiceWorkerContextClient::didHandleNotificationClickEvent( | 729 void ServiceWorkerContextClient::didHandleNotificationClickEvent( |
| 722 int request_id, | 730 int request_id, |
| 723 blink::WebServiceWorkerEventResult result, | 731 blink::WebServiceWorkerEventResult result, |
| 724 double event_dispatch_time) { | 732 double event_dispatch_time) { |
| 725 Send(new ServiceWorkerHostMsg_NotificationClickEventFinished( | 733 const DispatchNotificationClickEventCallback* callback = |
| 726 GetRoutingID(), request_id, result, | 734 context_->notification_click_event_callbacks.Lookup(request_id); |
| 727 base::Time::FromDoubleT(event_dispatch_time))); | 735 DCHECK(callback); |
| 736 | |
| 737 callback->Run(result == blink::WebServiceWorkerEventResultCompleted | |
| 738 ? SERVICE_WORKER_OK | |
| 739 : SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, | |
|
shimazu
2017/02/10 08:09:29
You can use "EventResultToStatus(result)" here.
Peter Beverloo
2017/02/10 16:41:06
Done.
| |
| 740 base::Time::FromDoubleT(event_dispatch_time)); | |
| 741 | |
| 742 context_->notification_click_event_callbacks.Remove(request_id); | |
| 728 } | 743 } |
| 729 | 744 |
| 730 void ServiceWorkerContextClient::didHandleNotificationCloseEvent( | 745 void ServiceWorkerContextClient::didHandleNotificationCloseEvent( |
| 731 int request_id, | 746 int request_id, |
| 732 blink::WebServiceWorkerEventResult result, | 747 blink::WebServiceWorkerEventResult result, |
| 733 double event_dispatch_time) { | 748 double event_dispatch_time) { |
| 734 Send(new ServiceWorkerHostMsg_NotificationCloseEventFinished( | 749 const DispatchNotificationCloseEventCallback* callback = |
| 735 GetRoutingID(), request_id, result, | 750 context_->notification_close_event_callbacks.Lookup(request_id); |
| 736 base::Time::FromDoubleT(event_dispatch_time))); | 751 DCHECK(callback); |
| 752 | |
| 753 callback->Run(result == blink::WebServiceWorkerEventResultCompleted | |
| 754 ? SERVICE_WORKER_OK | |
| 755 : SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, | |
|
shimazu
2017/02/10 08:09:29
ditto
Peter Beverloo
2017/02/10 16:41:06
Done.
| |
| 756 base::Time::FromDoubleT(event_dispatch_time)); | |
| 757 | |
| 758 context_->notification_close_event_callbacks.Remove(request_id); | |
| 737 } | 759 } |
| 738 | 760 |
| 739 void ServiceWorkerContextClient::didHandlePushEvent( | 761 void ServiceWorkerContextClient::didHandlePushEvent( |
| 740 int request_id, | 762 int request_id, |
| 741 blink::WebServiceWorkerEventResult result, | 763 blink::WebServiceWorkerEventResult result, |
| 742 double event_dispatch_time) { | 764 double event_dispatch_time) { |
| 743 const DispatchPushEventCallback* callback = | 765 const DispatchPushEventCallback* callback = |
| 744 context_->push_event_callbacks.Lookup(request_id); | 766 context_->push_event_callbacks.Lookup(request_id); |
| 745 DCHECK(callback); | 767 DCHECK(callback); |
| 746 callback->Run(result == blink::WebServiceWorkerEventResultCompleted | 768 callback->Run(result == blink::WebServiceWorkerEventResultCompleted |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1022 webRequest.setClientId(blink::WebString::fromUTF8(request.client_id)); | 1044 webRequest.setClientId(blink::WebString::fromUTF8(request.client_id)); |
| 1023 webRequest.setIsReload(request.is_reload); | 1045 webRequest.setIsReload(request.is_reload); |
| 1024 if (request.fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) { | 1046 if (request.fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) { |
| 1025 proxy_->dispatchForeignFetchEvent(fetch_event_id, webRequest); | 1047 proxy_->dispatchForeignFetchEvent(fetch_event_id, webRequest); |
| 1026 } else { | 1048 } else { |
| 1027 proxy_->dispatchFetchEvent(fetch_event_id, webRequest, | 1049 proxy_->dispatchFetchEvent(fetch_event_id, webRequest, |
| 1028 navigation_preload_sent); | 1050 navigation_preload_sent); |
| 1029 } | 1051 } |
| 1030 } | 1052 } |
| 1031 | 1053 |
| 1032 void ServiceWorkerContextClient::OnNotificationClickEvent( | 1054 void ServiceWorkerContextClient::DispatchNotificationClickEvent( |
| 1033 int request_id, | |
| 1034 const std::string& notification_id, | 1055 const std::string& notification_id, |
| 1035 const PlatformNotificationData& notification_data, | 1056 const PlatformNotificationData& notification_data, |
| 1036 int action_index, | 1057 int action_index, |
| 1037 const base::NullableString16& reply) { | 1058 const base::Optional<base::string16>& reply, |
| 1059 const DispatchNotificationClickEventCallback& callback) { | |
| 1038 TRACE_EVENT0("ServiceWorker", | 1060 TRACE_EVENT0("ServiceWorker", |
| 1039 "ServiceWorkerContextClient::OnNotificationClickEvent"); | 1061 "ServiceWorkerContextClient::DispatchNotificationClickEvent"); |
| 1062 | |
| 1063 int request_id = context_->notification_click_event_callbacks.Add( | |
| 1064 base::MakeUnique<DispatchNotificationClickEventCallback>(callback)); | |
| 1065 | |
| 1066 blink::WebString web_reply; | |
| 1067 if (reply) | |
| 1068 web_reply = blink::WebString::fromUTF16(reply.value()); | |
| 1069 | |
| 1040 proxy_->dispatchNotificationClickEvent( | 1070 proxy_->dispatchNotificationClickEvent( |
| 1041 request_id, blink::WebString::fromUTF8(notification_id), | 1071 request_id, blink::WebString::fromUTF8(notification_id), |
| 1042 ToWebNotificationData(notification_data), action_index, | 1072 ToWebNotificationData(notification_data), action_index, web_reply); |
|
shimazu
2017/02/10 08:09:29
I think you can use blink.mojom.Notification direc
Peter Beverloo
2017/02/10 16:41:06
This relates to the layering issue that we spoke a
shimazu
2017/02/13 00:38:56
Ah, sorry, I didn't understand accurately what you
| |
| 1043 blink::WebString::fromUTF16(reply)); | |
| 1044 } | 1073 } |
| 1045 | 1074 |
| 1046 void ServiceWorkerContextClient::OnNotificationCloseEvent( | 1075 void ServiceWorkerContextClient::DispatchNotificationCloseEvent( |
| 1047 int request_id, | |
| 1048 const std::string& notification_id, | 1076 const std::string& notification_id, |
| 1049 const PlatformNotificationData& notification_data) { | 1077 const PlatformNotificationData& notification_data, |
| 1078 const DispatchNotificationCloseEventCallback& callback) { | |
| 1050 TRACE_EVENT0("ServiceWorker", | 1079 TRACE_EVENT0("ServiceWorker", |
| 1051 "ServiceWorkerContextClient::OnNotificationCloseEvent"); | 1080 "ServiceWorkerContextClient::DispatchNotificationCloseEvent"); |
| 1081 | |
| 1082 int request_id = context_->notification_close_event_callbacks.Add( | |
| 1083 base::MakeUnique<DispatchNotificationCloseEventCallback>(callback)); | |
| 1084 | |
| 1052 proxy_->dispatchNotificationCloseEvent( | 1085 proxy_->dispatchNotificationCloseEvent( |
| 1053 request_id, blink::WebString::fromUTF8(notification_id), | 1086 request_id, blink::WebString::fromUTF8(notification_id), |
| 1054 ToWebNotificationData(notification_data)); | 1087 ToWebNotificationData(notification_data)); |
| 1055 } | 1088 } |
| 1056 | 1089 |
| 1057 void ServiceWorkerContextClient::DispatchPushEvent( | 1090 void ServiceWorkerContextClient::DispatchPushEvent( |
| 1058 const PushEventPayload& payload, | 1091 const PushEventPayload& payload, |
| 1059 const DispatchPushEventCallback& callback) { | 1092 const DispatchPushEventCallback& callback) { |
| 1060 TRACE_EVENT0("ServiceWorker", | 1093 TRACE_EVENT0("ServiceWorker", |
| 1061 "ServiceWorkerContextClient::DispatchPushEvent"); | 1094 "ServiceWorkerContextClient::DispatchPushEvent"); |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1278 } | 1311 } |
| 1279 | 1312 |
| 1280 base::WeakPtr<ServiceWorkerContextClient> | 1313 base::WeakPtr<ServiceWorkerContextClient> |
| 1281 ServiceWorkerContextClient::GetWeakPtr() { | 1314 ServiceWorkerContextClient::GetWeakPtr() { |
| 1282 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 1315 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
| 1283 DCHECK(context_); | 1316 DCHECK(context_); |
| 1284 return context_->weak_factory.GetWeakPtr(); | 1317 return context_->weak_factory.GetWeakPtr(); |
| 1285 } | 1318 } |
| 1286 | 1319 |
| 1287 } // namespace content | 1320 } // namespace content |
| OLD | NEW |