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, |