| 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/atomic_sequence_num.h" |
| 11 #include "base/bind.h" | 12 #include "base/bind.h" |
| 12 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
| 13 #include "base/debug/alias.h" | 14 #include "base/debug/alias.h" |
| 14 #include "base/debug/dump_without_crashing.h" | 15 #include "base/debug/dump_without_crashing.h" |
| 15 #include "base/debug/stack_trace.h" | 16 #include "base/debug/stack_trace.h" |
| 16 #include "base/files/file_path.h" | 17 #include "base/files/file_path.h" |
| 17 #include "base/memory/ptr_util.h" | 18 #include "base/memory/ptr_util.h" |
| 18 #include "base/memory/shared_memory.h" | 19 #include "base/memory/shared_memory.h" |
| 19 #include "base/message_loop/message_loop.h" | 20 #include "base/message_loop/message_loop.h" |
| 20 #include "base/metrics/histogram_macros.h" | 21 #include "base/metrics/histogram_macros.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 base::debug::Alias(&last_err); | 61 base::debug::Alias(&last_err); |
| 61 #endif | 62 #endif |
| 62 CHECK(false); | 63 CHECK(false); |
| 63 } | 64 } |
| 64 | 65 |
| 65 // Each resource request is assigned an ID scoped to this process. | 66 // Each resource request is assigned an ID scoped to this process. |
| 66 int MakeRequestID() { | 67 int MakeRequestID() { |
| 67 // NOTE: The resource_dispatcher_host also needs probably unique | 68 // NOTE: The resource_dispatcher_host also needs probably unique |
| 68 // request_ids, so they count down from -2 (-1 is a special we're | 69 // request_ids, so they count down from -2 (-1 is a special we're |
| 69 // screwed value), while the renderer process counts up. | 70 // screwed value), while the renderer process counts up. |
| 70 static int next_request_id = 0; | 71 static base::StaticAtomicSequenceNumber sequence; |
| 71 return next_request_id++; | 72 return sequence.GetNext(); // We start at zero. |
| 72 } | 73 } |
| 73 | 74 |
| 74 void CheckSchemeForReferrerPolicy(const ResourceRequest& request) { | 75 void CheckSchemeForReferrerPolicy(const ResourceRequest& request) { |
| 75 if ((request.referrer_policy == blink::kWebReferrerPolicyDefault || | 76 if ((request.referrer_policy == blink::kWebReferrerPolicyDefault || |
| 76 request.referrer_policy == | 77 request.referrer_policy == |
| 77 blink::kWebReferrerPolicyNoReferrerWhenDowngrade) && | 78 blink::kWebReferrerPolicyNoReferrerWhenDowngrade) && |
| 78 request.referrer.SchemeIsCryptographic() && | 79 request.referrer.SchemeIsCryptographic() && |
| 79 !request.url.SchemeIsCryptographic()) { | 80 !request.url.SchemeIsCryptographic()) { |
| 80 LOG(FATAL) << "Trying to send secure referrer for insecure request " | 81 LOG(FATAL) << "Trying to send secure referrer for insecure request " |
| 81 << "without an appropriate referrer policy.\n" | 82 << "without an appropriate referrer policy.\n" |
| 82 << "URL = " << request.url << "\n" | 83 << "URL = " << request.url << "\n" |
| 83 << "Referrer = " << request.referrer; | 84 << "Referrer = " << request.referrer; |
| 84 } | 85 } |
| 85 } | 86 } |
| 86 | 87 |
| 87 } // namespace | 88 } // namespace |
| 88 | 89 |
| 89 ResourceDispatcher::ResourceDispatcher( | 90 ResourceDispatcher::ResourceDispatcher( |
| 90 IPC::Sender* sender, | 91 IPC::Sender* sender, |
| 91 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) | 92 scoped_refptr<base::SingleThreadTaskRunner> thread_task_runner) |
| 92 : message_sender_(sender), | 93 : message_sender_(sender), |
| 93 delegate_(NULL), | 94 delegate_(NULL), |
| 94 io_timestamp_(base::TimeTicks()), | 95 io_timestamp_(base::TimeTicks()), |
| 95 main_thread_task_runner_(main_thread_task_runner), | 96 thread_task_runner_(thread_task_runner), |
| 96 weak_factory_(this) { | 97 weak_factory_(this) {} |
| 97 } | |
| 98 | 98 |
| 99 ResourceDispatcher::~ResourceDispatcher() { | 99 ResourceDispatcher::~ResourceDispatcher() { |
| 100 } | 100 } |
| 101 | 101 |
| 102 bool ResourceDispatcher::OnMessageReceived(const IPC::Message& message) { | 102 bool ResourceDispatcher::OnMessageReceived(const IPC::Message& message) { |
| 103 if (!IsResourceDispatcherMessage(message)) { | 103 if (!IsResourceDispatcherMessage(message)) { |
| 104 return false; | 104 return false; |
| 105 } | 105 } |
| 106 | 106 |
| 107 int request_id; | 107 int request_id; |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 | 394 |
| 395 // Cancel loading. | 395 // Cancel loading. |
| 396 it->second->url_loader = nullptr; | 396 it->second->url_loader = nullptr; |
| 397 // Clear URLLoaderClient to stop receiving further Mojo IPC from the browser | 397 // Clear URLLoaderClient to stop receiving further Mojo IPC from the browser |
| 398 // process. | 398 // process. |
| 399 it->second->url_loader_client = nullptr; | 399 it->second->url_loader_client = nullptr; |
| 400 | 400 |
| 401 // Always delete the pending_request asyncly so that cancelling the request | 401 // Always delete the pending_request asyncly so that cancelling the request |
| 402 // doesn't delete the request context info while its response is still being | 402 // doesn't delete the request context info while its response is still being |
| 403 // handled. | 403 // handled. |
| 404 main_thread_task_runner_->DeleteSoon(FROM_HERE, it->second.release()); | 404 thread_task_runner_->DeleteSoon(FROM_HERE, it->second.release()); |
| 405 pending_requests_.erase(it); | 405 pending_requests_.erase(it); |
| 406 | 406 |
| 407 if (release_downloaded_file) { | 407 if (release_downloaded_file) { |
| 408 message_sender_->Send( | 408 message_sender_->Send( |
| 409 new ResourceHostMsg_ReleaseDownloadedFile(request_id)); | 409 new ResourceHostMsg_ReleaseDownloadedFile(request_id)); |
| 410 } | 410 } |
| 411 | 411 |
| 412 if (resource_scheduling_filter_.get()) | 412 if (resource_scheduling_filter_.get()) |
| 413 resource_scheduling_filter_->ClearRequestIdTaskRunner(request_id); | 413 resource_scheduling_filter_->ClearRequestIdTaskRunner(request_id); |
| 414 | 414 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 if (request_info->url_loader_client) | 463 if (request_info->url_loader_client) |
| 464 request_info->url_loader_client->SetDefersLoading(); | 464 request_info->url_loader_client->SetDefersLoading(); |
| 465 } else if (request_info->is_deferred) { | 465 } else if (request_info->is_deferred) { |
| 466 request_info->is_deferred = false; | 466 request_info->is_deferred = false; |
| 467 | 467 |
| 468 if (request_info->url_loader_client) | 468 if (request_info->url_loader_client) |
| 469 request_info->url_loader_client->UnsetDefersLoading(); | 469 request_info->url_loader_client->UnsetDefersLoading(); |
| 470 | 470 |
| 471 FollowPendingRedirect(request_id, request_info); | 471 FollowPendingRedirect(request_id, request_info); |
| 472 | 472 |
| 473 main_thread_task_runner_->PostTask( | 473 thread_task_runner_->PostTask( |
| 474 FROM_HERE, base::Bind(&ResourceDispatcher::FlushDeferredMessages, | 474 FROM_HERE, base::Bind(&ResourceDispatcher::FlushDeferredMessages, |
| 475 weak_factory_.GetWeakPtr(), request_id)); | 475 weak_factory_.GetWeakPtr(), request_id)); |
| 476 } | 476 } |
| 477 } | 477 } |
| 478 | 478 |
| 479 void ResourceDispatcher::DidChangePriority(int request_id, | 479 void ResourceDispatcher::DidChangePriority(int request_id, |
| 480 net::RequestPriority new_priority, | 480 net::RequestPriority new_priority, |
| 481 int intra_priority_value) { | 481 int intra_priority_value) { |
| 482 PendingRequestInfo* request_info = GetPendingRequestInfo(request_id); | 482 PendingRequestInfo* request_info = GetPendingRequestInfo(request_id); |
| 483 DCHECK(request_info); | 483 DCHECK(request_info); |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 632 pending_requests_[request_id] = base::MakeUnique<PendingRequestInfo>( | 632 pending_requests_[request_id] = base::MakeUnique<PendingRequestInfo>( |
| 633 std::move(peer), request->resource_type, request->origin_pid, | 633 std::move(peer), request->resource_type, request->origin_pid, |
| 634 frame_origin, request->url, request->download_to_file); | 634 frame_origin, request->url, request->download_to_file); |
| 635 | 635 |
| 636 if (resource_scheduling_filter_.get() && loading_task_runner) { | 636 if (resource_scheduling_filter_.get() && loading_task_runner) { |
| 637 resource_scheduling_filter_->SetRequestIdTaskRunner(request_id, | 637 resource_scheduling_filter_->SetRequestIdTaskRunner(request_id, |
| 638 loading_task_runner); | 638 loading_task_runner); |
| 639 } | 639 } |
| 640 | 640 |
| 641 scoped_refptr<base::SingleThreadTaskRunner> task_runner = | 641 scoped_refptr<base::SingleThreadTaskRunner> task_runner = |
| 642 loading_task_runner ? loading_task_runner : main_thread_task_runner_; | 642 loading_task_runner ? loading_task_runner : thread_task_runner_; |
| 643 | 643 |
| 644 if (consumer_handle.is_valid()) { | 644 if (consumer_handle.is_valid()) { |
| 645 pending_requests_[request_id]->url_loader_client = | 645 pending_requests_[request_id]->url_loader_client = |
| 646 base::MakeUnique<URLLoaderClientImpl>(request_id, this, task_runner); | 646 base::MakeUnique<URLLoaderClientImpl>(request_id, this, task_runner); |
| 647 | 647 |
| 648 task_runner->PostTask(FROM_HERE, | 648 task_runner->PostTask(FROM_HERE, |
| 649 base::Bind(&ResourceDispatcher::ContinueForNavigation, | 649 base::Bind(&ResourceDispatcher::ContinueForNavigation, |
| 650 weak_factory_.GetWeakPtr(), request_id, | 650 weak_factory_.GetWeakPtr(), request_id, |
| 651 base::Passed(std::move(consumer_handle)))); | 651 base::Passed(std::move(consumer_handle)))); |
| 652 | 652 |
| 653 return request_id; | 653 return request_id; |
| 654 } | 654 } |
| 655 | 655 |
| 656 if (ipc_type == blink::WebURLRequest::LoadingIPCType::kMojo) { | 656 if (ipc_type == blink::WebURLRequest::LoadingIPCType::kMojo) { |
| 657 scoped_refptr<base::SingleThreadTaskRunner> task_runner = | 657 scoped_refptr<base::SingleThreadTaskRunner> task_runner = |
| 658 loading_task_runner ? loading_task_runner : main_thread_task_runner_; | 658 loading_task_runner ? loading_task_runner : thread_task_runner_; |
| 659 std::unique_ptr<URLLoaderClientImpl> client( | 659 std::unique_ptr<URLLoaderClientImpl> client( |
| 660 new URLLoaderClientImpl(request_id, this, std::move(task_runner))); | 660 new URLLoaderClientImpl(request_id, this, std::move(task_runner))); |
| 661 mojom::URLLoaderAssociatedPtr url_loader; | 661 mojom::URLLoaderAssociatedPtr url_loader; |
| 662 mojom::URLLoaderClientPtr client_ptr; | 662 mojom::URLLoaderClientPtr client_ptr; |
| 663 client->Bind(&client_ptr); | 663 client->Bind(&client_ptr); |
| 664 url_loader_factory->CreateLoaderAndStart( | 664 url_loader_factory->CreateLoaderAndStart( |
| 665 MakeRequest(&url_loader), routing_id, request_id, | 665 MakeRequest(&url_loader), routing_id, request_id, |
| 666 mojom::kURLLoadOptionNone, *request, std::move(client_ptr)); | 666 mojom::kURLLoadOptionNone, *request, std::move(client_ptr)); |
| 667 pending_requests_[request_id]->url_loader = std::move(url_loader); | 667 pending_requests_[request_id]->url_loader = std::move(url_loader); |
| 668 pending_requests_[request_id]->url_loader_client = std::move(client); | 668 pending_requests_[request_id]->url_loader_client = std::move(client); |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 delete message; | 837 delete message; |
| 838 } | 838 } |
| 839 } | 839 } |
| 840 | 840 |
| 841 void ResourceDispatcher::SetResourceSchedulingFilter( | 841 void ResourceDispatcher::SetResourceSchedulingFilter( |
| 842 scoped_refptr<ResourceSchedulingFilter> resource_scheduling_filter) { | 842 scoped_refptr<ResourceSchedulingFilter> resource_scheduling_filter) { |
| 843 resource_scheduling_filter_ = resource_scheduling_filter; | 843 resource_scheduling_filter_ = resource_scheduling_filter; |
| 844 } | 844 } |
| 845 | 845 |
| 846 } // namespace content | 846 } // namespace content |
| OLD | NEW |