blob: 23b74551be7fed8202532883c6f15047b6a6e978 [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
dchenge73d8520c2015-12-27 01:19:095#include "chrome/browser/lifetime/browser_close_manager.h"
6
7#include <utility>
[email protected]2e9d79f2013-08-16 05:45:568#include <vector>
9
10#include "base/command_line.h"
[email protected]0ed53872014-05-10 05:51:0511#include "base/files/scoped_temp_dir.h"
avi6846aef2015-12-26 01:09:3812#include "base/macros.h"
Gabriel Charette078e3662017-08-28 22:59:0413#include "base/run_loop.h"
jam3f2d3932017-04-26 20:28:5114#include "base/threading/thread_restrictions.h"
avi6846aef2015-12-26 01:09:3815#include "build/build_config.h"
[email protected]0c95faf42013-10-28 06:27:2016#include "chrome/browser/background/background_mode_manager.h"
[email protected]edfca702013-08-16 08:58:1417#include "chrome/browser/browser_process.h"
[email protected]2e9d79f2013-08-16 05:45:5618#include "chrome/browser/browser_shutdown.h"
19#include "chrome/browser/chrome_notification_types.h"
[email protected]5fec4702013-11-20 04:37:3820#include "chrome/browser/defaults.h"
[email protected]422a7d12013-10-21 12:10:4221#include "chrome/browser/download/chrome_download_manager_delegate.h"
peterccb33e82017-05-02 19:00:4422#include "chrome/browser/download/download_core_service.h"
23#include "chrome/browser/download/download_core_service_factory.h"
[email protected]0ed53872014-05-10 05:51:0524#include "chrome/browser/download/download_prefs.h"
[email protected]2e9d79f2013-08-16 05:45:5625#include "chrome/browser/lifetime/application_lifetime.h"
[email protected]edfca702013-08-16 08:58:1426#include "chrome/browser/net/url_request_mock_util.h"
[email protected]2e9d79f2013-08-16 05:45:5627#include "chrome/browser/prefs/session_startup_pref.h"
[email protected]edfca702013-08-16 08:58:1428#include "chrome/browser/profiles/profile.h"
29#include "chrome/browser/profiles/profile_manager.h"
mkolom65a0b3c2017-03-02 06:11:4030#include "chrome/browser/sessions/tab_restore_service_factory.h"
[email protected]2e9d79f2013-08-16 05:45:5631#include "chrome/browser/ui/browser.h"
[email protected]0c95faf42013-10-28 06:27:2032#include "chrome/browser/ui/browser_commands.h"
scottmg8abbff832016-01-28 22:57:3733#include "chrome/browser/ui/browser_list.h"
[email protected]edfca702013-08-16 08:58:1434#include "chrome/browser/ui/browser_window.h"
[email protected]2e9d79f2013-08-16 05:45:5635#include "chrome/browser/ui/tabs/tab_strip_model.h"
36#include "chrome/common/chrome_switches.h"
37#include "chrome/common/url_constants.h"
38#include "chrome/test/base/in_process_browser_test.h"
39#include "chrome/test/base/ui_test_utils.h"
oshimaf65398422014-11-18 23:30:4240#include "components/app_modal/javascript_app_modal_dialog.h"
41#include "components/app_modal/native_app_modal_dialog.h"
Michael Giuffrida2dbce0d12017-09-02 03:30:5942#include "components/keep_alive_registry/keep_alive_types.h"
43#include "components/keep_alive_registry/scoped_keep_alive.h"
mkolom65a0b3c2017-03-02 06:11:4044#include "components/sessions/core/tab_restore_service.h"
45#include "components/sessions/core/tab_restore_service_observer.h"
[email protected]edfca702013-08-16 08:58:1446#include "content/public/browser/browser_context.h"
47#include "content/public/browser/download_item.h"
48#include "content/public/browser/download_manager.h"
[email protected]2e9d79f2013-08-16 05:45:5649#include "content/public/browser/notification_service.h"
avi64b8b65b2017-03-29 18:50:3450#include "content/public/browser/render_frame_host.h"
metaflow812bb8542016-05-24 21:10:4651#include "content/public/browser/render_view_host.h"
52#include "content/public/browser/render_widget_host.h"
[email protected]2e9d79f2013-08-16 05:45:5653#include "content/public/browser/web_contents.h"
mkolom65a0b3c2017-03-02 06:11:4054#include "content/public/test/browser_test_utils.h"
[email protected]edfca702013-08-16 08:58:1455#include "content/public/test/download_test_observer.h"
[email protected]2e9d79f2013-08-16 05:45:5656#include "content/public/test/test_navigation_observer.h"
57#include "net/test/embedded_test_server/embedded_test_server.h"
xunjieli0332c192014-09-10 23:23:3158#include "net/test/url_request/url_request_mock_http_job.h"
jam8e45cd72015-01-20 16:33:4459#include "net/test/url_request/url_request_slow_download_job.h"
[email protected]2e9d79f2013-08-16 05:45:5660
[email protected]f9357a442014-05-15 18:44:0761#if defined(OS_CHROMEOS)
62#include "chromeos/chromeos_switches.h"
63#endif
64
[email protected]2e9d79f2013-08-16 05:45:5665namespace {
66
oshima0929be2a2014-11-19 22:21:0367app_modal::NativeAppModalDialog* GetNextDialog() {
avi373e72a2017-05-26 20:33:5268 app_modal::JavaScriptAppModalDialog* dialog =
69 ui_test_utils::WaitForAppModalDialog();
70 CHECK(dialog->native_dialog());
71 return dialog->native_dialog();
oshima82f72482014-10-24 14:14:3272}
[email protected]2e9d79f2013-08-16 05:45:5673
avi336125f72017-05-06 22:25:4074// Note: call |PrepareForDialog| on the relevant WebContents or Browser before
metaflow812bb8542016-05-24 21:10:4675// trying to close it, to avoid flakiness. https://crbug.com/519646
oshima82f72482014-10-24 14:14:3276void AcceptClose() {
77 GetNextDialog()->AcceptAppModalDialog();
78}
[email protected]2e9d79f2013-08-16 05:45:5679
avi336125f72017-05-06 22:25:4080// Note: call |PrepareForDialog| on the relevant WebContents or Browser before
metaflow812bb8542016-05-24 21:10:4681// trying to close it, to avoid flakiness. https://crbug.com/519646
oshima82f72482014-10-24 14:14:3282void CancelClose() {
83 GetNextDialog()->CancelAppModalDialog();
84}
[email protected]2e9d79f2013-08-16 05:45:5685
Scott Violet1f106b582017-07-12 15:49:5886class RepeatedNotificationObserver : public content::NotificationObserver {
87 public:
88 explicit RepeatedNotificationObserver(int type, int count)
89 : num_outstanding_(count), running_(false) {
90 registrar_.Add(this, type, content::NotificationService::AllSources());
91 }
92
93 void Observe(int type,
94 const content::NotificationSource& source,
95 const content::NotificationDetails& details) override {
96 ASSERT_GT(num_outstanding_, 0);
97 if (!--num_outstanding_ && running_) {
98 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
99 run_loop_.QuitClosure());
100 }
101 }
102
103 void Wait() {
104 if (num_outstanding_ <= 0)
105 return;
106
107 running_ = true;
108 run_loop_.Run();
109 running_ = false;
110 }
111
112 private:
113 int num_outstanding_;
114 content::NotificationRegistrar registrar_;
115 bool running_;
116 base::RunLoop run_loop_;
117
118 DISALLOW_COPY_AND_ASSIGN(RepeatedNotificationObserver);
119};
120
mkolom65a0b3c2017-03-02 06:11:40121class TabRestoreServiceChangesObserver
122 : public sessions::TabRestoreServiceObserver {
123 public:
124 explicit TabRestoreServiceChangesObserver(Profile* profile)
125 : service_(TabRestoreServiceFactory::GetForProfile(profile)) {
126 if (service_)
127 service_->AddObserver(this);
128 }
129
130 ~TabRestoreServiceChangesObserver() override {
131 if (service_)
132 service_->RemoveObserver(this);
133 }
134
135 size_t changes_count() const { return changes_count_; }
136
137 private:
138 // sessions::TabRestoreServiceObserver:
139 void TabRestoreServiceChanged(sessions::TabRestoreService*) override {
140 changes_count_++;
141 }
142
143 // sessions::TabRestoreServiceObserver:
144 void TabRestoreServiceDestroyed(sessions::TabRestoreService*) override {
145 service_ = nullptr;
146 }
147
148 sessions::TabRestoreService* service_ = nullptr;
149 size_t changes_count_ = 0;
150
151 DISALLOW_COPY_AND_ASSIGN(TabRestoreServiceChangesObserver);
152};
153
[email protected]edfca702013-08-16 08:58:14154class TestBrowserCloseManager : public BrowserCloseManager {
155 public:
156 enum UserChoice {
157 USER_CHOICE_USER_CANCELS_CLOSE,
158 USER_CHOICE_USER_ALLOWS_CLOSE,
[email protected]422a7d12013-10-21 12:10:42159 NO_USER_CHOICE
[email protected]edfca702013-08-16 08:58:14160 };
161
162 static void AttemptClose(UserChoice user_choice) {
163 scoped_refptr<BrowserCloseManager> browser_close_manager =
164 new TestBrowserCloseManager(user_choice);
[email protected]0c95faf42013-10-28 06:27:20165 browser_shutdown::SetTryingToQuit(true);
[email protected]edfca702013-08-16 08:58:14166 browser_close_manager->StartClosingBrowsers();
167 }
168
169 protected:
Daniel Chenga542fca2014-10-21 09:51:29170 ~TestBrowserCloseManager() override {}
[email protected]edfca702013-08-16 08:58:14171
Daniel Chenga542fca2014-10-21 09:51:29172 void ConfirmCloseWithPendingDownloads(
[email protected]edfca702013-08-16 08:58:14173 int download_count,
mostynb2b52d1db2014-10-07 02:47:17174 const base::Callback<void(bool)>& callback) override {
[email protected]422a7d12013-10-21 12:10:42175 EXPECT_NE(NO_USER_CHOICE, user_choice_);
[email protected]edfca702013-08-16 08:58:14176 switch (user_choice_) {
[email protected]422a7d12013-10-21 12:10:42177 case NO_USER_CHOICE:
[email protected]edfca702013-08-16 08:58:14178 case USER_CHOICE_USER_CANCELS_CLOSE: {
179 callback.Run(false);
180 break;
181 }
182 case USER_CHOICE_USER_ALLOWS_CLOSE: {
183 callback.Run(true);
184 break;
185 }
186 }
187 }
188
189 private:
190 explicit TestBrowserCloseManager(UserChoice user_choice)
191 : user_choice_(user_choice) {}
192
193 UserChoice user_choice_;
194
195 DISALLOW_COPY_AND_ASSIGN(TestBrowserCloseManager);
196};
197
[email protected]422a7d12013-10-21 12:10:42198class TestDownloadManagerDelegate : public ChromeDownloadManagerDelegate {
199 public:
200 explicit TestDownloadManagerDelegate(Profile* profile)
201 : ChromeDownloadManagerDelegate(profile) {
[email protected]861b4d0a2013-12-13 20:10:41202 GetDownloadIdReceiverCallback().Run(content::DownloadItem::kInvalidId + 1);
[email protected]422a7d12013-10-21 12:10:42203 }
Daniel Chenga542fca2014-10-21 09:51:29204 ~TestDownloadManagerDelegate() override {}
[email protected]422a7d12013-10-21 12:10:42205
Daniel Chenga542fca2014-10-21 09:51:29206 bool DetermineDownloadTarget(
[email protected]422a7d12013-10-21 12:10:42207 content::DownloadItem* item,
mostynb2b52d1db2014-10-07 02:47:17208 const content::DownloadTargetCallback& callback) override {
[email protected]422a7d12013-10-21 12:10:42209 content::DownloadTargetCallback dangerous_callback =
[email protected]861b4d0a2013-12-13 20:10:41210 base::Bind(&TestDownloadManagerDelegate::SetDangerous, callback);
[email protected]422a7d12013-10-21 12:10:42211 return ChromeDownloadManagerDelegate::DetermineDownloadTarget(
212 item, dangerous_callback);
213 }
214
Asanka Herath1ba0e9f2017-04-03 18:48:53215 static void SetDangerous(const content::DownloadTargetCallback& callback,
216 const base::FilePath& target_path,
217 content::DownloadItem::TargetDisposition disp,
218 content::DownloadDangerType danger_type,
219 const base::FilePath& intermediate_path,
220 content::DownloadInterruptReason reason) {
221 callback.Run(target_path, disp, content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL,
222 intermediate_path, reason);
[email protected]422a7d12013-10-21 12:10:42223 }
[email protected]422a7d12013-10-21 12:10:42224};
225
[email protected]0c95faf42013-10-28 06:27:20226class FakeBackgroundModeManager : public BackgroundModeManager {
227 public:
228 FakeBackgroundModeManager()
lwchkg9c183942016-03-13 06:29:54229 : BackgroundModeManager(*base::CommandLine::ForCurrentProcess(),
230 &g_browser_process->profile_manager()
231 ->GetProfileAttributesStorage()),
[email protected]0c95faf42013-10-28 06:27:20232 suspended_(false) {}
233
Daniel Chenga542fca2014-10-21 09:51:29234 void SuspendBackgroundMode() override {
[email protected]0c95faf42013-10-28 06:27:20235 BackgroundModeManager::SuspendBackgroundMode();
236 suspended_ = true;
237 }
238
Daniel Chenga542fca2014-10-21 09:51:29239 void ResumeBackgroundMode() override {
[email protected]0c95faf42013-10-28 06:27:20240 BackgroundModeManager::ResumeBackgroundMode();
241 suspended_ = false;
242 }
243
244 bool IsBackgroundModeSuspended() {
245 return suspended_;
246 }
247
248 private:
249 bool suspended_;
250
251 DISALLOW_COPY_AND_ASSIGN(FakeBackgroundModeManager);
252};
253
[email protected]2e9d79f2013-08-16 05:45:56254} // namespace
255
256class BrowserCloseManagerBrowserTest
257 : public InProcessBrowserTest,
258 public testing::WithParamInterface<bool> {
259 protected:
Daniel Chenga542fca2014-10-21 09:51:29260 void SetUpOnMainThread() override {
[email protected]2e9d79f2013-08-16 05:45:56261 SessionStartupPref::SetStartupPref(
262 browser()->profile(), SessionStartupPref(SessionStartupPref::LAST));
263 browsers_.push_back(browser());
[email protected]edfca702013-08-16 08:58:14264 content::BrowserThread::PostTask(
tzik3f7781d2017-04-20 17:09:33265 content::BrowserThread::IO, FROM_HERE,
266 base::BindOnce(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
[email protected]2e9d79f2013-08-16 05:45:56267 }
268
avi556c05022014-12-22 23:31:43269 void SetUpCommandLine(base::CommandLine* command_line) override {
[email protected]2e9d79f2013-08-16 05:45:56270 if (GetParam())
271 command_line->AppendSwitch(switches::kEnableFastUnload);
[email protected]f9357a442014-05-15 18:44:07272#if defined(OS_CHROMEOS)
273 command_line->AppendSwitch(
274 chromeos::switches::kIgnoreUserProfileMappingForTests);
275#endif
[email protected]2e9d79f2013-08-16 05:45:56276 }
277
[email protected]edfca702013-08-16 08:58:14278 void CreateStalledDownload(Browser* browser) {
279 content::DownloadTestObserverInProgress observer(
280 content::BrowserContext::GetDownloadManager(browser->profile()), 1);
281 ui_test_utils::NavigateToURLWithDisposition(
nick3b04f322016-08-31 19:29:19282 browser, GURL(net::URLRequestSlowDownloadJob::kKnownSizeUrl),
283 WindowOpenDisposition::NEW_BACKGROUND_TAB,
[email protected]edfca702013-08-16 08:58:14284 ui_test_utils::BROWSER_TEST_NONE);
285 observer.WaitForFinished();
286 EXPECT_EQ(
287 1UL,
288 observer.NumDownloadsSeenInState(content::DownloadItem::IN_PROGRESS));
289 }
290
avi336125f72017-05-06 22:25:40291 void PrepareForDialog(content::WebContents* web_contents) {
292 content::PrepContentsForBeforeUnloadTest(web_contents);
metaflow812bb8542016-05-24 21:10:46293 }
294
avi336125f72017-05-06 22:25:40295 void PrepareForDialog(Browser* browser) {
metaflow812bb8542016-05-24 21:10:46296 for (int i = 0; i < browser->tab_strip_model()->count(); i++)
avi336125f72017-05-06 22:25:40297 PrepareForDialog(browser->tab_strip_model()->GetWebContentsAt(i));
metaflow812bb8542016-05-24 21:10:46298 }
299
[email protected]2e9d79f2013-08-16 05:45:56300 std::vector<Browser*> browsers_;
[email protected]2e9d79f2013-08-16 05:45:56301};
302
303IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestSingleTabShutdown) {
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")));
avi336125f72017-05-06 22:25:40307 PrepareForDialog(browser());
metaflow812bb8542016-05-24 21:10:46308
Scott Violet1f106b582017-07-12 15:49:58309 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56310 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20311 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32312 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56313 cancel_observer.Wait();
314 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
315 EXPECT_EQ(1, browser()->tab_strip_model()->count());
316
Scott Violet1f106b582017-07-12 15:49:58317 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56318 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
[email protected]0c95faf42013-10-28 06:27:20319 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32320 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56321 close_observer.Wait();
322 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37323 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56324}
325
326IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
327 TestShutdownMoreThanOnce) {
svaldeza01f7d92015-11-18 17:47:56328 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56329 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
330 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40331 PrepareForDialog(browser());
metaflow812bb8542016-05-24 21:10:46332
Scott Violet1f106b582017-07-12 15:49:58333 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56334 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20335 chrome::CloseAllBrowsersAndQuit();
336 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32337 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56338 cancel_observer.Wait();
339 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
340 EXPECT_EQ(1, browser()->tab_strip_model()->count());
341
Scott Violet1f106b582017-07-12 15:49:58342 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56343 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
[email protected]0c95faf42013-10-28 06:27:20344 chrome::CloseAllBrowsersAndQuit();
345 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32346 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56347 close_observer.Wait();
348 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37349 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56350}
351
wafflesb63234052015-08-07 02:44:02352IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
metaflow812bb8542016-05-24 21:10:46353 PRE_TestSessionRestore) {
svaldeza01f7d92015-11-18 17:47:56354 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56355 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
356 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
357 AddBlankTabAndShow(browser());
358 ASSERT_NO_FATAL_FAILURE(
359 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL)));
avi336125f72017-05-06 22:25:40360 PrepareForDialog(browser());
metaflow812bb8542016-05-24 21:10:46361
Scott Violet1f106b582017-07-12 15:49:58362 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56363 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20364 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32365 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56366 cancel_observer.Wait();
367 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
368
369 browser()->tab_strip_model()
370 ->CloseWebContentsAt(1, TabStripModel::CLOSE_USER_GESTURE);
371 content::TestNavigationObserver navigation_observer(
372 browser()->tab_strip_model()->GetActiveWebContents(), 1);
nick3b04f322016-08-31 19:29:19373 ASSERT_NO_FATAL_FAILURE(NavigateToURLWithDisposition(
374 browser(), GURL(chrome::kChromeUIVersionURL),
375 WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE));
oshima82f72482014-10-24 14:14:32376 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56377 navigation_observer.Wait();
378
Scott Violet1f106b582017-07-12 15:49:58379 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56380 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
[email protected]0c95faf42013-10-28 06:27:20381 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56382 close_observer.Wait();
383 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37384 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56385}
386
387// Test that the tab closed after the aborted shutdown attempt is not re-opened
388// when restoring the session.
benwells70cc93222017-06-29 05:42:36389// Flaky on Windows trybots, see https://crbug.com/737860.
390#if defined(OS_WIN)
391#define MAYBE_TestSessionRestore DISABLED_TestSessionRestore
392#else
393#define MAYBE_TestSessionRestore TestSessionRestore
394#endif
wafflesb63234052015-08-07 02:44:02395IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
benwells70cc93222017-06-29 05:42:36396 MAYBE_TestSessionRestore) {
[email protected]2e9d79f2013-08-16 05:45:56397 // The testing framework launches Chrome with about:blank as args.
398 EXPECT_EQ(2, browser()->tab_strip_model()->count());
399 EXPECT_EQ(GURL(chrome::kChromeUIVersionURL),
400 browser()->tab_strip_model()->GetWebContentsAt(0)->GetURL());
401 EXPECT_EQ(GURL("about:blank"),
402 browser()->tab_strip_model()->GetWebContentsAt(1)->GetURL());
403}
404
405// Test that browser windows are only closed if all browsers are ready to close
406// and that all beforeunload dialogs are shown again after a cancel.
[email protected]40cd13a2013-10-24 13:42:01407IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestMultipleWindows) {
svaldeza01f7d92015-11-18 17:47:56408 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56409 browsers_.push_back(CreateBrowser(browser()->profile()));
410 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
411 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
412 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
413 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40414 PrepareForDialog(browsers_[0]);
415 PrepareForDialog(browsers_[1]);
[email protected]2e9d79f2013-08-16 05:45:56416
417 // Cancel shutdown on the first beforeunload event.
418 {
Scott Violet1f106b582017-07-12 15:49:58419 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56420 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20421 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32422 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56423 cancel_observer.Wait();
424 }
425 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
426 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
427 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
428
429 // Cancel shutdown on the second beforeunload event.
430 {
Scott Violet1f106b582017-07-12 15:49:58431 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56432 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
[email protected]0c95faf42013-10-28 06:27:20433 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32434 ASSERT_NO_FATAL_FAILURE(AcceptClose());
435 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56436 cancel_observer.Wait();
437 }
438 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
439 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
440 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
441
442 // Allow shutdown for both beforeunload events.
Scott Violet1f106b582017-07-12 15:49:58443 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56444 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20445 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32446 ASSERT_NO_FATAL_FAILURE(AcceptClose());
447 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56448 close_observer.Wait();
449 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37450 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56451}
452
453// Test that tabs in the same window with a beforeunload event that hangs are
454// treated the same as the user accepting the close, but do not close the tab
455// early.
456IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
metaflow812bb8542016-05-24 21:10:46457 TestHangInBeforeUnloadMultipleTabs) {
svaldeza01f7d92015-11-18 17:47:56458 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56459 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
460 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
461 AddBlankTabAndShow(browsers_[0]);
462 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
463 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
464 AddBlankTabAndShow(browsers_[0]);
465 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
466 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
metaflow812bb8542016-05-24 21:10:46467 // Disable the hang monitor in the tab that is not expected to hang, so that
468 // the dialog is guaranteed to show.
avi336125f72017-05-06 22:25:40469 PrepareForDialog(browsers_[0]->tab_strip_model()->GetWebContentsAt(1));
[email protected]2e9d79f2013-08-16 05:45:56470
Scott Violet1f106b582017-07-12 15:49:58471 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56472 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20473 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32474 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56475 cancel_observer.Wait();
476 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
477 // All tabs should still be open.
478 EXPECT_EQ(3, browsers_[0]->tab_strip_model()->count());
479
Scott Violet1f106b582017-07-12 15:49:58480 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56481 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
[email protected]0c95faf42013-10-28 06:27:20482 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32483 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56484 close_observer.Wait();
485 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37486 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56487}
488
489// Test that tabs in different windows with a beforeunload event that hangs are
490// treated the same as the user accepting the close, but do not close the tab
491// early.
492IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
493 TestHangInBeforeUnloadMultipleWindows) {
svaldeza01f7d92015-11-18 17:47:56494 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56495 browsers_.push_back(CreateBrowser(browser()->profile()));
496 browsers_.push_back(CreateBrowser(browser()->profile()));
497 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
498 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
499 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
500 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
501 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
502 browsers_[2], embedded_test_server()->GetURL("/beforeunload_hang.html")));
metaflow812bb8542016-05-24 21:10:46503 // Disable the hang monitor in the tab that is not expected to hang, so that
504 // the dialog is guaranteed to show.
avi336125f72017-05-06 22:25:40505 PrepareForDialog(browsers_[1]);
[email protected]2e9d79f2013-08-16 05:45:56506
Scott Violet1f106b582017-07-12 15:49:58507 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56508 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
[email protected]0c95faf42013-10-28 06:27:20509 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32510 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56511 cancel_observer.Wait();
512 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
513 // All windows should still be open.
514 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
515 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
516 EXPECT_EQ(1, browsers_[2]->tab_strip_model()->count());
517
Scott Violet1f106b582017-07-12 15:49:58518 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56519 chrome::NOTIFICATION_BROWSER_CLOSED, 3);
[email protected]0c95faf42013-10-28 06:27:20520 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32521 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56522 close_observer.Wait();
523 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37524 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56525}
526
metaflow73fc9552016-05-23 18:26:48527// Test that tabs that are slow to respond are not closed prematurely.
528// Regression for crbug.com/365052 caused some of tabs to be closed even if
529// user chose to cancel browser close.
metaflow73fc9552016-05-23 18:26:48530IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
metaflow812bb8542016-05-24 21:10:46531 TestUnloadMultipleSlowTabs) {
metaflow73fc9552016-05-23 18:26:48532 ASSERT_TRUE(embedded_test_server()->Start());
533 const int kTabCount = 5;
534 const int kResposiveTabIndex = 2;
535 // Create tab strip with all tabs except one responding after
536 // RenderViewHostImpl::kUnloadTimeoutMS.
537 // Minimum configuration is two slow tabs and then responsive tab.
538 // But we also want to check how slow tabs behave in tail.
539 for (int i = 0; i < kTabCount; i++) {
540 if (i)
541 AddBlankTabAndShow(browsers_[0]);
542 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
543 browsers_[0],
544 embedded_test_server()->GetURL((i == kResposiveTabIndex)
545 ? "/beforeunload.html"
546 : "/beforeunload_slow.html")));
547 }
metaflow812bb8542016-05-24 21:10:46548 // Disable the hang monitor in the tab that is not expected to hang, so that
549 // the dialog is guaranteed to show.
avi336125f72017-05-06 22:25:40550 PrepareForDialog(
metaflow812bb8542016-05-24 21:10:46551 browsers_[0]->tab_strip_model()->GetWebContentsAt(kResposiveTabIndex));
552
Scott Violet1f106b582017-07-12 15:49:58553 RepeatedNotificationObserver cancel_observer(
metaflow73fc9552016-05-23 18:26:48554 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
555 chrome::CloseAllBrowsersAndQuit();
556 ASSERT_NO_FATAL_FAILURE(CancelClose());
557 cancel_observer.Wait();
558 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
559
560 // All tabs should still be open.
561 EXPECT_EQ(kTabCount, browsers_[0]->tab_strip_model()->count());
Scott Violet1f106b582017-07-12 15:49:58562 RepeatedNotificationObserver close_observer(
metaflow73fc9552016-05-23 18:26:48563 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
564
565 // Quit, this time accepting close confirmation dialog.
566 chrome::CloseAllBrowsersAndQuit();
567 ASSERT_NO_FATAL_FAILURE(AcceptClose());
568 close_observer.Wait();
569 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
570 EXPECT_TRUE(BrowserList::GetInstance()->empty());
571}
572
573// Test that tabs in different windows with a slow beforeunload event response
574// are treated the same as the user accepting the close, but do not close the
575// tab early.
576// Regression for crbug.com/365052 caused CHECK in tabstrip.
metaflow73fc9552016-05-23 18:26:48577IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
metaflow812bb8542016-05-24 21:10:46578 TestBeforeUnloadMultipleSlowWindows) {
metaflow73fc9552016-05-23 18:26:48579 ASSERT_TRUE(embedded_test_server()->Start());
580 const int kBrowserCount = 5;
581 const int kResposiveBrowserIndex = 2;
582 // Create multiple browsers with all tabs except one responding after
583 // RenderViewHostImpl::kUnloadTimeoutMS .
584 // Minimum configuration is just one browser with slow tab and then
585 // browser with responsive tab.
586 // But we also want to check how slow tabs behave in tail and make test
587 // more robust.
588 for (int i = 0; i < kBrowserCount; i++) {
589 if (i)
590 browsers_.push_back(CreateBrowser(browser()->profile()));
591 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
592 browsers_[i],
593 embedded_test_server()->GetURL((i == kResposiveBrowserIndex)
594 ? "/beforeunload.html"
595 : "/beforeunload_slow.html")));
596 }
metaflow812bb8542016-05-24 21:10:46597 // Disable the hang monitor in the tab that is not expected to hang, so that
598 // the dialog is guaranteed to show.
avi336125f72017-05-06 22:25:40599 PrepareForDialog(browsers_[kResposiveBrowserIndex]);
metaflow73fc9552016-05-23 18:26:48600
Scott Violet1f106b582017-07-12 15:49:58601 RepeatedNotificationObserver cancel_observer(
metaflow73fc9552016-05-23 18:26:48602 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, kResposiveBrowserIndex + 1);
603 chrome::CloseAllBrowsersAndQuit();
604 ASSERT_NO_FATAL_FAILURE(CancelClose());
605 cancel_observer.Wait();
606 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
607
608 // All windows should still be open.
609 for (int i = 0; i < kBrowserCount; i++)
610 EXPECT_EQ(1, browsers_[i]->tab_strip_model()->count());
611
612 // Quit, this time accepting close confirmation dialog.
Scott Violet1f106b582017-07-12 15:49:58613 RepeatedNotificationObserver close_observer(
metaflow73fc9552016-05-23 18:26:48614 chrome::NOTIFICATION_BROWSER_CLOSED, kBrowserCount);
615 chrome::CloseAllBrowsersAndQuit();
616 ASSERT_NO_FATAL_FAILURE(AcceptClose());
617 close_observer.Wait();
618 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
619 EXPECT_TRUE(BrowserList::GetInstance()->empty());
620}
621
Jan Krcal9a23f222017-08-01 14:13:07622// Flaky on Windows 7 (dbg) trybot, see https://crbug.com/751081.
623#if defined(OS_WIN) && !defined(NDEBUG)
624#define MAYBE_TestAddWindowDuringShutdown DISABLED_TestAddWindowDuringShutdown
625#else
626#define MAYBE_TestAddWindowDuringShutdown TestAddWindowDuringShutdown
627#endif
628
[email protected]2e9d79f2013-08-16 05:45:56629// Test that a window created during shutdown is closed.
630IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
Jan Krcal9a23f222017-08-01 14:13:07631 MAYBE_TestAddWindowDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56632 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56633 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
634 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40635 PrepareForDialog(browsers_[0]);
[email protected]2e9d79f2013-08-16 05:45:56636
Scott Violet1f106b582017-07-12 15:49:58637 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56638 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20639 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56640 browsers_.push_back(CreateBrowser(browser()->profile()));
oshima82f72482014-10-24 14:14:32641 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56642 close_observer.Wait();
643 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37644 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56645}
646
647// Test that a window created during shutdown with a beforeunload handler can
648// cancel the shutdown.
649IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
[email protected]40cd13a2013-10-24 13:42:01650 TestAddWindowWithBeforeUnloadDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56651 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56652 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
653 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40654 PrepareForDialog(browsers_[0]);
[email protected]2e9d79f2013-08-16 05:45:56655
Scott Violet1f106b582017-07-12 15:49:58656 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56657 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
[email protected]0c95faf42013-10-28 06:27:20658 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56659 browsers_.push_back(CreateBrowser(browser()->profile()));
660 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
661 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40662 PrepareForDialog(browsers_[1]);
oshima82f72482014-10-24 14:14:32663 ASSERT_NO_FATAL_FAILURE(AcceptClose());
664 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56665 cancel_observer.Wait();
666 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
667 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
668 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
669
670 // Allow shutdown for both beforeunload dialogs.
Scott Violet1f106b582017-07-12 15:49:58671 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56672 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20673 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32674 ASSERT_NO_FATAL_FAILURE(AcceptClose());
675 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56676 close_observer.Wait();
677 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37678 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56679}
680
681// Test that tabs added during shutdown are closed.
682IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
metaflow812bb8542016-05-24 21:10:46683 TestAddTabDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56684 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56685 browsers_.push_back(CreateBrowser(browser()->profile()));
686 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
687 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
688 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
689 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40690 PrepareForDialog(browsers_[0]);
691 PrepareForDialog(browsers_[1]);
[email protected]2e9d79f2013-08-16 05:45:56692
Scott Violet1f106b582017-07-12 15:49:58693 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56694 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20695 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32696 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56697 AddBlankTabAndShow(browsers_[0]);
698 AddBlankTabAndShow(browsers_[1]);
oshima82f72482014-10-24 14:14:32699 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56700 close_observer.Wait();
701 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37702 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56703}
704
705// Test that tabs created during shutdown with beforeunload handlers can cancel
706// the shutdown.
metaflow812bb8542016-05-24 21:10:46707
[email protected]2e9d79f2013-08-16 05:45:56708IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
metaflow812bb8542016-05-24 21:10:46709 TestAddTabWithBeforeUnloadDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56710 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56711 browsers_.push_back(CreateBrowser(browser()->profile()));
712 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
713 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
714 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
715 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40716 PrepareForDialog(browsers_[0]);
717 PrepareForDialog(browsers_[1]);
metaflow812bb8542016-05-24 21:10:46718
Scott Violet1f106b582017-07-12 15:49:58719 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56720 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
[email protected]0c95faf42013-10-28 06:27:20721 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32722 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56723 AddBlankTabAndShow(browsers_[0]);
724 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
725 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
726 AddBlankTabAndShow(browsers_[1]);
727 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
728 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40729 PrepareForDialog(browsers_[0]);
730 PrepareForDialog(browsers_[1]);
oshima82f72482014-10-24 14:14:32731 ASSERT_NO_FATAL_FAILURE(AcceptClose());
732 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56733 cancel_observer.Wait();
734 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
735 EXPECT_EQ(2, browsers_[0]->tab_strip_model()->count());
736 EXPECT_EQ(2, browsers_[1]->tab_strip_model()->count());
737
Scott Violet1f106b582017-07-12 15:49:58738 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56739 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20740 chrome::CloseAllBrowsersAndQuit();
oshima82f72482014-10-24 14:14:32741 ASSERT_NO_FATAL_FAILURE(AcceptClose());
742 ASSERT_NO_FATAL_FAILURE(AcceptClose());
743 ASSERT_NO_FATAL_FAILURE(AcceptClose());
744 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56745
746 close_observer.Wait();
747 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37748 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56749}
750
rogermf18929c2017-04-19 19:59:33751// TODO(crbug/713201):
752// BrowserCloseManagerBrowserTest.AddBeforeUnloadDuringClosing flaky on Mac.
753#if defined(OS_MACOSX)
754#define MAYBE_AddBeforeUnloadDuringClosing DISABLED_AddBeforeUnloadDuringClosing
755#else
756#define MAYBE_AddBeforeUnloadDuringClosing AddBeforeUnloadDuringClosing
757#endif
758
[email protected]2e9d79f2013-08-16 05:45:56759IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
rogermf18929c2017-04-19 19:59:33760 MAYBE_AddBeforeUnloadDuringClosing) {
mkolom65a0b3c2017-03-02 06:11:40761 // TODO(crbug.com/250305): Currently FastUnloadController is broken.
762 // And it is difficult to fix this issue without fixing that one.
763 if (GetParam())
764 return;
765
766 ASSERT_TRUE(embedded_test_server()->Start());
767 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
768 browser(), embedded_test_server()->GetURL("/title1.html")));
769
770 // Open second window.
771 ui_test_utils::NavigateToURLWithDisposition(
772 browser(), embedded_test_server()->GetURL("/beforeunload.html"),
773 WindowOpenDisposition::NEW_WINDOW,
774 ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
775 EXPECT_EQ(2u, BrowserList::GetInstance()->size());
776 auto* browser2 = BrowserList::GetInstance()->get(0) != browser()
777 ? BrowserList::GetInstance()->get(0)
778 : BrowserList::GetInstance()->get(1);
779 content::WaitForLoadStop(browser2->tab_strip_model()->GetWebContentsAt(0));
780
781 // Let's work with second window only.
782 // This page has beforeunload handler already.
783 EXPECT_TRUE(browser2->tab_strip_model()
784 ->GetWebContentsAt(0)
785 ->NeedToFireBeforeUnload());
786 // This page doesn't have beforeunload handler. Yet.
787 ui_test_utils::NavigateToURLWithDisposition(
788 browser2, embedded_test_server()->GetURL("/title2.html"),
789 WindowOpenDisposition::NEW_FOREGROUND_TAB,
790 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
791 content::WaitForLoadStop(browser2->tab_strip_model()->GetWebContentsAt(1));
792 EXPECT_FALSE(browser2->tab_strip_model()
793 ->GetWebContentsAt(1)
794 ->NeedToFireBeforeUnload());
795 EXPECT_EQ(2, browser2->tab_strip_model()->count());
796
avi336125f72017-05-06 22:25:40797 PrepareForDialog(browser2);
mkolom65a0b3c2017-03-02 06:11:40798
799 // The test.
800
801 TabRestoreServiceChangesObserver restore_observer(browser2->profile());
802 content::WindowedNotificationObserver observer(
803 chrome::NOTIFICATION_BROWSER_CLOSED,
804 content::NotificationService::AllSources());
805 chrome::CloseWindow(browser2);
806 // Just to be sure CloseWindow doesn't have asynchronous tasks
807 // that could have an impact.
808 content::RunAllPendingInMessageLoop();
809
810 // Closing browser shouldn't happen because of beforeunload handler.
811 EXPECT_EQ(2u, BrowserList::GetInstance()->size());
812 // Add beforeunload handler for the 2nd (title2.html) tab which haven't had it
813 // yet.
814 ASSERT_TRUE(content::ExecuteScript(
815 browser2->tab_strip_model()->GetWebContentsAt(1)->GetRenderViewHost(),
816 "window.addEventListener('beforeunload', "
817 "function(event) { event.returnValue = 'Foo'; });"));
818 EXPECT_TRUE(browser2->tab_strip_model()
819 ->GetWebContentsAt(1)
820 ->NeedToFireBeforeUnload());
821 // Accept closing the first tab.
822 ASSERT_NO_FATAL_FAILURE(AcceptClose());
823 // Just to be sure accepting a dialog doesn't have asynchronous tasks
824 // that could have an impact.
825 content::RunAllPendingInMessageLoop();
826 // It shouldn't close the whole window/browser.
827 EXPECT_EQ(2u, BrowserList::GetInstance()->size());
828 EXPECT_EQ(2, browser2->tab_strip_model()->count());
829 // Accept closing the second tab.
830 ASSERT_NO_FATAL_FAILURE(AcceptClose());
831 observer.Wait();
832 // Now the second window/browser should be closed.
833 EXPECT_EQ(1u, BrowserList::GetInstance()->size());
834 EXPECT_EQ(browser(), BrowserList::GetInstance()->get(0));
835 EXPECT_EQ(1u, restore_observer.changes_count());
836
837 // Restore the closed browser.
838 content::WindowedNotificationObserver open_window_observer(
839 chrome::NOTIFICATION_BROWSER_OPENED,
840 content::NotificationService::AllSources());
841 chrome::OpenWindowWithRestoredTabs(browser()->profile());
842 open_window_observer.Wait();
843 EXPECT_EQ(2u, BrowserList::GetInstance()->size());
844 browser2 = BrowserList::GetInstance()->get(0) != browser()
845 ? BrowserList::GetInstance()->get(0)
846 : BrowserList::GetInstance()->get(1);
847
848 // Check the restored browser contents.
849 EXPECT_EQ(2, browser2->tab_strip_model()->count());
850 EXPECT_EQ(embedded_test_server()->GetURL("/beforeunload.html"),
851 browser2->tab_strip_model()->GetWebContentsAt(0)->GetURL());
852 EXPECT_EQ(embedded_test_server()->GetURL("/title2.html"),
853 browser2->tab_strip_model()->GetWebContentsAt(1)->GetURL());
854}
855
856IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
avi88040912017-03-30 03:48:42857 TestCloseTabDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56858 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56859 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
860 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40861 PrepareForDialog(browsers_[0]);
metaflow812bb8542016-05-24 21:10:46862
Scott Violet1f106b582017-07-12 15:49:58863 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56864 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20865 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56866
867 browsers_.push_back(CreateBrowser(browser()->profile()));
868 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
869 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40870 PrepareForDialog(browsers_[1]);
[email protected]2e9d79f2013-08-16 05:45:56871 browsers_[1]->tab_strip_model()->CloseAllTabs();
oshima82f72482014-10-24 14:14:32872 ASSERT_NO_FATAL_FAILURE(CancelClose());
873 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56874 cancel_observer.Wait();
875 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
876 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
877 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
878
Scott Violet1f106b582017-07-12 15:49:58879 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56880 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20881 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56882 browsers_[1]->tab_strip_model()->CloseAllTabs();
oshima82f72482014-10-24 14:14:32883 ASSERT_NO_FATAL_FAILURE(AcceptClose());
884 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56885
886 close_observer.Wait();
887 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37888 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56889}
890
891IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
metaflow812bb8542016-05-24 21:10:46892 TestOpenAndCloseWindowDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56893 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56894 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
895 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40896 PrepareForDialog(browsers_[0]);
metaflow812bb8542016-05-24 21:10:46897
Scott Violet1f106b582017-07-12 15:49:58898 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56899 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
[email protected]0c95faf42013-10-28 06:27:20900 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56901
902 browsers_.push_back(CreateBrowser(browser()->profile()));
903 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
904 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40905 PrepareForDialog(browsers_[1]);
[email protected]2e9d79f2013-08-16 05:45:56906 ASSERT_FALSE(browsers_[1]->ShouldCloseWindow());
oshima82f72482014-10-24 14:14:32907 ASSERT_NO_FATAL_FAILURE(CancelClose());
908 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56909 cancel_observer.Wait();
910 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
911 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
912 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
913
Scott Violet1f106b582017-07-12 15:49:58914 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56915 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20916 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56917 ASSERT_FALSE(browsers_[1]->ShouldCloseWindow());
oshima82f72482014-10-24 14:14:32918 ASSERT_NO_FATAL_FAILURE(AcceptClose());
919 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56920
921 close_observer.Wait();
922 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37923 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56924}
925
926IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
927 TestCloseWindowDuringShutdown) {
svaldeza01f7d92015-11-18 17:47:56928 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]2e9d79f2013-08-16 05:45:56929 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
930 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
931 browsers_.push_back(CreateBrowser(browser()->profile()));
932 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
933 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:40934 PrepareForDialog(browsers_[0]);
935 PrepareForDialog(browsers_[1]);
metaflow812bb8542016-05-24 21:10:46936
Scott Violet1f106b582017-07-12 15:49:58937 RepeatedNotificationObserver cancel_observer(
[email protected]2e9d79f2013-08-16 05:45:56938 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
[email protected]0c95faf42013-10-28 06:27:20939 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56940
941 ASSERT_FALSE(browsers_[0]->ShouldCloseWindow());
oshima82f72482014-10-24 14:14:32942 ASSERT_NO_FATAL_FAILURE(CancelClose());
[email protected]2e9d79f2013-08-16 05:45:56943 cancel_observer.Wait();
944 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
945 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
946 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
947
Scott Violet1f106b582017-07-12 15:49:58948 RepeatedNotificationObserver close_observer(
[email protected]2e9d79f2013-08-16 05:45:56949 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
[email protected]0c95faf42013-10-28 06:27:20950 chrome::CloseAllBrowsersAndQuit();
[email protected]2e9d79f2013-08-16 05:45:56951 ASSERT_FALSE(browsers_[0]->ShouldCloseWindow());
oshima82f72482014-10-24 14:14:32952 ASSERT_NO_FATAL_FAILURE(AcceptClose());
953 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]2e9d79f2013-08-16 05:45:56954
955 close_observer.Wait();
956 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:37957 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]2e9d79f2013-08-16 05:45:56958}
959
[email protected]0ed53872014-05-10 05:51:05960INSTANTIATE_TEST_CASE_P(BrowserCloseManagerBrowserTest,
961 BrowserCloseManagerBrowserTest,
962 testing::Bool());
963
964class BrowserCloseManagerWithDownloadsBrowserTest :
965 public BrowserCloseManagerBrowserTest {
966 public:
967 BrowserCloseManagerWithDownloadsBrowserTest() {}
968 virtual ~BrowserCloseManagerWithDownloadsBrowserTest() {}
969
Daniel Chenga542fca2014-10-21 09:51:29970 void SetUpOnMainThread() override {
[email protected]0ed53872014-05-10 05:51:05971 BrowserCloseManagerBrowserTest::SetUpOnMainThread();
972 ASSERT_TRUE(scoped_download_directory_.CreateUniqueTempDir());
973 }
974
975 void SetDownloadPathForProfile(Profile* profile) {
976 DownloadPrefs* download_prefs = DownloadPrefs::FromBrowserContext(profile);
977 download_prefs->SetDownloadPath(download_path());
978 }
979
980 const base::FilePath& download_path() const {
vabr0c237ae2016-09-14 09:24:28981 return scoped_download_directory_.GetPath();
[email protected]0ed53872014-05-10 05:51:05982 }
983
984 private:
985 base::ScopedTempDir scoped_download_directory_;
986};
987
jackhouae8e6e52015-05-29 06:36:46988// Mac has its own in-progress download prompt in app_controller_mac.mm, so
989// BrowserCloseManager should simply close all browsers. If there are no
990// browsers, it should not crash.
991#if defined(OS_MACOSX)
992IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
993 TestWithDownloads) {
svaldeza01f7d92015-11-18 17:47:56994 ASSERT_TRUE(embedded_test_server()->Start());
jackhouae8e6e52015-05-29 06:36:46995 SetDownloadPathForProfile(browser()->profile());
996 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
997
Scott Violet1f106b582017-07-12 15:49:58998 RepeatedNotificationObserver close_observer(
jackhouae8e6e52015-05-29 06:36:46999 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1000
1001 TestBrowserCloseManager::AttemptClose(
1002 TestBrowserCloseManager::NO_USER_CHOICE);
1003 close_observer.Wait();
1004 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:371005 EXPECT_TRUE(BrowserList::GetInstance()->empty());
peterccb33e82017-05-02 19:00:441006 EXPECT_EQ(1, DownloadCoreService::NonMaliciousDownloadCountAllProfiles());
jackhouae8e6e52015-05-29 06:36:461007
1008 // Attempting to close again should not crash.
1009 TestBrowserCloseManager::AttemptClose(
1010 TestBrowserCloseManager::NO_USER_CHOICE);
1011}
1012#else // defined(OS_MACOSX)
1013
[email protected]422a7d12013-10-21 12:10:421014// Test shutdown with a DANGEROUS_URL download undecided.
[email protected]0ed53872014-05-10 05:51:051015IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
[email protected]422a7d12013-10-21 12:10:421016 TestWithDangerousUrlDownload) {
svaldeza01f7d92015-11-18 17:47:561017 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]0ed53872014-05-10 05:51:051018 SetDownloadPathForProfile(browser()->profile());
[email protected]422a7d12013-10-21 12:10:421019
1020 // Set up the fake delegate that forces the download to be malicious.
dcheng4af48582016-04-19 00:29:351021 std::unique_ptr<TestDownloadManagerDelegate> test_delegate(
[email protected]422a7d12013-10-21 12:10:421022 new TestDownloadManagerDelegate(browser()->profile()));
peterccb33e82017-05-02 19:00:441023 DownloadCoreServiceFactory::GetForBrowserContext(browser()->profile())
dchenge73d8520c2015-12-27 01:19:091024 ->SetDownloadManagerDelegateForTesting(std::move(test_delegate));
[email protected]422a7d12013-10-21 12:10:421025
1026 // Run a dangerous download, but the user doesn't make a decision.
1027 // This .swf normally would be categorized as DANGEROUS_FILE, but
1028 // TestDownloadManagerDelegate turns it into DANGEROUS_URL.
Jun Cai3ec06a122017-11-07 21:01:431029 GURL download_url(
1030 embedded_test_server()->GetURL("/downloads/dangerous/dangerous.swf"));
[email protected]422a7d12013-10-21 12:10:421031 content::DownloadTestObserverInterrupted observer(
1032 content::BrowserContext::GetDownloadManager(browser()->profile()),
1033 1,
1034 content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT);
1035 ui_test_utils::NavigateToURLWithDisposition(
nick3b04f322016-08-31 19:29:191036 browser(), GURL(download_url), WindowOpenDisposition::NEW_BACKGROUND_TAB,
[email protected]422a7d12013-10-21 12:10:421037 ui_test_utils::BROWSER_TEST_NONE);
1038 observer.WaitForFinished();
1039
1040 // Check that the download manager has the expected state.
1041 EXPECT_EQ(1, content::BrowserContext::GetDownloadManager(
1042 browser()->profile())->InProgressCount());
1043 EXPECT_EQ(0, content::BrowserContext::GetDownloadManager(
1044 browser()->profile())->NonMaliciousInProgressCount());
1045
1046 // Close the browser with no user action.
Scott Violet1f106b582017-07-12 15:49:581047 RepeatedNotificationObserver close_observer(
[email protected]422a7d12013-10-21 12:10:421048 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1049 TestBrowserCloseManager::AttemptClose(
1050 TestBrowserCloseManager::NO_USER_CHOICE);
1051 close_observer.Wait();
1052 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:371053 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]422a7d12013-10-21 12:10:421054}
1055
[email protected]edfca702013-08-16 08:58:141056// Test shutdown with a download in progress.
[email protected]0ed53872014-05-10 05:51:051057IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
1058 TestWithDownloads) {
svaldeza01f7d92015-11-18 17:47:561059 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]0ed53872014-05-10 05:51:051060 SetDownloadPathForProfile(browser()->profile());
[email protected]edfca702013-08-16 08:58:141061 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
1062 content::TestNavigationObserver navigation_observer(
1063 browser()->tab_strip_model()->GetActiveWebContents(), 1);
1064 TestBrowserCloseManager::AttemptClose(
1065 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE);
1066 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
1067 navigation_observer.Wait();
1068 EXPECT_EQ(GURL(chrome::kChromeUIDownloadsURL),
1069 browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
1070
Scott Violet1f106b582017-07-12 15:49:581071 RepeatedNotificationObserver close_observer(
[email protected]edfca702013-08-16 08:58:141072 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1073
1074 TestBrowserCloseManager::AttemptClose(
1075 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
1076 close_observer.Wait();
1077 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:371078 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]5fec4702013-11-20 04:37:381079 if (browser_defaults::kBrowserAliveWithNoWindows)
peterccb33e82017-05-02 19:00:441080 EXPECT_EQ(1, DownloadCoreService::NonMaliciousDownloadCountAllProfiles());
[email protected]5fec4702013-11-20 04:37:381081 else
peterccb33e82017-05-02 19:00:441082 EXPECT_EQ(0, DownloadCoreService::NonMaliciousDownloadCountAllProfiles());
[email protected]edfca702013-08-16 08:58:141083}
1084
sammccd347712015-03-13 22:02:321085// Test shutdown with a download in progress in an off-the-record profile.
1086IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
1087 TestWithOffTheRecordDownloads) {
svaldeza01f7d92015-11-18 17:47:561088 ASSERT_TRUE(embedded_test_server()->Start());
sammccd347712015-03-13 22:02:321089 Profile* otr_profile = browser()->profile()->GetOffTheRecordProfile();
1090 SetDownloadPathForProfile(otr_profile);
1091 Browser* otr_browser = CreateBrowser(otr_profile);
1092 {
Scott Violet1f106b582017-07-12 15:49:581093 RepeatedNotificationObserver close_observer(
sammccd347712015-03-13 22:02:321094 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1095 browser()->window()->Close();
1096 close_observer.Wait();
1097 }
1098 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(otr_browser));
1099 content::TestNavigationObserver navigation_observer(
1100 otr_browser->tab_strip_model()->GetActiveWebContents(), 1);
1101 TestBrowserCloseManager::AttemptClose(
1102 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE);
1103 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
1104 navigation_observer.Wait();
1105 EXPECT_EQ(GURL(chrome::kChromeUIDownloadsURL),
1106 otr_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
1107
Scott Violet1f106b582017-07-12 15:49:581108 RepeatedNotificationObserver close_observer(
sammccd347712015-03-13 22:02:321109 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1110
1111 TestBrowserCloseManager::AttemptClose(
1112 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
1113 close_observer.Wait();
1114 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:371115 EXPECT_TRUE(BrowserList::GetInstance()->empty());
peterccb33e82017-05-02 19:00:441116 EXPECT_EQ(0, DownloadCoreService::NonMaliciousDownloadCountAllProfiles());
sammccd347712015-03-13 22:02:321117}
1118
Asanka Herathd1341dc2017-04-19 18:28:391119// Test shutdown with a download in progress in a regular profile an inconito
1120// browser is opened and closed. While there are active downloads, closing the
1121// incognito window shouldn't block on the active downloads which belong to the
1122// parent profile.
1123IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
1124 TestWithOffTheRecordWindowAndRegularDownload) {
1125 Profile* otr_profile = browser()->profile()->GetOffTheRecordProfile();
1126 SetDownloadPathForProfile(otr_profile);
1127 Browser* otr_browser = CreateBrowser(otr_profile);
1128 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
1129
1130 content::TestNavigationObserver navigation_observer(
1131 otr_browser->tab_strip_model()->GetActiveWebContents(), 1);
1132 ui_test_utils::NavigateToURL(otr_browser, GURL("about:blank"));
1133 navigation_observer.Wait();
1134
1135 int num_downloads_blocking = 0;
1136 ASSERT_EQ(
1137 Browser::DOWNLOAD_CLOSE_OK,
1138 otr_browser->OkToCloseWithInProgressDownloads(&num_downloads_blocking));
1139 ASSERT_EQ(0, num_downloads_blocking);
1140
1141 {
Scott Violet1f106b582017-07-12 15:49:581142 RepeatedNotificationObserver close_observer(
Asanka Herathd1341dc2017-04-19 18:28:391143 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1144 otr_browser->window()->Close();
1145 close_observer.Wait();
1146 }
1147
1148 ASSERT_EQ(
1149 Browser::DOWNLOAD_CLOSE_BROWSER_SHUTDOWN,
1150 browser()->OkToCloseWithInProgressDownloads(&num_downloads_blocking));
1151 ASSERT_EQ(1, num_downloads_blocking);
1152
1153 {
Scott Violet1f106b582017-07-12 15:49:581154 RepeatedNotificationObserver close_observer(
Asanka Herathd1341dc2017-04-19 18:28:391155 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
1156 TestBrowserCloseManager::AttemptClose(
1157 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
1158 close_observer.Wait();
1159 }
1160
1161 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
1162 EXPECT_TRUE(BrowserList::GetInstance()->empty());
1163 if (browser_defaults::kBrowserAliveWithNoWindows)
peterccb33e82017-05-02 19:00:441164 EXPECT_EQ(1, DownloadCoreService::NonMaliciousDownloadCountAllProfiles());
Asanka Herathd1341dc2017-04-19 18:28:391165 else
peterccb33e82017-05-02 19:00:441166 EXPECT_EQ(0, DownloadCoreService::NonMaliciousDownloadCountAllProfiles());
Asanka Herathd1341dc2017-04-19 18:28:391167}
1168
[email protected]edfca702013-08-16 08:58:141169// Test shutdown with a download in progress from one profile, where the only
1170// open windows are for another profile.
[email protected]0ed53872014-05-10 05:51:051171IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
[email protected]edfca702013-08-16 08:58:141172 TestWithDownloadsFromDifferentProfiles) {
1173 ProfileManager* profile_manager = g_browser_process->profile_manager();
jam3f2d3932017-04-26 20:28:511174 Profile* other_profile = nullptr;
1175 {
1176 base::FilePath path =
1177 profile_manager->user_data_dir().AppendASCII("test_profile");
Francois Doraye6fb2d02017-10-18 21:29:131178 base::ScopedAllowBlockingForTesting allow_blocking;
jam3f2d3932017-04-26 20:28:511179 if (!base::PathExists(path))
1180 ASSERT_TRUE(base::CreateDirectory(path));
1181 other_profile =
1182 Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS);
1183 }
[email protected]edfca702013-08-16 08:58:141184 profile_manager->RegisterTestingProfile(other_profile, true, false);
1185 Browser* other_profile_browser = CreateBrowser(other_profile);
1186
svaldeza01f7d92015-11-18 17:47:561187 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]0ed53872014-05-10 05:51:051188 SetDownloadPathForProfile(browser()->profile());
1189 SetDownloadPathForProfile(other_profile);
[email protected]edfca702013-08-16 08:58:141190 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
1191 {
Scott Violet1f106b582017-07-12 15:49:581192 RepeatedNotificationObserver close_observer(
[email protected]edfca702013-08-16 08:58:141193 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1194 browser()->window()->Close();
1195 close_observer.Wait();
1196 }
1197
1198 // When the shutdown is cancelled, the downloads page should be opened in a
1199 // browser for that profile. Because there are no browsers for that profile, a
1200 // new browser should be opened.
1201 ui_test_utils::BrowserAddedObserver new_browser_observer;
1202 TestBrowserCloseManager::AttemptClose(
1203 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE);
1204 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
1205 Browser* opened_browser = new_browser_observer.WaitForSingleNewBrowser();
1206 EXPECT_EQ(
1207 GURL(chrome::kChromeUIDownloadsURL),
1208 opened_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
1209 EXPECT_EQ(GURL("about:blank"),
1210 other_profile_browser->tab_strip_model()->GetActiveWebContents()
1211 ->GetURL());
1212
Scott Violet1f106b582017-07-12 15:49:581213 RepeatedNotificationObserver close_observer(
[email protected]edfca702013-08-16 08:58:141214 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
1215 TestBrowserCloseManager::AttemptClose(
1216 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
1217 close_observer.Wait();
1218 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:371219 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]5fec4702013-11-20 04:37:381220 if (browser_defaults::kBrowserAliveWithNoWindows)
peterccb33e82017-05-02 19:00:441221 EXPECT_EQ(1, DownloadCoreService::NonMaliciousDownloadCountAllProfiles());
[email protected]5fec4702013-11-20 04:37:381222 else
peterccb33e82017-05-02 19:00:441223 EXPECT_EQ(0, DownloadCoreService::NonMaliciousDownloadCountAllProfiles());
[email protected]edfca702013-08-16 08:58:141224}
1225
Vasilii Sukhanov4a65b862017-08-04 10:01:371226// Fails on ChromeOS and Linux, times out on Win. crbug.com/749098
[email protected]edfca702013-08-16 08:58:141227// Test shutdown with downloads in progress and beforeunload handlers.
[email protected]0ed53872014-05-10 05:51:051228IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
Vasilii Sukhanov4a65b862017-08-04 10:01:371229 DISABLED_TestBeforeUnloadAndDownloads) {
svaldeza01f7d92015-11-18 17:47:561230 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]0ed53872014-05-10 05:51:051231 SetDownloadPathForProfile(browser()->profile());
[email protected]edfca702013-08-16 08:58:141232 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
1233 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
1234 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
avi336125f72017-05-06 22:25:401235 PrepareForDialog(browser());
[email protected]edfca702013-08-16 08:58:141236
1237 content::WindowedNotificationObserver cancel_observer(
1238 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED,
1239 content::NotificationService::AllSources());
1240 TestBrowserCloseManager::AttemptClose(
1241 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE);
oshima82f72482014-10-24 14:14:321242 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]edfca702013-08-16 08:58:141243 cancel_observer.Wait();
1244 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
1245
Scott Violet1f106b582017-07-12 15:49:581246 RepeatedNotificationObserver close_observer(
[email protected]edfca702013-08-16 08:58:141247 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1248 TestBrowserCloseManager::AttemptClose(
1249 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
oshima82f72482014-10-24 14:14:321250 ASSERT_NO_FATAL_FAILURE(AcceptClose());
[email protected]edfca702013-08-16 08:58:141251 close_observer.Wait();
1252 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:371253 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]edfca702013-08-16 08:58:141254}
1255
jackhouae8e6e52015-05-29 06:36:461256#endif // defined(OS_MACOSX)
1257
[email protected]0ed53872014-05-10 05:51:051258INSTANTIATE_TEST_CASE_P(BrowserCloseManagerWithDownloadsBrowserTest,
1259 BrowserCloseManagerWithDownloadsBrowserTest,
[email protected]2e9d79f2013-08-16 05:45:561260 testing::Bool());
[email protected]0c95faf42013-10-28 06:27:201261
1262class BrowserCloseManagerWithBackgroundModeBrowserTest
1263 : public BrowserCloseManagerBrowserTest {
1264 public:
1265 BrowserCloseManagerWithBackgroundModeBrowserTest() {}
1266
Daniel Chenga542fca2014-10-21 09:51:291267 void SetUpOnMainThread() override {
[email protected]0c95faf42013-10-28 06:27:201268 BrowserCloseManagerBrowserTest::SetUpOnMainThread();
1269 g_browser_process->set_background_mode_manager_for_test(
dcheng4af48582016-04-19 00:29:351270 std::unique_ptr<BackgroundModeManager>(new FakeBackgroundModeManager));
[email protected]0c95faf42013-10-28 06:27:201271 }
1272
1273 bool IsBackgroundModeSuspended() {
1274 return static_cast<FakeBackgroundModeManager*>(
1275 g_browser_process->background_mode_manager())
1276 ->IsBackgroundModeSuspended();
1277 }
1278
1279 private:
1280 DISALLOW_COPY_AND_ASSIGN(BrowserCloseManagerWithBackgroundModeBrowserTest);
1281};
1282
1283// Check that background mode is suspended when closing all browsers unless we
1284// are quitting and that background mode is resumed when a new browser window is
1285// opened.
1286IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithBackgroundModeBrowserTest,
1287 CloseAllBrowsersWithBackgroundMode) {
1288 EXPECT_FALSE(IsBackgroundModeSuspended());
dcheng4af48582016-04-19 00:29:351289 std::unique_ptr<ScopedKeepAlive> tmp_keep_alive;
[email protected]0c95faf42013-10-28 06:27:201290 Profile* profile = browser()->profile();
1291 {
Scott Violet1f106b582017-07-12 15:49:581292 RepeatedNotificationObserver close_observer(
[email protected]0c95faf42013-10-28 06:27:201293 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
dgn02377782016-03-12 00:58:381294 tmp_keep_alive.reset(new ScopedKeepAlive(KeepAliveOrigin::PANEL_VIEW,
1295 KeepAliveRestartOption::DISABLED));
[email protected]0c95faf42013-10-28 06:27:201296 chrome::CloseAllBrowsers();
1297 close_observer.Wait();
1298 }
1299 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:371300 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]0c95faf42013-10-28 06:27:201301 EXPECT_TRUE(IsBackgroundModeSuspended());
1302
1303 // Background mode should be resumed when a new browser window is opened.
1304 ui_test_utils::BrowserAddedObserver new_browser_observer;
scottmg851949002016-02-09 20:09:441305 chrome::NewEmptyWindow(profile);
[email protected]0c95faf42013-10-28 06:27:201306 new_browser_observer.WaitForSingleNewBrowser();
dgn02377782016-03-12 00:58:381307 tmp_keep_alive.reset();
[email protected]0c95faf42013-10-28 06:27:201308 EXPECT_FALSE(IsBackgroundModeSuspended());
Scott Violet1f106b582017-07-12 15:49:581309 RepeatedNotificationObserver close_observer(
[email protected]0c95faf42013-10-28 06:27:201310 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1311
1312 // Background mode should not be suspended when quitting.
1313 chrome::CloseAllBrowsersAndQuit();
1314 close_observer.Wait();
1315 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:371316 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]0c95faf42013-10-28 06:27:201317 EXPECT_FALSE(IsBackgroundModeSuspended());
[email protected]0c95faf42013-10-28 06:27:201318}
1319
1320// Check that closing the last browser window individually does not affect
1321// background mode.
1322IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithBackgroundModeBrowserTest,
dimich981e50f2016-03-03 23:39:161323 DISABLED_CloseSingleBrowserWithBackgroundMode) {
Scott Violet1f106b582017-07-12 15:49:581324 RepeatedNotificationObserver close_observer(
[email protected]0c95faf42013-10-28 06:27:201325 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1326 EXPECT_FALSE(IsBackgroundModeSuspended());
1327 browser()->window()->Close();
1328 close_observer.Wait();
1329 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:371330 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]0c95faf42013-10-28 06:27:201331 EXPECT_FALSE(IsBackgroundModeSuspended());
1332}
1333
1334// Check that closing all browsers with no browser windows open suspends
1335// background mode but does not cause Chrome to quit.
1336IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithBackgroundModeBrowserTest,
dimich8148afc22016-03-04 01:57:031337 DISABLED_CloseAllBrowsersWithNoOpenBrowsersWithBackgroundMode) {
Scott Violet1f106b582017-07-12 15:49:581338 RepeatedNotificationObserver close_observer(
[email protected]0c95faf42013-10-28 06:27:201339 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
1340 EXPECT_FALSE(IsBackgroundModeSuspended());
dgn02377782016-03-12 00:58:381341 ScopedKeepAlive tmp_keep_alive(KeepAliveOrigin::PANEL_VIEW,
1342 KeepAliveRestartOption::DISABLED);
[email protected]0c95faf42013-10-28 06:27:201343 browser()->window()->Close();
1344 close_observer.Wait();
1345 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:371346 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]0c95faf42013-10-28 06:27:201347 EXPECT_FALSE(IsBackgroundModeSuspended());
1348
1349 chrome::CloseAllBrowsers();
1350 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
scottmg8abbff832016-01-28 22:57:371351 EXPECT_TRUE(BrowserList::GetInstance()->empty());
[email protected]0c95faf42013-10-28 06:27:201352 EXPECT_TRUE(IsBackgroundModeSuspended());
1353}
1354
1355INSTANTIATE_TEST_CASE_P(BrowserCloseManagerWithBackgroundModeBrowserTest,
1356 BrowserCloseManagerWithBackgroundModeBrowserTest,
1357 testing::Bool());