Chromium Code Reviews| Index: content/child/resource_dispatcher.cc |
| diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc |
| index 05603a5140fc99172fa9a202350b3e4f1ad38016..8cb4c6080ea2f1391df92e0ef67afd013397caae 100644 |
| --- a/content/child/resource_dispatcher.cc |
| +++ b/content/child/resource_dispatcher.cc |
| @@ -28,6 +28,7 @@ |
| #include "content/child/shared_memory_received_data_factory.h" |
| #include "content/child/site_isolation_stats_gatherer.h" |
| #include "content/child/sync_load_response.h" |
| +#include "content/child/url_response_body_consumer.h" |
| #include "content/common/inter_process_time_ticks_converter.h" |
| #include "content/common/navigation_params.h" |
| #include "content/common/resource_messages.h" |
| @@ -39,6 +40,7 @@ |
| #include "content/public/common/content_features.h" |
| #include "content/public/common/resource_response.h" |
| #include "content/public/common/resource_type.h" |
| +#include "mojo/public/cpp/bindings/binding.h" |
| #include "net/base/net_errors.h" |
| #include "net/base/request_priority.h" |
| #include "net/http/http_response_headers.h" |
| @@ -73,6 +75,44 @@ int MakeRequestID() { |
| return next_request_id++; |
| } |
| +class URLLoaderClientImpl final : public mojom::URLLoaderClient { |
| + public: |
| + URLLoaderClientImpl(int request_id, ResourceDispatcher* resource_dispatcher) |
| + : binding_(this), |
| + request_id_(request_id), |
| + resource_dispatcher_(resource_dispatcher) {} |
| + ~URLLoaderClientImpl() override { |
| + if (body_consumer_) |
| + body_consumer_->Cancel(); |
| + } |
| + |
| + void OnReceiveResponse(const ResourceResponseHead& response_head) override { |
| + resource_dispatcher_->OnMessageReceived( |
| + ResourceMsg_ReceivedResponse(request_id_, response_head)); |
| + } |
| + |
| + void OnStartLoadingResponseBody( |
| + mojo::ScopedDataPipeConsumerHandle body) override { |
| + DCHECK(!body_consumer_); |
| + body_consumer_ = new URLResponseBodyConsumer( |
| + request_id_, resource_dispatcher_, std::move(body)); |
| + } |
| + |
| + void OnComplete(const ResourceRequestCompletionStatus& status) override { |
| + body_consumer_->OnComplete(status); |
| + } |
| + |
| + mojom::URLLoaderClientPtr CreateInterfacePtrAndBind() { |
| + return binding_.CreateInterfacePtrAndBind(); |
| + } |
| + |
| + private: |
| + mojo::Binding<mojom::URLLoaderClient> binding_; |
| + scoped_refptr<URLResponseBodyConsumer> body_consumer_; |
| + const int request_id_; |
| + ResourceDispatcher* const resource_dispatcher_; |
| +}; |
| + |
| } // namespace |
| ResourceDispatcher::ResourceDispatcher( |
| @@ -542,11 +582,15 @@ void ResourceDispatcher::FlushDeferredMessages(int request_id) { |
| } |
| } |
| -void ResourceDispatcher::StartSync(const RequestInfo& request_info, |
| - ResourceRequestBody* request_body, |
| - SyncLoadResponse* response) { |
| +void ResourceDispatcher::StartSync( |
| + const RequestInfo& request_info, |
| + ResourceRequestBody* request_body, |
| + SyncLoadResponse* response, |
| + blink::WebURLRequest::LoadingIPCType ipc_type, |
| + mojom::URLLoaderFactory* url_loader_factory) { |
| std::unique_ptr<ResourceRequest> request = |
| CreateRequest(request_info, request_body, NULL); |
| + DCHECK_EQ(blink::WebURLRequest::LoadingIPCType::ChromeIPC, ipc_type); |
|
kinuko
2016/06/14 08:45:29
Add TODO to use url_loader_factory otherwise?
yhirano
2016/07/12 10:49:11
Done.
|
| SyncLoadResult result; |
| IPC::SyncMessage* msg = new ResourceHostMsg_SyncLoad( |
| @@ -573,9 +617,12 @@ void ResourceDispatcher::StartSync(const RequestInfo& request_info, |
| response->socket_address = result.socket_address; |
| } |
| -int ResourceDispatcher::StartAsync(const RequestInfo& request_info, |
| - ResourceRequestBody* request_body, |
| - std::unique_ptr<RequestPeer> peer) { |
| +int ResourceDispatcher::StartAsync( |
| + const RequestInfo& request_info, |
| + ResourceRequestBody* request_body, |
| + std::unique_ptr<RequestPeer> peer, |
| + blink::WebURLRequest::LoadingIPCType ipc_type, |
| + mojom::URLLoaderFactory* url_loader_factory) { |
| GURL frame_origin; |
| std::unique_ptr<ResourceRequest> request = |
| CreateRequest(request_info, request_body, &frame_origin); |
| @@ -593,8 +640,19 @@ int ResourceDispatcher::StartAsync(const RequestInfo& request_info, |
| base::WrapUnique(request_info.loading_web_task_runner->clone())); |
| } |
| - message_sender_->Send(new ResourceHostMsg_RequestResource( |
| - request_info.routing_id, request_id, *request)); |
| + if (ipc_type == blink::WebURLRequest::LoadingIPCType::Mojo) { |
| + std::unique_ptr<URLLoaderClientImpl> client( |
| + new URLLoaderClientImpl(request_id, this)); |
| + mojom::URLLoaderPtr url_loader; |
| + url_loader_factory->CreateLoaderAndStart( |
| + GetProxy(&url_loader), request_id, *request, |
| + client->CreateInterfacePtrAndBind()); |
| + pending_requests_[request_id]->url_loader = std::move(url_loader); |
| + pending_requests_[request_id]->url_loader_client = std::move(client); |
| + } else { |
| + message_sender_->Send(new ResourceHostMsg_RequestResource( |
| + request_info.routing_id, request_id, *request)); |
| + } |
| return request_id; |
| } |