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

Unified Diff: chrome/browser/ui/browser_browsertest.cc

Issue 25434002: Don't leave renderer process frozen when canceling JavaScript dialogs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove WebContentsObserver Created 7 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/browser_browsertest.cc
diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc
index df5826073b2730ef0f1e6d7712ddb83688b814ed..fcea62d924355e930e2b4b424f487aa8c002da90 100644
--- a/chrome/browser/ui/browser_browsertest.cc
+++ b/chrome/browser/ui/browser_browsertest.cc
@@ -231,6 +231,9 @@ class TestInterstitialPage : public content::InterstitialPageDelegate {
void Proceed() {
interstitial_page_->Proceed();
}
+ void DontProceed() {
+ interstitial_page_->DontProceed();
+ }
virtual std::string GetHTMLContents() OVERRIDE {
return "<h1>INTERSTITIAL</h1>";
@@ -460,6 +463,32 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_ThirtyFourTabs) {
}
}
+// Test for crbug.com/297289. Ensure that modal dialogs are closed when a
+// cross-process navigation is ready to commit.
+IN_PROC_BROWSER_TEST_F(BrowserTest, CrossProcessNavCancelsDialogs) {
+ ASSERT_TRUE(test_server()->Start());
+ host_resolver()->AddRule("www.example.com", "127.0.0.1");
+ GURL url(test_server()->GetURL("empty.html"));
+ ui_test_utils::NavigateToURL(browser(), url);
+
+ WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
+ contents->GetRenderViewHost()->ExecuteJavascriptInWebFrame(
+ string16(),
+ ASCIIToUTF16("alert('Dialog showing!');"));
+ AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
+ EXPECT_TRUE(alert->IsValid());
+ AppModalDialogQueue* dialog_queue = AppModalDialogQueue::GetInstance();
+ EXPECT_TRUE(dialog_queue->HasActiveDialog());
+
+ // A cross-site navigation should force the dialog to close.
+ GURL url2("http://www.example.com/empty.html");
+ ui_test_utils::NavigateToURL(browser(), url2);
+ EXPECT_FALSE(dialog_queue->HasActiveDialog());
+
+ // Make sure input events still work in the renderer process.
+ EXPECT_FALSE(contents->GetRenderProcessHost()->IgnoreInputEvents());
+}
+
// Test for crbug.com/22004. Reloading a page with a before unload handler and
// then canceling the dialog should not leave the throbber spinning.
IN_PROC_BROWSER_TEST_F(BrowserTest, ReloadThenCancelBeforeUnload) {
@@ -1727,10 +1756,13 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, InterstitialClosesDialogs) {
InterstitialObserver observer(contents,
base::Closure(),
loop_runner->QuitClosure());
- interstitial->Proceed();
+ interstitial->DontProceed();
loop_runner->Run();
// interstitial is deleted now.
}
+
+ // Make sure input events still work in the renderer process.
+ EXPECT_FALSE(contents->GetRenderProcessHost()->IgnoreInputEvents());
}

Powered by Google App Engine
This is Rietveld 408576698