Index: content/child/resource_dispatcher.cc |
diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc |
index 9cd701108eb0d12d4db5d16b0f26d6dc38c628a0..6408a1d4d41bb82e850960d31ab6004cb47f45e0 100644 |
--- a/content/child/resource_dispatcher.cc |
+++ b/content/child/resource_dispatcher.cc |
@@ -22,6 +22,7 @@ |
#include "base/rand_util.h" |
#include "base/strings/string_util.h" |
#include "build/build_config.h" |
+#include "content/child/body_consumer.h" |
#include "content/child/request_extra_data.h" |
#include "content/child/request_info.h" |
#include "content/child/resource_scheduling_filter.h" |
@@ -31,12 +32,14 @@ |
#include "content/common/inter_process_time_ticks_converter.h" |
#include "content/common/navigation_params.h" |
#include "content/common/resource_messages.h" |
+#include "content/common/url_loader_type_converters.h" |
#include "content/public/child/fixed_received_data.h" |
#include "content/public/child/request_peer.h" |
#include "content/public/child/resource_dispatcher_delegate.h" |
#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" |
@@ -71,6 +74,39 @@ 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(mojom::URLResponsePtr response) override { |
+ body_consumer_ = new BodyConsumer(request_id_, resource_dispatcher_, |
+ std::move(response->body)); |
+ |
+ resource_dispatcher_->OnMessageReceived(ResourceMsg_ReceivedResponse( |
+ request_id_, response->To<ResourceResponseHead>())); |
+ } |
+ void OnComplete(mojom::URLLoaderStatusPtr status) override { |
+ body_consumer_->OnComplete(std::move(status)); |
+ } |
+ |
+ mojom::URLLoaderClientPtr CreateInterfacePtrAndBind() { |
+ return binding_.CreateInterfacePtrAndBind(); |
+ } |
+ |
+ private: |
+ mojo::Binding<mojom::URLLoaderClient> binding_; |
+ scoped_refptr<BodyConsumer> body_consumer_; |
+ const int request_id_; |
+ ResourceDispatcher* const resource_dispatcher_; |
+}; |
+ |
} // namespace |
ResourceDispatcher::ResourceDispatcher( |
@@ -541,7 +577,8 @@ void ResourceDispatcher::FlushDeferredMessages(int request_id) { |
void ResourceDispatcher::StartSync(const RequestInfo& request_info, |
ResourceRequestBody* request_body, |
- SyncLoadResponse* response) { |
+ SyncLoadResponse* response, |
+ mojom::URLLoaderPtr url_loader) { |
std::unique_ptr<ResourceHostMsg_Request> request = |
CreateRequest(request_info, request_body, NULL); |
@@ -572,7 +609,8 @@ void ResourceDispatcher::StartSync(const RequestInfo& request_info, |
int ResourceDispatcher::StartAsync(const RequestInfo& request_info, |
ResourceRequestBody* request_body, |
- std::unique_ptr<RequestPeer> peer) { |
+ std::unique_ptr<RequestPeer> peer, |
+ mojom::URLLoaderPtr url_loader) { |
GURL frame_origin; |
std::unique_ptr<ResourceHostMsg_Request> request = |
CreateRequest(request_info, request_body, &frame_origin); |
@@ -590,8 +628,20 @@ 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 (url_loader) { |
+ mojom::URLRequestPtr mojo_request = mojom::URLRequest::From(*request); |
+ std::unique_ptr<URLLoaderClientImpl> client( |
+ new URLLoaderClientImpl(request_id, this)); |
+ mojo_request->request_id = request_id; |
+ mojo_request->routing_id = request_info.routing_id; |
+ url_loader->Load(std::move(mojo_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; |
} |