Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(234)

Side by Side Diff: chrome/browser/ui/browser_browsertest.cc

Issue 2801813005: Only show a beforeunload dialog if a frame has had a user gesture since its load. (Closed)
Patch Set: one last bit Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 #include "chrome/browser/ui/browser.h" 5 #include "chrome/browser/ui/browser.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <memory> 10 #include <memory>
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 EXPECT_FALSE(contents->GetRenderProcessHost()->IgnoreInputEvents()); 623 EXPECT_FALSE(contents->GetRenderProcessHost()->IgnoreInputEvents());
624 } 624 }
625 625
626 // Make sure that dialogs are closed after a renderer process dies, and that 626 // Make sure that dialogs are closed after a renderer process dies, and that
627 // subsequent navigations work. See http://crbug/com/343265. 627 // subsequent navigations work. See http://crbug/com/343265.
628 IN_PROC_BROWSER_TEST_F(BrowserTest, SadTabCancelsDialogs) { 628 IN_PROC_BROWSER_TEST_F(BrowserTest, SadTabCancelsDialogs) {
629 ASSERT_TRUE(embedded_test_server()->Start()); 629 ASSERT_TRUE(embedded_test_server()->Start());
630 GURL beforeunload_url(embedded_test_server()->GetURL("/beforeunload.html")); 630 GURL beforeunload_url(embedded_test_server()->GetURL("/beforeunload.html"));
631 ui_test_utils::NavigateToURL(browser(), beforeunload_url); 631 ui_test_utils::NavigateToURL(browser(), beforeunload_url);
632 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); 632 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
633 // Disable the hang monitor, otherwise there will be a race between the 633 content::PrepContentsForBeforeUnloadTest(contents);
634 // beforeunload dialog and the beforeunload hang timer.
635 contents->GetMainFrame()->DisableBeforeUnloadHangMonitorForTesting();
636 634
637 // Start a navigation to trigger the beforeunload dialog. 635 // Start a navigation to trigger the beforeunload dialog.
638 contents->GetMainFrame()->ExecuteJavaScriptForTests( 636 contents->GetMainFrame()->ExecuteJavaScriptForTests(
639 ASCIIToUTF16("window.location.href = 'about:blank'")); 637 ASCIIToUTF16("window.location.href = 'about:blank'"));
640 AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog(); 638 AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
641 EXPECT_TRUE(alert->IsValid()); 639 EXPECT_TRUE(alert->IsValid());
642 AppModalDialogQueue* dialog_queue = AppModalDialogQueue::GetInstance(); 640 AppModalDialogQueue* dialog_queue = AppModalDialogQueue::GetInstance();
643 EXPECT_TRUE(dialog_queue->HasActiveDialog()); 641 EXPECT_TRUE(dialog_queue->HasActiveDialog());
644 642
645 // Crash the renderer process and ensure the dialog is gone. 643 // Crash the renderer process and ensure the dialog is gone.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 714
717 interstitial->DontProceed(); 715 interstitial->DontProceed();
718 } 716 }
719 717
720 // Test for crbug.com/22004. Reloading a page with a before unload handler and 718 // Test for crbug.com/22004. Reloading a page with a before unload handler and
721 // then canceling the dialog should not leave the throbber spinning. 719 // then canceling the dialog should not leave the throbber spinning.
722 IN_PROC_BROWSER_TEST_F(BrowserTest, ReloadThenCancelBeforeUnload) { 720 IN_PROC_BROWSER_TEST_F(BrowserTest, ReloadThenCancelBeforeUnload) {
723 GURL url(std::string("data:text/html,") + kBeforeUnloadHTML); 721 GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
724 ui_test_utils::NavigateToURL(browser(), url); 722 ui_test_utils::NavigateToURL(browser(), url);
725 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); 723 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
726 // Disable the hang monitor, otherwise there will be a race between the 724 content::PrepContentsForBeforeUnloadTest(contents);
727 // beforeunload dialog and the beforeunload hang timer.
728 contents->GetMainFrame()->DisableBeforeUnloadHangMonitorForTesting();
729 725
730 // Navigate to another page, but click cancel in the dialog. Make sure that 726 // Navigate to another page, but click cancel in the dialog. Make sure that
731 // the throbber stops spinning. 727 // the throbber stops spinning.
732 chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); 728 chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
733 AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog(); 729 AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
734 730
735 FailedCommitWatcher watcher(contents); 731 FailedCommitWatcher watcher(contents);
736 alert->CloseModalDialog(); 732 alert->CloseModalDialog();
737 if (content::IsBrowserSideNavigationEnabled()) 733 if (content::IsBrowserSideNavigationEnabled())
738 watcher.Wait(); 734 watcher.Wait();
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
840 // Temporarily replace ContentBrowserClient with one that will cause a 836 // Temporarily replace ContentBrowserClient with one that will cause a
841 // process swap on all redirects to HTTPS URLs. 837 // process swap on all redirects to HTTPS URLs.
842 TransferHttpsRedirectsContentBrowserClient new_client; 838 TransferHttpsRedirectsContentBrowserClient new_client;
843 content::ContentBrowserClient* old_client = 839 content::ContentBrowserClient* old_client =
844 SetBrowserClientForTesting(&new_client); 840 SetBrowserClientForTesting(&new_client);
845 841
846 // Navigate to a page with a beforeunload handler. 842 // Navigate to a page with a beforeunload handler.
847 GURL url(embedded_test_server()->GetURL("/beforeunload.html")); 843 GURL url(embedded_test_server()->GetURL("/beforeunload.html"));
848 ui_test_utils::NavigateToURL(browser(), url); 844 ui_test_utils::NavigateToURL(browser(), url);
849 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); 845 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
850 // Disable the hang monitor, otherwise there will be a race between the 846 content::PrepContentsForBeforeUnloadTest(contents);
851 // beforeunload dialog and the beforeunload hang timer.
852 contents->GetMainFrame()->DisableBeforeUnloadHangMonitorForTesting();
853 847
854 // Navigate to a URL that redirects to another process and approve the 848 // Navigate to a URL that redirects to another process and approve the
855 // beforeunload dialog that pops up. 849 // beforeunload dialog that pops up.
856 content::WindowedNotificationObserver nav_observer( 850 content::WindowedNotificationObserver nav_observer(
857 content::NOTIFICATION_NAV_ENTRY_COMMITTED, 851 content::NOTIFICATION_NAV_ENTRY_COMMITTED,
858 content::NotificationService::AllSources()); 852 content::NotificationService::AllSources());
859 GURL https_url(https_test_server.GetURL("/title1.html")); 853 GURL https_url(https_test_server.GetURL("/title1.html"));
860 GURL redirect_url( 854 GURL redirect_url(
861 embedded_test_server()->GetURL("/server-redirect?" + https_url.spec())); 855 embedded_test_server()->GetURL("/server-redirect?" + https_url.spec()));
862 browser()->OpenURL(OpenURLParams(redirect_url, Referrer(), 856 browser()->OpenURL(OpenURLParams(redirect_url, Referrer(),
863 WindowOpenDisposition::CURRENT_TAB, 857 WindowOpenDisposition::CURRENT_TAB,
864 ui::PAGE_TRANSITION_TYPED, false)); 858 ui::PAGE_TRANSITION_TYPED, false));
865 AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog(); 859 AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
866 EXPECT_TRUE( 860 EXPECT_TRUE(
867 static_cast<JavaScriptAppModalDialog*>(alert)->is_before_unload_dialog()); 861 static_cast<JavaScriptAppModalDialog*>(alert)->is_before_unload_dialog());
868 alert->native_dialog()->AcceptAppModalDialog(); 862 alert->native_dialog()->AcceptAppModalDialog();
869 nav_observer.Wait(); 863 nav_observer.Wait();
870 864
871 // Restore previous browser client. 865 // Restore previous browser client.
872 SetBrowserClientForTesting(old_client); 866 SetBrowserClientForTesting(old_client);
873 } 867 }
874 868
875 // Test for crbug.com/80401. Canceling a before unload dialog should reset 869 // Test for crbug.com/80401. Canceling a before unload dialog should reset
876 // the URL to the previous page's URL. 870 // the URL to the previous page's URL.
877 IN_PROC_BROWSER_TEST_F(BrowserTest, CancelBeforeUnloadResetsURL) { 871 IN_PROC_BROWSER_TEST_F(BrowserTest, CancelBeforeUnloadResetsURL) {
878 GURL url(ui_test_utils::GetTestUrl(base::FilePath( 872 GURL url(ui_test_utils::GetTestUrl(base::FilePath(
879 base::FilePath::kCurrentDirectory), base::FilePath(kBeforeUnloadFile))); 873 base::FilePath::kCurrentDirectory), base::FilePath(kBeforeUnloadFile)));
880 ui_test_utils::NavigateToURL(browser(), url); 874 ui_test_utils::NavigateToURL(browser(), url);
881 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); 875 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
882 // Disable the hang monitor, otherwise there will be a race between the 876 content::PrepContentsForBeforeUnloadTest(contents);
883 // beforeunload dialog and the beforeunload hang timer.
884 contents->GetMainFrame()->DisableBeforeUnloadHangMonitorForTesting();
885 877
886 // Navigate to a page that triggers a cross-site transition. 878 // Navigate to a page that triggers a cross-site transition.
887 ASSERT_TRUE(embedded_test_server()->Start()); 879 ASSERT_TRUE(embedded_test_server()->Start());
888 GURL url2(embedded_test_server()->GetURL("/title1.html")); 880 GURL url2(embedded_test_server()->GetURL("/title1.html"));
889 browser()->OpenURL(OpenURLParams(url2, Referrer(), 881 browser()->OpenURL(OpenURLParams(url2, Referrer(),
890 WindowOpenDisposition::CURRENT_TAB, 882 WindowOpenDisposition::CURRENT_TAB,
891 ui::PAGE_TRANSITION_TYPED, false)); 883 ui::PAGE_TRANSITION_TYPED, false));
892 884
893 content::WindowedNotificationObserver host_destroyed_observer( 885 content::WindowedNotificationObserver host_destroyed_observer(
894 content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 886 content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 is_before_unload_dialog()); 938 is_before_unload_dialog());
947 alert->native_dialog()->AcceptAppModalDialog(); 939 alert->native_dialog()->AcceptAppModalDialog();
948 } 940 }
949 941
950 // Test that when a page has an onbeforeunload handler, reloading a page shows a 942 // Test that when a page has an onbeforeunload handler, reloading a page shows a
951 // different dialog than navigating to a different page. 943 // different dialog than navigating to a different page.
952 IN_PROC_BROWSER_TEST_F(BrowserTest, BeforeUnloadVsBeforeReload) { 944 IN_PROC_BROWSER_TEST_F(BrowserTest, BeforeUnloadVsBeforeReload) {
953 GURL url(std::string("data:text/html,") + kBeforeUnloadHTML); 945 GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
954 ui_test_utils::NavigateToURL(browser(), url); 946 ui_test_utils::NavigateToURL(browser(), url);
955 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); 947 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
956 // Disable the hang monitor, otherwise there will be a race between the 948 content::PrepContentsForBeforeUnloadTest(contents);
957 // beforeunload dialog and the beforeunload hang timer.
958 contents->GetMainFrame()->DisableBeforeUnloadHangMonitorForTesting();
959 949
960 // Reload the page, and check that we get a "before reload" dialog. 950 // Reload the page, and check that we get a "before reload" dialog.
961 chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); 951 chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
962 AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog(); 952 AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
963 EXPECT_TRUE(static_cast<JavaScriptAppModalDialog*>(alert)->is_reload()); 953 EXPECT_TRUE(static_cast<JavaScriptAppModalDialog*>(alert)->is_reload());
964 954
965 // Cancel the reload. 955 // Cancel the reload.
966 FailedCommitWatcher watcher(contents); 956 FailedCommitWatcher watcher(contents);
967 alert->native_dialog()->CancelAppModalDialog(); 957 alert->native_dialog()->CancelAppModalDialog();
968 if (content::IsBrowserSideNavigationEnabled()) 958 if (content::IsBrowserSideNavigationEnabled())
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 #endif 1009 #endif
1020 } 1010 }
1021 }; 1011 };
1022 1012
1023 // Disabled, http://crbug.com/159214 . 1013 // Disabled, http://crbug.com/159214 .
1024 IN_PROC_BROWSER_TEST_F(BeforeUnloadAtQuitWithTwoWindows, 1014 IN_PROC_BROWSER_TEST_F(BeforeUnloadAtQuitWithTwoWindows,
1025 DISABLED_IfThisTestTimesOutItIndicatesFAILURE) { 1015 DISABLED_IfThisTestTimesOutItIndicatesFAILURE) {
1026 // In the first browser, set up a page that has a beforeunload handler. 1016 // In the first browser, set up a page that has a beforeunload handler.
1027 GURL url(std::string("data:text/html,") + kBeforeUnloadHTML); 1017 GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
1028 ui_test_utils::NavigateToURL(browser(), url); 1018 ui_test_utils::NavigateToURL(browser(), url);
1019 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
1020 content::PrepContentsForBeforeUnloadTest(contents);
1029 1021
1030 // Open a second browser window at about:blank. 1022 // Open a second browser window at about:blank.
1031 ui_test_utils::BrowserAddedObserver browser_added_observer; 1023 ui_test_utils::BrowserAddedObserver browser_added_observer;
1032 chrome::NewEmptyWindow(browser()->profile()); 1024 chrome::NewEmptyWindow(browser()->profile());
1033 Browser* second_window = browser_added_observer.WaitForSingleNewBrowser(); 1025 Browser* second_window = browser_added_observer.WaitForSingleNewBrowser();
1034 ui_test_utils::NavigateToURL(second_window, GURL(url::kAboutBlankURL)); 1026 ui_test_utils::NavigateToURL(second_window, GURL(url::kAboutBlankURL));
1035 1027
1036 // Tell the application to quit. IDC_EXIT calls AttemptUserExit, which on 1028 // Tell the application to quit. IDC_EXIT calls AttemptUserExit, which on
1037 // everything but ChromeOS allows unload handlers to block exit. On that 1029 // everything but ChromeOS allows unload handlers to block exit. On that
1038 // platform, though, it exits unconditionally. See the comment and bug ID 1030 // platform, though, it exits unconditionally. See the comment and bug ID
(...skipping 1844 matching lines...) Expand 10 before | Expand all | Expand 10 after
2883 Browser* browser = new Browser(params); 2875 Browser* browser = new Browser(params);
2884 gfx::Rect bounds = browser->window()->GetBounds(); 2876 gfx::Rect bounds = browser->window()->GetBounds();
2885 2877
2886 // Should be EXPECT_EQ, but this width is inconsistent across platforms. 2878 // Should be EXPECT_EQ, but this width is inconsistent across platforms.
2887 // See https://crbug.com/567925. 2879 // See https://crbug.com/567925.
2888 EXPECT_GE(bounds.width(), 100); 2880 EXPECT_GE(bounds.width(), 100);
2889 EXPECT_EQ(122, bounds.height()); 2881 EXPECT_EQ(122, bounds.height());
2890 browser->window()->Close(); 2882 browser->window()->Close();
2891 } 2883 }
2892 } 2884 }
OLDNEW
« no previous file with comments | « chrome/browser/lifetime/browser_close_manager_browsertest.cc ('k') | chrome/browser/unload_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698