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 8cc50c6f05820225092b7d051a9878edc962c5ee..88889ccfd3f18a8fe10f84f9c851c31e224f17f1 100644 |
--- a/content/browser/loader/resource_dispatcher_host_impl.cc |
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc |
@@ -119,6 +119,8 @@ using base::Time; |
using base::TimeDelta; |
using base::TimeTicks; |
using storage::ShareableFileReference; |
+using SyncLoadResultCallback = |
+ content::ResourceDispatcherHostImpl::SyncLoadResultCallback; |
// ---------------------------------------------------------------------------- |
@@ -221,15 +223,15 @@ 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, |
- mojom::URLLoaderClientPtr url_loader_client) { |
- if (sync_result) { |
+void AbortRequestBeforeItStarts( |
+ ResourceMessageFilter* filter, |
+ const SyncLoadResultCallback& sync_result_handler, |
+ int request_id, |
+ mojom::URLLoaderClientPtr url_loader_client) { |
+ if (sync_result_handler) { |
SyncLoadResult result; |
result.error_code = net::ERR_ABORTED; |
- ResourceHostMsg_SyncLoad::WriteReplyParams(sync_result, result); |
- filter->Send(sync_result); |
+ sync_result_handler.Run(&result); |
} else { |
// Tell the renderer that this request was disallowed. |
ResourceRequestCompletionStatus request_complete_data; |
@@ -414,6 +416,22 @@ void NotifyForEachFrameFromUI( |
base::Passed(std::move(routing_ids)))); |
} |
+// Sends back the result of a synchronous loading result to the renderer through |
+// Chrome IPC. |
+void HandleSyncLoadResult(base::WeakPtr<ResourceMessageFilter> filter, |
+ std::unique_ptr<IPC::Message> sync_result, |
+ const SyncLoadResult* result) { |
+ if (!filter) |
+ return; |
+ |
+ if (result) { |
+ ResourceHostMsg_SyncLoad::WriteReplyParams(sync_result.get(), *result); |
+ } else { |
+ sync_result->set_reply_error(); |
+ } |
+ filter->Send(sync_result.release()); |
+} |
+ |
} // namespace |
ResourceDispatcherHostImpl::LoadInfo::LoadInfo() {} |
@@ -1059,7 +1077,7 @@ void ResourceDispatcherHostImpl::OnRequestResourceInternal( |
request_data.render_frame_id, |
request_data.url)); |
} |
- BeginRequest(request_id, request_data, NULL, routing_id, |
+ BeginRequest(request_id, request_data, SyncLoadResultCallback(), routing_id, |
std::move(mojo_request), std::move(url_loader_client)); |
} |
@@ -1074,7 +1092,10 @@ void ResourceDispatcherHostImpl::OnRequestResourceInternal( |
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(), |
+ SyncLoadResultCallback callback = base::Bind( |
+ &HandleSyncLoadResult, filter_->GetWeakPtr(), |
+ base::Passed(WrapUnique(sync_result))); |
+ BeginRequest(request_id, request_data, callback, sync_result->routing_id(), |
nullptr, nullptr); |
} |
@@ -1181,7 +1202,7 @@ void ResourceDispatcherHostImpl::UpdateRequestForTransfer( |
void ResourceDispatcherHostImpl::BeginRequest( |
int request_id, |
const ResourceRequest& request_data, |
- IPC::Message* sync_result, // only valid for sync |
+ const SyncLoadResultCallback& sync_result_handler, // only valid for sync |
int route_id, |
mojo::InterfaceRequest<mojom::URLLoader> mojo_request, |
mojom::URLLoaderClientPtr url_loader_client) { |
@@ -1256,7 +1277,7 @@ 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_handler, request_id, |
std::move(url_loader_client)); |
return; |
} |
@@ -1281,22 +1302,22 @@ 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_handler, 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, std::move(mojo_request), |
+ ContinuePendingBeginRequest(request_id, request_data, sync_result_handler, |
+ route_id, headers, std::move(mojo_request), |
std::move(url_loader_client), true, 0); |
} |
void ResourceDispatcherHostImpl::ContinuePendingBeginRequest( |
int request_id, |
const ResourceRequest& request_data, |
- IPC::Message* sync_result, // only valid for sync |
+ const SyncLoadResultCallback& sync_result_handler, // only valid for sync |
int route_id, |
const net::HttpRequestHeaders& headers, |
mojo::InterfaceRequest<mojom::URLLoader> mojo_request, |
@@ -1307,7 +1328,7 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest( |
// 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_handler, request_id, |
std::move(url_loader_client)); |
return; |
} |
@@ -1330,7 +1351,7 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest( |
request_data.url, |
request_data.resource_type, |
resource_context)) { |
- AbortRequestBeforeItStarts(filter_, sync_result, request_id, |
+ AbortRequestBeforeItStarts(filter_, sync_result_handler, request_id, |
std::move(url_loader_client)); |
return; |
} |
@@ -1403,7 +1424,7 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest( |
bool allow_download = request_data.allow_download && |
IsResourceTypeFrame(request_data.resource_type); |
bool do_not_prompt_for_login = request_data.do_not_prompt_for_login; |
- bool is_sync_load = sync_result != NULL; |
+ bool is_sync_load = !!sync_result_handler; |
// Raw headers are sensitive, as they include Cookie/Set-Cookie, so only |
// allow requesting them if requester has ReadRawCookies permission. |
@@ -1515,8 +1536,8 @@ void ResourceDispatcherHostImpl::ContinuePendingBeginRequest( |
request_data.should_reset_appcache); |
std::unique_ptr<ResourceHandler> handler(CreateResourceHandler( |
- new_request.get(), request_data, sync_result, route_id, process_type, |
- child_id, resource_context, std::move(mojo_request), |
+ new_request.get(), request_data, sync_result_handler, route_id, |
+ process_type, child_id, resource_context, std::move(mojo_request), |
std::move(url_loader_client))); |
if (handler) |
@@ -1527,7 +1548,7 @@ std::unique_ptr<ResourceHandler> |
ResourceDispatcherHostImpl::CreateResourceHandler( |
net::URLRequest* request, |
const ResourceRequest& request_data, |
- IPC::Message* sync_result, |
+ const SyncLoadResultCallback& sync_result_handler, |
int route_id, |
int process_type, |
int child_id, |
@@ -1540,7 +1561,7 @@ ResourceDispatcherHostImpl::CreateResourceHandler( |
"456331 ResourceDispatcherHostImpl::CreateResourceHandler")); |
// Construct the IPC resource handler. |
std::unique_ptr<ResourceHandler> handler; |
- if (sync_result) { |
+ if (sync_result_handler) { |
// download_to_file is not supported for synchronous requests. |
if (request_data.download_to_file) { |
bad_message::ReceivedBadMessage(filter_, bad_message::RDH_BAD_DOWNLOAD); |
@@ -1549,7 +1570,7 @@ ResourceDispatcherHostImpl::CreateResourceHandler( |
DCHECK(!mojo_request.is_pending()); |
DCHECK(!url_loader_client); |
- handler.reset(new SyncResourceHandler(request, sync_result, this)); |
+ handler.reset(new SyncResourceHandler(request, sync_result_handler, this)); |
} else { |
if (mojo_request.is_pending()) { |
handler.reset(new MojoAsyncResourceHandler(request, this, |
@@ -1569,8 +1590,9 @@ ResourceDispatcherHostImpl::CreateResourceHandler( |
bool start_detached = request_data.download_to_network_cache_only; |
// Prefetches and <a ping> requests outlive their child process. |
- if (!sync_result && (start_detached || |
- IsDetachableResourceType(request_data.resource_type))) { |
+ if (!sync_result_handler && |
+ (start_detached || |
+ IsDetachableResourceType(request_data.resource_type))) { |
std::unique_ptr<DetachableResourceHandler> detachable_handler = |
base::MakeUnique<DetachableResourceHandler>( |
request, |