diff options
author | rafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-02 14:22:49 +0000 |
---|---|---|
committer | rafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-02 14:22:49 +0000 |
commit | 0799d64ab9c29e97e9dc7b8c4b3f679fdf231408 (patch) | |
tree | 482fd4219c35ee1a116b1c7cb3f2bd9a7aef6056 | |
parent | f098c9fba633f92dc3164f6ae96224ddcea39cd4 (diff) | |
download | chromium_src-0799d64ab9c29e97e9dc7b8c4b3f679fdf231408.zip chromium_src-0799d64ab9c29e97e9dc7b8c4b3f679fdf231408.tar.gz chromium_src-0799d64ab9c29e97e9dc7b8c4b3f679fdf231408.tar.bz2 |
reenable RenderViewHostManager browertest, add DownloadsCompleteObserver to ui_test_utils.
R=aa
Review URL: http://codereview.chromium.org/151189
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19811 0039d316-1c4b-4281-b951-d872f2087c98
-rwxr-xr-x | chrome/browser/renderer_host/render_view_host_manager_browsertest.cc | 16 | ||||
-rw-r--r-- | chrome/test/ui_test_utils.cc | 99 | ||||
-rw-r--r-- | chrome/test/ui_test_utils.h | 5 |
3 files changed, 116 insertions, 4 deletions
diff --git a/chrome/browser/renderer_host/render_view_host_manager_browsertest.cc b/chrome/browser/renderer_host/render_view_host_manager_browsertest.cc index aa677da..b3cb08a 100755 --- a/chrome/browser/renderer_host/render_view_host_manager_browsertest.cc +++ b/chrome/browser/renderer_host/render_view_host_manager_browsertest.cc @@ -4,6 +4,8 @@ #include "chrome/browser/browser.h" #include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/browser/download/download_manager.h" +#include "chrome/browser/profile.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/notification_details.h" @@ -38,6 +40,8 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, ChromeURLAfterDownload) { ui_test_utils::NavigateToURL(browser(), downloads_url); ui_test_utils::NavigateToURL(browser(), zip_url); + ui_test_utils::WaitForDownloadCount( + browser()->profile()->GetDownloadManager(), 1); ui_test_utils::NavigateToURL(browser(), extensions_url); TabContents *contents = browser()->GetSelectedTabContents(); @@ -53,12 +57,12 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, ChromeURLAfterDownload) { class BrowserClosedObserver : public NotificationObserver { public: - BrowserClosedObserver(Browser* browser) { + explicit BrowserClosedObserver(Browser* browser) { registrar_.Add(this, NotificationType::BROWSER_CLOSED, Source<Browser>(browser)); ui_test_utils::RunMessageLoop(); } - + // NotificationObserver virtual void Observe(NotificationType type, const NotificationSource& source, @@ -77,7 +81,7 @@ class BrowserClosedObserver : public NotificationObserver { // Test for crbug.com/12745. This tests that if a download is initiated from // a chrome:// page that has registered and onunload handler, the browser // will be able to close. -IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, DISABLED_BrowserCloseAfterDownload) { +IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, BrowserCloseAfterDownload) { GURL downloads_url("chrome://downloads"); FilePath zip_download; ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &zip_download)); @@ -97,6 +101,10 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, DISABLED_BrowserCloseAfterDown &result)); EXPECT_TRUE(result); ui_test_utils::NavigateToURL(browser(), zip_url); + + ui_test_utils::WaitForDownloadCount( + browser()->profile()->GetDownloadManager(), 1); + browser()->CloseWindow(); - BrowserClosedObserver observe(browser()); + BrowserClosedObserver wait_for_close(browser()); } diff --git a/chrome/test/ui_test_utils.cc b/chrome/test/ui_test_utils.cc index 60282bd..ffe7a2e 100644 --- a/chrome/test/ui_test_utils.cc +++ b/chrome/test/ui_test_utils.cc @@ -10,6 +10,7 @@ #include "base/values.h" #include "chrome/browser/browser.h" #include "chrome/browser/dom_operation_notification_details.h" +#include "chrome/browser/download/download_manager.h" #include "chrome/browser/tab_contents/navigation_controller.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/common/chrome_paths.h" @@ -98,6 +99,100 @@ class DOMOperationObserver : public NotificationObserver { DISALLOW_COPY_AND_ASSIGN(DOMOperationObserver); }; +// DownloadsCompleteObserver waits for a given number of downloads to complete. +// Example usage: +// +// ui_test_utils::NavigateToURL(browser(), zip_url); +// DownloadsCompleteObserver wait_on_download( +// browser()->profile()->GetDownloadManager(), 1); +// /* |zip_url| download will be complete by this line. */ +// +class DownloadsCompleteObserver : public DownloadManager::Observer, + public DownloadItem::Observer { + public: + explicit DownloadsCompleteObserver(DownloadManager* download_manager, + size_t wait_count) + : download_manager_(download_manager), + wait_count_(wait_count), + waiting_(false) { + download_manager_->AddObserver(this); + } + + // CheckAllDownloadsComplete will be called when the DownloadManager + // fires it's ModelChanged() call, and also when incomplete downloads + // fire their OnDownloadUpdated(). + bool CheckAllDownloadsComplete() { + if (downloads_.size() < wait_count_) + return false; + + bool still_waiting = false; + std::vector<DownloadItem*>::iterator it = downloads_.begin(); + for (; it != downloads_.end(); ++it) { + // We always remove ourselves as an observer, then re-add if the download + // isn't complete. This is to avoid having to track which downloads we + // are currently observing. Removing has no effect if we are not currently + // an observer. + (*it)->RemoveObserver(this); + if ((*it)->state() != DownloadItem::COMPLETE) { + (*it)->AddObserver(this); + still_waiting = true; + } + } + + if (still_waiting) + return false; + + download_manager_->RemoveObserver(this); + // waiting_ will have been set if not all downloads were complete on first + // pass below in SetDownloads(). + if (waiting_) + MessageLoopForUI::current()->Quit(); + return true; + } + + // DownloadItem::Observer + virtual void OnDownloadUpdated(DownloadItem* download) { + if (download->state() == DownloadItem::COMPLETE) { + CheckAllDownloadsComplete(); + } + } + + virtual void OnDownloadOpened(DownloadItem* download) {} + + // DownloadManager::Observer + virtual void ModelChanged() { + download_manager_->GetDownloads(this, L""); + } + + virtual void SetDownloads(std::vector<DownloadItem*>& downloads) { + downloads_ = downloads; + if (CheckAllDownloadsComplete()) + return; + + if (!waiting_) { + waiting_ = true; + ui_test_utils::RunMessageLoop(); + } + } + + + private: + // The observed download manager. + DownloadManager* download_manager_; + + // The current downloads being tracked. + std::vector<DownloadItem*> downloads_; + + // The number of downloads to wait on completing. + size_t wait_count_; + + // Whether an internal message loop has been started and must be quit upon + // all downloads completing. + bool waiting_; + + DISALLOW_COPY_AND_ASSIGN(DownloadsCompleteObserver); +}; + } // namespace void RunMessageLoop() { @@ -208,4 +303,8 @@ GURL GetTestUrl(const std::wstring& dir, const std::wstring file) { return net::FilePathToFileURL(path); } +void WaitForDownloadCount(DownloadManager* download_manager, size_t count) { + DownloadsCompleteObserver download_observer(download_manager, count); +} + } // namespace ui_test_utils diff --git a/chrome/test/ui_test_utils.h b/chrome/test/ui_test_utils.h index c25356e..2554a7d 100644 --- a/chrome/test/ui_test_utils.h +++ b/chrome/test/ui_test_utils.h @@ -11,6 +11,7 @@ #include "chrome/common/notification_observer.h" class Browser; +class DownloadManager; class GURL; class NavigationController; class Value; @@ -72,6 +73,10 @@ bool ExecuteJavaScriptAndExtractString(TabContents* tab_contents, std::string* result); GURL GetTestUrl(const std::wstring& dir, const std::wstring file); + +// Creates an observer that waits for |download_manager| to report that it +// has a total of |count| downloads that have been handles +void WaitForDownloadCount(DownloadManager* download_manager, size_t count); } #endif // CHROME_TEST_UI_TEST_UTILS_H_ |