Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(603)

Unified Diff: content/browser/download/download_manager.h

Issue 8351052: Created a DownloadManager interface, for use in unit tests.. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed typo. Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/download/download_manager.h
diff --git a/content/browser/download/download_manager.h b/content/browser/download/download_manager.h
index cf8d2db4a181143d753237d84207361f1c49f600..e5554904fdae61e2d740fcf3b6eec035e3379156 100644
--- a/content/browser/download/download_manager.h
+++ b/content/browser/download/download_manager.h
@@ -28,36 +28,23 @@
#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/callback.h"
jam 2011/11/10 17:19:09 nit: remove?
ahendrickson 2011/11/18 18:47:39 Done.
#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 ResourceDispatcherHost;
class TabContents;
struct DownloadCreateInfo;
struct DownloadSaveInfo;
@@ -70,15 +57,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.
@@ -104,192 +88,201 @@ 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;
+
+ virtual DownloadId GetNextId() = 0;
+
+ 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;
- DownloadId GetNextId();
+ // Retrieves the download from the |download_id|.
+ // Returns NULL if the download is not active.
+ virtual DownloadItem* GetActiveDownload(int32 download_id) = 0;
- private:
- typedef std::set<DownloadItem*> DownloadSet;
- typedef base::hash_map<int64, DownloadItem*> DownloadMap;
+ virtual void SetFileManager(DownloadFileManager* file_manager) = 0;
+private:
jam 2011/11/10 17:19:09 nit: spacing
ahendrickson 2011/11/18 18:47:39 Done.
// For testing.
friend class DownloadManagerTest;
jam 2011/11/10 17:19:09 are all these friends still needed?
ahendrickson 2011/11/18 18:47:39 Was able to get rid of two.
friend class DownloadTest;
@@ -300,127 +293,6 @@ class CONTENT_EXPORT DownloadManager
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_

Powered by Google App Engine
This is Rietveld 408576698