Commit a419f154 authored by Min Qin's avatar Min Qin Committed by Commit Bot

Pass delegate's TaskRunner to ResourceDownloader

ResourceDownloader uses BrowserThread::UI to post tasks to the delegate.
This introduces dependency on content/
Let delegate pass a TaskRunner to ResourceDownloader solves the issue.

BUG=803135

Change-Id: I44ebce8c72d65f99f90009ac9ca20709300cb2cd
Reviewed-on: https://chromium-review.googlesource.com/961528Reviewed-by: default avatarXing Liu <xingliu@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Commit-Queue: Min Qin <qinmin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#543131}
parent c7dd62b4
...@@ -202,7 +202,8 @@ DownloadManagerImpl::UniqueUrlDownloadHandlerPtr BeginResourceDownload( ...@@ -202,7 +202,8 @@ DownloadManagerImpl::UniqueUrlDownloadHandlerPtr BeginResourceDownload(
base::WeakPtr<DownloadManagerImpl> download_manager, base::WeakPtr<DownloadManagerImpl> download_manager,
const GURL& site_url, const GURL& site_url,
const GURL& tab_url, const GURL& tab_url,
const GURL& tab_referrer_url) { const GURL& tab_referrer_url,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
// Check if the renderer is permitted to request the requested URL. // Check if the renderer is permitted to request the requested URL.
...@@ -235,7 +236,7 @@ DownloadManagerImpl::UniqueUrlDownloadHandlerPtr BeginResourceDownload( ...@@ -235,7 +236,7 @@ DownloadManagerImpl::UniqueUrlDownloadHandlerPtr BeginResourceDownload(
ResourceDownloader::BeginDownload( ResourceDownloader::BeginDownload(
download_manager, std::move(params), std::move(request), download_manager, std::move(params), std::move(request),
std::move(shared_url_loader_factory), site_url, tab_url, std::move(shared_url_loader_factory), site_url, tab_url,
tab_referrer_url, download_id, false) tab_referrer_url, download_id, false, task_runner)
.release()); .release());
} }
...@@ -1159,7 +1160,8 @@ void DownloadManagerImpl::InterceptNavigationOnChecksComplete( ...@@ -1159,7 +1160,8 @@ void DownloadManagerImpl::InterceptNavigationOnChecksComplete(
render_process_id, render_frame_id, std::move(url_chain), render_process_id, render_frame_id, std::move(url_chain),
suggested_filename, std::move(response), suggested_filename, std::move(response),
std::move(cert_status), std::move(cert_status),
std::move(url_loader_client_endpoints))); std::move(url_loader_client_endpoints),
base::MessageLoop::current()->task_runner()));
} }
// static // static
...@@ -1172,7 +1174,8 @@ void DownloadManagerImpl::CreateDownloadHandlerForNavigation( ...@@ -1172,7 +1174,8 @@ void DownloadManagerImpl::CreateDownloadHandlerForNavigation(
const base::Optional<std::string>& suggested_filename, const base::Optional<std::string>& suggested_filename,
scoped_refptr<network::ResourceResponse> response, scoped_refptr<network::ResourceResponse> response,
net::CertStatus cert_status, net::CertStatus cert_status,
network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints) { network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
std::unique_ptr<ResourceDownloader> resource_downloader = std::unique_ptr<ResourceDownloader> resource_downloader =
...@@ -1180,7 +1183,7 @@ void DownloadManagerImpl::CreateDownloadHandlerForNavigation( ...@@ -1180,7 +1183,7 @@ void DownloadManagerImpl::CreateDownloadHandlerForNavigation(
download_manager, std::move(resource_request), render_process_id, download_manager, std::move(resource_request), render_process_id,
render_frame_id, std::move(url_chain), suggested_filename, render_frame_id, std::move(url_chain), suggested_filename,
std::move(response), std::move(cert_status), std::move(response), std::move(cert_status),
std::move(url_loader_client_endpoints)); std::move(url_loader_client_endpoints), task_runner);
BrowserThread::PostTask( BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE, BrowserThread::UI, FROM_HERE,
...@@ -1220,7 +1223,8 @@ void DownloadManagerImpl::BeginDownloadInternal( ...@@ -1220,7 +1223,8 @@ void DownloadManagerImpl::BeginDownloadInternal(
std::move(request), std::move(blob_data_handle), std::move(request), std::move(blob_data_handle),
storage_partition->url_loader_factory_getter(), id, storage_partition->url_loader_factory_getter(), id,
weak_factory_.GetWeakPtr(), site_url, tab_url, weak_factory_.GetWeakPtr(), site_url, tab_url,
tab_referrer_url), tab_referrer_url,
base::MessageLoop::current()->task_runner()),
base::BindOnce(&DownloadManagerImpl::AddUrlDownloadHandler, base::BindOnce(&DownloadManagerImpl::AddUrlDownloadHandler,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
} else { } else {
......
...@@ -257,7 +257,8 @@ class CONTENT_EXPORT DownloadManagerImpl : public DownloadManager, ...@@ -257,7 +257,8 @@ class CONTENT_EXPORT DownloadManagerImpl : public DownloadManager,
const base::Optional<std::string>& suggested_filename, const base::Optional<std::string>& suggested_filename,
scoped_refptr<network::ResourceResponse> response, scoped_refptr<network::ResourceResponse> response,
net::CertStatus cert_status, net::CertStatus cert_status,
network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints); network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
// Factory for creation of downloads items. // Factory for creation of downloads items.
std::unique_ptr<DownloadItemFactory> item_factory_; std::unique_ptr<DownloadItemFactory> item_factory_;
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "content/browser/download/download_worker.h" #include "content/browser/download/download_worker.h"
#include "base/message_loop/message_loop.h"
#include "components/download/public/common/download_create_info.h" #include "components/download/public/common/download_create_info.h"
#include "components/download/public/common/download_interrupt_reasons.h" #include "components/download/public/common/download_interrupt_reasons.h"
#include "components/download/public/common/input_stream.h" #include "components/download/public/common/input_stream.h"
...@@ -46,7 +47,8 @@ std::unique_ptr<UrlDownloadHandler, BrowserThread::DeleteOnIOThread> ...@@ -46,7 +47,8 @@ std::unique_ptr<UrlDownloadHandler, BrowserThread::DeleteOnIOThread>
CreateUrlDownloadHandler( CreateUrlDownloadHandler(
std::unique_ptr<download::DownloadUrlParameters> params, std::unique_ptr<download::DownloadUrlParameters> params,
base::WeakPtr<UrlDownloadHandler::Delegate> delegate, base::WeakPtr<UrlDownloadHandler::Delegate> delegate,
scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter) { scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
...@@ -56,7 +58,7 @@ CreateUrlDownloadHandler( ...@@ -56,7 +58,7 @@ CreateUrlDownloadHandler(
ResourceDownloader::BeginDownload( ResourceDownloader::BeginDownload(
delegate, std::move(params), std::move(request), delegate, std::move(params), std::move(request),
url_loader_factory_getter->GetNetworkFactory(), GURL(), GURL(), url_loader_factory_getter->GetNetworkFactory(), GURL(), GURL(),
GURL(), download::DownloadItem::kInvalidId, true) GURL(), download::DownloadItem::kInvalidId, true, task_runner)
.release()); .release());
} else { } else {
// Build the URLRequest, BlobDataHandle is hold in original request for // Build the URLRequest, BlobDataHandle is hold in original request for
...@@ -96,7 +98,8 @@ void DownloadWorker::SendRequest( ...@@ -96,7 +98,8 @@ void DownloadWorker::SendRequest(
BrowserThread::PostTaskAndReplyWithResult( BrowserThread::PostTaskAndReplyWithResult(
BrowserThread::IO, FROM_HERE, BrowserThread::IO, FROM_HERE,
base::BindOnce(&CreateUrlDownloadHandler, std::move(params), base::BindOnce(&CreateUrlDownloadHandler, std::move(params),
weak_factory_.GetWeakPtr(), url_loader_factory_getter), weak_factory_.GetWeakPtr(), url_loader_factory_getter,
base::MessageLoop::current()->task_runner()),
base::BindOnce(&DownloadWorker::AddUrlDownloadHandler, base::BindOnce(&DownloadWorker::AddUrlDownloadHandler,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
} }
......
...@@ -8,10 +8,6 @@ ...@@ -8,10 +8,6 @@
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "components/download/public/common/stream_handle_input_stream.h" #include "components/download/public/common/stream_handle_input_stream.h"
#include "content/browser/blob_storage/blob_url_loader_factory.h"
#include "content/browser/download/download_utils.h"
#include "content/public/browser/web_contents.h"
#include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/shared_url_loader_factory.h"
namespace network { namespace network {
...@@ -70,11 +66,12 @@ std::unique_ptr<ResourceDownloader> ResourceDownloader::BeginDownload( ...@@ -70,11 +66,12 @@ std::unique_ptr<ResourceDownloader> ResourceDownloader::BeginDownload(
const GURL& tab_url, const GURL& tab_url,
const GURL& tab_referrer_url, const GURL& tab_referrer_url,
uint32_t download_id, uint32_t download_id,
bool is_parallel_request) { bool is_parallel_request,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
auto downloader = std::make_unique<ResourceDownloader>( auto downloader = std::make_unique<ResourceDownloader>(
delegate, std::move(request), params->render_process_host_id(), delegate, std::move(request), params->render_process_host_id(),
params->render_frame_host_routing_id(), site_url, tab_url, params->render_frame_host_routing_id(), site_url, tab_url,
tab_referrer_url, download_id); tab_referrer_url, download_id, task_runner);
downloader->Start(std::move(shared_url_loader_factory), std::move(params), downloader->Start(std::move(shared_url_loader_factory), std::move(params),
is_parallel_request); is_parallel_request);
...@@ -92,10 +89,11 @@ ResourceDownloader::InterceptNavigationResponse( ...@@ -92,10 +89,11 @@ ResourceDownloader::InterceptNavigationResponse(
const base::Optional<std::string>& suggested_filename, const base::Optional<std::string>& suggested_filename,
const scoped_refptr<network::ResourceResponse>& response, const scoped_refptr<network::ResourceResponse>& response,
net::CertStatus cert_status, net::CertStatus cert_status,
network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints) { network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
auto downloader = std::make_unique<ResourceDownloader>( auto downloader = std::make_unique<ResourceDownloader>(
delegate, std::move(resource_request), render_process_id, render_frame_id, delegate, std::move(resource_request), render_process_id, render_frame_id,
GURL(), GURL(), GURL(), download::DownloadItem::kInvalidId); GURL(), GURL(), GURL(), download::DownloadItem::kInvalidId, task_runner);
downloader->InterceptResponse(std::move(response), std::move(url_chain), downloader->InterceptResponse(std::move(response), std::move(url_chain),
suggested_filename, cert_status, suggested_filename, cert_status,
std::move(url_loader_client_endpoints)); std::move(url_loader_client_endpoints));
...@@ -110,7 +108,8 @@ ResourceDownloader::ResourceDownloader( ...@@ -110,7 +108,8 @@ ResourceDownloader::ResourceDownloader(
const GURL& site_url, const GURL& site_url,
const GURL& tab_url, const GURL& tab_url,
const GURL& tab_referrer_url, const GURL& tab_referrer_url,
uint32_t download_id) uint32_t download_id,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
: delegate_(delegate), : delegate_(delegate),
resource_request_(std::move(resource_request)), resource_request_(std::move(resource_request)),
download_id_(download_id), download_id_(download_id),
...@@ -119,6 +118,7 @@ ResourceDownloader::ResourceDownloader( ...@@ -119,6 +118,7 @@ ResourceDownloader::ResourceDownloader(
site_url_(site_url), site_url_(site_url),
tab_url_(tab_url), tab_url_(tab_url),
tab_referrer_url_(tab_referrer_url), tab_referrer_url_(tab_referrer_url),
delegate_task_runner_(task_runner),
weak_ptr_factory_(this) {} weak_ptr_factory_(this) {}
ResourceDownloader::~ResourceDownloader() = default; ResourceDownloader::~ResourceDownloader() = default;
...@@ -202,8 +202,8 @@ void ResourceDownloader::OnResponseStarted( ...@@ -202,8 +202,8 @@ void ResourceDownloader::OnResponseStarted(
download_create_info->render_process_id = render_process_id_; download_create_info->render_process_id = render_process_id_;
download_create_info->render_frame_id = render_frame_id_; download_create_info->render_frame_id = render_frame_id_;
BrowserThread::PostTask( delegate_task_runner_->PostTask(
BrowserThread::UI, FROM_HERE, FROM_HERE,
base::BindOnce(&UrlDownloadHandler::Delegate::OnUrlDownloadStarted, base::BindOnce(&UrlDownloadHandler::Delegate::OnUrlDownloadStarted,
delegate_, std::move(download_create_info), delegate_, std::move(download_create_info),
std::make_unique<download::StreamHandleInputStream>( std::make_unique<download::StreamHandleInputStream>(
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
#include "components/download/public/common/download_response_handler.h" #include "components/download/public/common/download_response_handler.h"
#include "content/browser/download/url_download_handler.h" #include "content/browser/download/url_download_handler.h"
#include "content/public/browser/ssl_status.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "net/cert/cert_status_flags.h"
#include "services/network/public/cpp/resource_request.h" #include "services/network/public/cpp/resource_request.h"
#include "services/network/public/mojom/url_loader.mojom.h" #include "services/network/public/mojom/url_loader.mojom.h"
...@@ -32,7 +32,8 @@ class ResourceDownloader : public UrlDownloadHandler, ...@@ -32,7 +32,8 @@ class ResourceDownloader : public UrlDownloadHandler,
const GURL& tab_url, const GURL& tab_url,
const GURL& tab_referrer_url, const GURL& tab_referrer_url,
uint32_t download_id, uint32_t download_id,
bool is_parallel_request); bool is_parallel_request,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
// Create a ResourceDownloader from a navigation that turns to be a download. // Create a ResourceDownloader from a navigation that turns to be a download.
// No URLLoader is created, but the URLLoaderClient implementation is // No URLLoader is created, but the URLLoaderClient implementation is
...@@ -46,16 +47,19 @@ class ResourceDownloader : public UrlDownloadHandler, ...@@ -46,16 +47,19 @@ class ResourceDownloader : public UrlDownloadHandler,
const base::Optional<std::string>& suggested_filename, const base::Optional<std::string>& suggested_filename,
const scoped_refptr<network::ResourceResponse>& response, const scoped_refptr<network::ResourceResponse>& response,
net::CertStatus cert_status, net::CertStatus cert_status,
network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints); network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
ResourceDownloader(base::WeakPtr<UrlDownloadHandler::Delegate> delegate, ResourceDownloader(
std::unique_ptr<network::ResourceRequest> resource_request, base::WeakPtr<UrlDownloadHandler::Delegate> delegate,
int render_process_id, std::unique_ptr<network::ResourceRequest> resource_request,
int render_frame_id, int render_process_id,
const GURL& site_url, int render_frame_id,
const GURL& tab_url, const GURL& site_url,
const GURL& tab_referrer_url, const GURL& tab_url,
uint32_t download_id); const GURL& tab_referrer_url,
uint32_t download_id,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
~ResourceDownloader() override; ~ResourceDownloader() override;
// download::DownloadResponseHandler::Delegate // download::DownloadResponseHandler::Delegate
...@@ -120,6 +124,9 @@ class ResourceDownloader : public UrlDownloadHandler, ...@@ -120,6 +124,9 @@ class ResourceDownloader : public UrlDownloadHandler,
// URLLoader status when intercepting the navigation request. // URLLoader status when intercepting the navigation request.
base::Optional<network::URLLoaderCompletionStatus> url_loader_status_; base::Optional<network::URLLoaderCompletionStatus> url_loader_status_;
// TaskRunner to post callbacks to the |delegate_|
scoped_refptr<base::SingleThreadTaskRunner> delegate_task_runner_;
base::WeakPtrFactory<ResourceDownloader> weak_ptr_factory_; base::WeakPtrFactory<ResourceDownloader> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ResourceDownloader); DISALLOW_COPY_AND_ASSIGN(ResourceDownloader);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment