Chromium Code Reviews| 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 4de8a0874c8d0f7434c35b0f0506527284926508..ccf07cad4fc45744a472a41a7070a450b3d027ee 100644 |
| --- a/content/browser/loader/resource_dispatcher_host_impl.cc |
| +++ b/content/browser/loader/resource_dispatcher_host_impl.cc |
| @@ -50,6 +50,7 @@ |
| #include "content/browser/loader/cross_site_resource_handler.h" |
| #include "content/browser/loader/detachable_resource_handler.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" |
| @@ -229,7 +230,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; |
| @@ -244,8 +246,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)); |
| + } |
| } |
| } |
| @@ -538,6 +544,50 @@ ResourceDispatcherHost* ResourceDispatcherHost::Get() { |
| return g_resource_dispatcher_host; |
| } |
| +// This is a helper class consisting of mojo-related functionalities used in |
| +// ResourceDispatcherHostImpl. |
| +class ResourceDispatcherHostImpl::MojoHelper final { |
|
kinuko
2016/05/26 08:43:12
(At this point it may not make much sense to have
yhirano
2016/05/26 15:42:44
Done.
|
| + public: |
| + MojoHelper() {} |
| + |
| + // Adds |loader| as an uninitiated loader. |
| + void AddUninitiatedURLLoader(int child_id, |
| + std::unique_ptr<mojom::URLLoader> loader) { |
| + mojom::URLLoader* raw = loader.get(); |
| + uninitiated_url_loaders_.insert( |
| + std::make_pair(raw, std::make_pair(child_id, std::move(loader)))); |
| + } |
| + |
| + // Takes and returns the uninitiated loader whose address equals to |loader|. |
| + std::unique_ptr<mojom::URLLoader> TakeUninitiatedURLLoader( |
| + mojom::URLLoader* loader) { |
| + auto it = uninitiated_url_loaders_.find(loader); |
| + if (it == uninitiated_url_loaders_.end()) |
| + return nullptr; |
| + std::unique_ptr<mojom::URLLoader> result = std::move(it->second.second); |
| + uninitiated_url_loaders_.erase(it); |
| + return result; |
| + } |
| + |
| + // Cancels all uninitiated loaders for |child_id|. |
| + void CancelUninitiatedLoaders(int child_id) { |
| + auto it = uninitiated_url_loaders_.begin(); |
| + while (it != uninitiated_url_loaders_.end()) { |
| + if (it->second.first == child_id) { |
| + it = uninitiated_url_loaders_.erase(it); |
| + } else { |
| + ++it; |
| + } |
| + } |
| + } |
| + |
| + private: |
| + std::map<mojom::URLLoader*, std::pair<int, std::unique_ptr<mojom::URLLoader>>> |
| + uninitiated_url_loaders_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(MojoHelper); |
| +}; |
| + |
| ResourceDispatcherHostImpl::ResourceDispatcherHostImpl() |
| : save_file_manager_(new SaveFileManager()), |
| request_id_(-1), |
| @@ -551,7 +601,8 @@ ResourceDispatcherHostImpl::ResourceDispatcherHostImpl() |
| filter_(NULL), |
| delegate_(NULL), |
| allow_cross_origin_auth_prompt_(false), |
| - cert_store_for_testing_(nullptr) { |
| + cert_store_for_testing_(nullptr), |
| + mojo_helper_(new MojoHelper()) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| DCHECK(!g_resource_dispatcher_host); |
| g_resource_dispatcher_host = this; |
| @@ -584,6 +635,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; |
| } |
| @@ -1178,6 +1230,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) |
| @@ -1219,6 +1272,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, |
| + std::unique_ptr<mojom::URLLoader> url_loader, |
| + 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( |
| @@ -1239,7 +1302,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(url_loader), std::move(url_loader_client)); |
| } |
| // Begins a resource request with the given params on behalf of the specified |
| @@ -1254,7 +1318,7 @@ 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()); |
| + sync_result->routing_id(), nullptr, nullptr); |
| } |
| bool ResourceDispatcherHostImpl::IsRequestIDInUse( |
| @@ -1369,7 +1433,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, |
| + std::unique_ptr<mojom::URLLoader> url_loader, |
| + mojom::URLLoaderClientPtr url_loader_client) { |
| int process_type = filter_->process_type(); |
| int child_id = filter_->child_id(); |
| @@ -1438,7 +1504,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; |
| } |
| @@ -1447,7 +1514,8 @@ void ResourceDispatcherHostImpl::BeginRequest( |
| 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; |
| } |
| @@ -1628,7 +1696,8 @@ void ResourceDispatcherHostImpl::BeginRequest( |
| 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(url_loader), |
| + std::move(url_loader_client))); |
| if (handler) |
| BeginRequestInternal(std::move(new_request), std::move(handler)); |
| @@ -1642,7 +1711,9 @@ ResourceDispatcherHostImpl::CreateResourceHandler( |
| int route_id, |
| int process_type, |
| int child_id, |
| - ResourceContext* resource_context) { |
| + ResourceContext* resource_context, |
| + std::unique_ptr<mojom::URLLoader> url_loader, |
| + 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( |
| @@ -1656,9 +1727,16 @@ ResourceDispatcherHostImpl::CreateResourceHandler( |
| return std::unique_ptr<ResourceHandler>(); |
| } |
| + DCHECK(!url_loader); |
| + DCHECK(!url_loader_client); |
| handler.reset(new SyncResourceHandler(request, sync_result, this)); |
| } else { |
| - handler.reset(new AsyncResourceHandler(request, this)); |
| + if (url_loader) { |
| + handler.reset(new MojoAsyncResourceHandler( |
| + request, this, std::move(url_loader), 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) { |
| @@ -2064,6 +2142,11 @@ void ResourceDispatcherHostImpl::CancelRequestsForRoute( |
| CancelBlockedRequestsForRoute(route_id); |
| } |
| } |
| + |
| + // Uninitiated URLLoader has no routing ID, so it should be deleted only when |
| + // cancel_all_routes is specified. |
| + if (cancel_all_routes) |
| + mojo_helper_->CancelUninitiatedLoaders(child_id); |
| } |
| // Cancels the request and removes it from the list. |
| @@ -2351,6 +2434,31 @@ void ResourceDispatcherHostImpl::EnableStaleWhileRevalidateForTesting() { |
| async_revalidation_manager_.reset(new AsyncRevalidationManager); |
| } |
| +void ResourceDispatcherHostImpl::OnRequestResourceWithMojo( |
| + int routing_id, |
| + int request_id, |
| + const ResourceRequest& request, |
| + std::unique_ptr<mojom::URLLoader> url_loader, |
| + mojom::URLLoaderClientPtr url_loader_client, |
| + ResourceMessageFilter* filter) { |
| + filter_ = filter; |
| + OnRequestResourceInternal(routing_id, request_id, request, |
| + std::move(url_loader), |
| + std::move(url_loader_client)); |
| + filter_ = nullptr; |
| +} |
| + |
| +void ResourceDispatcherHostImpl::AddUninitiatedURLLoader( |
| + int child_id, |
| + std::unique_ptr<mojom::URLLoader> loader) { |
| + mojo_helper_->AddUninitiatedURLLoader(child_id, std::move(loader)); |
| +} |
| + |
| +std::unique_ptr<mojom::URLLoader> |
| +ResourceDispatcherHostImpl::TakeUninitiatedURLLoader(mojom::URLLoader* loader) { |
| + return mojo_helper_->TakeUninitiatedURLLoader(loader); |
| +} |
| + |
| // static |
| int ResourceDispatcherHostImpl::CalculateApproximateMemoryCost( |
| net::URLRequest* request) { |