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

Unified Diff: chrome/browser/ui/javascript_dialogs/javascript_dialog_browsertest.cc

Issue 2641173004: Make the callback from JavaScript dialogs even when closing a WebContents. (Closed)
Patch Set: Created 3 years, 11 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
« no previous file with comments | « no previous file | chrome/browser/ui/javascript_dialogs/javascript_dialog_tab_helper.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/javascript_dialogs/javascript_dialog_browsertest.cc
diff --git a/chrome/browser/ui/javascript_dialogs/javascript_dialog_browsertest.cc b/chrome/browser/ui/javascript_dialogs/javascript_dialog_browsertest.cc
index d9be2a2551eca75ed3f15a825b6f79110527aa39..98c6a25d4a10e9e3f6d605cb07ec140ece59f6e2 100644
--- a/chrome/browser/ui/javascript_dialogs/javascript_dialog_browsertest.cc
+++ b/chrome/browser/ui/javascript_dialogs/javascript_dialog_browsertest.cc
@@ -2,12 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/logging.h"
Charlie Reis 2017/01/19 21:51:00 Is this leftover from some earlier logging?
Avi (use Gerrit) 2017/01/19 22:03:38 Done.
#include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_command_line.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/javascript_dialogs/javascript_dialog_tab_helper.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_features.h"
+#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
@@ -26,7 +29,6 @@ IN_PROC_BROWSER_TEST_F(JavaScriptDialogTest, ReloadDoesntHang) {
JavaScriptDialogTabHelper::FromWebContents(tab);
// Show a dialog.
-
scoped_refptr<content::MessageLoopRunner> runner =
new content::MessageLoopRunner;
js_helper->SetDialogShownCallbackForTesting(runner->QuitClosure());
@@ -34,9 +36,78 @@ IN_PROC_BROWSER_TEST_F(JavaScriptDialogTest, ReloadDoesntHang) {
runner->Run();
// Try reloading.
-
tab->GetController().Reload(content::ReloadType::NORMAL, false);
content::WaitForLoadStop(tab);
// If the WaitForLoadStop doesn't hang forever, we've passed.
}
+
+IN_PROC_BROWSER_TEST_F(JavaScriptDialogTest,
+ ClosingPageSharingRendererDoesntHang) {
+ base::test::ScopedFeatureList feature_list;
+ feature_list.InitAndEnableFeature(features::kAutoDismissingDialogs);
+
+ // Turn off popup blocking.
+ base::test::ScopedCommandLine scoped_command_line;
+ scoped_command_line.GetProcessCommandLine()->AppendSwitch(
+ switches::kDisablePopupBlocking);
+
+ // Two tabs, one render process.
+ content::WebContents* tab1 =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ content::WebContentsAddedObserver new_wc_observer;
+ tab1->GetMainFrame()->ExecuteJavaScriptForTests(
+ base::UTF8ToUTF16("window.open('about:blank');"));
+ content::WebContents* tab2 = new_wc_observer.GetWebContents();
+ ASSERT_NE(tab1, tab2);
+ ASSERT_EQ(tab1->GetRenderProcessHost(), tab2->GetRenderProcessHost());
+
+ // Tab two shows a dialog.
+ scoped_refptr<content::MessageLoopRunner> runner =
+ new content::MessageLoopRunner;
+ JavaScriptDialogTabHelper* js_helper2 =
+ JavaScriptDialogTabHelper::FromWebContents(tab2);
+ js_helper2->SetDialogShownCallbackForTesting(runner->QuitClosure());
+ tab2->GetMainFrame()->ExecuteJavaScriptForTests(base::UTF8ToUTF16("alert()"));
+ runner->Run();
+
+ // Tab two is closed while the dialog is up.
+ int tab2_index = browser()->tab_strip_model()->GetIndexOfWebContents(tab2);
+ browser()->tab_strip_model()->CloseWebContentsAt(tab2_index,
+ TabStripModel::CLOSE_NONE);
+
+ // Try reloading tab one.
+ tab1->GetController().Reload(content::ReloadType::NORMAL, false);
+ content::WaitForLoadStop(tab1);
+
+ // If the WaitForLoadStop doesn't hang forever, we've passed.
+}
+
+IN_PROC_BROWSER_TEST_F(JavaScriptDialogTest,
+ ClosingPageWithSubframeAlertingDoesntCrash) {
+ base::test::ScopedFeatureList feature_list;
+ feature_list.InitAndEnableFeature(features::kAutoDismissingDialogs);
+
+ content::WebContents* tab =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ JavaScriptDialogTabHelper* js_helper =
+ JavaScriptDialogTabHelper::FromWebContents(tab);
+
+ // A subframe shows a dialog.
+ std::string dialog_url = "data:text/html,<script>alert(\"hi\");</script>";
+ std::string script = "var iframe = document.createElement('iframe');"
+ "iframe.src = '" + dialog_url + "';"
+ "document.body.appendChild(iframe);";
Charlie Reis 2017/01/19 21:51:00 Another test that might be useful (in a followup C
Avi (use Gerrit) 2017/01/19 22:03:38 That is sooo evil; I'm totally writing that one.
Charlie Reis 2017/01/19 22:08:32 Yep, exactly.
+ scoped_refptr<content::MessageLoopRunner> runner =
+ new content::MessageLoopRunner;
+ js_helper->SetDialogShownCallbackForTesting(runner->QuitClosure());
+ tab->GetMainFrame()->ExecuteJavaScriptForTests(base::UTF8ToUTF16(script));
+ runner->Run();
+
+ // The tab is closed while the dialog is up.
+ int tab_index = browser()->tab_strip_model()->GetIndexOfWebContents(tab);
+ browser()->tab_strip_model()->CloseWebContentsAt(tab_index,
+ TabStripModel::CLOSE_NONE);
+
+ // No crash is good news.
+}
« no previous file with comments | « no previous file | chrome/browser/ui/javascript_dialogs/javascript_dialog_tab_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698