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 10 matching lines...) Expand all Loading... | |
21 #include "base/metrics/histogram.h" | 21 #include "base/metrics/histogram.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" | 26 #include "content/child/request_info.h" |
27 #include "content/child/resource_scheduling_filter.h" | 27 #include "content/child/resource_scheduling_filter.h" |
28 #include "content/child/shared_memory_received_data_factory.h" | 28 #include "content/child/shared_memory_received_data_factory.h" |
29 #include "content/child/site_isolation_stats_gatherer.h" | 29 #include "content/child/site_isolation_stats_gatherer.h" |
30 #include "content/child/sync_load_response.h" | 30 #include "content/child/sync_load_response.h" |
31 #include "content/child/url_response_body_consumer.h" | |
31 #include "content/common/inter_process_time_ticks_converter.h" | 32 #include "content/common/inter_process_time_ticks_converter.h" |
32 #include "content/common/navigation_params.h" | 33 #include "content/common/navigation_params.h" |
33 #include "content/common/resource_messages.h" | 34 #include "content/common/resource_messages.h" |
34 #include "content/common/resource_request.h" | 35 #include "content/common/resource_request.h" |
35 #include "content/common/resource_request_completion_status.h" | 36 #include "content/common/resource_request_completion_status.h" |
36 #include "content/public/child/fixed_received_data.h" | 37 #include "content/public/child/fixed_received_data.h" |
37 #include "content/public/child/request_peer.h" | 38 #include "content/public/child/request_peer.h" |
38 #include "content/public/child/resource_dispatcher_delegate.h" | 39 #include "content/public/child/resource_dispatcher_delegate.h" |
39 #include "content/public/common/content_features.h" | 40 #include "content/public/common/content_features.h" |
40 #include "content/public/common/resource_response.h" | 41 #include "content/public/common/resource_response.h" |
41 #include "content/public/common/resource_type.h" | 42 #include "content/public/common/resource_type.h" |
43 #include "mojo/public/cpp/bindings/binding.h" | |
42 #include "net/base/net_errors.h" | 44 #include "net/base/net_errors.h" |
43 #include "net/base/request_priority.h" | 45 #include "net/base/request_priority.h" |
44 #include "net/http/http_response_headers.h" | 46 #include "net/http/http_response_headers.h" |
45 | 47 |
46 namespace content { | 48 namespace content { |
47 | 49 |
48 namespace { | 50 namespace { |
49 | 51 |
50 // Converts |time| from a remote to local TimeTicks, overwriting the original | 52 // Converts |time| from a remote to local TimeTicks, overwriting the original |
51 // value. | 53 // value. |
(...skipping 14 matching lines...) Expand all Loading... | |
66 | 68 |
67 // Each resource request is assigned an ID scoped to this process. | 69 // Each resource request is assigned an ID scoped to this process. |
68 int MakeRequestID() { | 70 int MakeRequestID() { |
69 // NOTE: The resource_dispatcher_host also needs probably unique | 71 // NOTE: The resource_dispatcher_host also needs probably unique |
70 // request_ids, so they count down from -2 (-1 is a special we're | 72 // request_ids, so they count down from -2 (-1 is a special we're |
71 // screwed value), while the renderer process counts up. | 73 // screwed value), while the renderer process counts up. |
72 static int next_request_id = 0; | 74 static int next_request_id = 0; |
73 return next_request_id++; | 75 return next_request_id++; |
74 } | 76 } |
75 | 77 |
78 class URLLoaderClientImpl final : public mojom::URLLoaderClient { | |
79 public: | |
80 URLLoaderClientImpl(int request_id, ResourceDispatcher* resource_dispatcher) | |
81 : binding_(this), | |
82 request_id_(request_id), | |
83 resource_dispatcher_(resource_dispatcher) {} | |
84 ~URLLoaderClientImpl() override { | |
85 if (body_consumer_) | |
86 body_consumer_->Cancel(); | |
87 } | |
88 | |
89 void OnReceiveResponse(const ResourceResponseHead& response_head, | |
90 mojo::ScopedDataPipeConsumerHandle body) override { | |
91 body_consumer_ = new URLResponseBodyConsumer( | |
kinuko
2016/05/20 09:38:51
nit: DCHECK(!body_consumer_) to make sure?
yhirano
2016/05/20 11:32:54
Done.
| |
92 request_id_, resource_dispatcher_, std::move(body)); | |
93 | |
94 resource_dispatcher_->OnMessageReceived( | |
95 ResourceMsg_ReceivedResponse(request_id_, response_head)); | |
96 } | |
97 void OnComplete(const ResourceRequestCompletionStatus& status) override { | |
98 body_consumer_->OnComplete(status); | |
99 } | |
100 | |
101 mojom::URLLoaderClientPtr CreateInterfacePtrAndBind() { | |
102 return binding_.CreateInterfacePtrAndBind(); | |
103 } | |
104 | |
105 private: | |
106 mojo::Binding<mojom::URLLoaderClient> binding_; | |
107 scoped_refptr<URLResponseBodyConsumer> body_consumer_; | |
108 const int request_id_; | |
109 ResourceDispatcher* const resource_dispatcher_; | |
110 }; | |
111 | |
76 } // namespace | 112 } // namespace |
77 | 113 |
78 ResourceDispatcher::ResourceDispatcher( | 114 ResourceDispatcher::ResourceDispatcher( |
79 IPC::Sender* sender, | 115 IPC::Sender* sender, |
80 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) | 116 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) |
81 : message_sender_(sender), | 117 : message_sender_(sender), |
82 delegate_(NULL), | 118 delegate_(NULL), |
83 io_timestamp_(base::TimeTicks()), | 119 io_timestamp_(base::TimeTicks()), |
84 main_thread_task_runner_(main_thread_task_runner), | 120 main_thread_task_runner_(main_thread_task_runner), |
85 weak_factory_(this) { | 121 weak_factory_(this) { |
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
537 if (pending_request->is_deferred) { | 573 if (pending_request->is_deferred) { |
538 pending_request->deferred_message_queue.swap(q); | 574 pending_request->deferred_message_queue.swap(q); |
539 return; | 575 return; |
540 } | 576 } |
541 } | 577 } |
542 } | 578 } |
543 } | 579 } |
544 | 580 |
545 void ResourceDispatcher::StartSync(const RequestInfo& request_info, | 581 void ResourceDispatcher::StartSync(const RequestInfo& request_info, |
546 ResourceRequestBody* request_body, | 582 ResourceRequestBody* request_body, |
547 SyncLoadResponse* response) { | 583 SyncLoadResponse* response, |
584 mojom::URLLoaderPtr url_loader) { | |
kinuko
2016/05/20 09:38:51
This one's not used (yet), but you still wanted to
yhirano
2016/05/20 11:32:54
Yes.
| |
548 std::unique_ptr<ResourceRequest> request = | 585 std::unique_ptr<ResourceRequest> request = |
549 CreateRequest(request_info, request_body, NULL); | 586 CreateRequest(request_info, request_body, NULL); |
550 | 587 |
551 SyncLoadResult result; | 588 SyncLoadResult result; |
552 IPC::SyncMessage* msg = new ResourceHostMsg_SyncLoad( | 589 IPC::SyncMessage* msg = new ResourceHostMsg_SyncLoad( |
553 request_info.routing_id, MakeRequestID(), *request, &result); | 590 request_info.routing_id, MakeRequestID(), *request, &result); |
554 | 591 |
555 // NOTE: This may pump events (see RenderThread::Send). | 592 // NOTE: This may pump events (see RenderThread::Send). |
556 if (!message_sender_->Send(msg)) { | 593 if (!message_sender_->Send(msg)) { |
557 response->error_code = net::ERR_FAILED; | 594 response->error_code = net::ERR_FAILED; |
(...skipping 10 matching lines...) Expand all Loading... | |
568 response->encoded_data_length = result.encoded_data_length; | 605 response->encoded_data_length = result.encoded_data_length; |
569 response->load_timing = result.load_timing; | 606 response->load_timing = result.load_timing; |
570 response->devtools_info = result.devtools_info; | 607 response->devtools_info = result.devtools_info; |
571 response->data.swap(result.data); | 608 response->data.swap(result.data); |
572 response->download_file_path = result.download_file_path; | 609 response->download_file_path = result.download_file_path; |
573 response->socket_address = result.socket_address; | 610 response->socket_address = result.socket_address; |
574 } | 611 } |
575 | 612 |
576 int ResourceDispatcher::StartAsync(const RequestInfo& request_info, | 613 int ResourceDispatcher::StartAsync(const RequestInfo& request_info, |
577 ResourceRequestBody* request_body, | 614 ResourceRequestBody* request_body, |
578 std::unique_ptr<RequestPeer> peer) { | 615 std::unique_ptr<RequestPeer> peer, |
616 mojom::URLLoaderPtr url_loader) { | |
579 GURL frame_origin; | 617 GURL frame_origin; |
580 std::unique_ptr<ResourceRequest> request = | 618 std::unique_ptr<ResourceRequest> request = |
581 CreateRequest(request_info, request_body, &frame_origin); | 619 CreateRequest(request_info, request_body, &frame_origin); |
582 | 620 |
583 // Compute a unique request_id for this renderer process. | 621 // Compute a unique request_id for this renderer process. |
584 int request_id = MakeRequestID(); | 622 int request_id = MakeRequestID(); |
585 pending_requests_[request_id] = base::WrapUnique(new PendingRequestInfo( | 623 pending_requests_[request_id] = base::WrapUnique(new PendingRequestInfo( |
586 std::move(peer), request->resource_type, request->origin_pid, | 624 std::move(peer), request->resource_type, request->origin_pid, |
587 frame_origin, request->url, request_info.download_to_file)); | 625 frame_origin, request->url, request_info.download_to_file)); |
588 | 626 |
589 if (resource_scheduling_filter_.get() && | 627 if (resource_scheduling_filter_.get() && |
590 request_info.loading_web_task_runner) { | 628 request_info.loading_web_task_runner) { |
591 resource_scheduling_filter_->SetRequestIdTaskRunner( | 629 resource_scheduling_filter_->SetRequestIdTaskRunner( |
592 request_id, | 630 request_id, |
593 base::WrapUnique(request_info.loading_web_task_runner->clone())); | 631 base::WrapUnique(request_info.loading_web_task_runner->clone())); |
594 } | 632 } |
595 | 633 |
596 message_sender_->Send(new ResourceHostMsg_RequestResource( | 634 if (url_loader) { |
597 request_info.routing_id, request_id, *request)); | 635 std::unique_ptr<URLLoaderClientImpl> client( |
636 new URLLoaderClientImpl(request_id, this)); | |
637 url_loader->Load(request_id, *request, | |
638 client->CreateInterfacePtrAndBind()); | |
639 pending_requests_[request_id]->url_loader = std::move(url_loader); | |
640 pending_requests_[request_id]->url_loader_client = std::move(client); | |
641 } else { | |
642 message_sender_->Send(new ResourceHostMsg_RequestResource( | |
643 request_info.routing_id, request_id, *request)); | |
644 } | |
598 | 645 |
599 return request_id; | 646 return request_id; |
600 } | 647 } |
601 | 648 |
602 void ResourceDispatcher::ToResourceResponseInfo( | 649 void ResourceDispatcher::ToResourceResponseInfo( |
603 const PendingRequestInfo& request_info, | 650 const PendingRequestInfo& request_info, |
604 const ResourceResponseHead& browser_info, | 651 const ResourceResponseHead& browser_info, |
605 ResourceResponseInfo* renderer_info) const { | 652 ResourceResponseInfo* renderer_info) const { |
606 *renderer_info = browser_info; | 653 *renderer_info = browser_info; |
607 if (request_info.request_start.is_null() || | 654 if (request_info.request_start.is_null() || |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
806 *frame_origin = extra_data->frame_origin(); | 853 *frame_origin = extra_data->frame_origin(); |
807 return request; | 854 return request; |
808 } | 855 } |
809 | 856 |
810 void ResourceDispatcher::SetResourceSchedulingFilter( | 857 void ResourceDispatcher::SetResourceSchedulingFilter( |
811 scoped_refptr<ResourceSchedulingFilter> resource_scheduling_filter) { | 858 scoped_refptr<ResourceSchedulingFilter> resource_scheduling_filter) { |
812 resource_scheduling_filter_ = resource_scheduling_filter; | 859 resource_scheduling_filter_ = resource_scheduling_filter; |
813 } | 860 } |
814 | 861 |
815 } // namespace content | 862 } // namespace content |
OLD | NEW |