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 "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) | 243 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) |
244 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) | 244 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) |
245 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) | 245 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) |
246 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent) | 246 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent) |
247 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, | 247 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, |
248 OnNotificationClickEvent) | 248 OnNotificationClickEvent) |
249 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) | 249 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) |
250 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent, OnGeofencingEvent) | 250 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent, OnGeofencingEvent) |
251 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginConnectEvent, | 251 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginConnectEvent, |
252 OnCrossOriginConnectEvent) | 252 OnCrossOriginConnectEvent) |
253 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage) | 253 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ClientMessageEvent, |
| 254 OnClientMessageEvent) |
| 255 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_WorkerMessageEvent, |
| 256 OnWorkerMessageEvent) |
254 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker, | 257 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker, |
255 OnCrossOriginMessageToWorker) | 258 OnCrossOriginMessageToWorker) |
256 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SendStashedMessagePorts, | 259 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SendStashedMessagePorts, |
257 OnSendStashedMessagePorts) | 260 OnSendStashedMessagePorts) |
258 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients) | 261 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, OnDidGetClients) |
259 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse, | 262 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse, |
260 OnOpenWindowResponse) | 263 OnOpenWindowResponse) |
261 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowError, | 264 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowError, |
262 OnOpenWindowError) | 265 OnOpenWindowError) |
263 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FocusClientResponse, | 266 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FocusClientResponse, |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 result)); | 528 result)); |
526 } | 529 } |
527 | 530 |
528 void ServiceWorkerContextClient::didHandleCrossOriginConnectEvent( | 531 void ServiceWorkerContextClient::didHandleCrossOriginConnectEvent( |
529 int request_id, | 532 int request_id, |
530 bool accept_connection) { | 533 bool accept_connection) { |
531 Send(new ServiceWorkerHostMsg_CrossOriginConnectEventFinished( | 534 Send(new ServiceWorkerHostMsg_CrossOriginConnectEventFinished( |
532 GetRoutingID(), request_id, accept_connection)); | 535 GetRoutingID(), request_id, accept_connection)); |
533 } | 536 } |
534 | 537 |
| 538 void ServiceWorkerContextClient::didHandleMessageEvent( |
| 539 int request_id, |
| 540 blink::WebServiceWorkerEventResult result) { |
| 541 Send(new ServiceWorkerHostMsg_MessageEventFinished(GetRoutingID(), |
| 542 request_id)); |
| 543 } |
| 544 |
535 blink::WebServiceWorkerNetworkProvider* | 545 blink::WebServiceWorkerNetworkProvider* |
536 ServiceWorkerContextClient::createServiceWorkerNetworkProvider( | 546 ServiceWorkerContextClient::createServiceWorkerNetworkProvider( |
537 blink::WebDataSource* data_source) { | 547 blink::WebDataSource* data_source) { |
538 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); | 548 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); |
539 | 549 |
540 // Create a content::ServiceWorkerNetworkProvider for this data source so | 550 // Create a content::ServiceWorkerNetworkProvider for this data source so |
541 // we can observe its requests. | 551 // we can observe its requests. |
542 scoped_ptr<ServiceWorkerNetworkProvider> provider( | 552 scoped_ptr<ServiceWorkerNetworkProvider> provider( |
543 new ServiceWorkerNetworkProvider( | 553 new ServiceWorkerNetworkProvider( |
544 MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_CONTROLLER)); | 554 MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_CONTROLLER)); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 if (!found) | 676 if (!found) |
667 return; // Cannot be associated with a registration in some tests. | 677 return; // Cannot be associated with a registration in some tests. |
668 | 678 |
669 ServiceWorkerDispatcher* dispatcher = | 679 ServiceWorkerDispatcher* dispatcher = |
670 ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance(sender_.get()); | 680 ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance(sender_.get()); |
671 | 681 |
672 // Register a registration and its version attributes with the dispatcher | 682 // Register a registration and its version attributes with the dispatcher |
673 // living on the worker thread. | 683 // living on the worker thread. |
674 scoped_ptr<WebServiceWorkerRegistrationImpl> registration( | 684 scoped_ptr<WebServiceWorkerRegistrationImpl> registration( |
675 dispatcher->CreateServiceWorkerRegistration(info, false)); | 685 dispatcher->CreateServiceWorkerRegistration(info, false)); |
| 686 int provider_id = provider_context_->provider_id(); |
676 registration->SetInstalling( | 687 registration->SetInstalling( |
677 dispatcher->GetServiceWorker(attrs.installing, false)); | 688 dispatcher->GetServiceWorker(attrs.installing, provider_id, false)); |
678 registration->SetWaiting( | 689 registration->SetWaiting( |
679 dispatcher->GetServiceWorker(attrs.waiting, false)); | 690 dispatcher->GetServiceWorker(attrs.waiting, provider_id, false)); |
680 registration->SetActive( | 691 registration->SetActive( |
681 dispatcher->GetServiceWorker(attrs.active, false)); | 692 dispatcher->GetServiceWorker(attrs.active, provider_id, false)); |
682 | 693 |
683 proxy_->setRegistration(registration.release()); | 694 proxy_->setRegistration(registration.release()); |
684 } | 695 } |
685 | 696 |
686 void ServiceWorkerContextClient::OnActivateEvent(int request_id) { | 697 void ServiceWorkerContextClient::OnActivateEvent(int request_id) { |
687 TRACE_EVENT0("ServiceWorker", | 698 TRACE_EVENT0("ServiceWorker", |
688 "ServiceWorkerContextClient::OnActivateEvent"); | 699 "ServiceWorkerContextClient::OnActivateEvent"); |
689 activate_start_timings_[request_id] = base::TimeTicks::Now(); | 700 activate_start_timings_[request_id] = base::TimeTicks::Now(); |
690 proxy_->dispatchActivateEvent(request_id); | 701 proxy_->dispatchActivateEvent(request_id); |
691 } | 702 } |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
774 const NavigatorConnectClient& client) { | 785 const NavigatorConnectClient& client) { |
775 TRACE_EVENT0("ServiceWorker", | 786 TRACE_EVENT0("ServiceWorker", |
776 "ServiceWorkerContextClient::OnCrossOriginConnectEvent"); | 787 "ServiceWorkerContextClient::OnCrossOriginConnectEvent"); |
777 blink::WebCrossOriginServiceWorkerClient web_client; | 788 blink::WebCrossOriginServiceWorkerClient web_client; |
778 web_client.origin = client.origin; | 789 web_client.origin = client.origin; |
779 web_client.targetURL = client.target_url; | 790 web_client.targetURL = client.target_url; |
780 web_client.clientID = client.message_port_id; | 791 web_client.clientID = client.message_port_id; |
781 proxy_->dispatchCrossOriginConnectEvent(request_id, web_client); | 792 proxy_->dispatchCrossOriginConnectEvent(request_id, web_client); |
782 } | 793 } |
783 | 794 |
784 void ServiceWorkerContextClient::OnPostMessage( | 795 void ServiceWorkerContextClient::OnClientMessageEvent( |
| 796 int request_id, |
| 797 const ServiceWorkerClientInfo& client, |
785 const base::string16& message, | 798 const base::string16& message, |
786 const std::vector<TransferredMessagePort>& sent_message_ports, | 799 const std::vector<TransferredMessagePort>& sent_message_ports, |
787 const std::vector<int>& new_routing_ids) { | 800 const std::vector<int>& new_routing_ids) { |
788 TRACE_EVENT0("ServiceWorker", | 801 TRACE_EVENT0("ServiceWorker", |
789 "ServiceWorkerContextClient::OnPostEvent"); | 802 "ServiceWorkerContextClient::OnClientMessageEvent"); |
790 blink::WebMessagePortChannelArray ports = | 803 blink::WebMessagePortChannelArray ports = |
791 WebMessagePortChannelImpl::CreatePorts( | 804 WebMessagePortChannelImpl::CreatePorts( |
792 sent_message_ports, new_routing_ids, | 805 sent_message_ports, new_routing_ids, |
793 main_thread_task_runner_); | 806 main_thread_task_runner_); |
794 | 807 |
795 // dispatchMessageEvent is expected to execute onmessage function | 808 // dispatchMessageEvent is expected to execute onmessage function |
796 // synchronously. | 809 // synchronously. |
797 base::TimeTicks before = base::TimeTicks::Now(); | 810 base::TimeTicks before = base::TimeTicks::Now(); |
798 proxy_->dispatchMessageEvent(message, ports); | 811 blink::WebServiceWorkerClientInfo web_client = |
799 UMA_HISTOGRAM_MEDIUM_TIMES( | 812 ToWebServiceWorkerClientInfo(client); |
800 "ServiceWorker.MessageEvent.Time", | 813 proxy_->dispatchMessageEvent(request_id, web_client, message, ports); |
801 base::TimeTicks::Now() - before); | 814 UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.MessageEvent.Time", |
| 815 base::TimeTicks::Now() - before); |
| 816 } |
| 817 |
| 818 void ServiceWorkerContextClient::OnWorkerMessageEvent( |
| 819 int request_id, |
| 820 const ServiceWorkerObjectInfo& worker, |
| 821 const base::string16& message, |
| 822 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 823 const std::vector<int>& new_routing_ids) { |
| 824 TRACE_EVENT0("ServiceWorker", |
| 825 "ServiceWorkerContextClient::OnWorkerMessageEvent"); |
| 826 blink::WebMessagePortChannelArray ports = |
| 827 WebMessagePortChannelImpl::CreatePorts( |
| 828 sent_message_ports, new_routing_ids, main_thread_task_runner_); |
| 829 |
| 830 // dispatchMessageEvent is expected to execute onmessage function |
| 831 // synchronously. |
| 832 base::TimeTicks before = base::TimeTicks::Now(); |
| 833 ServiceWorkerDispatcher* dispatcher = |
| 834 ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance(sender_.get()); |
| 835 blink::WebServiceWorker* service_worker = dispatcher->GetServiceWorker( |
| 836 worker, provider_context_->provider_id(), false); |
| 837 proxy_->dispatchMessageEvent(request_id, service_worker, message, ports); |
| 838 UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.MessageEvent.Time", |
| 839 base::TimeTicks::Now() - before); |
802 } | 840 } |
803 | 841 |
804 void ServiceWorkerContextClient::OnCrossOriginMessageToWorker( | 842 void ServiceWorkerContextClient::OnCrossOriginMessageToWorker( |
805 const NavigatorConnectClient& client, | 843 const NavigatorConnectClient& client, |
806 const base::string16& message, | 844 const base::string16& message, |
807 const std::vector<TransferredMessagePort>& sent_message_ports, | 845 const std::vector<TransferredMessagePort>& sent_message_ports, |
808 const std::vector<int>& new_routing_ids) { | 846 const std::vector<int>& new_routing_ids) { |
809 TRACE_EVENT0("ServiceWorker", | 847 TRACE_EVENT0("ServiceWorker", |
810 "ServiceWorkerContextClient::OnCrossOriginMessageToWorker"); | 848 "ServiceWorkerContextClient::OnCrossOriginMessageToWorker"); |
811 blink::WebMessagePortChannelArray ports = | 849 blink::WebMessagePortChannelArray ports = |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
971 } | 1009 } |
972 | 1010 |
973 base::WeakPtr<ServiceWorkerContextClient> | 1011 base::WeakPtr<ServiceWorkerContextClient> |
974 ServiceWorkerContextClient::GetWeakPtr() { | 1012 ServiceWorkerContextClient::GetWeakPtr() { |
975 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 1013 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
976 DCHECK(context_); | 1014 DCHECK(context_); |
977 return context_->weak_factory.GetWeakPtr(); | 1015 return context_->weak_factory.GetWeakPtr(); |
978 } | 1016 } |
979 | 1017 |
980 } // namespace content | 1018 } // namespace content |
OLD | NEW |