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 f2c1ac98e8cd6387941ada630c8b712ed8d68600..ad158efe52c074bcfac76251c2cfb1a88cbc808f 100644 |
| --- a/content/browser/loader/resource_dispatcher_host_impl.cc |
| +++ b/content/browser/loader/resource_dispatcher_host_impl.cc |
| @@ -118,6 +118,8 @@ using base::Time; |
| using base::TimeDelta; |
| using base::TimeTicks; |
| using storage::ShareableFileReference; |
| +using SyncLoadResultCallback = |
| + content::ResourceDispatcherHostImpl::SyncLoadResultCallback; |
| // ---------------------------------------------------------------------------- |
| @@ -220,15 +222,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; |
| @@ -413,6 +415,19 @@ void NotifyForEachFrameFromUI( |
| base::Passed(std::move(routing_ids)))); |
| } |
| +void HandleSyncLoadResult(base::WeakPtr<ResourceMessageFilter> filter, |
|
mmenke
2016/10/05 15:21:33
Need to document this.
tzik
2016/10/06 12:52:03
Done.
|
| + 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(); |
|
mmenke
2016/10/05 15:21:33
nit: Use braces with if else
tzik
2016/10/06 12:52:03
Done.
|
| + filter->Send(sync_result.release()); |
| +} |
| + |
| } // namespace |
| ResourceDispatcherHostImpl::LoadInfo::LoadInfo() {} |
| @@ -1058,7 +1073,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)); |
| } |
| @@ -1073,7 +1088,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 cb = base::Bind( |
|
mmenke
2016/10/05 15:21:33
I'd suggest just writing out callback. (I conside
tzik
2016/10/06 12:52:03
Done.
|
| + &HandleSyncLoadResult, filter_->GetWeakPtr(), |
| + base::Passed(WrapUnique(sync_result))); |
|
mmenke
2016/10/05 15:21:33
This doesn't seem legal. We don't own sync_result
kinuko
2016/10/05 15:52:57
It looks we could also just copy the message by va
kinuko
2016/10/05 20:57:49
^^ sorry please ignore this comment, that was bogu
tzik
2016/10/06 12:52:03
This is called by MessageT<>::DispatchDelayReply v
|
| + BeginRequest(request_id, request_data, cb, sync_result->routing_id(), |
| nullptr, nullptr); |
| } |
| @@ -1177,7 +1195,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) { |
| @@ -1252,7 +1270,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; |
| } |
| @@ -1277,22 +1295,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, |
| @@ -1303,7 +1321,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; |
| } |
| @@ -1326,7 +1344,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; |
| } |
| @@ -1399,7 +1417,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.is_null(); |
|
mmenke
2016/10/05 15:21:33
Higher up, you just rely on implicit conversion of
tzik
2016/10/06 12:52:03
That is an implicit use of an explicit conversion
|
| // Raw headers are sensitive, as they include Cookie/Set-Cookie, so only |
| // allow requesting them if requester has ReadRawCookies permission. |
| @@ -1511,8 +1529,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) |
| @@ -1523,7 +1541,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, |
| @@ -1536,7 +1554,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); |
| @@ -1545,7 +1563,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, |
| @@ -1565,8 +1583,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, |