| 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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 class WebServiceWorkerNetworkProviderImpl | 90 class WebServiceWorkerNetworkProviderImpl |
| 91 : public blink::WebServiceWorkerNetworkProvider { | 91 : public blink::WebServiceWorkerNetworkProvider { |
| 92 public: | 92 public: |
| 93 // Blink calls this method for each request starting with the main script, | 93 // Blink calls this method for each request starting with the main script, |
| 94 // we tag them with the provider id. | 94 // we tag them with the provider id. |
| 95 void willSendRequest(blink::WebDataSource* data_source, | 95 void willSendRequest(blink::WebDataSource* data_source, |
| 96 blink::WebURLRequest& request) override { | 96 blink::WebURLRequest& request) override { |
| 97 ServiceWorkerNetworkProvider* provider = | 97 ServiceWorkerNetworkProvider* provider = |
| 98 ServiceWorkerNetworkProvider::FromDocumentState( | 98 ServiceWorkerNetworkProvider::FromDocumentState( |
| 99 static_cast<DataSourceExtraData*>(data_source->getExtraData())); | 99 static_cast<DataSourceExtraData*>(data_source->getExtraData())); |
| 100 scoped_ptr<RequestExtraData> extra_data(new RequestExtraData); | 100 std::unique_ptr<RequestExtraData> extra_data(new RequestExtraData); |
| 101 extra_data->set_service_worker_provider_id(provider->provider_id()); | 101 extra_data->set_service_worker_provider_id(provider->provider_id()); |
| 102 extra_data->set_originated_from_service_worker(true); | 102 extra_data->set_originated_from_service_worker(true); |
| 103 request.setExtraData(extra_data.release()); | 103 request.setExtraData(extra_data.release()); |
| 104 } | 104 } |
| 105 }; | 105 }; |
| 106 | 106 |
| 107 void SendPostMessageToClientOnMainThread( | 107 void SendPostMessageToClientOnMainThread( |
| 108 ThreadSafeSender* sender, | 108 ThreadSafeSender* sender, |
| 109 int routing_id, | 109 int routing_id, |
| 110 const std::string& uuid, | 110 const std::string& uuid, |
| 111 const base::string16& message, | 111 const base::string16& message, |
| 112 scoped_ptr<blink::WebMessagePortChannelArray> channels) { | 112 std::unique_ptr<blink::WebMessagePortChannelArray> channels) { |
| 113 sender->Send(new ServiceWorkerHostMsg_PostMessageToClient( | 113 sender->Send(new ServiceWorkerHostMsg_PostMessageToClient( |
| 114 routing_id, uuid, message, | 114 routing_id, uuid, message, |
| 115 WebMessagePortChannelImpl::ExtractMessagePortIDs(std::move(channels)))); | 115 WebMessagePortChannelImpl::ExtractMessagePortIDs(std::move(channels)))); |
| 116 } | 116 } |
| 117 | 117 |
| 118 blink::WebURLRequest::FetchRequestMode GetBlinkFetchRequestMode( | 118 blink::WebURLRequest::FetchRequestMode GetBlinkFetchRequestMode( |
| 119 FetchRequestMode mode) { | 119 FetchRequestMode mode) { |
| 120 return static_cast<blink::WebURLRequest::FetchRequestMode>(mode); | 120 return static_cast<blink::WebURLRequest::FetchRequestMode>(mode); |
| 121 } | 121 } |
| 122 | 122 |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 context_->sync_event_callbacks.Remove(request_id); | 560 context_->sync_event_callbacks.Remove(request_id); |
| 561 } | 561 } |
| 562 | 562 |
| 563 blink::WebServiceWorkerNetworkProvider* | 563 blink::WebServiceWorkerNetworkProvider* |
| 564 ServiceWorkerContextClient::createServiceWorkerNetworkProvider( | 564 ServiceWorkerContextClient::createServiceWorkerNetworkProvider( |
| 565 blink::WebDataSource* data_source) { | 565 blink::WebDataSource* data_source) { |
| 566 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); | 566 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); |
| 567 | 567 |
| 568 // Create a content::ServiceWorkerNetworkProvider for this data source so | 568 // Create a content::ServiceWorkerNetworkProvider for this data source so |
| 569 // we can observe its requests. | 569 // we can observe its requests. |
| 570 scoped_ptr<ServiceWorkerNetworkProvider> provider( | 570 std::unique_ptr<ServiceWorkerNetworkProvider> provider( |
| 571 new ServiceWorkerNetworkProvider( | 571 new ServiceWorkerNetworkProvider(MSG_ROUTING_NONE, |
| 572 MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_CONTROLLER)); | 572 SERVICE_WORKER_PROVIDER_FOR_CONTROLLER)); |
| 573 provider_context_ = provider->context(); | 573 provider_context_ = provider->context(); |
| 574 | 574 |
| 575 // Tell the network provider about which version to load. | 575 // Tell the network provider about which version to load. |
| 576 provider->SetServiceWorkerVersionId(service_worker_version_id_); | 576 provider->SetServiceWorkerVersionId(service_worker_version_id_); |
| 577 | 577 |
| 578 // The provider is kept around for the lifetime of the DataSource | 578 // The provider is kept around for the lifetime of the DataSource |
| 579 // and ownership is transferred to the DataSource. | 579 // and ownership is transferred to the DataSource. |
| 580 DataSourceExtraData* extra_data = new DataSourceExtraData(); | 580 DataSourceExtraData* extra_data = new DataSourceExtraData(); |
| 581 data_source->setExtraData(extra_data); | 581 data_source->setExtraData(extra_data); |
| 582 ServiceWorkerNetworkProvider::AttachToDocumentState(extra_data, | 582 ServiceWorkerNetworkProvider::AttachToDocumentState(extra_data, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 597 } | 597 } |
| 598 | 598 |
| 599 void ServiceWorkerContextClient::postMessageToClient( | 599 void ServiceWorkerContextClient::postMessageToClient( |
| 600 const blink::WebString& uuid, | 600 const blink::WebString& uuid, |
| 601 const blink::WebString& message, | 601 const blink::WebString& message, |
| 602 blink::WebMessagePortChannelArray* channels) { | 602 blink::WebMessagePortChannelArray* channels) { |
| 603 // This may send channels for MessagePorts, and all internal book-keeping | 603 // This may send channels for MessagePorts, and all internal book-keeping |
| 604 // messages for MessagePort (e.g. QueueMessages) are sent from main thread | 604 // messages for MessagePort (e.g. QueueMessages) are sent from main thread |
| 605 // (with thread hopping), so we need to do the same thread hopping here not | 605 // (with thread hopping), so we need to do the same thread hopping here not |
| 606 // to overtake those messages. | 606 // to overtake those messages. |
| 607 scoped_ptr<blink::WebMessagePortChannelArray> channel_array(channels); | 607 std::unique_ptr<blink::WebMessagePortChannelArray> channel_array(channels); |
| 608 main_thread_task_runner_->PostTask( | 608 main_thread_task_runner_->PostTask( |
| 609 FROM_HERE, base::Bind(&SendPostMessageToClientOnMainThread, | 609 FROM_HERE, base::Bind(&SendPostMessageToClientOnMainThread, |
| 610 base::RetainedRef(sender_), GetRoutingID(), | 610 base::RetainedRef(sender_), GetRoutingID(), |
| 611 base::UTF16ToUTF8(base::StringPiece16(uuid)), | 611 base::UTF16ToUTF8(base::StringPiece16(uuid)), |
| 612 static_cast<base::string16>(message), | 612 static_cast<base::string16>(message), |
| 613 base::Passed(&channel_array))); | 613 base::Passed(&channel_array))); |
| 614 } | 614 } |
| 615 | 615 |
| 616 void ServiceWorkerContextClient::postMessageToCrossOriginClient( | 616 void ServiceWorkerContextClient::postMessageToCrossOriginClient( |
| 617 const blink::WebCrossOriginServiceWorkerClient&, | 617 const blink::WebCrossOriginServiceWorkerClient&, |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 724 main_thread_task_runner_); | 724 main_thread_task_runner_); |
| 725 if (params.source.client_info.IsValid()) { | 725 if (params.source.client_info.IsValid()) { |
| 726 blink::WebServiceWorkerClientInfo web_client = | 726 blink::WebServiceWorkerClientInfo web_client = |
| 727 ToWebServiceWorkerClientInfo(params.source.client_info); | 727 ToWebServiceWorkerClientInfo(params.source.client_info); |
| 728 proxy_->dispatchExtendableMessageEvent( | 728 proxy_->dispatchExtendableMessageEvent( |
| 729 request_id, params.message, params.source_origin, ports, web_client); | 729 request_id, params.message, params.source_origin, ports, web_client); |
| 730 return; | 730 return; |
| 731 } | 731 } |
| 732 | 732 |
| 733 DCHECK(params.source.service_worker_info.IsValid()); | 733 DCHECK(params.source.service_worker_info.IsValid()); |
| 734 scoped_ptr<ServiceWorkerHandleReference> handle = | 734 std::unique_ptr<ServiceWorkerHandleReference> handle = |
| 735 ServiceWorkerHandleReference::Adopt(params.source.service_worker_info, | 735 ServiceWorkerHandleReference::Adopt(params.source.service_worker_info, |
| 736 sender_.get()); | 736 sender_.get()); |
| 737 ServiceWorkerDispatcher* dispatcher = | 737 ServiceWorkerDispatcher* dispatcher = |
| 738 ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance( | 738 ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance( |
| 739 sender_.get(), main_thread_task_runner_.get()); | 739 sender_.get(), main_thread_task_runner_.get()); |
| 740 scoped_refptr<WebServiceWorkerImpl> worker = | 740 scoped_refptr<WebServiceWorkerImpl> worker = |
| 741 dispatcher->GetOrCreateServiceWorker(std::move(handle)); | 741 dispatcher->GetOrCreateServiceWorker(std::move(handle)); |
| 742 proxy_->dispatchExtendableMessageEvent( | 742 proxy_->dispatchExtendableMessageEvent( |
| 743 request_id, params.message, params.source_origin, ports, | 743 request_id, params.message, params.source_origin, ports, |
| 744 WebServiceWorkerImpl::CreateHandle(worker)); | 744 WebServiceWorkerImpl::CreateHandle(worker)); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 860 void ServiceWorkerContextClient::OnDidGetClient( | 860 void ServiceWorkerContextClient::OnDidGetClient( |
| 861 int request_id, | 861 int request_id, |
| 862 const ServiceWorkerClientInfo& client) { | 862 const ServiceWorkerClientInfo& client) { |
| 863 TRACE_EVENT0("ServiceWorker", "ServiceWorkerContextClient::OnDidGetClient"); | 863 TRACE_EVENT0("ServiceWorker", "ServiceWorkerContextClient::OnDidGetClient"); |
| 864 blink::WebServiceWorkerClientCallbacks* callbacks = | 864 blink::WebServiceWorkerClientCallbacks* callbacks = |
| 865 context_->client_callbacks.Lookup(request_id); | 865 context_->client_callbacks.Lookup(request_id); |
| 866 if (!callbacks) { | 866 if (!callbacks) { |
| 867 NOTREACHED() << "Got stray response: " << request_id; | 867 NOTREACHED() << "Got stray response: " << request_id; |
| 868 return; | 868 return; |
| 869 } | 869 } |
| 870 scoped_ptr<blink::WebServiceWorkerClientInfo> web_client; | 870 std::unique_ptr<blink::WebServiceWorkerClientInfo> web_client; |
| 871 if (!client.IsEmpty()) { | 871 if (!client.IsEmpty()) { |
| 872 DCHECK(client.IsValid()); | 872 DCHECK(client.IsValid()); |
| 873 web_client.reset(new blink::WebServiceWorkerClientInfo( | 873 web_client.reset(new blink::WebServiceWorkerClientInfo( |
| 874 ToWebServiceWorkerClientInfo(client))); | 874 ToWebServiceWorkerClientInfo(client))); |
| 875 } | 875 } |
| 876 callbacks->onSuccess(std::move(web_client)); | 876 callbacks->onSuccess(std::move(web_client)); |
| 877 context_->client_callbacks.Remove(request_id); | 877 context_->client_callbacks.Remove(request_id); |
| 878 } | 878 } |
| 879 | 879 |
| 880 void ServiceWorkerContextClient::OnDidGetClients( | 880 void ServiceWorkerContextClient::OnDidGetClients( |
| (...skipping 20 matching lines...) Expand all Loading... |
| 901 int request_id, | 901 int request_id, |
| 902 const ServiceWorkerClientInfo& client) { | 902 const ServiceWorkerClientInfo& client) { |
| 903 TRACE_EVENT0("ServiceWorker", | 903 TRACE_EVENT0("ServiceWorker", |
| 904 "ServiceWorkerContextClient::OnOpenWindowResponse"); | 904 "ServiceWorkerContextClient::OnOpenWindowResponse"); |
| 905 blink::WebServiceWorkerClientCallbacks* callbacks = | 905 blink::WebServiceWorkerClientCallbacks* callbacks = |
| 906 context_->client_callbacks.Lookup(request_id); | 906 context_->client_callbacks.Lookup(request_id); |
| 907 if (!callbacks) { | 907 if (!callbacks) { |
| 908 NOTREACHED() << "Got stray response: " << request_id; | 908 NOTREACHED() << "Got stray response: " << request_id; |
| 909 return; | 909 return; |
| 910 } | 910 } |
| 911 scoped_ptr<blink::WebServiceWorkerClientInfo> web_client; | 911 std::unique_ptr<blink::WebServiceWorkerClientInfo> web_client; |
| 912 if (!client.IsEmpty()) { | 912 if (!client.IsEmpty()) { |
| 913 DCHECK(client.IsValid()); | 913 DCHECK(client.IsValid()); |
| 914 web_client.reset(new blink::WebServiceWorkerClientInfo( | 914 web_client.reset(new blink::WebServiceWorkerClientInfo( |
| 915 ToWebServiceWorkerClientInfo(client))); | 915 ToWebServiceWorkerClientInfo(client))); |
| 916 } | 916 } |
| 917 callbacks->onSuccess(std::move(web_client)); | 917 callbacks->onSuccess(std::move(web_client)); |
| 918 context_->client_callbacks.Remove(request_id); | 918 context_->client_callbacks.Remove(request_id); |
| 919 } | 919 } |
| 920 | 920 |
| 921 void ServiceWorkerContextClient::OnOpenWindowError( | 921 void ServiceWorkerContextClient::OnOpenWindowError( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 940 TRACE_EVENT0("ServiceWorker", | 940 TRACE_EVENT0("ServiceWorker", |
| 941 "ServiceWorkerContextClient::OnFocusClientResponse"); | 941 "ServiceWorkerContextClient::OnFocusClientResponse"); |
| 942 blink::WebServiceWorkerClientCallbacks* callback = | 942 blink::WebServiceWorkerClientCallbacks* callback = |
| 943 context_->client_callbacks.Lookup(request_id); | 943 context_->client_callbacks.Lookup(request_id); |
| 944 if (!callback) { | 944 if (!callback) { |
| 945 NOTREACHED() << "Got stray response: " << request_id; | 945 NOTREACHED() << "Got stray response: " << request_id; |
| 946 return; | 946 return; |
| 947 } | 947 } |
| 948 if (!client.IsEmpty()) { | 948 if (!client.IsEmpty()) { |
| 949 DCHECK(client.IsValid()); | 949 DCHECK(client.IsValid()); |
| 950 scoped_ptr<blink::WebServiceWorkerClientInfo> web_client ( | 950 std::unique_ptr<blink::WebServiceWorkerClientInfo> web_client( |
| 951 new blink::WebServiceWorkerClientInfo( | 951 new blink::WebServiceWorkerClientInfo( |
| 952 ToWebServiceWorkerClientInfo(client))); | 952 ToWebServiceWorkerClientInfo(client))); |
| 953 callback->onSuccess(std::move(web_client)); | 953 callback->onSuccess(std::move(web_client)); |
| 954 } else { | 954 } else { |
| 955 callback->onError(blink::WebServiceWorkerError( | 955 callback->onError(blink::WebServiceWorkerError( |
| 956 blink::WebServiceWorkerError::ErrorTypeNotFound, | 956 blink::WebServiceWorkerError::ErrorTypeNotFound, |
| 957 "The WindowClient was not found.")); | 957 "The WindowClient was not found.")); |
| 958 } | 958 } |
| 959 | 959 |
| 960 context_->client_callbacks.Remove(request_id); | 960 context_->client_callbacks.Remove(request_id); |
| 961 } | 961 } |
| 962 | 962 |
| 963 void ServiceWorkerContextClient::OnNavigateClientResponse( | 963 void ServiceWorkerContextClient::OnNavigateClientResponse( |
| 964 int request_id, | 964 int request_id, |
| 965 const ServiceWorkerClientInfo& client) { | 965 const ServiceWorkerClientInfo& client) { |
| 966 TRACE_EVENT0("ServiceWorker", | 966 TRACE_EVENT0("ServiceWorker", |
| 967 "ServiceWorkerContextClient::OnNavigateClientResponse"); | 967 "ServiceWorkerContextClient::OnNavigateClientResponse"); |
| 968 blink::WebServiceWorkerClientCallbacks* callbacks = | 968 blink::WebServiceWorkerClientCallbacks* callbacks = |
| 969 context_->client_callbacks.Lookup(request_id); | 969 context_->client_callbacks.Lookup(request_id); |
| 970 if (!callbacks) { | 970 if (!callbacks) { |
| 971 NOTREACHED() << "Got stray response: " << request_id; | 971 NOTREACHED() << "Got stray response: " << request_id; |
| 972 return; | 972 return; |
| 973 } | 973 } |
| 974 scoped_ptr<blink::WebServiceWorkerClientInfo> web_client; | 974 std::unique_ptr<blink::WebServiceWorkerClientInfo> web_client; |
| 975 if (!client.IsEmpty()) { | 975 if (!client.IsEmpty()) { |
| 976 DCHECK(client.IsValid()); | 976 DCHECK(client.IsValid()); |
| 977 web_client.reset(new blink::WebServiceWorkerClientInfo( | 977 web_client.reset(new blink::WebServiceWorkerClientInfo( |
| 978 ToWebServiceWorkerClientInfo(client))); | 978 ToWebServiceWorkerClientInfo(client))); |
| 979 } | 979 } |
| 980 callbacks->onSuccess(std::move(web_client)); | 980 callbacks->onSuccess(std::move(web_client)); |
| 981 context_->client_callbacks.Remove(request_id); | 981 context_->client_callbacks.Remove(request_id); |
| 982 } | 982 } |
| 983 | 983 |
| 984 void ServiceWorkerContextClient::OnNavigateClientError(int request_id, | 984 void ServiceWorkerContextClient::OnNavigateClientError(int request_id, |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1045 } | 1045 } |
| 1046 | 1046 |
| 1047 base::WeakPtr<ServiceWorkerContextClient> | 1047 base::WeakPtr<ServiceWorkerContextClient> |
| 1048 ServiceWorkerContextClient::GetWeakPtr() { | 1048 ServiceWorkerContextClient::GetWeakPtr() { |
| 1049 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 1049 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
| 1050 DCHECK(context_); | 1050 DCHECK(context_); |
| 1051 return context_->weak_factory.GetWeakPtr(); | 1051 return context_->weak_factory.GetWeakPtr(); |
| 1052 } | 1052 } |
| 1053 | 1053 |
| 1054 } // namespace content | 1054 } // namespace content |
| OLD | NEW |