| 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 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 | 343 |
| 344 return true; | 344 return true; |
| 345 } | 345 } |
| 346 | 346 |
| 347 void RemoveDownloadFileFromChildSecurityPolicy(int child_id, | 347 void RemoveDownloadFileFromChildSecurityPolicy(int child_id, |
| 348 const base::FilePath& path) { | 348 const base::FilePath& path) { |
| 349 ChildProcessSecurityPolicyImpl::GetInstance()->RevokeAllPermissionsForFile( | 349 ChildProcessSecurityPolicyImpl::GetInstance()->RevokeAllPermissionsForFile( |
| 350 child_id, path); | 350 child_id, path); |
| 351 } | 351 } |
| 352 | 352 |
| 353 DownloadInterruptReason CallbackAndReturn( | |
| 354 const DownloadUrlParameters::OnStartedCallback& started_cb, | |
| 355 DownloadInterruptReason interrupt_reason) { | |
| 356 if (started_cb.is_null()) | |
| 357 return interrupt_reason; | |
| 358 BrowserThread::PostTask( | |
| 359 BrowserThread::UI, | |
| 360 FROM_HERE, | |
| 361 base::Bind( | |
| 362 started_cb, static_cast<DownloadItem*>(NULL), interrupt_reason)); | |
| 363 | |
| 364 return interrupt_reason; | |
| 365 } | |
| 366 | |
| 367 int GetCertID(net::URLRequest* request, int child_id) { | 353 int GetCertID(net::URLRequest* request, int child_id) { |
| 368 if (request->ssl_info().cert.get()) { | 354 if (request->ssl_info().cert.get()) { |
| 369 return CertStore::GetInstance()->StoreCert(request->ssl_info().cert.get(), | 355 return CertStore::GetInstance()->StoreCert(request->ssl_info().cert.get(), |
| 370 child_id); | 356 child_id); |
| 371 } | 357 } |
| 372 return 0; | 358 return 0; |
| 373 } | 359 } |
| 374 | 360 |
| 375 void NotifyRedirectOnUI(int render_process_id, | 361 void NotifyRedirectOnUI(int render_process_id, |
| 376 int render_frame_host, | 362 int render_frame_host, |
| (...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 } | 744 } |
| 759 | 745 |
| 760 DownloadInterruptReason ResourceDispatcherHostImpl::BeginDownload( | 746 DownloadInterruptReason ResourceDispatcherHostImpl::BeginDownload( |
| 761 scoped_ptr<net::URLRequest> request, | 747 scoped_ptr<net::URLRequest> request, |
| 762 const Referrer& referrer, | 748 const Referrer& referrer, |
| 763 bool is_content_initiated, | 749 bool is_content_initiated, |
| 764 ResourceContext* context, | 750 ResourceContext* context, |
| 765 int child_id, | 751 int child_id, |
| 766 int render_view_route_id, | 752 int render_view_route_id, |
| 767 int render_frame_route_id, | 753 int render_frame_route_id, |
| 768 bool prefer_cache, | 754 bool do_not_prompt_for_login) { |
| 769 bool do_not_prompt_for_login, | |
| 770 scoped_ptr<DownloadSaveInfo> save_info, | |
| 771 uint32_t download_id, | |
| 772 const DownloadStartedCallback& started_callback) { | |
| 773 if (is_shutdown_) | 755 if (is_shutdown_) |
| 774 return CallbackAndReturn(started_callback, | 756 return DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN; |
| 775 DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN); | |
| 776 | 757 |
| 777 const GURL& url = request->original_url(); | 758 const GURL& url = request->original_url(); |
| 778 | 759 |
| 779 // http://crbug.com/90971 | 760 // http://crbug.com/90971 |
| 780 char url_buf[128]; | 761 char url_buf[128]; |
| 781 base::strlcpy(url_buf, url.spec().c_str(), arraysize(url_buf)); | 762 base::strlcpy(url_buf, url.spec().c_str(), arraysize(url_buf)); |
| 782 base::debug::Alias(url_buf); | 763 base::debug::Alias(url_buf); |
| 783 CHECK(ContainsKey(active_resource_contexts_, context)); | 764 CHECK(ContainsKey(active_resource_contexts_, context)); |
| 784 | 765 |
| 785 SetReferrerForRequest(request.get(), referrer); | 766 SetReferrerForRequest(request.get(), referrer); |
| 786 | 767 |
| 787 int extra_load_flags = net::LOAD_NORMAL; | |
| 788 if (prefer_cache) { | |
| 789 // If there is upload data attached, only retrieve from cache because there | |
| 790 // is no current mechanism to prompt the user for their consent for a | |
| 791 // re-post. For GETs, try to retrieve data from the cache and skip | |
| 792 // validating the entry if present. | |
| 793 if (request->get_upload() != NULL) | |
| 794 extra_load_flags |= net::LOAD_ONLY_FROM_CACHE; | |
| 795 else | |
| 796 extra_load_flags |= net::LOAD_PREFERRING_CACHE; | |
| 797 } else { | |
| 798 extra_load_flags |= net::LOAD_DISABLE_CACHE; | |
| 799 } | |
| 800 request->SetLoadFlags(request->load_flags() | extra_load_flags); | |
| 801 | |
| 802 // We treat a download as a main frame load, and thus update the policy URL on | 768 // We treat a download as a main frame load, and thus update the policy URL on |
| 803 // redirects. | 769 // redirects. |
| 804 // | 770 // |
| 805 // TODO(davidben): Is this correct? If this came from a | 771 // TODO(davidben): Is this correct? If this came from a |
| 806 // ViewHostMsg_DownloadUrl in a frame, should it have first-party URL set | 772 // ViewHostMsg_DownloadUrl in a frame, should it have first-party URL set |
| 807 // appropriately? | 773 // appropriately? |
| 808 request->set_first_party_url_policy( | 774 request->set_first_party_url_policy( |
| 809 net::URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT); | 775 net::URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT); |
| 810 | 776 |
| 811 // Check if the renderer is permitted to request the requested URL. | 777 // Check if the renderer is permitted to request the requested URL. |
| 812 if (!ChildProcessSecurityPolicyImpl::GetInstance()-> | 778 if (!ChildProcessSecurityPolicyImpl::GetInstance()-> |
| 813 CanRequestURL(child_id, url)) { | 779 CanRequestURL(child_id, url)) { |
| 814 VLOG(1) << "Denied unauthorized download request for " | 780 DVLOG(1) << "Denied unauthorized download request for " |
| 815 << url.possibly_invalid_spec(); | 781 << url.possibly_invalid_spec(); |
| 816 return CallbackAndReturn(started_callback, | 782 return DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST; |
| 817 DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST); | |
| 818 } | 783 } |
| 819 | 784 |
| 820 request_id_--; | 785 request_id_--; |
| 821 | 786 |
| 822 const net::URLRequestContext* request_context = context->GetRequestContext(); | 787 const net::URLRequestContext* request_context = context->GetRequestContext(); |
| 823 if (!request_context->job_factory()->IsHandledURL(url)) { | 788 if (!request_context->job_factory()->IsHandledURL(url)) { |
| 824 VLOG(1) << "Download request for unsupported protocol: " | 789 DVLOG(1) << "Download request for unsupported protocol: " |
| 825 << url.possibly_invalid_spec(); | 790 << url.possibly_invalid_spec(); |
| 826 return CallbackAndReturn(started_callback, | 791 return DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST; |
| 827 DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST); | |
| 828 } | 792 } |
| 829 | 793 |
| 830 ResourceRequestInfoImpl* extra_info = | 794 ResourceRequestInfoImpl* extra_info = |
| 831 CreateRequestInfo(child_id, render_view_route_id, | 795 CreateRequestInfo(child_id, render_view_route_id, |
| 832 render_frame_route_id, true, context); | 796 render_frame_route_id, true, context); |
| 833 extra_info->set_do_not_prompt_for_login(do_not_prompt_for_login); | 797 extra_info->set_do_not_prompt_for_login(do_not_prompt_for_login); |
| 834 extra_info->AssociateWithRequest(request.get()); // Request takes ownership. | 798 extra_info->AssociateWithRequest(request.get()); // Request takes ownership. |
| 835 | 799 |
| 836 if (request->url().SchemeIs(url::kBlobScheme)) { | 800 if (request->url().SchemeIs(url::kBlobScheme)) { |
| 837 ChromeBlobStorageContext* blob_context = | 801 ChromeBlobStorageContext* blob_context = |
| 838 GetChromeBlobStorageContextForResourceContext(context); | 802 GetChromeBlobStorageContextForResourceContext(context); |
| 839 storage::BlobProtocolHandler::SetRequestedBlobDataHandle( | 803 storage::BlobProtocolHandler::SetRequestedBlobDataHandle( |
| 840 request.get(), | 804 request.get(), |
| 841 blob_context->context()->GetBlobDataFromPublicURL(request->url())); | 805 blob_context->context()->GetBlobDataFromPublicURL(request->url())); |
| 842 } | 806 } |
| 843 | 807 |
| 844 // From this point forward, the |DownloadResourceHandler| is responsible for | 808 // From this point forward, the |DownloadResourceHandler| is responsible for |
| 845 // |started_callback|. | 809 // |started_callback|. |
| 846 scoped_ptr<ResourceHandler> handler(CreateResourceHandlerForDownload( | 810 scoped_ptr<ResourceHandler> handler(CreateResourceHandlerForDownload( |
| 847 request.get(), is_content_initiated, true, download_id, | 811 request.get(), is_content_initiated, true)); |
| 848 std::move(save_info), started_callback)); | |
| 849 | 812 |
| 850 BeginRequestInternal(std::move(request), std::move(handler)); | 813 BeginRequestInternal(std::move(request), std::move(handler)); |
| 851 | 814 |
| 852 return DOWNLOAD_INTERRUPT_REASON_NONE; | 815 return DOWNLOAD_INTERRUPT_REASON_NONE; |
| 853 } | 816 } |
| 854 | 817 |
| 855 void ResourceDispatcherHostImpl::ClearLoginDelegateForRequest( | 818 void ResourceDispatcherHostImpl::ClearLoginDelegateForRequest( |
| 856 net::URLRequest* request) { | 819 net::URLRequest* request) { |
| 857 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); | 820 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); |
| 858 if (info) { | 821 if (info) { |
| 859 ResourceLoader* loader = GetLoader(info->GetGlobalRequestID()); | 822 ResourceLoader* loader = GetLoader(info->GetGlobalRequestID()); |
| 860 if (loader) | 823 if (loader) |
| 861 loader->ClearLoginDelegate(); | 824 loader->ClearLoginDelegate(); |
| 862 } | 825 } |
| 863 } | 826 } |
| 864 | 827 |
| 865 void ResourceDispatcherHostImpl::Shutdown() { | 828 void ResourceDispatcherHostImpl::Shutdown() { |
| 866 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 829 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 867 BrowserThread::PostTask(BrowserThread::IO, | 830 BrowserThread::PostTask(BrowserThread::IO, |
| 868 FROM_HERE, | 831 FROM_HERE, |
| 869 base::Bind(&ResourceDispatcherHostImpl::OnShutdown, | 832 base::Bind(&ResourceDispatcherHostImpl::OnShutdown, |
| 870 base::Unretained(this))); | 833 base::Unretained(this))); |
| 871 } | 834 } |
| 872 | 835 |
| 873 scoped_ptr<ResourceHandler> | 836 scoped_ptr<ResourceHandler> |
| 874 ResourceDispatcherHostImpl::CreateResourceHandlerForDownload( | 837 ResourceDispatcherHostImpl::CreateResourceHandlerForDownload( |
| 875 net::URLRequest* request, | 838 net::URLRequest* request, |
| 876 bool is_content_initiated, | 839 bool is_content_initiated, |
| 877 bool must_download, | 840 bool must_download) { |
| 878 uint32_t id, | 841 scoped_ptr<ResourceHandler> handler(new DownloadResourceHandler(request)); |
| 879 scoped_ptr<DownloadSaveInfo> save_info, | |
| 880 const DownloadUrlParameters::OnStartedCallback& started_cb) { | |
| 881 scoped_ptr<ResourceHandler> handler(new DownloadResourceHandler( | |
| 882 id, request, started_cb, std::move(save_info))); | |
| 883 if (delegate_) { | 842 if (delegate_) { |
| 884 const ResourceRequestInfoImpl* request_info( | 843 const ResourceRequestInfoImpl* request_info( |
| 885 ResourceRequestInfoImpl::ForRequest(request)); | 844 ResourceRequestInfoImpl::ForRequest(request)); |
| 886 | 845 |
| 887 ScopedVector<ResourceThrottle> throttles; | 846 ScopedVector<ResourceThrottle> throttles; |
| 888 delegate_->DownloadStarting( | 847 delegate_->DownloadStarting( |
| 889 request, request_info->GetContext(), request_info->GetChildID(), | 848 request, request_info->GetContext(), request_info->GetChildID(), |
| 890 request_info->GetRouteID(), request_info->GetRequestID(), | 849 request_info->GetRouteID(), request_info->GetRequestID(), |
| 891 is_content_initiated, must_download, &throttles); | 850 is_content_initiated, must_download, &throttles); |
| 892 if (!throttles.empty()) { | 851 if (!throttles.empty()) { |
| (...skipping 1785 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2678 load_flags |= net::LOAD_PREFETCH; | 2637 load_flags |= net::LOAD_PREFETCH; |
| 2679 } | 2638 } |
| 2680 | 2639 |
| 2681 if (is_sync_load) | 2640 if (is_sync_load) |
| 2682 load_flags |= net::LOAD_IGNORE_LIMITS; | 2641 load_flags |= net::LOAD_IGNORE_LIMITS; |
| 2683 | 2642 |
| 2684 return load_flags; | 2643 return load_flags; |
| 2685 } | 2644 } |
| 2686 | 2645 |
| 2687 } // namespace content | 2646 } // namespace content |
| OLD | NEW |