OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #if defined(OS_POSIX) | 5 #if defined(OS_POSIX) |
6 #include <signal.h> | 6 #include <signal.h> |
7 #endif | 7 #endif |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
13 #include "build/build_config.h" | 13 #include "build/build_config.h" |
14 #include "chrome/browser/chrome_notification_types.h" | 14 #include "chrome/browser/chrome_notification_types.h" |
15 #include "chrome/browser/net/url_request_mock_util.h" | 15 #include "chrome/browser/net/url_request_mock_util.h" |
16 #include "chrome/browser/ui/browser.h" | 16 #include "chrome/browser/ui/browser.h" |
17 #include "chrome/browser/ui/browser_commands.h" | 17 #include "chrome/browser/ui/browser_commands.h" |
18 #include "chrome/browser/ui/browser_list.h" | 18 #include "chrome/browser/ui/browser_list.h" |
19 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 19 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
20 #include "chrome/common/chrome_switches.h" | 20 #include "chrome/common/chrome_switches.h" |
21 #include "chrome/test/base/in_process_browser_test.h" | 21 #include "chrome/test/base/in_process_browser_test.h" |
22 #include "chrome/test/base/ui_test_utils.h" | 22 #include "chrome/test/base/ui_test_utils.h" |
23 #include "components/app_modal/javascript_app_modal_dialog.h" | 23 #include "components/app_modal/javascript_app_modal_dialog.h" |
24 #include "components/app_modal/native_app_modal_dialog.h" | 24 #include "components/app_modal/native_app_modal_dialog.h" |
25 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
26 #include "content/public/browser/notification_service.h" | 26 #include "content/public/browser/notification_service.h" |
| 27 #include "content/public/browser/render_frame_host.h" |
27 #include "content/public/browser/web_contents.h" | 28 #include "content/public/browser/web_contents.h" |
28 #include "content/public/common/content_switches.h" | 29 #include "content/public/common/content_switches.h" |
29 #include "content/public/test/browser_test_utils.h" | 30 #include "content/public/test/browser_test_utils.h" |
30 #include "net/test/embedded_test_server/embedded_test_server.h" | 31 #include "net/test/embedded_test_server/embedded_test_server.h" |
31 #include "net/test/url_request/url_request_mock_http_job.h" | 32 #include "net/test/url_request/url_request_mock_http_job.h" |
32 #include "net/url_request/url_request_test_util.h" | 33 #include "net/url_request/url_request_test_util.h" |
33 | 34 |
34 #if defined(OS_WIN) | 35 #if defined(OS_WIN) |
35 // For version specific disabled tests below (http://crbug.com/267597). | 36 // For version specific disabled tests below (http://crbug.com/267597). |
36 #include "base/win/windows_version.h" | 37 #include "base/win/windows_version.h" |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 // Tests closing the browser on a page with an unload listener registered. | 272 // Tests closing the browser on a page with an unload listener registered. |
272 // Test marked as flaky in http://crbug.com/51698 | 273 // Test marked as flaky in http://crbug.com/51698 |
273 IN_PROC_BROWSER_TEST_F(UnloadTest, DISABLED_BrowserCloseUnload) { | 274 IN_PROC_BROWSER_TEST_F(UnloadTest, DISABLED_BrowserCloseUnload) { |
274 LoadUrlAndQuitBrowser(UNLOAD_HTML, "unload"); | 275 LoadUrlAndQuitBrowser(UNLOAD_HTML, "unload"); |
275 } | 276 } |
276 | 277 |
277 // Tests closing the browser with a beforeunload handler and clicking | 278 // Tests closing the browser with a beforeunload handler and clicking |
278 // OK in the beforeunload confirm dialog. | 279 // OK in the beforeunload confirm dialog. |
279 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseBeforeUnloadOK) { | 280 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseBeforeUnloadOK) { |
280 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 281 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 282 // JavaScript onbeforeunload dialogs require a user gesture. |
| 283 for (auto* frame : |
| 284 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 285 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 286 } |
281 | 287 |
282 content::WindowedNotificationObserver window_observer( | 288 content::WindowedNotificationObserver window_observer( |
283 chrome::NOTIFICATION_BROWSER_CLOSED, | 289 chrome::NOTIFICATION_BROWSER_CLOSED, |
284 content::NotificationService::AllSources()); | 290 content::NotificationService::AllSources()); |
285 chrome::CloseWindow(browser()); | 291 chrome::CloseWindow(browser()); |
286 ClickModalDialogButton(true); | 292 ClickModalDialogButton(true); |
287 window_observer.Wait(); | 293 window_observer.Wait(); |
288 } | 294 } |
289 | 295 |
290 // Tests closing the browser with a beforeunload handler and clicking | 296 // Tests closing the browser with a beforeunload handler and clicking |
291 // CANCEL in the beforeunload confirm dialog. | 297 // CANCEL in the beforeunload confirm dialog. |
292 // If this test flakes, reopen http://crbug.com/123110 | 298 // If this test flakes, reopen http://crbug.com/123110 |
293 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseBeforeUnloadCancel) { | 299 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseBeforeUnloadCancel) { |
294 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 300 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 301 // JavaScript onbeforeunload dialogs require a user gesture. |
| 302 for (auto* frame : |
| 303 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 304 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 305 } |
295 chrome::CloseWindow(browser()); | 306 chrome::CloseWindow(browser()); |
296 | 307 |
297 // We wait for the title to change after cancelling the closure of browser | 308 // We wait for the title to change after cancelling the closure of browser |
298 // window, to ensure that in-flight IPCs from the renderer reach the browser. | 309 // window, to ensure that in-flight IPCs from the renderer reach the browser. |
299 // Otherwise the browser won't put up the beforeunload dialog because it's | 310 // Otherwise the browser won't put up the beforeunload dialog because it's |
300 // waiting for an ack from the renderer. | 311 // waiting for an ack from the renderer. |
301 base::string16 expected_title = base::ASCIIToUTF16("cancelled"); | 312 base::string16 expected_title = base::ASCIIToUTF16("cancelled"); |
302 content::TitleWatcher title_watcher( | 313 content::TitleWatcher title_watcher( |
303 browser()->tab_strip_model()->GetActiveWebContents(), expected_title); | 314 browser()->tab_strip_model()->GetActiveWebContents(), expected_title); |
304 ClickModalDialogButton(false); | 315 ClickModalDialogButton(false); |
(...skipping 25 matching lines...) Expand all Loading... |
330 false); | 341 false); |
331 window_observer.Wait(); | 342 window_observer.Wait(); |
332 EXPECT_EQ(1, unload_results.get_successes()); | 343 EXPECT_EQ(1, unload_results.get_successes()); |
333 EXPECT_EQ(0, unload_results.get_aborts()); | 344 EXPECT_EQ(0, unload_results.get_aborts()); |
334 } | 345 } |
335 | 346 |
336 // Tests closing the browser by BrowserList::CloseAllBrowsersWithProfile, with a | 347 // Tests closing the browser by BrowserList::CloseAllBrowsersWithProfile, with a |
337 // beforeunload handler and clicking Leave in the beforeunload confirm dialog. | 348 // beforeunload handler and clicking Leave in the beforeunload confirm dialog. |
338 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListCloseBeforeUnloadOK) { | 349 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListCloseBeforeUnloadOK) { |
339 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 350 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 351 // JavaScript onbeforeunload dialogs require a user gesture. |
| 352 for (auto* frame : |
| 353 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 354 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 355 } |
340 | 356 |
341 content::WindowedNotificationObserver window_observer( | 357 content::WindowedNotificationObserver window_observer( |
342 chrome::NOTIFICATION_BROWSER_CLOSED, | 358 chrome::NOTIFICATION_BROWSER_CLOSED, |
343 content::NotificationService::AllSources()); | 359 content::NotificationService::AllSources()); |
344 UnloadResults unload_results; | 360 UnloadResults unload_results; |
345 BrowserList::CloseAllBrowsersWithProfile( | 361 BrowserList::CloseAllBrowsersWithProfile( |
346 browser()->profile(), | 362 browser()->profile(), |
347 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 363 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
348 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 364 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
349 false); | 365 false); |
350 ClickModalDialogButton(true); | 366 ClickModalDialogButton(true); |
351 window_observer.Wait(); | 367 window_observer.Wait(); |
352 EXPECT_EQ(1, unload_results.get_successes()); | 368 EXPECT_EQ(1, unload_results.get_successes()); |
353 EXPECT_EQ(0, unload_results.get_aborts()); | 369 EXPECT_EQ(0, unload_results.get_aborts()); |
354 } | 370 } |
355 | 371 |
356 // Tests closing the browser by BrowserList::CloseAllBrowsersWithProfile, with a | 372 // Tests closing the browser by BrowserList::CloseAllBrowsersWithProfile, with a |
357 // beforeunload handler and clicking Stay in the beforeunload confirm dialog. | 373 // beforeunload handler and clicking Stay in the beforeunload confirm dialog. |
358 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListCloseBeforeUnloadCancel) { | 374 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListCloseBeforeUnloadCancel) { |
359 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 375 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 376 // JavaScript onbeforeunload dialogs require a user gesture. |
| 377 for (auto* frame : |
| 378 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 379 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 380 } |
360 | 381 |
361 UnloadResults unload_results; | 382 UnloadResults unload_results; |
362 BrowserList::CloseAllBrowsersWithProfile( | 383 BrowserList::CloseAllBrowsersWithProfile( |
363 browser()->profile(), | 384 browser()->profile(), |
364 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 385 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
365 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 386 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
366 false); | 387 false); |
367 | 388 |
368 // We wait for the title to change after cancelling the closure of browser | 389 // We wait for the title to change after cancelling the closure of browser |
369 // window, to ensure that in-flight IPCs from the renderer reach the browser. | 390 // window, to ensure that in-flight IPCs from the renderer reach the browser. |
(...skipping 15 matching lines...) Expand all Loading... |
385 content::NotificationService::AllSources()); | 406 content::NotificationService::AllSources()); |
386 chrome::CloseWindow(browser()); | 407 chrome::CloseWindow(browser()); |
387 ClickModalDialogButton(true); | 408 ClickModalDialogButton(true); |
388 window_observer.Wait(); | 409 window_observer.Wait(); |
389 } | 410 } |
390 | 411 |
391 // Tests double calls to BrowserList::CloseAllBrowsersWithProfile, with a | 412 // Tests double calls to BrowserList::CloseAllBrowsersWithProfile, with a |
392 // beforeunload handler and clicking Leave in the beforeunload confirm dialog. | 413 // beforeunload handler and clicking Leave in the beforeunload confirm dialog. |
393 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListDoubleCloseBeforeUnloadOK) { | 414 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListDoubleCloseBeforeUnloadOK) { |
394 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 415 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 416 // JavaScript onbeforeunload dialogs require a user gesture. |
| 417 for (auto* frame : |
| 418 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 419 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 420 } |
395 | 421 |
396 content::WindowedNotificationObserver window_observer( | 422 content::WindowedNotificationObserver window_observer( |
397 chrome::NOTIFICATION_BROWSER_CLOSED, | 423 chrome::NOTIFICATION_BROWSER_CLOSED, |
398 content::NotificationService::AllSources()); | 424 content::NotificationService::AllSources()); |
399 UnloadResults unload_results; | 425 UnloadResults unload_results; |
400 BrowserList::CloseAllBrowsersWithProfile( | 426 BrowserList::CloseAllBrowsersWithProfile( |
401 browser()->profile(), | 427 browser()->profile(), |
402 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 428 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
403 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 429 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
404 false); | 430 false); |
405 BrowserList::CloseAllBrowsersWithProfile( | 431 BrowserList::CloseAllBrowsersWithProfile( |
406 browser()->profile(), | 432 browser()->profile(), |
407 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 433 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
408 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 434 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
409 false); | 435 false); |
410 ClickModalDialogButton(true); | 436 ClickModalDialogButton(true); |
411 window_observer.Wait(); | 437 window_observer.Wait(); |
412 EXPECT_EQ(1, unload_results.get_successes()); | 438 EXPECT_EQ(1, unload_results.get_successes()); |
413 EXPECT_EQ(0, unload_results.get_aborts()); | 439 EXPECT_EQ(0, unload_results.get_aborts()); |
414 } | 440 } |
415 | 441 |
416 // Tests double calls to BrowserList::CloseAllBrowsersWithProfile, with a | 442 // Tests double calls to BrowserList::CloseAllBrowsersWithProfile, with a |
417 // beforeunload handler and clicking Stay in the beforeunload confirm dialog. | 443 // beforeunload handler and clicking Stay in the beforeunload confirm dialog. |
418 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListDoubleCloseBeforeUnloadCancel) { | 444 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListDoubleCloseBeforeUnloadCancel) { |
419 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 445 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 446 // JavaScript onbeforeunload dialogs require a user gesture. |
| 447 for (auto* frame : |
| 448 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 449 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 450 } |
420 | 451 |
421 UnloadResults unload_results; | 452 UnloadResults unload_results; |
422 BrowserList::CloseAllBrowsersWithProfile( | 453 BrowserList::CloseAllBrowsersWithProfile( |
423 browser()->profile(), | 454 browser()->profile(), |
424 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 455 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
425 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 456 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
426 false); | 457 false); |
427 BrowserList::CloseAllBrowsersWithProfile( | 458 BrowserList::CloseAllBrowsersWithProfile( |
428 browser()->profile(), | 459 browser()->profile(), |
429 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 460 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
(...skipping 21 matching lines...) Expand all Loading... |
451 chrome::CloseWindow(browser()); | 482 chrome::CloseWindow(browser()); |
452 ClickModalDialogButton(true); | 483 ClickModalDialogButton(true); |
453 window_observer.Wait(); | 484 window_observer.Wait(); |
454 } | 485 } |
455 | 486 |
456 // Tests terminating the browser with a beforeunload handler. | 487 // Tests terminating the browser with a beforeunload handler. |
457 // Currently only ChromeOS shuts down gracefully. | 488 // Currently only ChromeOS shuts down gracefully. |
458 #if defined(OS_CHROMEOS) | 489 #if defined(OS_CHROMEOS) |
459 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserTerminateBeforeUnload) { | 490 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserTerminateBeforeUnload) { |
460 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 491 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 492 // JavaScript onbeforeunload dialogs require a user gesture. |
| 493 for (auto* frame : |
| 494 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 495 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 496 } |
461 EXPECT_EQ(kill(base::GetCurrentProcessHandle(), SIGTERM), 0); | 497 EXPECT_EQ(kill(base::GetCurrentProcessHandle(), SIGTERM), 0); |
462 } | 498 } |
463 #endif | 499 #endif |
464 | 500 |
465 // Tests closing the browser and clicking OK in the beforeunload confirm dialog | 501 // Tests closing the browser and clicking OK in the beforeunload confirm dialog |
466 // if an inner frame has the focus. | 502 // if an inner frame has the focus. |
467 // If this flakes, use http://crbug.com/32615 and http://crbug.com/45675 | 503 // If this flakes, use http://crbug.com/32615 and http://crbug.com/45675 |
468 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseWithInnerFocusedFrame) { | 504 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseWithInnerFocusedFrame) { |
469 NavigateToDataURL(INNER_FRAME_WITH_FOCUS_HTML, "innerframewithfocus"); | 505 NavigateToDataURL(INNER_FRAME_WITH_FOCUS_HTML, "innerframewithfocus"); |
| 506 // JavaScript onbeforeunload dialogs require a user gesture. |
| 507 for (auto* frame : |
| 508 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 509 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 510 } |
470 | 511 |
471 content::WindowedNotificationObserver window_observer( | 512 content::WindowedNotificationObserver window_observer( |
472 chrome::NOTIFICATION_BROWSER_CLOSED, | 513 chrome::NOTIFICATION_BROWSER_CLOSED, |
473 content::NotificationService::AllSources()); | 514 content::NotificationService::AllSources()); |
474 chrome::CloseWindow(browser()); | 515 chrome::CloseWindow(browser()); |
475 ClickModalDialogButton(true); | 516 ClickModalDialogButton(true); |
476 window_observer.Wait(); | 517 window_observer.Wait(); |
477 } | 518 } |
478 | 519 |
479 // Tests closing the browser with a beforeunload handler that takes forever | 520 // Tests closing the browser with a beforeunload handler that takes forever |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
588 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 629 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
589 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 630 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
590 true); | 631 true); |
591 window_observer.Wait(); | 632 window_observer.Wait(); |
592 EXPECT_EQ(1, unload_results.get_successes()); | 633 EXPECT_EQ(1, unload_results.get_successes()); |
593 EXPECT_EQ(0, unload_results.get_aborts()); | 634 EXPECT_EQ(0, unload_results.get_aborts()); |
594 } | 635 } |
595 | 636 |
596 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListForceCloseWithBeforeUnload) { | 637 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListForceCloseWithBeforeUnload) { |
597 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 638 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 639 // JavaScript onbeforeunload dialogs require a user gesture. |
| 640 for (auto* frame : |
| 641 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 642 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 643 } |
598 | 644 |
599 content::WindowedNotificationObserver window_observer( | 645 content::WindowedNotificationObserver window_observer( |
600 chrome::NOTIFICATION_BROWSER_CLOSED, | 646 chrome::NOTIFICATION_BROWSER_CLOSED, |
601 content::NotificationService::AllSources()); | 647 content::NotificationService::AllSources()); |
602 UnloadResults unload_results; | 648 UnloadResults unload_results; |
603 BrowserList::CloseAllBrowsersWithProfile( | 649 BrowserList::CloseAllBrowsersWithProfile( |
604 browser()->profile(), | 650 browser()->profile(), |
605 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 651 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
606 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 652 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
607 true); | 653 true); |
608 window_observer.Wait(); | 654 window_observer.Wait(); |
609 EXPECT_EQ(1, unload_results.get_successes()); | 655 EXPECT_EQ(1, unload_results.get_successes()); |
610 EXPECT_EQ(0, unload_results.get_aborts()); | 656 EXPECT_EQ(0, unload_results.get_aborts()); |
611 } | 657 } |
612 | 658 |
613 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListForceCloseAfterNormalClose) { | 659 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserListForceCloseAfterNormalClose) { |
614 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 660 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 661 // JavaScript onbeforeunload dialogs require a user gesture. |
| 662 for (auto* frame : |
| 663 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 664 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 665 } |
615 | 666 |
616 content::WindowedNotificationObserver window_observer( | 667 content::WindowedNotificationObserver window_observer( |
617 chrome::NOTIFICATION_BROWSER_CLOSED, | 668 chrome::NOTIFICATION_BROWSER_CLOSED, |
618 content::NotificationService::AllSources()); | 669 content::NotificationService::AllSources()); |
619 UnloadResults unload_results; | 670 UnloadResults unload_results; |
620 BrowserList::CloseAllBrowsersWithProfile( | 671 BrowserList::CloseAllBrowsersWithProfile( |
621 browser()->profile(), | 672 browser()->profile(), |
622 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 673 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
623 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 674 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
624 false); | 675 false); |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
834 WindowCloseAfterBeforeUnloadCrash | 885 WindowCloseAfterBeforeUnloadCrash |
835 #endif | 886 #endif |
836 IN_PROC_BROWSER_TEST_F(FastUnloadTest, | 887 IN_PROC_BROWSER_TEST_F(FastUnloadTest, |
837 MAYBE_WindowCloseAfterBeforeUnloadCrash) { | 888 MAYBE_WindowCloseAfterBeforeUnloadCrash) { |
838 // Tests makes no sense in single-process mode since the renderer is hung. | 889 // Tests makes no sense in single-process mode since the renderer is hung. |
839 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 890 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
840 switches::kSingleProcess)) | 891 switches::kSingleProcess)) |
841 return; | 892 return; |
842 | 893 |
843 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 894 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 895 // JavaScript onbeforeunload dialogs require a user gesture. |
| 896 for (auto* frame : |
| 897 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 898 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 899 } |
844 content::WebContents* beforeunload_contents = | 900 content::WebContents* beforeunload_contents = |
845 browser()->tab_strip_model()->GetActiveWebContents(); | 901 browser()->tab_strip_model()->GetActiveWebContents(); |
846 | 902 |
847 content::WindowedNotificationObserver window_observer( | 903 content::WindowedNotificationObserver window_observer( |
848 chrome::NOTIFICATION_BROWSER_CLOSED, | 904 chrome::NOTIFICATION_BROWSER_CLOSED, |
849 content::NotificationService::AllSources()); | 905 content::NotificationService::AllSources()); |
850 chrome::CloseWindow(browser()); | 906 chrome::CloseWindow(browser()); |
851 CrashTab(beforeunload_contents); | 907 CrashTab(beforeunload_contents); |
852 window_observer.Wait(); | 908 window_observer.Wait(); |
853 } | 909 } |
(...skipping 12 matching lines...) Expand all Loading... |
866 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 922 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
867 true); | 923 true); |
868 window_observer.Wait(); | 924 window_observer.Wait(); |
869 EXPECT_EQ(1, unload_results.get_successes()); | 925 EXPECT_EQ(1, unload_results.get_successes()); |
870 EXPECT_EQ(0, unload_results.get_aborts()); | 926 EXPECT_EQ(0, unload_results.get_aborts()); |
871 } | 927 } |
872 | 928 |
873 IN_PROC_BROWSER_TEST_F(FastUnloadTest, | 929 IN_PROC_BROWSER_TEST_F(FastUnloadTest, |
874 BrowserListForceCloseWithBeforeUnloadWithFastUnload) { | 930 BrowserListForceCloseWithBeforeUnloadWithFastUnload) { |
875 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 931 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 932 // JavaScript onbeforeunload dialogs require a user gesture. |
| 933 for (auto* frame : |
| 934 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 935 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 936 } |
876 | 937 |
877 content::WindowedNotificationObserver window_observer( | 938 content::WindowedNotificationObserver window_observer( |
878 chrome::NOTIFICATION_BROWSER_CLOSED, | 939 chrome::NOTIFICATION_BROWSER_CLOSED, |
879 content::NotificationService::AllSources()); | 940 content::NotificationService::AllSources()); |
880 UnloadResults unload_results; | 941 UnloadResults unload_results; |
881 BrowserList::CloseAllBrowsersWithProfile( | 942 BrowserList::CloseAllBrowsersWithProfile( |
882 browser()->profile(), | 943 browser()->profile(), |
883 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 944 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
884 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 945 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
885 true); | 946 true); |
886 window_observer.Wait(); | 947 window_observer.Wait(); |
887 EXPECT_EQ(1, unload_results.get_successes()); | 948 EXPECT_EQ(1, unload_results.get_successes()); |
888 EXPECT_EQ(0, unload_results.get_aborts()); | 949 EXPECT_EQ(0, unload_results.get_aborts()); |
889 } | 950 } |
890 | 951 |
891 IN_PROC_BROWSER_TEST_F(FastUnloadTest, | 952 IN_PROC_BROWSER_TEST_F(FastUnloadTest, |
892 BrowserListForceCloseAfterNormalCloseWithFastUnload) { | 953 BrowserListForceCloseAfterNormalCloseWithFastUnload) { |
893 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 954 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
| 955 // JavaScript onbeforeunload dialogs require a user gesture. |
| 956 for (auto* frame : |
| 957 browser()->tab_strip_model()->GetActiveWebContents()->GetAllFrames()) { |
| 958 frame->ExecuteJavaScriptWithUserGestureForTests(base::string16()); |
| 959 } |
894 | 960 |
895 content::WindowedNotificationObserver window_observer( | 961 content::WindowedNotificationObserver window_observer( |
896 chrome::NOTIFICATION_BROWSER_CLOSED, | 962 chrome::NOTIFICATION_BROWSER_CLOSED, |
897 content::NotificationService::AllSources()); | 963 content::NotificationService::AllSources()); |
898 UnloadResults unload_results; | 964 UnloadResults unload_results; |
899 BrowserList::CloseAllBrowsersWithProfile( | 965 BrowserList::CloseAllBrowsersWithProfile( |
900 browser()->profile(), | 966 browser()->profile(), |
901 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 967 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
902 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 968 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
903 false); | 969 false); |
904 BrowserList::CloseAllBrowsersWithProfile( | 970 BrowserList::CloseAllBrowsersWithProfile( |
905 browser()->profile(), | 971 browser()->profile(), |
906 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), | 972 base::Bind(&UnloadResults::AddSuccess, base::Unretained(&unload_results)), |
907 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), | 973 base::Bind(&UnloadResults::AddAbort, base::Unretained(&unload_results)), |
908 true); | 974 true); |
909 window_observer.Wait(); | 975 window_observer.Wait(); |
910 EXPECT_EQ(1, unload_results.get_successes()); | 976 EXPECT_EQ(1, unload_results.get_successes()); |
911 EXPECT_EQ(0, unload_results.get_aborts()); | 977 EXPECT_EQ(0, unload_results.get_aborts()); |
912 } | 978 } |
913 | 979 |
914 // TODO(ojan): Add tests for unload/beforeunload that have multiple tabs | 980 // TODO(ojan): Add tests for unload/beforeunload that have multiple tabs |
915 // and multiple windows. | 981 // and multiple windows. |
OLD | NEW |