1 // 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" 8 #include "base/files/scoped_temp_dir.h" 9 #include "chrome/browser/background/background_mode_manager.h" 10 #include "chrome/browser/browser_process.h" 11 #include "chrome/browser/browser_shutdown.h" 12 #include "chrome/browser/chrome_notification_types.h" 13 #include "chrome/browser/defaults.h" 14 #include "chrome/browser/download/chrome_download_manager_delegate.h" 15 #include "chrome/browser/download/download_prefs.h" 16 #include "chrome/browser/download/download_service.h" 17 #include "chrome/browser/download/download_service_factory.h" 18 #include "chrome/browser/lifetime/application_lifetime.h" 19 #include "chrome/browser/lifetime/browser_close_manager.h" 20 #include "chrome/browser/net/url_request_mock_util.h" 21 #include "chrome/browser/prefs/session_startup_pref.h" 22 #include "chrome/browser/profiles/profile.h" 23 #include "chrome/browser/profiles/profile_manager.h" 24 #include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h" 25 #include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h" 26 #include "chrome/browser/ui/browser.h" 27 #include "chrome/browser/ui/browser_commands.h" 28 #include "chrome/browser/ui/browser_iterator.h" 29 #include "chrome/browser/ui/browser_window.h" 30 #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" 35 #include "content/public/browser/browser_context.h" 36 #include "content/public/browser/download_item.h" 37 #include "content/public/browser/download_manager.h" 38 #include "content/public/browser/notification_service.h" 39 #include "content/public/browser/web_contents.h" 40 #include "content/public/test/download_test_observer.h" 41 #include "content/public/test/test_navigation_observer.h" 42 #include "content/test/net/url_request_mock_http_job.h" 43 #include "content/test/net/url_request_slow_download_job.h" 44 #include "net/test/embedded_test_server/embedded_test_server.h" 45 46 #if defined(OS_CHROMEOS) 47 #include "chromeos/chromeos_switches.h" 48 #endif 49 50 namespace { 51 52 class AppModalDialogObserver { 53 public: 54 AppModalDialogObserver() {} 55 56 void Start() { 57 observer_.reset(new content::WindowedNotificationObserver( 58 chrome::NOTIFICATION_APP_MODAL_DIALOG_SHOWN, 59 content::NotificationService::AllSources())); 60 } 61 62 void AcceptClose() { 63 NativeAppModalDialog* dialog = GetNextDialog(); 64 ASSERT_TRUE(dialog); 65 dialog->AcceptAppModalDialog(); 66 } 67 68 void CancelClose() { 69 NativeAppModalDialog* dialog = GetNextDialog(); 70 ASSERT_TRUE(dialog); 71 dialog->CancelAppModalDialog(); 72 } 73 74 private: 75 NativeAppModalDialog* GetNextDialog() { 76 DCHECK(observer_); 77 observer_->Wait(); 78 if (observer_->source() == content::NotificationService::AllSources()) 79 return NULL; 80 81 AppModalDialog* dialog = 82 content::Source<AppModalDialog>(observer_->source()).ptr(); 83 EXPECT_TRUE(dialog->IsJavaScriptModalDialog()); 84 JavaScriptAppModalDialog* js_dialog = 85 static_cast<JavaScriptAppModalDialog*>(dialog); 86 observer_.reset(new content::WindowedNotificationObserver( 87 chrome::NOTIFICATION_APP_MODAL_DIALOG_SHOWN, 88 content::NotificationService::AllSources())); 89 return js_dialog->native_dialog(); 90 } 91 92 scoped_ptr<content::WindowedNotificationObserver> observer_; 93 94 DISALLOW_COPY_AND_ASSIGN(AppModalDialogObserver); 95 }; 96 97 class RepeatedNotificationObserver : public content::NotificationObserver { 98 public: 99 explicit RepeatedNotificationObserver(int type, int count) 100 : num_outstanding_(count), running_(false) { 101 registrar_.Add(this, type, content::NotificationService::AllSources()); 102 } 103 104 virtual void Observe(int type, 105 const content::NotificationSource& source, 106 const content::NotificationDetails& details) OVERRIDE { 107 ASSERT_GT(num_outstanding_, 0); 108 if (!--num_outstanding_ && running_) { 109 content::BrowserThread::PostTask( 110 content::BrowserThread::UI, FROM_HERE, run_loop_.QuitClosure()); 111 } 112 } 113 114 void Wait() { 115 if (num_outstanding_ <= 0) 116 return; 117 118 running_ = true; 119 run_loop_.Run(); 120 running_ = false; 121 } 122 123 private: 124 int num_outstanding_; 125 content::NotificationRegistrar registrar_; 126 bool running_; 127 base::RunLoop run_loop_; 128 129 DISALLOW_COPY_AND_ASSIGN(RepeatedNotificationObserver); 130 }; 131 132 class TestBrowserCloseManager : public BrowserCloseManager { 133 public: 134 enum UserChoice { 135 USER_CHOICE_USER_CANCELS_CLOSE, 136 USER_CHOICE_USER_ALLOWS_CLOSE, 137 NO_USER_CHOICE 138 }; 139 140 static void AttemptClose(UserChoice user_choice) { 141 scoped_refptr<BrowserCloseManager> browser_close_manager = 142 new TestBrowserCloseManager(user_choice); 143 browser_shutdown::SetTryingToQuit(true); 144 browser_close_manager->StartClosingBrowsers(); 145 } 146 147 protected: 148 virtual ~TestBrowserCloseManager() {} 149 150 virtual void ConfirmCloseWithPendingDownloads( 151 int download_count, 152 const base::Callback<void(bool)>& callback) OVERRIDE { 153 EXPECT_NE(NO_USER_CHOICE, user_choice_); 154 switch (user_choice_) { 155 case NO_USER_CHOICE: 156 case USER_CHOICE_USER_CANCELS_CLOSE: { 157 callback.Run(false); 158 break; 159 } 160 case USER_CHOICE_USER_ALLOWS_CLOSE: { 161 callback.Run(true); 162 break; 163 } 164 } 165 } 166 167 private: 168 explicit TestBrowserCloseManager(UserChoice user_choice) 169 : user_choice_(user_choice) {} 170 171 UserChoice user_choice_; 172 173 DISALLOW_COPY_AND_ASSIGN(TestBrowserCloseManager); 174 }; 175 176 class TestDownloadManagerDelegate : public ChromeDownloadManagerDelegate { 177 public: 178 explicit TestDownloadManagerDelegate(Profile* profile) 179 : ChromeDownloadManagerDelegate(profile) { 180 GetDownloadIdReceiverCallback().Run(content::DownloadItem::kInvalidId + 1); 181 } 182 virtual ~TestDownloadManagerDelegate() {} 183 184 virtual bool DetermineDownloadTarget( 185 content::DownloadItem* item, 186 const content::DownloadTargetCallback& callback) OVERRIDE { 187 content::DownloadTargetCallback dangerous_callback = 188 base::Bind(&TestDownloadManagerDelegate::SetDangerous, callback); 189 return ChromeDownloadManagerDelegate::DetermineDownloadTarget( 190 item, dangerous_callback); 191 } 192 193 static void SetDangerous( 194 const content::DownloadTargetCallback& callback, 195 const base::FilePath& target_path, 196 content::DownloadItem::TargetDisposition disp, 197 content::DownloadDangerType danger_type, 198 const base::FilePath& intermediate_path) { 199 callback.Run(target_path, 200 disp, 201 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_URL, 202 intermediate_path); 203 } 204 }; 205 206 class FakeBackgroundModeManager : public BackgroundModeManager { 207 public: 208 FakeBackgroundModeManager() 209 : BackgroundModeManager( 210 CommandLine::ForCurrentProcess(), 211 &g_browser_process->profile_manager()->GetProfileInfoCache()), 212 suspended_(false) {} 213 214 virtual void SuspendBackgroundMode() OVERRIDE { 215 BackgroundModeManager::SuspendBackgroundMode(); 216 suspended_ = true; 217 } 218 219 virtual void ResumeBackgroundMode() OVERRIDE { 220 BackgroundModeManager::ResumeBackgroundMode(); 221 suspended_ = false; 222 } 223 224 bool IsBackgroundModeSuspended() { 225 return suspended_; 226 } 227 228 private: 229 bool suspended_; 230 231 DISALLOW_COPY_AND_ASSIGN(FakeBackgroundModeManager); 232 }; 233 234 } // namespace 235 236 class BrowserCloseManagerBrowserTest 237 : public InProcessBrowserTest, 238 public testing::WithParamInterface<bool> { 239 protected: 240 virtual void SetUpOnMainThread() OVERRIDE { 241 InProcessBrowserTest::SetUpOnMainThread(); 242 SessionStartupPref::SetStartupPref( 243 browser()->profile(), SessionStartupPref(SessionStartupPref::LAST)); 244 browsers_.push_back(browser()); 245 dialogs_.Start(); 246 content::BrowserThread::PostTask( 247 content::BrowserThread::IO, 248 FROM_HERE, 249 base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); 250 } 251 252 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 253 if (GetParam()) 254 command_line->AppendSwitch(switches::kEnableFastUnload); 255 #if defined(OS_CHROMEOS) 256 command_line->AppendSwitch( 257 chromeos::switches::kIgnoreUserProfileMappingForTests); 258 #endif 259 } 260 261 void CreateStalledDownload(Browser* browser) { 262 content::DownloadTestObserverInProgress observer( 263 content::BrowserContext::GetDownloadManager(browser->profile()), 1); 264 ui_test_utils::NavigateToURLWithDisposition( 265 browser, 266 GURL(content::URLRequestSlowDownloadJob::kKnownSizeUrl), 267 NEW_BACKGROUND_TAB, 268 ui_test_utils::BROWSER_TEST_NONE); 269 observer.WaitForFinished(); 270 EXPECT_EQ( 271 1UL, 272 observer.NumDownloadsSeenInState(content::DownloadItem::IN_PROGRESS)); 273 } 274 275 std::vector<Browser*> browsers_; 276 AppModalDialogObserver dialogs_; 277 }; 278 279 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestSingleTabShutdown) { 280 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 281 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 282 browser(), embedded_test_server()->GetURL("/beforeunload.html"))); 283 RepeatedNotificationObserver cancel_observer( 284 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1); 285 chrome::CloseAllBrowsersAndQuit(); 286 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 287 cancel_observer.Wait(); 288 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 289 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 290 291 RepeatedNotificationObserver close_observer( 292 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 293 chrome::CloseAllBrowsersAndQuit(); 294 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 295 close_observer.Wait(); 296 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 297 EXPECT_TRUE(chrome::BrowserIterator().done()); 298 } 299 300 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, 301 TestShutdownMoreThanOnce) { 302 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 303 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 304 browser(), embedded_test_server()->GetURL("/beforeunload.html"))); 305 RepeatedNotificationObserver cancel_observer( 306 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1); 307 chrome::CloseAllBrowsersAndQuit(); 308 chrome::CloseAllBrowsersAndQuit(); 309 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 310 cancel_observer.Wait(); 311 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 312 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 313 314 RepeatedNotificationObserver close_observer( 315 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 316 chrome::CloseAllBrowsersAndQuit(); 317 chrome::CloseAllBrowsersAndQuit(); 318 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 319 close_observer.Wait(); 320 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 321 EXPECT_TRUE(chrome::BrowserIterator().done()); 322 } 323 324 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, PRE_TestSessionRestore) { 325 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 326 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 327 browser(), embedded_test_server()->GetURL("/beforeunload.html"))); 328 AddBlankTabAndShow(browser()); 329 ASSERT_NO_FATAL_FAILURE( 330 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL))); 331 RepeatedNotificationObserver cancel_observer( 332 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1); 333 chrome::CloseAllBrowsersAndQuit(); 334 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 335 cancel_observer.Wait(); 336 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 337 338 browser()->tab_strip_model() 339 ->CloseWebContentsAt(1, TabStripModel::CLOSE_USER_GESTURE); 340 content::TestNavigationObserver navigation_observer( 341 browser()->tab_strip_model()->GetActiveWebContents(), 1); 342 ASSERT_NO_FATAL_FAILURE( 343 NavigateToURLWithDisposition(browser(), 344 GURL(chrome::kChromeUIVersionURL), 345 CURRENT_TAB, 346 ui_test_utils::BROWSER_TEST_NONE)); 347 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 348 navigation_observer.Wait(); 349 350 RepeatedNotificationObserver close_observer( 351 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 352 chrome::CloseAllBrowsersAndQuit(); 353 close_observer.Wait(); 354 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 355 EXPECT_TRUE(chrome::BrowserIterator().done()); 356 } 357 358 // Test that the tab closed after the aborted shutdown attempt is not re-opened 359 // when restoring the session. 360 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestSessionRestore) { 361 // The testing framework launches Chrome with about:blank as args. 362 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 363 EXPECT_EQ(GURL(chrome::kChromeUIVersionURL), 364 browser()->tab_strip_model()->GetWebContentsAt(0)->GetURL()); 365 EXPECT_EQ(GURL("about:blank"), 366 browser()->tab_strip_model()->GetWebContentsAt(1)->GetURL()); 367 } 368 369 // Test that browser windows are only closed if all browsers are ready to close 370 // and that all beforeunload dialogs are shown again after a cancel. 371 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestMultipleWindows) { 372 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 373 browsers_.push_back(CreateBrowser(browser()->profile())); 374 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 375 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html"))); 376 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 377 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html"))); 378 379 // Cancel shutdown on the first beforeunload event. 380 { 381 RepeatedNotificationObserver cancel_observer( 382 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1); 383 chrome::CloseAllBrowsersAndQuit(); 384 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 385 cancel_observer.Wait(); 386 } 387 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 388 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count()); 389 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count()); 390 391 // Cancel shutdown on the second beforeunload event. 392 { 393 RepeatedNotificationObserver cancel_observer( 394 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2); 395 chrome::CloseAllBrowsersAndQuit(); 396 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 397 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 398 cancel_observer.Wait(); 399 } 400 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 401 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count()); 402 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count()); 403 404 // Allow shutdown for both beforeunload events. 405 RepeatedNotificationObserver close_observer( 406 chrome::NOTIFICATION_BROWSER_CLOSED, 2); 407 chrome::CloseAllBrowsersAndQuit(); 408 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 409 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 410 close_observer.Wait(); 411 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 412 EXPECT_TRUE(chrome::BrowserIterator().done()); 413 } 414 415 // Test that tabs in the same window with a beforeunload event that hangs are 416 // treated the same as the user accepting the close, but do not close the tab 417 // early. 418 // Test is flaky on windows, disabled. See http://crbug.com/276366 419 #if defined(OS_WIN) 420 #define MAYBE_TestHangInBeforeUnloadMultipleTabs \ 421 DISABLED_TestHangInBeforeUnloadMultipleTabs 422 #else 423 #define MAYBE_TestHangInBeforeUnloadMultipleTabs \ 424 TestHangInBeforeUnloadMultipleTabs 425 #endif 426 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, 427 MAYBE_TestHangInBeforeUnloadMultipleTabs) { 428 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 429 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 430 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html"))); 431 AddBlankTabAndShow(browsers_[0]); 432 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 433 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html"))); 434 AddBlankTabAndShow(browsers_[0]); 435 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 436 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html"))); 437 438 RepeatedNotificationObserver cancel_observer( 439 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1); 440 chrome::CloseAllBrowsersAndQuit(); 441 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 442 cancel_observer.Wait(); 443 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 444 // All tabs should still be open. 445 EXPECT_EQ(3, browsers_[0]->tab_strip_model()->count()); 446 447 RepeatedNotificationObserver close_observer( 448 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 449 chrome::CloseAllBrowsersAndQuit(); 450 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 451 close_observer.Wait(); 452 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 453 EXPECT_TRUE(chrome::BrowserIterator().done()); 454 } 455 456 // Test that tabs in different windows with a beforeunload event that hangs are 457 // treated the same as the user accepting the close, but do not close the tab 458 // early. 459 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, 460 TestHangInBeforeUnloadMultipleWindows) { 461 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 462 browsers_.push_back(CreateBrowser(browser()->profile())); 463 browsers_.push_back(CreateBrowser(browser()->profile())); 464 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 465 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html"))); 466 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 467 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html"))); 468 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 469 browsers_[2], embedded_test_server()->GetURL("/beforeunload_hang.html"))); 470 471 RepeatedNotificationObserver cancel_observer( 472 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2); 473 chrome::CloseAllBrowsersAndQuit(); 474 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 475 cancel_observer.Wait(); 476 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 477 // All windows should still be open. 478 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count()); 479 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count()); 480 EXPECT_EQ(1, browsers_[2]->tab_strip_model()->count()); 481 482 RepeatedNotificationObserver close_observer( 483 chrome::NOTIFICATION_BROWSER_CLOSED, 3); 484 chrome::CloseAllBrowsersAndQuit(); 485 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 486 close_observer.Wait(); 487 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 488 EXPECT_TRUE(chrome::BrowserIterator().done()); 489 } 490 491 // Test that a window created during shutdown is closed. 492 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, 493 TestAddWindowDuringShutdown) { 494 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 495 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 496 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html"))); 497 498 RepeatedNotificationObserver close_observer( 499 chrome::NOTIFICATION_BROWSER_CLOSED, 2); 500 chrome::CloseAllBrowsersAndQuit(); 501 browsers_.push_back(CreateBrowser(browser()->profile())); 502 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 503 close_observer.Wait(); 504 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 505 EXPECT_TRUE(chrome::BrowserIterator().done()); 506 } 507 508 // Test that a window created during shutdown with a beforeunload handler can 509 // cancel the shutdown. 510 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, 511 TestAddWindowWithBeforeUnloadDuringShutdown) { 512 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 513 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 514 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html"))); 515 516 RepeatedNotificationObserver cancel_observer( 517 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2); 518 chrome::CloseAllBrowsersAndQuit(); 519 browsers_.push_back(CreateBrowser(browser()->profile())); 520 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 521 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html"))); 522 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 523 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 524 cancel_observer.Wait(); 525 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 526 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count()); 527 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count()); 528 529 // Allow shutdown for both beforeunload dialogs. 530 RepeatedNotificationObserver close_observer( 531 chrome::NOTIFICATION_BROWSER_CLOSED, 2); 532 chrome::CloseAllBrowsersAndQuit(); 533 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 534 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 535 close_observer.Wait(); 536 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 537 EXPECT_TRUE(chrome::BrowserIterator().done()); 538 } 539 540 // Test that tabs added during shutdown are closed. 541 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, 542 TestAddTabDuringShutdown) { 543 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 544 browsers_.push_back(CreateBrowser(browser()->profile())); 545 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 546 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html"))); 547 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 548 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html"))); 549 550 RepeatedNotificationObserver close_observer( 551 chrome::NOTIFICATION_BROWSER_CLOSED, 2); 552 chrome::CloseAllBrowsersAndQuit(); 553 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 554 AddBlankTabAndShow(browsers_[0]); 555 AddBlankTabAndShow(browsers_[1]); 556 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 557 close_observer.Wait(); 558 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 559 EXPECT_TRUE(chrome::BrowserIterator().done()); 560 } 561 562 // Test that tabs created during shutdown with beforeunload handlers can cancel 563 // the shutdown. 564 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, 565 TestAddTabWithBeforeUnloadDuringShutdown) { 566 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 567 browsers_.push_back(CreateBrowser(browser()->profile())); 568 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 569 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html"))); 570 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 571 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html"))); 572 RepeatedNotificationObserver cancel_observer( 573 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2); 574 chrome::CloseAllBrowsersAndQuit(); 575 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 576 AddBlankTabAndShow(browsers_[0]); 577 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 578 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html"))); 579 AddBlankTabAndShow(browsers_[1]); 580 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 581 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html"))); 582 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 583 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 584 cancel_observer.Wait(); 585 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 586 EXPECT_EQ(2, browsers_[0]->tab_strip_model()->count()); 587 EXPECT_EQ(2, browsers_[1]->tab_strip_model()->count()); 588 589 RepeatedNotificationObserver close_observer( 590 chrome::NOTIFICATION_BROWSER_CLOSED, 2); 591 chrome::CloseAllBrowsersAndQuit(); 592 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 593 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 594 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 595 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 596 597 close_observer.Wait(); 598 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 599 EXPECT_TRUE(chrome::BrowserIterator().done()); 600 } 601 602 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, 603 TestCloseTabDuringShutdown) { 604 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 605 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 606 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html"))); 607 RepeatedNotificationObserver cancel_observer( 608 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1); 609 chrome::CloseAllBrowsersAndQuit(); 610 611 browsers_.push_back(CreateBrowser(browser()->profile())); 612 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 613 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html"))); 614 browsers_[1]->tab_strip_model()->CloseAllTabs(); 615 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 616 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 617 cancel_observer.Wait(); 618 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 619 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count()); 620 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count()); 621 622 RepeatedNotificationObserver close_observer( 623 chrome::NOTIFICATION_BROWSER_CLOSED, 2); 624 chrome::CloseAllBrowsersAndQuit(); 625 browsers_[1]->tab_strip_model()->CloseAllTabs(); 626 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 627 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 628 629 close_observer.Wait(); 630 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 631 EXPECT_TRUE(chrome::BrowserIterator().done()); 632 } 633 634 // Test is flaky on windows, disabled. See http://crbug.com/276366 635 #if defined(OS_WIN) 636 #define MAYBE_TestOpenAndCloseWindowDuringShutdown \ 637 DISABLED_TestOpenAndCloseWindowDuringShutdown 638 #else 639 #define MAYBE_TestOpenAndCloseWindowDuringShutdown \ 640 TestOpenAndCloseWindowDuringShutdown 641 #endif 642 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, 643 MAYBE_TestOpenAndCloseWindowDuringShutdown) { 644 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 645 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 646 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html"))); 647 RepeatedNotificationObserver cancel_observer( 648 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2); 649 chrome::CloseAllBrowsersAndQuit(); 650 651 browsers_.push_back(CreateBrowser(browser()->profile())); 652 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 653 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html"))); 654 ASSERT_FALSE(browsers_[1]->ShouldCloseWindow()); 655 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 656 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 657 cancel_observer.Wait(); 658 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 659 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count()); 660 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count()); 661 662 RepeatedNotificationObserver close_observer( 663 chrome::NOTIFICATION_BROWSER_CLOSED, 2); 664 chrome::CloseAllBrowsersAndQuit(); 665 ASSERT_FALSE(browsers_[1]->ShouldCloseWindow()); 666 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 667 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 668 669 close_observer.Wait(); 670 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 671 EXPECT_TRUE(chrome::BrowserIterator().done()); 672 } 673 674 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, 675 TestCloseWindowDuringShutdown) { 676 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 677 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 678 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html"))); 679 browsers_.push_back(CreateBrowser(browser()->profile())); 680 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 681 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html"))); 682 RepeatedNotificationObserver cancel_observer( 683 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1); 684 chrome::CloseAllBrowsersAndQuit(); 685 686 ASSERT_FALSE(browsers_[0]->ShouldCloseWindow()); 687 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose()); 688 cancel_observer.Wait(); 689 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 690 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count()); 691 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count()); 692 693 RepeatedNotificationObserver close_observer( 694 chrome::NOTIFICATION_BROWSER_CLOSED, 2); 695 chrome::CloseAllBrowsersAndQuit(); 696 ASSERT_FALSE(browsers_[0]->ShouldCloseWindow()); 697 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 698 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 699 700 close_observer.Wait(); 701 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 702 EXPECT_TRUE(chrome::BrowserIterator().done()); 703 } 704 705 INSTANTIATE_TEST_CASE_P(BrowserCloseManagerBrowserTest, 706 BrowserCloseManagerBrowserTest, 707 testing::Bool()); 708 709 class BrowserCloseManagerWithDownloadsBrowserTest : 710 public BrowserCloseManagerBrowserTest { 711 public: 712 BrowserCloseManagerWithDownloadsBrowserTest() {} 713 virtual ~BrowserCloseManagerWithDownloadsBrowserTest() {} 714 715 virtual void SetUpOnMainThread() OVERRIDE { 716 BrowserCloseManagerBrowserTest::SetUpOnMainThread(); 717 ASSERT_TRUE(scoped_download_directory_.CreateUniqueTempDir()); 718 } 719 720 void SetDownloadPathForProfile(Profile* profile) { 721 DownloadPrefs* download_prefs = DownloadPrefs::FromBrowserContext(profile); 722 download_prefs->SetDownloadPath(download_path()); 723 } 724 725 const base::FilePath& download_path() const { 726 return scoped_download_directory_.path(); 727 } 728 729 private: 730 base::ScopedTempDir scoped_download_directory_; 731 }; 732 733 // Test shutdown with a DANGEROUS_URL download undecided. 734 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest, 735 TestWithDangerousUrlDownload) { 736 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 737 SetDownloadPathForProfile(browser()->profile()); 738 739 // Set up the fake delegate that forces the download to be malicious. 740 scoped_ptr<TestDownloadManagerDelegate> test_delegate( 741 new TestDownloadManagerDelegate(browser()->profile())); 742 DownloadServiceFactory::GetForBrowserContext(browser()->profile())-> 743 SetDownloadManagerDelegateForTesting( 744 test_delegate.PassAs<ChromeDownloadManagerDelegate>()); 745 746 // Run a dangerous download, but the user doesn't make a decision. 747 // This .swf normally would be categorized as DANGEROUS_FILE, but 748 // TestDownloadManagerDelegate turns it into DANGEROUS_URL. 749 base::FilePath file(FILE_PATH_LITERAL("downloads/dangerous/dangerous.swf")); 750 GURL download_url(content::URLRequestMockHTTPJob::GetMockUrl(file)); 751 content::DownloadTestObserverInterrupted observer( 752 content::BrowserContext::GetDownloadManager(browser()->profile()), 753 1, 754 content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT); 755 ui_test_utils::NavigateToURLWithDisposition( 756 browser(), 757 GURL(download_url), 758 NEW_BACKGROUND_TAB, 759 ui_test_utils::BROWSER_TEST_NONE); 760 observer.WaitForFinished(); 761 762 // Check that the download manager has the expected state. 763 EXPECT_EQ(1, content::BrowserContext::GetDownloadManager( 764 browser()->profile())->InProgressCount()); 765 EXPECT_EQ(0, content::BrowserContext::GetDownloadManager( 766 browser()->profile())->NonMaliciousInProgressCount()); 767 768 // Close the browser with no user action. 769 RepeatedNotificationObserver close_observer( 770 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 771 TestBrowserCloseManager::AttemptClose( 772 TestBrowserCloseManager::NO_USER_CHOICE); 773 close_observer.Wait(); 774 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 775 EXPECT_TRUE(chrome::BrowserIterator().done()); 776 } 777 778 // Test shutdown with a download in progress. 779 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest, 780 TestWithDownloads) { 781 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 782 SetDownloadPathForProfile(browser()->profile()); 783 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser())); 784 content::TestNavigationObserver navigation_observer( 785 browser()->tab_strip_model()->GetActiveWebContents(), 1); 786 TestBrowserCloseManager::AttemptClose( 787 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE); 788 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 789 navigation_observer.Wait(); 790 EXPECT_EQ(GURL(chrome::kChromeUIDownloadsURL), 791 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 792 793 RepeatedNotificationObserver close_observer( 794 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 795 796 TestBrowserCloseManager::AttemptClose( 797 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE); 798 close_observer.Wait(); 799 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 800 EXPECT_TRUE(chrome::BrowserIterator().done()); 801 if (browser_defaults::kBrowserAliveWithNoWindows) 802 EXPECT_EQ(1, DownloadService::NonMaliciousDownloadCountAllProfiles()); 803 else 804 EXPECT_EQ(0, DownloadService::NonMaliciousDownloadCountAllProfiles()); 805 } 806 807 // Test shutdown with a download in progress from one profile, where the only 808 // open windows are for another profile. 809 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest, 810 TestWithDownloadsFromDifferentProfiles) { 811 ProfileManager* profile_manager = g_browser_process->profile_manager(); 812 base::FilePath path = 813 profile_manager->user_data_dir().AppendASCII("test_profile"); 814 if (!base::PathExists(path)) 815 ASSERT_TRUE(base::CreateDirectory(path)); 816 Profile* other_profile = 817 Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS); 818 profile_manager->RegisterTestingProfile(other_profile, true, false); 819 Browser* other_profile_browser = CreateBrowser(other_profile); 820 821 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 822 SetDownloadPathForProfile(browser()->profile()); 823 SetDownloadPathForProfile(other_profile); 824 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser())); 825 { 826 RepeatedNotificationObserver close_observer( 827 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 828 browser()->window()->Close(); 829 close_observer.Wait(); 830 } 831 832 // When the shutdown is cancelled, the downloads page should be opened in a 833 // browser for that profile. Because there are no browsers for that profile, a 834 // new browser should be opened. 835 ui_test_utils::BrowserAddedObserver new_browser_observer; 836 TestBrowserCloseManager::AttemptClose( 837 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE); 838 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 839 Browser* opened_browser = new_browser_observer.WaitForSingleNewBrowser(); 840 EXPECT_EQ( 841 GURL(chrome::kChromeUIDownloadsURL), 842 opened_browser->tab_strip_model()->GetActiveWebContents()->GetURL()); 843 EXPECT_EQ(GURL("about:blank"), 844 other_profile_browser->tab_strip_model()->GetActiveWebContents() 845 ->GetURL()); 846 847 RepeatedNotificationObserver close_observer( 848 chrome::NOTIFICATION_BROWSER_CLOSED, 2); 849 TestBrowserCloseManager::AttemptClose( 850 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE); 851 close_observer.Wait(); 852 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 853 EXPECT_TRUE(chrome::BrowserIterator().done()); 854 if (browser_defaults::kBrowserAliveWithNoWindows) 855 EXPECT_EQ(1, DownloadService::NonMaliciousDownloadCountAllProfiles()); 856 else 857 EXPECT_EQ(0, DownloadService::NonMaliciousDownloadCountAllProfiles()); 858 } 859 860 // Test shutdown with downloads in progress and beforeunload handlers. 861 // Disabled, see http://crbug.com/315754. 862 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest, 863 DISABLED_TestBeforeUnloadAndDownloads) { 864 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 865 SetDownloadPathForProfile(browser()->profile()); 866 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser())); 867 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( 868 browser(), embedded_test_server()->GetURL("/beforeunload.html"))); 869 870 content::WindowedNotificationObserver cancel_observer( 871 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 872 content::NotificationService::AllSources()); 873 TestBrowserCloseManager::AttemptClose( 874 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE); 875 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 876 cancel_observer.Wait(); 877 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 878 879 RepeatedNotificationObserver close_observer( 880 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 881 TestBrowserCloseManager::AttemptClose( 882 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE); 883 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose()); 884 close_observer.Wait(); 885 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 886 EXPECT_TRUE(chrome::BrowserIterator().done()); 887 } 888 889 INSTANTIATE_TEST_CASE_P(BrowserCloseManagerWithDownloadsBrowserTest, 890 BrowserCloseManagerWithDownloadsBrowserTest, 891 testing::Bool()); 892 893 class BrowserCloseManagerWithBackgroundModeBrowserTest 894 : public BrowserCloseManagerBrowserTest { 895 public: 896 BrowserCloseManagerWithBackgroundModeBrowserTest() {} 897 898 virtual void SetUpOnMainThread() OVERRIDE { 899 BrowserCloseManagerBrowserTest::SetUpOnMainThread(); 900 g_browser_process->set_background_mode_manager_for_test( 901 scoped_ptr<BackgroundModeManager>(new FakeBackgroundModeManager)); 902 } 903 904 bool IsBackgroundModeSuspended() { 905 return static_cast<FakeBackgroundModeManager*>( 906 g_browser_process->background_mode_manager()) 907 ->IsBackgroundModeSuspended(); 908 } 909 910 private: 911 DISALLOW_COPY_AND_ASSIGN(BrowserCloseManagerWithBackgroundModeBrowserTest); 912 }; 913 914 // Check that background mode is suspended when closing all browsers unless we 915 // are quitting and that background mode is resumed when a new browser window is 916 // opened. 917 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithBackgroundModeBrowserTest, 918 CloseAllBrowsersWithBackgroundMode) { 919 EXPECT_FALSE(IsBackgroundModeSuspended()); 920 Profile* profile = browser()->profile(); 921 { 922 RepeatedNotificationObserver close_observer( 923 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 924 chrome::IncrementKeepAliveCount(); 925 chrome::CloseAllBrowsers(); 926 close_observer.Wait(); 927 } 928 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 929 EXPECT_TRUE(chrome::BrowserIterator().done()); 930 EXPECT_TRUE(IsBackgroundModeSuspended()); 931 932 // Background mode should be resumed when a new browser window is opened. 933 ui_test_utils::BrowserAddedObserver new_browser_observer; 934 chrome::NewEmptyWindow(profile, chrome::HOST_DESKTOP_TYPE_NATIVE); 935 new_browser_observer.WaitForSingleNewBrowser(); 936 chrome::DecrementKeepAliveCount(); 937 EXPECT_FALSE(IsBackgroundModeSuspended()); 938 RepeatedNotificationObserver close_observer( 939 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 940 941 // Background mode should not be suspended when quitting. 942 chrome::CloseAllBrowsersAndQuit(); 943 close_observer.Wait(); 944 EXPECT_TRUE(browser_shutdown::IsTryingToQuit()); 945 EXPECT_TRUE(chrome::BrowserIterator().done()); 946 EXPECT_FALSE(IsBackgroundModeSuspended()); 947 948 } 949 950 // Check that closing the last browser window individually does not affect 951 // background mode. 952 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithBackgroundModeBrowserTest, 953 CloseSingleBrowserWithBackgroundMode) { 954 RepeatedNotificationObserver close_observer( 955 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 956 EXPECT_FALSE(IsBackgroundModeSuspended()); 957 browser()->window()->Close(); 958 close_observer.Wait(); 959 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 960 EXPECT_TRUE(chrome::BrowserIterator().done()); 961 EXPECT_FALSE(IsBackgroundModeSuspended()); 962 } 963 964 // Check that closing all browsers with no browser windows open suspends 965 // background mode but does not cause Chrome to quit. 966 IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithBackgroundModeBrowserTest, 967 CloseAllBrowsersWithNoOpenBrowsersWithBackgroundMode) { 968 RepeatedNotificationObserver close_observer( 969 chrome::NOTIFICATION_BROWSER_CLOSED, 1); 970 EXPECT_FALSE(IsBackgroundModeSuspended()); 971 chrome::IncrementKeepAliveCount(); 972 browser()->window()->Close(); 973 close_observer.Wait(); 974 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 975 EXPECT_TRUE(chrome::BrowserIterator().done()); 976 EXPECT_FALSE(IsBackgroundModeSuspended()); 977 978 chrome::CloseAllBrowsers(); 979 EXPECT_FALSE(browser_shutdown::IsTryingToQuit()); 980 EXPECT_TRUE(chrome::BrowserIterator().done()); 981 EXPECT_TRUE(IsBackgroundModeSuspended()); 982 } 983 984 INSTANTIATE_TEST_CASE_P(BrowserCloseManagerWithBackgroundModeBrowserTest, 985 BrowserCloseManagerWithBackgroundModeBrowserTest, 986 testing::Bool()); 987