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

Unified Diff: content/browser/download/download_browsertest.cc

Issue 10912173: Replace the DownloadFileManager with direct ownership of DownloadFileImpl (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync'd to LKGR (r162700) Created 8 years, 2 months 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
« no previous file with comments | « content/browser/download/base_file.cc ('k') | content/browser/download/download_create_info.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/download/download_browsertest.cc
diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc
index a133aaec64d52b9f72aeeb6987c0423d5e840184..0f7f8ad5297be16ae9c77db21085fd3a830e3ba5 100644
--- a/content/browser/download/download_browsertest.cc
+++ b/content/browser/download/download_browsertest.cc
@@ -10,11 +10,9 @@
#include "base/scoped_temp_dir.h"
#include "content/browser/download/download_file_factory.h"
#include "content/browser/download/download_file_impl.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/power_save_blocker.h"
-#include "content/browser/renderer_host/resource_dispatcher_host_impl.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/public/test/download_test_observer.h"
#include "content/public/test/test_utils.h"
@@ -75,15 +73,17 @@ static DownloadManagerImpl* DownloadManagerForShell(Shell* shell) {
class DownloadFileWithDelay : public DownloadFileImpl {
public:
DownloadFileWithDelay(
- scoped_ptr<DownloadCreateInfo> info,
- scoped_ptr<content::ByteStreamReader> stream,
- scoped_ptr<DownloadRequestHandleInterface> request_handle,
- scoped_refptr<content::DownloadManager> download_manager,
+ scoped_ptr<DownloadSaveInfo> save_info,
+ const FilePath& default_download_directory,
+ const GURL& url,
+ const GURL& referrer_url,
+ int64 received_bytes,
bool calculate_hash,
- scoped_ptr<content::PowerSaveBlocker> power_save_blocker,
+ scoped_ptr<ByteStreamReader> stream,
const net::BoundNetLog& bound_net_log,
- // |owner| is required to outlive the DownloadFileWithDelay.
- DownloadFileWithDelayFactory* owner);
+ scoped_ptr<PowerSaveBlocker> power_save_blocker,
+ base::WeakPtr<DownloadDestinationObserver> observer,
+ base::WeakPtr<DownloadFileWithDelayFactory> owner);
virtual ~DownloadFileWithDelay();
@@ -103,33 +103,41 @@ class DownloadFileWithDelay : public DownloadFileImpl {
static void RenameCallbackWrapper(
DownloadFileWithDelayFactory* factory,
const RenameCompletionCallback& original_callback,
- content::DownloadInterruptReason reason,
+ DownloadInterruptReason reason,
const FilePath& path);
static void DetachCallbackWrapper(
DownloadFileWithDelayFactory* factory,
const base::Closure& original_callback);
- // May only be used on the UI thread.
- DownloadFileWithDelayFactory* owner_;
+ // This variable may only be read on the FILE thread, and may only be
+ // indirected through (e.g. methods on DownloadFileWithDelayFactory called)
+ // on the UI thread. This is because after construction,
+ // DownloadFileWithDelay lives on the file thread, but
+ // DownloadFileWithDelayFactory is purely a UI thread object.
+ base::WeakPtr<DownloadFileWithDelayFactory> owner_;
DISALLOW_COPY_AND_ASSIGN(DownloadFileWithDelay);
};
+// All routines on this class must be called on the UI thread.
class DownloadFileWithDelayFactory : public DownloadFileFactory {
public:
DownloadFileWithDelayFactory();
virtual ~DownloadFileWithDelayFactory();
// DownloadFileFactory interface.
- virtual content::DownloadFile* CreateFile(
- scoped_ptr<DownloadCreateInfo> info,
- scoped_ptr<content::ByteStreamReader> stream,
- DownloadManager* download_manager,
+ virtual DownloadFile* CreateFile(
+ scoped_ptr<DownloadSaveInfo> save_info,
+ const FilePath& default_download_directory,
+ const GURL& url,
+ const GURL& referrer_url,
+ int64 received_bytes,
bool calculate_hash,
- const net::BoundNetLog& bound_net_log) OVERRIDE;
+ scoped_ptr<ByteStreamReader> stream,
+ const net::BoundNetLog& bound_net_log,
+ base::WeakPtr<DownloadDestinationObserver> observer) OVERRIDE;
- // Must all be called on the UI thread.
void AddRenameCallback(base::Closure callback);
void AddDetachCallback(base::Closure callback);
void GetAllRenameCallbacks(std::vector<base::Closure>* results);
@@ -140,6 +148,7 @@ class DownloadFileWithDelayFactory : public DownloadFileFactory {
void WaitForSomeCallback();
private:
+ base::WeakPtrFactory<DownloadFileWithDelayFactory> weak_ptr_factory_;
std::vector<base::Closure> rename_callbacks_;
std::vector<base::Closure> detach_callbacks_;
bool waiting_;
@@ -148,17 +157,21 @@ class DownloadFileWithDelayFactory : public DownloadFileFactory {
};
DownloadFileWithDelay::DownloadFileWithDelay(
- scoped_ptr<DownloadCreateInfo> info,
- scoped_ptr<content::ByteStreamReader> stream,
- scoped_ptr<DownloadRequestHandleInterface> request_handle,
- scoped_refptr<content::DownloadManager> download_manager,
+ scoped_ptr<DownloadSaveInfo> save_info,
+ const FilePath& default_download_directory,
+ const GURL& url,
+ const GURL& referrer_url,
+ int64 received_bytes,
bool calculate_hash,
- scoped_ptr<content::PowerSaveBlocker> power_save_blocker,
+ scoped_ptr<ByteStreamReader> stream,
const net::BoundNetLog& bound_net_log,
- DownloadFileWithDelayFactory* owner)
- : DownloadFileImpl(info.Pass(), stream.Pass(), request_handle.Pass(),
- download_manager, calculate_hash,
- power_save_blocker.Pass(), bound_net_log),
+ scoped_ptr<PowerSaveBlocker> power_save_blocker,
+ base::WeakPtr<DownloadDestinationObserver> observer,
+ base::WeakPtr<DownloadFileWithDelayFactory> owner)
+ : DownloadFileImpl(
+ save_info.Pass(), default_download_directory, url, referrer_url,
+ received_bytes, calculate_hash, stream.Pass(), bound_net_log,
+ power_save_blocker.Pass(), observer),
owner_(owner) {}
DownloadFileWithDelay::~DownloadFileWithDelay() {}
@@ -170,21 +183,21 @@ void DownloadFileWithDelay::Rename(const FilePath& full_path,
DownloadFileImpl::Rename(
full_path, overwrite_existing_file,
base::Bind(DownloadFileWithDelay::RenameCallbackWrapper,
- base::Unretained(owner_), callback));
+ owner_, callback));
}
void DownloadFileWithDelay::Detach(base::Closure callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
DownloadFileImpl::Detach(
base::Bind(DownloadFileWithDelay::DetachCallbackWrapper,
- base::Unretained(owner_), callback));
+ owner_, callback));
}
// static
void DownloadFileWithDelay::RenameCallbackWrapper(
DownloadFileWithDelayFactory* factory,
const RenameCompletionCallback& original_callback,
- content::DownloadInterruptReason reason,
+ DownloadInterruptReason reason,
const FilePath& path) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
factory->AddRenameCallback(base::Bind(original_callback, reason, path));
@@ -199,27 +212,28 @@ void DownloadFileWithDelay::DetachCallbackWrapper(
}
DownloadFileWithDelayFactory::DownloadFileWithDelayFactory()
- : waiting_(false) {}
+ : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
+ waiting_(false) {}
DownloadFileWithDelayFactory::~DownloadFileWithDelayFactory() {}
DownloadFile* DownloadFileWithDelayFactory::CreateFile(
- scoped_ptr<DownloadCreateInfo> info,
- scoped_ptr<content::ByteStreamReader> stream,
- DownloadManager* download_manager,
+ scoped_ptr<DownloadSaveInfo> save_info,
+ const FilePath& default_download_directory,
+ const GURL& url,
+ const GURL& referrer_url,
+ int64 received_bytes,
bool calculate_hash,
- const net::BoundNetLog& bound_net_log) {
- // Ownership will be taken by DownloadFileWithDelay.
- scoped_ptr<DownloadRequestHandleInterface> request_handle(
- new DownloadRequestHandle(info->request_handle));
-
+ scoped_ptr<ByteStreamReader> stream,
+ const net::BoundNetLog& bound_net_log,
+ base::WeakPtr<DownloadDestinationObserver> observer) {
+ scoped_ptr<PowerSaveBlocker> psb(
+ new PowerSaveBlocker(
+ PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
+ "Download in progress"));
return new DownloadFileWithDelay(
- info.Pass(), stream.Pass(), request_handle.Pass(), download_manager,
- calculate_hash,
- scoped_ptr<content::PowerSaveBlocker>(
- new content::PowerSaveBlocker(
- content::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
- "Download in progress")).Pass(),
- bound_net_log, this);
+ save_info.Pass(), default_download_directory, url, referrer_url,
+ received_bytes, calculate_hash, stream.Pass(), bound_net_log,
+ psb.Pass(), observer, weak_ptr_factory_.GetWeakPtr());
}
void DownloadFileWithDelayFactory::AddRenameCallback(base::Closure callback) {
@@ -265,26 +279,30 @@ bool WasPersisted(DownloadItem* item) {
class CountingDownloadFile : public DownloadFileImpl {
public:
CountingDownloadFile(
- scoped_ptr<DownloadCreateInfo> info,
- scoped_ptr<content::ByteStreamReader> stream,
- scoped_ptr<DownloadRequestHandleInterface> request_handle,
- scoped_refptr<content::DownloadManager> download_manager,
- bool calculate_hash,
- scoped_ptr<content::PowerSaveBlocker> power_save_blocker,
- const net::BoundNetLog& bound_net_log)
- : DownloadFileImpl(info.Pass(), stream.Pass(), request_handle.Pass(),
- download_manager, calculate_hash,
- power_save_blocker.Pass(), bound_net_log) {}
+ scoped_ptr<content::DownloadSaveInfo> save_info,
+ const FilePath& default_downloads_directory,
+ const GURL& url,
+ const GURL& referrer_url,
+ int64 received_bytes,
+ bool calculate_hash,
+ scoped_ptr<content::ByteStreamReader> stream,
+ const net::BoundNetLog& bound_net_log,
+ scoped_ptr<content::PowerSaveBlocker> power_save_blocker,
+ base::WeakPtr<content::DownloadDestinationObserver> observer)
+ : DownloadFileImpl(save_info.Pass(), default_downloads_directory,
+ url, referrer_url, received_bytes, calculate_hash,
+ stream.Pass(), bound_net_log,
+ power_save_blocker.Pass(), observer) {}
virtual ~CountingDownloadFile() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
active_files_--;
}
- virtual content::DownloadInterruptReason Initialize() OVERRIDE {
+ virtual void Initialize(const InitializeCallback& callback) OVERRIDE {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
active_files_++;
- return DownloadFileImpl::Initialize();
+ return DownloadFileImpl::Initialize(callback);
}
static void GetNumberActiveFiles(int* result) {
@@ -317,23 +335,23 @@ class CountingDownloadFileFactory : public DownloadFileFactory {
// DownloadFileFactory interface.
virtual content::DownloadFile* CreateFile(
- scoped_ptr<DownloadCreateInfo> info,
- scoped_ptr<content::ByteStreamReader> stream,
- DownloadManager* download_manager,
- bool calculate_hash,
- const net::BoundNetLog& bound_net_log) OVERRIDE {
- scoped_ptr<DownloadRequestHandleInterface> request_handle(
- new DownloadRequestHandle(info->request_handle));
-
+ scoped_ptr<content::DownloadSaveInfo> save_info,
+ const FilePath& default_downloads_directory,
+ const GURL& url,
+ const GURL& referrer_url,
+ int64 received_bytes,
+ bool calculate_hash,
+ scoped_ptr<content::ByteStreamReader> stream,
+ const net::BoundNetLog& bound_net_log,
+ base::WeakPtr<content::DownloadDestinationObserver> observer) OVERRIDE {
+ scoped_ptr<PowerSaveBlocker> psb(
+ new PowerSaveBlocker(
+ PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
+ "Download in progress"));
return new CountingDownloadFile(
- info.Pass(), stream.Pass(),
- request_handle.Pass(),
- download_manager, calculate_hash,
- scoped_ptr<content::PowerSaveBlocker>(
- new content::PowerSaveBlocker(
- content::PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension,
- "Download in progress")).Pass(),
- bound_net_log);
+ save_info.Pass(), default_downloads_directory, url, referrer_url,
+ received_bytes, calculate_hash, stream.Pass(), bound_net_log,
+ psb.Pass(), observer);
}
};
@@ -378,7 +396,7 @@ class DownloadContentTest : public ContentBrowserTest {
// Note: Cannot be used with other alternative DownloadFileFactorys
void SetupEnsureNoPendingDownloads() {
- GetDownloadFileManager()->SetFileFactoryForTesting(
+ DownloadManagerForShell(shell())->SetDownloadFileFactoryForTesting(
scoped_ptr<content::DownloadFileFactory>(
new CountingDownloadFileFactory()).Pass());
}
@@ -429,11 +447,6 @@ class DownloadContentTest : public ContentBrowserTest {
return true;
}
- DownloadFileManager* GetDownloadFileManager() {
- ResourceDispatcherHostImpl* rdh(ResourceDispatcherHostImpl::Get());
- return rdh->download_file_manager();
- }
-
private:
static void EnsureNoPendingDownloadJobsOnIO(bool* result) {
if (URLRequestSlowDownloadJob::NumberOutstandingRequests())
@@ -550,8 +563,9 @@ IN_PROC_BROWSER_TEST_F(DownloadContentTest, CancelAtFinalRename) {
// Setup new factory.
DownloadFileWithDelayFactory* file_factory =
new DownloadFileWithDelayFactory();
- GetDownloadFileManager()->SetFileFactoryForTesting(
- scoped_ptr<content::DownloadFileFactory>(file_factory).Pass());
+ DownloadManagerImpl* download_manager(DownloadManagerForShell(shell()));
+ download_manager->SetDownloadFileFactoryForTesting(
+ scoped_ptr<DownloadFileFactory>(file_factory).Pass());
// Create a download
FilePath file(FILE_PATH_LITERAL("download-test.lib"));
@@ -576,7 +590,7 @@ IN_PROC_BROWSER_TEST_F(DownloadContentTest, CancelAtFinalRename) {
// Cancel it.
std::vector<DownloadItem*> items;
- DownloadManagerForShell(shell())->GetAllDownloads(&items);
+ download_manager->GetAllDownloads(&items);
ASSERT_EQ(1u, items.size());
items[0]->Cancel(true);
RunAllPendingInMessageLoop();
@@ -598,8 +612,9 @@ IN_PROC_BROWSER_TEST_F(DownloadContentTest, CancelAtRelease) {
// Setup new factory.
DownloadFileWithDelayFactory* file_factory =
new DownloadFileWithDelayFactory();
- GetDownloadFileManager()->SetFileFactoryForTesting(
- scoped_ptr<content::DownloadFileFactory>(file_factory).Pass());
+ DownloadManagerImpl* download_manager(DownloadManagerForShell(shell()));
+ download_manager->SetDownloadFileFactoryForTesting(
+ scoped_ptr<DownloadFileFactory>(file_factory).Pass());
// Create a download
FilePath file(FILE_PATH_LITERAL("download-test.lib"));
@@ -626,17 +641,15 @@ IN_PROC_BROWSER_TEST_F(DownloadContentTest, CancelAtRelease) {
callbacks[0].Run();
callbacks.clear();
- // Confirm download isn't complete yet.
+ // Confirm download still IN_PROGRESS.
std::vector<DownloadItem*> items;
- DownloadManagerForShell(shell())->GetAllDownloads(&items);
+ download_manager->GetAllDownloads(&items);
EXPECT_EQ(DownloadItem::IN_PROGRESS, items[0]->GetState());
- // Cancel the download; confirm cancel fails anyway.
+ // Cancel the download; confirm cancel fails.
ASSERT_EQ(1u, items.size());
items[0]->Cancel(true);
EXPECT_EQ(DownloadItem::IN_PROGRESS, items[0]->GetState());
- RunAllPendingInMessageLoop();
- EXPECT_EQ(DownloadItem::IN_PROGRESS, items[0]->GetState());
// Confirm detach callback and run it.
file_factory->WaitForSomeCallback();
@@ -646,6 +659,8 @@ IN_PROC_BROWSER_TEST_F(DownloadContentTest, CancelAtRelease) {
ASSERT_EQ(1u, callbacks.size());
callbacks[0].Run();
callbacks.clear();
+
+ // *Now* the download should be complete.
EXPECT_EQ(DownloadItem::COMPLETE, items[0]->GetState());
}
@@ -699,7 +714,7 @@ IN_PROC_BROWSER_TEST_F(DownloadContentTest, ShutdownAtRelease) {
// Setup new factory.
DownloadFileWithDelayFactory* file_factory =
new DownloadFileWithDelayFactory();
- GetDownloadFileManager()->SetFileFactoryForTesting(
+ DownloadManagerForShell(shell())->SetDownloadFileFactoryForTesting(
scoped_ptr<content::DownloadFileFactory>(file_factory).Pass());
// Create a download
« no previous file with comments | « content/browser/download/base_file.cc ('k') | content/browser/download/download_create_info.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698