blob: bfe45916d68edb228cb50453a0307ff7b7badb26 [file] [log] [blame]
[email protected]2e9d79f2013-08-16 05:45:561// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <vector>
6
7#include "base/command_line.h"
[email protected]0ed53872014-05-10 05:51:058#include "base/files/scoped_temp_dir.h"
avi6846aef2015-12-26 01:09:389#include "base/macros.h"
10#include "build/build_config.h"
[email protected]0c95faf42013-10-28 06:27:2011#include "chrome/browser/background/background_mode_manager.h"
[email protected]edfca702013-08-16 08:58:1412#include "chrome/browser/browser_process.h"
[email protected]2e9d79f2013-08-16 05:45:5613#include "chrome/browser/browser_shutdown.h"
14#include "chrome/browser/chrome_notification_types.h"
[email protected]5fec4702013-11-20 04:37:3815#include "chrome/browser/defaults.h"
[email protected]422a7d12013-10-21 12:10:4216#include "chrome/browser/download/chrome_download_manager_delegate.h"
[email protected]0ed53872014-05-10 05:51:0517#include "chrome/browser/download/download_prefs.h"
[email protected]422a7d12013-10-21 12:10:4218#include "chrome/browser/download/download_service.h"
19#include "chrome/browser/download/download_service_factory.h"
[email protected]2e9d79f2013-08-16 05:45:5620#include "chrome/browser/lifetime/application_lifetime.h"
21#include "chrome/browser/lifetime/browser_close_manager.h"
[email protected]edfca702013-08-16 08:58:1422#include "chrome/browser/net/url_request_mock_util.h"
[email protected]2e9d79f2013-08-16 05:45:5623#include "chrome/browser/prefs/session_startup_pref.h"
[email protected]edfca702013-08-16 08:58:1424#include "chrome/browser/profiles/profile.h"
25#include "chrome/browser/profiles/profile_manager.h"
[email protected]2e9d79f2013-08-16 05:45:5626#include "chrome/browser/ui/browser.h"
[email protected]0c95faf42013-10-28 06:27:2027#include "chrome/browser/ui/browser_commands.h"
[email protected]2e9d79f2013-08-16 05:45:5628#include "chrome/browser/ui/browser_iterator.h"
[email protected]edfca702013-08-16 08:58:1429#include "chrome/browser/ui/browser_window.h"
[email protected]2e9d79f2013-08-16 05:45:5630#include "chrome/browser/ui/tabs/tab_strip_model.h"
31#include "chrome/common/chrome_switches.h"
32#include "chrome/common/url_constants.h"
33#include "chrome/test/base/in_process_browser_test.h"
34#include "chrome/test/base/ui_test_utils.h"
oshimaf65398422014-11-18 23:30:4235#include "components/app_modal/javascript_app_modal_dialog.h"
36#include "components/app_modal/native_app_modal_dialog.h"
[email protected]edfca702013-08-16 08:58:1437#include "content/public/browser/browser_context.h"
38#include "content/public/browser/download_item.h"
39#include "content/public/browser/download_manager.h"
[email protected]2e9d79f2013-08-16 05:45:5640#include "content/public/browser/notification_service.h"
41#include "content/public/browser/web_contents.h"
[email protected]edfca702013-08-16 08:58:1442#include "content/public/test/download_test_observer.h"
[email protected]2e9d79f2013-08-16 05:45:5643#include "content/public/test/test_navigation_observer.h"
44#include "net/test/embedded_test_server/embedded_test_server.h"
xunjieli0332c192014-09-10 23:23:3145#include "net/test/url_request/url_request_mock_http_job.h"
jam8e45cd72015-01-20 16:33:4446#include "net/test/url_request/url_request_slow_download_job.h"
[email protected]2e9d79f2013-08-16 05:45:5647
[email protected]f9357a442014-05-15 18:44:0748#if defined(OS_CHROMEOS)
49#include "chromeos/chromeos_switches.h"
50#endif
51
[email protected]2e9d79f2013-08-16 05:45:5652namespace {
53
oshima0929be2a2014-11-19 22:21:0354app_modal::NativeAppModalDialog* GetNextDialog() {
55 app_modal::AppModalDialog* dialog = ui_test_utils::WaitForAppModalDialog();
oshima82f72482014-10-24 14:14:3256 EXPECT_TRUE(dialog->IsJavaScriptModalDialog());
oshima0929be2a2014-11-19 22:21:0357 app_modal::JavaScriptAppModalDialog* js_dialog =
58 static_cast<app_modal::JavaScriptAppModalDialog*>(dialog);
oshima82f72482014-10-24 14:14:3259 CHECK(js_dialog->native_dialog());
60 return js_dialog->native_dialog();
61}
[email protected]2e9d79f2013-08-16 05:45:5662
oshima82f72482014-10-24 14:14:3263void AcceptClose() {
64 GetNextDialog()->AcceptAppModalDialog();
65}
[email protected]2e9d79f2013-08-16 05:45:5666
oshima82f72482014-10-24 14:14:3267void CancelClose() {
68 GetNextDialog()->CancelAppModalDialog();
69}
[email protected]2e9d79f2013-08-16 05:45:5670
71class RepeatedNotificationObserver : public content::NotificationObserver {
72 public:
73 explicit RepeatedNotificationObserver(int type, int count)
74 : num_outstanding_(count), running_(false) {
75 registrar_.Add(this, type, content::NotificationService::AllSources());
76 }
77
Daniel Chenga542fca2014-10-21 09:51:2978 void Observe(int type,
79 const content::NotificationSource& source,
80 const content::NotificationDetails& details) override {
[email protected]2e9d79f2013-08-16 05:45:5681 ASSERT_GT(num_outstanding_, 0);
82 if (!--num_outstanding_ && running_) {
83 content::BrowserThread::PostTask(
84 content::BrowserThread::UI, FROM_HERE, run_loop_.QuitClosure());
85 }
86 }
87
88 void Wait() {
89 if (num_outstanding_ <= 0)
90 return;
91
92 running_ = true;
93 run_loop_.Run();
94 running_ = false;
95 }
96
97 private:
98 int num_outstanding_;
99 content::NotificationRegistrar registrar_;
100 bool running_;
101 base::RunLoop run_loop_;
102
103 DISALLOW_COPY_AND_ASSIGN(RepeatedNotificationObserver);
104};
105
[email protected]edfca702013-08-16 08:58:14106class TestBrowserCloseManager : public BrowserCloseManager {
107 public:
108 enum UserChoice {
109 USER_CHOICE_USER_CANCELS_CLOSE,
110 USER_CHOICE_USER_ALLOWS_CLOSE,
[email protected]422a7d12013-10-21 12:10:42111 NO_USER_CHOICE
[email protected]edfca702013-08-16 08:58:14112 };
113
114 static void AttemptClose(UserChoice user_choice) {
115 scoped_refptr<BrowserCloseManager> browser_close_manager =
116 new TestBrowserCloseManager(user_choice);
[email protected]0c95faf42013-10-28 06:27:20117 browser_shutdown::SetTryingToQuit(true);
[email protected]edfca702013-08-16 08:58:14118 browser_close_manager->StartClosingBrowsers();
119 }
120
121 protected:
Daniel Chenga542fca2014-10-21 09:51:29122 ~TestBrowserCloseManager() override {}
[email protected]edfca702013-08-16 08:58:14123
Daniel Chenga542fca2014-10-21 09:51:29124 void ConfirmCloseWithPendingDownloads(
[email protected]edfca702013-08-16 08:58:14125 int download_count,
mostynb2b52d1db2014-10-07 02:47:17126 const base::Callback<void(bool)>& callback) override {
[email protected]422a7d12013-10-21 12:10:42127 EXPECT_NE(NO_USER_CHOICE, user_choice_);
[email protected]edfca702013-08-16 08:58:14128 switch (user_choice_) {
[email protected]422a7d12013-10-21 12:10:42129 case NO_USER_CHOICE:
[email protected]edfca702013-08-16 08:58:14130 case USER_CHOICE_USER_CANCELS_CLOSE: {
131 callback.Run(false);
132 break;
133 }
134 case USER_CHOICE_USER_ALLOWS_CLOSE: {
135 callback.Run(true);
136 break;
137 }
138 }
139 }
140
141 private:
142 explicit TestBrowserCloseManager(UserChoice user_choice)
143 : user_choice_(user_choice) {}
144
145 UserChoice user_choice_;
146
147 DISALLOW_COPY_AND_ASSIGN(TestBrowserCloseManager);
148};
149
[email protected]422a7d12013-10-21 12:10:42150class TestDownloadManagerDelegate : public ChromeDownloadManagerDelegate {
151 public:
152 explicit TestDownloadManagerDelegate(Profile* profile)
153 : ChromeDownloadManagerDelegate(profile) {
[email protected]861b4d0a2013-12-13 20:10:41154 GetDownloadIdReceiverCallback().Run(content::DownloadItem::kInvalidId + 1);
[email protected]422a7d12013-10-21 12:10:42155 }
Daniel Chenga542fca2014-10-21 09:51:29156 ~TestDownloadManagerDelegate() override {}
[email protected]422a7d12013-10-21 12:10:42157
Daniel Chenga542fca2014-10-21 09:51:29158 bool DetermineDownloadTarget(
[email protected]422a7d12013-10-21 12:10:42159 content::DownloadItem* item,
mostynb2b52d1db2014-10-07 02:47:17160 const content::DownloadTargetCallback& callback) override {
[email protected]422a7d12013-10-21 12:10:42161 content::DownloadTargetCallback dangerous_callback =
[email protected]861b4d0a2013-12-13 20:10:41162 base::Bind(&TestDownloadManagerDelegate::SetDangerous, callback);
[email protected]422a7d12013-10-21 12:10:42163 return ChromeDownloadManagerDelegate::DetermineDownloadTarget(
164 item, dangerous_callback);
165 }
166
[email protected]861b4d0a2013-12-13 20:10:41167 static void SetDangerous(
[email protected]422a7d12013-10-21 12:10:42168 const content::DownloadTargetCallback& callback,
169 const base::FilePath& target_path,
170 content::DownloadItem::TargetDisposition disp,
171 content::DownloadDangerType danger_type,
172 const base::FilePath& intermediate_path) {
173 callback.Run(target_path,
174 disp,
175 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
176 intermediate_path);
177 }
[email protected]422a7d12013-10-21 12:10:42178};
179
[email protected]0c95faf42013-10-28 06:27:20180class FakeBackgroundModeManager : public BackgroundModeManager {
181 public:
182 FakeBackgroundModeManager()
183 : BackgroundModeManager(
gab94474812015-01-08 20:04:36184 *base::CommandLine::ForCurrentProcess(),
[email protected]0c95faf42013-10-28 06:27:20185 &g_browser_process->profile_manager()->GetProfileInfoCache()),
186 suspended_(false) {}
187
Daniel Chenga542fca2014-10-21 09:51:29188 void SuspendBackgroundMode() override {
[email protected]0c95faf42013-10-28 06:27:20189 BackgroundModeManager::SuspendBackgroundMode();
190 suspended_ = true;
191 }
192
Daniel Chenga542fca2014-10-21 09:51:29193 void ResumeBackgroundMode() override {
[email protected]0c95faf42013-10-28 06:27:20194 BackgroundModeManager::ResumeBackgroundMode();
195 suspended_ = false;
196 }
197
198 bool IsBackgroundModeSuspended() {
199 return suspended_;
200 }
201
202 private:
203 bool suspended_;
204
205 DISALLOW_COPY_AND_ASSIGN(FakeBackgroundModeManager);
206};
207
[email protected]2e9d79f2013-08-16 05:45:56208} // namespace
209
210class BrowserCloseManagerBrowserTest
211 : public InProcessBrowserTest,
212 public testing::WithParamInterface<bool> {
213 protected:
Daniel Chenga542fca2014-10-21 09:51:29214 void SetUpOnMainThread() override {
[email protected]2e9d79f2013-08-16 05:45:56215 InProcessBrowserTest::SetUpOnMainThread();
216 SessionStartupPref::SetStartupPref(
217 browser()->profile(), SessionStartupPref(SessionStartupPref::LAST));
218 browsers_.push_back(browser());
[email protected]edfca702013-08-16 08:58:14219 content::BrowserThread::PostTask(
220 content::BrowserThread::IO,
221 FROM_HERE,
222 base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
[email protected]2e9d79f2013-08-16 05:45:56223 }
224
avi556c05022014-12-22 23:31:43225 void SetUpCommandLine(base::CommandLine* command_line) override {
[email protected]2e9d79f2013-08-16 05:45:56226 if (GetParam())
227 command_line->AppendSwitch(switches::kEnableFastUnload);
[email protected]f9357a442014-05-15 18:44:07228#if defined(OS_CHROMEOS)
229 command_line->AppendSwitch(
230 chromeos::switches::kIgnoreUserProfileMappingForTests);
231#endif
[email protected]2e9d79f2013-08-16 05:45:56232 }
233
[email protected]edfca702013-08-16 08:58:14234 void CreateStalledDownload(Browser* browser) {
235 content::DownloadTestObserverInProgress observer(
236 content::BrowserContext::GetDownloadManager(browser->profile()), 1);
237 ui_test_utils::NavigateToURLWithDisposition(
238 browser,
jam8e45cd72015-01-20 16:33:44239 GURL(net::URLRequestSlowDownloadJob::kKnownSizeUrl),
[email protected]edfca702013-08-16 08:58:14240 NEW_BACKGROUND_TAB,
241 ui_test_utils::BROWSER_TEST_NONE);
242 observer.WaitForFinished();
243 EXPECT_EQ(
244 1UL,
245 observer.NumDownloadsSeenInState(content::DownloadItem::IN_PROGRESS));
246 }
247
[email protected]2e9d79f2013-08-16 05:45:56248 std::vector<Browser*> browsers_;
[email protected]2e9d79f2013-08-16 05:45:56249};
250
251IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestSingleTabShutdown) {
svaldeza01f7d92015-11-18 17:47:56252 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56253 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
254 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
255 RepeatedNotificationObserver cancel_observer(
256 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20257 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32258 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56259 cancel_observer.Wait();
260 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
261 EXPECT_EQ(1, browser()->tab_strip_model()->count());
262
263 RepeatedNotificationObserver close_observer(
264 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
[email protected]0c95faf42013-10-28 06:27:20265 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32266 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56267 close_observer.Wait();
268 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
269 EXPECT_TRUE(chrome::BrowserIterator().done());
270}
271
272IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
273 TestShutdownMoreThanOnce) {
svaldeza01f7d92015-11-18 17:47:56274 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56275 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
276 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
277 RepeatedNotificationObserver cancel_observer(
278 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20279 chrome::CloseAllBrowsersAndQuit();
280 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32281 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56282 cancel_observer.Wait();
283 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
284 EXPECT_EQ(1, browser()->tab_strip_model()->count());
285
286 RepeatedNotificationObserver close_observer(
287 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
[email protected]0c95faf42013-10-28 06:27:20288 chrome::CloseAllBrowsersAndQuit();
289 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32290 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56291 close_observer.Wait();
292 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
293 EXPECT_TRUE(chrome::BrowserIterator().done());
294}
295
wafflesb63234052015-08-07 02:44:02296// Test is flaky on Mac. http://crbug.com/517687
297#if defined(OS_MACOSX)
298#define MAYBE_PRE_TestSessionRestore DISABLED_PRE_TestSessionRestore
299#else
300#define MAYBE_PRE_TestSessionRestore DISABLED_PRE_TestSessionRestore
301#endif
302IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
303 MAYBE_PRE_TestSessionRestore) {
svaldeza01f7d92015-11-18 17:47:56304 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56305 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
306 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
307 AddBlankTabAndShow(browser());
308 ASSERT_NO_FATAL_FAILURE(
309 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL)));
310 RepeatedNotificationObserver cancel_observer(
311 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20312 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32313 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56314 cancel_observer.Wait();
315 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
316
317 browser()->tab_strip_model()
318 ->CloseWebContentsAt(1, TabStripModel::CLOSE_USER_GESTURE);
319 content::TestNavigationObserver navigation_observer(
320 browser()->tab_strip_model()->GetActiveWebContents(), 1);
321 ASSERT_NO_FATAL_FAILURE(
322 NavigateToURLWithDisposition(browser(),
323 GURL(chrome::kChromeUIVersionURL),
324 CURRENT_TAB,
325 ui_test_utils::BROWSER_TEST_NONE));
oshima82f72482014-10-24 14:14:32326 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56327 navigation_observer.Wait();
328
329 RepeatedNotificationObserver close_observer(
330 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
[email protected]0c95faf42013-10-28 06:27:20331 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56332 close_observer.Wait();
333 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
334 EXPECT_TRUE(chrome::BrowserIterator().done());
335}
336
337// Test that the tab closed after the aborted shutdown attempt is not re-opened
338// when restoring the session.
wafflesb63234052015-08-07 02:44:02339// Test is flaky on Mac. http://crbug.com/517687
340#if defined(OS_MACOSX)
341#define MAYBE_TestSessionRestore DISABLED_TestSessionRestore
342#else
343#define MAYBE_TestSessionRestore DISABLED_TestSessionRestore
344#endif
345IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
346 MAYBE_TestSessionRestore) {
[email protected]2e9d79f2013-08-16 05:45:56347 // The testing framework launches Chrome with about:blank as args.
348 EXPECT_EQ(2, browser()->tab_strip_model()->count());
349 EXPECT_EQ(GURL(chrome::kChromeUIVersionURL),
350 browser()->tab_strip_model()->GetWebContentsAt(0)->GetURL());
351 EXPECT_EQ(GURL("about:blank"),
352 browser()->tab_strip_model()->GetWebContentsAt(1)->GetURL());
353}
354
355// Test that browser windows are only closed if all browsers are ready to close
356// and that all beforeunload dialogs are shown again after a cancel.
[email protected]40cd13a2013-10-24 13:42:01357IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestMultipleWindows) {
svaldeza01f7d92015-11-18 17:47:56358 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56359 browsers_.push_back(CreateBrowser(browser()->profile()));
360 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
361 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
362 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
363 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
364
365 // Cancel shutdown on the first beforeunload event.
366 {
367 RepeatedNotificationObserver cancel_observer(
368 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20369 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32370 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56371 cancel_observer.Wait();
372 }
373 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
374 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
375 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
376
377 // Cancel shutdown on the second beforeunload event.
378 {
379 RepeatedNotificationObserver cancel_observer(
380 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
[email protected]0c95faf42013-10-28 06:27:20381 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32382 ASSERT_NO_FATAL_FAILURE(AcceptClose());
383 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56384 cancel_observer.Wait();
385 }
386 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
387 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
388 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
389
390 // Allow shutdown for both beforeunload events.
391 RepeatedNotificationObserver close_observer(
392 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20393 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32394 ASSERT_NO_FATAL_FAILURE(AcceptClose());
395 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56396 close_observer.Wait();
397 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
398 EXPECT_TRUE(chrome::BrowserIterator().done());
399}
400
401// Test that tabs in the same window with a beforeunload event that hangs are
402// treated the same as the user accepting the close, but do not close the tab
403// early.
[email protected]52656e02013-08-20 15:50:13404// Test is flaky on windows, disabled. See http://crbug.com/276366
wafflesb63234052015-08-07 02:44:02405// Test is flaky on Mac. See http://crbug.com/517687.
406#if defined(OS_WIN) || defined(OS_MACOSX)
[email protected]52656e02013-08-20 15:50:13407#define MAYBE_TestHangInBeforeUnloadMultipleTabs \
408 DISABLED_TestHangInBeforeUnloadMultipleTabs
409#else
410#define MAYBE_TestHangInBeforeUnloadMultipleTabs \
411 TestHangInBeforeUnloadMultipleTabs
412#endif
[email protected]2e9d79f2013-08-16 05:45:56413IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
[email protected]52656e02013-08-20 15:50:13414 MAYBE_TestHangInBeforeUnloadMultipleTabs) {
svaldeza01f7d92015-11-18 17:47:56415 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56416 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
417 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
418 AddBlankTabAndShow(browsers_[0]);
419 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
420 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
421 AddBlankTabAndShow(browsers_[0]);
422 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
423 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
424
425 RepeatedNotificationObserver cancel_observer(
426 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20427 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32428 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56429 cancel_observer.Wait();
430 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
431 // All tabs should still be open.
432 EXPECT_EQ(3, browsers_[0]->tab_strip_model()->count());
433
434 RepeatedNotificationObserver close_observer(
435 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
[email protected]0c95faf42013-10-28 06:27:20436 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32437 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56438 close_observer.Wait();
439 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
440 EXPECT_TRUE(chrome::BrowserIterator().done());
441}
442
443// Test that tabs in different windows with a beforeunload event that hangs are
444// treated the same as the user accepting the close, but do not close the tab
445// early.
446IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
447 TestHangInBeforeUnloadMultipleWindows) {
svaldeza01f7d92015-11-18 17:47:56448 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56449 browsers_.push_back(CreateBrowser(browser()->profile()));
450 browsers_.push_back(CreateBrowser(browser()->profile()));
451 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
452 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
453 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
454 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
455 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
456 browsers_[2], embedded_test_server()->GetURL("/beforeunload_hang.html")));
457
458 RepeatedNotificationObserver cancel_observer(
459 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
[email protected]0c95faf42013-10-28 06:27:20460 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32461 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56462 cancel_observer.Wait();
463 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
464 // All windows should still be open.
465 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
466 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
467 EXPECT_EQ(1, browsers_[2]->tab_strip_model()->count());
468
469 RepeatedNotificationObserver close_observer(
470 chrome::NOTIFICATION_BROWSER_CLOSED, 3);
[email protected]0c95faf42013-10-28 06:27:20471 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32472 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56473 close_observer.Wait();
474 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
475 EXPECT_TRUE(chrome::BrowserIterator().done());
476}
477
478// Test that a window created during shutdown is closed.
479IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
480 TestAddWindowDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56481 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56482 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
483 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
484
485 RepeatedNotificationObserver close_observer(
486 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20487 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56488 browsers_.push_back(CreateBrowser(browser()->profile()));
oshima82f72482014-10-24 14:14:32489 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56490 close_observer.Wait();
491 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
492 EXPECT_TRUE(chrome::BrowserIterator().done());
493}
494
495// Test that a window created during shutdown with a beforeunload handler can
496// cancel the shutdown.
497IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
[email protected]40cd13a2013-10-24 13:42:01498 TestAddWindowWithBeforeUnloadDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56499 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56500 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
501 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
502
503 RepeatedNotificationObserver cancel_observer(
504 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
[email protected]0c95faf42013-10-28 06:27:20505 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56506 browsers_.push_back(CreateBrowser(browser()->profile()));
507 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
508 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
oshima82f72482014-10-24 14:14:32509 ASSERT_NO_FATAL_FAILURE(AcceptClose());
510 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56511 cancel_observer.Wait();
512 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
513 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
514 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
515
516 // Allow shutdown for both beforeunload dialogs.
517 RepeatedNotificationObserver close_observer(
518 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20519 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32520 ASSERT_NO_FATAL_FAILURE(AcceptClose());
521 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56522 close_observer.Wait();
523 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
524 EXPECT_TRUE(chrome::BrowserIterator().done());
525}
526
527// Test that tabs added during shutdown are closed.
Dana Jansensee1900942015-08-12 17:33:24528// Disabled for being flaky tests: crbug.com/519646
[email protected]2e9d79f2013-08-16 05:45:56529IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
Dana Jansensee1900942015-08-12 17:33:24530 DISABLED_TestAddTabDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56531 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56532 browsers_.push_back(CreateBrowser(browser()->profile()));
533 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
534 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
535 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
536 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
537
538 RepeatedNotificationObserver close_observer(
539 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20540 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32541 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56542 AddBlankTabAndShow(browsers_[0]);
543 AddBlankTabAndShow(browsers_[1]);
oshima82f72482014-10-24 14:14:32544 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56545 close_observer.Wait();
546 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
547 EXPECT_TRUE(chrome::BrowserIterator().done());
548}
549
550// Test that tabs created during shutdown with beforeunload handlers can cancel
551// the shutdown.
Dana Jansens4d4f46672015-08-11 20:16:14552// Disabled for being flaky tests: crbug.com/519646
[email protected]2e9d79f2013-08-16 05:45:56553IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
Dana Jansens4d4f46672015-08-11 20:16:14554 DISABLED_TestAddTabWithBeforeUnloadDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56555 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56556 browsers_.push_back(CreateBrowser(browser()->profile()));
557 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
558 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
559 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
560 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
561 RepeatedNotificationObserver cancel_observer(
562 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
[email protected]0c95faf42013-10-28 06:27:20563 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32564 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56565 AddBlankTabAndShow(browsers_[0]);
566 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
567 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
568 AddBlankTabAndShow(browsers_[1]);
569 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
570 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
oshima82f72482014-10-24 14:14:32571 ASSERT_NO_FATAL_FAILURE(AcceptClose());
572 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56573 cancel_observer.Wait();
574 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
575 EXPECT_EQ(2, browsers_[0]->tab_strip_model()->count());
576 EXPECT_EQ(2, browsers_[1]->tab_strip_model()->count());
577
578 RepeatedNotificationObserver close_observer(
579 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20580 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32581 ASSERT_NO_FATAL_FAILURE(AcceptClose());
582 ASSERT_NO_FATAL_FAILURE(AcceptClose());
583 ASSERT_NO_FATAL_FAILURE(AcceptClose());
584 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56585
586 close_observer.Wait();
587 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
588 EXPECT_TRUE(chrome::BrowserIterator().done());
589}
590
591IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
592 TestCloseTabDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56593 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56594 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
595 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
596 RepeatedNotificationObserver cancel_observer(
597 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20598 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56599
600 browsers_.push_back(CreateBrowser(browser()->profile()));
601 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
602 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
603 browsers_[1]->tab_strip_model()->CloseAllTabs();
oshima82f72482014-10-24 14:14:32604 ASSERT_NO_FATAL_FAILURE(CancelClose());
605 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56606 cancel_observer.Wait();
607 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
608 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
609 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
610
611 RepeatedNotificationObserver close_observer(
612 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20613 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56614 browsers_[1]->tab_strip_model()->CloseAllTabs();
oshima82f72482014-10-24 14:14:32615 ASSERT_NO_FATAL_FAILURE(AcceptClose());
616 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56617
618 close_observer.Wait();
619 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
620 EXPECT_TRUE(chrome::BrowserIterator().done());
621}
622
avi848c4dc2015-06-11 18:59:40623// Test is flaky on Windows and Mac. See http://crbug.com/276366.
624#if defined(OS_WIN) || defined(OS_MACOSX)
[email protected]8376e172013-10-03 08:42:49625#define MAYBE_TestOpenAndCloseWindowDuringShutdown \
626 DISABLED_TestOpenAndCloseWindowDuringShutdown
627#else
628#define MAYBE_TestOpenAndCloseWindowDuringShutdown \
629 TestOpenAndCloseWindowDuringShutdown
630#endif
[email protected]2e9d79f2013-08-16 05:45:56631IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
[email protected]8376e172013-10-03 08:42:49632 MAYBE_TestOpenAndCloseWindowDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56633 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56634 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
635 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
636 RepeatedNotificationObserver cancel_observer(
637 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
[email protected]0c95faf42013-10-28 06:27:20638 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56639
640 browsers_.push_back(CreateBrowser(browser()->profile()));
641 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
642 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
643 ASSERT_FALSE(browsers_[1]->ShouldCloseWindow());
oshima82f72482014-10-24 14:14:32644 ASSERT_NO_FATAL_FAILURE(CancelClose());
645 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56646 cancel_observer.Wait();
647 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
648 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
649 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
650
651 RepeatedNotificationObserver close_observer(
652 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20653 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56654 ASSERT_FALSE(browsers_[1]->ShouldCloseWindow());
oshima82f72482014-10-24 14:14:32655 ASSERT_NO_FATAL_FAILURE(AcceptClose());
656 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56657
658 close_observer.Wait();
659 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
660 EXPECT_TRUE(chrome::BrowserIterator().done());
661}
662
663IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
664 TestCloseWindowDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56665 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56666 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
667 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
668 browsers_.push_back(CreateBrowser(browser()->profile()));
669 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
670 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
671 RepeatedNotificationObserver cancel_observer(
672 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20673 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56674
675 ASSERT_FALSE(browsers_[0]->ShouldCloseWindow());
oshima82f72482014-10-24 14:14:32676 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56677 cancel_observer.Wait();
678 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
679 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
680 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
681
682 RepeatedNotificationObserver close_observer(
683 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20684 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56685 ASSERT_FALSE(browsers_[0]->ShouldCloseWindow());
oshima82f72482014-10-24 14:14:32686 ASSERT_NO_FATAL_FAILURE(AcceptClose());
687 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56688
689 close_observer.Wait();
690 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
691 EXPECT_TRUE(chrome::BrowserIterator().done());
692}
693
[email protected]0ed53872014-05-10 05:51:05694INSTANTIATE_TEST_CASE_P(BrowserCloseManagerBrowserTest,
695 BrowserCloseManagerBrowserTest,
696 testing::Bool());
697
698class BrowserCloseManagerWithDownloadsBrowserTest :
699 public BrowserCloseManagerBrowserTest {
700 public:
701 BrowserCloseManagerWithDownloadsBrowserTest() {}
702 virtual ~BrowserCloseManagerWithDownloadsBrowserTest() {}
703
Daniel Chenga542fca2014-10-21 09:51:29704 void SetUpOnMainThread() override {
[email protected]0ed53872014-05-10 05:51:05705 BrowserCloseManagerBrowserTest::SetUpOnMainThread();
706 ASSERT_TRUE(scoped_download_directory_.CreateUniqueTempDir());
707 }
708
benwellsf3c6fac2015-09-01 23:38:52709 // Disable new downloads UI as it is very very slow. https://crbug.com/526577
710 // TODO(dbeam): remove this once the downloads UI is not slow.
711 void SetUpCommandLine(base::CommandLine* command_line) override {
712 BrowserCloseManagerBrowserTest::SetUpCommandLine(command_line);
713 command_line->AppendSwitch(switches::kDisableMaterialDesignDownloads);
714 }
715
[email protected]0ed53872014-05-10 05:51:05716 void SetDownloadPathForProfile(Profile* profile) {
717 DownloadPrefs* download_prefs = DownloadPrefs::FromBrowserContext(profile);
718 download_prefs->SetDownloadPath(download_path());
719 }
720
721 const base::FilePath& download_path() const {
722 return scoped_download_directory_.path();
723 }
724
725 private:
726 base::ScopedTempDir scoped_download_directory_;
727};
728
jackhouae8e6e52015-05-29 06:36:46729// Mac has its own in-progress download prompt in app_controller_mac.mm, so
730// BrowserCloseManager should simply close all browsers. If there are no
731// browsers, it should not crash.
732#if defined(OS_MACOSX)
733IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
734 TestWithDownloads) {
svaldeza01f7d92015-11-18 17:47:56735 ASSERT_TRUE(embedded_test_server()->Start());
jackhouae8e6e52015-05-29 06:36:46736 SetDownloadPathForProfile(browser()->profile());
737 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
738
739 RepeatedNotificationObserver close_observer(
740 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
741
742 TestBrowserCloseManager::AttemptClose(
743 TestBrowserCloseManager::NO_USER_CHOICE);
744 close_observer.Wait();
745 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
746 EXPECT_TRUE(chrome::BrowserIterator().done());
747 EXPECT_EQ(1, DownloadService::NonMaliciousDownloadCountAllProfiles());
748
749 // Attempting to close again should not crash.
750 TestBrowserCloseManager::AttemptClose(
751 TestBrowserCloseManager::NO_USER_CHOICE);
752}
753#else // defined(OS_MACOSX)
754
[email protected]422a7d12013-10-21 12:10:42755// Test shutdown with a DANGEROUS_URL download undecided.
[email protected]0ed53872014-05-10 05:51:05756IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
[email protected]422a7d12013-10-21 12:10:42757 TestWithDangerousUrlDownload) {
svaldeza01f7d92015-11-18 17:47:56758 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]0ed53872014-05-10 05:51:05759 SetDownloadPathForProfile(browser()->profile());
[email protected]422a7d12013-10-21 12:10:42760
761 // Set up the fake delegate that forces the download to be malicious.
[email protected]861b4d0a2013-12-13 20:10:41762 scoped_ptr<TestDownloadManagerDelegate> test_delegate(
[email protected]422a7d12013-10-21 12:10:42763 new TestDownloadManagerDelegate(browser()->profile()));
dcheng383ba8a2014-10-16 23:55:19764 DownloadServiceFactory::GetForBrowserContext(browser()->profile())
765 ->SetDownloadManagerDelegateForTesting(test_delegate.Pass());
[email protected]422a7d12013-10-21 12:10:42766
767 // Run a dangerous download, but the user doesn't make a decision.
768 // This .swf normally would be categorized as DANGEROUS_FILE, but
769 // TestDownloadManagerDelegate turns it into DANGEROUS_URL.
tfarina5e7b57232015-10-17 23:37:40770 GURL download_url(net::URLRequestMockHTTPJob::GetMockUrl(
771 "downloads/dangerous/dangerous.swf"));
[email protected]422a7d12013-10-21 12:10:42772 content::DownloadTestObserverInterrupted observer(
773 content::BrowserContext::GetDownloadManager(browser()->profile()),
774 1,
775 content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT);
776 ui_test_utils::NavigateToURLWithDisposition(
777 browser(),
778 GURL(download_url),
779 NEW_BACKGROUND_TAB,
780 ui_test_utils::BROWSER_TEST_NONE);
781 observer.WaitForFinished();
782
783 // Check that the download manager has the expected state.
784 EXPECT_EQ(1, content::BrowserContext::GetDownloadManager(
785 browser()->profile())->InProgressCount());
786 EXPECT_EQ(0, content::BrowserContext::GetDownloadManager(
787 browser()->profile())->NonMaliciousInProgressCount());
788
789 // Close the browser with no user action.
790 RepeatedNotificationObserver close_observer(
791 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
792 TestBrowserCloseManager::AttemptClose(
793 TestBrowserCloseManager::NO_USER_CHOICE);
794 close_observer.Wait();
795 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
796 EXPECT_TRUE(chrome::BrowserIterator().done());
797}
798
[email protected]edfca702013-08-16 08:58:14799// Test shutdown with a download in progress.
[email protected]0ed53872014-05-10 05:51:05800IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
801 TestWithDownloads) {
svaldeza01f7d92015-11-18 17:47:56802 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]0ed53872014-05-10 05:51:05803 SetDownloadPathForProfile(browser()->profile());
[email protected]edfca702013-08-16 08:58:14804 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
805 content::TestNavigationObserver navigation_observer(
806 browser()->tab_strip_model()->GetActiveWebContents(), 1);
807 TestBrowserCloseManager::AttemptClose(
808 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE);
809 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
810 navigation_observer.Wait();
811 EXPECT_EQ(GURL(chrome::kChromeUIDownloadsURL),
812 browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
813
814 RepeatedNotificationObserver close_observer(
815 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
816
817 TestBrowserCloseManager::AttemptClose(
818 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
819 close_observer.Wait();
820 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
821 EXPECT_TRUE(chrome::BrowserIterator().done());
[email protected]5fec4702013-11-20 04:37:38822 if (browser_defaults::kBrowserAliveWithNoWindows)
823 EXPECT_EQ(1, DownloadService::NonMaliciousDownloadCountAllProfiles());
824 else
825 EXPECT_EQ(0, DownloadService::NonMaliciousDownloadCountAllProfiles());
[email protected]edfca702013-08-16 08:58:14826}
827
sammccd347712015-03-13 22:02:32828// Test shutdown with a download in progress in an off-the-record profile.
829IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
830 TestWithOffTheRecordDownloads) {
svaldeza01f7d92015-11-18 17:47:56831 ASSERT_TRUE(embedded_test_server()->Start());
sammccd347712015-03-13 22:02:32832 Profile* otr_profile = browser()->profile()->GetOffTheRecordProfile();
833 SetDownloadPathForProfile(otr_profile);
834 Browser* otr_browser = CreateBrowser(otr_profile);
835 {
836 RepeatedNotificationObserver close_observer(
837 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
838 browser()->window()->Close();
839 close_observer.Wait();
840 }
841 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(otr_browser));
842 content::TestNavigationObserver navigation_observer(
843 otr_browser->tab_strip_model()->GetActiveWebContents(), 1);
844 TestBrowserCloseManager::AttemptClose(
845 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE);
846 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
847 navigation_observer.Wait();
848 EXPECT_EQ(GURL(chrome::kChromeUIDownloadsURL),
849 otr_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
850
851 RepeatedNotificationObserver close_observer(
852 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
853
854 TestBrowserCloseManager::AttemptClose(
855 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
856 close_observer.Wait();
857 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
858 EXPECT_TRUE(chrome::BrowserIterator().done());
859 EXPECT_EQ(0, DownloadService::NonMaliciousDownloadCountAllProfiles());
860}
861
[email protected]edfca702013-08-16 08:58:14862// Test shutdown with a download in progress from one profile, where the only
863// open windows are for another profile.
[email protected]0ed53872014-05-10 05:51:05864IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
[email protected]edfca702013-08-16 08:58:14865 TestWithDownloadsFromDifferentProfiles) {
866 ProfileManager* profile_manager = g_browser_process->profile_manager();
867 base::FilePath path =
868 profile_manager->user_data_dir().AppendASCII("test_profile");
869 if (!base::PathExists(path))
[email protected]426d1c92013-12-03 20:08:54870 ASSERT_TRUE(base::CreateDirectory(path));
[email protected]edfca702013-08-16 08:58:14871 Profile* other_profile =
872 Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS);
873 profile_manager->RegisterTestingProfile(other_profile, true, false);
874 Browser* other_profile_browser = CreateBrowser(other_profile);
875
svaldeza01f7d92015-11-18 17:47:56876 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]0ed53872014-05-10 05:51:05877 SetDownloadPathForProfile(browser()->profile());
878 SetDownloadPathForProfile(other_profile);
[email protected]edfca702013-08-16 08:58:14879 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
880 {
881 RepeatedNotificationObserver close_observer(
882 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
883 browser()->window()->Close();
884 close_observer.Wait();
885 }
886
887 // When the shutdown is cancelled, the downloads page should be opened in a
888 // browser for that profile. Because there are no browsers for that profile, a
889 // new browser should be opened.
890 ui_test_utils::BrowserAddedObserver new_browser_observer;
891 TestBrowserCloseManager::AttemptClose(
892 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE);
893 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
894 Browser* opened_browser = new_browser_observer.WaitForSingleNewBrowser();
895 EXPECT_EQ(
896 GURL(chrome::kChromeUIDownloadsURL),
897 opened_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
898 EXPECT_EQ(GURL("about:blank"),
899 other_profile_browser->tab_strip_model()->GetActiveWebContents()
900 ->GetURL());
901
902 RepeatedNotificationObserver close_observer(
903 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
904 TestBrowserCloseManager::AttemptClose(
905 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
906 close_observer.Wait();
907 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
908 EXPECT_TRUE(chrome::BrowserIterator().done());
[email protected]5fec4702013-11-20 04:37:38909 if (browser_defaults::kBrowserAliveWithNoWindows)
910 EXPECT_EQ(1, DownloadService::NonMaliciousDownloadCountAllProfiles());
911 else
912 EXPECT_EQ(0, DownloadService::NonMaliciousDownloadCountAllProfiles());
[email protected]edfca702013-08-16 08:58:14913}
914
915// Test shutdown with downloads in progress and beforeunload handlers.
[email protected]4c23057a2013-11-06 18:29:52916// Disabled, see http://crbug.com/315754.
[email protected]0ed53872014-05-10 05:51:05917IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
[email protected]4c23057a2013-11-06 18:29:52918 DISABLED_TestBeforeUnloadAndDownloads) {
svaldeza01f7d92015-11-18 17:47:56919 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]0ed53872014-05-10 05:51:05920 SetDownloadPathForProfile(browser()->profile());
[email protected]edfca702013-08-16 08:58:14921 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
922 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
923 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
924
925 content::WindowedNotificationObserver cancel_observer(
926 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED,
927 content::NotificationService::AllSources());
928 TestBrowserCloseManager::AttemptClose(
929 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE);
oshima82f72482014-10-24 14:14:32930 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]edfca702013-08-16 08:58:14931 cancel_observer.Wait();
932 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
933
934 RepeatedNotificationObserver close_observer(
935 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
936 TestBrowserCloseManager::AttemptClose(
937 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
oshima82f72482014-10-24 14:14:32938 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]edfca702013-08-16 08:58:14939 close_observer.Wait();
940 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
941 EXPECT_TRUE(chrome::BrowserIterator().done());
942}
943
jackhouae8e6e52015-05-29 06:36:46944#endif // defined(OS_MACOSX)
945
[email protected]0ed53872014-05-10 05:51:05946INSTANTIATE_TEST_CASE_P(BrowserCloseManagerWithDownloadsBrowserTest,
947 BrowserCloseManagerWithDownloadsBrowserTest,
[email protected]2e9d79f2013-08-16 05:45:56948 testing::Bool());
[email protected]0c95faf42013-10-28 06:27:20949
950class BrowserCloseManagerWithBackgroundModeBrowserTest
951 : public BrowserCloseManagerBrowserTest {
952 public:
953 BrowserCloseManagerWithBackgroundModeBrowserTest() {}
954
Daniel Chenga542fca2014-10-21 09:51:29955 void SetUpOnMainThread() override {
[email protected]0c95faf42013-10-28 06:27:20956 BrowserCloseManagerBrowserTest::SetUpOnMainThread();
957 g_browser_process->set_background_mode_manager_for_test(
958 scoped_ptr<BackgroundModeManager>(new FakeBackgroundModeManager));
959 }
960
961 bool IsBackgroundModeSuspended() {
962 return static_cast<FakeBackgroundModeManager*>(
963 g_browser_process->background_mode_manager())
964 ->IsBackgroundModeSuspended();
965 }
966
967 private:
968 DISALLOW_COPY_AND_ASSIGN(BrowserCloseManagerWithBackgroundModeBrowserTest);
969};
970
971// Check that background mode is suspended when closing all browsers unless we
972// are quitting and that background mode is resumed when a new browser window is
973// opened.
974IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithBackgroundModeBrowserTest,
975 CloseAllBrowsersWithBackgroundMode) {
976 EXPECT_FALSE(IsBackgroundModeSuspended());
977 Profile* profile = browser()->profile();
978 {
979 RepeatedNotificationObserver close_observer(
980 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
[email protected]9a718b22014-02-25 15:17:27981 chrome::IncrementKeepAliveCount();
[email protected]0c95faf42013-10-28 06:27:20982 chrome::CloseAllBrowsers();
983 close_observer.Wait();
984 }
985 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
986 EXPECT_TRUE(chrome::BrowserIterator().done());
987 EXPECT_TRUE(IsBackgroundModeSuspended());
988
989 // Background mode should be resumed when a new browser window is opened.
990 ui_test_utils::BrowserAddedObserver new_browser_observer;
991 chrome::NewEmptyWindow(profile, chrome::HOST_DESKTOP_TYPE_NATIVE);
992 new_browser_observer.WaitForSingleNewBrowser();
[email protected]9a718b22014-02-25 15:17:27993 chrome::DecrementKeepAliveCount();
[email protected]0c95faf42013-10-28 06:27:20994 EXPECT_FALSE(IsBackgroundModeSuspended());
995 RepeatedNotificationObserver close_observer(
996 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
997
998 // Background mode should not be suspended when quitting.
999 chrome::CloseAllBrowsersAndQuit();
1000 close_observer.Wait();
1001 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
1002 EXPECT_TRUE(chrome::BrowserIterator().done());
1003 EXPECT_FALSE(IsBackgroundModeSuspended());
1004
1005}
1006
1007// Check that closing the last browser window individually does not affect
1008// background mode.
1009IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithBackgroundModeBrowserTest,
1010 CloseSingleBrowserWithBackgroundMode) {
1011 RepeatedNotificationObserver close_observer(
1012 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1013 EXPECT_FALSE(IsBackgroundModeSuspended());
1014 browser()->window()->Close();
1015 close_observer.Wait();
1016 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
1017 EXPECT_TRUE(chrome::BrowserIterator().done());
1018 EXPECT_FALSE(IsBackgroundModeSuspended());
1019}
1020
1021// Check that closing all browsers with no browser windows open suspends
1022// background mode but does not cause Chrome to quit.
1023IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithBackgroundModeBrowserTest,
1024 CloseAllBrowsersWithNoOpenBrowsersWithBackgroundMode) {
1025 RepeatedNotificationObserver close_observer(
1026 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1027 EXPECT_FALSE(IsBackgroundModeSuspended());
[email protected]9a718b22014-02-25 15:17:271028 chrome::IncrementKeepAliveCount();
[email protected]0c95faf42013-10-28 06:27:201029 browser()->window()->Close();
1030 close_observer.Wait();
1031 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
1032 EXPECT_TRUE(chrome::BrowserIterator().done());
1033 EXPECT_FALSE(IsBackgroundModeSuspended());
1034
1035 chrome::CloseAllBrowsers();
1036 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
1037 EXPECT_TRUE(chrome::BrowserIterator().done());
1038 EXPECT_TRUE(IsBackgroundModeSuspended());
1039}
1040
1041INSTANTIATE_TEST_CASE_P(BrowserCloseManagerWithBackgroundModeBrowserTest,
1042 BrowserCloseManagerWithBackgroundModeBrowserTest,
1043 testing::Bool());