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 <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
129 return base::i18n::RIGHT_TO_LEFT; | 129 return base::i18n::RIGHT_TO_LEFT; |
130 default: | 130 default: |
131 NOTREACHED(); | 131 NOTREACHED(); |
132 return base::i18n::UNKNOWN_DIRECTION; | 132 return base::i18n::UNKNOWN_DIRECTION; |
133 } | 133 } |
134 } | 134 } |
135 | 135 |
136 } // namespace | 136 } // namespace |
137 | 137 |
138 // static | 138 // static |
139 bool RenderFrameHostImpl::IsRFHStateActive(RenderFrameHostImplState rfh_state) { | |
140 return rfh_state == STATE_DEFAULT; | |
141 } | |
142 | |
143 // static | |
144 RenderFrameHost* RenderFrameHost::FromID(int render_process_id, | 139 RenderFrameHost* RenderFrameHost::FromID(int render_process_id, |
145 int render_frame_id) { | 140 int render_frame_id) { |
146 return RenderFrameHostImpl::FromID(render_process_id, render_frame_id); | 141 return RenderFrameHostImpl::FromID(render_process_id, render_frame_id); |
147 } | 142 } |
148 | 143 |
149 #if defined(OS_ANDROID) | 144 #if defined(OS_ANDROID) |
150 // static | 145 // static |
151 void RenderFrameHost::AllowInjectingJavaScriptForAndroidWebView() { | 146 void RenderFrameHost::AllowInjectingJavaScriptForAndroidWebView() { |
152 g_allow_injecting_javascript = true; | 147 g_allow_injecting_javascript = true; |
153 } | 148 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
190 : render_view_host_(render_view_host), | 185 : render_view_host_(render_view_host), |
191 delegate_(delegate), | 186 delegate_(delegate), |
192 site_instance_(static_cast<SiteInstanceImpl*>(site_instance)), | 187 site_instance_(static_cast<SiteInstanceImpl*>(site_instance)), |
193 process_(site_instance->GetProcess()), | 188 process_(site_instance->GetProcess()), |
194 cross_process_frame_connector_(NULL), | 189 cross_process_frame_connector_(NULL), |
195 render_frame_proxy_host_(NULL), | 190 render_frame_proxy_host_(NULL), |
196 frame_tree_(frame_tree), | 191 frame_tree_(frame_tree), |
197 frame_tree_node_(frame_tree_node), | 192 frame_tree_node_(frame_tree_node), |
198 render_widget_host_(nullptr), | 193 render_widget_host_(nullptr), |
199 routing_id_(routing_id), | 194 routing_id_(routing_id), |
200 rfh_state_(STATE_DEFAULT), | 195 is_waiting_for_swapout_ack_(false), |
201 render_frame_created_(false), | 196 render_frame_created_(false), |
202 navigations_suspended_(false), | 197 navigations_suspended_(false), |
203 is_waiting_for_beforeunload_ack_(false), | 198 is_waiting_for_beforeunload_ack_(false), |
204 unload_ack_is_for_navigation_(false), | 199 unload_ack_is_for_navigation_(false), |
205 is_loading_(false), | 200 is_loading_(false), |
206 pending_commit_(false), | 201 pending_commit_(false), |
207 nav_entry_id_(0), | 202 nav_entry_id_(0), |
208 accessibility_reset_token_(0), | 203 accessibility_reset_token_(0), |
209 accessibility_reset_count_(0), | 204 accessibility_reset_count_(0), |
210 browser_plugin_embedder_ax_tree_id_(AXTreeIDRegistry::kNoAXTreeID), | 205 browser_plugin_embedder_ax_tree_id_(AXTreeIDRegistry::kNoAXTreeID), |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
260 | 255 |
261 GetProcess()->RemoveRoute(routing_id_); | 256 GetProcess()->RemoveRoute(routing_id_); |
262 g_routing_id_frame_map.Get().erase( | 257 g_routing_id_frame_map.Get().erase( |
263 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); | 258 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); |
264 | 259 |
265 site_instance_->RemoveObserver(this); | 260 site_instance_->RemoveObserver(this); |
266 | 261 |
267 if (delegate_ && render_frame_created_) | 262 if (delegate_ && render_frame_created_) |
268 delegate_->RenderFrameDeleted(this); | 263 delegate_->RenderFrameDeleted(this); |
269 | 264 |
270 bool is_active = IsRFHStateActive(rfh_state_); | |
271 | |
272 // If this RenderFrameHost is swapped out, it already decremented the active | 265 // If this RenderFrameHost is swapped out, it already decremented the active |
273 // frame count of the SiteInstance it belongs to. | 266 // frame count of the SiteInstance it belongs to. |
274 if (is_active) | 267 if (is_active()) |
275 GetSiteInstance()->DecrementActiveFrameCount(); | 268 GetSiteInstance()->DecrementActiveFrameCount(); |
276 | 269 |
277 // If this RenderFrameHost is swapping with a RenderFrameProxyHost, the | 270 // If this RenderFrameHost is swapping with a RenderFrameProxyHost, the |
278 // RenderFrame will already be deleted in the renderer process. Main frame | 271 // RenderFrame will already be deleted in the renderer process. Main frame |
279 // RenderFrames will be cleaned up as part of deleting its RenderView. In all | 272 // RenderFrames will be cleaned up as part of deleting its RenderView. In all |
280 // other cases, the RenderFrame should be cleaned up (if it exists). | 273 // other cases, the RenderFrame should be cleaned up (if it exists). |
281 if (is_active && !frame_tree_node_->IsMainFrame() && render_frame_created_) | 274 if (is_active() && !frame_tree_node_->IsMainFrame() && render_frame_created_) |
282 Send(new FrameMsg_Delete(routing_id_)); | 275 Send(new FrameMsg_Delete(routing_id_)); |
283 | 276 |
284 // NULL out the swapout timer; in crash dumps this member will be null only if | 277 // NULL out the swapout timer; in crash dumps this member will be null only if |
285 // the dtor has run. | 278 // the dtor has run. |
286 swapout_event_monitor_timeout_.reset(); | 279 swapout_event_monitor_timeout_.reset(); |
287 | 280 |
288 for (const auto& iter: visual_state_callbacks_) { | 281 for (const auto& iter: visual_state_callbacks_) { |
289 iter.second.Run(false); | 282 iter.second.Run(false); |
290 } | 283 } |
291 | 284 |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
837 const std::string& frame_unique_name, | 830 const std::string& frame_unique_name, |
838 blink::WebSandboxFlags sandbox_flags, | 831 blink::WebSandboxFlags sandbox_flags, |
839 const blink::WebFrameOwnerProperties& frame_owner_properties) { | 832 const blink::WebFrameOwnerProperties& frame_owner_properties) { |
840 // TODO(lukasza): Call ReceivedBadMessage when |frame_unique_name| is empty. | 833 // TODO(lukasza): Call ReceivedBadMessage when |frame_unique_name| is empty. |
841 DCHECK(!frame_unique_name.empty()); | 834 DCHECK(!frame_unique_name.empty()); |
842 | 835 |
843 // It is possible that while a new RenderFrameHost was committed, the | 836 // It is possible that while a new RenderFrameHost was committed, the |
844 // RenderFrame corresponding to this host sent an IPC message to create a | 837 // RenderFrame corresponding to this host sent an IPC message to create a |
845 // frame and it is delivered after this host is swapped out. | 838 // frame and it is delivered after this host is swapped out. |
846 // Ignore such messages, as we know this RenderFrameHost is going away. | 839 // Ignore such messages, as we know this RenderFrameHost is going away. |
847 if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT || | 840 if (!is_active() || frame_tree_node_->current_frame_host() != this) |
848 frame_tree_node_->current_frame_host() != this) | |
849 return; | 841 return; |
850 | 842 |
851 frame_tree_->AddFrame(frame_tree_node_, GetProcess()->GetID(), new_routing_id, | 843 frame_tree_->AddFrame(frame_tree_node_, GetProcess()->GetID(), new_routing_id, |
852 scope, frame_name, frame_unique_name, sandbox_flags, | 844 scope, frame_name, frame_unique_name, sandbox_flags, |
853 frame_owner_properties); | 845 frame_owner_properties); |
854 } | 846 } |
855 | 847 |
856 void RenderFrameHostImpl::OnDetach() { | 848 void RenderFrameHostImpl::OnDetach() { |
857 frame_tree_->RemoveFrame(frame_tree_node_); | 849 frame_tree_->RemoveFrame(frame_tree_node_); |
858 } | 850 } |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1173 | 1165 |
1174 void RenderFrameHostImpl::SwapOut( | 1166 void RenderFrameHostImpl::SwapOut( |
1175 RenderFrameProxyHost* proxy, | 1167 RenderFrameProxyHost* proxy, |
1176 bool is_loading) { | 1168 bool is_loading) { |
1177 // The end of this event is in OnSwapOutACK when the RenderFrame has completed | 1169 // The end of this event is in OnSwapOutACK when the RenderFrame has completed |
1178 // the operation and sends back an IPC message. | 1170 // the operation and sends back an IPC message. |
1179 // The trace event may not end properly if the ACK times out. We expect this | 1171 // The trace event may not end properly if the ACK times out. We expect this |
1180 // to be fixed when RenderViewHostImpl::OnSwapOut moves to RenderFrameHost. | 1172 // to be fixed when RenderViewHostImpl::OnSwapOut moves to RenderFrameHost. |
1181 TRACE_EVENT_ASYNC_BEGIN0("navigation", "RenderFrameHostImpl::SwapOut", this); | 1173 TRACE_EVENT_ASYNC_BEGIN0("navigation", "RenderFrameHostImpl::SwapOut", this); |
1182 | 1174 |
1183 // If this RenderFrameHost is not in the default state, it must have already | 1175 // If this RenderFrameHost is already pending deletion, it must have already |
1184 // gone through this, therefore just return. | 1176 // gone through this, therefore just return. |
1185 if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT) { | 1177 if (!is_active()) { |
1186 NOTREACHED() << "RFH should be in default state when calling SwapOut."; | 1178 NOTREACHED() << "RFH should be in default state when calling SwapOut."; |
1187 return; | 1179 return; |
1188 } | 1180 } |
1189 | 1181 |
1190 swapout_event_monitor_timeout_->Start( | 1182 swapout_event_monitor_timeout_->Start( |
1191 base::TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS)); | 1183 base::TimeDelta::FromMilliseconds(RenderViewHostImpl::kUnloadTimeoutMS)); |
1192 | 1184 |
1193 // There may be no proxy if there are no active views in the process. | 1185 // There may be no proxy if there are no active views in the process. |
1194 int proxy_routing_id = MSG_ROUTING_NONE; | 1186 int proxy_routing_id = MSG_ROUTING_NONE; |
1195 FrameReplicationState replication_state; | 1187 FrameReplicationState replication_state; |
1196 if (proxy) { | 1188 if (proxy) { |
1197 set_render_frame_proxy_host(proxy); | 1189 set_render_frame_proxy_host(proxy); |
1198 proxy_routing_id = proxy->GetRoutingID(); | 1190 proxy_routing_id = proxy->GetRoutingID(); |
1199 replication_state = proxy->frame_tree_node()->current_replication_state(); | 1191 replication_state = proxy->frame_tree_node()->current_replication_state(); |
1200 } | 1192 } |
1201 | 1193 |
1202 if (IsRenderFrameLive()) { | 1194 if (IsRenderFrameLive()) { |
1203 Send(new FrameMsg_SwapOut(routing_id_, proxy_routing_id, is_loading, | 1195 Send(new FrameMsg_SwapOut(routing_id_, proxy_routing_id, is_loading, |
1204 replication_state)); | 1196 replication_state)); |
1205 } | 1197 } |
1206 | 1198 |
1207 // If this is the last active frame in the SiteInstance, the SetState call | 1199 // TODO(nasko): If the frame is not live, shouldn't we just delete the RFH by |
1208 // below will trigger the deletion of the SiteInstance's proxies. | 1200 // simulating the receipt of swap out ack? |
Charlie Reis
2016/04/08 20:25:37
Since we know we want to this, let's rephrase into
nasko
2016/04/08 21:25:32
Done.
| |
1209 SetState(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT); | 1201 is_waiting_for_swapout_ack_ = true; |
1202 if (frame_tree_node_->IsMainFrame()) | |
1203 render_view_host_->set_is_active(false); | |
1204 | |
1205 // If this is the last active frame in the SiteInstance, the | |
1206 // DecrementActiveFrameCount call will trigger the deletion of the | |
1207 // SiteInstance's proxies. | |
1208 GetSiteInstance()->DecrementActiveFrameCount(); | |
1210 | 1209 |
1211 if (!GetParent()) | 1210 if (!GetParent()) |
1212 delegate_->SwappedOut(this); | 1211 delegate_->SwappedOut(this); |
1213 } | 1212 } |
1214 | 1213 |
1215 void RenderFrameHostImpl::OnBeforeUnloadACK( | 1214 void RenderFrameHostImpl::OnBeforeUnloadACK( |
1216 bool proceed, | 1215 bool proceed, |
1217 const base::TimeTicks& renderer_before_unload_start_time, | 1216 const base::TimeTicks& renderer_before_unload_start_time, |
1218 const base::TimeTicks& renderer_before_unload_end_time) { | 1217 const base::TimeTicks& renderer_before_unload_end_time) { |
1219 TRACE_EVENT_ASYNC_END1("navigation", "RenderFrameHostImpl BeforeUnload", this, | 1218 TRACE_EVENT_ASYNC_END1("navigation", "RenderFrameHostImpl BeforeUnload", this, |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1299 before_unload_end_time); | 1298 before_unload_end_time); |
1300 } | 1299 } |
1301 | 1300 |
1302 // If canceled, notify the delegate to cancel its pending navigation entry. | 1301 // If canceled, notify the delegate to cancel its pending navigation entry. |
1303 if (!proceed) | 1302 if (!proceed) |
1304 render_view_host_->GetDelegate()->DidCancelLoading(); | 1303 render_view_host_->GetDelegate()->DidCancelLoading(); |
1305 } | 1304 } |
1306 | 1305 |
1307 bool RenderFrameHostImpl::IsWaitingForUnloadACK() const { | 1306 bool RenderFrameHostImpl::IsWaitingForUnloadACK() const { |
1308 return render_view_host_->is_waiting_for_close_ack_ || | 1307 return render_view_host_->is_waiting_for_close_ack_ || |
1309 rfh_state_ == STATE_PENDING_SWAP_OUT; | 1308 is_waiting_for_swapout_ack_; |
1310 } | 1309 } |
1311 | 1310 |
1312 void RenderFrameHostImpl::OnSwapOutACK() { | 1311 void RenderFrameHostImpl::OnSwapOutACK() { |
1313 OnSwappedOut(); | 1312 OnSwappedOut(); |
1314 } | 1313 } |
1315 | 1314 |
1316 void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) { | 1315 void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) { |
1317 if (frame_tree_node_->IsMainFrame()) { | 1316 if (frame_tree_node_->IsMainFrame()) { |
1318 // Keep the termination status so we can get at it later when we | 1317 // Keep the termination status so we can get at it later when we |
1319 // need to know why it died. | 1318 // need to know why it died. |
(...skipping 13 matching lines...) Expand all Loading... | |
1333 | 1332 |
1334 // Execute any pending AX tree snapshot callbacks with an empty response, | 1333 // Execute any pending AX tree snapshot callbacks with an empty response, |
1335 // since we're never going to get a response from this renderer. | 1334 // since we're never going to get a response from this renderer. |
1336 for (const auto& iter : ax_tree_snapshot_callbacks_) | 1335 for (const auto& iter : ax_tree_snapshot_callbacks_) |
1337 iter.second.Run(ui::AXTreeUpdate()); | 1336 iter.second.Run(ui::AXTreeUpdate()); |
1338 ax_tree_snapshot_callbacks_.clear(); | 1337 ax_tree_snapshot_callbacks_.clear(); |
1339 | 1338 |
1340 // If the process has died, we don't need to wait for the swap out ack from | 1339 // If the process has died, we don't need to wait for the swap out ack from |
1341 // this RenderFrame if it is pending deletion. Complete the swap out to | 1340 // this RenderFrame if it is pending deletion. Complete the swap out to |
1342 // destroy it. | 1341 // destroy it. |
1343 if (!IsRFHStateActive(rfh_state())) | 1342 if (!is_active()) |
1344 OnSwappedOut(); | 1343 OnSwappedOut(); |
1345 | 1344 |
1346 // Note: don't add any more code at this point in the function because | 1345 // Note: don't add any more code at this point in the function because |
1347 // |this| may be deleted. Any additional cleanup should happen before | 1346 // |this| may be deleted. Any additional cleanup should happen before |
1348 // the last block of code here. | 1347 // the last block of code here. |
1349 } | 1348 } |
1350 | 1349 |
1351 void RenderFrameHostImpl::OnSwappedOut() { | 1350 void RenderFrameHostImpl::OnSwappedOut() { |
1352 // Ignore spurious swap out ack. | 1351 // Ignore spurious swap out ack. |
1353 if (rfh_state_ != STATE_PENDING_SWAP_OUT) | 1352 if (!is_waiting_for_swapout_ack_) |
1354 return; | 1353 return; |
1355 | 1354 |
1356 TRACE_EVENT_ASYNC_END0("navigation", "RenderFrameHostImpl::SwapOut", this); | 1355 TRACE_EVENT_ASYNC_END0("navigation", "RenderFrameHostImpl::SwapOut", this); |
1357 swapout_event_monitor_timeout_->Stop(); | 1356 swapout_event_monitor_timeout_->Stop(); |
1358 | 1357 |
1359 ClearAllWebUI(); | 1358 ClearAllWebUI(); |
1360 | 1359 |
1361 // If this is a main frame RFH that's about to be deleted, update its RVH's | 1360 // If this is a main frame RFH that's about to be deleted, update its RVH's |
1362 // swapped-out state here, since SetState won't be called once this RFH is | 1361 // swapped-out state here. https://crbug.com/505887 |
1363 // deleted below. https://crbug.com/505887 | |
1364 if (frame_tree_node_->IsMainFrame()) { | 1362 if (frame_tree_node_->IsMainFrame()) { |
1365 render_view_host_->set_is_active(false); | 1363 render_view_host_->set_is_active(false); |
1366 render_view_host_->set_is_swapped_out(true); | 1364 render_view_host_->set_is_swapped_out(true); |
1367 } | 1365 } |
1368 | 1366 |
1369 bool deleted = | 1367 bool deleted = |
1370 frame_tree_node_->render_manager()->DeleteFromPendingList(this); | 1368 frame_tree_node_->render_manager()->DeleteFromPendingList(this); |
1371 CHECK(deleted); | 1369 CHECK(deleted); |
1372 } | 1370 } |
1373 | 1371 |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1630 // reset but this message includes a reset token. | 1628 // reset but this message includes a reset token. |
1631 if (accessibility_reset_token_ != reset_token) { | 1629 if (accessibility_reset_token_ != reset_token) { |
1632 Send(new AccessibilityMsg_Events_ACK(routing_id_)); | 1630 Send(new AccessibilityMsg_Events_ACK(routing_id_)); |
1633 return; | 1631 return; |
1634 } | 1632 } |
1635 accessibility_reset_token_ = 0; | 1633 accessibility_reset_token_ = 0; |
1636 | 1634 |
1637 RenderWidgetHostViewBase* view = GetViewForAccessibility(); | 1635 RenderWidgetHostViewBase* view = GetViewForAccessibility(); |
1638 | 1636 |
1639 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); | 1637 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); |
1640 if ((accessibility_mode != AccessibilityModeOff) && view && | 1638 if ((accessibility_mode != AccessibilityModeOff) && view && is_active()) { |
1641 RenderFrameHostImpl::IsRFHStateActive(rfh_state())) { | |
1642 if (accessibility_mode & AccessibilityModeFlagPlatform) | 1639 if (accessibility_mode & AccessibilityModeFlagPlatform) |
1643 GetOrCreateBrowserAccessibilityManager(); | 1640 GetOrCreateBrowserAccessibilityManager(); |
1644 | 1641 |
1645 std::vector<AXEventNotificationDetails> details; | 1642 std::vector<AXEventNotificationDetails> details; |
1646 details.reserve(params.size()); | 1643 details.reserve(params.size()); |
1647 for (size_t i = 0; i < params.size(); ++i) { | 1644 for (size_t i = 0; i < params.size(); ++i) { |
1648 const AccessibilityHostMsg_EventParams& param = params[i]; | 1645 const AccessibilityHostMsg_EventParams& param = params[i]; |
1649 AXEventNotificationDetails detail; | 1646 AXEventNotificationDetails detail; |
1650 detail.event_type = param.event_type; | 1647 detail.event_type = param.event_type; |
1651 detail.id = param.id; | 1648 detail.id = param.id; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1701 Send(new AccessibilityMsg_Events_ACK(routing_id_)); | 1698 Send(new AccessibilityMsg_Events_ACK(routing_id_)); |
1702 } | 1699 } |
1703 | 1700 |
1704 void RenderFrameHostImpl::OnAccessibilityLocationChanges( | 1701 void RenderFrameHostImpl::OnAccessibilityLocationChanges( |
1705 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { | 1702 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { |
1706 if (accessibility_reset_token_) | 1703 if (accessibility_reset_token_) |
1707 return; | 1704 return; |
1708 | 1705 |
1709 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( | 1706 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( |
1710 render_view_host_->GetWidget()->GetView()); | 1707 render_view_host_->GetWidget()->GetView()); |
1711 if (view && RenderFrameHostImpl::IsRFHStateActive(rfh_state())) { | 1708 if (view && is_active()) { |
1712 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); | 1709 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); |
1713 if (accessibility_mode & AccessibilityModeFlagPlatform) { | 1710 if (accessibility_mode & AccessibilityModeFlagPlatform) { |
1714 BrowserAccessibilityManager* manager = | 1711 BrowserAccessibilityManager* manager = |
1715 GetOrCreateBrowserAccessibilityManager(); | 1712 GetOrCreateBrowserAccessibilityManager(); |
1716 if (manager) | 1713 if (manager) |
1717 manager->OnLocationChanges(params); | 1714 manager->OnLocationChanges(params); |
1718 } | 1715 } |
1719 // TODO(aboxhall): send location change events to web contents observers too | 1716 // TODO(aboxhall): send location change events to web contents observers too |
1720 } | 1717 } |
1721 } | 1718 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1781 if (IsBrowserSideNavigationEnabled() && to_different_document) { | 1778 if (IsBrowserSideNavigationEnabled() && to_different_document) { |
1782 bad_message::ReceivedBadMessage(GetProcess(), | 1779 bad_message::ReceivedBadMessage(GetProcess(), |
1783 bad_message::RFH_UNEXPECTED_LOAD_START); | 1780 bad_message::RFH_UNEXPECTED_LOAD_START); |
1784 return; | 1781 return; |
1785 } | 1782 } |
1786 bool was_previously_loading = frame_tree_node_->frame_tree()->IsLoading(); | 1783 bool was_previously_loading = frame_tree_node_->frame_tree()->IsLoading(); |
1787 is_loading_ = true; | 1784 is_loading_ = true; |
1788 | 1785 |
1789 // Only inform the FrameTreeNode of a change in load state if the load state | 1786 // Only inform the FrameTreeNode of a change in load state if the load state |
1790 // of this RenderFrameHost is being tracked. | 1787 // of this RenderFrameHost is being tracked. |
1791 if (rfh_state_ == STATE_DEFAULT) { | 1788 if (is_active()) { |
1792 frame_tree_node_->DidStartLoading(to_different_document, | 1789 frame_tree_node_->DidStartLoading(to_different_document, |
1793 was_previously_loading); | 1790 was_previously_loading); |
1794 } | 1791 } |
1795 } | 1792 } |
1796 | 1793 |
1797 void RenderFrameHostImpl::OnDidStopLoading() { | 1794 void RenderFrameHostImpl::OnDidStopLoading() { |
1798 // This method should never be called when the frame is not loading. | 1795 // This method should never be called when the frame is not loading. |
1799 // Unfortunately, it can happen if a history navigation happens during a | 1796 // Unfortunately, it can happen if a history navigation happens during a |
1800 // BeforeUnload or Unload event. | 1797 // BeforeUnload or Unload event. |
1801 // TODO(fdegans): Change this to a DCHECK after LoadEventProgress has been | 1798 // TODO(fdegans): Change this to a DCHECK after LoadEventProgress has been |
1802 // refactored in Blink. See crbug.com/466089 | 1799 // refactored in Blink. See crbug.com/466089 |
1803 if (!is_loading_) { | 1800 if (!is_loading_) { |
1804 LOG(WARNING) << "OnDidStopLoading was called twice."; | 1801 LOG(WARNING) << "OnDidStopLoading was called twice."; |
1805 return; | 1802 return; |
1806 } | 1803 } |
1807 | 1804 |
1808 is_loading_ = false; | 1805 is_loading_ = false; |
1809 navigation_handle_.reset(); | 1806 navigation_handle_.reset(); |
1810 | 1807 |
1811 // Only inform the FrameTreeNode of a change in load state if the load state | 1808 // Only inform the FrameTreeNode of a change in load state if the load state |
1812 // of this RenderFrameHost is being tracked. | 1809 // of this RenderFrameHost is being tracked. |
1813 if (rfh_state_ == STATE_DEFAULT) | 1810 if (is_active()) |
1814 frame_tree_node_->DidStopLoading(); | 1811 frame_tree_node_->DidStopLoading(); |
1815 } | 1812 } |
1816 | 1813 |
1817 void RenderFrameHostImpl::OnDidChangeLoadProgress(double load_progress) { | 1814 void RenderFrameHostImpl::OnDidChangeLoadProgress(double load_progress) { |
1818 frame_tree_node_->DidChangeLoadProgress(load_progress); | 1815 frame_tree_node_->DidChangeLoadProgress(load_progress); |
1819 } | 1816 } |
1820 | 1817 |
1821 void RenderFrameHostImpl::OnSerializeAsMHTMLResponse( | 1818 void RenderFrameHostImpl::OnSerializeAsMHTMLResponse( |
1822 int job_id, | 1819 int job_id, |
1823 bool success, | 1820 bool success, |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1914 | 1911 |
1915 if (browser_command_line.HasSwitch(switches::kEnableWebVR)) { | 1912 if (browser_command_line.HasSwitch(switches::kEnableWebVR)) { |
1916 GetServiceRegistry()->AddService(base::Bind(&VRDeviceManager::BindRequest)); | 1913 GetServiceRegistry()->AddService(base::Bind(&VRDeviceManager::BindRequest)); |
1917 } | 1914 } |
1918 #endif | 1915 #endif |
1919 | 1916 |
1920 GetContentClient()->browser()->RegisterRenderFrameMojoServices( | 1917 GetContentClient()->browser()->RegisterRenderFrameMojoServices( |
1921 GetServiceRegistry(), this); | 1918 GetServiceRegistry(), this); |
1922 } | 1919 } |
1923 | 1920 |
1924 void RenderFrameHostImpl::SetState(RenderFrameHostImplState rfh_state) { | 1921 void RenderFrameHostImpl::ResetWaitingState() { |
Charlie Reis
2016/04/08 20:25:37
Let's put a DCHECK(is_active()) just to catch anyo
nasko
2016/04/08 21:25:32
Done.
| |
1925 // We decrement the number of RenderFrameHosts in a SiteInstance when the | |
1926 // status of a RenderFrameHost gets flipped from active. | |
1927 if (IsRFHStateActive(rfh_state_) && !IsRFHStateActive(rfh_state)) | |
1928 GetSiteInstance()->DecrementActiveFrameCount(); | |
1929 | |
1930 // The active state of the RVH is determined by its main frame, since | 1922 // The active state of the RVH is determined by its main frame, since |
1931 // subframes should have their own widgets. | 1923 // subframes should have their own widgets. |
1932 if (frame_tree_node_->IsMainFrame()) { | 1924 if (frame_tree_node_->IsMainFrame()) { |
1933 render_view_host_->set_is_active(IsRFHStateActive(rfh_state)); | 1925 render_view_host_->set_is_active(true); |
1934 render_view_host_->set_is_swapped_out(false); | 1926 render_view_host_->set_is_swapped_out(false); |
1935 } | 1927 } |
1936 | 1928 |
1937 // Whenever we change the RFH state to and from active state, we should not be | 1929 // Whenever we reset the RFH state, we should not be waiting for beforeunload |
1938 // waiting for beforeunload or close acks. We clear them here to be safe, | 1930 // or close acks. We clear them here to be safe, since they can cause |
1939 // since they can cause navigations to be ignored in | 1931 // navigations to be ignored in OnDidCommitProvisionalLoad. |
1940 // OnDidCommitProvisionalLoad. | 1932 if (is_waiting_for_beforeunload_ack_) { |
1941 // TODO(creis): Move is_waiting_for_beforeunload_ack_ into the state machine. | 1933 is_waiting_for_beforeunload_ack_ = false; |
1942 if (rfh_state == STATE_DEFAULT || rfh_state_ == STATE_DEFAULT) { | 1934 render_view_host_->GetWidget()->decrement_in_flight_event_count(); |
1943 if (is_waiting_for_beforeunload_ack_) { | 1935 render_view_host_->GetWidget()->StopHangMonitorTimeout(); |
1944 is_waiting_for_beforeunload_ack_ = false; | |
1945 render_view_host_->GetWidget()->decrement_in_flight_event_count(); | |
1946 render_view_host_->GetWidget()->StopHangMonitorTimeout(); | |
1947 } | |
1948 send_before_unload_start_time_ = base::TimeTicks(); | |
1949 render_view_host_->is_waiting_for_close_ack_ = false; | |
1950 } | 1936 } |
1951 rfh_state_ = rfh_state; | 1937 send_before_unload_start_time_ = base::TimeTicks(); |
1938 render_view_host_->is_waiting_for_close_ack_ = false; | |
1952 } | 1939 } |
1953 | 1940 |
1954 bool RenderFrameHostImpl::CanCommitURL(const GURL& url) { | 1941 bool RenderFrameHostImpl::CanCommitURL(const GURL& url) { |
1955 // TODO(creis): We should also check for WebUI pages here. Also, when the | 1942 // TODO(creis): We should also check for WebUI pages here. Also, when the |
1956 // out-of-process iframes implementation is ready, we should check for | 1943 // out-of-process iframes implementation is ready, we should check for |
1957 // cross-site URLs that are not allowed to commit in this process. | 1944 // cross-site URLs that are not allowed to commit in this process. |
1958 | 1945 |
1959 // Give the client a chance to disallow URLs from committing. | 1946 // Give the client a chance to disallow URLs from committing. |
1960 return GetContentClient()->browser()->CanCommitURL(GetProcess(), url); | 1947 return GetContentClient()->browser()->CanCommitURL(GetProcess(), url); |
1961 } | 1948 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2007 | 1994 |
2008 // Only send the message if we aren't suspended at the start of a cross-site | 1995 // Only send the message if we aren't suspended at the start of a cross-site |
2009 // request. | 1996 // request. |
2010 if (navigations_suspended_) { | 1997 if (navigations_suspended_) { |
2011 // This may replace an existing set of params, if this is a pending RFH that | 1998 // This may replace an existing set of params, if this is a pending RFH that |
2012 // is navigated twice consecutively. | 1999 // is navigated twice consecutively. |
2013 suspended_nav_params_.reset( | 2000 suspended_nav_params_.reset( |
2014 new NavigationParams(common_params, start_params, request_params)); | 2001 new NavigationParams(common_params, start_params, request_params)); |
2015 } else { | 2002 } else { |
2016 // Get back to a clean state, in case we start a new navigation without | 2003 // Get back to a clean state, in case we start a new navigation without |
2017 // completing a RFH swap or unload handler. | 2004 // completing a RFH swap or unload handler. |
Charlie Reis
2016/04/08 20:25:37
nit: without completing an unload handler.
(I do
nasko
2016/04/08 21:25:32
Done.
| |
2018 SetState(RenderFrameHostImpl::STATE_DEFAULT); | 2005 ResetWaitingState(); |
2019 SendNavigateMessage(common_params, start_params, request_params); | 2006 SendNavigateMessage(common_params, start_params, request_params); |
2020 } | 2007 } |
2021 | 2008 |
2022 // Force the throbber to start. This is done because Blink's "started loading" | 2009 // Force the throbber to start. This is done because Blink's "started loading" |
2023 // message will be received asynchronously from the UI of the browser. But the | 2010 // message will be received asynchronously from the UI of the browser. But the |
2024 // throbber needs to be kept in sync with what's happening in the UI. For | 2011 // throbber needs to be kept in sync with what's happening in the UI. For |
2025 // example, the throbber will start immediately when the user navigates even | 2012 // example, the throbber will start immediately when the user navigates even |
2026 // if the renderer is delayed. There is also an issue with the throbber | 2013 // if the renderer is delayed. There is also an issue with the throbber |
2027 // starting because the WebUI (which controls whether the favicon is | 2014 // starting because the WebUI (which controls whether the favicon is |
2028 // displayed) happens synchronously. If the start loading messages was | 2015 // displayed) happens synchronously. If the start loading messages was |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2174 scoped_ptr<StreamHandle> body, | 2161 scoped_ptr<StreamHandle> body, |
2175 const CommonNavigationParams& common_params, | 2162 const CommonNavigationParams& common_params, |
2176 const RequestNavigationParams& request_params, | 2163 const RequestNavigationParams& request_params, |
2177 bool is_view_source) { | 2164 bool is_view_source) { |
2178 DCHECK((response && body.get()) || | 2165 DCHECK((response && body.get()) || |
2179 !ShouldMakeNetworkRequestForURL(common_params.url)); | 2166 !ShouldMakeNetworkRequestForURL(common_params.url)); |
2180 UpdatePermissionsForNavigation(common_params, request_params); | 2167 UpdatePermissionsForNavigation(common_params, request_params); |
2181 | 2168 |
2182 // Get back to a clean state, in case we start a new navigation without | 2169 // Get back to a clean state, in case we start a new navigation without |
2183 // completing a RFH swap or unload handler. | 2170 // completing a RFH swap or unload handler. |
2184 SetState(RenderFrameHostImpl::STATE_DEFAULT); | 2171 ResetWaitingState(); |
2185 | 2172 |
2186 // The renderer can exit view source mode when any error or cancellation | 2173 // The renderer can exit view source mode when any error or cancellation |
2187 // happen. When reusing the same renderer, overwrite to recover the mode. | 2174 // happen. When reusing the same renderer, overwrite to recover the mode. |
2188 if (is_view_source && | 2175 if (is_view_source && |
2189 this == frame_tree_node_->render_manager()->current_frame_host()) { | 2176 this == frame_tree_node_->render_manager()->current_frame_host()) { |
2190 DCHECK(!GetParent()); | 2177 DCHECK(!GetParent()); |
2191 render_view_host()->Send(new FrameMsg_EnableViewSourceMode(routing_id_)); | 2178 render_view_host()->Send(new FrameMsg_EnableViewSourceMode(routing_id_)); |
2192 } | 2179 } |
2193 | 2180 |
2194 const GURL body_url = body.get() ? body->GetURL() : GURL(); | 2181 const GURL body_url = body.get() ? body->GetURL() : GURL(); |
(...skipping 20 matching lines...) Expand all Loading... | |
2215 } | 2202 } |
2216 } | 2203 } |
2217 | 2204 |
2218 void RenderFrameHostImpl::FailedNavigation( | 2205 void RenderFrameHostImpl::FailedNavigation( |
2219 const CommonNavigationParams& common_params, | 2206 const CommonNavigationParams& common_params, |
2220 const RequestNavigationParams& request_params, | 2207 const RequestNavigationParams& request_params, |
2221 bool has_stale_copy_in_cache, | 2208 bool has_stale_copy_in_cache, |
2222 int error_code) { | 2209 int error_code) { |
2223 // Get back to a clean state, in case a new navigation started without | 2210 // Get back to a clean state, in case a new navigation started without |
2224 // completing a RFH swap or unload handler. | 2211 // completing a RFH swap or unload handler. |
2225 SetState(RenderFrameHostImpl::STATE_DEFAULT); | 2212 ResetWaitingState(); |
2226 | 2213 |
2227 Send(new FrameMsg_FailedNavigation(routing_id_, common_params, request_params, | 2214 Send(new FrameMsg_FailedNavigation(routing_id_, common_params, request_params, |
2228 has_stale_copy_in_cache, error_code)); | 2215 has_stale_copy_in_cache, error_code)); |
2229 | 2216 |
2230 // An error page is expected to commit, hence why is_loading_ is set to true. | 2217 // An error page is expected to commit, hence why is_loading_ is set to true. |
2231 is_loading_ = true; | 2218 is_loading_ = true; |
2232 frame_tree_node_->ResetNavigationRequest(true); | 2219 frame_tree_node_->ResetNavigationRequest(true); |
2233 } | 2220 } |
2234 | 2221 |
2235 void RenderFrameHostImpl::SetUpMojoIfNeeded() { | 2222 void RenderFrameHostImpl::SetUpMojoIfNeeded() { |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2382 mojo::GetProxy(&mojo_image_downloader_)); | 2369 mojo::GetProxy(&mojo_image_downloader_)); |
2383 } | 2370 } |
2384 return mojo_image_downloader_; | 2371 return mojo_image_downloader_; |
2385 } | 2372 } |
2386 | 2373 |
2387 void RenderFrameHostImpl::ResetLoadingState() { | 2374 void RenderFrameHostImpl::ResetLoadingState() { |
2388 if (is_loading()) { | 2375 if (is_loading()) { |
2389 // When pending deletion, just set the loading state to not loading. | 2376 // When pending deletion, just set the loading state to not loading. |
2390 // Otherwise, OnDidStopLoading will take care of that, as well as sending | 2377 // Otherwise, OnDidStopLoading will take care of that, as well as sending |
2391 // notification to the FrameTreeNode about the change in loading state. | 2378 // notification to the FrameTreeNode about the change in loading state. |
2392 if (rfh_state_ != STATE_DEFAULT) | 2379 if (!is_active()) |
2393 is_loading_ = false; | 2380 is_loading_ = false; |
2394 else | 2381 else |
2395 OnDidStopLoading(); | 2382 OnDidStopLoading(); |
2396 } | 2383 } |
2397 } | 2384 } |
2398 | 2385 |
2399 bool RenderFrameHostImpl::IsSameSiteInstance( | 2386 bool RenderFrameHostImpl::IsSameSiteInstance( |
2400 RenderFrameHostImpl* other_render_frame_host) { | 2387 RenderFrameHostImpl* other_render_frame_host) { |
2401 // As a sanity check, make sure the frame belongs to the same BrowserContext. | 2388 // As a sanity check, make sure the frame belongs to the same BrowserContext. |
2402 CHECK_EQ(GetSiteInstance()->GetBrowserContext(), | 2389 CHECK_EQ(GetSiteInstance()->GetBrowserContext(), |
(...skipping 14 matching lines...) Expand all Loading... | |
2417 } | 2404 } |
2418 | 2405 |
2419 void RenderFrameHostImpl::SetAccessibilityCallbackForTesting( | 2406 void RenderFrameHostImpl::SetAccessibilityCallbackForTesting( |
2420 const base::Callback<void(RenderFrameHostImpl*, ui::AXEvent, int)>& | 2407 const base::Callback<void(RenderFrameHostImpl*, ui::AXEvent, int)>& |
2421 callback) { | 2408 callback) { |
2422 accessibility_testing_callback_ = callback; | 2409 accessibility_testing_callback_ = callback; |
2423 } | 2410 } |
2424 | 2411 |
2425 void RenderFrameHostImpl::UpdateAXTreeData() { | 2412 void RenderFrameHostImpl::UpdateAXTreeData() { |
2426 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); | 2413 AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); |
2427 if (accessibility_mode == AccessibilityModeOff || | 2414 if (accessibility_mode == AccessibilityModeOff || !is_active()) { |
2428 !RenderFrameHostImpl::IsRFHStateActive(rfh_state())) { | |
2429 return; | 2415 return; |
2430 } | 2416 } |
2431 | 2417 |
2432 std::vector<AXEventNotificationDetails> details; | 2418 std::vector<AXEventNotificationDetails> details; |
2433 details.reserve(1U); | 2419 details.reserve(1U); |
2434 AXEventNotificationDetails detail; | 2420 AXEventNotificationDetails detail; |
2435 detail.ax_tree_id = GetAXTreeID(); | 2421 detail.ax_tree_id = GetAXTreeID(); |
2436 detail.update.has_tree_data = true; | 2422 detail.update.has_tree_data = true; |
2437 AXContentTreeDataToAXTreeData(&detail.update.tree_data); | 2423 AXContentTreeDataToAXTreeData(&detail.update.tree_data); |
2438 details.push_back(detail); | 2424 details.push_back(detail); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2549 if (navigations_suspended_) { | 2535 if (navigations_suspended_) { |
2550 TRACE_EVENT_ASYNC_BEGIN0("navigation", | 2536 TRACE_EVENT_ASYNC_BEGIN0("navigation", |
2551 "RenderFrameHostImpl navigation suspended", this); | 2537 "RenderFrameHostImpl navigation suspended", this); |
2552 } else { | 2538 } else { |
2553 TRACE_EVENT_ASYNC_END0("navigation", | 2539 TRACE_EVENT_ASYNC_END0("navigation", |
2554 "RenderFrameHostImpl navigation suspended", this); | 2540 "RenderFrameHostImpl navigation suspended", this); |
2555 } | 2541 } |
2556 | 2542 |
2557 if (!suspend && suspended_nav_params_) { | 2543 if (!suspend && suspended_nav_params_) { |
2558 // There's navigation message params waiting to be sent. Now that we're not | 2544 // There's navigation message params waiting to be sent. Now that we're not |
2559 // suspended anymore, resume navigation by sending them. If we were swapped | 2545 // suspended anymore, resume navigation by sending them. |
2560 // out, we should also stop filtering out the IPC messages now. | 2546 ResetWaitingState(); |
2561 SetState(RenderFrameHostImpl::STATE_DEFAULT); | |
2562 | 2547 |
2563 DCHECK(!proceed_time.is_null()); | 2548 DCHECK(!proceed_time.is_null()); |
2564 // TODO(csharrison): Make sure that PlzNavigate and the current architecture | 2549 // TODO(csharrison): Make sure that PlzNavigate and the current architecture |
2565 // measure navigation start in the same way in the presence of the | 2550 // measure navigation start in the same way in the presence of the |
2566 // BeforeUnload event. | 2551 // BeforeUnload event. |
2567 suspended_nav_params_->common_params.navigation_start = proceed_time; | 2552 suspended_nav_params_->common_params.navigation_start = proceed_time; |
2568 SendNavigateMessage(suspended_nav_params_->common_params, | 2553 SendNavigateMessage(suspended_nav_params_->common_params, |
2569 suspended_nav_params_->start_params, | 2554 suspended_nav_params_->start_params, |
2570 suspended_nav_params_->request_params); | 2555 suspended_nav_params_->request_params); |
2571 suspended_nav_params_.reset(); | 2556 suspended_nav_params_.reset(); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2743 } | 2728 } |
2744 | 2729 |
2745 void RenderFrameHostImpl::CreateWebBluetoothService( | 2730 void RenderFrameHostImpl::CreateWebBluetoothService( |
2746 blink::mojom::WebBluetoothServiceRequest request) { | 2731 blink::mojom::WebBluetoothServiceRequest request) { |
2747 DCHECK(!web_bluetooth_service_); | 2732 DCHECK(!web_bluetooth_service_); |
2748 web_bluetooth_service_.reset( | 2733 web_bluetooth_service_.reset( |
2749 new WebBluetoothServiceImpl(this, std::move(request))); | 2734 new WebBluetoothServiceImpl(this, std::move(request))); |
2750 } | 2735 } |
2751 | 2736 |
2752 } // namespace content | 2737 } // namespace content |
OLD | NEW |