Chromium Code Reviews| 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) override { | |
| 90 resource_dispatcher_->OnMessageReceived( | |
| 91 ResourceMsg_ReceivedResponse(request_id_, response_head)); | |
| 92 } | |
| 93 | |
| 94 void OnStartLoadingResponseBody( | |
| 95 mojo::ScopedDataPipeConsumerHandle body) override { | |
| 96 DCHECK(!body_consumer_); | |
| 97 body_consumer_ = new URLResponseBodyConsumer( | |
| 98 request_id_, resource_dispatcher_, std::move(body)); | |
| 99 } | |
| 100 | |
| 101 void OnComplete(const ResourceRequestCompletionStatus& status) override { | |
| 102 body_consumer_->OnComplete(status); | |
| 103 } | |
| 104 | |
| 105 mojom::URLLoaderClientPtr CreateInterfacePtrAndBind() { | |
| 106 return binding_.CreateInterfacePtrAndBind(); | |
| 107 } | |
| 108 | |
| 109 private: | |
| 110 mojo::Binding<mojom::URLLoaderClient> binding_; | |
| 111 scoped_refptr<URLResponseBodyConsumer> body_consumer_; | |
| 112 const int request_id_; | |
| 113 ResourceDispatcher* const resource_dispatcher_; | |
| 114 }; | |
| 115 | |
| 76 } // namespace | 116 } // namespace |
| 77 | 117 |
| 78 ResourceDispatcher::ResourceDispatcher( | 118 ResourceDispatcher::ResourceDispatcher( |
| 79 IPC::Sender* sender, | 119 IPC::Sender* sender, |
| 80 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) | 120 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) |
| 81 : message_sender_(sender), | 121 : message_sender_(sender), |
| 82 delegate_(NULL), | 122 delegate_(NULL), |
| 83 io_timestamp_(base::TimeTicks()), | 123 io_timestamp_(base::TimeTicks()), |
| 84 main_thread_task_runner_(main_thread_task_runner), | 124 main_thread_task_runner_(main_thread_task_runner), |
| 85 weak_factory_(this) { | 125 weak_factory_(this) { |
| (...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 535 if (index != pending_requests_.end()) { | 575 if (index != pending_requests_.end()) { |
| 536 PendingRequestInfo* pending_request = index->second.get(); | 576 PendingRequestInfo* pending_request = index->second.get(); |
| 537 if (pending_request->is_deferred) { | 577 if (pending_request->is_deferred) { |
| 538 pending_request->deferred_message_queue.swap(q); | 578 pending_request->deferred_message_queue.swap(q); |
| 539 return; | 579 return; |
| 540 } | 580 } |
| 541 } | 581 } |
| 542 } | 582 } |
| 543 } | 583 } |
| 544 | 584 |
| 545 void ResourceDispatcher::StartSync(const RequestInfo& request_info, | 585 void ResourceDispatcher::StartSync( |
| 546 ResourceRequestBody* request_body, | 586 const RequestInfo& request_info, |
| 547 SyncLoadResponse* response) { | 587 ResourceRequestBody* request_body, |
| 588 SyncLoadResponse* response, | |
| 589 blink::WebURLRequest::LoadingIPCType ipc_type, | |
| 590 mojom::URLLoaderFactory* url_loader_factory) { | |
| 548 std::unique_ptr<ResourceRequest> request = | 591 std::unique_ptr<ResourceRequest> request = |
| 549 CreateRequest(request_info, request_body, NULL); | 592 CreateRequest(request_info, request_body, NULL); |
| 593 DCHECK_EQ(blink::WebURLRequest::LoadingIPCType::ChromeIPC, ipc_type); | |
|
kinuko
2016/06/14 08:45:29
Add TODO to use url_loader_factory otherwise?
yhirano
2016/07/12 10:49:11
Done.
| |
| 550 | 594 |
| 551 SyncLoadResult result; | 595 SyncLoadResult result; |
| 552 IPC::SyncMessage* msg = new ResourceHostMsg_SyncLoad( | 596 IPC::SyncMessage* msg = new ResourceHostMsg_SyncLoad( |
| 553 request_info.routing_id, MakeRequestID(), *request, &result); | 597 request_info.routing_id, MakeRequestID(), *request, &result); |
| 554 | 598 |
| 555 // NOTE: This may pump events (see RenderThread::Send). | 599 // NOTE: This may pump events (see RenderThread::Send). |
| 556 if (!message_sender_->Send(msg)) { | 600 if (!message_sender_->Send(msg)) { |
| 557 response->error_code = net::ERR_FAILED; | 601 response->error_code = net::ERR_FAILED; |
| 558 return; | 602 return; |
| 559 } | 603 } |
| 560 | 604 |
| 561 response->error_code = result.error_code; | 605 response->error_code = result.error_code; |
| 562 response->url = result.final_url; | 606 response->url = result.final_url; |
| 563 response->headers = result.headers; | 607 response->headers = result.headers; |
| 564 response->mime_type = result.mime_type; | 608 response->mime_type = result.mime_type; |
| 565 response->charset = result.charset; | 609 response->charset = result.charset; |
| 566 response->request_time = result.request_time; | 610 response->request_time = result.request_time; |
| 567 response->response_time = result.response_time; | 611 response->response_time = result.response_time; |
| 568 response->encoded_data_length = result.encoded_data_length; | 612 response->encoded_data_length = result.encoded_data_length; |
| 569 response->load_timing = result.load_timing; | 613 response->load_timing = result.load_timing; |
| 570 response->devtools_info = result.devtools_info; | 614 response->devtools_info = result.devtools_info; |
| 571 response->data.swap(result.data); | 615 response->data.swap(result.data); |
| 572 response->download_file_path = result.download_file_path; | 616 response->download_file_path = result.download_file_path; |
| 573 response->socket_address = result.socket_address; | 617 response->socket_address = result.socket_address; |
| 574 } | 618 } |
| 575 | 619 |
| 576 int ResourceDispatcher::StartAsync(const RequestInfo& request_info, | 620 int ResourceDispatcher::StartAsync( |
| 577 ResourceRequestBody* request_body, | 621 const RequestInfo& request_info, |
| 578 std::unique_ptr<RequestPeer> peer) { | 622 ResourceRequestBody* request_body, |
| 623 std::unique_ptr<RequestPeer> peer, | |
| 624 blink::WebURLRequest::LoadingIPCType ipc_type, | |
| 625 mojom::URLLoaderFactory* url_loader_factory) { | |
| 579 GURL frame_origin; | 626 GURL frame_origin; |
| 580 std::unique_ptr<ResourceRequest> request = | 627 std::unique_ptr<ResourceRequest> request = |
| 581 CreateRequest(request_info, request_body, &frame_origin); | 628 CreateRequest(request_info, request_body, &frame_origin); |
| 582 | 629 |
| 583 // Compute a unique request_id for this renderer process. | 630 // Compute a unique request_id for this renderer process. |
| 584 int request_id = MakeRequestID(); | 631 int request_id = MakeRequestID(); |
| 585 pending_requests_[request_id] = base::WrapUnique(new PendingRequestInfo( | 632 pending_requests_[request_id] = base::WrapUnique(new PendingRequestInfo( |
| 586 std::move(peer), request->resource_type, request->origin_pid, | 633 std::move(peer), request->resource_type, request->origin_pid, |
| 587 frame_origin, request->url, request_info.download_to_file)); | 634 frame_origin, request->url, request_info.download_to_file)); |
| 588 | 635 |
| 589 if (resource_scheduling_filter_.get() && | 636 if (resource_scheduling_filter_.get() && |
| 590 request_info.loading_web_task_runner) { | 637 request_info.loading_web_task_runner) { |
| 591 resource_scheduling_filter_->SetRequestIdTaskRunner( | 638 resource_scheduling_filter_->SetRequestIdTaskRunner( |
| 592 request_id, | 639 request_id, |
| 593 base::WrapUnique(request_info.loading_web_task_runner->clone())); | 640 base::WrapUnique(request_info.loading_web_task_runner->clone())); |
| 594 } | 641 } |
| 595 | 642 |
| 596 message_sender_->Send(new ResourceHostMsg_RequestResource( | 643 if (ipc_type == blink::WebURLRequest::LoadingIPCType::Mojo) { |
| 597 request_info.routing_id, request_id, *request)); | 644 std::unique_ptr<URLLoaderClientImpl> client( |
| 645 new URLLoaderClientImpl(request_id, this)); | |
| 646 mojom::URLLoaderPtr url_loader; | |
| 647 url_loader_factory->CreateLoaderAndStart( | |
| 648 GetProxy(&url_loader), request_id, *request, | |
| 649 client->CreateInterfacePtrAndBind()); | |
| 650 pending_requests_[request_id]->url_loader = std::move(url_loader); | |
| 651 pending_requests_[request_id]->url_loader_client = std::move(client); | |
| 652 } else { | |
| 653 message_sender_->Send(new ResourceHostMsg_RequestResource( | |
| 654 request_info.routing_id, request_id, *request)); | |
| 655 } | |
| 598 | 656 |
| 599 return request_id; | 657 return request_id; |
| 600 } | 658 } |
| 601 | 659 |
| 602 void ResourceDispatcher::ToResourceResponseInfo( | 660 void ResourceDispatcher::ToResourceResponseInfo( |
| 603 const PendingRequestInfo& request_info, | 661 const PendingRequestInfo& request_info, |
| 604 const ResourceResponseHead& browser_info, | 662 const ResourceResponseHead& browser_info, |
| 605 ResourceResponseInfo* renderer_info) const { | 663 ResourceResponseInfo* renderer_info) const { |
| 606 *renderer_info = browser_info; | 664 *renderer_info = browser_info; |
| 607 if (request_info.request_start.is_null() || | 665 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(); | 864 *frame_origin = extra_data->frame_origin(); |
| 807 return request; | 865 return request; |
| 808 } | 866 } |
| 809 | 867 |
| 810 void ResourceDispatcher::SetResourceSchedulingFilter( | 868 void ResourceDispatcher::SetResourceSchedulingFilter( |
| 811 scoped_refptr<ResourceSchedulingFilter> resource_scheduling_filter) { | 869 scoped_refptr<ResourceSchedulingFilter> resource_scheduling_filter) { |
| 812 resource_scheduling_filter_ = resource_scheduling_filter; | 870 resource_scheduling_filter_ = resource_scheduling_filter; |
| 813 } | 871 } |
| 814 | 872 |
| 815 } // namespace content | 873 } // namespace content |
| OLD | NEW |