summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-02 14:22:49 +0000
committerrafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-02 14:22:49 +0000
commit0799d64ab9c29e97e9dc7b8c4b3f679fdf231408 (patch)
tree482fd4219c35ee1a116b1c7cb3f2bd9a7aef6056
parentf098c9fba633f92dc3164f6ae96224ddcea39cd4 (diff)
downloadchromium_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-xchrome/browser/renderer_host/render_view_host_manager_browsertest.cc16
-rw-r--r--chrome/test/ui_test_utils.cc99
-rw-r--r--chrome/test/ui_test_utils.h5
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_