diff options
author | sammc@chromium.org <sammc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-16 08:58:14 +0000 |
---|---|---|
committer | sammc@chromium.org <sammc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-16 08:58:14 +0000 |
commit | edfca70c96fda567e60ab76c19016030a5746e7f (patch) | |
tree | 8b193215b0dbc8f7c6b423762746096357315cdb /chrome/browser/lifetime/browser_close_manager_browsertest.cc | |
parent | b5575a1a16d73028bf756f4f2408bcf595cf95c6 (diff) | |
download | chromium_src-edfca70c96fda567e60ab76c19016030a5746e7f.zip chromium_src-edfca70c96fda567e60ab76c19016030a5746e7f.tar.gz chromium_src-edfca70c96fda567e60ab76c19016030a5746e7f.tar.bz2 |
Extend batched shutdown to include the in-progress downloads dialog.
Previously, when Chrome shut down, the dialog warning about cancelling
downloads was displayed when the last window was about to close. With
this change, the dialog is displayed before any windows are closed.
BUG=265764
Review URL: https://chromiumcodereview.appspot.com/22545008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@217976 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/lifetime/browser_close_manager_browsertest.cc')
-rw-r--r-- | chrome/browser/lifetime/browser_close_manager_browsertest.cc | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/chrome/browser/lifetime/browser_close_manager_browsertest.cc b/chrome/browser/lifetime/browser_close_manager_browsertest.cc index 34c97742..f127ac0 100644 --- a/chrome/browser/lifetime/browser_close_manager_browsertest.cc +++ b/chrome/browser/lifetime/browser_close_manager_browsertest.cc @@ -5,23 +5,33 @@ #include <vector> #include "base/command_line.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_shutdown.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/lifetime/browser_close_manager.h" +#include "chrome/browser/net/url_request_mock_util.h" #include "chrome/browser/prefs/session_startup_pref.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h" #include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_iterator.h" +#include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/download_item.h" +#include "content/public/browser/download_manager.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/web_contents.h" +#include "content/public/test/download_test_observer.h" #include "content/public/test/test_navigation_observer.h" +#include "content/test/net/url_request_slow_download_job.h" #include "net/test/embedded_test_server/embedded_test_server.h" namespace { @@ -106,6 +116,46 @@ class RepeatedNotificationObserver : public content::NotificationObserver { DISALLOW_COPY_AND_ASSIGN(RepeatedNotificationObserver); }; +class TestBrowserCloseManager : public BrowserCloseManager { + public: + enum UserChoice { + USER_CHOICE_USER_CANCELS_CLOSE, + USER_CHOICE_USER_ALLOWS_CLOSE, + }; + + static void AttemptClose(UserChoice user_choice) { + scoped_refptr<BrowserCloseManager> browser_close_manager = + new TestBrowserCloseManager(user_choice); + browser_close_manager->StartClosingBrowsers(); + } + + protected: + virtual ~TestBrowserCloseManager() {} + + virtual void ConfirmCloseWithPendingDownloads( + int download_count, + const base::Callback<void(bool)>& callback) OVERRIDE { + switch (user_choice_) { + case USER_CHOICE_USER_CANCELS_CLOSE: { + callback.Run(false); + break; + } + case USER_CHOICE_USER_ALLOWS_CLOSE: { + callback.Run(true); + break; + } + } + } + + private: + explicit TestBrowserCloseManager(UserChoice user_choice) + : user_choice_(user_choice) {} + + UserChoice user_choice_; + + DISALLOW_COPY_AND_ASSIGN(TestBrowserCloseManager); +}; + } // namespace class BrowserCloseManagerBrowserTest @@ -118,6 +168,10 @@ class BrowserCloseManagerBrowserTest browser()->profile(), SessionStartupPref(SessionStartupPref::LAST)); browsers_.push_back(browser()); dialogs_.Start(); + content::BrowserThread::PostTask( + content::BrowserThread::IO, + FROM_HERE, + base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); } virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { @@ -126,6 +180,20 @@ class BrowserCloseManagerBrowserTest command_line->AppendSwitch(switches::kEnableFastUnload); } + void CreateStalledDownload(Browser* browser) { + content::DownloadTestObserverInProgress observer( + content::BrowserContext::GetDownloadManager(browser->profile()), 1); + ui_test_utils::NavigateToURLWithDisposition( + browser, + GURL(content::URLRequestSlowDownloadJob::kKnownSizeUrl), + NEW_BACKGROUND_TAB, + ui_test_utils::BROWSER_TEST_NONE); + observer.WaitForFinished(); + EXPECT_EQ( + 1UL, + observer.NumDownloadsSeenInState(content::DownloadItem::IN_PROGRESS)); + } + std::vector<Browser*> browsers_; AppModalDialogObserver dialogs_; }; @@ -536,6 +604,102 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, EXPECT_TRUE(chrome::BrowserIterator().done()); } +// Test shutdown with a download in progress. +IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestWithDownloads) { + ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); + ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser())); + content::TestNavigationObserver navigation_observer( + browser()->tab_strip_model()->GetActiveWebContents(), 1); + TestBrowserCloseManager::AttemptClose( + TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE); + EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); + navigation_observer.Wait(); + EXPECT_EQ(GURL(chrome::kChromeUIDownloadsURL), + browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); + + RepeatedNotificationObserver close_observer( + chrome::NOTIFICATION_BROWSER_CLOSED, 1); + + TestBrowserCloseManager::AttemptClose( + TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE); + close_observer.Wait(); + EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); + EXPECT_TRUE(chrome::BrowserIterator().done()); +} + +// Test shutdown with a download in progress from one profile, where the only +// open windows are for another profile. +IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, + TestWithDownloadsFromDifferentProfiles) { + ProfileManager* profile_manager = g_browser_process->profile_manager(); + base::FilePath path = + profile_manager->user_data_dir().AppendASCII("test_profile"); + if (!base::PathExists(path)) + ASSERT_TRUE(file_util::CreateDirectory(path)); + Profile* other_profile = + Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS); + profile_manager->RegisterTestingProfile(other_profile, true, false); + Browser* other_profile_browser = CreateBrowser(other_profile); + + ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); + ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser())); + { + RepeatedNotificationObserver close_observer( + chrome::NOTIFICATION_BROWSER_CLOSED, 1); + browser()->window()->Close(); + close_observer.Wait(); + } + + // When the shutdown is cancelled, the downloads page should be opened in a + // browser for that profile. Because there are no browsers for that profile, a + // new browser should be opened. + ui_test_utils::BrowserAddedObserver new_browser_observer; + TestBrowserCloseManager::AttemptClose( + TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE); + EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); + Browser* opened_browser = new_browser_observer.WaitForSingleNewBrowser(); + EXPECT_EQ( + GURL(chrome::kChromeUIDownloadsURL), + opened_browser->tab_strip_model()->GetActiveWebContents()->GetURL()); + EXPECT_EQ(GURL("about:blank"), + other_profile_browser->tab_strip_model()->GetActiveWebContents() + ->GetURL()); + + RepeatedNotificationObserver close_observer( + chrome::NOTIFICATION_BROWSER_CLOSED, 2); + TestBrowserCloseManager::AttemptClose( + TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE); + close_observer.Wait(); + EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); + EXPECT_TRUE(chrome::BrowserIterator().done()); +} + +// Test shutdown with downloads in progress and beforeunload handlers. +IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, + TestBeforeUnloadAndDownloads) { + ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); + ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser())); + ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL("/beforeunload.html"))); + + content::WindowedNotificationObserver cancel_observer( + chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, + content::NotificationService::AllSources()); + TestBrowserCloseManager::AttemptClose( + TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE); + ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); + cancel_observer.Wait(); + EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); + + RepeatedNotificationObserver close_observer( + chrome::NOTIFICATION_BROWSER_CLOSED, 1); + TestBrowserCloseManager::AttemptClose( + TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE); + close_observer.Wait(); + EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); + EXPECT_TRUE(chrome::BrowserIterator().done()); +} + INSTANTIATE_TEST_CASE_P(BrowserCloseManagerBrowserTest, BrowserCloseManagerBrowserTest, testing::Bool()); |