| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/browser/service_worker/service_worker_dispatcher_host.h" | 5 #include "content/browser/service_worker/service_worker_dispatcher_host.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 673 bad_message::ReceivedBadMessage( | 673 bad_message::ReceivedBadMessage( |
| 674 this, bad_message::SWDH_GET_REGISTRATION_FOR_READY_ALREADY_IN_PROGRESS); | 674 this, bad_message::SWDH_GET_REGISTRATION_FOR_READY_ALREADY_IN_PROGRESS); |
| 675 } | 675 } |
| 676 } | 676 } |
| 677 | 677 |
| 678 void ServiceWorkerDispatcherHost::OnPostMessageToWorker( | 678 void ServiceWorkerDispatcherHost::OnPostMessageToWorker( |
| 679 int handle_id, | 679 int handle_id, |
| 680 int provider_id, | 680 int provider_id, |
| 681 const base::string16& message, | 681 const base::string16& message, |
| 682 const url::Origin& source_origin, | 682 const url::Origin& source_origin, |
| 683 const std::vector<TransferredMessagePort>& sent_message_ports) { | 683 const std::vector<int>& sent_message_ports) { |
| 684 TRACE_EVENT0("ServiceWorker", | 684 TRACE_EVENT0("ServiceWorker", |
| 685 "ServiceWorkerDispatcherHost::OnPostMessageToWorker"); | 685 "ServiceWorkerDispatcherHost::OnPostMessageToWorker"); |
| 686 if (!GetContext()) | 686 if (!GetContext()) |
| 687 return; | 687 return; |
| 688 | 688 |
| 689 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); | 689 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); |
| 690 if (!handle) { | 690 if (!handle) { |
| 691 bad_message::ReceivedBadMessage(this, bad_message::SWDH_POST_MESSAGE); | 691 bad_message::ReceivedBadMessage(this, bad_message::SWDH_POST_MESSAGE); |
| 692 return; | 692 return; |
| 693 } | 693 } |
| 694 | 694 |
| 695 ServiceWorkerProviderHost* sender_provider_host = | 695 ServiceWorkerProviderHost* sender_provider_host = |
| 696 GetContext()->GetProviderHost(render_process_id_, provider_id); | 696 GetContext()->GetProviderHost(render_process_id_, provider_id); |
| 697 if (!sender_provider_host) { | 697 if (!sender_provider_host) { |
| 698 bad_message::ReceivedBadMessage(this, bad_message::SWDH_POST_MESSAGE); | 698 bad_message::ReceivedBadMessage(this, bad_message::SWDH_POST_MESSAGE); |
| 699 return; | 699 return; |
| 700 } | 700 } |
| 701 | 701 |
| 702 DispatchExtendableMessageEvent( | 702 DispatchExtendableMessageEvent( |
| 703 make_scoped_refptr(handle->version()), message, source_origin, | 703 make_scoped_refptr(handle->version()), message, source_origin, |
| 704 sent_message_ports, sender_provider_host, | 704 sent_message_ports, sender_provider_host, |
| 705 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 705 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 706 } | 706 } |
| 707 | 707 |
| 708 void ServiceWorkerDispatcherHost::DispatchExtendableMessageEvent( | 708 void ServiceWorkerDispatcherHost::DispatchExtendableMessageEvent( |
| 709 scoped_refptr<ServiceWorkerVersion> worker, | 709 scoped_refptr<ServiceWorkerVersion> worker, |
| 710 const base::string16& message, | 710 const base::string16& message, |
| 711 const url::Origin& source_origin, | 711 const url::Origin& source_origin, |
| 712 const std::vector<TransferredMessagePort>& sent_message_ports, | 712 const std::vector<int>& sent_message_ports, |
| 713 ServiceWorkerProviderHost* sender_provider_host, | 713 ServiceWorkerProviderHost* sender_provider_host, |
| 714 const StatusCallback& callback) { | 714 const StatusCallback& callback) { |
| 715 for (const TransferredMessagePort& port : sent_message_ports) | 715 for (int port : sent_message_ports) |
| 716 MessagePortService::GetInstance()->HoldMessages(port.id); | 716 MessagePortService::GetInstance()->HoldMessages(port); |
| 717 | 717 |
| 718 switch (sender_provider_host->provider_type()) { | 718 switch (sender_provider_host->provider_type()) { |
| 719 case SERVICE_WORKER_PROVIDER_FOR_WINDOW: | 719 case SERVICE_WORKER_PROVIDER_FOR_WINDOW: |
| 720 case SERVICE_WORKER_PROVIDER_FOR_WORKER: | 720 case SERVICE_WORKER_PROVIDER_FOR_WORKER: |
| 721 case SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER: | 721 case SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER: |
| 722 service_worker_client_utils::GetClient( | 722 service_worker_client_utils::GetClient( |
| 723 sender_provider_host, | 723 sender_provider_host, |
| 724 base::Bind(&ServiceWorkerDispatcherHost:: | 724 base::Bind(&ServiceWorkerDispatcherHost:: |
| 725 DispatchExtendableMessageEventInternal< | 725 DispatchExtendableMessageEventInternal< |
| 726 ServiceWorkerClientInfo>, | 726 ServiceWorkerClientInfo>, |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 855 | 855 |
| 856 Send(new ServiceWorkerMsg_AssociateRegistration(kDocumentMainThreadId, | 856 Send(new ServiceWorkerMsg_AssociateRegistration(kDocumentMainThreadId, |
| 857 provider_id, info, attrs)); | 857 provider_id, info, attrs)); |
| 858 } | 858 } |
| 859 | 859 |
| 860 template <typename SourceInfo> | 860 template <typename SourceInfo> |
| 861 void ServiceWorkerDispatcherHost::DispatchExtendableMessageEventInternal( | 861 void ServiceWorkerDispatcherHost::DispatchExtendableMessageEventInternal( |
| 862 scoped_refptr<ServiceWorkerVersion> worker, | 862 scoped_refptr<ServiceWorkerVersion> worker, |
| 863 const base::string16& message, | 863 const base::string16& message, |
| 864 const url::Origin& source_origin, | 864 const url::Origin& source_origin, |
| 865 const std::vector<TransferredMessagePort>& sent_message_ports, | 865 const std::vector<int>& sent_message_ports, |
| 866 const StatusCallback& callback, | 866 const StatusCallback& callback, |
| 867 const SourceInfo& source_info) { | 867 const SourceInfo& source_info) { |
| 868 if (!source_info.IsValid()) { | 868 if (!source_info.IsValid()) { |
| 869 DidFailToDispatchExtendableMessageEvent<SourceInfo>( | 869 DidFailToDispatchExtendableMessageEvent<SourceInfo>( |
| 870 sent_message_ports, source_info, callback, SERVICE_WORKER_ERROR_FAILED); | 870 sent_message_ports, source_info, callback, SERVICE_WORKER_ERROR_FAILED); |
| 871 return; | 871 return; |
| 872 } | 872 } |
| 873 worker->RunAfterStartWorker( | 873 worker->RunAfterStartWorker( |
| 874 ServiceWorkerMetrics::EventType::MESSAGE, | 874 ServiceWorkerMetrics::EventType::MESSAGE, |
| 875 base::Bind(&ServiceWorkerDispatcherHost:: | 875 base::Bind(&ServiceWorkerDispatcherHost:: |
| 876 DispatchExtendableMessageEventAfterStartWorker, | 876 DispatchExtendableMessageEventAfterStartWorker, |
| 877 this, worker, message, source_origin, sent_message_ports, | 877 this, worker, message, source_origin, sent_message_ports, |
| 878 ExtendableMessageEventSource(source_info), callback), | 878 ExtendableMessageEventSource(source_info), callback), |
| 879 base::Bind( | 879 base::Bind( |
| 880 &ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent< | 880 &ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent< |
| 881 SourceInfo>, | 881 SourceInfo>, |
| 882 this, sent_message_ports, source_info, callback)); | 882 this, sent_message_ports, source_info, callback)); |
| 883 } | 883 } |
| 884 | 884 |
| 885 void ServiceWorkerDispatcherHost:: | 885 void ServiceWorkerDispatcherHost:: |
| 886 DispatchExtendableMessageEventAfterStartWorker( | 886 DispatchExtendableMessageEventAfterStartWorker( |
| 887 scoped_refptr<ServiceWorkerVersion> worker, | 887 scoped_refptr<ServiceWorkerVersion> worker, |
| 888 const base::string16& message, | 888 const base::string16& message, |
| 889 const url::Origin& source_origin, | 889 const url::Origin& source_origin, |
| 890 const std::vector<TransferredMessagePort>& sent_message_ports, | 890 const std::vector<int>& sent_message_ports, |
| 891 const ExtendableMessageEventSource& source, | 891 const ExtendableMessageEventSource& source, |
| 892 const StatusCallback& callback) { | 892 const StatusCallback& callback) { |
| 893 int request_id = | 893 int request_id = |
| 894 worker->StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); | 894 worker->StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); |
| 895 | 895 |
| 896 MessagePortMessageFilter* filter = | 896 MessagePortMessageFilter* filter = |
| 897 worker->embedded_worker()->message_port_message_filter(); | 897 worker->embedded_worker()->message_port_message_filter(); |
| 898 std::vector<int> new_routing_ids; | 898 std::vector<int> new_routing_ids; |
| 899 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); | 899 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
| 900 | 900 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 913 params.source.service_worker_info.url = GURL(); | 913 params.source.service_worker_info.url = GURL(); |
| 914 } | 914 } |
| 915 | 915 |
| 916 worker->DispatchSimpleEvent< | 916 worker->DispatchSimpleEvent< |
| 917 ServiceWorkerHostMsg_ExtendableMessageEventFinished>( | 917 ServiceWorkerHostMsg_ExtendableMessageEventFinished>( |
| 918 request_id, ServiceWorkerMsg_ExtendableMessageEvent(request_id, params)); | 918 request_id, ServiceWorkerMsg_ExtendableMessageEvent(request_id, params)); |
| 919 } | 919 } |
| 920 | 920 |
| 921 template <typename SourceInfo> | 921 template <typename SourceInfo> |
| 922 void ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent( | 922 void ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent( |
| 923 const std::vector<TransferredMessagePort>& sent_message_ports, | 923 const std::vector<int>& sent_message_ports, |
| 924 const SourceInfo& source_info, | 924 const SourceInfo& source_info, |
| 925 const StatusCallback& callback, | 925 const StatusCallback& callback, |
| 926 ServiceWorkerStatusCode status) { | 926 ServiceWorkerStatusCode status) { |
| 927 // Transfering the message ports failed, so destroy the ports. | 927 // Transfering the message ports failed, so destroy the ports. |
| 928 for (const TransferredMessagePort& port : sent_message_ports) | 928 for (int port : sent_message_ports) |
| 929 MessagePortService::GetInstance()->ClosePort(port.id); | 929 MessagePortService::GetInstance()->ClosePort(port); |
| 930 if (source_info.IsValid()) | 930 if (source_info.IsValid()) |
| 931 ReleaseSourceInfo(source_info); | 931 ReleaseSourceInfo(source_info); |
| 932 callback.Run(status); | 932 callback.Run(status); |
| 933 } | 933 } |
| 934 | 934 |
| 935 void ServiceWorkerDispatcherHost::ReleaseSourceInfo( | 935 void ServiceWorkerDispatcherHost::ReleaseSourceInfo( |
| 936 const ServiceWorkerClientInfo& source_info) { | 936 const ServiceWorkerClientInfo& source_info) { |
| 937 // ServiceWorkerClientInfo is just a snapshot of the client. There is no need | 937 // ServiceWorkerClientInfo is just a snapshot of the client. There is no need |
| 938 // to do anything for it. | 938 // to do anything for it. |
| 939 } | 939 } |
| (...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1405 if (!handle) { | 1405 if (!handle) { |
| 1406 bad_message::ReceivedBadMessage(this, | 1406 bad_message::ReceivedBadMessage(this, |
| 1407 bad_message::SWDH_TERMINATE_BAD_HANDLE); | 1407 bad_message::SWDH_TERMINATE_BAD_HANDLE); |
| 1408 return; | 1408 return; |
| 1409 } | 1409 } |
| 1410 handle->version()->StopWorker( | 1410 handle->version()->StopWorker( |
| 1411 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1411 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 1412 } | 1412 } |
| 1413 | 1413 |
| 1414 } // namespace content | 1414 } // namespace content |
| OLD | NEW |