Index: content/browser/web_contents/web_contents_impl.cc |
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
index d8bdf2f26bda627ec589ecf4d6eb7989e2938b69..a8e41e567f55932f84b2a92f92e35a867b42b860 100644 |
--- a/content/browser/web_contents/web_contents_impl.cc |
+++ b/content/browser/web_contents/web_contents_impl.cc |
@@ -4226,7 +4226,9 @@ |
delegate_->ShouldSuppressDialogs(this) || |
!delegate_->GetJavaScriptDialogManager(this); |
if (suppress_this_message) { |
- rfhi->JavaScriptDialogClosed(reply_msg, true, base::string16(), true); |
+ rfhi->JavaScriptDialogClosed(reply_msg, true, base::string16(), |
+ /*is_before_unload_dialog=*/true, |
+ /*dialog_was_suppressed=*/true); |
return; |
} |
@@ -4844,6 +4846,16 @@ |
if (ShouldIgnoreUnresponsiveRenderer()) |
return; |
+ RenderFrameHostImpl* rfhi = |
+ static_cast<RenderFrameHostImpl*>(GetRenderViewHost()->GetMainFrame()); |
+ if (rfhi->is_waiting_for_beforeunload_ack()) { |
+ // If the hang is in the beforeunload handler, pretend the beforeunload |
+ // listeners have all fired and allow the delegate to continue closing; |
+ // the user will not have the option of cancelling the close. |
+ rfhi->SimulateBeforeUnloadAck(); |
+ return; |
+ } |
+ |
if (!GetRenderViewHost() || !GetRenderViewHost()->IsRenderViewLive()) |
return; |
@@ -5105,6 +5117,7 @@ |
if (rfh) { |
rfh->JavaScriptDialogClosed(reply_msg, success, user_input, |
+ is_showing_before_unload_dialog_, |
dialog_was_suppressed); |
} else { |
// Don't leak the sync IPC reply if the RFH or process is gone. |