| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading | 5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading |
| 6 | 6 |
| 7 #include "content/child/resource_dispatcher.h" | 7 #include "content/child/resource_dispatcher.h" |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 response->encoded_body_length = result.encoded_body_length; | 613 response->encoded_body_length = result.encoded_body_length; |
| 614 } | 614 } |
| 615 | 615 |
| 616 int ResourceDispatcher::StartAsync( | 616 int ResourceDispatcher::StartAsync( |
| 617 std::unique_ptr<ResourceRequest> request, | 617 std::unique_ptr<ResourceRequest> request, |
| 618 int routing_id, | 618 int routing_id, |
| 619 scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner, | 619 scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner, |
| 620 const url::Origin& frame_origin, | 620 const url::Origin& frame_origin, |
| 621 std::unique_ptr<RequestPeer> peer, | 621 std::unique_ptr<RequestPeer> peer, |
| 622 blink::WebURLRequest::LoadingIPCType ipc_type, | 622 blink::WebURLRequest::LoadingIPCType ipc_type, |
| 623 mojom::URLLoaderFactory* url_loader_factory) { | 623 mojom::URLLoaderFactory* url_loader_factory, |
| 624 mojo::ScopedDataPipeConsumerHandle consumer_handle) { |
| 624 CheckSchemeForReferrerPolicy(*request); | 625 CheckSchemeForReferrerPolicy(*request); |
| 625 | 626 |
| 626 // Compute a unique request_id for this renderer process. | 627 // Compute a unique request_id for this renderer process. |
| 627 int request_id = MakeRequestID(); | 628 int request_id = MakeRequestID(); |
| 628 pending_requests_[request_id] = base::MakeUnique<PendingRequestInfo>( | 629 pending_requests_[request_id] = base::MakeUnique<PendingRequestInfo>( |
| 629 std::move(peer), request->resource_type, request->origin_pid, | 630 std::move(peer), request->resource_type, request->origin_pid, |
| 630 frame_origin, request->url, request->download_to_file); | 631 frame_origin, request->url, request->download_to_file); |
| 631 | 632 |
| 632 if (resource_scheduling_filter_.get() && loading_task_runner) { | 633 if (resource_scheduling_filter_.get() && loading_task_runner) { |
| 633 resource_scheduling_filter_->SetRequestIdTaskRunner(request_id, | 634 resource_scheduling_filter_->SetRequestIdTaskRunner(request_id, |
| 634 loading_task_runner); | 635 loading_task_runner); |
| 635 } | 636 } |
| 636 | 637 |
| 638 scoped_refptr<base::SingleThreadTaskRunner> task_runner = |
| 639 loading_task_runner ? loading_task_runner : main_thread_task_runner_; |
| 640 |
| 641 if (consumer_handle.is_valid()) { |
| 642 pending_requests_[request_id]->url_loader_client = |
| 643 base::MakeUnique<URLLoaderClientImpl>(request_id, this, task_runner); |
| 644 |
| 645 task_runner->PostTask(FROM_HERE, |
| 646 base::Bind(&ResourceDispatcher::ContinueForNavigation, |
| 647 weak_factory_.GetWeakPtr(), request_id, |
| 648 base::Passed(std::move(consumer_handle)))); |
| 649 |
| 650 return request_id; |
| 651 } |
| 652 |
| 637 if (ipc_type == blink::WebURLRequest::LoadingIPCType::kMojo) { | 653 if (ipc_type == blink::WebURLRequest::LoadingIPCType::kMojo) { |
| 638 scoped_refptr<base::SingleThreadTaskRunner> task_runner = | 654 scoped_refptr<base::SingleThreadTaskRunner> task_runner = |
| 639 loading_task_runner ? loading_task_runner : main_thread_task_runner_; | 655 loading_task_runner ? loading_task_runner : main_thread_task_runner_; |
| 640 std::unique_ptr<URLLoaderClientImpl> client( | 656 std::unique_ptr<URLLoaderClientImpl> client( |
| 641 new URLLoaderClientImpl(request_id, this, std::move(task_runner))); | 657 new URLLoaderClientImpl(request_id, this, std::move(task_runner))); |
| 642 mojom::URLLoaderAssociatedPtr url_loader; | 658 mojom::URLLoaderAssociatedPtr url_loader; |
| 643 mojom::URLLoaderClientPtr client_ptr; | 659 mojom::URLLoaderClientPtr client_ptr; |
| 644 client->Bind(&client_ptr); | 660 client->Bind(&client_ptr); |
| 645 url_loader_factory->CreateLoaderAndStart(MakeRequest(&url_loader), | 661 url_loader_factory->CreateLoaderAndStart(MakeRequest(&url_loader), |
| 646 routing_id, request_id, *request, | 662 routing_id, request_id, *request, |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 } | 744 } |
| 729 | 745 |
| 730 base::TimeTicks ResourceDispatcher::ConsumeIOTimestamp() { | 746 base::TimeTicks ResourceDispatcher::ConsumeIOTimestamp() { |
| 731 if (io_timestamp_ == base::TimeTicks()) | 747 if (io_timestamp_ == base::TimeTicks()) |
| 732 return base::TimeTicks::Now(); | 748 return base::TimeTicks::Now(); |
| 733 base::TimeTicks result = io_timestamp_; | 749 base::TimeTicks result = io_timestamp_; |
| 734 io_timestamp_ = base::TimeTicks(); | 750 io_timestamp_ = base::TimeTicks(); |
| 735 return result; | 751 return result; |
| 736 } | 752 } |
| 737 | 753 |
| 754 void ResourceDispatcher::ContinueForNavigation( |
| 755 int request_id, |
| 756 mojo::ScopedDataPipeConsumerHandle consumer_handle) { |
| 757 PendingRequestInfo* request_info = GetPendingRequestInfo(request_id); |
| 758 if (!request_info) |
| 759 return; |
| 760 |
| 761 URLLoaderClientImpl* client_ptr = request_info->url_loader_client.get(); |
| 762 |
| 763 // Short circuiting call to OnReceivedResponse to immediately start |
| 764 // the request. ResourceResponseHead can be empty here because we |
| 765 // pull the StreamOverride's one in |
| 766 // WebURLLoaderImpl::Context::OnReceivedResponse. |
| 767 client_ptr->OnReceiveResponse(ResourceResponseHead(), |
| 768 mojom::DownloadedTempFilePtr()); |
| 769 // Start streaming now. |
| 770 client_ptr->OnStartLoadingResponseBody(std::move(consumer_handle)); |
| 771 |
| 772 // Call OnComplete now too, as it won't get called on the client. |
| 773 // TODO(kinuko): Fill this properly. |
| 774 ResourceRequestCompletionStatus completion_status; |
| 775 completion_status.error_code = net::OK; |
| 776 completion_status.was_ignored_by_handler = false; |
| 777 completion_status.exists_in_cache = false; |
| 778 completion_status.completion_time = base::TimeTicks::Now(); |
| 779 completion_status.encoded_data_length = -1; |
| 780 completion_status.encoded_body_length = -1; |
| 781 client_ptr->OnComplete(completion_status); |
| 782 } |
| 783 |
| 738 // static | 784 // static |
| 739 bool ResourceDispatcher::IsResourceDispatcherMessage( | 785 bool ResourceDispatcher::IsResourceDispatcherMessage( |
| 740 const IPC::Message& message) { | 786 const IPC::Message& message) { |
| 741 switch (message.type()) { | 787 switch (message.type()) { |
| 742 case ResourceMsg_UploadProgress::ID: | 788 case ResourceMsg_UploadProgress::ID: |
| 743 case ResourceMsg_ReceivedResponse::ID: | 789 case ResourceMsg_ReceivedResponse::ID: |
| 744 case ResourceMsg_ReceivedCachedMetadata::ID: | 790 case ResourceMsg_ReceivedCachedMetadata::ID: |
| 745 case ResourceMsg_ReceivedRedirect::ID: | 791 case ResourceMsg_ReceivedRedirect::ID: |
| 746 case ResourceMsg_SetDataBuffer::ID: | 792 case ResourceMsg_SetDataBuffer::ID: |
| 747 case ResourceMsg_DataReceived::ID: | 793 case ResourceMsg_DataReceived::ID: |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 788 delete message; | 834 delete message; |
| 789 } | 835 } |
| 790 } | 836 } |
| 791 | 837 |
| 792 void ResourceDispatcher::SetResourceSchedulingFilter( | 838 void ResourceDispatcher::SetResourceSchedulingFilter( |
| 793 scoped_refptr<ResourceSchedulingFilter> resource_scheduling_filter) { | 839 scoped_refptr<ResourceSchedulingFilter> resource_scheduling_filter) { |
| 794 resource_scheduling_filter_ = resource_scheduling_filter; | 840 resource_scheduling_filter_ = resource_scheduling_filter; |
| 795 } | 841 } |
| 796 | 842 |
| 797 } // namespace content | 843 } // namespace content |
| OLD | NEW |