blob: 894d2ae2b6b74cf07bca8238b01979aec2d06d33 [file] [log] [blame]
// Copyright 2015 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 <memory>
#include "base/callback_forward.h"
#include "base/macros.h"
#include "chrome/browser/download/download_core_service.h"
#include "components/keyed_service/core/keyed_service.h"
#include "extensions/buildflags/buildflags.h"
#if !defined(OS_ANDROID)
#include "chrome/browser/download/download_shelf_controller.h"
class ChromeDownloadManagerDelegate;
class DownloadHistory;
class DownloadOfflineContentProvider;
class DownloadUIController;
class ExtensionDownloadsEventRouter;
class Profile;
namespace content {
class DownloadManager;
namespace extensions {
class ExtensionDownloadsEventRouter;
// Owning class for ChromeDownloadManagerDelegate.
class DownloadCoreServiceImpl : public DownloadCoreService {
explicit DownloadCoreServiceImpl(Profile* profile);
~DownloadCoreServiceImpl() override;
// DownloadCoreService
ChromeDownloadManagerDelegate* GetDownloadManagerDelegate() override;
DownloadHistory* GetDownloadHistory() override;
extensions::ExtensionDownloadsEventRouter* GetExtensionEventRouter() override;
bool HasCreatedDownloadManager() override;
int NonMaliciousDownloadCount() const override;
void CancelDownloads() override;
void SetDownloadManagerDelegateForTesting(
std::unique_ptr<ChromeDownloadManagerDelegate> delegate) override;
bool IsShelfEnabled() override;
// KeyedService
void Shutdown() override;
DownloadOfflineContentProvider* CreateDownloadOfflineContentProvider();
bool download_manager_created_;
Profile* profile_;
// ChromeDownloadManagerDelegate may be the target of callbacks from
// the history service/DB thread and must be kept alive for those
// callbacks.
std::unique_ptr<ChromeDownloadManagerDelegate> manager_delegate_;
std::unique_ptr<DownloadHistory> download_history_;
// The download provider is the responsible for supplying offline items to the
// UI.
std::unique_ptr<DownloadOfflineContentProvider> download_provider_;
// The UI controller is responsible for observing the download manager and
// notifying the UI of any new downloads. Its lifetime matches that of the
// associated download manager.
// Note on destruction order: download_ui_ depends on download_history_ and
// should be destroyed before the latter.
std::unique_ptr<DownloadUIController> download_ui_;
#if !defined(OS_ANDROID)
std::unique_ptr<DownloadShelfController> download_shelf_controller_;
// On Android, GET downloads are not handled by the DownloadManager.
// Once we have extensions on android, we probably need the EventRouter
// in ContentViewDownloadDelegate which knows about both GET and POST
// downloads.
// The ExtensionDownloadsEventRouter dispatches download creation, change, and
// erase events to extensions. Like ChromeDownloadManagerDelegate, it's a
// chrome-level concept and its lifetime should match DownloadManager. There
// should be a separate EDER for on-record and off-record managers.
// There does not appear to be a separate ExtensionSystem for on-record and
// off-record profiles, so ExtensionSystem cannot own the EDER.