| Index: chrome/browser/lifetime/browser_close_manager_browsertest.cc
|
| diff --git a/chrome/browser/lifetime/browser_close_manager_browsertest.cc b/chrome/browser/lifetime/browser_close_manager_browsertest.cc
|
| index b499d1933045619d2e56231f6ddc572ffeb96fe4..4b68f1d500e4d923df55ce6a1368f219ef1fd336 100644
|
| --- a/chrome/browser/lifetime/browser_close_manager_browsertest.cc
|
| +++ b/chrome/browser/lifetime/browser_close_manager_browsertest.cc
|
| @@ -71,13 +71,13 @@ app_modal::NativeAppModalDialog* GetNextDialog() {
|
| return js_dialog->native_dialog();
|
| }
|
|
|
| -// Note: call |DisableHangMonitor| on the relevant WebContents or Browser before
|
| +// Note: call |PrepareForDialog| on the relevant WebContents or Browser before
|
| // trying to close it, to avoid flakiness. https://crbug.com/519646
|
| void AcceptClose() {
|
| GetNextDialog()->AcceptAppModalDialog();
|
| }
|
|
|
| -// Note: call |DisableHangMonitor| on the relevant WebContents or Browser before
|
| +// Note: call |PrepareForDialog| on the relevant WebContents or Browser before
|
| // trying to close it, to avoid flakiness. https://crbug.com/519646
|
| void CancelClose() {
|
| GetNextDialog()->CancelAppModalDialog();
|
| @@ -292,17 +292,22 @@ class BrowserCloseManagerBrowserTest
|
| observer.NumDownloadsSeenInState(content::DownloadItem::IN_PROGRESS));
|
| }
|
|
|
| - // Makes sure that the beforeunload hang monitor will not trigger. That must
|
| - // be called before close action when using |AcceptClose| or |CancelClose|, to
|
| - // ensure the timeout does not prevent the dialog from appearing.
|
| - // https://crbug.com/519646
|
| - void DisableHangMonitor(content::WebContents* web_contents) {
|
| + // Prepares a WebContents or Browser for a beforeunload dialog.
|
| + //
|
| + // This comprises two things. First, it makes sure that the beforeunload hang
|
| + // monitor will not trigger, otherwise timeout might prevent the dialog from
|
| + // appearing. See https://crbug.com/519646 .
|
| + //
|
| + // Second, beforeunload dialogs require a user gesture, so it makes one.
|
| + void PrepareForDialog(content::WebContents* web_contents) {
|
| web_contents->GetMainFrame()->DisableBeforeUnloadHangMonitorForTesting();
|
| + for (auto* frame : web_contents->GetAllFrames())
|
| + frame->ExecuteJavaScriptWithUserGestureForTests(base::string16());
|
| }
|
|
|
| - void DisableHangMonitor(Browser* browser) {
|
| + void PrepareForDialog(Browser* browser) {
|
| for (int i = 0; i < browser->tab_strip_model()->count(); i++)
|
| - DisableHangMonitor(browser->tab_strip_model()->GetWebContentsAt(i));
|
| + PrepareForDialog(browser->tab_strip_model()->GetWebContentsAt(i));
|
| }
|
|
|
| std::vector<Browser*> browsers_;
|
| @@ -312,7 +317,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestSingleTabShutdown) {
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browser(), embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browser());
|
| + PrepareForDialog(browser());
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
|
| @@ -336,7 +341,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browser(), embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browser());
|
| + PrepareForDialog(browser());
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
|
| @@ -365,7 +370,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| AddBlankTabAndShow(browser());
|
| ASSERT_NO_FATAL_FAILURE(
|
| ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL)));
|
| - DisableHangMonitor(browser());
|
| + PrepareForDialog(browser());
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
|
| @@ -413,8 +418,8 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest, TestMultipleWindows) {
|
| browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[0]);
|
| - DisableHangMonitor(browsers_[1]);
|
| + PrepareForDialog(browsers_[0]);
|
| + PrepareForDialog(browsers_[1]);
|
|
|
| // Cancel shutdown on the first beforeunload event.
|
| {
|
| @@ -468,7 +473,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| browsers_[0], embedded_test_server()->GetURL("/beforeunload_hang.html")));
|
| // Disable the hang monitor in the tab that is not expected to hang, so that
|
| // the dialog is guaranteed to show.
|
| - DisableHangMonitor(browsers_[0]->tab_strip_model()->GetWebContentsAt(1));
|
| + PrepareForDialog(browsers_[0]->tab_strip_model()->GetWebContentsAt(1));
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
|
| @@ -504,7 +509,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| browsers_[2], embedded_test_server()->GetURL("/beforeunload_hang.html")));
|
| // Disable the hang monitor in the tab that is not expected to hang, so that
|
| // the dialog is guaranteed to show.
|
| - DisableHangMonitor(browsers_[1]);
|
| + PrepareForDialog(browsers_[1]);
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
|
| @@ -549,7 +554,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| }
|
| // Disable the hang monitor in the tab that is not expected to hang, so that
|
| // the dialog is guaranteed to show.
|
| - DisableHangMonitor(
|
| + PrepareForDialog(
|
| browsers_[0]->tab_strip_model()->GetWebContentsAt(kResposiveTabIndex));
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| @@ -598,7 +603,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| }
|
| // Disable the hang monitor in the tab that is not expected to hang, so that
|
| // the dialog is guaranteed to show.
|
| - DisableHangMonitor(browsers_[kResposiveBrowserIndex]);
|
| + PrepareForDialog(browsers_[kResposiveBrowserIndex]);
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, kResposiveBrowserIndex + 1);
|
| @@ -627,7 +632,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[0]);
|
| + PrepareForDialog(browsers_[0]);
|
|
|
| RepeatedNotificationObserver close_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSED, 2);
|
| @@ -646,7 +651,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[0]);
|
| + PrepareForDialog(browsers_[0]);
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
|
| @@ -654,7 +659,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| browsers_.push_back(CreateBrowser(browser()->profile()));
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[1]);
|
| + PrepareForDialog(browsers_[1]);
|
| ASSERT_NO_FATAL_FAILURE(AcceptClose());
|
| ASSERT_NO_FATAL_FAILURE(CancelClose());
|
| cancel_observer.Wait();
|
| @@ -682,8 +687,8 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[0]);
|
| - DisableHangMonitor(browsers_[1]);
|
| + PrepareForDialog(browsers_[0]);
|
| + PrepareForDialog(browsers_[1]);
|
|
|
| RepeatedNotificationObserver close_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSED, 2);
|
| @@ -708,8 +713,8 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[0]);
|
| - DisableHangMonitor(browsers_[1]);
|
| + PrepareForDialog(browsers_[0]);
|
| + PrepareForDialog(browsers_[1]);
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
|
| @@ -721,8 +726,8 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| AddBlankTabAndShow(browsers_[1]);
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[0]);
|
| - DisableHangMonitor(browsers_[1]);
|
| + PrepareForDialog(browsers_[0]);
|
| + PrepareForDialog(browsers_[1]);
|
| ASSERT_NO_FATAL_FAILURE(AcceptClose());
|
| ASSERT_NO_FATAL_FAILURE(CancelClose());
|
| cancel_observer.Wait();
|
| @@ -781,7 +786,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| ->NeedToFireBeforeUnload());
|
| EXPECT_EQ(2, browser2->tab_strip_model()->count());
|
|
|
| - DisableHangMonitor(browser2);
|
| + PrepareForDialog(browser2);
|
|
|
| // The test.
|
|
|
| @@ -845,7 +850,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[0]);
|
| + PrepareForDialog(browsers_[0]);
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
|
| @@ -854,7 +859,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| browsers_.push_back(CreateBrowser(browser()->profile()));
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[1]);
|
| + PrepareForDialog(browsers_[1]);
|
| browsers_[1]->tab_strip_model()->CloseAllTabs();
|
| ASSERT_NO_FATAL_FAILURE(CancelClose());
|
| ASSERT_NO_FATAL_FAILURE(CancelClose());
|
| @@ -880,7 +885,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| ASSERT_TRUE(embedded_test_server()->Start());
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[0], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[0]);
|
| + PrepareForDialog(browsers_[0]);
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 2);
|
| @@ -889,7 +894,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| browsers_.push_back(CreateBrowser(browser()->profile()));
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[1]);
|
| + PrepareForDialog(browsers_[1]);
|
| ASSERT_FALSE(browsers_[1]->ShouldCloseWindow());
|
| ASSERT_NO_FATAL_FAILURE(CancelClose());
|
| ASSERT_NO_FATAL_FAILURE(CancelClose());
|
| @@ -918,8 +923,8 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerBrowserTest,
|
| browsers_.push_back(CreateBrowser(browser()->profile()));
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browsers_[1], embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browsers_[0]);
|
| - DisableHangMonitor(browsers_[1]);
|
| + PrepareForDialog(browsers_[0]);
|
| + PrepareForDialog(browsers_[1]);
|
|
|
| RepeatedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 1);
|
| @@ -1164,7 +1169,7 @@ IN_PROC_BROWSER_TEST_P(BrowserCloseManagerWithDownloadsBrowserTest,
|
| ASSERT_NO_FATAL_FAILURE(CreateStalledDownload(browser()));
|
| ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(
|
| browser(), embedded_test_server()->GetURL("/beforeunload.html")));
|
| - DisableHangMonitor(browser());
|
| + PrepareForDialog(browser());
|
|
|
| content::WindowedNotificationObserver cancel_observer(
|
| chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED,
|
|
|