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 <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 1196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1207 if (!is_active()) { | 1207 if (!is_active()) { |
| 1208 NOTREACHED() << "RFH should be in default state when calling SwapOut."; | 1208 NOTREACHED() << "RFH should be in default state when calling SwapOut."; |
| 1209 return; | 1209 return; |
| 1210 } | 1210 } |
| 1211 | 1211 |
| 1212 if (swapout_event_monitor_timeout_) { | 1212 if (swapout_event_monitor_timeout_) { |
| 1213 swapout_event_monitor_timeout_->Start(base::TimeDelta::FromMilliseconds( | 1213 swapout_event_monitor_timeout_->Start(base::TimeDelta::FromMilliseconds( |
| 1214 RenderViewHostImpl::kUnloadTimeoutMS)); | 1214 RenderViewHostImpl::kUnloadTimeoutMS)); |
| 1215 } | 1215 } |
| 1216 | 1216 |
| 1217 // There may be no proxy if there are no active views in the process. | 1217 // There should always be a proxy to replace the old RenderFrameHost. If |
| 1218 int proxy_routing_id = MSG_ROUTING_NONE; | 1218 // there are no remaining active views in the process, the proxy will be |
| 1219 FrameReplicationState replication_state; | 1219 // short-lived and will be deleted when the SwapOut ACK is received. |
| 1220 if (proxy) { | 1220 DCHECK(proxy); |
|
Charlie Reis
2016/04/22 19:11:33
Given the trouble we've had here, let's make this
alexmos
2016/04/25 18:17:08
Done.
| |
| 1221 set_render_frame_proxy_host(proxy); | 1221 |
| 1222 proxy_routing_id = proxy->GetRoutingID(); | 1222 set_render_frame_proxy_host(proxy); |
| 1223 replication_state = proxy->frame_tree_node()->current_replication_state(); | 1223 int proxy_routing_id = proxy->GetRoutingID(); |
|
Charlie Reis
2016/04/22 19:11:33
nit: Move proxy_routing_id and replication_state i
alexmos
2016/04/25 18:17:08
Done.
| |
| 1224 } | 1224 FrameReplicationState replication_state = |
| 1225 proxy->frame_tree_node()->current_replication_state(); | |
| 1225 | 1226 |
| 1226 if (IsRenderFrameLive()) { | 1227 if (IsRenderFrameLive()) { |
| 1227 Send(new FrameMsg_SwapOut(routing_id_, proxy_routing_id, is_loading, | 1228 Send(new FrameMsg_SwapOut(routing_id_, proxy_routing_id, is_loading, |
| 1228 replication_state)); | 1229 replication_state)); |
| 1229 } | 1230 } |
| 1230 | 1231 |
| 1231 // TODO(nasko): If the frame is not live, the RFH should just be deleted by | 1232 // TODO(nasko): If the frame is not live, the RFH should just be deleted by |
| 1232 // simulating the receipt of swap out ack. | 1233 // simulating the receipt of swap out ack. |
| 1233 is_waiting_for_swapout_ack_ = true; | 1234 is_waiting_for_swapout_ack_ = true; |
| 1234 if (frame_tree_node_->IsMainFrame()) | 1235 if (frame_tree_node_->IsMainFrame()) |
| 1235 render_view_host_->set_is_active(false); | 1236 render_view_host_->set_is_active(false); |
| 1236 | 1237 |
| 1237 // If this is the last active frame in the SiteInstance, the | |
| 1238 // DecrementActiveFrameCount call will trigger the deletion of the | |
| 1239 // SiteInstance's proxies. | |
| 1240 GetSiteInstance()->DecrementActiveFrameCount(); | |
|
Charlie Reis
2016/04/22 19:11:33
This seems like a real change-- pending delete RFH
alexmos
2016/04/25 18:17:08
You're right, I've verified that we would miss cal
Charlie Reis
2016/04/26 05:06:36
Acknowledged.
| |
| 1241 | |
| 1242 if (!GetParent()) | 1238 if (!GetParent()) |
| 1243 delegate_->SwappedOut(this); | 1239 delegate_->SwappedOut(this); |
| 1244 } | 1240 } |
| 1245 | 1241 |
| 1246 void RenderFrameHostImpl::OnBeforeUnloadACK( | 1242 void RenderFrameHostImpl::OnBeforeUnloadACK( |
| 1247 bool proceed, | 1243 bool proceed, |
| 1248 const base::TimeTicks& renderer_before_unload_start_time, | 1244 const base::TimeTicks& renderer_before_unload_start_time, |
| 1249 const base::TimeTicks& renderer_before_unload_end_time) { | 1245 const base::TimeTicks& renderer_before_unload_end_time) { |
| 1250 TRACE_EVENT_ASYNC_END1("navigation", "RenderFrameHostImpl BeforeUnload", this, | 1246 TRACE_EVENT_ASYNC_END1("navigation", "RenderFrameHostImpl BeforeUnload", this, |
| 1251 "FrameTreeNode id", | 1247 "FrameTreeNode id", |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1383 // Ignore spurious swap out ack. | 1379 // Ignore spurious swap out ack. |
| 1384 if (!is_waiting_for_swapout_ack_) | 1380 if (!is_waiting_for_swapout_ack_) |
| 1385 return; | 1381 return; |
| 1386 | 1382 |
| 1387 TRACE_EVENT_ASYNC_END0("navigation", "RenderFrameHostImpl::SwapOut", this); | 1383 TRACE_EVENT_ASYNC_END0("navigation", "RenderFrameHostImpl::SwapOut", this); |
| 1388 if (swapout_event_monitor_timeout_) | 1384 if (swapout_event_monitor_timeout_) |
| 1389 swapout_event_monitor_timeout_->Stop(); | 1385 swapout_event_monitor_timeout_->Stop(); |
| 1390 | 1386 |
| 1391 ClearAllWebUI(); | 1387 ClearAllWebUI(); |
| 1392 | 1388 |
| 1389 // If this was the last active frame in the SiteInstance, the | |
| 1390 // DecrementActiveFrameCount call will trigger the deletion of the | |
| 1391 // SiteInstance's proxies. | |
| 1392 GetSiteInstance()->DecrementActiveFrameCount(); | |
|
Charlie Reis
2016/04/22 19:11:33
As noted above, we may just want to do this uncond
alexmos
2016/04/25 18:17:08
Done.
| |
| 1393 | |
| 1393 // If this is a main frame RFH that's about to be deleted, update its RVH's | 1394 // If this is a main frame RFH that's about to be deleted, update its RVH's |
| 1394 // swapped-out state here. https://crbug.com/505887 | 1395 // swapped-out state here. https://crbug.com/505887 |
| 1395 if (frame_tree_node_->IsMainFrame()) { | 1396 if (frame_tree_node_->IsMainFrame()) { |
| 1396 render_view_host_->set_is_active(false); | 1397 render_view_host_->set_is_active(false); |
| 1397 render_view_host_->set_is_swapped_out(true); | 1398 render_view_host_->set_is_swapped_out(true); |
| 1398 } | 1399 } |
| 1399 | 1400 |
| 1400 bool deleted = | 1401 bool deleted = |
| 1401 frame_tree_node_->render_manager()->DeleteFromPendingList(this); | 1402 frame_tree_node_->render_manager()->DeleteFromPendingList(this); |
| 1402 CHECK(deleted); | 1403 CHECK(deleted); |
| (...skipping 1369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2772 // handler after it's destroyed so it can't run after the RFHI is destroyed. | 2773 // handler after it's destroyed so it can't run after the RFHI is destroyed. |
| 2773 web_bluetooth_service_->SetClientConnectionErrorHandler(base::Bind( | 2774 web_bluetooth_service_->SetClientConnectionErrorHandler(base::Bind( |
| 2774 &RenderFrameHostImpl::DeleteWebBluetoothService, base::Unretained(this))); | 2775 &RenderFrameHostImpl::DeleteWebBluetoothService, base::Unretained(this))); |
| 2775 } | 2776 } |
| 2776 | 2777 |
| 2777 void RenderFrameHostImpl::DeleteWebBluetoothService() { | 2778 void RenderFrameHostImpl::DeleteWebBluetoothService() { |
| 2778 web_bluetooth_service_.reset(); | 2779 web_bluetooth_service_.reset(); |
| 2779 } | 2780 } |
| 2780 | 2781 |
| 2781 } // namespace content | 2782 } // namespace content |
| OLD | NEW |