Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(195)

Side by Side Diff: content/child/resource_dispatcher.cc

Issue 2345253002: Remove content::RequestInfo (Closed)
Patch Set: Rebase Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/child/resource_dispatcher.h ('k') | content/child/resource_dispatcher_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « content/child/resource_dispatcher.h ('k') | content/child/resource_dispatcher_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698