Chromium Code Reviews| Index: content/browser/frame_host/render_frame_host_impl.cc |
| diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc |
| index f541c6b760e24ca65c3ab75b3afba37c456d998c..f64e3d03eb47044372c896080a4635eea3c9b3fe 100644 |
| --- a/content/browser/frame_host/render_frame_host_impl.cc |
| +++ b/content/browser/frame_host/render_frame_host_impl.cc |
| @@ -1668,10 +1668,8 @@ void RenderFrameHostImpl::OnRunJavaScriptDialog( |
| const GURL& frame_url, |
| JavaScriptDialogType dialog_type, |
| IPC::Message* reply_msg) { |
| - if (!is_active()) { |
| - JavaScriptDialogClosed(reply_msg, true, base::string16(), |
| - /*is_before_unload_dialog=*/false, |
| - /*dialog_was_suppressed=*/true); |
| + if (IsWaitingForUnloadACK()) { |
|
Charlie Reis
2017/02/28 04:59:21
Interesting. Yes, I think this is safer, since it
Avi (use Gerrit)
2017/02/28 05:12:42
Yep. I realized that we already were handling the
|
| + SendJavaScriptDialogReply(reply_msg, true, base::string16()); |
| return; |
| } |
| @@ -2610,20 +2608,15 @@ void RenderFrameHostImpl::JavaScriptDialogClosed( |
| bool is_before_unload_dialog, |
| bool dialog_was_suppressed) { |
| GetProcess()->SetIgnoreInputEvents(false); |
| - bool is_waiting = is_before_unload_dialog || IsWaitingForUnloadACK(); |
| - // If we are executing as part of (before)unload event handling, we don't |
| + // If we are executing as part of beforeunload event handling, we don't |
| // want to use the regular hung_renderer_delay_ms_ if the user has agreed to |
| // leave the current page. In this case, use the regular timeout value used |
| - // during the (before)unload handling. |
| - if (is_waiting) { |
| + // during the beforeunload handling. |
| + if (is_before_unload_dialog) { |
| RendererUnresponsiveType type = |
| - RendererUnresponsiveType::RENDERER_UNRESPONSIVE_DIALOG_CLOSED; |
| - if (success) { |
| - type = is_before_unload_dialog |
| - ? RendererUnresponsiveType::RENDERER_UNRESPONSIVE_BEFORE_UNLOAD |
| - : RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNLOAD; |
| - } |
| + success ? RendererUnresponsiveType::RENDERER_UNRESPONSIVE_BEFORE_UNLOAD |
|
clamy
2017/03/01 16:11:00
If we are in the before unload dialog, shouldn't t
Avi (use Gerrit)
2017/03/01 16:17:38
This metric is yours, so I'm trying to preserve ex
clamy
2017/03/01 16:25:56
Well I don't quite remember the choices behind the
|
| + : RendererUnresponsiveType::RENDERER_UNRESPONSIVE_DIALOG_CLOSED; |
| render_view_host_->GetWidget()->StartHangMonitorTimeout( |
| success |
| ? TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS) |
| @@ -2631,23 +2624,30 @@ void RenderFrameHostImpl::JavaScriptDialogClosed( |
| blink::WebInputEvent::Undefined, type); |
| } |
| - FrameHostMsg_RunJavaScriptDialog::WriteReplyParams(reply_msg, success, |
| - user_input); |
| - Send(reply_msg); |
| + SendJavaScriptDialogReply(reply_msg, success, user_input); |
| - // 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 && dialog_was_suppressed) { |
| + // If we are waiting for a 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_before_unload_dialog && dialog_was_suppressed) { |
| render_view_host_->GetWidget()->delegate()->RendererUnresponsive( |
| render_view_host_->GetWidget(), |
| RendererUnresponsiveType::RENDERER_UNRESPONSIVE_DIALOG_SUPPRESSED); |
| } |
| } |
| +void RenderFrameHostImpl::SendJavaScriptDialogReply( |
| + IPC::Message* reply_msg, |
| + bool success, |
| + const base::string16& user_input) { |
| + FrameHostMsg_RunJavaScriptDialog::WriteReplyParams(reply_msg, success, |
| + user_input); |
| + Send(reply_msg); |
| +} |
| + |
| // PlzNavigate |
| void RenderFrameHostImpl::CommitNavigation( |
| ResourceResponse* response, |