blob: 34c97742bb9eb434ec469bbd7d7fbf06c1b3bf29 [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"
8#include "chrome/browser/browser_shutdown.h"
9#include "chrome/browser/chrome_notification_types.h"
10#include "chrome/browser/lifetime/application_lifetime.h"
11#include "chrome/browser/lifetime/browser_close_manager.h"
12#include "chrome/browser/prefs/session_startup_pref.h"
13#include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h"
14#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
15#include "chrome/browser/ui/browser.h"
16#include "chrome/browser/ui/browser_iterator.h"
17#include "chrome/browser/ui/tabs/tab_strip_model.h"
18#include "chrome/common/chrome_switches.h"
19#include "chrome/common/url_constants.h"
20#include "chrome/test/base/in_process_browser_test.h"
21#include "chrome/test/base/ui_test_utils.h"
22#include "content/public/browser/notification_service.h"
23#include "content/public/browser/web_contents.h"
24#include "content/public/test/test_navigation_observer.h"
25#include "net/test/embedded_test_server/embedded_test_server.h"
26
27namespace {
28
29class AppModalDialogObserver {
30 public:
31 AppModalDialogObserver() {}
32
33 void Start() {
34 observer_.reset(new content::WindowedNotificationObserver(
35 chrome::NOTIFICATION_APP_MODAL_DIALOG_SHOWN,
36 content::NotificationService::AllSources()));
37 }
38
39 void AcceptClose() {
40 NativeAppModalDialog* dialog = GetNextDialog();
41 ASSERT_TRUE(dialog);
42 dialog->AcceptAppModalDialog();
43 }
44
45 void CancelClose() {
46 NativeAppModalDialog* dialog = GetNextDialog();
47 ASSERT_TRUE(dialog);
48 dialog->CancelAppModalDialog();
49 }
50
51 private:
52 NativeAppModalDialog* GetNextDialog() {
53 DCHECK(observer_);
54 observer_->Wait();
55 if (observer_->source() == content::NotificationService::AllSources())
56 return NULL;
57
58 AppModalDialog* dialog =
59 content::Source<AppModalDialog>(observer_->source()).ptr();
60 EXPECT_TRUE(dialog->IsJavaScriptModalDialog());
61 JavaScriptAppModalDialog* js_dialog =
62 static_cast<JavaScriptAppModalDialog*>(dialog);
63 observer_.reset(new content::WindowedNotificationObserver(
64 chrome::NOTIFICATION_APP_MODAL_DIALOG_SHOWN,
65 content::NotificationService::AllSources()));
66 return js_dialog->native_dialog();
67 }
68
69 scoped_ptr<content::WindowedNotificationObserver> observer_;
70
71 DISALLOW_COPY_AND_ASSIGN(AppModalDialogObserver);
72};
73
74class RepeatedNotificationObserver : public content::NotificationObserver {
75 public:
76 explicit RepeatedNotificationObserver(int type, int count)
77 : num_outstanding_(count), running_(false) {
78 registrar_.Add(this, type, content::NotificationService::AllSources());
79 }
80
81 virtual void Observe(int type,
82 const content::NotificationSource& source,
83 const content::NotificationDetails& details) OVERRIDE {
84 ASSERT_GT(num_outstanding_, 0);
85 if (!--num_outstanding_ && running_) {
86 content::BrowserThread::PostTask(
87 content::BrowserThread::UI, FROM_HERE, run_loop_.QuitClosure());
88 }
89 }
90
91 void Wait() {
92 if (num_outstanding_ <= 0)
93 return;
94
95 running_ = true;
96 run_loop_.Run();
97 running_ = false;
98 }
99
100 private:
101 int num_outstanding_;
102 content::NotificationRegistrar registrar_;
103 bool running_;
104 base::RunLoop run_loop_;
105
106 DISALLOW_COPY_AND_ASSIGN(RepeatedNotificationObserver);
107};
108
109} // namespace
110
111class BrowserCloseManagerBrowserTest
112 : public InProcessBrowserTest,
113 public testing::WithParamInterface<bool> {
114 protected:
115 virtual void SetUpOnMainThread() OVERRIDE {
116 InProcessBrowserTest::SetUpOnMainThread();
117 SessionStartupPref::SetStartupPref(
118 browser()->profile(), SessionStartupPref(SessionStartupPref::LAST));
119 browsers_.push_back(browser());
120 dialogs_.Start();
121 }
122
123 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
124 command_line->AppendSwitch(switches::kEnableBatchedShutdown);
125 if (GetParam())
126 command_line->AppendSwitch(switches::kEnableFastUnload);
127 }
128
129 std::vector<Browser*> browsers_;
130 AppModalDialogObserver dialogs_;
131};
132
133IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestSingleTabShutdown) {
134 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
135 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
136 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
137 RepeatedNotificationObserver cancel_observer(
138 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
139 chrome::CloseAllBrowsers();
140 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
141 cancel_observer.Wait();
142 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
143 EXPECT_EQ(1, browser()->tab_strip_model()->count());
144
145 RepeatedNotificationObserver close_observer(
146 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
147 chrome::CloseAllBrowsers();
148 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
149 close_observer.Wait();
150 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
151 EXPECT_TRUE(chrome::BrowserIterator().done());
152}
153
154IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
155 TestShutdownMoreThanOnce) {
156 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
157 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
158 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
159 RepeatedNotificationObserver cancel_observer(
160 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
161 chrome::CloseAllBrowsers();
162 chrome::CloseAllBrowsers();
163 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
164 cancel_observer.Wait();
165 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
166 EXPECT_EQ(1, browser()->tab_strip_model()->count());
167
168 RepeatedNotificationObserver close_observer(
169 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
170 chrome::CloseAllBrowsers();
171 chrome::CloseAllBrowsers();
172 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
173 close_observer.Wait();
174 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
175 EXPECT_TRUE(chrome::BrowserIterator().done());
176}
177
178IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, PRE_TestSessionRestore) {
179 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
180 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
181 browser(), embedded_test_server()->GetURL("/beforeunload.html")));
182 AddBlankTabAndShow(browser());
183 ASSERT_NO_FATAL_FAILURE(
184 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL)));
185 RepeatedNotificationObserver cancel_observer(
186 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
187 chrome::CloseAllBrowsers();
188 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
189 cancel_observer.Wait();
190 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
191
192 browser()->tab_strip_model()
193 ->CloseWebContentsAt(1, TabStripModel::CLOSE_USER_GESTURE);
194 content::TestNavigationObserver navigation_observer(
195 browser()->tab_strip_model()->GetActiveWebContents(), 1);
196 ASSERT_NO_FATAL_FAILURE(
197 NavigateToURLWithDisposition(browser(),
198 GURL(chrome::kChromeUIVersionURL),
199 CURRENT_TAB,
200 ui_test_utils::BROWSER_TEST_NONE));
201 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
202 navigation_observer.Wait();
203
204 RepeatedNotificationObserver close_observer(
205 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
206 chrome::CloseAllBrowsers();
207 close_observer.Wait();
208 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
209 EXPECT_TRUE(chrome::BrowserIterator().done());
210}
211
212// Test that the tab closed after the aborted shutdown attempt is not re-opened
213// when restoring the session.
214IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestSessionRestore) {
215 // The testing framework launches Chrome with about:blank as args.
216 EXPECT_EQ(2, browser()->tab_strip_model()->count());
217 EXPECT_EQ(GURL(chrome::kChromeUIVersionURL),
218 browser()->tab_strip_model()->GetWebContentsAt(0)->GetURL());
219 EXPECT_EQ(GURL("about:blank"),
220 browser()->tab_strip_model()->GetWebContentsAt(1)->GetURL());
221}
222
223// Test that browser windows are only closed if all browsers are ready to close
224// and that all beforeunload dialogs are shown again after a cancel.
225IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestMultipleWindows) {
226 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
227 browsers_.push_back(CreateBrowser(browser()->profile()));
228 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
229 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
230 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
231 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
232
233 // Cancel shutdown on the first beforeunload event.
234 {
235 RepeatedNotificationObserver cancel_observer(
236 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
237 chrome::CloseAllBrowsers();
238 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
239 cancel_observer.Wait();
240 }
241 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
242 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
243 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
244
245 // Cancel shutdown on the second beforeunload event.
246 {
247 RepeatedNotificationObserver cancel_observer(
248 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
249 chrome::CloseAllBrowsers();
250 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
251 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
252 cancel_observer.Wait();
253 }
254 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
255 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
256 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
257
258 // Allow shutdown for both beforeunload events.
259 RepeatedNotificationObserver close_observer(
260 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
261 chrome::CloseAllBrowsers();
262 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
263 close_observer.Wait();
264 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
265 EXPECT_TRUE(chrome::BrowserIterator().done());
266}
267
268// Test that tabs in the same window with a beforeunload event that hangs are
269// treated the same as the user accepting the close, but do not close the tab
270// early.
271IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
272 TestHangInBeforeUnloadMultipleTabs) {
273 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
274 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
275 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
276 AddBlankTabAndShow(browsers_[0]);
277 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
278 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
279 AddBlankTabAndShow(browsers_[0]);
280 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
281 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
282
283 RepeatedNotificationObserver cancel_observer(
284 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
285 chrome::CloseAllBrowsers();
286 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
287 cancel_observer.Wait();
288 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
289 // All tabs should still be open.
290 EXPECT_EQ(3, browsers_[0]->tab_strip_model()->count());
291
292 RepeatedNotificationObserver close_observer(
293 chrome::NOTIFICATION_BROWSER_CLOSED, 1);
294 chrome::CloseAllBrowsers();
295 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
296 close_observer.Wait();
297 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
298 EXPECT_TRUE(chrome::BrowserIterator().done());
299}
300
301// Test that tabs in different windows with a beforeunload event that hangs are
302// treated the same as the user accepting the close, but do not close the tab
303// early.
304IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
305 TestHangInBeforeUnloadMultipleWindows) {
306 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
307 browsers_.push_back(CreateBrowser(browser()->profile()));
308 browsers_.push_back(CreateBrowser(browser()->profile()));
309 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
310 browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
311 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
312 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
313 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
314 browsers_[2], embedded_test_server()->GetURL("/beforeunload_hang.html")));
315
316 RepeatedNotificationObserver cancel_observer(
317 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
318 chrome::CloseAllBrowsers();
319 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
320 cancel_observer.Wait();
321 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
322 // All windows should still be open.
323 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
324 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
325 EXPECT_EQ(1, browsers_[2]->tab_strip_model()->count());
326
327 RepeatedNotificationObserver close_observer(
328 chrome::NOTIFICATION_BROWSER_CLOSED, 3);
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 a window created during shutdown is closed.
337IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
338 TestAddWindowDuringShutdown) {
339 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
340 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
341 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
342
343 RepeatedNotificationObserver close_observer(
344 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
345 chrome::CloseAllBrowsers();
346 browsers_.push_back(CreateBrowser(browser()->profile()));
347 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
348 close_observer.Wait();
349 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
350 EXPECT_TRUE(chrome::BrowserIterator().done());
351}
352
353// Test that a window created during shutdown with a beforeunload handler can
354// cancel the shutdown.
355IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
356 TestAddWindowWithBeforeUnloadDuringShutdown) {
357 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
358 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
359 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
360
361 RepeatedNotificationObserver cancel_observer(
362 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
363 chrome::CloseAllBrowsers();
364 browsers_.push_back(CreateBrowser(browser()->profile()));
365 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
366 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
367 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
368 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
369 cancel_observer.Wait();
370 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
371 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
372 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
373
374 // Allow shutdown for both beforeunload dialogs.
375 RepeatedNotificationObserver close_observer(
376 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
377 chrome::CloseAllBrowsers();
378 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
379 close_observer.Wait();
380 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
381 EXPECT_TRUE(chrome::BrowserIterator().done());
382}
383
384// Test that tabs added during shutdown are closed.
385IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
386 TestAddTabDuringShutdown) {
387 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
388 browsers_.push_back(CreateBrowser(browser()->profile()));
389 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
390 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
391 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
392 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
393
394 RepeatedNotificationObserver close_observer(
395 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
396 chrome::CloseAllBrowsers();
397 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
398 AddBlankTabAndShow(browsers_[0]);
399 AddBlankTabAndShow(browsers_[1]);
400 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
401 close_observer.Wait();
402 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
403 EXPECT_TRUE(chrome::BrowserIterator().done());
404}
405
406// Test that tabs created during shutdown with beforeunload handlers can cancel
407// the shutdown.
408IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
409 TestAddTabWithBeforeUnloadDuringShutdown) {
410 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
411 browsers_.push_back(CreateBrowser(browser()->profile()));
412 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
413 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
414 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
415 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
416 RepeatedNotificationObserver cancel_observer(
417 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
418 chrome::CloseAllBrowsers();
419 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
420 AddBlankTabAndShow(browsers_[0]);
421 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
422 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
423 AddBlankTabAndShow(browsers_[1]);
424 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
425 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
426 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
427 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
428 cancel_observer.Wait();
429 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
430 EXPECT_EQ(2, browsers_[0]->tab_strip_model()->count());
431 EXPECT_EQ(2, browsers_[1]->tab_strip_model()->count());
432
433 RepeatedNotificationObserver close_observer(
434 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
435 chrome::CloseAllBrowsers();
436 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
437 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
438
439 close_observer.Wait();
440 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
441 EXPECT_TRUE(chrome::BrowserIterator().done());
442}
443
444IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
445 TestCloseTabDuringShutdown) {
446 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
447 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
448 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
449 RepeatedNotificationObserver cancel_observer(
450 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
451 chrome::CloseAllBrowsers();
452
453 browsers_.push_back(CreateBrowser(browser()->profile()));
454 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
455 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
456 browsers_[1]->tab_strip_model()->CloseAllTabs();
457 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
458 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
459 cancel_observer.Wait();
460 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
461 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
462 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
463
464 RepeatedNotificationObserver close_observer(
465 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
466 chrome::CloseAllBrowsers();
467 browsers_[1]->tab_strip_model()->CloseAllTabs();
468 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
469 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
470
471 close_observer.Wait();
472 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
473 EXPECT_TRUE(chrome::BrowserIterator().done());
474}
475
476IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
477 TestOpenAndCloseWindowDuringShutdown) {
478 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
479 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
480 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
481 RepeatedNotificationObserver cancel_observer(
482 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
483 chrome::CloseAllBrowsers();
484
485 browsers_.push_back(CreateBrowser(browser()->profile()));
486 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
487 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
488 ASSERT_FALSE(browsers_[1]->ShouldCloseWindow());
489 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
490 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
491 cancel_observer.Wait();
492 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
493 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
494 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
495
496 RepeatedNotificationObserver close_observer(
497 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
498 chrome::CloseAllBrowsers();
499 ASSERT_FALSE(browsers_[1]->ShouldCloseWindow());
500 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
501 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
502
503 close_observer.Wait();
504 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
505 EXPECT_TRUE(chrome::BrowserIterator().done());
506}
507
508IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
509 TestCloseWindowDuringShutdown) {
510 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
511 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
512 browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
513 browsers_.push_back(CreateBrowser(browser()->profile()));
514 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
515 browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
516 RepeatedNotificationObserver cancel_observer(
517 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
518 chrome::CloseAllBrowsers();
519
520 ASSERT_FALSE(browsers_[0]->ShouldCloseWindow());
521 ASSERT_NO_FATAL_FAILURE(dialogs_.CancelClose());
522 cancel_observer.Wait();
523 EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
524 EXPECT_EQ(1, browsers_[0]->tab_strip_model()->count());
525 EXPECT_EQ(1, browsers_[1]->tab_strip_model()->count());
526
527 RepeatedNotificationObserver close_observer(
528 chrome::NOTIFICATION_BROWSER_CLOSED, 2);
529 chrome::CloseAllBrowsers();
530 ASSERT_FALSE(browsers_[0]->ShouldCloseWindow());
531 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
532 ASSERT_NO_FATAL_FAILURE(dialogs_.AcceptClose());
533
534 close_observer.Wait();
535 EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
536 EXPECT_TRUE(chrome::BrowserIterator().done());
537}
538
539INSTANTIATE_TEST_CASE_P(BrowserCloseManagerBrowserTest,
540 BrowserCloseManagerBrowserTest,
541 testing::Bool());