| Index: content/browser/renderer_host/render_view_host.cc
|
| diff --git a/content/browser/renderer_host/render_view_host.cc b/content/browser/renderer_host/render_view_host.cc
|
| index 7440df18bf7dcea47e8ea6577c5d87d6b060636f..232bc4eb6e3c1b9cadfb1a72d4af0b1ba615fb5c 100644
|
| --- a/content/browser/renderer_host/render_view_host.cc
|
| +++ b/content/browser/renderer_host/render_view_host.cc
|
| @@ -97,7 +97,7 @@ RenderViewHost::RenderViewHost(SiteInstance* instance,
|
| delegate_(delegate),
|
| waiting_for_drag_context_response_(false),
|
| enabled_bindings_(0),
|
| - pending_request_id_(0),
|
| + pending_request_id_(-1),
|
| navigations_suspended_(false),
|
| suspended_nav_message_(NULL),
|
| run_modal_reply_msg_(NULL),
|
| @@ -300,45 +300,53 @@ void RenderViewHost::FirePageBeforeUnload(bool for_cross_site_transition) {
|
| }
|
| }
|
|
|
| -void RenderViewHost::ClosePage(bool for_cross_site_transition,
|
| - int new_render_process_host_id,
|
| - int new_request_id) {
|
| - // This will be set back to false in OnClosePageACK, just before we close the
|
| - // tab or replace it with a pending RVH. There are some cases (such as 204
|
| - // errors) where we'll continue to show this RVH.
|
| +void RenderViewHost::SwapOut(int new_render_process_host_id,
|
| + int new_request_id) {
|
| + // This will be set back to false in OnSwapOutACK, just before we replace
|
| + // this RVH with the pending RVH. Note there are some cases (such as 204
|
| + // responses) where we'll continue to show this RVH.
|
| is_waiting_for_unload_ack_ = true;
|
| // Start the hang monitor in case the renderer hangs in the unload handler.
|
| StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS));
|
|
|
| - ViewMsg_ClosePage_Params params;
|
| + ViewMsg_SwapOut_Params params;
|
| params.closing_process_id = process()->id();
|
| params.closing_route_id = routing_id();
|
| - params.for_cross_site_transition = for_cross_site_transition;
|
| params.new_render_process_host_id = new_render_process_host_id;
|
| params.new_request_id = new_request_id;
|
| if (IsRenderViewLive()) {
|
| - NotificationService::current()->Notify(
|
| - NotificationType::RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW,
|
| - Source<RenderViewHost>(this),
|
| - NotificationService::NoDetails());
|
| -
|
| - Send(new ViewMsg_ClosePage(routing_id(), params));
|
| + Send(new ViewMsg_SwapOut(routing_id(), params));
|
| } else {
|
| - // This RenderViewHost doesn't have a live renderer, so just skip closing
|
| - // the page. We must notify the ResourceDispatcherHost on the IO thread,
|
| + // This RenderViewHost doesn't have a live renderer, so just skip the unload
|
| + // event. We must notify the ResourceDispatcherHost on the IO thread,
|
| // which we will do through the RenderProcessHost's widget helper.
|
| - process()->CrossSiteClosePageACK(params);
|
| + process()->CrossSiteSwapOutACK(params);
|
| }
|
| }
|
|
|
| -void RenderViewHost::OnClosePageACK(bool for_cross_site_transition) {
|
| +void RenderViewHost::OnSwapOutACK() {
|
| + // Stop the hang monitor now that the unload handler has finished.
|
| StopHangMonitorTimeout();
|
| is_waiting_for_unload_ack_ = false;
|
| +}
|
| +
|
| +void RenderViewHost::ClosePage() {
|
| + // Start the hang monitor in case the renderer hangs in the unload handler.
|
| + is_waiting_for_unload_ack_ = true;
|
| + StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS));
|
|
|
| - // If this ClosePageACK is not for a cross-site transition, then it is for an
|
| - // attempt to close the tab. We have now finished the unload handler and can
|
| - // proceed with closing the tab.
|
| - if (!for_cross_site_transition) {
|
| + if (IsRenderViewLive()) {
|
| + // TODO(creis): Should this be moved to Shutdown? It may not be called for
|
| + // RenderViewHosts that have been swapped out.
|
| + NotificationService::current()->Notify(
|
| + NotificationType::RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW,
|
| + Source<RenderViewHost>(this),
|
| + NotificationService::NoDetails());
|
| +
|
| + Send(new ViewMsg_ClosePage(routing_id()));
|
| + } else {
|
| + // This RenderViewHost doesn't have a live renderer, so just skip the unload
|
| + // event and close the page.
|
| ClosePageIgnoringUnloadEvents();
|
| }
|
| }
|
| @@ -780,6 +788,7 @@ bool RenderViewHost::OnMessageReceived(const IPC::Message& msg) {
|
| IPC_MESSAGE_HANDLER(ViewHostMsg_TakeFocus, OnTakeFocus)
|
| IPC_MESSAGE_HANDLER(ViewHostMsg_AddMessageToConsole, OnAddMessageToConsole)
|
| IPC_MESSAGE_HANDLER(ViewHostMsg_ShouldClose_ACK, OnMsgShouldCloseACK)
|
| + IPC_MESSAGE_HANDLER(ViewHostMsg_ClosePage_ACK, OnMsgClosePageACK)
|
| IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnMsgSelectionChanged)
|
| IPC_MESSAGE_HANDLER(ViewHostMsg_AccessibilityNotifications,
|
| OnAccessibilityNotifications)
|
| @@ -1304,6 +1313,10 @@ void RenderViewHost::OnMsgShouldCloseACK(bool proceed) {
|
| }
|
| }
|
|
|
| +void RenderViewHost::OnMsgClosePageACK() {
|
| + ClosePageIgnoringUnloadEvents();
|
| +}
|
| +
|
| void RenderViewHost::WindowMoveOrResizeStarted() {
|
| Send(new ViewMsg_MoveOrResizeStarted(routing_id()));
|
| }
|
|
|