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_manager.h" | 5 #include "content/browser/frame_host/render_frame_host_manager.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 | 121 |
122 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { | 122 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { |
123 if (!pending_render_frame_host_) | 123 if (!pending_render_frame_host_) |
124 return NULL; | 124 return NULL; |
125 return pending_render_frame_host_->render_view_host(); | 125 return pending_render_frame_host_->render_view_host(); |
126 } | 126 } |
127 | 127 |
128 RenderWidgetHostView* RenderFrameHostManager::GetRenderWidgetHostView() const { | 128 RenderWidgetHostView* RenderFrameHostManager::GetRenderWidgetHostView() const { |
129 if (interstitial_page_) | 129 if (interstitial_page_) |
130 return interstitial_page_->GetView(); | 130 return interstitial_page_->GetView(); |
131 if (!render_frame_host_) | 131 if (render_frame_host_) |
132 return NULL; | 132 return render_frame_host_->GetView(); |
133 return render_frame_host_->render_view_host()->GetView(); | 133 return nullptr; |
134 } | 134 } |
135 | 135 |
136 RenderFrameProxyHost* RenderFrameHostManager::GetProxyToParent() { | 136 RenderFrameProxyHost* RenderFrameHostManager::GetProxyToParent() { |
137 if (frame_tree_node_->IsMainFrame()) | 137 if (frame_tree_node_->IsMainFrame()) |
138 return NULL; | 138 return NULL; |
139 | 139 |
140 RenderFrameProxyHostMap::iterator iter = | 140 RenderFrameProxyHostMap::iterator iter = |
141 proxy_hosts_.find(frame_tree_node_->parent() | 141 proxy_hosts_.find(frame_tree_node_->parent() |
142 ->render_manager() | 142 ->render_manager() |
143 ->current_frame_host() | 143 ->current_frame_host() |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 if (!InitRenderView(dest_render_frame_host->render_view_host(), | 214 if (!InitRenderView(dest_render_frame_host->render_view_host(), |
215 opener_route_id, | 215 opener_route_id, |
216 MSG_ROUTING_NONE, | 216 MSG_ROUTING_NONE, |
217 frame_tree_node_->IsMainFrame())) | 217 frame_tree_node_->IsMainFrame())) |
218 return NULL; | 218 return NULL; |
219 | 219 |
220 // Now that we've created a new renderer, be sure to hide it if it isn't | 220 // Now that we've created a new renderer, be sure to hide it if it isn't |
221 // our primary one. Otherwise, we might crash if we try to call Show() | 221 // our primary one. Otherwise, we might crash if we try to call Show() |
222 // on it later. | 222 // on it later. |
223 if (dest_render_frame_host != render_frame_host_ && | 223 if (dest_render_frame_host != render_frame_host_ && |
224 dest_render_frame_host->render_view_host()->GetView()) { | 224 dest_render_frame_host->GetView()) { |
225 dest_render_frame_host->render_view_host()->GetView()->Hide(); | 225 dest_render_frame_host->GetView()->Hide(); |
226 } else { | 226 } else { |
227 // Notify here as we won't be calling CommitPending (which does the | 227 // Notify here as we won't be calling CommitPending (which does the |
228 // notify). | 228 // notify). |
229 delegate_->NotifySwappedFromRenderManager( | 229 delegate_->NotifySwappedFromRenderManager( |
230 NULL, render_frame_host_.get(), frame_tree_node_->IsMainFrame()); | 230 NULL, render_frame_host_.get(), frame_tree_node_->IsMainFrame()); |
231 } | 231 } |
232 } | 232 } |
233 | 233 |
234 // If entry includes the request ID of a request that is being transferred, | 234 // If entry includes the request ID of a request that is being transferred, |
235 // the destination render frame will take ownership, so release ownership of | 235 // the destination render frame will take ownership, so release ownership of |
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1147 SiteInstance* old_instance, | 1147 SiteInstance* old_instance, |
1148 SiteInstance* new_instance, | 1148 SiteInstance* new_instance, |
1149 bool is_main_frame) { | 1149 bool is_main_frame) { |
1150 int create_render_frame_flags = 0; | 1150 int create_render_frame_flags = 0; |
1151 if (is_main_frame) | 1151 if (is_main_frame) |
1152 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; | 1152 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; |
1153 | 1153 |
1154 if (delegate_->IsHidden()) | 1154 if (delegate_->IsHidden()) |
1155 create_render_frame_flags |= CREATE_RF_HIDDEN; | 1155 create_render_frame_flags |= CREATE_RF_HIDDEN; |
1156 | 1156 |
1157 int opener_route_id = | 1157 int opener_route_id = CreateOpenerRenderViewsIfNeeded( |
1158 CreateOpenerRenderViewsIfNeeded(old_instance, new_instance); | 1158 old_instance, new_instance, &create_render_frame_flags); |
1159 | 1159 |
1160 if (pending_render_frame_host_) | 1160 if (pending_render_frame_host_) |
1161 CancelPending(); | 1161 CancelPending(); |
1162 | 1162 |
1163 // Create a non-swapped-out RFH with the given opener. | 1163 // Create a non-swapped-out RFH with the given opener. |
1164 pending_render_frame_host_ = | 1164 pending_render_frame_host_ = |
1165 CreateRenderFrame(new_instance, pending_web_ui(), opener_route_id, | 1165 CreateRenderFrame(new_instance, pending_web_ui(), opener_route_id, |
1166 create_render_frame_flags, nullptr); | 1166 create_render_frame_flags, nullptr); |
1167 } | 1167 } |
1168 | 1168 |
1169 int RenderFrameHostManager::CreateOpenerRenderViewsIfNeeded( | 1169 int RenderFrameHostManager::CreateOpenerRenderViewsIfNeeded( |
1170 SiteInstance* old_instance, | 1170 SiteInstance* old_instance, |
1171 SiteInstance* new_instance) { | 1171 SiteInstance* new_instance, |
| 1172 int* create_render_frame_flags) { |
1172 int opener_route_id = MSG_ROUTING_NONE; | 1173 int opener_route_id = MSG_ROUTING_NONE; |
1173 if (new_instance->IsRelatedSiteInstance(old_instance)) { | 1174 if (new_instance->IsRelatedSiteInstance(old_instance)) { |
1174 opener_route_id = | 1175 opener_route_id = |
1175 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance); | 1176 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance); |
1176 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 1177 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
1177 switches::kSitePerProcess)) { | 1178 switches::kSitePerProcess)) { |
1178 // Ensure that the frame tree has RenderFrameProxyHosts for the new | 1179 // Ensure that the frame tree has RenderFrameProxyHosts for the new |
1179 // SiteInstance in all nodes except the current one. | 1180 // SiteInstance in all nodes except the current one. |
1180 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( | 1181 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( |
1181 frame_tree_node_, new_instance); | 1182 frame_tree_node_, new_instance); |
| 1183 // RenderFrames in different processes from their parent RenderFrames |
| 1184 // in the frame tree require RenderWidgets for rendering and processing |
| 1185 // input events. |
| 1186 if (frame_tree_node_->parent() && |
| 1187 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != |
| 1188 new_instance) |
| 1189 *create_render_frame_flags |= CREATE_RF_NEEDS_RENDER_WIDGET_HOST; |
1182 } | 1190 } |
1183 } | 1191 } |
1184 return opener_route_id; | 1192 return opener_route_id; |
1185 } | 1193 } |
1186 | 1194 |
1187 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( | 1195 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
1188 SiteInstance* site_instance, | 1196 SiteInstance* site_instance, |
1189 int view_routing_id, | 1197 int view_routing_id, |
1190 int frame_routing_id, | 1198 int frame_routing_id, |
1191 int flags) { | 1199 int flags) { |
1192 if (frame_routing_id == MSG_ROUTING_NONE) | 1200 if (frame_routing_id == MSG_ROUTING_NONE) |
1193 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); | 1201 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); |
1194 | 1202 |
1195 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); | 1203 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
1196 bool hidden = !!(flags & CREATE_RF_HIDDEN); | 1204 bool hidden = !!(flags & CREATE_RF_HIDDEN); |
1197 | 1205 |
1198 // Create a RVH for main frames, or find the existing one for subframes. | 1206 // Create a RVH for main frames, or find the existing one for subframes. |
1199 FrameTree* frame_tree = frame_tree_node_->frame_tree(); | 1207 FrameTree* frame_tree = frame_tree_node_->frame_tree(); |
1200 RenderViewHostImpl* render_view_host = nullptr; | 1208 RenderViewHostImpl* render_view_host = nullptr; |
1201 if (frame_tree_node_->IsMainFrame()) { | 1209 if (frame_tree_node_->IsMainFrame()) { |
1202 render_view_host = frame_tree->CreateRenderViewHost( | 1210 render_view_host = frame_tree->CreateRenderViewHost( |
1203 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); | 1211 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); |
1204 } else { | 1212 } else { |
1205 render_view_host = frame_tree->GetRenderViewHost(site_instance); | 1213 render_view_host = frame_tree->GetRenderViewHost(site_instance); |
1206 | 1214 |
1207 CHECK(render_view_host); | 1215 CHECK(render_view_host); |
1208 } | 1216 } |
1209 | 1217 |
1210 // TODO(creis): Pass hidden to RFH. | 1218 // TODO(creis): Pass hidden to RFH. |
1211 scoped_ptr<RenderFrameHostImpl> render_frame_host = | 1219 scoped_ptr<RenderFrameHostImpl> render_frame_host = make_scoped_ptr( |
1212 make_scoped_ptr(RenderFrameHostFactory::Create( | 1220 RenderFrameHostFactory::Create( |
1213 render_view_host, render_frame_delegate_, frame_tree, | 1221 render_view_host, render_frame_delegate_, render_widget_delegate_, |
1214 frame_tree_node_, frame_routing_id, flags).release()); | 1222 frame_tree, frame_tree_node_, frame_routing_id, flags).release()); |
1215 return render_frame_host.Pass(); | 1223 return render_frame_host.Pass(); |
1216 } | 1224 } |
1217 | 1225 |
1218 // PlzNavigate | 1226 // PlzNavigate |
1219 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( | 1227 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
1220 const GURL& url, | 1228 const GURL& url, |
1221 SiteInstance* old_instance, | 1229 SiteInstance* old_instance, |
1222 SiteInstance* new_instance, | 1230 SiteInstance* new_instance, |
1223 int bindings) { | 1231 int bindings) { |
1224 CHECK(new_instance); | 1232 CHECK(new_instance); |
1225 CHECK_NE(old_instance, new_instance); | 1233 CHECK_NE(old_instance, new_instance); |
1226 | 1234 |
1227 const NavigationEntry* current_navigation_entry = | 1235 const NavigationEntry* current_navigation_entry = |
1228 delegate_->GetLastCommittedNavigationEntryForRenderManager(); | 1236 delegate_->GetLastCommittedNavigationEntryForRenderManager(); |
1229 scoped_ptr<WebUIImpl> new_web_ui; | 1237 scoped_ptr<WebUIImpl> new_web_ui; |
1230 bool should_reuse_web_ui = ShouldReuseWebUI(current_navigation_entry, url); | 1238 bool should_reuse_web_ui = ShouldReuseWebUI(current_navigation_entry, url); |
1231 if (!should_reuse_web_ui) | 1239 if (!should_reuse_web_ui) |
1232 new_web_ui = CreateWebUI(url, bindings); | 1240 new_web_ui = CreateWebUI(url, bindings); |
1233 | 1241 |
| 1242 int create_render_frame_flags = 0; |
1234 int opener_route_id = | 1243 int opener_route_id = |
1235 CreateOpenerRenderViewsIfNeeded(old_instance, new_instance); | 1244 CreateOpenerRenderViewsIfNeeded(old_instance, new_instance, |
| 1245 &create_render_frame_flags); |
1236 | 1246 |
1237 int create_render_frame_flags = 0; | |
1238 if (frame_tree_node_->IsMainFrame()) | 1247 if (frame_tree_node_->IsMainFrame()) |
1239 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; | 1248 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; |
1240 if (delegate_->IsHidden()) | 1249 if (delegate_->IsHidden()) |
1241 create_render_frame_flags |= CREATE_RF_HIDDEN; | 1250 create_render_frame_flags |= CREATE_RF_HIDDEN; |
1242 scoped_ptr<RenderFrameHostImpl> new_render_frame_host = | 1251 scoped_ptr<RenderFrameHostImpl> new_render_frame_host = |
1243 CreateRenderFrame(new_instance, new_web_ui.get(), opener_route_id, | 1252 CreateRenderFrame(new_instance, new_web_ui.get(), opener_route_id, |
1244 create_render_frame_flags, nullptr); | 1253 create_render_frame_flags, nullptr); |
1245 | 1254 |
1246 if (!new_render_frame_host) | 1255 if (!new_render_frame_host) |
1247 return false; | 1256 return false; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1326 proxy_routing_id = proxy->GetRoutingID(); | 1335 proxy_routing_id = proxy->GetRoutingID(); |
1327 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1336 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
1328 } | 1337 } |
1329 | 1338 |
1330 success = | 1339 success = |
1331 InitRenderView(render_view_host, opener_route_id, proxy_routing_id, | 1340 InitRenderView(render_view_host, opener_route_id, proxy_routing_id, |
1332 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); | 1341 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); |
1333 if (success) { | 1342 if (success) { |
1334 if (frame_tree_node_->IsMainFrame()) { | 1343 if (frame_tree_node_->IsMainFrame()) { |
1335 // Don't show the main frame's view until we get a DidNavigate from it. | 1344 // Don't show the main frame's view until we get a DidNavigate from it. |
1336 render_view_host->GetView()->Hide(); | 1345 // Only the RenderViewHost for the top-level RenderFrameHost has a |
| 1346 // RenderWidgetHostView; RenderWidgetHosts for out-of-process iframes |
| 1347 // will be created later and hidden. |
| 1348 if (render_view_host->GetView()) |
| 1349 render_view_host->GetView()->Hide(); |
1337 } else if (!swapped_out) { | 1350 } else if (!swapped_out) { |
1338 // Init the RFH, so a RenderFrame is created in the renderer. | 1351 // Init the RFH, so a RenderFrame is created in the renderer. |
1339 DCHECK(new_render_frame_host.get()); | 1352 DCHECK(new_render_frame_host.get()); |
1340 success = InitRenderFrame(new_render_frame_host.get()); | 1353 success = InitRenderFrame(new_render_frame_host.get()); |
1341 } | 1354 } |
1342 } | 1355 } |
1343 | 1356 |
1344 if (success) { | 1357 if (success) { |
1345 if (view_routing_id_ptr) | 1358 if (view_routing_id_ptr) |
1346 *view_routing_id_ptr = render_view_host->GetRoutingID(); | 1359 *view_routing_id_ptr = render_view_host->GetRoutingID(); |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1496 // UI committing above and we're done. | 1509 // UI committing above and we're done. |
1497 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { | 1510 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { |
1498 if (will_focus_location_bar) | 1511 if (will_focus_location_bar) |
1499 delegate_->SetFocusToLocationBar(false); | 1512 delegate_->SetFocusToLocationBar(false); |
1500 return; | 1513 return; |
1501 } | 1514 } |
1502 | 1515 |
1503 // Remember if the page was focused so we can focus the new renderer in | 1516 // Remember if the page was focused so we can focus the new renderer in |
1504 // that case. | 1517 // that case. |
1505 bool focus_render_view = !will_focus_location_bar && | 1518 bool focus_render_view = !will_focus_location_bar && |
1506 render_frame_host_->render_view_host()->GetView() && | 1519 render_frame_host_->GetView() && |
1507 render_frame_host_->render_view_host()->GetView()->HasFocus(); | 1520 render_frame_host_->GetView()->HasFocus(); |
1508 | 1521 |
1509 bool is_main_frame = frame_tree_node_->IsMainFrame(); | 1522 bool is_main_frame = frame_tree_node_->IsMainFrame(); |
1510 | 1523 |
1511 // Swap in the pending or speculative frame and make it active. Also ensure | 1524 // Swap in the pending or speculative frame and make it active. Also ensure |
1512 // the FrameTree stays in sync. | 1525 // the FrameTree stays in sync. |
1513 scoped_ptr<RenderFrameHostImpl> old_render_frame_host; | 1526 scoped_ptr<RenderFrameHostImpl> old_render_frame_host; |
1514 if (!browser_side_navigation) { | 1527 if (!browser_side_navigation) { |
1515 DCHECK(!speculative_render_frame_host_); | 1528 DCHECK(!speculative_render_frame_host_); |
1516 old_render_frame_host = | 1529 old_render_frame_host = |
1517 SetRenderFrameHost(pending_render_frame_host_.Pass()); | 1530 SetRenderFrameHost(pending_render_frame_host_.Pass()); |
1518 } else { | 1531 } else { |
1519 // PlzNavigate | 1532 // PlzNavigate |
1520 DCHECK(speculative_render_frame_host_); | 1533 DCHECK(speculative_render_frame_host_); |
1521 old_render_frame_host = | 1534 old_render_frame_host = |
1522 SetRenderFrameHost(speculative_render_frame_host_.Pass()); | 1535 SetRenderFrameHost(speculative_render_frame_host_.Pass()); |
1523 } | 1536 } |
1524 | 1537 |
1525 if (is_main_frame) | 1538 if (is_main_frame) |
1526 render_frame_host_->render_view_host()->AttachToFrameTree(); | 1539 render_frame_host_->render_view_host()->AttachToFrameTree(); |
1527 | 1540 |
1528 // The process will no longer try to exit, so we can decrement the count. | 1541 // The process will no longer try to exit, so we can decrement the count. |
1529 render_frame_host_->GetProcess()->RemovePendingView(); | 1542 render_frame_host_->GetProcess()->RemovePendingView(); |
1530 | 1543 |
1531 // Show the new view (or a sad tab) if necessary. | 1544 // Show the new view (or a sad tab) if necessary. |
1532 bool new_rfh_has_view = !!render_frame_host_->render_view_host()->GetView(); | 1545 bool new_rfh_has_view = !!render_frame_host_->GetView(); |
1533 if (!delegate_->IsHidden() && new_rfh_has_view) { | 1546 if (!delegate_->IsHidden() && new_rfh_has_view) { |
1534 // In most cases, we need to show the new view. | 1547 // In most cases, we need to show the new view. |
1535 render_frame_host_->render_view_host()->GetView()->Show(); | 1548 render_frame_host_->GetView()->Show(); |
1536 } | 1549 } |
1537 if (!new_rfh_has_view) { | 1550 if (!new_rfh_has_view) { |
1538 // If the view is gone, then this RenderViewHost died while it was hidden. | 1551 // If the view is gone, then this RenderViewHost died while it was hidden. |
1539 // We ignored the RenderProcessGone call at the time, so we should send it | 1552 // We ignored the RenderProcessGone call at the time, so we should send it |
1540 // now to make sure the sad tab shows up, etc. | 1553 // now to make sure the sad tab shows up, etc. |
1541 DCHECK(!render_frame_host_->IsRenderFrameLive()); | 1554 DCHECK(!render_frame_host_->IsRenderFrameLive()); |
1542 DCHECK(!render_frame_host_->render_view_host()->IsRenderViewLive()); | 1555 DCHECK(!render_frame_host_->render_view_host()->IsRenderViewLive()); |
1543 delegate_->RenderProcessGoneFromRenderManager( | 1556 delegate_->RenderProcessGoneFromRenderManager( |
1544 render_frame_host_->render_view_host()); | 1557 render_frame_host_->render_view_host()); |
1545 } | 1558 } |
1546 | 1559 |
1547 // For top-level frames, also hide the old RenderViewHost's view. | 1560 // For top-level frames, also hide the old RenderViewHost's view. |
1548 // TODO(creis): As long as show/hide are on RVH, we don't want to hide on | 1561 // TODO(creis): As long as show/hide are on RVH, we don't want to hide on |
1549 // subframe navigations or we will interfere with the top-level frame. | 1562 // subframe navigations or we will interfere with the top-level frame. |
1550 if (is_main_frame && old_render_frame_host->render_view_host()->GetView()) | 1563 if (is_main_frame && old_render_frame_host->render_view_host()->GetView()) |
1551 old_render_frame_host->render_view_host()->GetView()->Hide(); | 1564 old_render_frame_host->render_view_host()->GetView()->Hide(); |
1552 | 1565 |
1553 // Make sure the size is up to date. (Fix for bug 1079768.) | 1566 // Make sure the size is up to date. (Fix for bug 1079768.) |
1554 delegate_->UpdateRenderViewSizeForRenderManager(); | 1567 delegate_->UpdateRenderViewSizeForRenderManager(); |
1555 | 1568 |
1556 if (will_focus_location_bar) { | 1569 if (will_focus_location_bar) { |
1557 delegate_->SetFocusToLocationBar(false); | 1570 delegate_->SetFocusToLocationBar(false); |
1558 } else if (focus_render_view && | 1571 } else if (focus_render_view && render_frame_host_->GetView()) { |
1559 render_frame_host_->render_view_host()->GetView()) { | 1572 render_frame_host_->GetView()->Focus(); |
1560 render_frame_host_->render_view_host()->GetView()->Focus(); | |
1561 } | 1573 } |
1562 | 1574 |
1563 // Notify that we've swapped RenderFrameHosts. We do this before shutting down | 1575 // Notify that we've swapped RenderFrameHosts. We do this before shutting down |
1564 // the RFH so that we can clean up RendererResources related to the RFH first. | 1576 // the RFH so that we can clean up RendererResources related to the RFH first. |
1565 delegate_->NotifySwappedFromRenderManager( | 1577 delegate_->NotifySwappedFromRenderManager( |
1566 old_render_frame_host.get(), render_frame_host_.get(), is_main_frame); | 1578 old_render_frame_host.get(), render_frame_host_.get(), is_main_frame); |
1567 | 1579 |
1568 // Swap out the old frame now that the new one is visible. | 1580 // Swap out the old frame now that the new one is visible. |
1569 // This will swap it out and then put it on the proxy list (if there are other | 1581 // This will swap it out and then put it on the proxy list (if there are other |
1570 // active views in its SiteInstance) or schedule it for deletion when the swap | 1582 // active views in its SiteInstance) or schedule it for deletion when the swap |
1571 // out ack arrives (or immediately if the process isn't live). | 1583 // out ack arrives (or immediately if the process isn't live). |
1572 // In the --site-per-process case, old subframe RHFs are not kept alive inside | 1584 // In the --site-per-process case, old subframe RHFs are not kept alive inside |
1573 // the proxy. | 1585 // the proxy. |
1574 SwapOutOldFrame(old_render_frame_host.Pass()); | 1586 SwapOutOldFrame(old_render_frame_host.Pass()); |
1575 | 1587 |
1576 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 1588 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
1577 switches::kSitePerProcess) && | 1589 switches::kSitePerProcess) && |
1578 !is_main_frame) { | 1590 !is_main_frame) { |
1579 // If this is a subframe, it should have a CrossProcessFrameConnector | 1591 // If this is a subframe, it should have a CrossProcessFrameConnector |
1580 // created already. Use it to link the new RFH's view to the proxy that | 1592 // created already. Use it to link the new RFH's view to the proxy that |
1581 // belongs to the parent frame's SiteInstance. | 1593 // belongs to the parent frame's SiteInstance. |
1582 // Note: We do this after swapping out the old RFH because that may create | 1594 // Note: We do this after swapping out the old RFH because that may create |
1583 // the proxy we're looking for. | 1595 // the proxy we're looking for. |
1584 RenderFrameProxyHost* proxy_to_parent = GetProxyToParent(); | 1596 RenderFrameProxyHost* proxy_to_parent = GetProxyToParent(); |
1585 if (proxy_to_parent) { | 1597 if (proxy_to_parent) { |
1586 proxy_to_parent->SetChildRWHView( | 1598 proxy_to_parent->SetChildRWHView(render_frame_host_->GetView()); |
1587 render_frame_host_->render_view_host()->GetView()); | |
1588 } | 1599 } |
1589 | 1600 |
1590 // Since the new RenderFrameHost is now committed, there must be no proxies | 1601 // Since the new RenderFrameHost is now committed, there must be no proxies |
1591 // for its SiteInstance. Delete any existing ones. | 1602 // for its SiteInstance. Delete any existing ones. |
1592 RenderFrameProxyHostMap::iterator iter = | 1603 RenderFrameProxyHostMap::iterator iter = |
1593 proxy_hosts_.find(render_frame_host_->GetSiteInstance()->GetId()); | 1604 proxy_hosts_.find(render_frame_host_->GetSiteInstance()->GetId()); |
1594 if (iter != proxy_hosts_.end()) { | 1605 if (iter != proxy_hosts_.end()) { |
1595 delete iter->second; | 1606 delete iter->second; |
1596 proxy_hosts_.erase(iter); | 1607 proxy_hosts_.erase(iter); |
1597 } | 1608 } |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 1879 void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
1869 SiteInstance* instance) { | 1880 SiteInstance* instance) { |
1870 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 1881 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); |
1871 if (iter != proxy_hosts_.end()) { | 1882 if (iter != proxy_hosts_.end()) { |
1872 delete iter->second; | 1883 delete iter->second; |
1873 proxy_hosts_.erase(iter); | 1884 proxy_hosts_.erase(iter); |
1874 } | 1885 } |
1875 } | 1886 } |
1876 | 1887 |
1877 } // namespace content | 1888 } // namespace content |
OLD | NEW |