diff options
author | creis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-25 21:32:15 +0000 |
---|---|---|
committer | creis@chromium.org <creis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-25 21:32:15 +0000 |
commit | 769e94ab4f20554bd0ae0c2be5ad2654a62ce16b (patch) | |
tree | 3d79fdcf2edac077efdcb5807228fd18bfa08420 | |
parent | 3f36252ff375366fa81365dea7e30166994d5ed7 (diff) | |
download | chromium_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.cc | 10 | ||||
-rw-r--r-- | chrome/browser/ui/browser_browsertest.cc | 8 |
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()); } |