| // Copyright (c) 2012 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 CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_ |
| #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_ |
| |
| #include "base/basictypes.h" |
| #include "base/callback_forward.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "components/keyed_service/core/keyed_service.h" |
| |
| class ChromeDownloadManagerDelegate; |
| class DownloadHistory; |
| class DownloadUIController; |
| class ExtensionDownloadsEventRouter; |
| class Profile; |
| |
| namespace content { |
| class DownloadManager; |
| } |
| |
| namespace extensions { |
| class ExtensionDownloadsEventRouter; |
| } |
| |
| // Owning class for ChromeDownloadManagerDelegate. |
| class DownloadService : public KeyedService { |
| public: |
| explicit DownloadService(Profile* profile); |
| virtual ~DownloadService(); |
| |
| // Get the download manager delegate, creating it if it doesn't already exist. |
| ChromeDownloadManagerDelegate* GetDownloadManagerDelegate(); |
| |
| // Get the interface to the history system. Returns NULL if profile is |
| // incognito or if the DownloadManager hasn't been created yet or if there is |
| // no HistoryService for profile. Virtual for testing. |
| virtual DownloadHistory* GetDownloadHistory(); |
| |
| #if defined(ENABLE_EXTENSIONS) |
| extensions::ExtensionDownloadsEventRouter* GetExtensionEventRouter() { |
| return extension_event_router_.get(); |
| } |
| #endif |
| |
| // Has a download manager been created? |
| bool HasCreatedDownloadManager(); |
| |
| // Number of non-malicious downloads associated with this instance of the |
| // service. |
| int NonMaliciousDownloadCount() const; |
| |
| // Cancels all in-progress downloads for this profile. |
| void CancelDownloads(); |
| |
| // Number of non-malicious downloads associated with all profiles. |
| static int NonMaliciousDownloadCountAllProfiles(); |
| |
| // Cancels all in-progress downloads for all profiles. |
| static void CancelAllDownloads(); |
| |
| // Sets the DownloadManagerDelegate associated with this object and |
| // its DownloadManager. Takes ownership of |delegate|, and destroys |
| // the previous delegate. For testing. |
| void SetDownloadManagerDelegateForTesting( |
| scoped_ptr<ChromeDownloadManagerDelegate> delegate); |
| |
| // Will be called to release references on other services as part |
| // of Profile shutdown. |
| virtual void Shutdown() OVERRIDE; |
| |
| // Returns false if at least one extension has disabled the shelf, true |
| // otherwise. |
| bool IsShelfEnabled(); |
| |
| private: |
| 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. |
| scoped_ptr<ChromeDownloadManagerDelegate> manager_delegate_; |
| |
| scoped_ptr<DownloadHistory> download_history_; |
| |
| // 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. |
| scoped_ptr<DownloadUIController> download_ui_; |
| |
| // 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. |
| #if defined(ENABLE_EXTENSIONS) |
| // 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. |
| scoped_ptr<extensions::ExtensionDownloadsEventRouter> extension_event_router_; |
| #endif |
| |
| DISALLOW_COPY_AND_ASSIGN(DownloadService); |
| }; |
| |
| #endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_H_ |