blob: 5e53c82247893b6d2d28770c4bcd717b122013df [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.
#ifndef COMPONENTS_DOWNLOAD_PUBLIC_COMMON_IN_PROGRESS_DOWNLOAD_MANAGER_H_
#define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_IN_PROGRESS_DOWNLOAD_MANAGER_H_
#include <memory>
#include <vector>
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "components/download/public/common/download_export.h"
#include "components/download/public/common/download_file_factory.h"
#include "components/download/public/common/download_item_impl_delegate.h"
#include "components/download/public/common/url_download_handler.h"
#include "url/gurl.h"
namespace net {
class URLRequestContextGetter;
}
namespace network {
struct ResourceResponse;
}
namespace download {
class DownloadURLLoaderFactoryGetter;
class DownloadUrlParameters;
class InProgressCache;
// Manager for handling all active downloads.
class COMPONENTS_DOWNLOAD_EXPORT InProgressDownloadManager
: public UrlDownloadHandler::Delegate,
public DownloadItemImplDelegate {
public:
using DownloadIdCallback = base::RepeatingCallback<void(uint32_t)>;
// Class to be notified when download starts/stops.
class COMPONENTS_DOWNLOAD_EXPORT Delegate {
public:
// Intercepts the download to another system if applicable. Returns true if
// the download was intercepted.
virtual bool InterceptDownload(
const DownloadCreateInfo& download_create_info) = 0;
// Called to get an ID for a new download. |callback| may be called
// synchronously.
virtual void GetNextId(const DownloadIdCallback& callback) = 0;
// Gets the default download directory.
virtual base::FilePath GetDefaultDownloadDirectory() = 0;
// Gets the download item for the given id.
// TODO(qinmin): remove this method and let InProgressDownloadManager
// create the DownloadItem from in-progress cache.
virtual DownloadItemImpl* GetDownloadItem(
uint32_t id,
bool new_download,
const DownloadCreateInfo& download_create_info) = 0;
// Gets the URLRequestContextGetter for sending requests.
// TODO(qinmin): remove this once network service is fully enabled.
virtual net::URLRequestContextGetter* GetURLRequestContextGetter(
const DownloadCreateInfo& download_create_info) = 0;
// Called when a new download is started.
virtual void OnNewDownloadStarted(DownloadItem* download) = 0;
};
using IsOriginSecureCallback = base::RepeatingCallback<bool(const GURL&)>;
InProgressDownloadManager(Delegate* delegate,
const IsOriginSecureCallback& is_origin_secure_cb);
~InProgressDownloadManager() override;
// Called to start a download.
void BeginDownload(
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);
// Intercepts a download from navigation.
void 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);
// TODO(qinmin): change the |callback| to be an OnceClosure.
void Initialize(const base::FilePath& metadata_cache_dir,
const base::RepeatingClosure& callback);
void StartDownload(
std::unique_ptr<DownloadCreateInfo> info,
std::unique_ptr<InputStream> stream,
scoped_refptr<DownloadURLLoaderFactoryGetter> url_loader_factory_getter,
const DownloadUrlParameters::OnStartedCallback& on_started);
// Shutting down the manager and stop all downloads.
void ShutDown();
// DownloadItemImplDelegate implementations.
void ResumeInterruptedDownload(std::unique_ptr<DownloadUrlParameters> params,
uint32_t id,
const GURL& site_url) override;
base::Optional<DownloadEntry> GetInProgressEntry(
DownloadItemImpl* download) override;
void ReportBytesWasted(DownloadItemImpl* download) override;
void set_file_factory(std::unique_ptr<DownloadFileFactory> file_factory) {
file_factory_ = std::move(file_factory);
}
DownloadFileFactory* file_factory() { return file_factory_.get(); }
private:
// UrlDownloadHandler::Delegate implementations.
void OnUrlDownloadStarted(
std::unique_ptr<DownloadCreateInfo> download_create_info,
std::unique_ptr<InputStream> input_stream,
scoped_refptr<DownloadURLLoaderFactoryGetter> shared_url_loader_factory,
const DownloadUrlParameters::OnStartedCallback& callback) override;
void OnUrlDownloadStopped(UrlDownloadHandler* downloader) override;
void OnUrlDownloadHandlerCreated(
UrlDownloadHandler::UniqueUrlDownloadHandlerPtr downloader) override;
// Start a download with given ID.
void StartDownloadWithId(
std::unique_ptr<DownloadCreateInfo> info,
std::unique_ptr<InputStream> stream,
scoped_refptr<DownloadURLLoaderFactoryGetter> url_loader_factory_getter,
const DownloadUrlParameters::OnStartedCallback& on_started,
bool new_download,
uint32_t id);
// Active download handlers.
std::vector<UrlDownloadHandler::UniqueUrlDownloadHandlerPtr>
url_download_handlers_;
// Delegate to provide information to create a new download. Can be null.
Delegate* delegate_;
// Factory for the creation of download files.
std::unique_ptr<DownloadFileFactory> file_factory_;
// Cache for storing metadata about in progress downloads.
std::unique_ptr<InProgressCache> download_metadata_cache_;
// listens to information about in-progress download items.
std::unique_ptr<DownloadItem::Observer> in_progress_download_observer_;
// callback to check if an origin is secure.
IsOriginSecureCallback is_origin_secure_cb_;
base::WeakPtrFactory<InProgressDownloadManager> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(InProgressDownloadManager);
};
} // namespace download
#endif // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_IN_PROGRESS_DOWNLOAD_MANAGER_H_