diff options
Diffstat (limited to 'content/browser/download')
-rw-r--r-- | content/browser/download/download_item_factory.h | 18 | ||||
-rw-r--r-- | content/browser/download/download_item_impl.cc | 25 | ||||
-rw-r--r-- | content/browser/download/download_item_impl.h | 125 | ||||
-rw-r--r-- | content/browser/download/download_item_impl_delegate.cc | 62 | ||||
-rw-r--r-- | content/browser/download/download_item_impl_delegate.h | 70 | ||||
-rw-r--r-- | content/browser/download/download_item_impl_unittest.cc | 78 | ||||
-rw-r--r-- | content/browser/download/download_manager_impl.cc | 146 | ||||
-rw-r--r-- | content/browser/download/download_manager_impl.h | 90 | ||||
-rw-r--r-- | content/browser/download/download_manager_impl_unittest.cc | 210 | ||||
-rw-r--r-- | content/browser/download/save_package.cc | 7 | ||||
-rw-r--r-- | content/browser/download/save_package.h | 7 |
11 files changed, 521 insertions, 317 deletions
diff --git a/content/browser/download/download_item_factory.h b/content/browser/download/download_item_factory.h index 9dbbf2d..fc47bea 100644 --- a/content/browser/download/download_item_factory.h +++ b/content/browser/download/download_item_factory.h @@ -12,15 +12,17 @@ #include <string> #include "base/memory/scoped_ptr.h" -#include "content/browser/download/download_item_impl.h" +#include "content/public/browser/download_id.h" struct DownloadCreateInfo; + +class DownloadItemImpl; +class DownloadItemImplDelegate; class DownloadRequestHandleInterface; class FilePath; class GURL; namespace content { -class DownloadId; class DownloadItem; struct DownloadPersistentStoreInfo; } @@ -35,21 +37,21 @@ class DownloadItemFactory { public: virtual ~DownloadItemFactory() {} - virtual content::DownloadItem* CreatePersistedItem( - DownloadItemImpl::Delegate* delegate, + virtual DownloadItemImpl* CreatePersistedItem( + DownloadItemImplDelegate* delegate, content::DownloadId download_id, const content::DownloadPersistentStoreInfo& info, const net::BoundNetLog& bound_net_log) = 0; - virtual content::DownloadItem* CreateActiveItem( - DownloadItemImpl::Delegate* delegate, + virtual DownloadItemImpl* CreateActiveItem( + DownloadItemImplDelegate* delegate, const DownloadCreateInfo& info, scoped_ptr<DownloadRequestHandleInterface> request_handle, bool is_otr, const net::BoundNetLog& bound_net_log) = 0; - virtual content::DownloadItem* CreateSavePageItem( - DownloadItemImpl::Delegate* delegate, + virtual DownloadItemImpl* CreateSavePageItem( + DownloadItemImplDelegate* delegate, const FilePath& path, const GURL& url, bool is_otr, diff --git a/content/browser/download/download_item_impl.cc b/content/browser/download/download_item_impl.cc index 3c9521d..6716123 100644 --- a/content/browser/download/download_item_impl.cc +++ b/content/browser/download/download_item_impl.cc @@ -21,6 +21,7 @@ #include "content/browser/download/download_file.h" #include "content/browser/download/download_file_manager.h" #include "content/browser/download/download_interrupt_reasons_impl.h" +#include "content/browser/download/download_item_impl_delegate.h" #include "content/browser/download/download_request_handle.h" #include "content/browser/download/download_stats.h" #include "content/browser/web_contents/web_contents_impl.h" @@ -135,31 +136,13 @@ const char DownloadItem::kEmptyFileHash[] = ""; } -// Infrastructure in DownloadItemImpl::Delegate to assert invariant that -// delegate always outlives all attached DownloadItemImpls. -DownloadItemImpl::Delegate::Delegate() - : count_(0) {} - -DownloadItemImpl::Delegate::~Delegate() { - DCHECK_EQ(0, count_); -} - -void DownloadItemImpl::Delegate::Attach() { - ++count_; -} - -void DownloadItemImpl::Delegate::Detach() { - DCHECK_LT(0, count_); - --count_; -} - // Our download table ID starts at 1, so we use 0 to represent a download that // has started, but has not yet had its data persisted in the table. We use fake // database handles in incognito mode starting at -1 and progressively getting // more negative. // Constructor for reading from the history service. -DownloadItemImpl::DownloadItemImpl(Delegate* delegate, +DownloadItemImpl::DownloadItemImpl(DownloadItemImplDelegate* delegate, DownloadId download_id, const DownloadPersistentStoreInfo& info, const net::BoundNetLog& bound_net_log) @@ -207,7 +190,7 @@ DownloadItemImpl::DownloadItemImpl(Delegate* delegate, // Constructing for a regular download: DownloadItemImpl::DownloadItemImpl( - Delegate* delegate, + DownloadItemImplDelegate* delegate, const DownloadCreateInfo& info, scoped_ptr<DownloadRequestHandleInterface> request_handle, bool is_otr, @@ -267,7 +250,7 @@ DownloadItemImpl::DownloadItemImpl( } // Constructing for the "Save Page As..." feature: -DownloadItemImpl::DownloadItemImpl(Delegate* delegate, +DownloadItemImpl::DownloadItemImpl(DownloadItemImplDelegate* delegate, const FilePath& path, const GURL& url, bool is_otr, diff --git a/content/browser/download/download_item_impl.h b/content/browser/download/download_item_impl.h index af0b505..80cdc1b 100644 --- a/content/browser/download/download_item_impl.h +++ b/content/browser/download/download_item_impl.h @@ -23,78 +23,25 @@ #include "net/base/net_errors.h" #include "net/base/net_log.h" +class DownloadItemImplDelegate; + // See download_item.h for usage. class CONTENT_EXPORT DownloadItemImpl : public content::DownloadItem { public: - // Delegate is defined in DownloadItemImpl (rather than DownloadItem) - // as it's relevant to the class implementation (class methods need to - // call into it) and doesn't have anything to do with its interface. - // Despite this, the delegate methods take DownloadItems as arguments - // (rather than DownloadItemImpls) so that classes that inherit from it - // can be used with DownloadItem mocks rather than being tied to - // DownloadItemImpls. - class CONTENT_EXPORT Delegate { - public: - Delegate(); - - // Used for catching use-after-free errors. - void Attach(); - void Detach(); - - // Tests if a file type should be opened automatically. - virtual bool ShouldOpenFileBasedOnExtension(const FilePath& path) = 0; - - // Allows the delegate to override the opening of a download. If it returns - // true then it's reponsible for opening the item. - virtual bool ShouldOpenDownload(DownloadItem* download) = 0; - - // Checks whether a downloaded file still exists and updates the - // file's state if the file is already removed. - // The check may or may not result in a later asynchronous call - // to OnDownloadedFileRemoved(). - virtual void CheckForFileRemoval(DownloadItem* download_item) = 0; - - // If all pre-requisites have been met, complete download processing. - // TODO(rdsmith): Move into DownloadItem. - virtual void MaybeCompleteDownload(DownloadItem* download) = 0; - - // For contextual issues like language and prefs. - virtual content::BrowserContext* GetBrowserContext() const = 0; - - // Handle any delegate portions of a state change operation on the - // DownloadItem. - virtual void DownloadStopped(DownloadItem* download) = 0; - virtual void DownloadCompleted(DownloadItem* download) = 0; - virtual void DownloadOpened(DownloadItem* download) = 0; - virtual void DownloadRemoved(DownloadItem* download) = 0; - virtual void DownloadRenamedToIntermediateName(DownloadItem* download) = 0; - virtual void DownloadRenamedToFinalName(DownloadItem* download) = 0; - - // Assert consistent state for delgate object at various transitions. - virtual void AssertStateConsistent(DownloadItem* download) const = 0; - - protected: - virtual ~Delegate(); - - private: - // For "Outlives attached DownloadItemImpl" invariant assertion. - int count_; - }; - // Note that it is the responsibility of the caller to ensure that a - // DownloadItemImpl::Delegate passed to a DownloadItemImpl constructor + // DownloadItemImplDelegate passed to a DownloadItemImpl constructor // outlives the DownloadItemImpl. // Constructing from persistent store: // |bound_net_log| is constructed externally for our use. - DownloadItemImpl(Delegate* delegate, + DownloadItemImpl(DownloadItemImplDelegate* delegate, content::DownloadId download_id, const content::DownloadPersistentStoreInfo& info, const net::BoundNetLog& bound_net_log); // Constructing for a regular download. // |bound_net_log| is constructed externally for our use. - DownloadItemImpl(Delegate* delegate, + DownloadItemImpl(DownloadItemImplDelegate* delegate, const DownloadCreateInfo& info, scoped_ptr<DownloadRequestHandleInterface> request_handle, bool is_otr, @@ -102,7 +49,7 @@ class CONTENT_EXPORT DownloadItemImpl : public content::DownloadItem { // Constructing for the "Save Page As..." feature: // |bound_net_log| is constructed externally for our use. - DownloadItemImpl(Delegate* delegate, + DownloadItemImpl(DownloadItemImplDelegate* delegate, const FilePath& path, const GURL& url, bool is_otr, @@ -112,6 +59,51 @@ class CONTENT_EXPORT DownloadItemImpl : public content::DownloadItem { virtual ~DownloadItemImpl(); + // Implementation functions (not part of the DownloadItem interface). + + // Indicate that an error has occurred on the download. + virtual void Interrupt(content::DownloadInterruptReason reason); + + // Mark the item as having been persisted. + virtual void SetIsPersisted(); + + // Set the item's DB handle. + virtual void SetDbHandle(int64 handle); + + // Cancels the off-thread aspects of the download. + // TODO(rdsmith): This should be private and only called from + // DownloadItem::Cancel/Interrupt; it isn't now because we can't + // call those functions from + // DownloadManager::FileSelectionCancelled() without doing some + // rewrites of the DownloadManager queues. + virtual void OffThreadCancel(DownloadFileManager* file_manager); + + // Called when the downloaded file is removed. + virtual void OnDownloadedFileRemoved(); + + // Called when the download is ready to complete. + // This may perform final rename if necessary and will eventually call + // DownloadItem::Completed(). + virtual void OnDownloadCompleting(DownloadFileManager* file_manager); + + // Called periodically from the download thread, or from the UI thread + // for saving packages. + // |bytes_so_far| is the number of bytes received so far. + // |hash_state| is the current hash state. + virtual void UpdateProgress(int64 bytes_so_far, + int64 bytes_per_sec, + const std::string& hash_state); + + // Called by SavePackage to display progress when the DownloadItem + // should be considered complete. + virtual void MarkAsComplete(); + + // Called when all data has been saved. Only has display effects. + virtual void OnAllDataSaved(int64 size, const std::string& final_hash); + + // Called by SavePackage to set the total number of bytes on the item. + virtual void SetTotalBytes(int64 total_bytes); + // Overridden from DownloadItem. virtual void AddObserver(DownloadItem::Observer* observer) OVERRIDE; virtual void RemoveObserver(DownloadItem::Observer* observer) OVERRIDE; @@ -122,16 +114,8 @@ class CONTENT_EXPORT DownloadItemImpl : public content::DownloadItem { virtual void OpenDownload() OVERRIDE; virtual void ShowDownloadInShell() OVERRIDE; virtual void DangerousDownloadValidated() OVERRIDE; - virtual void UpdateProgress(int64 bytes_so_far, - int64 bytes_per_sec, - const std::string& hash_state) OVERRIDE; virtual void Cancel(bool user_cancel) OVERRIDE; - virtual void Interrupt(content::DownloadInterruptReason reason) OVERRIDE; - virtual void MarkAsComplete() OVERRIDE; virtual void DelayedDownloadOpened(bool auto_opened) OVERRIDE; - virtual void OnAllDataSaved( - int64 size, const std::string& final_hash) OVERRIDE; - virtual void OnDownloadedFileRemoved() OVERRIDE; virtual void Delete(DeleteReason reason) OVERRIDE; virtual void Remove() OVERRIDE; virtual bool TimeRemaining(base::TimeDelta* remaining) const OVERRIDE; @@ -139,7 +123,6 @@ class CONTENT_EXPORT DownloadItemImpl : public content::DownloadItem { virtual int PercentComplete() const OVERRIDE; virtual bool AllDataSaved() const OVERRIDE; virtual void TogglePause() OVERRIDE; - virtual void OnDownloadCompleting(DownloadFileManager* file_manager) OVERRIDE; virtual bool MatchesQuery(const string16& query) const OVERRIDE; virtual bool IsPartialDownload() const OVERRIDE; virtual bool IsInProgress() const OVERRIDE; @@ -170,7 +153,6 @@ class CONTENT_EXPORT DownloadItemImpl : public content::DownloadItem { virtual std::string GetReferrerCharset() const OVERRIDE; virtual std::string GetRemoteAddress() const OVERRIDE; virtual int64 GetTotalBytes() const OVERRIDE; - virtual void SetTotalBytes(int64 total_bytes) OVERRIDE; virtual const std::string& GetHash() const OVERRIDE; virtual int64 GetReceivedBytes() const OVERRIDE; virtual const std::string& GetHashState() const OVERRIDE; @@ -178,9 +160,7 @@ class CONTENT_EXPORT DownloadItemImpl : public content::DownloadItem { virtual content::DownloadId GetGlobalId() const OVERRIDE; virtual base::Time GetStartTime() const OVERRIDE; virtual base::Time GetEndTime() const OVERRIDE; - virtual void SetIsPersisted() OVERRIDE; virtual bool IsPersisted() const OVERRIDE; - virtual void SetDbHandle(int64 handle) OVERRIDE; virtual int64 GetDbHandle() const OVERRIDE; virtual bool IsPaused() const OVERRIDE; virtual bool GetOpenWhenComplete() const OVERRIDE; @@ -209,7 +189,6 @@ class CONTENT_EXPORT DownloadItemImpl : public content::DownloadItem { virtual FilePath GetFileNameToReportUser() const OVERRIDE; virtual void SetDisplayName(const FilePath& name) OVERRIDE; virtual FilePath GetUserVerifiedFilePath() const OVERRIDE; - virtual void OffThreadCancel(DownloadFileManager* file_manager) OVERRIDE; virtual std::string DebugString(bool verbose) const OVERRIDE; virtual void MockDownloadOpenForTesting() OVERRIDE; virtual ExternalData* GetExternalData(const void* key) OVERRIDE; @@ -377,7 +356,7 @@ class CONTENT_EXPORT DownloadItemImpl : public content::DownloadItem { int64 db_handle_; // Our delegate. - Delegate* delegate_; + DownloadItemImplDelegate* delegate_; // In progress downloads may be paused by the user, we note it here. bool is_paused_; diff --git a/content/browser/download/download_item_impl_delegate.cc b/content/browser/download/download_item_impl_delegate.cc new file mode 100644 index 0000000..7efcd1c --- /dev/null +++ b/content/browser/download/download_item_impl_delegate.cc @@ -0,0 +1,62 @@ +// 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. + +#include "base/logging.h" +#include "content/browser/download/download_item_impl_delegate.h" + +class DownloadItemImpl; + +// Infrastructure in DownloadItemImplDelegate to assert invariant that +// delegate always outlives all attached DownloadItemImpls. +DownloadItemImplDelegate::DownloadItemImplDelegate() + : count_(0) {} + +DownloadItemImplDelegate::~DownloadItemImplDelegate() { + DCHECK_EQ(0, count_); +} + +void DownloadItemImplDelegate::Attach() { + ++count_; +} + +void DownloadItemImplDelegate::Detach() { + DCHECK_LT(0, count_); + --count_; +} + +bool DownloadItemImplDelegate::ShouldOpenFileBasedOnExtension( + const FilePath& path) { + return false; +} + +bool DownloadItemImplDelegate::ShouldOpenDownload(DownloadItemImpl* download) { + return false; +} + +void DownloadItemImplDelegate::CheckForFileRemoval( + DownloadItemImpl* download_item) {} + +void DownloadItemImplDelegate::MaybeCompleteDownload( + DownloadItemImpl* download) {} + +content::BrowserContext* DownloadItemImplDelegate::GetBrowserContext() const { + return NULL; +} + +void DownloadItemImplDelegate::DownloadStopped(DownloadItemImpl* download) {} + +void DownloadItemImplDelegate::DownloadCompleted(DownloadItemImpl* download) {} + +void DownloadItemImplDelegate::DownloadOpened(DownloadItemImpl* download) {} + +void DownloadItemImplDelegate::DownloadRemoved(DownloadItemImpl* download) {} + +void DownloadItemImplDelegate::DownloadRenamedToIntermediateName( + DownloadItemImpl* download) {} + +void DownloadItemImplDelegate::DownloadRenamedToFinalName( + DownloadItemImpl* download) {} + +void DownloadItemImplDelegate::AssertStateConsistent( + DownloadItemImpl* download) const {} diff --git a/content/browser/download/download_item_impl_delegate.h b/content/browser/download/download_item_impl_delegate.h new file mode 100644 index 0000000..b947af7 --- /dev/null +++ b/content/browser/download/download_item_impl_delegate.h @@ -0,0 +1,70 @@ +// 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 CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_IMPL_DELEGATE_H_ +#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_IMPL_DELEGATE_H_ + +#include "base/file_path.h" +#include "content/common/content_export.h" + +class DownloadItemImpl; + +namespace content { +class BrowserContext; +} + +// Delegate for operations that a DownloadItemImpl can't do for itself. +// The base implementation of this class does nothing (returning false +// on predicates) so interfaces not of interest to a derived class may +// be left unimplemented. +class CONTENT_EXPORT DownloadItemImplDelegate { + public: + DownloadItemImplDelegate(); + virtual ~DownloadItemImplDelegate(); + + // Used for catching use-after-free errors. + void Attach(); + void Detach(); + + // Tests if a file type should be opened automatically. + virtual bool ShouldOpenFileBasedOnExtension(const FilePath& path); + + // Allows the delegate to override the opening of a download. If it returns + // true then it's reponsible for opening the item. + virtual bool ShouldOpenDownload(DownloadItemImpl* download); + + // Checks whether a downloaded file still exists and updates the + // file's state if the file is already removed. + // The check may or may not result in a later asynchronous call + // to OnDownloadedFileRemoved(). + virtual void CheckForFileRemoval(DownloadItemImpl* download_item); + + // If all pre-requisites have been met, complete download processing. + // TODO(rdsmith): Move into DownloadItem. + virtual void MaybeCompleteDownload(DownloadItemImpl* download); + + // For contextual issues like language and prefs. + virtual content::BrowserContext* GetBrowserContext() const; + + // Handle any delegate portions of a state change operation on the + // DownloadItem. + virtual void DownloadStopped(DownloadItemImpl* download); + virtual void DownloadCompleted(DownloadItemImpl* download); + virtual void DownloadOpened(DownloadItemImpl* download); + virtual void DownloadRemoved(DownloadItemImpl* download); + virtual void DownloadRenamedToIntermediateName( + DownloadItemImpl* download); + virtual void DownloadRenamedToFinalName(DownloadItemImpl* download); + + // Assert consistent state for delgate object at various transitions. + virtual void AssertStateConsistent(DownloadItemImpl* download) const; + + private: + // For "Outlives attached DownloadItemImpl" invariant assertion. + int count_; + + DISALLOW_COPY_AND_ASSIGN(DownloadItemImplDelegate); +}; + +#endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_ITEM_IMPL_DELEGATE_H_ diff --git a/content/browser/download/download_item_impl_unittest.cc b/content/browser/download/download_item_impl_unittest.cc index c7ac84d..fecb6f5 100644 --- a/content/browser/download/download_item_impl_unittest.cc +++ b/content/browser/download/download_item_impl_unittest.cc @@ -9,6 +9,7 @@ #include "content/browser/download/download_create_info.h" #include "content/browser/download/download_file_manager.h" #include "content/browser/download/download_item_impl.h" +#include "content/browser/download/download_item_impl_delegate.h" #include "content/browser/download/download_request_handle.h" #include "content/public/browser/download_id.h" #include "content/public/browser/download_interrupt_reasons.h" @@ -31,20 +32,21 @@ using ::testing::Return; DownloadId::Domain kValidDownloadItemIdDomain = "valid DownloadId::Domain"; namespace { -class MockDelegate : public DownloadItemImpl::Delegate { +class MockDelegate : public DownloadItemImplDelegate { public: MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const FilePath& path)); - MOCK_METHOD1(ShouldOpenDownload, bool(DownloadItem* download)); - MOCK_METHOD1(CheckForFileRemoval, void(DownloadItem* download)); - MOCK_METHOD1(MaybeCompleteDownload, void(DownloadItem* download)); + MOCK_METHOD1(ShouldOpenDownload, bool(DownloadItemImpl* download)); + MOCK_METHOD1(CheckForFileRemoval, void(DownloadItemImpl* download)); + MOCK_METHOD1(MaybeCompleteDownload, void(DownloadItemImpl* download)); MOCK_CONST_METHOD0(GetBrowserContext, content::BrowserContext*()); - MOCK_METHOD1(DownloadStopped, void(DownloadItem* download)); - MOCK_METHOD1(DownloadCompleted, void(DownloadItem* download)); - MOCK_METHOD1(DownloadOpened, void(DownloadItem* download)); - MOCK_METHOD1(DownloadRemoved, void(DownloadItem* download)); - MOCK_METHOD1(DownloadRenamedToIntermediateName, void(DownloadItem* download)); - MOCK_METHOD1(DownloadRenamedToFinalName, void(DownloadItem* download)); - MOCK_CONST_METHOD1(AssertStateConsistent, void(DownloadItem* download)); + MOCK_METHOD1(DownloadStopped, void(DownloadItemImpl* download)); + MOCK_METHOD1(DownloadCompleted, void(DownloadItemImpl* download)); + MOCK_METHOD1(DownloadOpened, void(DownloadItemImpl* download)); + MOCK_METHOD1(DownloadRemoved, void(DownloadItemImpl* download)); + MOCK_METHOD1(DownloadRenamedToIntermediateName, + void(DownloadItemImpl* download)); + MOCK_METHOD1(DownloadRenamedToFinalName, void(DownloadItemImpl* download)); + MOCK_CONST_METHOD1(AssertStateConsistent, void(DownloadItemImpl* download)); }; class MockRequestHandle : public DownloadRequestHandleInterface { @@ -162,7 +164,7 @@ class DownloadItemTest : public testing::Test { // This class keeps ownership of the created download item; it will // be torn down at the end of the test unless DestroyDownloadItem is // called. - DownloadItem* CreateDownloadItem(DownloadItem::DownloadState state) { + DownloadItemImpl* CreateDownloadItem(DownloadItem::DownloadState state) { // Normally, the download system takes ownership of info, and is // responsible for deleting it. In these unit tests, however, we // don't call the function that deletes it, so we do so ourselves. @@ -178,7 +180,7 @@ class DownloadItemTest : public testing::Test { scoped_ptr<DownloadRequestHandleInterface> request_handle( new testing::NiceMock<MockRequestHandle>); - DownloadItem* download = + DownloadItemImpl* download = new DownloadItemImpl(&delegate_, *(info_.get()), request_handle.Pass(), false, net::BoundNetLog()); allocated_downloads_.insert(download); @@ -226,7 +228,7 @@ const FilePath::CharType kDummyPath[] = FILE_PATH_LITERAL("/testpath"); // set_* mutators TEST_F(DownloadItemTest, NotificationAfterUpdate) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver observer(item); item->UpdateProgress(kDownloadChunkSize, kDownloadSpeed, ""); @@ -235,13 +237,14 @@ TEST_F(DownloadItemTest, NotificationAfterUpdate) { } TEST_F(DownloadItemTest, NotificationAfterCancel) { - DownloadItem* user_cancel = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* user_cancel = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver observer1(user_cancel); user_cancel->Cancel(true); ASSERT_TRUE(observer1.CheckUpdated()); - DownloadItem* system_cancel = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* system_cancel = + CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver observer2(system_cancel); system_cancel->Cancel(false); @@ -249,7 +252,7 @@ TEST_F(DownloadItemTest, NotificationAfterCancel) { } TEST_F(DownloadItemTest, NotificationAfterComplete) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver observer(item); item->OnAllDataSaved(kDownloadChunkSize, DownloadItem::kEmptyFileHash); @@ -260,7 +263,7 @@ TEST_F(DownloadItemTest, NotificationAfterComplete) { } TEST_F(DownloadItemTest, NotificationAfterDownloadedFileRemoved) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver observer(item); item->OnDownloadedFileRemoved(); @@ -268,7 +271,7 @@ TEST_F(DownloadItemTest, NotificationAfterDownloadedFileRemoved) { } TEST_F(DownloadItemTest, NotificationAfterInterrupted) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver observer(item); item->Interrupt(content::DOWNLOAD_INTERRUPT_REASON_NONE); @@ -276,7 +279,7 @@ TEST_F(DownloadItemTest, NotificationAfterInterrupted) { } TEST_F(DownloadItemTest, NotificationAfterDelete) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver observer(item); item->Delete(DownloadItem::DELETE_DUE_TO_BROWSER_SHUTDOWN); @@ -284,7 +287,7 @@ TEST_F(DownloadItemTest, NotificationAfterDelete) { } TEST_F(DownloadItemTest, NotificationAfterRemove) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver observer(item); item->Remove(); @@ -292,7 +295,7 @@ TEST_F(DownloadItemTest, NotificationAfterRemove) { } TEST_F(DownloadItemTest, NotificationAfterOnTargetPathDetermined) { - DownloadItem* safe_item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* safe_item = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver safe_observer(safe_item); // Calling OnTargetPathDetermined does not trigger notification if danger type @@ -302,7 +305,8 @@ TEST_F(DownloadItemTest, NotificationAfterOnTargetPathDetermined) { content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); EXPECT_FALSE(safe_observer.CheckUpdated()); - DownloadItem* dangerous_item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* dangerous_item = + CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver dangerous_observer(dangerous_item); // Calling OnTargetPathDetermined does trigger notification if danger type @@ -314,7 +318,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnTargetPathDetermined) { } TEST_F(DownloadItemTest, NotificationAfterOnTargetPathSelected) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver observer(item); item->OnTargetPathDetermined( @@ -326,7 +330,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnTargetPathSelected) { TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { // Setting to NOT_DANGEROUS does not trigger a notification. - DownloadItem* safe_item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* safe_item = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver safe_observer(safe_item); safe_item->OnTargetPathDetermined( @@ -340,7 +344,8 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { EXPECT_FALSE(safe_observer.CheckUpdated()); // Setting to unsafe url or unsafe file should trigger a notification. - DownloadItem* unsafeurl_item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* unsafeurl_item = + CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver unsafeurl_observer(unsafeurl_item); unsafeurl_item->OnTargetPathDetermined( @@ -356,7 +361,8 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { unsafeurl_item->DangerousDownloadValidated(); EXPECT_TRUE(unsafeurl_observer.CheckUpdated()); - DownloadItem* unsafefile_item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* unsafefile_item = + CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver unsafefile_observer(unsafefile_item); unsafefile_item->OnTargetPathDetermined( @@ -379,7 +385,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { // name. Check that observers are updated when the new filename is available and // not before. TEST_F(DownloadItemTest, NotificationAfterOnIntermediatePathDetermined) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver observer(item); FilePath intermediate_path(kDummyPath); FilePath new_intermediate_path(intermediate_path.AppendASCII("foo")); @@ -397,7 +403,7 @@ TEST_F(DownloadItemTest, NotificationAfterOnIntermediatePathDetermined) { } TEST_F(DownloadItemTest, NotificationAfterTogglePause) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); MockObserver observer(item); item->TogglePause(); @@ -408,7 +414,7 @@ TEST_F(DownloadItemTest, NotificationAfterTogglePause) { } TEST_F(DownloadItemTest, DisplayName) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); item->OnTargetPathDetermined(FilePath(kDummyPath).AppendASCII("foo.bar"), DownloadItem::TARGET_DISPOSITION_OVERWRITE, content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); @@ -431,8 +437,8 @@ class TestExternalData : public DownloadItem::ExternalData { }; TEST_F(DownloadItemTest, ExternalData) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); - const DownloadItem* const_item = item; + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + const DownloadItemImpl* const_item = item; // Shouldn't be anything there before set. EXPECT_EQ(NULL, item->GetExternalData(&external_data_test_string)); @@ -492,7 +498,7 @@ TEST_F(DownloadItemTest, ExternalData) { // Delegate::DownloadRenamedToFinalName() should be invoked after the final // rename. TEST_F(DownloadItemTest, CallbackAfterRename) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); FilePath intermediate_path(kDummyPath); FilePath new_intermediate_path(intermediate_path.AppendASCII("foo")); FilePath final_path(intermediate_path.AppendASCII("bar")); @@ -546,7 +552,7 @@ TEST_F(DownloadItemTest, CallbackAfterRename) { } TEST_F(DownloadItemTest, Interrupted) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); const content::DownloadInterruptReason reason( content::DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); @@ -564,7 +570,7 @@ TEST_F(DownloadItemTest, Interrupted) { } TEST_F(DownloadItemTest, Canceled) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); // Confirm cancel sets state properly. EXPECT_CALL(*mock_delegate(), DownloadStopped(item)); @@ -573,7 +579,7 @@ TEST_F(DownloadItemTest, Canceled) { } TEST_F(DownloadItemTest, FileRemoved) { - DownloadItem* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); + DownloadItemImpl* item = CreateDownloadItem(DownloadItem::IN_PROGRESS); EXPECT_FALSE(item->GetFileExternallyRemoved()); item->OnDownloadedFileRemoved(); diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index f742c7c..a2806ba 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc @@ -165,16 +165,16 @@ class DownloadItemFactoryImpl : public content::DownloadItemFactory { DownloadItemFactoryImpl() {} virtual ~DownloadItemFactoryImpl() {} - virtual content::DownloadItem* CreatePersistedItem( - DownloadItemImpl::Delegate* delegate, + virtual DownloadItemImpl* CreatePersistedItem( + DownloadItemImplDelegate* delegate, content::DownloadId download_id, const content::DownloadPersistentStoreInfo& info, const net::BoundNetLog& bound_net_log) OVERRIDE { return new DownloadItemImpl(delegate, download_id, info, bound_net_log); } - virtual content::DownloadItem* CreateActiveItem( - DownloadItemImpl::Delegate* delegate, + virtual DownloadItemImpl* CreateActiveItem( + DownloadItemImplDelegate* delegate, const DownloadCreateInfo& info, scoped_ptr<DownloadRequestHandleInterface> request_handle, bool is_otr, @@ -183,8 +183,8 @@ class DownloadItemFactoryImpl : public content::DownloadItemFactory { is_otr, bound_net_log); } - virtual content::DownloadItem* CreateSavePageItem( - DownloadItemImpl::Delegate* delegate, + virtual DownloadItemImpl* CreateSavePageItem( + DownloadItemImplDelegate* delegate, const FilePath& path, const GURL& url, bool is_otr, @@ -244,7 +244,7 @@ DownloadId DownloadManagerImpl::GetNextId() { return id; } -bool DownloadManagerImpl::ShouldOpenDownload(DownloadItem* item) { +bool DownloadManagerImpl::ShouldOpenDownload(DownloadItemImpl* item) { if (!delegate_) return true; @@ -288,7 +288,7 @@ void DownloadManagerImpl::Shutdown() { // Go through all downloads in downloads_. Dangerous ones we need to // remove on disk, and in progress ones we need to cancel. for (DownloadMap::iterator it = downloads_.begin(); it != downloads_.end();) { - DownloadItem* download = it->second; + DownloadItemImpl* download = it->second; // Save iterator from potential erases in this set done by called code. // Iterators after an erasure point are still valid for lists and @@ -339,7 +339,7 @@ void DownloadManagerImpl::GetTemporaryDownloads( for (DownloadMap::iterator it = downloads_.begin(); it != downloads_.end(); ++it) { - DownloadItem* item = it->second; + DownloadItemImpl* item = it->second; // TODO(benjhayden): Don't check IsPersisted(). if (item->IsTemporary() && item->IsPersisted() && @@ -355,7 +355,7 @@ void DownloadManagerImpl::GetAllDownloads( for (DownloadMap::iterator it = downloads_.begin(); it != downloads_.end(); ++it) { - DownloadItem* item = it->second; + DownloadItemImpl* item = it->second; // TODO(benjhayden): Don't check IsPersisted(). if (!item->IsTemporary() && item->IsPersisted() && @@ -371,7 +371,7 @@ void DownloadManagerImpl::SearchDownloads(const string16& query, for (DownloadMap::iterator it = downloads_.begin(); it != downloads_.end(); ++it) { - DownloadItem* download_item = it->second; + DownloadItemImpl* download_item = it->second; // Display Incognito downloads only in Incognito window, and vice versa. // The Incognito Downloads page will get the list of non-Incognito downloads // from its parent profile. @@ -446,13 +446,13 @@ void DownloadManagerImpl::CheckForHistoryFilesRemoval() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); for (DownloadMap::iterator it = downloads_.begin(); it != downloads_.end(); ++it) { - DownloadItem* item = it->second; + DownloadItemImpl* item = it->second; if (item->IsPersisted()) CheckForFileRemoval(item); } } -void DownloadManagerImpl::CheckForFileRemoval(DownloadItem* download_item) { +void DownloadManagerImpl::CheckForFileRemoval(DownloadItemImpl* download_item) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); if (download_item->IsComplete() && !download_item->GetFileExternallyRemoved()) { @@ -478,17 +478,16 @@ void DownloadManagerImpl::CheckForFileRemovalOnFileThread( void DownloadManagerImpl::OnFileRemovalDetected(int32 download_id) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - DownloadItem* download = GetDownload(download_id); - if (download) - download->OnDownloadedFileRemoved(); + if (ContainsKey(downloads_, download_id)) + downloads_[download_id]->OnDownloadedFileRemoved(); } void DownloadManagerImpl::RestartDownload(int32 download_id) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - DownloadItem* download = GetActiveDownloadItem(download_id); - if (!download) + if (!ContainsKey(active_downloads_, download_id)) return; + DownloadItemImpl* download = active_downloads_[download_id]; VLOG(20) << __FUNCTION__ << "()" << " download = " << download->DebugString(true); @@ -525,7 +524,7 @@ net::BoundNetLog DownloadManagerImpl::CreateDownloadItem( net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD); if (!info->download_id.IsValid()) info->download_id = GetNextId(); - DownloadItem* download = factory_->CreateActiveItem( + DownloadItemImpl* download = factory_->CreateActiveItem( this, *info, scoped_ptr<DownloadRequestHandleInterface>( new DownloadRequestHandle(info->request_handle)).Pass(), @@ -539,7 +538,7 @@ net::BoundNetLog DownloadManagerImpl::CreateDownloadItem( return bound_net_log; } -DownloadItem* DownloadManagerImpl::CreateSavePackageDownloadItem( +DownloadItemImpl* DownloadManagerImpl::CreateSavePackageDownloadItem( const FilePath& main_file_path, const GURL& page_url, bool is_otr, @@ -547,7 +546,7 @@ DownloadItem* DownloadManagerImpl::CreateSavePackageDownloadItem( DownloadItem::Observer* observer) { net::BoundNetLog bound_net_log = net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD); - DownloadItem* download = factory_->CreateSavePageItem( + DownloadItemImpl* download = factory_->CreateSavePageItem( this, main_file_path, page_url, @@ -573,7 +572,7 @@ DownloadItem* DownloadManagerImpl::CreateSavePackageDownloadItem( // The target path for the download item is now valid. We proceed with the // determination of an intermediate path. -void DownloadManagerImpl::OnTargetPathAvailable(DownloadItem* download) { +void DownloadManagerImpl::OnTargetPathAvailable(DownloadItemImpl* download) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(download); DCHECK(ContainsKey(downloads_, download->GetId())); @@ -608,7 +607,7 @@ void DownloadManagerImpl::UpdateDownload(int32 download_id, DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DownloadMap::iterator it = active_downloads_.find(download_id); if (it != active_downloads_.end()) { - DownloadItem* download = it->second; + DownloadItemImpl* download = it->second; if (download->IsInProgress()) { download->UpdateProgress(bytes_so_far, bytes_per_sec, hash_state); if (delegate_) @@ -630,12 +629,13 @@ void DownloadManagerImpl::OnResponseCompleted(int32 download_id, if (active_downloads_.count(download_id) == 0) return; - DownloadItem* download = active_downloads_[download_id]; + DownloadItemImpl* download = active_downloads_[download_id]; download->OnAllDataSaved(size, hash); MaybeCompleteDownload(download); } -void DownloadManagerImpl::AssertStateConsistent(DownloadItem* download) const { +void DownloadManagerImpl::AssertStateConsistent( + DownloadItemImpl* download) const { if (download->GetState() == DownloadItem::REMOVING) { DCHECK(!ContainsKey(downloads_, download->GetId())); DCHECK(!ContainsKey(active_downloads_, download->GetId())); @@ -657,7 +657,8 @@ void DownloadManagerImpl::AssertStateConsistent(DownloadItem* download) const { CHECK(ContainsKey(active_downloads_, download->GetId())); } -bool DownloadManagerImpl::IsDownloadReadyForCompletion(DownloadItem* download) { +bool DownloadManagerImpl::IsDownloadReadyForCompletion( + DownloadItemImpl* download) { // If we don't have all the data, the download is not ready for // completion. if (!download->AllDataSaved()) @@ -692,7 +693,8 @@ bool DownloadManagerImpl::IsDownloadReadyForCompletion(DownloadItem* download) { // downloads. SavePackage always uses its own Finish() to mark downloads // complete. -void DownloadManagerImpl::MaybeCompleteDownload(DownloadItem* download) { +void DownloadManagerImpl::MaybeCompleteDownload( + DownloadItemImpl* download) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); VLOG(20) << __FUNCTION__ << "()" << " download = " << download->DebugString(false); @@ -730,12 +732,11 @@ void DownloadManagerImpl::MaybeCompleteDownload(DownloadItem* download) { } void DownloadManagerImpl::MaybeCompleteDownloadById(int download_id) { - DownloadItem* download_item = GetActiveDownload(download_id); - if (download_item != NULL) - MaybeCompleteDownload(download_item); + if (ContainsKey(active_downloads_, download_id)) + MaybeCompleteDownload(active_downloads_[download_id]); } -void DownloadManagerImpl::DownloadCompleted(DownloadItem* download) { +void DownloadManagerImpl::DownloadCompleted(DownloadItemImpl* download) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(download); if (delegate_) @@ -745,16 +746,13 @@ void DownloadManagerImpl::DownloadCompleted(DownloadItem* download) { } void DownloadManagerImpl::CancelDownload(int32 download_id) { - DownloadItem* download = GetActiveDownload(download_id); // A cancel at the right time could remove the download from the // |active_downloads_| map before we get here. - if (!download) - return; - - download->Cancel(true); + if (ContainsKey(active_downloads_, download_id)) + active_downloads_[download_id]->Cancel(true); } -void DownloadManagerImpl::DownloadStopped(DownloadItem* download) { +void DownloadManagerImpl::DownloadStopped(DownloadItemImpl* download) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); VLOG(20) << __FUNCTION__ << "()" @@ -776,28 +774,15 @@ void DownloadManagerImpl::OnDownloadInterrupted( content::DownloadInterruptReason reason) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - DownloadItem* download = GetActiveDownload(download_id); - if (!download) + if (!ContainsKey(active_downloads_, download_id)) return; + + DownloadItemImpl* download = active_downloads_[download_id]; download->UpdateProgress(size, 0, hash_state); download->Interrupt(reason); } -DownloadItem* DownloadManagerImpl::GetActiveDownload(int32 download_id) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - DownloadMap::iterator it = active_downloads_.find(download_id); - if (it == active_downloads_.end()) - return NULL; - - DownloadItem* download = it->second; - - DCHECK(download); - DCHECK_EQ(download_id, download->GetId()); - - return download; -} - -void DownloadManagerImpl::RemoveFromActiveList(DownloadItem* download) { +void DownloadManagerImpl::RemoveFromActiveList(DownloadItemImpl* download) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(download); @@ -815,15 +800,15 @@ bool DownloadManagerImpl::GenerateFileHash() { } int DownloadManagerImpl::RemoveDownloadItems( - const DownloadVector& pending_deletes) { + const DownloadItemImplVector& pending_deletes) { if (pending_deletes.empty()) return 0; // Delete from internal maps. - for (DownloadVector::const_iterator it = pending_deletes.begin(); + for (DownloadItemImplVector::const_iterator it = pending_deletes.begin(); it != pending_deletes.end(); ++it) { - DownloadItem* download = *it; + DownloadItemImpl* download = *it; DCHECK(download); downloads_.erase(download->GetId()); } @@ -837,7 +822,7 @@ int DownloadManagerImpl::RemoveDownloadItems( return num_deleted; } -void DownloadManagerImpl::DownloadRemoved(DownloadItem* download) { +void DownloadManagerImpl::DownloadRemoved(DownloadItemImpl* download) { if (!download || downloads_.find(download->GetId()) == downloads_.end()) return; @@ -851,7 +836,8 @@ void DownloadManagerImpl::DownloadRemoved(DownloadItem* download) { delegate_->RemoveItemFromPersistentStore(download); // Remove from our tables and delete. - int downloads_count = RemoveDownloadItems(DownloadVector(1, download)); + int downloads_count = + RemoveDownloadItems(DownloadItemImplVector(1, download)); DCHECK_EQ(1, downloads_count); } @@ -862,11 +848,11 @@ int DownloadManagerImpl::RemoveDownloadsBetween(base::Time remove_begin, // All downloads visible to the user will be in the history, // so scan that map. - DownloadVector pending_deletes; + DownloadItemImplVector pending_deletes; for (DownloadMap::const_iterator it = downloads_.begin(); it != downloads_.end(); ++it) { - DownloadItem* download = it->second; + DownloadItemImpl* download = it->second; if (download->IsPersisted() && download->GetStartTime() >= remove_begin && (remove_end.is_null() || download->GetStartTime() < remove_end) && @@ -917,9 +903,10 @@ void DownloadManagerImpl::FileSelected(const FilePath& path, DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(!path.empty()); - DownloadItem* download = GetActiveDownloadItem(download_id); - if (!download) + if (!ContainsKey(active_downloads_, download_id)) return; + DownloadItemImpl* download = active_downloads_[download_id]; + VLOG(20) << __FUNCTION__ << "()" << " path = \"" << path.value() << "\"" << " download = " << download->DebugString(true); @@ -938,9 +925,9 @@ void DownloadManagerImpl::FileSelectionCanceled(int32 download_id) { // download that's already in progress to the temporary location. DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - DownloadItem* download = GetActiveDownloadItem(download_id); - if (!download) + if (!ContainsKey(active_downloads_, download_id)) return; + DownloadItemImpl* download = active_downloads_[download_id]; VLOG(20) << __FUNCTION__ << "()" << " download = " << download->DebugString(true); @@ -961,7 +948,7 @@ void DownloadManagerImpl::OnPersistentStoreQueryComplete( net::BoundNetLog bound_net_log = net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD); - DownloadItem* download = factory_->CreatePersistedItem( + DownloadItemImpl* download = factory_->CreatePersistedItem( this, GetNextId(), entries->at(i), bound_net_log); DCHECK(!ContainsKey(downloads_, download->GetId())); downloads_[download->GetId()] = download; @@ -972,7 +959,7 @@ void DownloadManagerImpl::OnPersistentStoreQueryComplete( CheckForHistoryFilesRemoval(); } -void DownloadManagerImpl::AddDownloadItemToHistory(DownloadItem* download, +void DownloadManagerImpl::AddDownloadItemToHistory(DownloadItemImpl* download, int64 db_handle) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK_NE(DownloadItem::kUninitializedHandle, db_handle); @@ -995,10 +982,11 @@ void DownloadManagerImpl::AddDownloadItemToHistory(DownloadItem* download, void DownloadManagerImpl::OnItemAddedToPersistentStore(int32 download_id, int64 db_handle) { - DownloadItem* item = GetDownload(download_id); // It's valid that we don't find a matching item, i.e. on shutdown. - if (!item) + if (!ContainsKey(downloads_, download_id)) return; + + DownloadItemImpl* item = downloads_[download_id]; AddDownloadItemToHistory(item, db_handle); if (SavePageExternalData::Get(item)) { OnSavePageItemAddedToPersistentStore(item); @@ -1014,9 +1002,8 @@ void DownloadManagerImpl::OnItemAddedToPersistentStore(int32 download_id, // item when it's created so they can observe it directly. Are there any // clients that actually need to know when the item is added to the history?). void DownloadManagerImpl::OnDownloadItemAddedToPersistentStore( - DownloadItem* item) { + DownloadItemImpl* item) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - VLOG(20) << __FUNCTION__ << "()" << " db_handle = " << item->GetDbHandle() << " download_id = " << item->GetId() << " download = " << item->DebugString(true); @@ -1039,7 +1026,7 @@ void DownloadManagerImpl::OnDownloadItemAddedToPersistentStore( } } -void DownloadManagerImpl::ShowDownloadInBrowser(DownloadItem* download) { +void DownloadManagerImpl::ShowDownloadInBrowser(DownloadItemImpl* download) { // The 'contents' may no longer exist if the user closed the contents before // we get this start completion event. WebContents* content = download->GetWebContents(); @@ -1060,7 +1047,7 @@ int DownloadManagerImpl::InProgressCount() const { int count = 0; for (DownloadMap::const_iterator it = active_downloads_.begin(); it != active_downloads_.end(); ++it) { - DownloadItem* item = it->second; + DownloadItemImpl* item = it->second; if (item->IsInProgress()) ++count; } @@ -1140,7 +1127,7 @@ void DownloadManagerImpl::AssertContainersConsistent() const { // to solve that without canceling on Remove (which would then update the DB). void DownloadManagerImpl::OnSavePageItemAddedToPersistentStore( - DownloadItem* item) { + DownloadItemImpl* item) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); // Finalize this download if it finished before the history callback. @@ -1148,7 +1135,8 @@ void DownloadManagerImpl::OnSavePageItemAddedToPersistentStore( SavePageDownloadFinished(item); } -void DownloadManagerImpl::SavePageDownloadFinished(DownloadItem* download) { +void DownloadManagerImpl::SavePageDownloadFinished( + content::DownloadItem* download) { if (download->IsPersisted()) { if (delegate_) delegate_->UpdateItemInPersistentStore(download); @@ -1160,13 +1148,13 @@ void DownloadManagerImpl::SavePageDownloadFinished(DownloadItem* download) { } } -void DownloadManagerImpl::DownloadOpened(DownloadItem* download) { +void DownloadManagerImpl::DownloadOpened(DownloadItemImpl* download) { if (delegate_) delegate_->UpdateItemInPersistentStore(download); int num_unopened = 0; for (DownloadMap::iterator it = downloads_.begin(); it != downloads_.end(); ++it) { - DownloadItem* item = it->second; + DownloadItemImpl* item = it->second; if (item->IsComplete() && !item->GetOpened()) ++num_unopened; @@ -1175,7 +1163,7 @@ void DownloadManagerImpl::DownloadOpened(DownloadItem* download) { } void DownloadManagerImpl::DownloadRenamedToIntermediateName( - DownloadItem* download) { + DownloadItemImpl* download) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); // If the rename failed, we receive an OnDownloadInterrupted() call before we // receive the DownloadRenamedToIntermediateName() call. @@ -1184,7 +1172,7 @@ void DownloadManagerImpl::DownloadRenamedToIntermediateName( } void DownloadManagerImpl::DownloadRenamedToFinalName( - DownloadItem* download) { + DownloadItemImpl* download) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); // If the rename failed, we receive an OnDownloadInterrupted() call before we // receive the DownloadRenamedToFinalName() call. diff --git a/content/browser/download/download_manager_impl.h b/content/browser/download/download_manager_impl.h index ad79935..43e69da 100644 --- a/content/browser/download/download_manager_impl.h +++ b/content/browser/download/download_manager_impl.h @@ -16,15 +16,16 @@ #include "base/sequenced_task_runner_helpers.h" #include "base/synchronization/lock.h" #include "content/browser/download/download_item_factory.h" -#include "content/browser/download/download_item_impl.h" +#include "content/browser/download/download_item_impl_delegate.h" #include "content/common/content_export.h" #include "content/public/browser/download_manager.h" class DownloadFileManager; +class DownloadItemImpl; class CONTENT_EXPORT DownloadManagerImpl : public content::DownloadManager, - public DownloadItemImpl::Delegate { + private DownloadItemImplDelegate { public: // Caller guarantees that |file_manager| and |net_log| will remain valid // for the lifetime of DownloadManagerImpl (until Shutdown() is called). @@ -35,6 +36,18 @@ class CONTENT_EXPORT DownloadManagerImpl scoped_ptr<content::DownloadItemFactory> factory, net::NetLog* net_log); + // Implementation functions (not part of the DownloadManager interface). + + // Creates a download item for the SavePackage system. + // Must be called on the UI thread. Note that the DownloadManager + // retains ownership. + virtual DownloadItemImpl* CreateSavePackageDownloadItem( + const FilePath& main_file_path, + const GURL& page_url, + bool is_otr, + const std::string& mime_type, + content::DownloadItem::Observer* observer); + // content::DownloadManager functions. virtual void SetDelegate(content::DownloadManagerDelegate* delegate) OVERRIDE; virtual content::DownloadManagerDelegate* GetDelegate() const OVERRIDE; @@ -76,14 +89,6 @@ class CONTENT_EXPORT DownloadManagerImpl virtual int InProgressCount() const OVERRIDE; virtual content::BrowserContext* GetBrowserContext() const OVERRIDE; virtual FilePath LastDownloadPath() OVERRIDE; - virtual net::BoundNetLog CreateDownloadItem( - DownloadCreateInfo* info) OVERRIDE; - virtual content::DownloadItem* CreateSavePackageDownloadItem( - const FilePath& main_file_path, - const GURL& page_url, - bool is_otr, - const std::string& mime_type, - content::DownloadItem::Observer* observer) OVERRIDE; virtual void ClearLastDownloadPath() OVERRIDE; virtual void FileSelected(const FilePath& path, int32 download_id) OVERRIDE; virtual void FileSelectionCanceled(int32 download_id) OVERRIDE; @@ -96,32 +101,10 @@ class CONTENT_EXPORT DownloadManagerImpl virtual content::DownloadItem* GetActiveDownloadItem(int id) OVERRIDE; virtual bool GenerateFileHash() OVERRIDE; - // Overridden from DownloadItemImpl::Delegate - // (Note that |GetBrowserContext| are present in both interfaces.) - virtual bool ShouldOpenDownload(content::DownloadItem* item) OVERRIDE; - virtual bool ShouldOpenFileBasedOnExtension( - const FilePath& path) OVERRIDE; - virtual void CheckForFileRemoval( - content::DownloadItem* download_item) OVERRIDE; - virtual void MaybeCompleteDownload( - content::DownloadItem* download) OVERRIDE; - virtual void DownloadStopped( - content::DownloadItem* download) OVERRIDE; - virtual void DownloadCompleted( - content::DownloadItem* download) OVERRIDE; - virtual void DownloadOpened( - content::DownloadItem* download) OVERRIDE; - virtual void DownloadRemoved(content::DownloadItem* download) OVERRIDE; - virtual void DownloadRenamedToIntermediateName( - content::DownloadItem* download) OVERRIDE; - virtual void DownloadRenamedToFinalName( - content::DownloadItem* download) OVERRIDE; - virtual void AssertStateConsistent( - content::DownloadItem* download) const OVERRIDE; - private: typedef std::set<content::DownloadItem*> DownloadSet; - typedef base::hash_map<int32, content::DownloadItem*> DownloadMap; + typedef base::hash_map<int32, DownloadItemImpl*> DownloadMap; + typedef std::vector<DownloadItemImpl*> DownloadItemImplVector; // For testing. friend class DownloadManagerTest; @@ -131,16 +114,20 @@ class CONTENT_EXPORT DownloadManagerImpl virtual ~DownloadManagerImpl(); + // Creates the download item. Must be called on the UI thread. + // Returns the |BoundNetLog| used by the |DownloadItem|. + virtual net::BoundNetLog CreateDownloadItem(DownloadCreateInfo* info); + // Does nothing if |download_id| is not an active download. void MaybeCompleteDownloadById(int download_id); // 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(content::DownloadItem* download); + bool IsDownloadReadyForCompletion(DownloadItemImpl* download); // Show the download in the browser. - void ShowDownloadInBrowser(content::DownloadItem* download); + void ShowDownloadInBrowser(DownloadItemImpl* download); // Get next download id. content::DownloadId GetNextId(); @@ -156,16 +143,12 @@ class CONTENT_EXPORT DownloadManagerImpl // 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 OnTargetPathAvailable(content::DownloadItem* download); - - // Retrieves the download from the |download_id|. - // Returns NULL if the download is not active. - content::DownloadItem* GetActiveDownload(int32 download_id); + void OnTargetPathAvailable(DownloadItemImpl* download); // 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(content::DownloadItem* download); + void RemoveFromActiveList(DownloadItemImpl* download); // Inform observers that the model has changed. void NotifyModelChanged(); @@ -175,10 +158,10 @@ class CONTENT_EXPORT DownloadManagerImpl void AssertContainersConsistent() const; // Add a DownloadItem to history_downloads_. - void AddDownloadItemToHistory(content::DownloadItem* item, int64 db_handle); + void AddDownloadItemToHistory(DownloadItemImpl* item, int64 db_handle); // Remove from internal maps. - int RemoveDownloadItems(const DownloadVector& pending_deletes); + int RemoveDownloadItems(const DownloadItemImplVector& pending_deletes); // Called in response to our request to the DownloadFileManager to // create a DownloadFile. A |reason| of @@ -187,10 +170,25 @@ class CONTENT_EXPORT DownloadManagerImpl int32 download_id, content::DownloadInterruptReason reason); // Called when a download entry is committed to the persistent store. - void OnDownloadItemAddedToPersistentStore(content::DownloadItem* item); + void OnDownloadItemAddedToPersistentStore(DownloadItemImpl* item); // Called when Save Page As entry is committed to the persistent store. - void OnSavePageItemAddedToPersistentStore(content::DownloadItem* item); + void OnSavePageItemAddedToPersistentStore(DownloadItemImpl* item); + + // Overridden from DownloadItemImplDelegate + // (Note that |GetBrowserContext| are present in both interfaces.) + virtual bool ShouldOpenDownload(DownloadItemImpl* item) OVERRIDE; + virtual bool ShouldOpenFileBasedOnExtension(const FilePath& path) OVERRIDE; + virtual void CheckForFileRemoval(DownloadItemImpl* download_item) OVERRIDE; + virtual void MaybeCompleteDownload(DownloadItemImpl* download) OVERRIDE; + virtual void DownloadStopped(DownloadItemImpl* download) OVERRIDE; + virtual void DownloadCompleted(DownloadItemImpl* download) OVERRIDE; + virtual void DownloadOpened(DownloadItemImpl* download) OVERRIDE; + virtual void DownloadRemoved(DownloadItemImpl* download) OVERRIDE; + virtual void DownloadRenamedToIntermediateName( + DownloadItemImpl* download) OVERRIDE; + virtual void DownloadRenamedToFinalName(DownloadItemImpl* download) OVERRIDE; + virtual void AssertStateConsistent(DownloadItemImpl* download) const OVERRIDE; // Factory for creation of downloads items. scoped_ptr<content::DownloadItemFactory> factory_; diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc index 124d4ce..9aae513 100644 --- a/content/browser/download/download_manager_impl_unittest.cc +++ b/content/browser/download/download_manager_impl_unittest.cc @@ -20,6 +20,8 @@ #include "content/browser/download/download_create_info.h" #include "content/browser/download/download_file_manager.h" #include "content/browser/download/download_item_factory.h" +#include "content/browser/download/download_item_impl.h" +#include "content/browser/download/download_item_impl_delegate.h" #include "content/browser/download/download_manager_impl.h" #include "content/browser/download/download_request_handle.h" #include "content/browser/download/mock_download_file.h" @@ -42,6 +44,7 @@ using ::testing::ReturnRef; using ::testing::SetArgPointee; using ::testing::StrictMock; using ::testing::_; +using content::DownloadInterruptReason; using content::DownloadItem; using content::DownloadManager; using content::WebContents; @@ -52,6 +55,116 @@ class ByteStreamReader; namespace { +class MockDownloadItemImpl : public DownloadItemImpl { + public: + // Use history constructor for minimal base object. + MockDownloadItemImpl(DownloadItemImplDelegate* delegate) + : DownloadItemImpl(delegate, content::DownloadId(), + content::DownloadPersistentStoreInfo(), + net::BoundNetLog()) {} + virtual ~MockDownloadItemImpl() {} + + MOCK_METHOD1(AddObserver, void(content::DownloadItem::Observer*)); + MOCK_METHOD1(RemoveObserver, void(content::DownloadItem::Observer*)); + MOCK_METHOD0(UpdateObservers, void()); + MOCK_METHOD0(CanShowInFolder, bool()); + MOCK_METHOD0(CanOpenDownload, bool()); + MOCK_METHOD0(ShouldOpenFileBasedOnExtension, bool()); + MOCK_METHOD0(OpenDownload, void()); + MOCK_METHOD0(ShowDownloadInShell, void()); + MOCK_METHOD0(DangerousDownloadValidated, void()); + MOCK_METHOD3(UpdateProgress, void(int64, int64, const std::string&)); + MOCK_METHOD1(Cancel, void(bool)); + MOCK_METHOD0(MarkAsComplete, void()); + MOCK_METHOD1(DelayedDownloadOpened, void(bool)); + MOCK_METHOD2(OnAllDataSaved, void(int64, const std::string&)); + MOCK_METHOD0(OnDownloadedFileRemoved, void()); + MOCK_METHOD0(MaybeCompleteDownload, void()); + MOCK_METHOD1(Interrupt, void(DownloadInterruptReason)); + MOCK_METHOD1(Delete, void(DeleteReason)); + MOCK_METHOD0(Remove, void()); + MOCK_CONST_METHOD1(TimeRemaining, bool(base::TimeDelta*)); + MOCK_CONST_METHOD0(CurrentSpeed, int64()); + MOCK_CONST_METHOD0(PercentComplete, int()); + MOCK_CONST_METHOD0(AllDataSaved, bool()); + MOCK_METHOD0(TogglePause, void()); + MOCK_METHOD1(OnDownloadCompleting, void(DownloadFileManager*)); + MOCK_CONST_METHOD1(MatchesQuery, bool(const string16& query)); + MOCK_CONST_METHOD0(IsPartialDownload, bool()); + MOCK_CONST_METHOD0(IsInProgress, bool()); + MOCK_CONST_METHOD0(IsCancelled, bool()); + MOCK_CONST_METHOD0(IsInterrupted, bool()); + MOCK_CONST_METHOD0(IsComplete, bool()); + MOCK_CONST_METHOD0(GetFullPath, const FilePath&()); + MOCK_CONST_METHOD0(GetTargetFilePath, const FilePath&()); + MOCK_CONST_METHOD0(GetTargetDisposition, TargetDisposition()); + MOCK_METHOD3(OnTargetPathDetermined, void(const FilePath&, + TargetDisposition, + content::DownloadDangerType)); + MOCK_METHOD1(OnTargetPathSelected, void(const FilePath&)); + MOCK_METHOD1(OnContentCheckCompleted, void(content::DownloadDangerType)); + MOCK_METHOD2(OnIntermediatePathDetermined, void(DownloadFileManager*, + const FilePath&)); + MOCK_CONST_METHOD0(GetState, DownloadState()); + MOCK_CONST_METHOD0(GetUrlChain, const std::vector<GURL>&()); + MOCK_METHOD1(SetTotalBytes, void(int64)); + MOCK_CONST_METHOD0(GetURL, const GURL&()); + MOCK_CONST_METHOD0(GetOriginalUrl, const GURL&()); + MOCK_CONST_METHOD0(GetReferrerUrl, const GURL&()); + MOCK_CONST_METHOD0(GetSuggestedFilename, std::string()); + MOCK_CONST_METHOD0(GetContentDisposition, std::string()); + MOCK_CONST_METHOD0(GetMimeType, std::string()); + MOCK_CONST_METHOD0(GetOriginalMimeType, std::string()); + MOCK_CONST_METHOD0(GetReferrerCharset, std::string()); + MOCK_CONST_METHOD0(GetRemoteAddress, std::string()); + MOCK_CONST_METHOD0(GetTotalBytes, int64()); + MOCK_CONST_METHOD0(GetReceivedBytes, int64()); + MOCK_CONST_METHOD0(GetHashState, const std::string&()); + MOCK_CONST_METHOD0(GetHash, const std::string&()); + MOCK_CONST_METHOD0(GetId, int32()); + MOCK_CONST_METHOD0(GetGlobalId, content::DownloadId()); + MOCK_CONST_METHOD0(GetStartTime, base::Time()); + MOCK_CONST_METHOD0(GetEndTime, base::Time()); + MOCK_METHOD0(SetIsPersisted, void()); + MOCK_CONST_METHOD0(IsPersisted, bool()); + MOCK_METHOD1(SetDbHandle, void(int64)); + MOCK_CONST_METHOD0(GetDbHandle, int64()); + MOCK_METHOD0(GetDownloadManager, content::DownloadManager*()); + MOCK_CONST_METHOD0(IsPaused, bool()); + MOCK_CONST_METHOD0(GetOpenWhenComplete, bool()); + MOCK_METHOD1(SetOpenWhenComplete, void(bool)); + MOCK_CONST_METHOD0(GetFileExternallyRemoved, bool()); + MOCK_CONST_METHOD0(GetSafetyState, SafetyState()); + MOCK_CONST_METHOD0(GetDangerType, content::DownloadDangerType()); + MOCK_CONST_METHOD0(IsDangerous, bool()); + MOCK_METHOD0(GetAutoOpened, bool()); + MOCK_CONST_METHOD0(GetTargetName, FilePath()); + MOCK_CONST_METHOD0(GetForcedFilePath, const FilePath&()); + MOCK_CONST_METHOD0(HasUserGesture, bool()); + MOCK_CONST_METHOD0(GetTransitionType, content::PageTransition()); + MOCK_CONST_METHOD0(IsOtr, bool()); + MOCK_CONST_METHOD0(IsTemporary, bool()); + MOCK_METHOD1(SetIsTemporary, void(bool)); + MOCK_METHOD1(SetOpened, void(bool)); + MOCK_CONST_METHOD0(GetOpened, bool()); + MOCK_CONST_METHOD0(GetLastModifiedTime, const std::string&()); + MOCK_CONST_METHOD0(GetETag, const std::string&()); + MOCK_CONST_METHOD0(GetLastReason, DownloadInterruptReason()); + MOCK_CONST_METHOD0(GetPersistentStoreInfo, + content::DownloadPersistentStoreInfo()); + MOCK_CONST_METHOD0(GetBrowserContext, content::BrowserContext*()); + MOCK_CONST_METHOD0(GetWebContents, content::WebContents*()); + MOCK_CONST_METHOD0(GetFileNameToReportUser, FilePath()); + MOCK_METHOD1(SetDisplayName, void(const FilePath&)); + MOCK_CONST_METHOD0(GetUserVerifiedFilePath, FilePath()); + MOCK_METHOD1(OffThreadCancel, void(DownloadFileManager* file_manager)); + MOCK_CONST_METHOD1(DebugString, std::string(bool)); + MOCK_METHOD0(MockDownloadOpenForTesting, void()); + MOCK_METHOD1(GetExternalData, ExternalData*(const void*)); + MOCK_CONST_METHOD1(GetExternalData, const ExternalData*(const void*)); + MOCK_METHOD2(SetExternalData, void(const void*, ExternalData*)); +}; + class MockDownloadManagerDelegate : public content::DownloadManagerDelegate { public: MockDownloadManagerDelegate(); @@ -143,30 +256,30 @@ class MockDownloadItemFactory // functionality if it's ever needed by consumers. // Returns NULL if no item of that id is present. - content::MockDownloadItem* GetItem(int id); + MockDownloadItemImpl* GetItem(int id); // Remove and return an item made by the factory. // Generally used during teardown. - content::MockDownloadItem* PopItem(); + MockDownloadItemImpl* PopItem(); // Should be called when the item of this id is removed so that // we don't keep dangling pointers. void RemoveItem(int id); // Overridden methods from DownloadItemFactory. - virtual content::DownloadItem* CreatePersistedItem( - DownloadItemImpl::Delegate* delegate, + virtual DownloadItemImpl* CreatePersistedItem( + DownloadItemImplDelegate* delegate, content::DownloadId download_id, const content::DownloadPersistentStoreInfo& info, const net::BoundNetLog& bound_net_log) OVERRIDE; - virtual content::DownloadItem* CreateActiveItem( - DownloadItemImpl::Delegate* delegate, + virtual DownloadItemImpl* CreateActiveItem( + DownloadItemImplDelegate* delegate, const DownloadCreateInfo& info, scoped_ptr<DownloadRequestHandleInterface> request_handle, bool is_otr, const net::BoundNetLog& bound_net_log) OVERRIDE; - virtual content::DownloadItem* CreateSavePageItem( - DownloadItemImpl::Delegate* delegate, + virtual DownloadItemImpl* CreateSavePageItem( + DownloadItemImplDelegate* delegate, const FilePath& path, const GURL& url, bool is_otr, @@ -175,7 +288,8 @@ class MockDownloadItemFactory const net::BoundNetLog& bound_net_log) OVERRIDE; private: - std::map<int32, content::MockDownloadItem*> items_; + std::map<int32, MockDownloadItemImpl*> items_; + DownloadItemImplDelegate item_delegate_; DISALLOW_COPY_AND_ASSIGN(MockDownloadItemFactory); }; @@ -184,19 +298,19 @@ MockDownloadItemFactory::MockDownloadItemFactory() {} MockDownloadItemFactory::~MockDownloadItemFactory() {} -content::MockDownloadItem* MockDownloadItemFactory::GetItem(int id) { +MockDownloadItemImpl* MockDownloadItemFactory::GetItem(int id) { if (items_.find(id) == items_.end()) return NULL; return items_[id]; } -content::MockDownloadItem* MockDownloadItemFactory::PopItem() { +MockDownloadItemImpl* MockDownloadItemFactory::PopItem() { if (items_.empty()) return NULL; - std::map<int32, content::MockDownloadItem*>::iterator first_item + std::map<int32, MockDownloadItemImpl*>::iterator first_item = items_.begin(); - content::MockDownloadItem* result = first_item->second; + MockDownloadItemImpl* result = first_item->second; items_.erase(first_item); return result; } @@ -206,16 +320,16 @@ void MockDownloadItemFactory::RemoveItem(int id) { items_.erase(id); } -content::DownloadItem* MockDownloadItemFactory::CreatePersistedItem( - DownloadItemImpl::Delegate* delegate, +DownloadItemImpl* MockDownloadItemFactory::CreatePersistedItem( + DownloadItemImplDelegate* delegate, content::DownloadId download_id, const content::DownloadPersistentStoreInfo& info, const net::BoundNetLog& bound_net_log) { int local_id = download_id.local(); DCHECK(items_.find(local_id) == items_.end()); - content::MockDownloadItem* result = - new StrictMock<content::MockDownloadItem>; + MockDownloadItemImpl* result = + new StrictMock<MockDownloadItemImpl>(&item_delegate_); EXPECT_CALL(*result, GetId()) .WillRepeatedly(Return(local_id)); items_[local_id] = result; @@ -223,8 +337,8 @@ content::DownloadItem* MockDownloadItemFactory::CreatePersistedItem( return result; } -content::DownloadItem* MockDownloadItemFactory::CreateActiveItem( - DownloadItemImpl::Delegate* delegate, +DownloadItemImpl* MockDownloadItemFactory::CreateActiveItem( + DownloadItemImplDelegate* delegate, const DownloadCreateInfo& info, scoped_ptr<DownloadRequestHandleInterface> request_handle, bool is_otr, @@ -232,8 +346,8 @@ content::DownloadItem* MockDownloadItemFactory::CreateActiveItem( int local_id = info.download_id.local(); DCHECK(items_.find(local_id) == items_.end()); - content::MockDownloadItem* result = - new StrictMock<content::MockDownloadItem>; + MockDownloadItemImpl* result = + new StrictMock<MockDownloadItemImpl>(&item_delegate_); EXPECT_CALL(*result, GetId()) .WillRepeatedly(Return(local_id)); items_[local_id] = result; @@ -241,8 +355,8 @@ content::DownloadItem* MockDownloadItemFactory::CreateActiveItem( return result; } -content::DownloadItem* MockDownloadItemFactory::CreateSavePageItem( - DownloadItemImpl::Delegate* delegate, +DownloadItemImpl* MockDownloadItemFactory::CreateSavePageItem( + DownloadItemImplDelegate* delegate, const FilePath& path, const GURL& url, bool is_otr, @@ -252,8 +366,8 @@ content::DownloadItem* MockDownloadItemFactory::CreateSavePageItem( int local_id = download_id.local(); DCHECK(items_.find(local_id) == items_.end()); - content::MockDownloadItem* result = - new StrictMock<content::MockDownloadItem>; + MockDownloadItemImpl* result = + new StrictMock<MockDownloadItemImpl>(&item_delegate_); EXPECT_CALL(*result, GetId()) .WillRepeatedly(Return(local_id)); items_[local_id] = result; @@ -325,7 +439,7 @@ class DownloadManagerTest : public testing::Test { } virtual void TearDown() { - while (content::MockDownloadItem* + while (MockDownloadItemImpl* item = mock_download_item_factory_->PopItem()) { EXPECT_CALL(*item, GetSafetyState()) .WillOnce(Return(content::DownloadItem::SAFE)); @@ -344,7 +458,7 @@ class DownloadManagerTest : public testing::Test { } // Returns download id. - content::MockDownloadItem& AddItemToManager() { + MockDownloadItemImpl& AddItemToManager() { DownloadCreateInfo info; static const char* kDownloadIdDomain = "Test download id domain"; @@ -358,15 +472,15 @@ class DownloadManagerTest : public testing::Test { download_manager_->CreateDownloadItem(&info); DCHECK(mock_download_item_factory_->GetItem(id)); - content::MockDownloadItem& item(*mock_download_item_factory_->GetItem(id)); + MockDownloadItemImpl& item(*mock_download_item_factory_->GetItem(id)); ON_CALL(item, GetId()) .WillByDefault(Return(id)); return item; } - content::MockDownloadItem& GetMockDownloadItem(int id) { - content::MockDownloadItem* itemp = mock_download_item_factory_->GetItem(id); + MockDownloadItemImpl& GetMockDownloadItem(int id) { + MockDownloadItemImpl* itemp = mock_download_item_factory_->GetItem(id); DCHECK(itemp); return *itemp; @@ -386,11 +500,11 @@ class DownloadManagerTest : public testing::Test { } // Probe at private internals. - DownloadItem* GetActiveDownloadItem(int32 id) { - return download_manager_->GetActiveDownload(id); + void DownloadStopped(DownloadItemImpl* item) { + download_manager_->DownloadStopped(item); } - void AddItemToHistory(content::MockDownloadItem& item, int64 db_handle) { + void AddItemToHistory(MockDownloadItemImpl& item, int64 db_handle) { // For DCHECK in AddDownloadItemToHistory. Don't want to use // WillRepeatedly as it may have to return true after this. if (DCHECK_IS_ON()) @@ -442,7 +556,7 @@ TEST_F(DownloadManagerTest, StartDownload) { scoped_ptr<content::ByteStreamReader> stream; int32 local_id(5); // Random value - EXPECT_FALSE(GetActiveDownloadItem(local_id)); + EXPECT_FALSE(download_manager_->GetActiveDownloadItem(local_id)); EXPECT_CALL(GetMockDownloadManagerDelegate(), GetNextId()) .WillOnce(Return(content::DownloadId(this, local_id))); @@ -453,17 +567,17 @@ TEST_F(DownloadManagerTest, StartDownload) { download_manager_.get(), true, _, _)); download_manager_->StartDownload(info.Pass(), stream.Pass()); - EXPECT_TRUE(GetActiveDownloadItem(local_id)); + EXPECT_TRUE(download_manager_->GetActiveDownloadItem(local_id)); } // Does the DownloadManager prompt when requested? TEST_F(DownloadManagerTest, RestartDownload) { // Put a mock we have a handle to on the download manager. - content::MockDownloadItem& item(AddItemToManager()); + MockDownloadItemImpl& item(AddItemToManager()); int download_id = item.GetId(); // Confirm we're internally consistent. - EXPECT_EQ(&item, GetActiveDownloadItem(download_id)); + EXPECT_EQ(&item, download_manager_->GetActiveDownloadItem(download_id)); ScopedTempDir download_dir; ASSERT_TRUE(download_dir.CreateUniqueTempDir()); @@ -484,7 +598,7 @@ TEST_F(DownloadManagerTest, RestartDownload) { // to test the non-prompting path in RestartDownload as well. TEST_F(DownloadManagerTest, OnTargetPathAvailable) { // Put a mock we have a handle to on the download manager. - content::MockDownloadItem& item(AddItemToManager()); + MockDownloadItemImpl& item(AddItemToManager()); ScopedTempDir download_dir; ASSERT_TRUE(download_dir.CreateUniqueTempDir()); @@ -510,7 +624,7 @@ TEST_F(DownloadManagerTest, OnTargetPathAvailable) { // to the DownloadItem? TEST_F(DownloadManagerTest, OnDownloadInterrupted) { // Put a mock we have a handle to on the download manager. - content::MockDownloadItem& item(AddItemToManager()); + MockDownloadItemImpl& item(AddItemToManager()); int download_id = item.GetId(); int64 size = 0xdeadbeef; @@ -522,14 +636,14 @@ TEST_F(DownloadManagerTest, OnDownloadInterrupted) { EXPECT_CALL(item, Interrupt(reason)); download_manager_->OnDownloadInterrupted( download_id, size, hash_state, reason); - EXPECT_EQ(&item, GetActiveDownloadItem(download_id)); + EXPECT_EQ(&item, download_manager_->GetActiveDownloadItem(download_id)); } // Does DownloadStopped remove Download from appropriate queues? // This test tests non-persisted downloads. TEST_F(DownloadManagerTest, OnDownloadStopped_NonPersisted) { // Put a mock we have a handle to on the download manager. - content::MockDownloadItem& item(AddItemToManager()); + MockDownloadItemImpl& item(AddItemToManager()); EXPECT_CALL(item, IsPersisted()) .WillRepeatedly(Return(false)); @@ -539,18 +653,18 @@ TEST_F(DownloadManagerTest, OnDownloadStopped_NonPersisted) { .WillRepeatedly(Return(DownloadItem::kUninitializedHandle)); EXPECT_CALL(item, OffThreadCancel(&GetMockDownloadFileManager())); - download_manager_->DownloadStopped(&item); + DownloadStopped(&item); // TODO(rdsmith): Confirm that the download item is no longer on the - // active list by calling GetActiveDownloadItem(id). Currently, the - // item is left on the active list for rendez-vous with the history - // system :-{. + // active list by calling download_manager_->GetActiveDownloadItem(id). + // Currently, the item is left on the active list for rendez-vous with + // the history system :-{. } // Does DownloadStopped remove Download from appropriate queues? // This test tests persisted downloads. TEST_F(DownloadManagerTest, OnDownloadStopped_Persisted) { // Put a mock we have a handle to on the download manager. - content::MockDownloadItem& item(AddItemToManager()); + MockDownloadItemImpl& item(AddItemToManager()); int download_id = item.GetId(); int64 db_handle = 0x7; EXPECT_CALL(item, GetExternalData(_)) @@ -567,6 +681,6 @@ TEST_F(DownloadManagerTest, OnDownloadStopped_Persisted) { .WillRepeatedly(Return(db_handle)); EXPECT_CALL(item, OffThreadCancel(&GetMockDownloadFileManager())); - download_manager_->DownloadStopped(&item); - EXPECT_EQ(NULL, GetActiveDownloadItem(download_id)); + DownloadStopped(&item); + EXPECT_EQ(NULL, download_manager_->GetActiveDownloadItem(download_id)); } diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc index d138602..675529b 100644 --- a/content/browser/download/save_package.cc +++ b/content/browser/download/save_package.cc @@ -20,6 +20,7 @@ #include "base/utf_string_conversions.h" #include "content/browser/download/download_file_manager.h" #include "content/browser/download/download_item_impl.h" +#include "content/browser/download/download_manager_impl.h" #include "content/browser/download/download_stats.h" #include "content/browser/download/save_file.h" #include "content/browser/download/save_file_manager.h" @@ -32,7 +33,6 @@ #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/content_browser_client.h" -#include "content/public/browser/download_manager.h" #include "content/public/browser/download_manager_delegate.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/resource_context.h" @@ -264,8 +264,9 @@ void SavePackage::InternalInit() { file_manager_ = rdh->save_file_manager(); DCHECK(file_manager_); - download_manager_ = BrowserContext::GetDownloadManager( - web_contents()->GetBrowserContext()); + download_manager_ = static_cast<DownloadManagerImpl*>( + BrowserContext::GetDownloadManager( + web_contents()->GetBrowserContext())); DCHECK(download_manager_); download_stats::RecordSavePackageEvent(download_stats::SAVE_PACKAGE_STARTED); diff --git a/content/browser/download/save_package.h b/content/browser/download/save_package.h index f8c8905..7f2bebb 100644 --- a/content/browser/download/save_package.h +++ b/content/browser/download/save_package.h @@ -24,6 +24,8 @@ #include "content/public/common/referrer.h" #include "googleurl/src/gurl.h" +class DownloadItemImpl; +class DownloadManagerImpl; class GURL; class SaveFileManager; class SaveItem; @@ -31,7 +33,6 @@ class SavePackage; struct SaveFileCreateInfo; namespace content { -class DownloadManager; class WebContents; } @@ -264,8 +265,8 @@ class CONTENT_EXPORT SavePackage SaveFileManager* file_manager_; // DownloadManager owns the DownloadItem and handles history and UI. - content::DownloadManager* download_manager_; - content::DownloadItem* download_; + DownloadManagerImpl* download_manager_; + DownloadItemImpl* download_; // The URL of the page the user wants to save. GURL page_url_; |