Index: content/browser/download/download_manager.h |
diff --git a/content/browser/download/download_manager.h b/content/browser/download/download_manager.h |
index 3bbd4a753924e6f0dd5c45bef5e4bbce1631f2f5..55225493c0b2d123d22ce968d4d2e04bd77e8cad 100644 |
--- a/content/browser/download/download_manager.h |
+++ b/content/browser/download/download_manager.h |
@@ -28,34 +28,21 @@ |
#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_H_ |
#pragma once |
-#include <map> |
-#include <set> |
#include <string> |
#include <vector> |
#include "base/basictypes.h" |
-#include "base/callback.h" |
#include "base/file_path.h" |
#include "base/gtest_prod_util.h" |
-#include "base/hash_tables.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/observer_list.h" |
-#include "base/synchronization/lock.h" |
#include "base/time.h" |
#include "content/browser/download/download_id.h" |
#include "content/browser/download/download_item.h" |
-#include "content/browser/download/download_status_updater_delegate.h" |
#include "content/browser/download/interrupt_reasons.h" |
-#include "content/common/content_export.h" |
#include "content/public/browser/browser_thread.h" |
#include "net/base/net_errors.h" |
class DownloadFileManager; |
-class DownloadIdFactory; |
class DownloadRequestHandle; |
-class DownloadStatusUpdater; |
class GURL; |
class TabContents; |
struct DownloadCreateInfo; |
@@ -69,15 +56,12 @@ class DownloadManagerDelegate; |
// Browser's download manager: manages all downloads and destination view. |
class CONTENT_EXPORT DownloadManager |
: public base::RefCountedThreadSafe< |
- DownloadManager, content::BrowserThread::DeleteOnUIThread>, |
- public DownloadStatusUpdaterDelegate { |
+ DownloadManager, content::BrowserThread::DeleteOnUIThread> { |
public: |
- DownloadManager(content::DownloadManagerDelegate* delegate, |
- DownloadIdFactory* id_factory, |
- DownloadStatusUpdater* status_updater); |
+ virtual ~DownloadManager() {} |
// Shutdown the download manager. Must be called before destruction. |
- void Shutdown(); |
+ virtual void Shutdown() = 0; |
// Interface to implement for observers that wish to be informed of changes |
// to the DownloadManager's collection of downloads. |
@@ -103,323 +87,209 @@ class CONTENT_EXPORT DownloadManager |
typedef std::vector<DownloadItem*> DownloadVector; |
// Return all temporary downloads that reside in the specified directory. |
- void GetTemporaryDownloads(const FilePath& dir_path, DownloadVector* result); |
+ virtual void GetTemporaryDownloads(const FilePath& dir_path, |
+ DownloadVector* result) = 0; |
// Return all non-temporary downloads in the specified directory that are |
// are in progress or have completed. |
- void GetAllDownloads(const FilePath& dir_path, DownloadVector* result); |
+ virtual void GetAllDownloads(const FilePath& dir_path, |
+ DownloadVector* result) = 0; |
// Returns all non-temporary downloads matching |query|. Empty query matches |
// everything. |
- void SearchDownloads(const string16& query, DownloadVector* result); |
+ virtual void SearchDownloads(const string16& query, |
+ DownloadVector* result) = 0; |
// Returns true if initialized properly. |
- bool Init(content::BrowserContext* browser_context); |
+ virtual bool Init(content::BrowserContext* browser_context) = 0; |
// Notifications sent from the download thread to the UI thread |
- void StartDownload(int32 id); |
- void UpdateDownload(int32 download_id, int64 size); |
+ virtual void StartDownload(int32 id) = 0; |
+ virtual void UpdateDownload(int32 download_id, int64 size) = 0; |
// |download_id| is the ID of the download. |
// |size| is the number of bytes that have been downloaded. |
// |hash| is sha256 hash for the downloaded file. It is empty when the hash |
// is not available. |
- void OnResponseCompleted(int32 download_id, int64 size, |
- const std::string& hash); |
+ virtual void OnResponseCompleted(int32 download_id, int64 size, |
+ const std::string& hash) = 0; |
// Offthread target for cancelling a particular download. Will be a no-op |
// if the download has already been cancelled. |
- void CancelDownload(int32 download_id); |
+ virtual void CancelDownload(int32 download_id) = 0; |
// Called when there is an error in the download. |
// |download_id| is the ID of the download. |
// |size| is the number of bytes that are currently downloaded. |
// |reason| is a download interrupt reason code. |
- void OnDownloadInterrupted(int32 download_id, int64 size, |
- InterruptReason reason); |
+ virtual void OnDownloadInterrupted(int32 download_id, int64 size, |
+ InterruptReason reason) = 0; |
// Called from DownloadItem to handle the DownloadManager portion of a |
// Cancel; should not be called from other locations. |
- void DownloadCancelledInternal(DownloadItem* download); |
+ virtual void DownloadCancelledInternal(DownloadItem* download) = 0; |
// Called from a view when a user clicks a UI button or link. |
- void RemoveDownload(int64 download_handle); |
+ virtual void RemoveDownload(int64 download_handle) = 0; |
// Determine if the download is ready for completion, i.e. has had |
// all data saved, and completed the filename determination and |
// history insertion. |
- bool IsDownloadReadyForCompletion(DownloadItem* download); |
+ virtual bool IsDownloadReadyForCompletion(DownloadItem* download) = 0; |
// If all pre-requisites have been met, complete download processing, i.e. |
// do internal cleanup, file rename, and potentially auto-open. |
// (Dangerous downloads still may block on user acceptance after this |
// point.) |
- void MaybeCompleteDownload(DownloadItem* download); |
+ virtual void MaybeCompleteDownload(DownloadItem* download) = 0; |
// Called when the download is renamed to its final name. |
// |uniquifier| is a number used to make unique names for the file. It is |
// only valid for the DANGEROUS_BUT_VALIDATED state of the download item. |
- void OnDownloadRenamedToFinalName(int download_id, |
+ virtual void OnDownloadRenamedToFinalName(int download_id, |
const FilePath& full_path, |
- int uniquifier); |
+ int uniquifier) = 0; |
// Remove downloads after remove_begin (inclusive) and before remove_end |
// (exclusive). You may pass in null Time values to do an unbounded delete |
// in either direction. |
- int RemoveDownloadsBetween(const base::Time remove_begin, |
- const base::Time remove_end); |
+ virtual int RemoveDownloadsBetween(const base::Time remove_begin, |
+ const base::Time remove_end) = 0; |
// Remove downloads will delete all downloads that have a timestamp that is |
// the same or more recent than |remove_begin|. The number of downloads |
// deleted is returned back to the caller. |
- int RemoveDownloads(const base::Time remove_begin); |
+ virtual int RemoveDownloads(const base::Time remove_begin) = 0; |
// Remove all downloads will delete all downloads. The number of downloads |
// deleted is returned back to the caller. |
- int RemoveAllDownloads(); |
+ virtual int RemoveAllDownloads() = 0; |
// Final download manager transition for download: Update the download |
// history and remove the download from |active_downloads_|. |
- void DownloadCompleted(int32 download_id); |
+ virtual void DownloadCompleted(int32 download_id) = 0; |
// Download the object at the URL. Used in cases such as "Save Link As..." |
- void DownloadUrl(const GURL& url, |
+ virtual void DownloadUrl(const GURL& url, |
const GURL& referrer, |
const std::string& referrer_encoding, |
- TabContents* tab_contents); |
+ TabContents* tab_contents) = 0; |
// Download the object at the URL and save it to the specified path. The |
// download is treated as the temporary download and thus will not appear |
// in the download history. Used in cases such as drag and drop. |
- void DownloadUrlToFile(const GURL& url, |
+ virtual void DownloadUrlToFile(const GURL& url, |
const GURL& referrer, |
const std::string& referrer_encoding, |
const DownloadSaveInfo& save_info, |
- TabContents* tab_contents); |
+ TabContents* tab_contents) = 0; |
// Allow objects to observe the download creation process. |
- void AddObserver(Observer* observer); |
+ virtual void AddObserver(Observer* observer) = 0; |
// Remove a download observer from ourself. |
- void RemoveObserver(Observer* observer); |
+ virtual void RemoveObserver(Observer* observer) = 0; |
// Called by the embedder, after creating the download manager, to let it know |
// about downloads from previous runs of the browser. |
- void OnPersistentStoreQueryComplete( |
- std::vector<DownloadPersistentStoreInfo>* entries); |
+ virtual void OnPersistentStoreQueryComplete( |
+ std::vector<DownloadPersistentStoreInfo>* entries) = 0; |
// Called by the embedder, in response to |
// DownloadManagerDelegate::AddItemToPersistentStore. |
- void OnItemAddedToPersistentStore(int32 download_id, int64 db_handle); |
+ virtual void OnItemAddedToPersistentStore(int32 download_id, |
+ int64 db_handle) = 0; |
// Display a new download in the appropriate browser UI. |
- void ShowDownloadInBrowser(DownloadItem* download); |
+ virtual void ShowDownloadInBrowser(DownloadItem* download) = 0; |
// The number of in progress (including paused) downloads. |
- int in_progress_count() const { |
- return static_cast<int>(in_progress_.size()); |
- } |
+ virtual int InProgressCount() const = 0; |
- content::BrowserContext* browser_context() { return browser_context_; } |
+ virtual content::BrowserContext* BrowserContext() = 0; |
- FilePath last_download_path() { return last_download_path_; } |
+ virtual FilePath LastDownloadPath() = 0; |
// Creates the download item. Must be called on the UI thread. |
- void CreateDownloadItem(DownloadCreateInfo* info, |
- const DownloadRequestHandle& request_handle); |
+ virtual void CreateDownloadItem(DownloadCreateInfo* info, |
+ const DownloadRequestHandle& request_handle) = 0; |
// Clears the last download path, used to initialize "save as" dialogs. |
- void ClearLastDownloadPath(); |
- |
- // Overridden from DownloadStatusUpdaterDelegate: |
- virtual bool IsDownloadProgressKnown() const OVERRIDE; |
- virtual int64 GetInProgressDownloadCount() const OVERRIDE; |
- virtual int64 GetReceivedDownloadBytes() const OVERRIDE; |
- virtual int64 GetTotalDownloadBytes() const OVERRIDE; |
+ virtual void ClearLastDownloadPath() = 0; |
// Called by the delegate after the save as dialog is closed. |
- void FileSelected(const FilePath& path, void* params); |
- void FileSelectionCanceled(void* params); |
+ virtual void FileSelected(const FilePath& path, void* params) = 0; |
+ virtual void FileSelectionCanceled(void* params) = 0; |
// Called by the delegate if it delayed the download in |
// DownloadManagerDelegate::ShouldStartDownload and now is ready. |
- void RestartDownload(int32 download_id); |
+ virtual void RestartDownload(int32 download_id) = 0; |
// Mark the download opened in the persistent store. |
- void MarkDownloadOpened(DownloadItem* download); |
+ virtual void MarkDownloadOpened(DownloadItem* download) = 0; |
// Checks whether downloaded files still exist. Updates state of downloads |
// that refer to removed files. The check runs in the background and may |
// finish asynchronously after this method returns. |
- void CheckForHistoryFilesRemoval(); |
+ virtual void CheckForHistoryFilesRemoval() = 0; |
// Checks whether a downloaded file still exists and updates the file's state |
// if the file is already removed. The check runs in the background and may |
// finish asynchronously after this method returns. |
- void CheckForFileRemoval(DownloadItem* download_item); |
+ virtual void CheckForFileRemoval(DownloadItem* download_item) = 0; |
// Assert the named download item is on the correct queues |
// in the DownloadManager. For debugging. |
- void AssertQueueStateConsistent(DownloadItem* download); |
+ virtual void AssertQueueStateConsistent(DownloadItem* download) = 0; |
// Get the download item from the history map. Useful after the item has |
// been removed from the active map, or was retrieved from the history DB. |
- DownloadItem* GetDownloadItem(int id); |
+ virtual DownloadItem* GetDownloadItem(int id) = 0; |
// Called when Save Page download starts. Transfers ownership of |download| |
// to the DownloadManager. |
- void SavePageDownloadStarted(DownloadItem* download); |
+ virtual void SavePageDownloadStarted(DownloadItem* download) = 0; |
// Called when Save Page download is done. |
- void SavePageDownloadFinished(DownloadItem* download); |
+ virtual void SavePageDownloadFinished(DownloadItem* download) = 0; |
// Get the download item from the active map. Useful when the item is not |
// yet in the history map. |
- DownloadItem* GetActiveDownloadItem(int id); |
+ virtual DownloadItem* GetActiveDownloadItem(int id) = 0; |
- content::DownloadManagerDelegate* delegate() const { return delegate_; } |
+ virtual content::DownloadManagerDelegate* delegate() const = 0; |
// For testing only. May be called from tests indirectly (through |
// other for testing only methods). |
- void SetDownloadManagerDelegate(content::DownloadManagerDelegate* delegate); |
+ virtual void SetDownloadManagerDelegate( |
+ content::DownloadManagerDelegate* delegate) = 0; |
- DownloadId GetNextId(); |
+ virtual DownloadId GetNextId() = 0; |
- private: |
- typedef std::set<DownloadItem*> DownloadSet; |
- typedef base::hash_map<int64, DownloadItem*> DownloadMap; |
+ protected: |
+ // These functions are here for unit tests. |
+ |
+ // Called back after a target path for the file to be downloaded to has been |
+ // determined, either automatically based on the suggested file name, or by |
+ // the user in a Save As dialog box. |
+ virtual void ContinueDownloadWithPath(DownloadItem* download, |
+ const FilePath& chosen_file) = 0; |
+ // Retrieves the download from the |download_id|. |
+ // Returns NULL if the download is not active. |
+ virtual DownloadItem* GetActiveDownload(int32 download_id) = 0; |
+ |
+ virtual void SetFileManager(DownloadFileManager* file_manager) = 0; |
+ |
+ private: |
// For testing. |
friend class DownloadManagerTest; |
- friend class DownloadTest; |
- friend class MockDownloadManager; |
friend class base::RefCountedThreadSafe< |
DownloadManager, content::BrowserThread::DeleteOnUIThread>; |
friend struct content::BrowserThread::DeleteOnThread< |
content::BrowserThread::UI>; |
friend class DeleteTask<DownloadManager>; |
- |
- virtual ~DownloadManager(); |
- |
- // Called on the FILE thread to check the existence of a downloaded file. |
- void CheckForFileRemovalOnFileThread(int64 db_handle, const FilePath& path); |
- |
- // Called on the UI thread if the FILE thread detects the removal of |
- // the downloaded file. The UI thread updates the state of the file |
- // and then notifies this update to the file's observer. |
- void OnFileRemovalDetected(int64 db_handle); |
- |
- // Called back after a target path for the file to be downloaded to has been |
- // determined, either automatically based on the suggested file name, or by |
- // the user in a Save As dialog box. |
- void ContinueDownloadWithPath(DownloadItem* download, |
- const FilePath& chosen_file); |
- |
- // Retrieves the download from the |download_id|. |
- // Returns NULL if the download is not active. |
- DownloadItem* GetActiveDownload(int32 download_id); |
- |
- // Removes |download| from the active and in progress maps. |
- // Called when the download is cancelled or has an error. |
- // Does nothing if the download is not in the history DB. |
- void RemoveFromActiveList(DownloadItem* download); |
- |
- // Updates the delegate about the overall download progress. |
- void UpdateDownloadProgress(); |
- |
- // Inform observers that the model has changed. |
- void NotifyModelChanged(); |
- |
- // Debugging routine to confirm relationship between below |
- // containers; no-op if NDEBUG. |
- void AssertContainersConsistent() const; |
- |
- // Add a DownloadItem to history_downloads_. |
- void AddDownloadItemToHistory(DownloadItem* item, int64 db_handle); |
- |
- // Remove from internal maps. |
- int RemoveDownloadItems(const DownloadVector& pending_deletes); |
- |
- // Called when a download entry is committed to the persistent store. |
- void OnDownloadItemAddedToPersistentStore(int32 download_id, int64 db_handle); |
- |
- // Called when Save Page As entry is commited to the persistent store. |
- void OnSavePageItemAddedToPersistentStore(int32 download_id, int64 db_handle); |
- |
- // |downloads_| is the owning set for all downloads known to the |
- // DownloadManager. This includes downloads started by the user in |
- // this session, downloads initialized from the history system, and |
- // "save page as" downloads. All other DownloadItem containers in |
- // the DownloadManager are maps; they do not own the DownloadItems. |
- // Note that this is the only place (with any functional implications; |
- // see save_page_downloads_ below) that "save page as" downloads are |
- // kept, as the DownloadManager's only job is to hold onto those |
- // until destruction. |
- // |
- // |history_downloads_| is map of all downloads in this browser context. The |
- // key is the handle returned by the history system, which is unique across |
- // sessions. |
- // |
- // |active_downloads_| is a map of all downloads that are currently being |
- // processed. The key is the ID assigned by the DownloadFileManager, |
- // which is unique for the current session. |
- // |
- // |in_progress_| is a map of all downloads that are in progress and that have |
- // not yet received a valid history handle. The key is the ID assigned by the |
- // DownloadFileManager, which is unique for the current session. |
- // |
- // |save_page_downloads_| (if defined) is a collection of all the |
- // downloads the "save page as" system has given to us to hold onto |
- // until we are destroyed. They key is DownloadFileManager, so it is unique |
- // compared to download item. It is only used for debugging. |
- // |
- // When a download is created through a user action, the corresponding |
- // DownloadItem* is placed in |active_downloads_| and remains there until the |
- // download is in a terminal state (COMPLETE or CANCELLED). It is also |
- // placed in |in_progress_| and remains there until it has received a |
- // valid handle from the history system. Once it has a valid handle, the |
- // DownloadItem* is placed in the |history_downloads_| map. When the |
- // download reaches a terminal state, it is removed from |in_progress_|. |
- // Downloads from past sessions read from a persisted state from the |
- // history system are placed directly into |history_downloads_| since |
- // they have valid handles in the history system. |
- |
- DownloadSet downloads_; |
- DownloadMap history_downloads_; |
- DownloadMap in_progress_; |
- DownloadMap active_downloads_; |
- DownloadMap save_page_downloads_; |
- |
- // True if the download manager has been initialized and requires a shutdown. |
- bool shutdown_needed_; |
- |
- // Observers that want to be notified of changes to the set of downloads. |
- ObserverList<Observer> observers_; |
- |
- // The current active browser context. |
- content::BrowserContext* browser_context_; |
- |
- // Non-owning pointer for handling file writing on the download_thread_. |
- DownloadFileManager* file_manager_; |
- |
- // Non-owning pointer for updating the download status. |
- base::WeakPtr<DownloadStatusUpdater> status_updater_; |
- |
- // The user's last choice for download directory. This is only used when the |
- // user wants us to prompt for a save location for each download. |
- FilePath last_download_path_; |
- |
- // Allows an embedder to control behavior. Guaranteed to outlive this object. |
- content::DownloadManagerDelegate* delegate_; |
- |
- DownloadIdFactory* id_factory_; |
- |
- // TODO(rdsmith): Remove when http://crbug.com/85408 is fixed. |
- // For debugging only. |
- int64 largest_db_handle_in_history_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DownloadManager); |
}; |
#endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_MANAGER_H_ |