| 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 #include "content/browser/download/download_manager_impl.h" | 5 #include "content/browser/download/download_manager_impl.h" |
| 6 | 6 |
| 7 #include <iterator> | 7 #include <iterator> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include "content/browser/byte_stream.h" | 25 #include "content/browser/byte_stream.h" |
| 26 #include "content/browser/child_process_security_policy_impl.h" | 26 #include "content/browser/child_process_security_policy_impl.h" |
| 27 #include "content/browser/download/download_create_info.h" | 27 #include "content/browser/download/download_create_info.h" |
| 28 #include "content/browser/download/download_file_factory.h" | 28 #include "content/browser/download/download_file_factory.h" |
| 29 #include "content/browser/download/download_item_factory.h" | 29 #include "content/browser/download/download_item_factory.h" |
| 30 #include "content/browser/download/download_item_impl.h" | 30 #include "content/browser/download/download_item_impl.h" |
| 31 #include "content/browser/download/download_stats.h" | 31 #include "content/browser/download/download_stats.h" |
| 32 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 32 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| 33 #include "content/browser/loader/resource_request_info_impl.h" | 33 #include "content/browser/loader/resource_request_info_impl.h" |
| 34 #include "content/browser/renderer_host/render_view_host_impl.h" | 34 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 35 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| 35 #include "content/browser/web_contents/web_contents_impl.h" | 36 #include "content/browser/web_contents/web_contents_impl.h" |
| 36 #include "content/public/browser/browser_context.h" | 37 #include "content/public/browser/browser_context.h" |
| 37 #include "content/public/browser/content_browser_client.h" | 38 #include "content/public/browser/content_browser_client.h" |
| 38 #include "content/public/browser/download_interrupt_reasons.h" | 39 #include "content/public/browser/download_interrupt_reasons.h" |
| 39 #include "content/public/browser/download_manager_delegate.h" | 40 #include "content/public/browser/download_manager_delegate.h" |
| 40 #include "content/public/browser/download_url_parameters.h" | 41 #include "content/public/browser/download_url_parameters.h" |
| 41 #include "content/public/browser/notification_service.h" | 42 #include "content/public/browser/notification_service.h" |
| 42 #include "content/public/browser/notification_types.h" | 43 #include "content/public/browser/notification_types.h" |
| 43 #include "content/public/browser/render_process_host.h" | 44 #include "content/public/browser/render_process_host.h" |
| 44 #include "content/public/browser/resource_context.h" | 45 #include "content/public/browser/resource_context.h" |
| 46 #include "content/public/browser/storage_partition.h" |
| 45 #include "content/public/browser/web_contents_delegate.h" | 47 #include "content/public/browser/web_contents_delegate.h" |
| 46 #include "content/public/common/referrer.h" | 48 #include "content/public/common/referrer.h" |
| 47 #include "net/base/elements_upload_data_stream.h" | 49 #include "net/base/elements_upload_data_stream.h" |
| 48 #include "net/base/load_flags.h" | 50 #include "net/base/load_flags.h" |
| 49 #include "net/base/request_priority.h" | 51 #include "net/base/request_priority.h" |
| 50 #include "net/base/upload_bytes_element_reader.h" | 52 #include "net/base/upload_bytes_element_reader.h" |
| 51 #include "net/log/net_log_source_type.h" | 53 #include "net/log/net_log_source_type.h" |
| 52 #include "net/log/net_log_with_source.h" | 54 #include "net/log/net_log_with_source.h" |
| 53 #include "net/url_request/url_request_context.h" | 55 #include "net/url_request/url_request_context.h" |
| 54 #include "storage/browser/blob/blob_url_request_job_factory.h" | 56 #include "storage/browser/blob/blob_url_request_job_factory.h" |
| 55 #include "url/origin.h" | 57 #include "url/origin.h" |
| 56 | 58 |
| 57 namespace content { | 59 namespace content { |
| 58 namespace { | 60 namespace { |
| 59 | 61 |
| 60 std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread> BeginDownload( | 62 std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread> BeginDownload( |
| 61 std::unique_ptr<DownloadUrlParameters> params, | 63 std::unique_ptr<DownloadUrlParameters> params, |
| 62 content::ResourceContext* resource_context, | 64 content::ResourceContext* resource_context, |
| 65 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, |
| 63 uint32_t download_id, | 66 uint32_t download_id, |
| 64 base::WeakPtr<DownloadManagerImpl> download_manager) { | 67 base::WeakPtr<DownloadManagerImpl> download_manager) { |
| 65 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 68 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 66 | 69 |
| 67 std::unique_ptr<net::URLRequest> url_request = | 70 std::unique_ptr<net::URLRequest> url_request = |
| 68 DownloadRequestCore::CreateRequestOnIOThread(download_id, params.get()); | 71 DownloadRequestCore::CreateRequestOnIOThread(download_id, params.get()); |
| 69 std::unique_ptr<storage::BlobDataHandle> blob_data_handle = | 72 std::unique_ptr<storage::BlobDataHandle> blob_data_handle = |
| 70 params->GetBlobDataHandle(); | 73 params->GetBlobDataHandle(); |
| 71 if (blob_data_handle) { | 74 if (blob_data_handle) { |
| 72 storage::BlobProtocolHandler::SetRequestedBlobDataHandle( | 75 storage::BlobProtocolHandler::SetRequestedBlobDataHandle( |
| 73 url_request.get(), std::move(blob_data_handle)); | 76 url_request.get(), std::move(blob_data_handle)); |
| 74 } | 77 } |
| 75 | 78 |
| 76 // If there's a valid renderer process associated with the request, then the | 79 // If there's a valid renderer process associated with the request, then the |
| 77 // request should be driven by the ResourceLoader. Pass it over to the | 80 // request should be driven by the ResourceLoader. Pass it over to the |
| 78 // ResourceDispatcherHostImpl which will in turn pass it along to the | 81 // ResourceDispatcherHostImpl which will in turn pass it along to the |
| 79 // ResourceLoader. | 82 // ResourceLoader. |
| 80 if (params->render_process_host_id() >= 0) { | 83 if (params->render_process_host_id() >= 0) { |
| 81 DownloadInterruptReason reason = DownloadManagerImpl::BeginDownloadRequest( | 84 DownloadInterruptReason reason = DownloadManagerImpl::BeginDownloadRequest( |
| 82 std::move(url_request), params->referrer(), resource_context, | 85 std::move(url_request), params->referrer(), resource_context, |
| 83 params->content_initiated(), params->render_process_host_id(), | 86 service_worker_context.get(), params->content_initiated(), |
| 84 params->render_view_host_routing_id(), | 87 params->render_process_host_id(), params->render_view_host_routing_id(), |
| 85 params->render_frame_host_routing_id(), | 88 params->render_frame_host_routing_id(), |
| 89 params->service_worker_provider_id(), |
| 86 params->do_not_prompt_for_login()); | 90 params->do_not_prompt_for_login()); |
| 87 | 91 |
| 88 // If the download was accepted, the DownloadResourceHandler is now | 92 // If the download was accepted, the DownloadResourceHandler is now |
| 89 // responsible for driving the request to completion. | 93 // responsible for driving the request to completion. |
| 90 if (reason == DOWNLOAD_INTERRUPT_REASON_NONE) | 94 if (reason == DOWNLOAD_INTERRUPT_REASON_NONE) |
| 91 return nullptr; | 95 return nullptr; |
| 92 | 96 |
| 93 // Otherwise, create an interrupted download. | 97 // Otherwise, create an interrupted download. |
| 94 std::unique_ptr<DownloadCreateInfo> failed_created_info( | 98 std::unique_ptr<DownloadCreateInfo> failed_created_info( |
| 95 new DownloadCreateInfo(base::Time::Now(), net::NetLogWithSource(), | 99 new DownloadCreateInfo(base::Time::Now(), net::NetLogWithSource(), |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 | 480 |
| 477 // Resume a download of a specific URL. We send the request to the | 481 // Resume a download of a specific URL. We send the request to the |
| 478 // ResourceDispatcherHost, and let it send us responses like a regular | 482 // ResourceDispatcherHost, and let it send us responses like a regular |
| 479 // download. | 483 // download. |
| 480 void DownloadManagerImpl::ResumeInterruptedDownload( | 484 void DownloadManagerImpl::ResumeInterruptedDownload( |
| 481 std::unique_ptr<content::DownloadUrlParameters> params, | 485 std::unique_ptr<content::DownloadUrlParameters> params, |
| 482 uint32_t id) { | 486 uint32_t id) { |
| 483 BrowserThread::PostTaskAndReplyWithResult( | 487 BrowserThread::PostTaskAndReplyWithResult( |
| 484 BrowserThread::IO, FROM_HERE, | 488 BrowserThread::IO, FROM_HERE, |
| 485 base::Bind(&BeginDownload, base::Passed(¶ms), | 489 base::Bind(&BeginDownload, base::Passed(¶ms), |
| 486 browser_context_->GetResourceContext(), id, | 490 browser_context_->GetResourceContext(), |
| 491 scoped_refptr<ServiceWorkerContextWrapper>(), id, |
| 487 weak_factory_.GetWeakPtr()), | 492 weak_factory_.GetWeakPtr()), |
| 488 base::Bind(&DownloadManagerImpl::AddUrlDownloader, | 493 base::Bind(&DownloadManagerImpl::AddUrlDownloader, |
| 489 weak_factory_.GetWeakPtr())); | 494 weak_factory_.GetWeakPtr())); |
| 490 } | 495 } |
| 491 | 496 |
| 492 void DownloadManagerImpl::SetDownloadItemFactoryForTesting( | 497 void DownloadManagerImpl::SetDownloadItemFactoryForTesting( |
| 493 std::unique_ptr<DownloadItemFactory> item_factory) { | 498 std::unique_ptr<DownloadItemFactory> item_factory) { |
| 494 item_factory_ = std::move(item_factory); | 499 item_factory_ = std::move(item_factory); |
| 495 } | 500 } |
| 496 | 501 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 526 return; | 531 return; |
| 527 } | 532 } |
| 528 } | 533 } |
| 529 } | 534 } |
| 530 | 535 |
| 531 // static | 536 // static |
| 532 DownloadInterruptReason DownloadManagerImpl::BeginDownloadRequest( | 537 DownloadInterruptReason DownloadManagerImpl::BeginDownloadRequest( |
| 533 std::unique_ptr<net::URLRequest> url_request, | 538 std::unique_ptr<net::URLRequest> url_request, |
| 534 const Referrer& referrer, | 539 const Referrer& referrer, |
| 535 ResourceContext* resource_context, | 540 ResourceContext* resource_context, |
| 541 ServiceWorkerContextWrapper* service_worker_context, |
| 536 bool is_content_initiated, | 542 bool is_content_initiated, |
| 537 int render_process_id, | 543 int render_process_id, |
| 538 int render_view_route_id, | 544 int render_view_route_id, |
| 539 int render_frame_route_id, | 545 int render_frame_route_id, |
| 546 int service_worker_provider_id, |
| 540 bool do_not_prompt_for_login) { | 547 bool do_not_prompt_for_login) { |
| 541 if (ResourceDispatcherHostImpl::Get()->is_shutdown()) | 548 if (ResourceDispatcherHostImpl::Get()->is_shutdown()) |
| 542 return DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN; | 549 return DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN; |
| 543 | 550 |
| 544 // The URLRequest needs to be initialized with the referrer and other | 551 // The URLRequest needs to be initialized with the referrer and other |
| 545 // information prior to issuing it. | 552 // information prior to issuing it. |
| 546 ResourceDispatcherHostImpl::Get()->InitializeURLRequest( | 553 ResourceDispatcherHostImpl::Get()->InitializeURLRequest( |
| 547 url_request.get(), referrer, | 554 url_request.get(), referrer, |
| 548 true, // download. | 555 true, // download. |
| 549 render_process_id, render_view_route_id, render_frame_route_id, | 556 render_process_id, render_view_route_id, render_frame_route_id, |
| 550 resource_context); | 557 service_worker_provider_id, resource_context, service_worker_context); |
| 551 | 558 |
| 552 // We treat a download as a main frame load, and thus update the policy URL on | 559 // We treat a download as a main frame load, and thus update the policy URL on |
| 553 // redirects. | 560 // redirects. |
| 554 // | 561 // |
| 555 // TODO(davidben): Is this correct? If this came from a | 562 // TODO(davidben): Is this correct? If this came from a |
| 556 // ViewHostMsg_DownloadUrl in a frame, should it have first-party URL set | 563 // ViewHostMsg_DownloadUrl in a frame, should it have first-party URL set |
| 557 // appropriately? | 564 // appropriately? |
| 558 url_request->set_first_party_url_policy( | 565 url_request->set_first_party_url_policy( |
| 559 net::URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT); | 566 net::URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT); |
| 560 | 567 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 base::Bind(&EmptyFilter); | 645 base::Bind(&EmptyFilter); |
| 639 // The null times make the date range unbounded. | 646 // The null times make the date range unbounded. |
| 640 int num_deleted = RemoveDownloadsByURLAndTime( | 647 int num_deleted = RemoveDownloadsByURLAndTime( |
| 641 empty_filter, base::Time(), base::Time()); | 648 empty_filter, base::Time(), base::Time()); |
| 642 RecordClearAllSize(num_deleted); | 649 RecordClearAllSize(num_deleted); |
| 643 return num_deleted; | 650 return num_deleted; |
| 644 } | 651 } |
| 645 | 652 |
| 646 void DownloadManagerImpl::DownloadUrl( | 653 void DownloadManagerImpl::DownloadUrl( |
| 647 std::unique_ptr<DownloadUrlParameters> params) { | 654 std::unique_ptr<DownloadUrlParameters> params) { |
| 655 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context; |
| 656 RenderProcessHost* render_process_host = |
| 657 RenderProcessHost::FromID(params->render_process_host_id()); |
| 658 if (render_process_host) { |
| 659 StoragePartition* partition = render_process_host->GetStoragePartition(); |
| 660 if (partition) { |
| 661 service_worker_context = static_cast<ServiceWorkerContextWrapper*>( |
| 662 partition->GetServiceWorkerContext()); |
| 663 } |
| 664 } |
| 648 if (params->post_id() >= 0) { | 665 if (params->post_id() >= 0) { |
| 649 // Check this here so that the traceback is more useful. | 666 // Check this here so that the traceback is more useful. |
| 650 DCHECK(params->prefer_cache()); | 667 DCHECK(params->prefer_cache()); |
| 651 DCHECK_EQ("POST", params->method()); | 668 DCHECK_EQ("POST", params->method()); |
| 652 } | 669 } |
| 653 BrowserThread::PostTaskAndReplyWithResult( | 670 BrowserThread::PostTaskAndReplyWithResult( |
| 654 BrowserThread::IO, FROM_HERE, | 671 BrowserThread::IO, FROM_HERE, |
| 655 base::Bind(&BeginDownload, base::Passed(¶ms), | 672 base::Bind(&BeginDownload, base::Passed(¶ms), |
| 656 browser_context_->GetResourceContext(), | 673 browser_context_->GetResourceContext(), |
| 674 std::move(service_worker_context), |
| 657 content::DownloadItem::kInvalidId, weak_factory_.GetWeakPtr()), | 675 content::DownloadItem::kInvalidId, weak_factory_.GetWeakPtr()), |
| 658 base::Bind(&DownloadManagerImpl::AddUrlDownloader, | 676 base::Bind(&DownloadManagerImpl::AddUrlDownloader, |
| 659 weak_factory_.GetWeakPtr())); | 677 weak_factory_.GetWeakPtr())); |
| 660 } | 678 } |
| 661 | 679 |
| 662 void DownloadManagerImpl::AddObserver(Observer* observer) { | 680 void DownloadManagerImpl::AddObserver(Observer* observer) { |
| 663 observers_.AddObserver(observer); | 681 observers_.AddObserver(observer); |
| 664 } | 682 } |
| 665 | 683 |
| 666 void DownloadManagerImpl::RemoveObserver(Observer* observer) { | 684 void DownloadManagerImpl::RemoveObserver(Observer* observer) { |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 764 if (delegate_) | 782 if (delegate_) |
| 765 delegate_->OpenDownload(download); | 783 delegate_->OpenDownload(download); |
| 766 } | 784 } |
| 767 | 785 |
| 768 void DownloadManagerImpl::ShowDownloadInShell(DownloadItemImpl* download) { | 786 void DownloadManagerImpl::ShowDownloadInShell(DownloadItemImpl* download) { |
| 769 if (delegate_) | 787 if (delegate_) |
| 770 delegate_->ShowDownloadInShell(download); | 788 delegate_->ShowDownloadInShell(download); |
| 771 } | 789 } |
| 772 | 790 |
| 773 } // namespace content | 791 } // namespace content |
| OLD | NEW |