| 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/browser/loader/resource_dispatcher_host_impl.h" | 7 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| 8 | 8 |
| 9 #include <stddef.h> | 9 #include <stddef.h> |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 | 342 |
| 343 return true; | 343 return true; |
| 344 } | 344 } |
| 345 | 345 |
| 346 void RemoveDownloadFileFromChildSecurityPolicy(int child_id, | 346 void RemoveDownloadFileFromChildSecurityPolicy(int child_id, |
| 347 const base::FilePath& path) { | 347 const base::FilePath& path) { |
| 348 ChildProcessSecurityPolicyImpl::GetInstance()->RevokeAllPermissionsForFile( | 348 ChildProcessSecurityPolicyImpl::GetInstance()->RevokeAllPermissionsForFile( |
| 349 child_id, path); | 349 child_id, path); |
| 350 } | 350 } |
| 351 | 351 |
| 352 DownloadInterruptReason CallbackAndReturn( | |
| 353 const DownloadUrlParameters::OnStartedCallback& started_cb, | |
| 354 DownloadInterruptReason interrupt_reason) { | |
| 355 if (started_cb.is_null()) | |
| 356 return interrupt_reason; | |
| 357 BrowserThread::PostTask( | |
| 358 BrowserThread::UI, | |
| 359 FROM_HERE, | |
| 360 base::Bind( | |
| 361 started_cb, static_cast<DownloadItem*>(NULL), interrupt_reason)); | |
| 362 | |
| 363 return interrupt_reason; | |
| 364 } | |
| 365 | |
| 366 int GetCertID(net::URLRequest* request, int child_id) { | 352 int GetCertID(net::URLRequest* request, int child_id) { |
| 367 if (request->ssl_info().cert.get()) { | 353 if (request->ssl_info().cert.get()) { |
| 368 return CertStore::GetInstance()->StoreCert(request->ssl_info().cert.get(), | 354 return CertStore::GetInstance()->StoreCert(request->ssl_info().cert.get(), |
| 369 child_id); | 355 child_id); |
| 370 } | 356 } |
| 371 return 0; | 357 return 0; |
| 372 } | 358 } |
| 373 | 359 |
| 374 void NotifyRedirectOnUI(int render_process_id, | 360 void NotifyRedirectOnUI(int render_process_id, |
| 375 int render_frame_host, | 361 int render_frame_host, |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 649 } | 635 } |
| 650 | 636 |
| 651 DownloadInterruptReason ResourceDispatcherHostImpl::BeginDownload( | 637 DownloadInterruptReason ResourceDispatcherHostImpl::BeginDownload( |
| 652 scoped_ptr<net::URLRequest> request, | 638 scoped_ptr<net::URLRequest> request, |
| 653 const Referrer& referrer, | 639 const Referrer& referrer, |
| 654 bool is_content_initiated, | 640 bool is_content_initiated, |
| 655 ResourceContext* context, | 641 ResourceContext* context, |
| 656 int child_id, | 642 int child_id, |
| 657 int render_view_route_id, | 643 int render_view_route_id, |
| 658 int render_frame_route_id, | 644 int render_frame_route_id, |
| 659 bool prefer_cache, | 645 bool do_not_prompt_for_login) { |
| 660 bool do_not_prompt_for_login, | |
| 661 scoped_ptr<DownloadSaveInfo> save_info, | |
| 662 uint32_t download_id, | |
| 663 const DownloadStartedCallback& started_callback) { | |
| 664 if (is_shutdown_) | 646 if (is_shutdown_) |
| 665 return CallbackAndReturn(started_callback, | 647 return DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN; |
| 666 DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN); | |
| 667 | 648 |
| 668 const GURL& url = request->original_url(); | 649 const GURL& url = request->original_url(); |
| 669 | 650 |
| 670 // http://crbug.com/90971 | 651 // http://crbug.com/90971 |
| 671 char url_buf[128]; | 652 char url_buf[128]; |
| 672 base::strlcpy(url_buf, url.spec().c_str(), arraysize(url_buf)); | 653 base::strlcpy(url_buf, url.spec().c_str(), arraysize(url_buf)); |
| 673 base::debug::Alias(url_buf); | 654 base::debug::Alias(url_buf); |
| 674 CHECK(ContainsKey(active_resource_contexts_, context)); | 655 CHECK(ContainsKey(active_resource_contexts_, context)); |
| 675 | 656 |
| 676 SetReferrerForRequest(request.get(), referrer); | 657 SetReferrerForRequest(request.get(), referrer); |
| 677 | 658 |
| 678 int extra_load_flags = net::LOAD_NORMAL; | |
| 679 if (prefer_cache) { | |
| 680 // If there is upload data attached, only retrieve from cache because there | |
| 681 // is no current mechanism to prompt the user for their consent for a | |
| 682 // re-post. For GETs, try to retrieve data from the cache and skip | |
| 683 // validating the entry if present. | |
| 684 if (request->get_upload() != NULL) | |
| 685 extra_load_flags |= net::LOAD_ONLY_FROM_CACHE; | |
| 686 else | |
| 687 extra_load_flags |= net::LOAD_PREFERRING_CACHE; | |
| 688 } else { | |
| 689 extra_load_flags |= net::LOAD_DISABLE_CACHE; | |
| 690 } | |
| 691 request->SetLoadFlags(request->load_flags() | extra_load_flags); | |
| 692 | |
| 693 // We treat a download as a main frame load, and thus update the policy URL on | 659 // We treat a download as a main frame load, and thus update the policy URL on |
| 694 // redirects. | 660 // redirects. |
| 695 // | 661 // |
| 696 // TODO(davidben): Is this correct? If this came from a | 662 // TODO(davidben): Is this correct? If this came from a |
| 697 // ViewHostMsg_DownloadUrl in a frame, should it have first-party URL set | 663 // ViewHostMsg_DownloadUrl in a frame, should it have first-party URL set |
| 698 // appropriately? | 664 // appropriately? |
| 699 request->set_first_party_url_policy( | 665 request->set_first_party_url_policy( |
| 700 net::URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT); | 666 net::URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT); |
| 701 | 667 |
| 702 // Check if the renderer is permitted to request the requested URL. | 668 // Check if the renderer is permitted to request the requested URL. |
| 703 if (!ChildProcessSecurityPolicyImpl::GetInstance()-> | 669 if (!ChildProcessSecurityPolicyImpl::GetInstance()-> |
| 704 CanRequestURL(child_id, url)) { | 670 CanRequestURL(child_id, url)) { |
| 705 VLOG(1) << "Denied unauthorized download request for " | 671 DVLOG(1) << "Denied unauthorized download request for " |
| 706 << url.possibly_invalid_spec(); | 672 << url.possibly_invalid_spec(); |
| 707 return CallbackAndReturn(started_callback, | 673 return DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST; |
| 708 DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST); | |
| 709 } | 674 } |
| 710 | 675 |
| 711 request_id_--; | 676 request_id_--; |
| 712 | 677 |
| 713 const net::URLRequestContext* request_context = context->GetRequestContext(); | 678 const net::URLRequestContext* request_context = context->GetRequestContext(); |
| 714 if (!request_context->job_factory()->IsHandledURL(url)) { | 679 if (!request_context->job_factory()->IsHandledURL(url)) { |
| 715 VLOG(1) << "Download request for unsupported protocol: " | 680 DVLOG(1) << "Download request for unsupported protocol: " |
| 716 << url.possibly_invalid_spec(); | 681 << url.possibly_invalid_spec(); |
| 717 return CallbackAndReturn(started_callback, | 682 return DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST; |
| 718 DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST); | |
| 719 } | 683 } |
| 720 | 684 |
| 721 ResourceRequestInfoImpl* extra_info = | 685 ResourceRequestInfoImpl* extra_info = |
| 722 CreateRequestInfo(child_id, render_view_route_id, | 686 CreateRequestInfo(child_id, render_view_route_id, |
| 723 render_frame_route_id, true, context); | 687 render_frame_route_id, true, context); |
| 724 extra_info->set_do_not_prompt_for_login(do_not_prompt_for_login); | 688 extra_info->set_do_not_prompt_for_login(do_not_prompt_for_login); |
| 725 extra_info->AssociateWithRequest(request.get()); // Request takes ownership. | 689 extra_info->AssociateWithRequest(request.get()); // Request takes ownership. |
| 726 | 690 |
| 727 if (request->url().SchemeIs(url::kBlobScheme)) { | 691 if (request->url().SchemeIs(url::kBlobScheme)) { |
| 728 ChromeBlobStorageContext* blob_context = | 692 ChromeBlobStorageContext* blob_context = |
| 729 GetChromeBlobStorageContextForResourceContext(context); | 693 GetChromeBlobStorageContextForResourceContext(context); |
| 730 storage::BlobProtocolHandler::SetRequestedBlobDataHandle( | 694 storage::BlobProtocolHandler::SetRequestedBlobDataHandle( |
| 731 request.get(), | 695 request.get(), |
| 732 blob_context->context()->GetBlobDataFromPublicURL(request->url())); | 696 blob_context->context()->GetBlobDataFromPublicURL(request->url())); |
| 733 } | 697 } |
| 734 | 698 |
| 735 // From this point forward, the |DownloadResourceHandler| is responsible for | 699 // From this point forward, the |DownloadResourceHandler| is responsible for |
| 736 // |started_callback|. | 700 // |started_callback|. |
| 737 scoped_ptr<ResourceHandler> handler(CreateResourceHandlerForDownload( | 701 scoped_ptr<ResourceHandler> handler(CreateResourceHandlerForDownload( |
| 738 request.get(), is_content_initiated, true, download_id, | 702 request.get(), is_content_initiated, true)); |
| 739 std::move(save_info), started_callback)); | |
| 740 | 703 |
| 741 BeginRequestInternal(std::move(request), std::move(handler)); | 704 BeginRequestInternal(std::move(request), std::move(handler)); |
| 742 | 705 |
| 743 return DOWNLOAD_INTERRUPT_REASON_NONE; | 706 return DOWNLOAD_INTERRUPT_REASON_NONE; |
| 744 } | 707 } |
| 745 | 708 |
| 746 void ResourceDispatcherHostImpl::ClearLoginDelegateForRequest( | 709 void ResourceDispatcherHostImpl::ClearLoginDelegateForRequest( |
| 747 net::URLRequest* request) { | 710 net::URLRequest* request) { |
| 748 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); | 711 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); |
| 749 if (info) { | 712 if (info) { |
| 750 ResourceLoader* loader = GetLoader(info->GetGlobalRequestID()); | 713 ResourceLoader* loader = GetLoader(info->GetGlobalRequestID()); |
| 751 if (loader) | 714 if (loader) |
| 752 loader->ClearLoginDelegate(); | 715 loader->ClearLoginDelegate(); |
| 753 } | 716 } |
| 754 } | 717 } |
| 755 | 718 |
| 756 void ResourceDispatcherHostImpl::Shutdown() { | 719 void ResourceDispatcherHostImpl::Shutdown() { |
| 757 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 720 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 758 BrowserThread::PostTask(BrowserThread::IO, | 721 BrowserThread::PostTask(BrowserThread::IO, |
| 759 FROM_HERE, | 722 FROM_HERE, |
| 760 base::Bind(&ResourceDispatcherHostImpl::OnShutdown, | 723 base::Bind(&ResourceDispatcherHostImpl::OnShutdown, |
| 761 base::Unretained(this))); | 724 base::Unretained(this))); |
| 762 } | 725 } |
| 763 | 726 |
| 764 scoped_ptr<ResourceHandler> | 727 scoped_ptr<ResourceHandler> |
| 765 ResourceDispatcherHostImpl::CreateResourceHandlerForDownload( | 728 ResourceDispatcherHostImpl::CreateResourceHandlerForDownload( |
| 766 net::URLRequest* request, | 729 net::URLRequest* request, |
| 767 bool is_content_initiated, | 730 bool is_content_initiated, |
| 768 bool must_download, | 731 bool must_download) { |
| 769 uint32_t id, | 732 scoped_ptr<ResourceHandler> handler(new DownloadResourceHandler(request)); |
| 770 scoped_ptr<DownloadSaveInfo> save_info, | |
| 771 const DownloadUrlParameters::OnStartedCallback& started_cb) { | |
| 772 scoped_ptr<ResourceHandler> handler(new DownloadResourceHandler( | |
| 773 id, request, started_cb, std::move(save_info))); | |
| 774 if (delegate_) { | 733 if (delegate_) { |
| 775 const ResourceRequestInfoImpl* request_info( | 734 const ResourceRequestInfoImpl* request_info( |
| 776 ResourceRequestInfoImpl::ForRequest(request)); | 735 ResourceRequestInfoImpl::ForRequest(request)); |
| 777 | 736 |
| 778 ScopedVector<ResourceThrottle> throttles; | 737 ScopedVector<ResourceThrottle> throttles; |
| 779 delegate_->DownloadStarting( | 738 delegate_->DownloadStarting( |
| 780 request, request_info->GetContext(), request_info->GetChildID(), | 739 request, request_info->GetContext(), request_info->GetChildID(), |
| 781 request_info->GetRouteID(), request_info->GetRequestID(), | 740 request_info->GetRouteID(), request_info->GetRequestID(), |
| 782 is_content_initiated, must_download, &throttles); | 741 is_content_initiated, must_download, &throttles); |
| 783 if (!throttles.empty()) { | 742 if (!throttles.empty()) { |
| (...skipping 1777 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2561 load_flags |= net::LOAD_PREFETCH; | 2520 load_flags |= net::LOAD_PREFETCH; |
| 2562 } | 2521 } |
| 2563 | 2522 |
| 2564 if (is_sync_load) | 2523 if (is_sync_load) |
| 2565 load_flags |= net::LOAD_IGNORE_LIMITS; | 2524 load_flags |= net::LOAD_IGNORE_LIMITS; |
| 2566 | 2525 |
| 2567 return load_flags; | 2526 return load_flags; |
| 2568 } | 2527 } |
| 2569 | 2528 |
| 2570 } // namespace content | 2529 } // namespace content |
| OLD | NEW |