| Index: content/browser/loader/resource_dispatcher_host_impl.cc
|
| diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc
|
| index 36467596b36b6198338c074525fab35258df3af9..f4ae9b56475e71fe8d99865b0c280e63ef639781 100644
|
| --- a/content/browser/loader/resource_dispatcher_host_impl.cc
|
| +++ b/content/browser/loader/resource_dispatcher_host_impl.cc
|
| @@ -51,6 +51,7 @@
|
| #include "content/browser/loader/detachable_resource_handler.h"
|
| #include "content/browser/loader/loader_delegate.h"
|
| #include "content/browser/loader/mime_type_resource_handler.h"
|
| +#include "content/browser/loader/mojo_async_resource_handler.h"
|
| #include "content/browser/loader/navigation_resource_handler.h"
|
| #include "content/browser/loader/navigation_resource_throttle.h"
|
| #include "content/browser/loader/navigation_url_loader_impl_core.h"
|
| @@ -224,7 +225,8 @@ bool IsDetachableResourceType(ResourceType type) {
|
| // Aborts a request before an URLRequest has actually been created.
|
| void AbortRequestBeforeItStarts(ResourceMessageFilter* filter,
|
| IPC::Message* sync_result,
|
| - int request_id) {
|
| + int request_id,
|
| + mojom::URLLoaderClientPtr url_loader_client) {
|
| if (sync_result) {
|
| SyncLoadResult result;
|
| result.error_code = net::ERR_ABORTED;
|
| @@ -239,8 +241,12 @@ void AbortRequestBeforeItStarts(ResourceMessageFilter* filter,
|
| // No security info needed, connection not established.
|
| request_complete_data.completion_time = base::TimeTicks();
|
| request_complete_data.encoded_data_length = 0;
|
| - filter->Send(new ResourceMsg_RequestComplete(
|
| - request_id, request_complete_data));
|
| + if (url_loader_client) {
|
| + url_loader_client->OnComplete(request_complete_data);
|
| + } else {
|
| + filter->Send(
|
| + new ResourceMsg_RequestComplete(request_id, request_complete_data));
|
| + }
|
| }
|
| }
|
|
|
| @@ -475,6 +481,7 @@ ResourceDispatcherHostImpl::ResourceDispatcherHostImpl()
|
| ResourceDispatcherHostImpl::~ResourceDispatcherHostImpl() {
|
| DCHECK(outstanding_requests_stats_map_.empty());
|
| DCHECK(g_resource_dispatcher_host);
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| g_resource_dispatcher_host = NULL;
|
| }
|
|
|
| @@ -1057,6 +1064,7 @@ void ResourceDispatcherHostImpl::OnShutdown() {
|
| bool ResourceDispatcherHostImpl::OnMessageReceived(
|
| const IPC::Message& message,
|
| ResourceMessageFilter* filter) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| filter_ = filter;
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(ResourceDispatcherHostImpl, message)
|
| @@ -1098,6 +1106,16 @@ void ResourceDispatcherHostImpl::OnRequestResource(
|
| int routing_id,
|
| int request_id,
|
| const ResourceRequest& request_data) {
|
| + OnRequestResourceInternal(routing_id, request_id, request_data, nullptr,
|
| + nullptr);
|
| +}
|
| +
|
| +void ResourceDispatcherHostImpl::OnRequestResourceInternal(
|
| + int routing_id,
|
| + int request_id,
|
| + const ResourceRequest& request_data,
|
| + mojo::InterfaceRequest<mojom::URLLoader> mojo_request,
|
| + mojom::URLLoaderClientPtr url_loader_client) {
|
| // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed.
|
| tracked_objects::ScopedTracker tracking_profile(
|
| FROM_HERE_WITH_EXPLICIT_FUNCTION(
|
| @@ -1118,7 +1136,8 @@ void ResourceDispatcherHostImpl::OnRequestResource(
|
| request_data.render_frame_id,
|
| request_data.url));
|
| }
|
| - BeginRequest(request_id, request_data, NULL, routing_id);
|
| + BeginRequest(request_id, request_data, NULL, routing_id,
|
| + std::move(mojo_request), std::move(url_loader_client));
|
| }
|
|
|
| // Begins a resource request with the given params on behalf of the specified
|
| @@ -1132,8 +1151,8 @@ void ResourceDispatcherHostImpl::OnRequestResource(
|
| void ResourceDispatcherHostImpl::OnSyncLoad(int request_id,
|
| const ResourceRequest& request_data,
|
| IPC::Message* sync_result) {
|
| - BeginRequest(request_id, request_data, sync_result,
|
| - sync_result->routing_id());
|
| + BeginRequest(request_id, request_data, sync_result, sync_result->routing_id(),
|
| + nullptr, nullptr);
|
| }
|
|
|
| bool ResourceDispatcherHostImpl::IsRequestIDInUse(
|
| @@ -1248,7 +1267,9 @@ void ResourceDispatcherHostImpl::BeginRequest(
|
| int request_id,
|
| const ResourceRequest& request_data,
|
| IPC::Message* sync_result, // only valid for sync
|
| - int route_id) {
|
| + int route_id,
|
| + mojo::InterfaceRequest<mojom::URLLoader> mojo_request,
|
| + mojom::URLLoaderClientPtr url_loader_client) {
|
| int process_type = filter_->process_type();
|
| int child_id = filter_->child_id();
|
|
|
| @@ -1288,6 +1309,9 @@ void ResourceDispatcherHostImpl::BeginRequest(
|
| GlobalRequestID(request_data.transferred_request_child_id,
|
| request_data.transferred_request_request_id));
|
| if (it != pending_loaders_.end()) {
|
| + // TODO(yhirano): Make mojo work for this case.
|
| + DCHECK(!url_loader_client);
|
| +
|
| // If the request is transferring to a new process, we can update our
|
| // state and let it resume with its existing ResourceHandlers.
|
| if (it->second->is_transferring()) {
|
| @@ -1315,7 +1339,8 @@ void ResourceDispatcherHostImpl::BeginRequest(
|
| if (is_shutdown_ ||
|
| !ShouldServiceRequest(process_type, child_id, request_data, headers,
|
| filter_, resource_context)) {
|
| - AbortRequestBeforeItStarts(filter_, sync_result, request_id);
|
| + AbortRequestBeforeItStarts(filter_, sync_result, request_id,
|
| + std::move(url_loader_client));
|
| return;
|
| }
|
| // Check if we have a registered interceptor for the headers passed in. If
|
| @@ -1339,13 +1364,16 @@ void ResourceDispatcherHostImpl::BeginRequest(
|
| it.name(), it.value(), child_id, resource_context,
|
| base::Bind(&ResourceDispatcherHostImpl::ContinuePendingBeginRequest,
|
| base::Unretained(this), request_id, request_data,
|
| - sync_result, route_id, headers));
|
| + sync_result, route_id, headers,
|
| + base::Passed(std::move(mojo_request)),
|
| + base::Passed(std::move(url_loader_client))));
|
| return;
|
| }
|
| }
|
| }
|
| ContinuePendingBeginRequest(request_id, request_data, sync_result, route_id,
|
| - headers, true, 0);
|
| + headers, std::move(mojo_request),
|
| + std::move(url_loader_client), true, 0);
|
| }
|
|
|
| void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| @@ -1354,13 +1382,16 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| IPC::Message* sync_result, // only valid for sync
|
| int route_id,
|
| const net::HttpRequestHeaders& headers,
|
| + mojo::InterfaceRequest<mojom::URLLoader> mojo_request,
|
| + mojom::URLLoaderClientPtr url_loader_client,
|
| bool continue_request,
|
| int error_code) {
|
| if (!continue_request) {
|
| // TODO(ananta): Find a way to specify the right error code here. Passing
|
| // in a non-content error code is not safe.
|
| bad_message::ReceivedBadMessage(filter_, bad_message::RDH_ILLEGAL_ORIGIN);
|
| - AbortRequestBeforeItStarts(filter_, sync_result, request_id);
|
| + AbortRequestBeforeItStarts(filter_, sync_result, request_id,
|
| + std::move(url_loader_client));
|
| return;
|
| }
|
|
|
| @@ -1381,7 +1412,8 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
| request_data.url,
|
| request_data.resource_type,
|
| resource_context)) {
|
| - AbortRequestBeforeItStarts(filter_, sync_result, request_id);
|
| + AbortRequestBeforeItStarts(filter_, sync_result, request_id,
|
| + std::move(url_loader_client));
|
| return;
|
| }
|
|
|
| @@ -1558,7 +1590,8 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest(
|
|
|
| std::unique_ptr<ResourceHandler> handler(CreateResourceHandler(
|
| new_request.get(), request_data, sync_result, route_id, process_type,
|
| - child_id, resource_context));
|
| + child_id, resource_context, std::move(mojo_request),
|
| + std::move(url_loader_client)));
|
|
|
| if (handler)
|
| BeginRequestInternal(std::move(new_request), std::move(handler));
|
| @@ -1572,7 +1605,9 @@ ResourceDispatcherHostImpl::CreateResourceHandler(
|
| int route_id,
|
| int process_type,
|
| int child_id,
|
| - ResourceContext* resource_context) {
|
| + ResourceContext* resource_context,
|
| + mojo::InterfaceRequest<mojom::URLLoader> mojo_request,
|
| + mojom::URLLoaderClientPtr url_loader_client) {
|
| // TODO(pkasting): Remove ScopedTracker below once crbug.com/456331 is fixed.
|
| tracked_objects::ScopedTracker tracking_profile(
|
| FROM_HERE_WITH_EXPLICIT_FUNCTION(
|
| @@ -1586,9 +1621,17 @@ ResourceDispatcherHostImpl::CreateResourceHandler(
|
| return std::unique_ptr<ResourceHandler>();
|
| }
|
|
|
| + DCHECK(!mojo_request.is_pending());
|
| + DCHECK(!url_loader_client);
|
| handler.reset(new SyncResourceHandler(request, sync_result, this));
|
| } else {
|
| - handler.reset(new AsyncResourceHandler(request, this));
|
| + if (mojo_request.is_pending()) {
|
| + handler.reset(new MojoAsyncResourceHandler(request, this,
|
| + std::move(mojo_request),
|
| + std::move(url_loader_client)));
|
| + } else {
|
| + handler.reset(new AsyncResourceHandler(request, this));
|
| + }
|
|
|
| // The RedirectToFileResourceHandler depends on being next in the chain.
|
| if (request_data.download_to_file) {
|
| @@ -2288,6 +2331,20 @@ void ResourceDispatcherHostImpl::OnRenderFrameDeleted(
|
| CancelRequestsForRoute(global_routing_id);
|
| }
|
|
|
| +void ResourceDispatcherHostImpl::OnRequestResourceWithMojo(
|
| + int routing_id,
|
| + int request_id,
|
| + const ResourceRequest& request,
|
| + mojo::InterfaceRequest<mojom::URLLoader> mojo_request,
|
| + mojom::URLLoaderClientPtr url_loader_client,
|
| + ResourceMessageFilter* filter) {
|
| + filter_ = filter;
|
| + OnRequestResourceInternal(routing_id, request_id, request,
|
| + std::move(mojo_request),
|
| + std::move(url_loader_client));
|
| + filter_ = nullptr;
|
| +}
|
| +
|
| // static
|
| int ResourceDispatcherHostImpl::CalculateApproximateMemoryCost(
|
| net::URLRequest* request) {
|
|
|