summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host/render_view_host.cc
diff options
context:
space:
mode:
authorstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-07 19:14:11 +0000
committerstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-07 19:14:11 +0000
commitf7b28d07ca2310391c23ad415668bb7a24ab78ef (patch)
tree5b58440318ab03b2fae8e99c422265b90d8220db /chrome/browser/renderer_host/render_view_host.cc
parentfd1e1a386c679717a6d0d25952dc38360fac3189 (diff)
downloadchromium_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.cc17
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,