summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcreis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-25 21:32:15 +0000
committercreis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-25 21:32:15 +0000
commit769e94ab4f20554bd0ae0c2be5ad2654a62ce16b (patch)
tree3d79fdcf2edac077efdcb5807228fd18bfa08420
parent3f36252ff375366fa81365dea7e30166994d5ed7 (diff)
downloadchromium_src-769e94ab4f20554bd0ae0c2be5ad2654a62ce16b.zip
chromium_src-769e94ab4f20554bd0ae0c2be5ad2654a62ce16b.tar.gz
chromium_src-769e94ab4f20554bd0ae0c2be5ad2654a62ce16b.tar.bz2
Don't leave renderer process frozen when canceling JavaScript dialogs.
BUG=297289 TEST=See bug for repro steps. R=avi@chromium.org, sky@chromium.org Review URL: https://codereview.chromium.org/24436003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@225253 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.cc10
-rw-r--r--chrome/browser/ui/browser_browsertest.cc8
2 files changed, 15 insertions, 3 deletions
diff --git a/chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.cc b/chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.cc
index c65a732..758d79e 100644
--- a/chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.cc
+++ b/chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.cc
@@ -108,7 +108,10 @@ void JavaScriptAppModalDialog::Invalidate() {
return;
AppModalDialog::Invalidate();
- callback_.Reset();
+ if (!callback_.is_null()) {
+ callback_.Run(false, string16());
+ callback_.Reset();
+ }
if (native_dialog())
CloseModalDialog();
}
@@ -161,7 +164,10 @@ void JavaScriptAppModalDialog::NotifyDelegate(bool success,
if (!IsValid())
return;
- callback_.Run(success, user_input);
+ if (!callback_.is_null()) {
+ callback_.Run(success, user_input);
+ callback_.Reset();
+ }
// The callback_ above may delete web_contents_, thus removing the extra
// data from the map owned by ChromeJavaScriptDialogManager. Make sure
diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc
index 56901bc..4d1813f 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>";
@@ -1727,10 +1730,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());
}