diff options
author | stuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-07 19:14:11 +0000 |
---|---|---|
committer | stuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-07 19:14:11 +0000 |
commit | f7b28d07ca2310391c23ad415668bb7a24ab78ef (patch) | |
tree | 5b58440318ab03b2fae8e99c422265b90d8220db /chrome/browser/renderer_host/render_view_host.cc | |
parent | fd1e1a386c679717a6d0d25952dc38360fac3189 (diff) | |
download | chromium_src-f7b28d07ca2310391c23ad415668bb7a24ab78ef.zip chromium_src-f7b28d07ca2310391c23ad415668bb7a24ab78ef.tar.gz chromium_src-f7b28d07ca2310391c23ad415668bb7a24ab78ef.tar.bz2 |
Fix handling of JS dialog suppressino during tab closing
Send the dialog response reply to the renderer before killing the tab, since RenderView can't close while it's waiting for a response.
BUG=37324
TEST=Close a tab which plays audio, has multiple alerts in onbeforeunload, and shares a renderer process with at least one other tab. Choose to prevent the page from creating more dialogs. The audio should stop when the tab closes.
Review URL: http://codereview.chromium.org/3621009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61829 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/renderer_host/render_view_host.cc')
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.cc | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index 143bc1a..708e77a 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -594,18 +594,21 @@ void RenderViewHost::JavaScriptMessageBoxClosed(IPC::Message* reply_msg, process()->set_ignore_input_events(false); bool is_waiting = is_waiting_for_beforeunload_ack_ || is_waiting_for_unload_ack_; - if (is_waiting) { - if (are_javascript_messages_suppressed_) { - delegate_->RendererUnresponsive(this, is_waiting); - return; - } - + if (is_waiting) StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); - } ViewHostMsg_RunJavaScriptMessage::WriteReplyParams(reply_msg, success, prompt); Send(reply_msg); + + // If we are waiting for an unload or beforeunload ack and the user has + // suppressed messages, kill the tab immediately; a page that's spamming + // alerts in onbeforeunload is presumably malicious, so there's no point in + // continuing to run its script and dragging out the process. + // This must be done after sending the reply since RenderView can't close + // correctly while waiting for a response. + if (is_waiting && are_javascript_messages_suppressed_) + delegate_->RendererUnresponsive(this, is_waiting); } void RenderViewHost::ModalHTMLDialogClosed(IPC::Message* reply_msg, |