Chromium Code Reviews| Index: content/child/resource_dispatcher.cc |
| diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc |
| index 50254c17507fbfab7e8439b911aefe9250d2a4ee..0acc3de2d1b8f2093158dc5a06cf4fe9d71e5b0e 100644 |
| --- a/content/child/resource_dispatcher.cc |
| +++ b/content/child/resource_dispatcher.cc |
| @@ -620,7 +620,8 @@ int ResourceDispatcher::StartAsync( |
| const url::Origin& frame_origin, |
| std::unique_ptr<RequestPeer> peer, |
| blink::WebURLRequest::LoadingIPCType ipc_type, |
| - mojom::URLLoaderFactory* url_loader_factory) { |
| + mojom::URLLoaderFactory* url_loader_factory, |
| + mojo::ScopedDataPipeConsumerHandle consumer_handle) { |
| CheckSchemeForReferrerPolicy(*request); |
| // Compute a unique request_id for this renderer process. |
| @@ -634,6 +635,22 @@ int ResourceDispatcher::StartAsync( |
| loading_task_runner); |
| } |
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner = |
| + loading_task_runner ? loading_task_runner : main_thread_task_runner_; |
| + |
| + if (consumer_handle.is_valid()) { |
| + std::unique_ptr<URLLoaderClientImpl> client( |
| + new URLLoaderClientImpl(request_id, this, task_runner)); |
| + pending_requests_[request_id]->url_loader_client = std::move(client); |
|
dcheng
2017/04/12 21:18:16
Nit:
pending_requested_[request_id]->url_loader_cl
scottmg
2017/04/12 21:28:50
Done.
|
| + |
| + task_runner->PostTask(FROM_HERE, |
| + base::Bind(&ResourceDispatcher::ContinueForNavigation, |
| + weak_factory_.GetWeakPtr(), request_id, |
| + base::Passed(std::move(consumer_handle)))); |
| + |
| + return request_id; |
| + } |
| + |
| if (ipc_type == blink::WebURLRequest::LoadingIPCType::kMojo) { |
| scoped_refptr<base::SingleThreadTaskRunner> task_runner = |
| loading_task_runner ? loading_task_runner : main_thread_task_runner_; |
| @@ -735,6 +752,36 @@ base::TimeTicks ResourceDispatcher::ConsumeIOTimestamp() { |
| return result; |
| } |
| +void ResourceDispatcher::ContinueForNavigation( |
| + int request_id, |
| + mojo::ScopedDataPipeConsumerHandle consumer_handle) { |
| + PendingRequestInfo* request_info = GetPendingRequestInfo(request_id); |
| + if (!request_info) |
| + return; |
| + |
| + URLLoaderClientImpl* client_ptr = request_info->url_loader_client.get(); |
| + |
| + // Short circuiting call to OnReceivedResponse to immediately start |
| + // the request. ResourceResponseHead can be empty here because we |
| + // pull the StreamOverride's one in |
| + // WebURLLoaderImpl::Context::OnReceivedResponse. |
| + client_ptr->OnReceiveResponse(ResourceResponseHead(), |
| + mojom::DownloadedTempFilePtr()); |
| + // Start streaming now. |
| + client_ptr->OnStartLoadingResponseBody(std::move(consumer_handle)); |
| + |
| + // Call OnComplete now too, as it won't get called on the client. |
| + // TODO(kinuko): Fill this properly. |
| + ResourceRequestCompletionStatus completion_status; |
| + completion_status.error_code = net::OK; |
| + completion_status.was_ignored_by_handler = false; |
| + completion_status.exists_in_cache = false; |
| + completion_status.completion_time = base::TimeTicks::Now(); |
| + completion_status.encoded_data_length = -1; |
| + completion_status.encoded_body_length = -1; |
| + client_ptr->OnComplete(completion_status); |
| +} |
| + |
| // static |
| bool ResourceDispatcher::IsResourceDispatcherMessage( |
| const IPC::Message& message) { |