diff options
Diffstat (limited to 'chrome/browser/render_view_host.cc')
-rw-r--r-- | chrome/browser/render_view_host.cc | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/chrome/browser/render_view_host.cc b/chrome/browser/render_view_host.cc index 84f5a7d..8f866ec 100644 --- a/chrome/browser/render_view_host.cc +++ b/chrome/browser/render_view_host.cc @@ -243,9 +243,6 @@ void RenderViewHost::FirePageBeforeUnload() { } void RenderViewHost::FirePageUnload() { - // Start the hang monitor in case the renderer hangs in the unload handler. - is_waiting_for_unload_ack_ = true; - StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); ClosePage(site_instance()->process_host_id(), routing_id()); } @@ -267,6 +264,10 @@ void RenderViewHost::ClosePageIgnoringUnloadEvents(int render_process_host_id, void RenderViewHost::ClosePage(int new_render_process_host_id, int new_request_id) { + // Start the hang monitor in case the renderer hangs in the unload handler. + is_waiting_for_unload_ack_ = true; + StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); + if (IsRenderViewLive()) { Send(new ViewMsg_ClosePage(routing_id_, new_render_process_host_id, @@ -280,9 +281,15 @@ void RenderViewHost::ClosePage(int new_render_process_host_id, } } -void RenderViewHost::SetHasPendingCrossSiteRequest(bool has_pending_request) { +void RenderViewHost::SetHasPendingCrossSiteRequest(bool has_pending_request, + int request_id) { Singleton<CrossSiteRequestManager>()->SetHasPendingCrossSiteRequest( process()->host_id(), routing_id_, has_pending_request); + pending_request_id_ = request_id; +} + +int RenderViewHost::GetPendingRequestId() { + return pending_request_id_; } void RenderViewHost::OnCrossSiteResponse(int new_render_process_host_id, @@ -1041,6 +1048,7 @@ void RenderViewHost::OnMsgRunJavaScriptMessage( StopHangMonitorTimeout(); if (modal_dialog_count_++ == 0) SetEvent(modal_dialog_event_.Get()); + bool did_suppress_message = false; delegate_->RunJavaScriptMessage(message, default_prompt, flags, reply_msg); } @@ -1251,22 +1259,11 @@ void RenderViewHost::OnQueryFormFieldAutofill(const std::wstring& field_name, } void RenderViewHost::NotifyRendererUnresponsive() { - if (is_waiting_for_unload_ack_ && - !Singleton<CrossSiteRequestManager>()->HasPendingCrossSiteRequest( - process()->host_id(), routing_id_)) { - // If the tab hangs in the beforeunload/unload handler there's really - // nothing we can do to recover. Pretend the unload listeners have - // all fired and close the tab. If the hang is in the beforeunload handler - // then the user will not have the option of cancelling the close. - UnloadListenerHasFired(); - delegate_->Close(this); - return; - } - // If the debugger is attached, we're going to be unresponsive anytime it's // stopped at a breakpoint. - if (!debugger_attached_) - delegate_->RendererUnresponsive(this); + if (!debugger_attached_) { + delegate_->RendererUnresponsive(this, is_waiting_for_unload_ack_); + } } void RenderViewHost::NotifyRendererResponsive() { |