blob: f127ac079569f1c650c764b91561aa439c8b5c1e [file] [log] [blame]
[email protected]2e9d79f2013-08-16 05:45:561// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <vector>
6
7#include "base/command_line.h"
[email protected]edfca702013-08-16 08:58:148#include "chrome/browser/browser_process.h"
[email protected]2e9d79f2013-08-16 05:45:569#include "chrome/browser/browser_shutdown.h"
10#include "chrome/browser/chrome_notification_types.h"
11#include "chrome/browser/lifetime/application_lifetime.h"
12#include "chrome/browser/lifetime/browser_close_manager.h"
[email protected]edfca702013-08-16 08:58:1413#include "chrome/browser/net/url_request_mock_util.h"
[email protected]2e9d79f2013-08-16 05:45:5614#include "chrome/browser/prefs/session_startup_pref.h"
[email protected]edfca702013-08-16 08:58:1415#include "chrome/browser/profiles/profile.h"
16#include "chrome/browser/profiles/profile_manager.h"
[email protected]2e9d79f2013-08-16 05:45:5617#include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h"
18#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
19#include "chrome/browser/ui/browser.h"
20#include "chrome/browser/ui/browser_iterator.h"
[email protected]edfca702013-08-16 08:58:1421#include "chrome/browser/ui/browser_window.h"
[email protected]2e9d79f2013-08-16 05:45:5622#include "chrome/browser/ui/tabs/tab_strip_model.h"
23#include "chrome/common/chrome_switches.h"
24#include "chrome/common/url_constants.h"
25#include "chrome/test/base/in_process_browser_test.h"
26#include "chrome/test/base/ui_test_utils.h"
[email protected]edfca702013-08-16 08:58:1427#include "content/public/browser/browser_context.h"
28#include "content/public/browser/download_item.h"
29#include "content/public/browser/download_manager.h"
[email protected]2e9d79f2013-08-16 05:45:5630#include "content/public/browser/notification_service.h"
31#include "content/public/browser/web_contents.h"
[email protected]edfca702013-08-16 08:58:1432#include "content/public/test/download_test_observer.h"
[email protected]2e9d79f2013-08-16 05:45:5633#include "content/public/test/test_navigation_observer.h"
[email protected]edfca702013-08-16 08:58:1434#include "content/test/net/url_request_slow_download_job.h"
[email protected]2e9d79f2013-08-16 05:45:5635#include "net/test/embedded_test_server/embedded_test_server.h"
36
37namespace {
38
39class AppModalDialogObserver {
40 public:
41 AppModalDialogObserver() {}
42
43 void Start() {
44 observer_.reset(new content::WindowedNotificationObserver(
45 chrome::NOTIFICATION_APP_MODAL_DIALOG_SHOWN,
46 content::NotificationService::AllSources()));
47 }
48
49 void AcceptClose() {
50 NativeAppModalDialog* dialog = GetNextDialog();
51 ASSERT_TRUE(dialog);
52 dialog->AcceptAppModalDialog();
53 }
54
55 void CancelClose() {
56 NativeAppModalDialog* dialog = GetNextDialog();
57 ASSERT_TRUE(dialog);
58 dialog->CancelAppModalDialog();
59 }
60
61 private:
62 NativeAppModalDialog* GetNextDialog() {
63 DCHECK(observer_);
64 observer_->Wait();
65 if (observer_->source() == content::NotificationService::AllSources())
66 return NULL;
67
68 AppModalDialog* dialog =
69 content::Source<AppModalDialog>(observer_->source()).ptr();
70 EXPECT_TRUE(dialog->IsJavaScriptModalDialog());
71 JavaScriptAppModalDialog* js_dialog =
72 static_cast<JavaScriptAppModalDialog*>(dialog);
73 observer_.reset(new content::WindowedNotificationObserver(
74 chrome::NOTIFICATION_APP_MODAL_DIALOG_SHOWN,
75 content::NotificationService::AllSources()));
76 return js_dialog->native_dialog();
77 }
78
79 scoped_ptr<content::WindowedNotificationObserver> observer_;
80
81 DISALLOW_COPY_AND_ASSIGN(AppModalDialogObserver);
82};
83
84class RepeatedNotificationObserver : public content::NotificationObserver {
85 public:
86 explicit RepeatedNotificationObserver(int type, int count)
87 : num_outstanding_(count), running_(false) {
88 registrar_.Add(this, type, content::NotificationService::AllSources());
89 }
90
91 virtual void Observe(int type,
92 const content::NotificationSource& source,
93 const content::NotificationDetails& details) OVERRIDE {
94 ASSERT_GT(num_outstanding_, 0);
95 if (!--num_outstanding_ && running_) {
96 content::BrowserThread::PostTask(
97 content::BrowserThread::UI, FROM_HERE, run_loop_.QuitClosure());
98 }
99 }
100
101 void Wait() {
102 if (num_outstanding_ <= 0)
103 return;
104
105 running_ = true;
106 run_loop_.Run();
107 running_ = false;
108 }
109
110 private:
111 int num_outstanding_;
112 content::NotificationRegistrar registrar_;
113 bool running_;
114 base::RunLoop run_loop_;
115
116 DISALLOW_COPY_AND_ASSIGN(RepeatedNotificationObserver);
117};
118
[email protected]edfca702013-08-16 08:58:14119class TestBrowserCloseManager : public BrowserCloseManager {
120 public:
121 enum UserChoice {
122 USER_CHOICE_USER_CANCELS_CLOSE,
123 USER_CHOICE_USER_ALLOWS_CLOSE,
124 };
125
126 static void AttemptClose(UserChoice user_choice) {
127 scoped_refptr<BrowserCloseManager> browser_close_manager =
128 new TestBrowserCloseManager(user_choice);
129 browser_close_manager->StartClosingBrowsers();
130 }
131
132 protected:
133 virtual ~TestBrowserCloseManager() {}
134
135 virtual void ConfirmCloseWithPendingDownloads(
136 int download_count,
137 const base::Callback<void(bool)>& callback) OVERRIDE {
138 switch (user_choice_) {
139 case USER_CHOICE_USER_CANCELS_CLOSE: {
140 callback.Run(false);
141 break;
142 }
143 case USER_CHOICE_USER_ALLOWS_CLOSE: {
144 callback.Run(true);
145 break;
146 }
147 }
148 }
149
150 private:
151 explicit TestBrowserCloseManager(UserChoice user_choice)
152 : user_choice_(user_choice) {}
153
154 UserChoice user_choice_;
155
156 DISALLOW_COPY_AND_ASSIGN(TestBrowserCloseManager);
157};
158
[email protected]2e9d79f2013-08-16 05:45:56159} // namespace
160
161class BrowserCloseManagerBrowserTest
162 : public InProcessBrowserTest,
163 public testing::WithParamInterface<bool> {
164 protected:
165 virtual void SetUpOnMainThread() OVERRIDE {
166 InProcessBrowserTest::SetUpOnMainThread();
167 SessionStartupPref::SetStartupPref(
168 browser()->profile(), SessionStartupPref(SessionStartupPref::LAST));
169 browsers_.push_back(browser());
170 dialogs_.Start();
[email protected]edfca702013-08-16 08:58:14171 content::BrowserThread::PostTask(
172 content::BrowserThread::IO,
173 FROM_HERE,
174 base::Bind(&chrome_browser_net::SetUrlRequestMocksEnabled, true));
[email protected]2e9d79f2013-08-16 05:45:56175 }
176
177 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
178 command_line->AppendSwitch(switches::kEnableBatchedShutdown);
179 if (GetParam())
180 command_line->AppendSwitch(switches::kEnableFastUnload);
181 }
182
[email protected]edfca702013-08-16 08:58:14183 void CreateStalledDownload(Browser* browser) {
184 content::DownloadTestObserverInProgress observer(
185 content::BrowserContext::GetDownloadManager(browser->profile()), 1);
186 ui_test_utils::NavigateToURLWithDisposition(
187 browser,
188 GURL(content::URLRequestSlowDownloadJob::kKnownSizeUrl),
189 NEW_BACKGROUND_TAB,
190 ui_test_utils::BROWSER_TEST_NONE);
191 observer.WaitForFinished();
192 EXPECT_EQ(
193 1UL,
194 observer.NumDownloadsSeenInState(content::DownloadItem::IN_PROGRESS));
195 }
196
[email protected]2e9d79f2013-08-16 05:45:56197 std::vector<Browser*> browsers_;
198 AppModalDialogObserver dialogs_;
199};
200
201IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestSingleTabShutdown) {
202 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
203 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
204 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
205 RepeatedNotificationObserver cancel_observer(
206 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
207 chrome::CloseAllBrowsers();
208 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
209 cancel_observer.Wait();
210 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
211 EXPECT_EQ(1, browser()->tab_strip_model()->count());
212
213 RepeatedNotificationObserver close_observer(
214 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
215 chrome::CloseAllBrowsers();
216 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
217 close_observer.Wait();
218 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
219 EXPECT_TRUE(chrome::BrowserIterator().done());
220}
221
222IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
223 TestShutdownMoreThanOnce) {
224 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
225 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
226 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
227 RepeatedNotificationObserver cancel_observer(
228 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
229 chrome::CloseAllBrowsers();
230 chrome::CloseAllBrowsers();
231 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
232 cancel_observer.Wait();
233 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
234 EXPECT_EQ(1, browser()->tab_strip_model()->count());
235
236 RepeatedNotificationObserver close_observer(
237 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
238 chrome::CloseAllBrowsers();
239 chrome::CloseAllBrowsers();
240 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
241 close_observer.Wait();
242 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
243 EXPECT_TRUE(chrome::BrowserIterator().done());
244}
245
246IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, PRE_TestSessionRestore) {
247 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
248 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
249 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
250 AddBlankTabAndShow(browser());
251 ASSERT_NO_FATAL_FAILURE(
252 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL)));
253 RepeatedNotificationObserver cancel_observer(
254 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
255 chrome::CloseAllBrowsers();
256 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
257 cancel_observer.Wait();
258 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
259
260 browser()->tab_strip_model()
261 ->CloseWebContentsAt(1, TabStripModel::CLOSE_USER_GESTURE);
262 content::TestNavigationObserver navigation_observer(
263 browser()->tab_strip_model()->GetActiveWebContents(), 1);
264 ASSERT_NO_FATAL_FAILURE(
265 NavigateToURLWithDisposition(browser(),
266 GURL(chrome::kChromeUIVersionURL),
267 CURRENT_TAB,
268 ui_test_utils::BROWSER_TEST_NONE));
269 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
270 navigation_observer.Wait();
271
272 RepeatedNotificationObserver close_observer(
273 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
274 chrome::CloseAllBrowsers();
275 close_observer.Wait();
276 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
277 EXPECT_TRUE(chrome::BrowserIterator().done());
278}
279
280// Test that the tab closed after the aborted shutdown attempt is not re-opened
281// when restoring the session.
282IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestSessionRestore) {
283 // The testing framework launches Chrome with about:blank as args.
284 EXPECT_EQ(2, browser()->tab_strip_model()->count());
285 EXPECT_EQ(GURL(chrome::kChromeUIVersionURL),
286 browser()->tab_strip_model()->GetWebContentsAt(0)->GetURL());
287 EXPECT_EQ(GURL("about:blank"),
288 browser()->tab_strip_model()->GetWebContentsAt(1)->GetURL());
289}
290
291// Test that browser windows are only closed if all browsers are ready to close
292// and that all beforeunload dialogs are shown again after a cancel.
293IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestMultipleWindows) {
294 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
295 browsers_.push_back(CreateBrowser(browser()->profile()));
296 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
297 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
298 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
299 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
300
301 // Cancel shutdown on the first beforeunload event.
302 {
303 RepeatedNotificationObserver cancel_observer(
304 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
305 chrome::CloseAllBrowsers();
306 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
307 cancel_observer.Wait();
308 }
309 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
310 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
311 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
312
313 // Cancel shutdown on the second beforeunload event.
314 {
315 RepeatedNotificationObserver cancel_observer(
316 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
317 chrome::CloseAllBrowsers();
318 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
319 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
320 cancel_observer.Wait();
321 }
322 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
323 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
324 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
325
326 // Allow shutdown for both beforeunload events.
327 RepeatedNotificationObserver close_observer(
328 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
329 chrome::CloseAllBrowsers();
330 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
331 close_observer.Wait();
332 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
333 EXPECT_TRUE(chrome::BrowserIterator().done());
334}
335
336// Test that tabs in the same window with a beforeunload event that hangs are
337// treated the same as the user accepting the close, but do not close the tab
338// early.
339IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
340 TestHangInBeforeUnloadMultipleTabs) {
341 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
342 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
343 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
344 AddBlankTabAndShow(browsers_[0]);
345 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
346 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
347 AddBlankTabAndShow(browsers_[0]);
348 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
349 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
350
351 RepeatedNotificationObserver cancel_observer(
352 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
353 chrome::CloseAllBrowsers();
354 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
355 cancel_observer.Wait();
356 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
357 // All tabs should still be open.
358 EXPECT_EQ(3, browsers_[0]->tab_strip_model()->count());
359
360 RepeatedNotificationObserver close_observer(
361 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
362 chrome::CloseAllBrowsers();
363 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
364 close_observer.Wait();
365 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
366 EXPECT_TRUE(chrome::BrowserIterator().done());
367}
368
369// Test that tabs in different windows with a beforeunload event that hangs are
370// treated the same as the user accepting the close, but do not close the tab
371// early.
372IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
373 TestHangInBeforeUnloadMultipleWindows) {
374 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
375 browsers_.push_back(CreateBrowser(browser()->profile()));
376 browsers_.push_back(CreateBrowser(browser()->profile()));
377 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
378 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
379 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
380 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
381 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
382 browsers_[2], embedded_test_server()->GetURL("/beforeunload_hang.html")));
383
384 RepeatedNotificationObserver cancel_observer(
385 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
386 chrome::CloseAllBrowsers();
387 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
388 cancel_observer.Wait();
389 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
390 // All windows should still be open.
391 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
392 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
393 EXPECT_EQ(1, browsers_[2]->tab_strip_model()->count());
394
395 RepeatedNotificationObserver close_observer(
396 chrome::NOTIFICATION_BROWSER_CLOSED, 3);
397 chrome::CloseAllBrowsers();
398 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
399 close_observer.Wait();
400 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
401 EXPECT_TRUE(chrome::BrowserIterator().done());
402}
403
404// Test that a window created during shutdown is closed.
405IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
406 TestAddWindowDuringShutdown) {
407 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
408 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
409 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
410
411 RepeatedNotificationObserver close_observer(
412 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
413 chrome::CloseAllBrowsers();
414 browsers_.push_back(CreateBrowser(browser()->profile()));
415 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
416 close_observer.Wait();
417 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
418 EXPECT_TRUE(chrome::BrowserIterator().done());
419}
420
421// Test that a window created during shutdown with a beforeunload handler can
422// cancel the shutdown.
423IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
424 TestAddWindowWithBeforeUnloadDuringShutdown) {
425 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
426 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
427 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
428
429 RepeatedNotificationObserver cancel_observer(
430 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
431 chrome::CloseAllBrowsers();
432 browsers_.push_back(CreateBrowser(browser()->profile()));
433 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
434 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
435 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
436 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
437 cancel_observer.Wait();
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 dialogs.
443 RepeatedNotificationObserver close_observer(
444 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
445 chrome::CloseAllBrowsers();
446 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
447 close_observer.Wait();
448 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
449 EXPECT_TRUE(chrome::BrowserIterator().done());
450}
451
452// Test that tabs added during shutdown are closed.
453IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
454 TestAddTabDuringShutdown) {
455 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
456 browsers_.push_back(CreateBrowser(browser()->profile()));
457 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
458 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
459 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
460 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
461
462 RepeatedNotificationObserver close_observer(
463 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
464 chrome::CloseAllBrowsers();
465 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
466 AddBlankTabAndShow(browsers_[0]);
467 AddBlankTabAndShow(browsers_[1]);
468 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
469 close_observer.Wait();
470 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
471 EXPECT_TRUE(chrome::BrowserIterator().done());
472}
473
474// Test that tabs created during shutdown with beforeunload handlers can cancel
475// the shutdown.
476IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
477 TestAddTabWithBeforeUnloadDuringShutdown) {
478 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
479 browsers_.push_back(CreateBrowser(browser()->profile()));
480 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
481 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
482 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
483 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
484 RepeatedNotificationObserver cancel_observer(
485 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
486 chrome::CloseAllBrowsers();
487 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
488 AddBlankTabAndShow(browsers_[0]);
489 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
490 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
491 AddBlankTabAndShow(browsers_[1]);
492 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
493 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
494 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
495 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
496 cancel_observer.Wait();
497 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
498 EXPECT_EQ(2, browsers_[0]->tab_strip_model()->count());
499 EXPECT_EQ(2, browsers_[1]->tab_strip_model()->count());
500
501 RepeatedNotificationObserver close_observer(
502 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
503 chrome::CloseAllBrowsers();
504 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
505 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
506
507 close_observer.Wait();
508 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
509 EXPECT_TRUE(chrome::BrowserIterator().done());
510}
511
512IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
513 TestCloseTabDuringShutdown) {
514 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
515 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
516 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
517 RepeatedNotificationObserver cancel_observer(
518 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
519 chrome::CloseAllBrowsers();
520
521 browsers_.push_back(CreateBrowser(browser()->profile()));
522 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
523 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
524 browsers_[1]->tab_strip_model()->CloseAllTabs();
525 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
526 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
527 cancel_observer.Wait();
528 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
529 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
530 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
531
532 RepeatedNotificationObserver close_observer(
533 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
534 chrome::CloseAllBrowsers();
535 browsers_[1]->tab_strip_model()->CloseAllTabs();
536 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
537 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
538
539 close_observer.Wait();
540 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
541 EXPECT_TRUE(chrome::BrowserIterator().done());
542}
543
544IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
545 TestOpenAndCloseWindowDuringShutdown) {
546 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
547 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
548 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
549 RepeatedNotificationObserver cancel_observer(
550 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
551 chrome::CloseAllBrowsers();
552
553 browsers_.push_back(CreateBrowser(browser()->profile()));
554 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
555 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
556 ASSERT_FALSE(browsers_[1]->ShouldCloseWindow());
557 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
558 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
559 cancel_observer.Wait();
560 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
561 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
562 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
563
564 RepeatedNotificationObserver close_observer(
565 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
566 chrome::CloseAllBrowsers();
567 ASSERT_FALSE(browsers_[1]->ShouldCloseWindow());
568 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
569 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
570
571 close_observer.Wait();
572 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
573 EXPECT_TRUE(chrome::BrowserIterator().done());
574}
575
576IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
577 TestCloseWindowDuringShutdown) {
578 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
579 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
580 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
581 browsers_.push_back(CreateBrowser(browser()->profile()));
582 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
583 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
584 RepeatedNotificationObserver cancel_observer(
585 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
586 chrome::CloseAllBrowsers();
587
588 ASSERT_FALSE(browsers_[0]->ShouldCloseWindow());
589 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
590 cancel_observer.Wait();
591 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
592 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
593 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
594
595 RepeatedNotificationObserver close_observer(
596 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
597 chrome::CloseAllBrowsers();
598 ASSERT_FALSE(browsers_[0]->ShouldCloseWindow());
599 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
600 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
601
602 close_observer.Wait();
603 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
604 EXPECT_TRUE(chrome::BrowserIterator().done());
605}
606
[email protected]edfca702013-08-16 08:58:14607// Test shutdown with a download in progress.
608IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestWithDownloads) {
609 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
610 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
611 content::TestNavigationObserver navigation_observer(
612 browser()->tab_strip_model()->GetActiveWebContents(), 1);
613 TestBrowserCloseManager::AttemptClose(
614 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE);
615 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
616 navigation_observer.Wait();
617 EXPECT_EQ(GURL(chrome::kChromeUIDownloadsURL),
618 browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
619
620 RepeatedNotificationObserver close_observer(
621 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
622
623 TestBrowserCloseManager::AttemptClose(
624 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
625 close_observer.Wait();
626 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
627 EXPECT_TRUE(chrome::BrowserIterator().done());
628}
629
630// Test shutdown with a download in progress from one profile, where the only
631// open windows are for another profile.
632IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
633 TestWithDownloadsFromDifferentProfiles) {
634 ProfileManager* profile_manager = g_browser_process->profile_manager();
635 base::FilePath path =
636 profile_manager->user_data_dir().AppendASCII("test_profile");
637 if (!base::PathExists(path))
638 ASSERT_TRUE(file_util::CreateDirectory(path));
639 Profile* other_profile =
640 Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS);
641 profile_manager->RegisterTestingProfile(other_profile, true, false);
642 Browser* other_profile_browser = CreateBrowser(other_profile);
643
644 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
645 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
646 {
647 RepeatedNotificationObserver close_observer(
648 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
649 browser()->window()->Close();
650 close_observer.Wait();
651 }
652
653 // When the shutdown is cancelled, the downloads page should be opened in a
654 // browser for that profile. Because there are no browsers for that profile, a
655 // new browser should be opened.
656 ui_test_utils::BrowserAddedObserver new_browser_observer;
657 TestBrowserCloseManager::AttemptClose(
658 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE);
659 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
660 Browser* opened_browser = new_browser_observer.WaitForSingleNewBrowser();
661 EXPECT_EQ(
662 GURL(chrome::kChromeUIDownloadsURL),
663 opened_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
664 EXPECT_EQ(GURL("about:blank"),
665 other_profile_browser->tab_strip_model()->GetActiveWebContents()
666 ->GetURL());
667
668 RepeatedNotificationObserver close_observer(
669 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
670 TestBrowserCloseManager::AttemptClose(
671 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
672 close_observer.Wait();
673 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
674 EXPECT_TRUE(chrome::BrowserIterator().done());
675}
676
677// Test shutdown with downloads in progress and beforeunload handlers.
678IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
679 TestBeforeUnloadAndDownloads) {
680 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
681 ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
682 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
683 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
684
685 content::WindowedNotificationObserver cancel_observer(
686 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED,
687 content::NotificationService::AllSources());
688 TestBrowserCloseManager::AttemptClose(
689 TestBrowserCloseManager::USER_CHOICE_USER_CANCELS_CLOSE);
690 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
691 cancel_observer.Wait();
692 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
693
694 RepeatedNotificationObserver close_observer(
695 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
696 TestBrowserCloseManager::AttemptClose(
697 TestBrowserCloseManager::USER_CHOICE_USER_ALLOWS_CLOSE);
698 close_observer.Wait();
699 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
700 EXPECT_TRUE(chrome::BrowserIterator().done());
701}
702
[email protected]2e9d79f2013-08-16 05:45:56703INSTANTIATE_TEST_CASE_P(BrowserCloseManagerBrowserTest,
704 BrowserCloseManagerBrowserTest,
705 testing::Bool());