blob: bde184243ecc2b8d4867d4f6c5f4ff69e7892d37 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/download/public/common/in_progress_download_manager.h"
#include "base/optional.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/download/internal/common/resource_downloader.h"
#include "components/download/public/common/download_task_runner.h"
#include "components/download/public/common/download_url_loader_factory_getter.h"
#include "components/download/public/common/download_url_parameters.h"
#include "components/download/public/common/download_utils.h"
#include "components/download/public/common/input_stream.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/cpp/resource_response.h"
namespace download {
namespace {
void OnUrlDownloadHandlerCreated(
UrlDownloadHandler::UniqueUrlDownloadHandlerPtr downloader,
base::WeakPtr<InProgressDownloadManager> download_manager,
const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner) {
main_task_runner->PostTask(
FROM_HERE,
base::BindOnce(&UrlDownloadHandler::Delegate::OnUrlDownloadHandlerCreated,
download_manager, std::move(downloader)));
}
void BeginResourceDownload(
std::unique_ptr<DownloadUrlParameters> params,
std::unique_ptr<network::ResourceRequest> request,
scoped_refptr<DownloadURLLoaderFactoryGetter> url_loader_factory_getter,
uint32_t download_id,
base::WeakPtr<InProgressDownloadManager> download_manager,
const GURL& site_url,
const GURL& tab_url,
const GURL& tab_referrer_url,
const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner) {
DCHECK(GetIOTaskRunner()->BelongsToCurrentThread());
UrlDownloadHandler::UniqueUrlDownloadHandlerPtr downloader(
ResourceDownloader::BeginDownload(
download_manager, std::move(params), std::move(request),
std::move(url_loader_factory_getter), site_url, tab_url,
tab_referrer_url, download_id, false, main_task_runner)
.release(),
base::OnTaskRunnerDeleter(base::ThreadTaskRunnerHandle::Get()));
OnUrlDownloadHandlerCreated(std::move(downloader), download_manager,
main_task_runner);
}
void CreateDownloadHandlerForNavigation(
base::WeakPtr<InProgressDownloadManager> download_manager,
std::unique_ptr<network::ResourceRequest> resource_request,
int render_process_id,
int render_frame_id,
const GURL& site_url,
const GURL& tab_url,
const GURL& tab_referrer_url,
std::vector<GURL> url_chain,
const base::Optional<std::string>& suggested_filename,
scoped_refptr<network::ResourceResponse> response,
net::CertStatus cert_status,
network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints,
scoped_refptr<DownloadURLLoaderFactoryGetter> url_loader_factory_getter,
const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner) {
DCHECK(GetIOTaskRunner()->BelongsToCurrentThread());
download::UrlDownloadHandler::UniqueUrlDownloadHandlerPtr downloader(
download::ResourceDownloader::InterceptNavigationResponse(
download_manager, std::move(resource_request), render_process_id,
render_frame_id, site_url, tab_url, tab_referrer_url,
std::move(url_chain), suggested_filename, std::move(response),
std::move(cert_status), std::move(url_loader_client_endpoints),
std::move(url_loader_factory_getter), main_task_runner)
.release(),
base::OnTaskRunnerDeleter(base::ThreadTaskRunnerHandle::Get()));
OnUrlDownloadHandlerCreated(std::move(downloader), download_manager,
main_task_runner);
}
} // namespace
InProgressDownloadManager::InProgressDownloadManager(
UrlDownloadHandler::Delegate* delegate)
: delegate_(delegate), weak_factory_(this) {}
InProgressDownloadManager::~InProgressDownloadManager() = default;
void InProgressDownloadManager::OnUrlDownloadStarted(
std::unique_ptr<DownloadCreateInfo> download_create_info,
std::unique_ptr<InputStream> input_stream,
scoped_refptr<DownloadURLLoaderFactoryGetter> url_loader_factory_getter,
const DownloadUrlParameters::OnStartedCallback& callback) {
if (delegate_) {
delegate_->OnUrlDownloadStarted(
std::move(download_create_info), std::move(input_stream),
std::move(url_loader_factory_getter), callback);
}
}
void InProgressDownloadManager::OnUrlDownloadStopped(
UrlDownloadHandler* downloader) {
for (auto ptr = url_download_handlers_.begin();
ptr != url_download_handlers_.end(); ++ptr) {
if (ptr->get() == downloader) {
url_download_handlers_.erase(ptr);
return;
}
}
}
void InProgressDownloadManager::OnUrlDownloadHandlerCreated(
UrlDownloadHandler::UniqueUrlDownloadHandlerPtr downloader) {
if (downloader)
url_download_handlers_.push_back(std::move(downloader));
}
void InProgressDownloadManager::StartDownload(
std::unique_ptr<DownloadUrlParameters> params,
scoped_refptr<DownloadURLLoaderFactoryGetter> url_loader_factory_getter,
uint32_t download_id,
const GURL& site_url,
const GURL& tab_url,
const GURL& tab_referrer_url) {
std::unique_ptr<network::ResourceRequest> request =
CreateResourceRequest(params.get());
GetIOTaskRunner()->PostTask(
FROM_HERE,
base::BindOnce(&BeginResourceDownload, std::move(params),
std::move(request), std::move(url_loader_factory_getter),
download_id, weak_factory_.GetWeakPtr(), site_url, tab_url,
tab_referrer_url, base::ThreadTaskRunnerHandle::Get()));
}
void InProgressDownloadManager::InterceptDownloadFromNavigation(
std::unique_ptr<network::ResourceRequest> resource_request,
int render_process_id,
int render_frame_id,
const GURL& site_url,
const GURL& tab_url,
const GURL& tab_referrer_url,
std::vector<GURL> url_chain,
const base::Optional<std::string>& suggested_filename,
scoped_refptr<network::ResourceResponse> response,
net::CertStatus cert_status,
network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints,
scoped_refptr<DownloadURLLoaderFactoryGetter> url_loader_factory_getter) {
GetIOTaskRunner()->PostTask(
FROM_HERE,
base::BindOnce(&CreateDownloadHandlerForNavigation,
weak_factory_.GetWeakPtr(), std::move(resource_request),
render_process_id, render_frame_id, site_url, tab_url,
tab_referrer_url, std::move(url_chain), suggested_filename,
std::move(response), std::move(cert_status),
std::move(url_loader_client_endpoints),
std::move(url_loader_factory_getter),
base::ThreadTaskRunnerHandle::Get()));
}
void InProgressDownloadManager::ShutDown() {
url_download_handlers_.clear();
}
void InProgressDownloadManager::ResumeInterruptedDownload(
std::unique_ptr<DownloadUrlParameters> params,
uint32_t id,
const GURL& site_url) {}
} // namespace download