Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/frame_host/render_frame_host_impl.h" | 5 #include "content/browser/frame_host/render_frame_host_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/containers/hash_tables.h" | 9 #include "base/containers/hash_tables.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 130 frame_tree_(frame_tree), | 130 frame_tree_(frame_tree), |
| 131 frame_tree_node_(frame_tree_node), | 131 frame_tree_node_(frame_tree_node), |
| 132 routing_id_(routing_id), | 132 routing_id_(routing_id), |
| 133 render_frame_created_(false), | 133 render_frame_created_(false), |
| 134 navigations_suspended_(false), | 134 navigations_suspended_(false), |
| 135 is_waiting_for_beforeunload_ack_(false), | 135 is_waiting_for_beforeunload_ack_(false), |
| 136 unload_ack_is_for_cross_site_transition_(false), | 136 unload_ack_is_for_cross_site_transition_(false), |
| 137 accessibility_reset_token_(0), | 137 accessibility_reset_token_(0), |
| 138 accessibility_reset_count_(0), | 138 accessibility_reset_count_(0), |
| 139 no_create_browser_accessibility_manager_for_testing_(false), | 139 no_create_browser_accessibility_manager_for_testing_(false), |
| 140 has_beforeunload_handlers_(false), | |
| 141 has_unload_handlers_(false), | |
| 142 override_sudden_termination_status_(false), | |
| 140 weak_ptr_factory_(this) { | 143 weak_ptr_factory_(this) { |
| 141 bool is_swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); | 144 bool is_swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
| 142 frame_tree_->RegisterRenderFrameHost(this); | 145 frame_tree_->RegisterRenderFrameHost(this); |
| 143 GetProcess()->AddRoute(routing_id_, this); | 146 GetProcess()->AddRoute(routing_id_, this); |
| 144 g_routing_id_frame_map.Get().insert(std::make_pair( | 147 g_routing_id_frame_map.Get().insert(std::make_pair( |
| 145 RenderFrameHostID(GetProcess()->GetID(), routing_id_), | 148 RenderFrameHostID(GetProcess()->GetID(), routing_id_), |
| 146 this)); | 149 this)); |
| 147 | 150 |
| 148 if (is_swapped_out) { | 151 if (is_swapped_out) { |
| 149 rfh_state_ = STATE_SWAPPED_OUT; | 152 rfh_state_ = STATE_SWAPPED_OUT; |
| 150 } else { | 153 } else { |
| 151 rfh_state_ = STATE_DEFAULT; | 154 rfh_state_ = STATE_DEFAULT; |
| 152 GetSiteInstance()->increment_active_frame_count(); | 155 GetSiteInstance()->increment_active_frame_count(); |
| 153 } | 156 } |
| 154 | 157 |
| 155 SetUpMojoIfNeeded(); | 158 SetUpMojoIfNeeded(); |
| 156 swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind( | 159 swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind( |
| 157 &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr()))); | 160 &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr()))); |
| 158 } | 161 } |
| 159 | 162 |
| 160 RenderFrameHostImpl::~RenderFrameHostImpl() { | 163 RenderFrameHostImpl::~RenderFrameHostImpl() { |
| 164 if (!SuddenTerminationAllowed()) | |
| 165 GetProcess()->SuddenTerminationChangedForFrame(true); | |
|
Charlie Reis
2015/01/23 06:01:32
I don't think RPH should be tracking this state.
clamy
2015/01/26 16:38:39
Done.
| |
| 161 GetProcess()->RemoveRoute(routing_id_); | 166 GetProcess()->RemoveRoute(routing_id_); |
| 162 g_routing_id_frame_map.Get().erase( | 167 g_routing_id_frame_map.Get().erase( |
| 163 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); | 168 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); |
| 164 | 169 |
| 165 if (delegate_) | 170 if (delegate_) |
| 166 delegate_->RenderFrameDeleted(this); | 171 delegate_->RenderFrameDeleted(this); |
| 167 | 172 |
| 168 FrameAccessibility::GetInstance()->OnRenderFrameHostDestroyed(this); | 173 FrameAccessibility::GetInstance()->OnRenderFrameHostDestroyed(this); |
| 169 | 174 |
| 170 // If this was swapped out, it already decremented the active frame count of | 175 // If this was swapped out, it already decremented the active frame count of |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 329 IPC_MESSAGE_HANDLER(FrameHostMsg_BeginNavigation, | 334 IPC_MESSAGE_HANDLER(FrameHostMsg_BeginNavigation, |
| 330 OnBeginNavigation) | 335 OnBeginNavigation) |
| 331 IPC_MESSAGE_HANDLER(FrameHostMsg_TextSurroundingSelectionResponse, | 336 IPC_MESSAGE_HANDLER(FrameHostMsg_TextSurroundingSelectionResponse, |
| 332 OnTextSurroundingSelectionResponse) | 337 OnTextSurroundingSelectionResponse) |
| 333 IPC_MESSAGE_HANDLER(AccessibilityHostMsg_Events, OnAccessibilityEvents) | 338 IPC_MESSAGE_HANDLER(AccessibilityHostMsg_Events, OnAccessibilityEvents) |
| 334 IPC_MESSAGE_HANDLER(AccessibilityHostMsg_LocationChanges, | 339 IPC_MESSAGE_HANDLER(AccessibilityHostMsg_LocationChanges, |
| 335 OnAccessibilityLocationChanges) | 340 OnAccessibilityLocationChanges) |
| 336 IPC_MESSAGE_HANDLER(AccessibilityHostMsg_FindInPageResult, | 341 IPC_MESSAGE_HANDLER(AccessibilityHostMsg_FindInPageResult, |
| 337 OnAccessibilityFindInPageResult) | 342 OnAccessibilityFindInPageResult) |
| 338 IPC_MESSAGE_HANDLER(FrameHostMsg_ToggleFullscreen, OnToggleFullscreen) | 343 IPC_MESSAGE_HANDLER(FrameHostMsg_ToggleFullscreen, OnToggleFullscreen) |
| 344 IPC_MESSAGE_HANDLER(FrameHostMsg_BeforeUnloadHandlersPresenceChanged, | |
|
Charlie Reis
2015/01/23 06:01:32
nit: Put these just before OnBeforeUnloadACK, sinc
clamy
2015/01/26 16:38:39
Done.
| |
| 345 OnBeforeUnloadHandlersPresenceChanged) | |
| 346 IPC_MESSAGE_HANDLER(FrameHostMsg_UnloadHandlersPresenceChanged, | |
| 347 OnUnloadHandlersPresenceChanged) | |
| 339 #if defined(OS_MACOSX) || defined(OS_ANDROID) | 348 #if defined(OS_MACOSX) || defined(OS_ANDROID) |
| 340 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) | 349 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) |
| 341 IPC_MESSAGE_HANDLER(FrameHostMsg_HidePopup, OnHidePopup) | 350 IPC_MESSAGE_HANDLER(FrameHostMsg_HidePopup, OnHidePopup) |
| 342 #endif | 351 #endif |
| 343 IPC_END_MESSAGE_MAP() | 352 IPC_END_MESSAGE_MAP() |
| 344 | 353 |
| 345 // No further actions here, since we may have been deleted. | 354 // No further actions here, since we may have been deleted. |
| 346 return handled; | 355 return handled; |
| 347 } | 356 } |
| 348 | 357 |
| (...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 881 // If canceled, notify the delegate to cancel its pending navigation entry. | 890 // If canceled, notify the delegate to cancel its pending navigation entry. |
| 882 if (!proceed) | 891 if (!proceed) |
| 883 render_view_host_->GetDelegate()->DidCancelLoading(); | 892 render_view_host_->GetDelegate()->DidCancelLoading(); |
| 884 } | 893 } |
| 885 | 894 |
| 886 bool RenderFrameHostImpl::IsWaitingForUnloadACK() const { | 895 bool RenderFrameHostImpl::IsWaitingForUnloadACK() const { |
| 887 return render_view_host_->is_waiting_for_close_ack_ || | 896 return render_view_host_->is_waiting_for_close_ack_ || |
| 888 rfh_state_ == STATE_PENDING_SWAP_OUT; | 897 rfh_state_ == STATE_PENDING_SWAP_OUT; |
| 889 } | 898 } |
| 890 | 899 |
| 900 bool RenderFrameHostImpl::SuddenTerminationAllowed() const { | |
| 901 return override_sudden_termination_status_ || | |
| 902 (!has_beforeunload_handlers_ && !has_unload_handlers_); | |
| 903 } | |
| 904 | |
| 891 void RenderFrameHostImpl::OnSwapOutACK() { | 905 void RenderFrameHostImpl::OnSwapOutACK() { |
| 892 OnSwappedOut(); | 906 OnSwappedOut(); |
| 893 } | 907 } |
| 894 | 908 |
| 895 void RenderFrameHostImpl::OnSwappedOut() { | 909 void RenderFrameHostImpl::OnSwappedOut() { |
| 896 // Ignore spurious swap out ack. | 910 // Ignore spurious swap out ack. |
| 897 if (rfh_state_ != STATE_PENDING_SWAP_OUT) | 911 if (rfh_state_ != STATE_PENDING_SWAP_OUT) |
| 898 return; | 912 return; |
| 899 | 913 |
| 900 TRACE_EVENT_ASYNC_END0("navigation", "RenderFrameHostImpl::SwapOut", this); | 914 TRACE_EVENT_ASYNC_END0("navigation", "RenderFrameHostImpl::SwapOut", this); |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1145 if (enter_fullscreen) | 1159 if (enter_fullscreen) |
| 1146 delegate_->EnterFullscreenMode(GetLastCommittedURL().GetOrigin()); | 1160 delegate_->EnterFullscreenMode(GetLastCommittedURL().GetOrigin()); |
| 1147 else | 1161 else |
| 1148 delegate_->ExitFullscreenMode(); | 1162 delegate_->ExitFullscreenMode(); |
| 1149 | 1163 |
| 1150 // The previous call might change the fullscreen state. We need to make sure | 1164 // The previous call might change the fullscreen state. We need to make sure |
| 1151 // the renderer is aware of that, which is done via the resize message. | 1165 // the renderer is aware of that, which is done via the resize message. |
| 1152 render_view_host_->WasResized(); | 1166 render_view_host_->WasResized(); |
| 1153 } | 1167 } |
| 1154 | 1168 |
| 1169 void RenderFrameHostImpl::OnBeforeUnloadHandlersPresenceChanged(bool present) { | |
| 1170 HandleSuddenTerminationDisablerPresenceChange( | |
| 1171 &has_beforeunload_handlers_, present); | |
| 1172 } | |
| 1173 | |
| 1174 void RenderFrameHostImpl::OnUnloadHandlersPresenceChanged(bool present) { | |
| 1175 HandleSuddenTerminationDisablerPresenceChange( | |
| 1176 &has_unload_handlers_, present); | |
| 1177 } | |
| 1178 | |
| 1155 #if defined(OS_MACOSX) || defined(OS_ANDROID) | 1179 #if defined(OS_MACOSX) || defined(OS_ANDROID) |
| 1156 void RenderFrameHostImpl::OnShowPopup( | 1180 void RenderFrameHostImpl::OnShowPopup( |
| 1157 const FrameHostMsg_ShowPopup_Params& params) { | 1181 const FrameHostMsg_ShowPopup_Params& params) { |
| 1158 RenderViewHostDelegateView* view = | 1182 RenderViewHostDelegateView* view = |
| 1159 render_view_host_->delegate_->GetDelegateView(); | 1183 render_view_host_->delegate_->GetDelegateView(); |
| 1160 if (view) { | 1184 if (view) { |
| 1161 view->ShowPopupMenu(this, | 1185 view->ShowPopupMenu(this, |
| 1162 params.bounds, | 1186 params.bounds, |
| 1163 params.item_height, | 1187 params.item_height, |
| 1164 params.item_font_size, | 1188 params.item_font_size, |
| (...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1641 | 1665 |
| 1642 void RenderFrameHostImpl::DidUseGeolocationPermission() { | 1666 void RenderFrameHostImpl::DidUseGeolocationPermission() { |
| 1643 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame(); | 1667 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame(); |
| 1644 GetContentClient()->browser()->RegisterPermissionUsage( | 1668 GetContentClient()->browser()->RegisterPermissionUsage( |
| 1645 PERMISSION_GEOLOCATION, | 1669 PERMISSION_GEOLOCATION, |
| 1646 delegate_->GetAsWebContents(), | 1670 delegate_->GetAsWebContents(), |
| 1647 GetLastCommittedURL().GetOrigin(), | 1671 GetLastCommittedURL().GetOrigin(), |
| 1648 top_frame->GetLastCommittedURL().GetOrigin()); | 1672 top_frame->GetLastCommittedURL().GetOrigin()); |
| 1649 } | 1673 } |
| 1650 | 1674 |
| 1675 void RenderFrameHostImpl::HandleSuddenTerminationDisablerPresenceChange( | |
|
Charlie Reis
2015/01/23 06:01:32
Hmm, this method seems awkward to me.
- The metho
clamy
2015/01/26 16:38:39
Done. If we don't signal the RPHI then only the bo
| |
| 1676 bool* disabler_presence, | |
| 1677 bool new_value) { | |
| 1678 bool sudden_termination_before = SuddenTerminationAllowed(); | |
| 1679 *disabler_presence = new_value; | |
| 1680 if (sudden_termination_before != SuddenTerminationAllowed()) { | |
| 1681 GetProcess()->SuddenTerminationChangedForFrame( | |
| 1682 SuddenTerminationAllowed()); | |
| 1683 } | |
| 1684 } | |
| 1685 | |
| 1651 } // namespace content | 1686 } // namespace content |
| OLD | NEW |