OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/render_view_host.h" | 5 #include "content/browser/renderer_host/render_view_host.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 | 90 |
91 RenderViewHost::RenderViewHost(SiteInstance* instance, | 91 RenderViewHost::RenderViewHost(SiteInstance* instance, |
92 RenderViewHostDelegate* delegate, | 92 RenderViewHostDelegate* delegate, |
93 int routing_id, | 93 int routing_id, |
94 SessionStorageNamespace* session_storage) | 94 SessionStorageNamespace* session_storage) |
95 : RenderWidgetHost(instance->GetProcess(), routing_id), | 95 : RenderWidgetHost(instance->GetProcess(), routing_id), |
96 instance_(instance), | 96 instance_(instance), |
97 delegate_(delegate), | 97 delegate_(delegate), |
98 waiting_for_drag_context_response_(false), | 98 waiting_for_drag_context_response_(false), |
99 enabled_bindings_(0), | 99 enabled_bindings_(0), |
100 pending_request_id_(0), | 100 pending_request_id_(-1), |
101 navigations_suspended_(false), | 101 navigations_suspended_(false), |
102 suspended_nav_message_(NULL), | 102 suspended_nav_message_(NULL), |
103 run_modal_reply_msg_(NULL), | 103 run_modal_reply_msg_(NULL), |
104 is_waiting_for_beforeunload_ack_(false), | 104 is_waiting_for_beforeunload_ack_(false), |
105 is_waiting_for_unload_ack_(false), | 105 is_waiting_for_unload_ack_(false), |
106 unload_ack_is_for_cross_site_transition_(false), | 106 unload_ack_is_for_cross_site_transition_(false), |
107 are_javascript_messages_suppressed_(false), | 107 are_javascript_messages_suppressed_(false), |
108 sudden_termination_allowed_(false), | 108 sudden_termination_allowed_(false), |
109 session_storage_namespace_(session_storage), | 109 session_storage_namespace_(session_storage), |
110 is_extension_process_(false), | 110 is_extension_process_(false), |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 } else { | 293 } else { |
294 // Start the hang monitor in case the renderer hangs in the beforeunload | 294 // Start the hang monitor in case the renderer hangs in the beforeunload |
295 // handler. | 295 // handler. |
296 is_waiting_for_beforeunload_ack_ = true; | 296 is_waiting_for_beforeunload_ack_ = true; |
297 unload_ack_is_for_cross_site_transition_ = for_cross_site_transition; | 297 unload_ack_is_for_cross_site_transition_ = for_cross_site_transition; |
298 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); | 298 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
299 Send(new ViewMsg_ShouldClose(routing_id())); | 299 Send(new ViewMsg_ShouldClose(routing_id())); |
300 } | 300 } |
301 } | 301 } |
302 | 302 |
303 void RenderViewHost::ClosePage(bool for_cross_site_transition, | 303 void RenderViewHost::SwapOut(int new_render_process_host_id, |
304 int new_render_process_host_id, | 304 int new_request_id) { |
305 int new_request_id) { | 305 // This will be set back to false in OnSwapOutACK, just before we replace |
306 // This will be set back to false in OnClosePageACK, just before we close the | 306 // this RVH with the pending RVH. Note there are some cases (such as 204 |
307 // tab or replace it with a pending RVH. There are some cases (such as 204 | 307 // responses) where we'll continue to show this RVH. |
308 // errors) where we'll continue to show this RVH. | |
309 is_waiting_for_unload_ack_ = true; | 308 is_waiting_for_unload_ack_ = true; |
310 // Start the hang monitor in case the renderer hangs in the unload handler. | 309 // Start the hang monitor in case the renderer hangs in the unload handler. |
311 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); | 310 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
312 | 311 |
313 ViewMsg_ClosePage_Params params; | 312 ViewMsg_SwapOut_Params params; |
314 params.closing_process_id = process()->id(); | 313 params.closing_process_id = process()->id(); |
315 params.closing_route_id = routing_id(); | 314 params.closing_route_id = routing_id(); |
316 params.for_cross_site_transition = for_cross_site_transition; | |
317 params.new_render_process_host_id = new_render_process_host_id; | 315 params.new_render_process_host_id = new_render_process_host_id; |
318 params.new_request_id = new_request_id; | 316 params.new_request_id = new_request_id; |
319 if (IsRenderViewLive()) { | 317 if (IsRenderViewLive()) { |
| 318 Send(new ViewMsg_SwapOut(routing_id(), params)); |
| 319 } else { |
| 320 // This RenderViewHost doesn't have a live renderer, so just skip the unload |
| 321 // event. We must notify the ResourceDispatcherHost on the IO thread, |
| 322 // which we will do through the RenderProcessHost's widget helper. |
| 323 process()->CrossSiteSwapOutACK(params); |
| 324 } |
| 325 } |
| 326 |
| 327 void RenderViewHost::OnSwapOutACK() { |
| 328 // Stop the hang monitor now that the unload handler has finished. |
| 329 StopHangMonitorTimeout(); |
| 330 is_waiting_for_unload_ack_ = false; |
| 331 } |
| 332 |
| 333 void RenderViewHost::ClosePage() { |
| 334 // Start the hang monitor in case the renderer hangs in the unload handler. |
| 335 is_waiting_for_unload_ack_ = true; |
| 336 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
| 337 |
| 338 if (IsRenderViewLive()) { |
| 339 // TODO(creis): Should this be moved to Shutdown? It may not be called for |
| 340 // RenderViewHosts that have been swapped out. |
320 NotificationService::current()->Notify( | 341 NotificationService::current()->Notify( |
321 NotificationType::RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, | 342 NotificationType::RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, |
322 Source<RenderViewHost>(this), | 343 Source<RenderViewHost>(this), |
323 NotificationService::NoDetails()); | 344 NotificationService::NoDetails()); |
324 | 345 |
325 Send(new ViewMsg_ClosePage(routing_id(), params)); | 346 Send(new ViewMsg_ClosePage(routing_id())); |
326 } else { | 347 } else { |
327 // This RenderViewHost doesn't have a live renderer, so just skip closing | 348 // This RenderViewHost doesn't have a live renderer, so just skip the unload |
328 // the page. We must notify the ResourceDispatcherHost on the IO thread, | 349 // event and close the page. |
329 // which we will do through the RenderProcessHost's widget helper. | |
330 process()->CrossSiteClosePageACK(params); | |
331 } | |
332 } | |
333 | |
334 void RenderViewHost::OnClosePageACK(bool for_cross_site_transition) { | |
335 StopHangMonitorTimeout(); | |
336 is_waiting_for_unload_ack_ = false; | |
337 | |
338 // If this ClosePageACK is not for a cross-site transition, then it is for an | |
339 // attempt to close the tab. We have now finished the unload handler and can | |
340 // proceed with closing the tab. | |
341 if (!for_cross_site_transition) { | |
342 ClosePageIgnoringUnloadEvents(); | 350 ClosePageIgnoringUnloadEvents(); |
343 } | 351 } |
344 } | 352 } |
345 | 353 |
346 void RenderViewHost::ClosePageIgnoringUnloadEvents() { | 354 void RenderViewHost::ClosePageIgnoringUnloadEvents() { |
347 StopHangMonitorTimeout(); | 355 StopHangMonitorTimeout(); |
348 is_waiting_for_beforeunload_ack_ = false; | 356 is_waiting_for_beforeunload_ack_ = false; |
349 is_waiting_for_unload_ack_ = false; | 357 is_waiting_for_unload_ack_ = false; |
350 | 358 |
351 sudden_termination_allowed_ = true; | 359 sudden_termination_allowed_ = true; |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
773 IPC_MESSAGE_HANDLER(ViewHostMsg_SetTooltipText, OnMsgSetTooltipText) | 781 IPC_MESSAGE_HANDLER(ViewHostMsg_SetTooltipText, OnMsgSetTooltipText) |
774 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunJavaScriptMessage, | 782 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunJavaScriptMessage, |
775 OnMsgRunJavaScriptMessage) | 783 OnMsgRunJavaScriptMessage) |
776 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunBeforeUnloadConfirm, | 784 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunBeforeUnloadConfirm, |
777 OnMsgRunBeforeUnloadConfirm) | 785 OnMsgRunBeforeUnloadConfirm) |
778 IPC_MESSAGE_HANDLER(DragHostMsg_StartDragging, OnMsgStartDragging) | 786 IPC_MESSAGE_HANDLER(DragHostMsg_StartDragging, OnMsgStartDragging) |
779 IPC_MESSAGE_HANDLER(DragHostMsg_UpdateDragCursor, OnUpdateDragCursor) | 787 IPC_MESSAGE_HANDLER(DragHostMsg_UpdateDragCursor, OnUpdateDragCursor) |
780 IPC_MESSAGE_HANDLER(ViewHostMsg_TakeFocus, OnTakeFocus) | 788 IPC_MESSAGE_HANDLER(ViewHostMsg_TakeFocus, OnTakeFocus) |
781 IPC_MESSAGE_HANDLER(ViewHostMsg_AddMessageToConsole, OnAddMessageToConsole) | 789 IPC_MESSAGE_HANDLER(ViewHostMsg_AddMessageToConsole, OnAddMessageToConsole) |
782 IPC_MESSAGE_HANDLER(ViewHostMsg_ShouldClose_ACK, OnMsgShouldCloseACK) | 790 IPC_MESSAGE_HANDLER(ViewHostMsg_ShouldClose_ACK, OnMsgShouldCloseACK) |
| 791 IPC_MESSAGE_HANDLER(ViewHostMsg_ClosePage_ACK, OnMsgClosePageACK) |
783 IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnMsgSelectionChanged) | 792 IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnMsgSelectionChanged) |
784 IPC_MESSAGE_HANDLER(ViewHostMsg_AccessibilityNotifications, | 793 IPC_MESSAGE_HANDLER(ViewHostMsg_AccessibilityNotifications, |
785 OnAccessibilityNotifications) | 794 OnAccessibilityNotifications) |
786 IPC_MESSAGE_HANDLER(ViewHostMsg_OnCSSInserted, OnCSSInserted) | 795 IPC_MESSAGE_HANDLER(ViewHostMsg_OnCSSInserted, OnCSSInserted) |
787 IPC_MESSAGE_HANDLER(ViewHostMsg_ContentBlocked, OnContentBlocked) | 796 IPC_MESSAGE_HANDLER(ViewHostMsg_ContentBlocked, OnContentBlocked) |
788 IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) | 797 IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed) |
789 IPC_MESSAGE_HANDLER(ViewHostMsg_WebDatabaseAccessed, OnWebDatabaseAccessed) | 798 IPC_MESSAGE_HANDLER(ViewHostMsg_WebDatabaseAccessed, OnWebDatabaseAccessed) |
790 IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeChanged, OnMsgFocusedNodeChanged) | 799 IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeChanged, OnMsgFocusedNodeChanged) |
791 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) | 800 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) |
792 IPC_MESSAGE_HANDLER(ViewHostMsg_ScriptEvalResponse, OnScriptEvalResponse) | 801 IPC_MESSAGE_HANDLER(ViewHostMsg_ScriptEvalResponse, OnScriptEvalResponse) |
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1297 is_waiting_for_beforeunload_ack_ = false; | 1306 is_waiting_for_beforeunload_ack_ = false; |
1298 | 1307 |
1299 RenderViewHostDelegate::RendererManagement* management_delegate = | 1308 RenderViewHostDelegate::RendererManagement* management_delegate = |
1300 delegate_->GetRendererManagementDelegate(); | 1309 delegate_->GetRendererManagementDelegate(); |
1301 if (management_delegate) { | 1310 if (management_delegate) { |
1302 management_delegate->ShouldClosePage( | 1311 management_delegate->ShouldClosePage( |
1303 unload_ack_is_for_cross_site_transition_, proceed); | 1312 unload_ack_is_for_cross_site_transition_, proceed); |
1304 } | 1313 } |
1305 } | 1314 } |
1306 | 1315 |
| 1316 void RenderViewHost::OnMsgClosePageACK() { |
| 1317 ClosePageIgnoringUnloadEvents(); |
| 1318 } |
| 1319 |
1307 void RenderViewHost::WindowMoveOrResizeStarted() { | 1320 void RenderViewHost::WindowMoveOrResizeStarted() { |
1308 Send(new ViewMsg_MoveOrResizeStarted(routing_id())); | 1321 Send(new ViewMsg_MoveOrResizeStarted(routing_id())); |
1309 } | 1322 } |
1310 | 1323 |
1311 void RenderViewHost::NotifyRendererUnresponsive() { | 1324 void RenderViewHost::NotifyRendererUnresponsive() { |
1312 delegate_->RendererUnresponsive( | 1325 delegate_->RendererUnresponsive( |
1313 this, is_waiting_for_beforeunload_ack_ || is_waiting_for_unload_ack_); | 1326 this, is_waiting_for_beforeunload_ack_ || is_waiting_for_unload_ack_); |
1314 } | 1327 } |
1315 | 1328 |
1316 void RenderViewHost::NotifyRendererResponsive() { | 1329 void RenderViewHost::NotifyRendererResponsive() { |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1596 LOG(DFATAL) << "Invalid checked state " << checked_state; | 1609 LOG(DFATAL) << "Invalid checked state " << checked_state; |
1597 return; | 1610 return; |
1598 } | 1611 } |
1599 | 1612 |
1600 CommandState state; | 1613 CommandState state; |
1601 state.is_enabled = is_enabled; | 1614 state.is_enabled = is_enabled; |
1602 state.checked_state = | 1615 state.checked_state = |
1603 static_cast<RenderViewCommandCheckedState>(checked_state); | 1616 static_cast<RenderViewCommandCheckedState>(checked_state); |
1604 command_states_[static_cast<RenderViewCommand>(command)] = state; | 1617 command_states_[static_cast<RenderViewCommand>(command)] = state; |
1605 } | 1618 } |
OLD | NEW |