| 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 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
| 13 #include "base/debug/alias.h" | 13 #include "base/debug/alias.h" |
| 14 #include "base/debug/dump_without_crashing.h" | 14 #include "base/debug/dump_without_crashing.h" |
| 15 #include "base/debug/stack_trace.h" | 15 #include "base/debug/stack_trace.h" |
| 16 #include "base/feature_list.h" | 16 #include "base/feature_list.h" |
| 17 #include "base/files/file_path.h" | 17 #include "base/files/file_path.h" |
| 18 #include "base/memory/ptr_util.h" | 18 #include "base/memory/ptr_util.h" |
| 19 #include "base/memory/shared_memory.h" | 19 #include "base/memory/shared_memory.h" |
| 20 #include "base/message_loop/message_loop.h" | 20 #include "base/message_loop/message_loop.h" |
| 21 #include "base/metrics/histogram_macros.h" | 21 #include "base/metrics/histogram_macros.h" |
| 22 #include "base/rand_util.h" | 22 #include "base/rand_util.h" |
| 23 #include "base/strings/string_util.h" | 23 #include "base/strings/string_util.h" |
| 24 #include "build/build_config.h" | 24 #include "build/build_config.h" |
| 25 #include "content/child/request_extra_data.h" | 25 #include "content/child/request_extra_data.h" |
| 26 #include "content/child/request_info.h" | |
| 27 #include "content/child/resource_scheduling_filter.h" | 26 #include "content/child/resource_scheduling_filter.h" |
| 28 #include "content/child/shared_memory_received_data_factory.h" | 27 #include "content/child/shared_memory_received_data_factory.h" |
| 29 #include "content/child/site_isolation_stats_gatherer.h" | 28 #include "content/child/site_isolation_stats_gatherer.h" |
| 30 #include "content/child/sync_load_response.h" | 29 #include "content/child/sync_load_response.h" |
| 31 #include "content/child/url_response_body_consumer.h" | 30 #include "content/child/url_response_body_consumer.h" |
| 32 #include "content/common/inter_process_time_ticks_converter.h" | 31 #include "content/common/inter_process_time_ticks_converter.h" |
| 33 #include "content/common/navigation_params.h" | 32 #include "content/common/navigation_params.h" |
| 34 #include "content/common/resource_messages.h" | 33 #include "content/common/resource_messages.h" |
| 35 #include "content/common/resource_request.h" | 34 #include "content/common/resource_request.h" |
| 36 #include "content/common/resource_request_completion_status.h" | 35 #include "content/common/resource_request_completion_status.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 } | 109 } |
| 111 | 110 |
| 112 private: | 111 private: |
| 113 mojo::Binding<mojom::URLLoaderClient> binding_; | 112 mojo::Binding<mojom::URLLoaderClient> binding_; |
| 114 scoped_refptr<URLResponseBodyConsumer> body_consumer_; | 113 scoped_refptr<URLResponseBodyConsumer> body_consumer_; |
| 115 const int request_id_; | 114 const int request_id_; |
| 116 ResourceDispatcher* const resource_dispatcher_; | 115 ResourceDispatcher* const resource_dispatcher_; |
| 117 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 116 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| 118 }; | 117 }; |
| 119 | 118 |
| 119 void CheckSchemeForReferrerPolicy(const ResourceRequest& request) { |
| 120 if ((request.referrer_policy == blink::WebReferrerPolicyDefault || |
| 121 request.referrer_policy == |
| 122 blink::WebReferrerPolicyNoReferrerWhenDowngrade) && |
| 123 request.referrer.SchemeIsCryptographic() && |
| 124 !request.url.SchemeIsCryptographic()) { |
| 125 LOG(FATAL) << "Trying to send secure referrer for insecure request " |
| 126 << "without an appropriate referrer policy.\n" |
| 127 << "URL = " << request.url << "\n" |
| 128 << "Referrer = " << request.referrer; |
| 129 } |
| 130 } |
| 131 |
| 120 } // namespace | 132 } // namespace |
| 121 | 133 |
| 122 ResourceDispatcher::ResourceDispatcher( | 134 ResourceDispatcher::ResourceDispatcher( |
| 123 IPC::Sender* sender, | 135 IPC::Sender* sender, |
| 124 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) | 136 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) |
| 125 : message_sender_(sender), | 137 : message_sender_(sender), |
| 126 delegate_(NULL), | 138 delegate_(NULL), |
| 127 io_timestamp_(base::TimeTicks()), | 139 io_timestamp_(base::TimeTicks()), |
| 128 main_thread_task_runner_(main_thread_task_runner), | 140 main_thread_task_runner_(main_thread_task_runner), |
| 129 weak_factory_(this) { | 141 weak_factory_(this) { |
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 583 PendingRequestInfo* pending_request = index->second.get(); | 595 PendingRequestInfo* pending_request = index->second.get(); |
| 584 if (pending_request->is_deferred) { | 596 if (pending_request->is_deferred) { |
| 585 pending_request->deferred_message_queue.swap(q); | 597 pending_request->deferred_message_queue.swap(q); |
| 586 return; | 598 return; |
| 587 } | 599 } |
| 588 } | 600 } |
| 589 } | 601 } |
| 590 } | 602 } |
| 591 | 603 |
| 592 void ResourceDispatcher::StartSync( | 604 void ResourceDispatcher::StartSync( |
| 593 const RequestInfo& request_info, | 605 std::unique_ptr<ResourceRequest> request, |
| 594 ResourceRequestBodyImpl* request_body, | 606 int routing_id, |
| 595 SyncLoadResponse* response, | 607 SyncLoadResponse* response, |
| 596 blink::WebURLRequest::LoadingIPCType ipc_type, | 608 blink::WebURLRequest::LoadingIPCType ipc_type, |
| 597 mojom::URLLoaderFactory* url_loader_factory) { | 609 mojom::URLLoaderFactory* url_loader_factory) { |
| 598 std::unique_ptr<ResourceRequest> request = | 610 CheckSchemeForReferrerPolicy(*request); |
| 599 CreateRequest(request_info, request_body, NULL); | 611 |
| 600 // TODO(yhirano): Use url_loader_factory otherwise. | 612 // TODO(yhirano): Use url_loader_factory otherwise. |
| 601 DCHECK_EQ(blink::WebURLRequest::LoadingIPCType::ChromeIPC, ipc_type); | 613 DCHECK_EQ(blink::WebURLRequest::LoadingIPCType::ChromeIPC, ipc_type); |
| 602 | 614 |
| 603 SyncLoadResult result; | 615 SyncLoadResult result; |
| 604 IPC::SyncMessage* msg = new ResourceHostMsg_SyncLoad( | 616 IPC::SyncMessage* msg = new ResourceHostMsg_SyncLoad( |
| 605 request_info.routing_id, MakeRequestID(), *request, &result); | 617 routing_id, MakeRequestID(), *request, &result); |
| 606 | 618 |
| 607 // NOTE: This may pump events (see RenderThread::Send). | 619 // NOTE: This may pump events (see RenderThread::Send). |
| 608 if (!message_sender_->Send(msg)) { | 620 if (!message_sender_->Send(msg)) { |
| 609 response->error_code = net::ERR_FAILED; | 621 response->error_code = net::ERR_FAILED; |
| 610 return; | 622 return; |
| 611 } | 623 } |
| 612 | 624 |
| 613 response->error_code = result.error_code; | 625 response->error_code = result.error_code; |
| 614 response->url = result.final_url; | 626 response->url = result.final_url; |
| 615 response->headers = result.headers; | 627 response->headers = result.headers; |
| 616 response->mime_type = result.mime_type; | 628 response->mime_type = result.mime_type; |
| 617 response->charset = result.charset; | 629 response->charset = result.charset; |
| 618 response->request_time = result.request_time; | 630 response->request_time = result.request_time; |
| 619 response->response_time = result.response_time; | 631 response->response_time = result.response_time; |
| 620 response->load_timing = result.load_timing; | 632 response->load_timing = result.load_timing; |
| 621 response->devtools_info = result.devtools_info; | 633 response->devtools_info = result.devtools_info; |
| 622 response->data.swap(result.data); | 634 response->data.swap(result.data); |
| 623 response->download_file_path = result.download_file_path; | 635 response->download_file_path = result.download_file_path; |
| 624 response->socket_address = result.socket_address; | 636 response->socket_address = result.socket_address; |
| 625 response->encoded_data_length = result.encoded_data_length; | 637 response->encoded_data_length = result.encoded_data_length; |
| 626 response->encoded_body_length = result.encoded_body_length; | 638 response->encoded_body_length = result.encoded_body_length; |
| 627 } | 639 } |
| 628 | 640 |
| 629 int ResourceDispatcher::StartAsync( | 641 int ResourceDispatcher::StartAsync( |
| 630 const RequestInfo& request_info, | 642 std::unique_ptr<ResourceRequest> request, |
| 631 ResourceRequestBodyImpl* request_body, | 643 int routing_id, |
| 644 scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner, |
| 645 const GURL& frame_origin, |
| 632 std::unique_ptr<RequestPeer> peer, | 646 std::unique_ptr<RequestPeer> peer, |
| 633 blink::WebURLRequest::LoadingIPCType ipc_type, | 647 blink::WebURLRequest::LoadingIPCType ipc_type, |
| 634 mojom::URLLoaderFactory* url_loader_factory) { | 648 mojom::URLLoaderFactory* url_loader_factory) { |
| 635 GURL frame_origin; | 649 CheckSchemeForReferrerPolicy(*request); |
| 636 std::unique_ptr<ResourceRequest> request = | |
| 637 CreateRequest(request_info, request_body, &frame_origin); | |
| 638 | 650 |
| 639 // Compute a unique request_id for this renderer process. | 651 // Compute a unique request_id for this renderer process. |
| 640 int request_id = MakeRequestID(); | 652 int request_id = MakeRequestID(); |
| 641 pending_requests_[request_id] = base::MakeUnique<PendingRequestInfo>( | 653 pending_requests_[request_id] = base::MakeUnique<PendingRequestInfo>( |
| 642 std::move(peer), request->resource_type, request->origin_pid, | 654 std::move(peer), request->resource_type, request->origin_pid, |
| 643 frame_origin, request->url, request_info.download_to_file); | 655 frame_origin, request->url, request->download_to_file); |
| 644 | 656 |
| 645 if (resource_scheduling_filter_.get() && request_info.loading_task_runner) { | 657 if (resource_scheduling_filter_.get() && loading_task_runner) { |
| 646 resource_scheduling_filter_->SetRequestIdTaskRunner( | 658 resource_scheduling_filter_->SetRequestIdTaskRunner(request_id, |
| 647 request_id, request_info.loading_task_runner); | 659 loading_task_runner); |
| 648 } | 660 } |
| 649 | 661 |
| 650 if (ipc_type == blink::WebURLRequest::LoadingIPCType::Mojo) { | 662 if (ipc_type == blink::WebURLRequest::LoadingIPCType::Mojo) { |
| 651 std::unique_ptr<URLLoaderClientImpl> client( | 663 std::unique_ptr<URLLoaderClientImpl> client( |
| 652 new URLLoaderClientImpl(request_id, this, main_thread_task_runner_)); | 664 new URLLoaderClientImpl(request_id, this, main_thread_task_runner_)); |
| 653 mojom::URLLoaderPtr url_loader; | 665 mojom::URLLoaderPtr url_loader; |
| 654 url_loader_factory->CreateLoaderAndStart( | 666 url_loader_factory->CreateLoaderAndStart( |
| 655 GetProxy(&url_loader), request_id, *request, | 667 GetProxy(&url_loader), request_id, *request, |
| 656 client->CreateInterfacePtrAndBind()); | 668 client->CreateInterfacePtrAndBind()); |
| 657 pending_requests_[request_id]->url_loader = std::move(url_loader); | 669 pending_requests_[request_id]->url_loader = std::move(url_loader); |
| 658 pending_requests_[request_id]->url_loader_client = std::move(client); | 670 pending_requests_[request_id]->url_loader_client = std::move(client); |
| 659 } else { | 671 } else { |
| 660 message_sender_->Send(new ResourceHostMsg_RequestResource( | 672 message_sender_->Send( |
| 661 request_info.routing_id, request_id, *request)); | 673 new ResourceHostMsg_RequestResource(routing_id, request_id, *request)); |
| 662 } | 674 } |
| 663 | 675 |
| 664 return request_id; | 676 return request_id; |
| 665 } | 677 } |
| 666 | 678 |
| 667 void ResourceDispatcher::ToResourceResponseInfo( | 679 void ResourceDispatcher::ToResourceResponseInfo( |
| 668 const PendingRequestInfo& request_info, | 680 const PendingRequestInfo& request_info, |
| 669 const ResourceResponseHead& browser_info, | 681 const ResourceResponseHead& browser_info, |
| 670 ResourceResponseInfo* renderer_info) const { | 682 ResourceResponseInfo* renderer_info) const { |
| 671 *renderer_info = browser_info; | 683 *renderer_info = browser_info; |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 // static | 804 // static |
| 793 void ResourceDispatcher::ReleaseResourcesInMessageQueue(MessageQueue* queue) { | 805 void ResourceDispatcher::ReleaseResourcesInMessageQueue(MessageQueue* queue) { |
| 794 while (!queue->empty()) { | 806 while (!queue->empty()) { |
| 795 IPC::Message* message = queue->front(); | 807 IPC::Message* message = queue->front(); |
| 796 ReleaseResourcesInDataMessage(*message); | 808 ReleaseResourcesInDataMessage(*message); |
| 797 queue->pop_front(); | 809 queue->pop_front(); |
| 798 delete message; | 810 delete message; |
| 799 } | 811 } |
| 800 } | 812 } |
| 801 | 813 |
| 802 std::unique_ptr<ResourceRequest> ResourceDispatcher::CreateRequest( | |
| 803 const RequestInfo& request_info, | |
| 804 ResourceRequestBodyImpl* request_body, | |
| 805 GURL* frame_origin) { | |
| 806 std::unique_ptr<ResourceRequest> request(new ResourceRequest); | |
| 807 request->method = request_info.method; | |
| 808 request->url = request_info.url; | |
| 809 request->first_party_for_cookies = request_info.first_party_for_cookies; | |
| 810 request->request_initiator = request_info.request_initiator; | |
| 811 request->referrer = request_info.referrer.url; | |
| 812 request->referrer_policy = request_info.referrer.policy; | |
| 813 request->headers = request_info.headers; | |
| 814 request->load_flags = request_info.load_flags; | |
| 815 request->origin_pid = request_info.requestor_pid; | |
| 816 request->resource_type = request_info.request_type; | |
| 817 request->priority = request_info.priority; | |
| 818 request->request_context = request_info.request_context; | |
| 819 request->appcache_host_id = request_info.appcache_host_id; | |
| 820 request->download_to_file = request_info.download_to_file; | |
| 821 request->has_user_gesture = request_info.has_user_gesture; | |
| 822 request->skip_service_worker = request_info.skip_service_worker; | |
| 823 request->should_reset_appcache = request_info.should_reset_appcache; | |
| 824 request->fetch_request_mode = request_info.fetch_request_mode; | |
| 825 request->fetch_credentials_mode = request_info.fetch_credentials_mode; | |
| 826 request->fetch_redirect_mode = request_info.fetch_redirect_mode; | |
| 827 request->fetch_request_context_type = request_info.fetch_request_context_type; | |
| 828 request->fetch_frame_type = request_info.fetch_frame_type; | |
| 829 request->enable_load_timing = request_info.enable_load_timing; | |
| 830 request->enable_upload_progress = request_info.enable_upload_progress; | |
| 831 request->do_not_prompt_for_login = request_info.do_not_prompt_for_login; | |
| 832 request->report_raw_headers = request_info.report_raw_headers; | |
| 833 request->lofi_state = request_info.lofi_state; | |
| 834 | |
| 835 if ((request_info.referrer.policy == blink::WebReferrerPolicyDefault || | |
| 836 request_info.referrer.policy == | |
| 837 blink::WebReferrerPolicyNoReferrerWhenDowngrade) && | |
| 838 request_info.referrer.url.SchemeIsCryptographic() && | |
| 839 !request_info.url.SchemeIsCryptographic()) { | |
| 840 LOG(FATAL) << "Trying to send secure referrer for insecure request " | |
| 841 << "without an appropriate referrer policy.\n" | |
| 842 << "URL = " << request_info.url << "\n" | |
| 843 << "Referrer = " << request_info.referrer.url; | |
| 844 } | |
| 845 | |
| 846 const RequestExtraData kEmptyData; | |
| 847 const RequestExtraData* extra_data; | |
| 848 if (request_info.extra_data) | |
| 849 extra_data = static_cast<RequestExtraData*>(request_info.extra_data); | |
| 850 else | |
| 851 extra_data = &kEmptyData; | |
| 852 request->visiblity_state = extra_data->visibility_state(); | |
| 853 request->render_frame_id = extra_data->render_frame_id(); | |
| 854 request->is_main_frame = extra_data->is_main_frame(); | |
| 855 request->parent_is_main_frame = extra_data->parent_is_main_frame(); | |
| 856 request->parent_render_frame_id = extra_data->parent_render_frame_id(); | |
| 857 request->allow_download = extra_data->allow_download(); | |
| 858 request->transition_type = extra_data->transition_type(); | |
| 859 request->should_replace_current_entry = | |
| 860 extra_data->should_replace_current_entry(); | |
| 861 request->transferred_request_child_id = | |
| 862 extra_data->transferred_request_child_id(); | |
| 863 request->transferred_request_request_id = | |
| 864 extra_data->transferred_request_request_id(); | |
| 865 request->service_worker_provider_id = | |
| 866 extra_data->service_worker_provider_id(); | |
| 867 request->originated_from_service_worker = | |
| 868 extra_data->originated_from_service_worker(); | |
| 869 request->request_body = request_body; | |
| 870 request->resource_body_stream_url = request_info.resource_body_stream_url; | |
| 871 request->initiated_in_secure_context = | |
| 872 extra_data->initiated_in_secure_context(); | |
| 873 request->download_to_network_cache_only = | |
| 874 extra_data->download_to_network_cache_only(); | |
| 875 if (frame_origin) | |
| 876 *frame_origin = extra_data->frame_origin(); | |
| 877 return request; | |
| 878 } | |
| 879 | |
| 880 void ResourceDispatcher::SetResourceSchedulingFilter( | 814 void ResourceDispatcher::SetResourceSchedulingFilter( |
| 881 scoped_refptr<ResourceSchedulingFilter> resource_scheduling_filter) { | 815 scoped_refptr<ResourceSchedulingFilter> resource_scheduling_filter) { |
| 882 resource_scheduling_filter_ = resource_scheduling_filter; | 816 resource_scheduling_filter_ = resource_scheduling_filter; |
| 883 } | 817 } |
| 884 | 818 |
| 885 } // namespace content | 819 } // namespace content |
| OLD | NEW |