| Index: chrome/browser/download/download_browsertest.cc
|
| diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
|
| index 6f0d99889c35b608a853f8dca61254cde649d784..d3372334113a0654b2222632ffbab4c422f2e1d6 100644
|
| --- a/chrome/browser/download/download_browsertest.cc
|
| +++ b/chrome/browser/download/download_browsertest.cc
|
| @@ -7,19 +7,25 @@
|
| #include "base/path_service.h"
|
| #include "base/scoped_temp_dir.h"
|
| #include "base/test/test_file_util.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| +#include "base/utf_string_conversions.h"
|
| #include "chrome/browser/browser_window.h"
|
| #include "chrome/browser/download/download_item.h"
|
| #include "chrome/browser/download/download_manager.h"
|
| #include "chrome/browser/download/download_prefs.h"
|
| +#include "chrome/browser/download/download_shelf.h"
|
| #include "chrome/browser/net/url_request_mock_http_job.h"
|
| +#include "chrome/browser/net/url_request_slow_download_job.h"
|
| #include "chrome/browser/prefs/pref_service.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/browser_list.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "chrome/common/chrome_paths.h"
|
| +#include "chrome/common/page_transition_types.h"
|
| #include "chrome/common/url_constants.h"
|
| #include "chrome/test/in_process_browser_test.h"
|
| #include "chrome/test/ui_test_utils.h"
|
| +#include "net/base/net_util.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace {
|
| @@ -213,54 +219,142 @@ class DownloadsObserver : public DownloadManager::Observer,
|
| };
|
|
|
| class DownloadTest : public InProcessBrowserTest {
|
| - protected:
|
| - void SetUpInProcessBrowserTestFixture() {
|
| - ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir_));
|
| + public:
|
| + enum SelectExpectation {
|
| + EXPECT_NO_SELECT_DIALOG = -1,
|
| + EXPECT_NOTHING,
|
| + EXPECT_SELECT_DIALOG
|
| + };
|
| +
|
| + // Returning false indicates a failure of the setup, and should be asserted
|
| + // in the caller.
|
| + virtual bool InitialSetup(bool prompt_for_download) {
|
| + bool have_test_dir = PathService::Get(chrome::DIR_TEST_DATA, &test_dir_);
|
| + EXPECT_TRUE(have_test_dir);
|
| + if (!have_test_dir)
|
| + return false;
|
| +
|
| + // Sanity check default values for window / tab count and shelf visibility.
|
| + int window_count = BrowserList::size();
|
| + EXPECT_EQ(1, window_count);
|
| + EXPECT_EQ(1, browser()->tab_count());
|
| + bool is_shelf_visible = browser()->window()->IsDownloadShelfVisible();
|
| + EXPECT_FALSE(is_shelf_visible);
|
| +
|
| + // Set up the temporary download folder.
|
| + bool created_downloads_dir = CreateAndSetDownloadsDirectory(browser());
|
| + EXPECT_TRUE(created_downloads_dir);
|
| + if (!created_downloads_dir)
|
| + return false;
|
| + browser()->profile()->GetPrefs()->SetBoolean(prefs::kPromptForDownload,
|
| + prompt_for_download);
|
| +
|
| + return true;
|
| }
|
|
|
| + protected:
|
| +
|
| // Must be called after browser creation. Creates a temporary
|
| // directory for downloads that is auto-deleted on destruction.
|
| - bool CreateAndSetDownloadsDirectory() {
|
| - if (downloads_directory_.CreateUniqueTempDir()) {
|
| - browser()->profile()->GetPrefs()->SetFilePath(
|
| - prefs::kDownloadDefaultDirectory,
|
| - downloads_directory_.path());
|
| - return true;
|
| - }
|
| - return false;
|
| + // Returning false indicates a failure of the function, and should be asserted
|
| + // in the caller.
|
| + bool CreateAndSetDownloadsDirectory(Browser* browser) {
|
| + if (!browser)
|
| + return false;
|
| +
|
| + if (!downloads_directory_.CreateUniqueTempDir())
|
| + return false;
|
| +
|
| + browser->profile()->GetPrefs()->SetFilePath(
|
| + prefs::kDownloadDefaultDirectory,
|
| + downloads_directory_.path());
|
| +
|
| + return true;
|
| }
|
|
|
| - // May only be called inside of an individual test; browser() is NULL
|
| - // outside of that context.
|
| - FilePath GetDownloadDirectory() {
|
| + FilePath GetDownloadDirectory(Browser* browser) {
|
| DownloadManager* download_mananger =
|
| - browser()->profile()->GetDownloadManager();
|
| + browser->profile()->GetDownloadManager();
|
| return download_mananger->download_prefs()->download_path();
|
| }
|
|
|
| - DownloadsObserver* CreateWaiter(int num_downloads) {
|
| + DownloadsObserver* CreateWaiter(Browser* browser, int num_downloads) {
|
| DownloadManager* download_manager =
|
| - browser()->profile()->GetDownloadManager();
|
| + browser->profile()->GetDownloadManager();
|
| return new DownloadsObserver(
|
| download_manager, num_downloads,
|
| DownloadsObserver::FILE_RENAME, // Really done
|
| - true); // Bail on select file
|
| + true); // Bail on select file
|
| + }
|
| +
|
| + // Download |url|, then wait for the download to finish.
|
| + // |disposition| indicates where the navigation occurs (current tab, new
|
| + // foreground tab, etc).
|
| + // |expectation| indicates whether or not a Select File dialog should be
|
| + // open when the download is finished, or if we don't care.
|
| + // If the dialog appears, the test completes. The only effect |expectation|
|
| + // has is whether or not the test succeeds.
|
| + // |browser_test_flags| indicate what to wait for, and is an OR of 0 or more
|
| + // values in the ui_test_utils::BrowserTestWaitFlags enum.
|
| + void DownloadAndWaitWithDisposition(Browser* browser,
|
| + const GURL& url,
|
| + WindowOpenDisposition disposition,
|
| + SelectExpectation expectation,
|
| + int browser_test_flags) {
|
| + // Setup notification, navigate, and block.
|
| + scoped_ptr<DownloadsObserver> observer(CreateWaiter(browser, 1));
|
| + // This call will block until the condition specified by
|
| + // |browser_test_flags|, but will not wait for the download to finish.
|
| + ui_test_utils::NavigateToURLWithDisposition(browser,
|
| + url,
|
| + disposition,
|
| + browser_test_flags);
|
| + // Waits for the download to complete.
|
| + observer->WaitForFinished();
|
| +
|
| + // If specified, check the state of the select file dialog.
|
| + if (expectation != EXPECT_NOTHING) {
|
| + EXPECT_EQ(expectation == EXPECT_SELECT_DIALOG,
|
| + observer->select_file_dialog_seen());
|
| + }
|
| + }
|
| +
|
| + // Download a file in the current tab, then wait for the download to finish.
|
| + void DownloadAndWait(Browser* browser,
|
| + const GURL& url,
|
| + SelectExpectation expectation) {
|
| + DownloadAndWaitWithDisposition(
|
| + browser,
|
| + url,
|
| + CURRENT_TAB,
|
| + expectation,
|
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| }
|
|
|
| // Should only be called when the download is known to have finished
|
| // (in error or not).
|
| - void CheckDownload(const FilePath& downloaded_filename,
|
| + // Returning false indicates a failure of the function, and should be asserted
|
| + // in the caller.
|
| + bool CheckDownload(Browser* browser,
|
| + const FilePath& downloaded_filename,
|
| const FilePath& origin_filename) {
|
| // Find the path to which the data will be downloaded.
|
| FilePath downloaded_file =
|
| - GetDownloadDirectory().Append(downloaded_filename);
|
| + GetDownloadDirectory(browser).Append(downloaded_filename);
|
|
|
| // Find the origin path (from which the data comes).
|
| FilePath origin_file(test_dir_.Append(origin_filename));
|
| - ASSERT_TRUE(file_util::PathExists(origin_file));
|
| + bool origin_file_exists = file_util::PathExists(origin_file);
|
| + EXPECT_TRUE(origin_file_exists);
|
| + if (!origin_file_exists)
|
| + return false;
|
|
|
| // Confirm the downloaded data file exists.
|
| - ASSERT_TRUE(file_util::PathExists(downloaded_file));
|
| + bool downloaded_file_exists = file_util::PathExists(downloaded_file);
|
| + EXPECT_TRUE(downloaded_file_exists);
|
| + if (!downloaded_file_exists)
|
| + return false;
|
| +
|
| int64 origin_file_size = 0;
|
| int64 downloaded_file_size = 0;
|
| EXPECT_TRUE(file_util::GetFileSize(origin_file, &origin_file_size));
|
| @@ -275,7 +369,68 @@ class DownloadTest : public InProcessBrowserTest {
|
| #endif
|
|
|
| // Delete the downloaded copy of the file.
|
| - EXPECT_TRUE(file_util::DieFileDie(downloaded_file, false));
|
| + bool downloaded_file_deleted =
|
| + file_util::DieFileDie(downloaded_file, false);
|
| + EXPECT_TRUE(downloaded_file_deleted);
|
| + return downloaded_file_deleted;
|
| + }
|
| +
|
| + // TODO(ahendrickson) -- |expected_title_in_progress| and
|
| + // |expected_title_in_finished| need to be checked.
|
| + bool RunSizeTest(Browser* browser,
|
| + const GURL& url,
|
| + const std::wstring& expected_title_in_progress,
|
| + const std::wstring& expected_title_finished) {
|
| + if (!InitialSetup(false))
|
| + return false;
|
| +
|
| + // Download a partial web page in a background tab and wait.
|
| + // The mock system will not complete until it gets a special URL.
|
| + scoped_ptr<DownloadsObserver> observer(CreateWaiter(browser, 1));
|
| + ui_test_utils::NavigateToURL(browser, url);
|
| +
|
| + // TODO(ahendrickson): check download status text before downloading.
|
| + // Need to:
|
| + // - Add a member function to the |DownloadShelf| interface class, that
|
| + // indicates how many members it has.
|
| + // - Add a member function to |DownloadShelf| to get the status text
|
| + // of a given member (for example, via |DownloadItemView|'s
|
| + // GetAccessibleName() member function), by index.
|
| + // - Iterate over browser->window()->GetDownloadShelf()'s members
|
| + // to see if any match the status text we want. Start with the last one.
|
| +
|
| + // Complete sending the request. We do this by loading a second URL in a
|
| + // separate tab.
|
| + GURL finish_url(URLRequestSlowDownloadJob::kFinishDownloadUrl);
|
| + ui_test_utils::NavigateToURLWithDisposition(
|
| + browser,
|
| + finish_url,
|
| + NEW_FOREGROUND_TAB,
|
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| + observer->WaitForFinished();
|
| +
|
| + EXPECT_EQ(2, browser->tab_count());
|
| +
|
| + // TODO(ahendrickson): check download status text after downloading.
|
| +
|
| + // Make sure the download shelf is showing.
|
| + EXPECT_TRUE(browser->window()->IsDownloadShelfVisible());
|
| +
|
| + FilePath filename;
|
| + net::FileURLToFilePath(url, &filename);
|
| + filename = filename.BaseName();
|
| + FilePath download_path = downloads_directory_.path().Append(filename);
|
| +
|
| + bool downloaded_path_exists = file_util::PathExists(download_path);
|
| + EXPECT_TRUE(downloaded_path_exists);
|
| + if (!downloaded_path_exists)
|
| + return false;
|
| +
|
| + // Delete the file we just downloaded.
|
| + EXPECT_TRUE(file_util::DieFileDie(download_path, true));
|
| + EXPECT_FALSE(file_util::PathExists(download_path));
|
| +
|
| + return true;
|
| }
|
|
|
| private:
|
| @@ -286,51 +441,506 @@ class DownloadTest : public InProcessBrowserTest {
|
| ScopedTempDir downloads_directory_;
|
| };
|
|
|
| +// NOTES:
|
| +//
|
| +// Files for these tests are found in DIR_TEST_DATA (currently
|
| +// "chrome\test\data\", see chrome_paths.cc).
|
| +// Mock responses have extension .mock-http-headers appended to the file name.
|
| +
|
| +// Download a file due to the associated MIME type.
|
| +//
|
| // Test is believed good (non-flaky) in itself, but it
|
| // sometimes trips over underlying flakiness in the downloads
|
| // subsystem in in http://crbug.com/63237. Until that bug is
|
| // fixed, this test should be considered flaky. It's entered as
|
| // DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_DownloadMimeType) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
|
| - ASSERT_TRUE(CreateAndSetDownloadsDirectory());
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file));
|
|
|
| - EXPECT_EQ(1, browser()->tab_count());
|
| -
|
| - // Setup notification, navigate, and block.
|
| - scoped_ptr<DownloadsObserver> observer(CreateWaiter(1));
|
| - ui_test_utils::NavigateToURL(
|
| - browser(), URLRequestMockHTTPJob::GetMockUrl(file));
|
| - observer->WaitForFinished();
|
| + // Download the file and wait. We do not expect the Select File dialog.
|
| + DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG);
|
|
|
| - // Download should be finished; check state.
|
| - EXPECT_FALSE(observer->select_file_dialog_seen());
|
| + // Check state.
|
| EXPECT_EQ(1, browser()->tab_count());
|
| - CheckDownload(file, file);
|
| + CheckDownload(browser(), file, file);
|
| EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
|
| }
|
|
|
| +// Put up a Select File dialog when the file is downloaded, due to its MIME
|
| +// type.
|
| +//
|
| // This test runs correctly, but leaves behind turds in the test user's
|
| // download directory because of http://crbug.com/62099. No big loss; it
|
| // was primarily confirming DownloadsObserver wait on select file dialog
|
| // functionality anyway.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_DownloadMimeTypeSelect) {
|
| + ASSERT_TRUE(InitialSetup(true));
|
| + FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file));
|
| +
|
| + // Download the file and wait. We expect the Select File dialog to appear
|
| + // due to the MIME type.
|
| + DownloadAndWait(browser(), url, EXPECT_SELECT_DIALOG);
|
| +
|
| + // Check state.
|
| + EXPECT_EQ(1, browser()->tab_count());
|
| + // Since we exited while the Select File dialog was visible, there should not
|
| + // be anything in the download shelf and so it should not be visible.
|
| + EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible());
|
| +}
|
| +
|
| +// Access a file with a viewable mime-type, verify that a download
|
| +// did not initiate.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, NoDownload) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| + FilePath file(FILE_PATH_LITERAL("download-test2.html"));
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file));
|
| + FilePath file_path = GetDownloadDirectory(browser()).Append(file);
|
| +
|
| + // Open a web page and wait.
|
| + ui_test_utils::NavigateToURL(browser(), url);
|
| +
|
| + // Check that we did not download the web page.
|
| + EXPECT_FALSE(file_util::PathExists(file_path));
|
| +
|
| + // Check state.
|
| + EXPECT_EQ(1, browser()->tab_count());
|
| + EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible());
|
| +}
|
| +
|
| +// Download a 0-size file with a content-disposition header, verify that the
|
| +// download tab opened and the file exists as the filename specified in the
|
| +// header. This also ensures we properly handle empty file downloads.
|
| +// The download shelf should be visible in the current tab.
|
| +//
|
| +// Test is believed mostly good (non-flaky) in itself, but it
|
| +// sometimes trips over underlying flakiness in the downloads
|
| +// subsystem in in http://crbug.com/63237. Until that bug is
|
| +// fixed, this test should be considered flaky. It's entered as
|
| +// DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_ContentDisposition) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| + FilePath file(FILE_PATH_LITERAL("download-test3.gif"));
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file));
|
| + FilePath download_file(FILE_PATH_LITERAL("download-test3-attachment.gif"));
|
| +
|
| + // Download a file and wait.
|
| + DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG);
|
| +
|
| + CheckDownload(browser(), download_file, file);
|
| +
|
| + // Check state.
|
| + EXPECT_EQ(1, browser()->tab_count());
|
| + EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
|
| +}
|
| +
|
| +// Test that the download shelf is per-window by starting a download in one
|
| +// tab, opening a second tab, closing the shelf, going back to the first tab,
|
| +// and checking that the shelf is closed.
|
| +//
|
| +// The test sometimes trips over underlying flakiness in the downloads
|
| +// subsystem in in http://crbug.com/63237. It's entered as
|
| +// DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_PerWindowShelf) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| + FilePath file(FILE_PATH_LITERAL("download-test3.gif"));
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file));
|
| + FilePath download_file(FILE_PATH_LITERAL("download-test3-attachment.gif"));
|
| +
|
| + // Download a file and wait.
|
| + DownloadAndWait(browser(), url, EXPECT_NO_SELECT_DIALOG);
|
| +
|
| + CheckDownload(browser(), download_file, file);
|
| +
|
| + // Check state.
|
| + EXPECT_EQ(1, browser()->tab_count());
|
| + EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
|
| +
|
| + // Open a second tab and wait.
|
| + EXPECT_NE(static_cast<TabContentsWrapper*>(NULL),
|
| + browser()->AddSelectedTabWithURL(GURL(), PageTransition::TYPED));
|
| + EXPECT_EQ(2, browser()->tab_count());
|
| + EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
|
| +
|
| + // Hide the download shelf.
|
| + browser()->window()->GetDownloadShelf()->Close();
|
| + EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible());
|
| +
|
| + // Go to the first tab.
|
| + browser()->SelectTabContentsAt(0, true);
|
| + EXPECT_EQ(2, browser()->tab_count());
|
| +
|
| + // The download shelf should not be visible.
|
| + EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible());
|
| +}
|
| +
|
| +// UnknownSize and KnownSize are tests which depend on
|
| +// URLRequestSlowDownloadJob to serve content in a certain way. Data will be
|
| +// sent in two chunks where the first chunk is 35K and the second chunk is 10K.
|
| +// The test will first attempt to download a file; but the server will "pause"
|
| +// in the middle until the server receives a second request for
|
| +// "download-finish". At that time, the download will finish.
|
| +// These tests don't currently test much due to holes in |RunSizeTest()|. See
|
| +// comments in that routine for details.
|
| +
|
| +// Test is believed mostly good (non-flaky) in itself, but it
|
| +// very occasionally trips over underlying flakiness in the downloads
|
| +// subsystem in in http://crbug.com/63237. Until that bug is
|
| +// fixed, this test should be considered flaky. It's entered as
|
| +// DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_UnknownSize) {
|
| + GURL url(URLRequestSlowDownloadJob::kUnknownSizeUrl);
|
| + FilePath filename;
|
| + net::FileURLToFilePath(url, &filename);
|
| + filename = filename.BaseName();
|
| + ASSERT_TRUE(RunSizeTest(browser(),
|
| + url,
|
| + L"32.0 KB - " + filename.ToWStringHack(),
|
| + L"100% - " + filename.ToWStringHack()));
|
| +}
|
| +
|
| +// Test is believed mostly good (non-flaky) in itself, but it
|
| +// very occasionally trips over underlying flakiness in the downloads
|
| +// subsystem in in http://crbug.com/63237. Until that bug is
|
| +// fixed, this test should be considered flaky. It's entered as
|
| +// DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_KnownSize) {
|
| + GURL url(URLRequestSlowDownloadJob::kKnownSizeUrl);
|
| + FilePath filename;
|
| + net::FileURLToFilePath(url, &filename);
|
| + filename = filename.BaseName();
|
| + ASSERT_TRUE(RunSizeTest(browser(),
|
| + url,
|
| + L"71% - " + filename.ToWStringHack(),
|
| + L"100% - " + filename.ToWStringHack()));
|
| +}
|
| +
|
| +// Test that when downloading an item in Incognito mode, we don't crash when
|
| +// closing the last Incognito window (http://crbug.com/13983).
|
| +// Also check that the download shelf is not visible after closing the
|
| +// Incognito window.
|
| +//
|
| +// Test is believed mostly good (non-flaky) in itself, but it
|
| +// sometimes trips over underlying flakiness in the downloads
|
| +// subsystem in in http://crbug.com/63237. Until that bug is
|
| +// fixed, this test should be considered flaky. It's entered as
|
| +// DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_IncognitoDownload) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| +
|
| + // Open an Incognito window.
|
| + Browser* incognito = CreateIncognitoBrowser(); // Waits.
|
| + ASSERT_TRUE(incognito);
|
| + int window_count = BrowserList::size();
|
| + EXPECT_EQ(2, window_count);
|
| +
|
| + // Download a file in the Incognito window and wait.
|
| + CreateAndSetDownloadsDirectory(incognito);
|
| + FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file));
|
| + // Since |incognito| is a separate browser, we have to set it up explicitly.
|
| + incognito->profile()->GetPrefs()->SetBoolean(prefs::kPromptForDownload,
|
| + false);
|
| + DownloadAndWait(incognito, url, EXPECT_NO_SELECT_DIALOG);
|
| +
|
| + // We should still have 2 windows.
|
| + window_count = BrowserList::size();
|
| + EXPECT_EQ(2, window_count);
|
| +
|
| + // Verify that the download shelf is showing for the Incognito window.
|
| + bool is_shelf_visible = incognito->window()->IsDownloadShelfVisible();
|
| + EXPECT_TRUE(is_shelf_visible);
|
| +
|
| + // Close the Incognito window and don't crash.
|
| + incognito->CloseWindow();
|
| + ui_test_utils::WaitForNotificationFrom(NotificationType::BROWSER_CLOSED,
|
| + Source<Browser>(incognito));
|
| +
|
| + window_count = BrowserList::size();
|
| + EXPECT_EQ(1, window_count);
|
| +
|
| + // Verify that the regular window does not have a download shelf.
|
| + is_shelf_visible = browser()->window()->IsDownloadShelfVisible();
|
| + EXPECT_FALSE(is_shelf_visible);
|
| +
|
| + CheckDownload(browser(), file, file);
|
| +}
|
| +
|
| +// Navigate to a new background page, but don't download. Confirm that the
|
| +// download shelf is not visible and that we have two tabs.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DontCloseNewTab1) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| + // Because it's an HTML link, it should open a web page rather than
|
| + // downloading.
|
| + FilePath file1(FILE_PATH_LITERAL("download-test2.html"));
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file1));
|
| +
|
| + // Open a web page and wait.
|
| + ui_test_utils::NavigateToURLWithDisposition(
|
| + browser(),
|
| + url,
|
| + NEW_BACKGROUND_TAB,
|
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| +
|
| + // We should have two tabs now.
|
| + EXPECT_EQ(2, browser()->tab_count());
|
| + EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible());
|
| +}
|
| +
|
| +// Download a file in a background tab. Verify that the tab is closed
|
| +// automatically, and that the download shelf is visible in the current tab.
|
| +//
|
| +// The test sometimes trips over underlying flakiness in the downloads
|
| +// subsystem in http://crbug.com/63237. It's entered as
|
| +// DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_CloseNewTab1) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| +
|
| + // Download a file in a new background tab and wait. The tab is automatically
|
| + // closed when the download begins.
|
| + FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file));
|
| + DownloadAndWaitWithDisposition(
|
| + browser(),
|
| + url,
|
| + NEW_BACKGROUND_TAB,
|
| + EXPECT_NO_SELECT_DIALOG,
|
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| +
|
| + // When the download finishes, we should still have one tab.
|
| + EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
|
| + EXPECT_EQ(1, browser()->tab_count());
|
| +
|
| + CheckDownload(browser(), file, file);
|
| +}
|
| +
|
| +// Open a web page in the current tab, then download a file in another tab via
|
| +// a Javascript call.
|
| +// Verify that we have 2 tabs, and the download shelf is visible in the current
|
| +// tab.
|
| +//
|
| +// The download_page1.html page contains an openNew() function that opens a
|
| +// tab and then downloads download-test1.lib.
|
| +//
|
| +// The test sometimes trips over underlying flakiness in the downloads
|
| +// subsystem in in http://crbug.com/63237. It's entered as
|
| +// DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_DontCloseNewTab2) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| + // Because it's an HTML link, it should open a web page rather than
|
| + // downloading.
|
| + FilePath file1(FILE_PATH_LITERAL("download_page1.html"));
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file1));
|
| +
|
| + // Open a web page and wait.
|
| + ui_test_utils::NavigateToURL(browser(), url);
|
| +
|
| + // Download a file in a new tab and wait (via Javascript).
|
| + FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
|
| + DownloadAndWaitWithDisposition(browser(),
|
| + GURL("javascript:openNew()"),
|
| + CURRENT_TAB,
|
| + EXPECT_NO_SELECT_DIALOG,
|
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
|
| +
|
| + // When the download finishes, we should have two tabs.
|
| + EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
|
| + EXPECT_EQ(2, browser()->tab_count());
|
| +
|
| + CheckDownload(browser(), file, file);
|
| +}
|
| +
|
| +// Open a web page in the current tab, open another tab via a Javascript call,
|
| +// then download a file in the new tab.
|
| +// Verify that we have 2 tabs, and the download shelf is visible in the current
|
| +// tab.
|
| +//
|
| +// The download_page2.html page contains an openNew() function that opens a
|
| +// tab.
|
| +//
|
| +// The test sometimes trips over underlying flakiness in the downloads
|
| +// subsystem in in http://crbug.com/63237. It's entered as
|
| +// DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_DontCloseNewTab3) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| + // Because it's an HTML link, it should open a web page rather than
|
| + // downloading.
|
| + FilePath file1(FILE_PATH_LITERAL("download_page2.html"));
|
| + GURL url1(URLRequestMockHTTPJob::GetMockUrl(file1));
|
| +
|
| + // Open a web page and wait.
|
| + ui_test_utils::NavigateToURL(browser(), url1);
|
| +
|
| + // Open a new tab and wait.
|
| + ui_test_utils::NavigateToURLWithDisposition(
|
| + browser(),
|
| + GURL("javascript:openNew()"),
|
| + CURRENT_TAB,
|
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
|
| +
|
| + EXPECT_EQ(2, browser()->tab_count());
|
| +
|
| + // Download a file and wait.
|
| FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
|
| - ASSERT_TRUE(CreateAndSetDownloadsDirectory());
|
| - browser()->profile()->GetPrefs()->SetBoolean(prefs::kPromptForDownload, true);
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file));
|
| + DownloadAndWaitWithDisposition(browser(),
|
| + url,
|
| + CURRENT_TAB,
|
| + EXPECT_NO_SELECT_DIALOG,
|
| + ui_test_utils::BROWSER_TEST_NONE);
|
| +
|
| + // When the download finishes, we should have two tabs.
|
| + EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
|
| + EXPECT_EQ(2, browser()->tab_count());
|
| +
|
| + CheckDownload(browser(), file, file);
|
| +}
|
| +
|
| +// Open a web page in the current tab, then download a file via Javascript,
|
| +// which will do so in a temporary tab.
|
| +// Verify that we have 1 tab, and the download shelf is visible.
|
| +//
|
| +// The download_page3.html page contains an openNew() function that opens a
|
| +// tab with download-test1.lib in the URL. When the URL is determined to be
|
| +// a download, the tab is closed automatically.
|
| +//
|
| +// The test sometimes trips over underlying flakiness in the downloads
|
| +// subsystem in in http://crbug.com/63237. It's entered as
|
| +// DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_CloseNewTab2) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| + // Because it's an HTML link, it should open a web page rather than
|
| + // downloading.
|
| + FilePath file1(FILE_PATH_LITERAL("download_page3.html"));
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file1));
|
| +
|
| + // Open a web page and wait.
|
| + ui_test_utils::NavigateToURL(browser(), url);
|
| +
|
| + // Download a file and wait.
|
| + // The file to download is "download-test1.lib".
|
| + FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
|
| + DownloadAndWaitWithDisposition(browser(),
|
| + GURL("javascript:openNew()"),
|
| + CURRENT_TAB,
|
| + EXPECT_NO_SELECT_DIALOG,
|
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
|
| +
|
| + // When the download finishes, we should still have one tab.
|
| + EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
|
| + EXPECT_EQ(1, browser()->tab_count());
|
| +
|
| + CheckDownload(browser(), file, file);
|
| +}
|
|
|
| +// Open a web page in the current tab, then call Javascript via a button to
|
| +// download a file in a new tab, which is closed automatically when the
|
| +// download begins.
|
| +// Verify that we have 1 tab, and the download shelf is visible.
|
| +//
|
| +// The download_page4.html page contains a form with download-test1.lib as the
|
| +// action.
|
| +//
|
| +// The test sometimes trips over underlying flakiness in the downloads
|
| +// subsystem in in http://crbug.com/63237. It's entered as
|
| +// DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_CloseNewTab3) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| + // Because it's an HTML link, it should open a web page rather than
|
| + // downloading.
|
| + FilePath file1(FILE_PATH_LITERAL("download_page4.html"));
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file1));
|
| +
|
| + // Open a web page and wait.
|
| + ui_test_utils::NavigateToURL(browser(), url);
|
| +
|
| + // Download a file in a new tab and wait. The tab will automatically close
|
| + // when the download begins.
|
| + // The file to download is "download-test1.lib".
|
| + FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
|
| + DownloadAndWaitWithDisposition(
|
| + browser(),
|
| + GURL("javascript:document.getElementById('form').submit()"),
|
| + CURRENT_TAB,
|
| + EXPECT_NO_SELECT_DIALOG,
|
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
|
| +
|
| + // When the download finishes, we should still have one tab.
|
| + EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
|
| EXPECT_EQ(1, browser()->tab_count());
|
|
|
| - // Setup notification, navigate, and block.
|
| - scoped_ptr<DownloadsObserver> observer(CreateWaiter(1));
|
| - ui_test_utils::NavigateToURL(
|
| - browser(), URLRequestMockHTTPJob::GetMockUrl(file));
|
| - observer->WaitForFinished();
|
| + CheckDownload(browser(), file, file);
|
| +}
|
| +
|
| +// Download a file in a new window.
|
| +// Verify that we have 2 windows, and the download shelf is not visible in the
|
| +// first window, but is visible in the second window.
|
| +// Close the new window.
|
| +// Verify that we have 1 window, and the download shelf is not visible.
|
| +//
|
| +// Regression test for http://crbug.com/44454
|
| +//
|
| +// Test is believed mostly good (non-flaky) in itself, but it
|
| +// sometimes trips over underlying flakiness in the downloads
|
| +// subsystem in in http://crbug.com/63237. Until that bug is
|
| +// fixed, this test should be considered flaky. It's entered as
|
| +// DISABLED since if 63237 does cause a failure, it'll be a timeout.
|
| +// Additionally, there is Windows-specific flake, http://crbug.com/20809.
|
| +IN_PROC_BROWSER_TEST_F(DownloadTest, DISABLED_NewWindow) {
|
| + ASSERT_TRUE(InitialSetup(false));
|
| + FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
|
| + GURL url(URLRequestMockHTTPJob::GetMockUrl(file));
|
| + Browser* first_browser = browser();
|
| +
|
| + // Download a file in a new window and wait.
|
| + DownloadAndWaitWithDisposition(browser(),
|
| + url,
|
| + NEW_WINDOW,
|
| + EXPECT_NO_SELECT_DIALOG,
|
| + ui_test_utils::BROWSER_TEST_NONE);
|
| +
|
| + // When the download finishes, the download shelf SHOULD NOT be visible in
|
| + // the first window.
|
| + int window_count = BrowserList::size();
|
| + EXPECT_EQ(2, window_count);
|
| + EXPECT_EQ(1, browser()->tab_count());
|
| + EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible());
|
|
|
| - // Download should not be finished; check state.
|
| - EXPECT_TRUE(observer->select_file_dialog_seen());
|
| + // The download shelf SHOULD be visible in the second window.
|
| + std::set<Browser*> original_browsers;
|
| + original_browsers.insert(browser());
|
| + Browser* download_browser =
|
| + ui_test_utils::GetBrowserNotInSet(original_browsers);
|
| + ASSERT_TRUE(download_browser != NULL);
|
| + EXPECT_NE(download_browser, browser());
|
| + EXPECT_EQ(1, download_browser->tab_count());
|
| + EXPECT_TRUE(download_browser->window()->IsDownloadShelfVisible());
|
| +
|
| + // Close the new window.
|
| + download_browser->CloseWindow();
|
| + ui_test_utils::WaitForNotificationFrom(NotificationType::BROWSER_CLOSED,
|
| + Source<Browser>(download_browser));
|
| + EXPECT_EQ(first_browser, browser());
|
| + window_count = BrowserList::size();
|
| + EXPECT_EQ(1, window_count);
|
| EXPECT_EQ(1, browser()->tab_count());
|
| + // The download shelf should not be visible in the remaining window.
|
| EXPECT_FALSE(browser()->window()->IsDownloadShelfVisible());
|
| +
|
| + CheckDownload(browser(), file, file);
|
| }
|
|
|
| } // namespace
|
|
|