Chromium Code Reviews| Index: content/browser/frame_host/render_frame_host_manager.cc |
| diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc |
| index cd85433714fe8f693e255ef4be2f90db85e957f3..958c6910df9cc98f7793232a3293995975b55451 100644 |
| --- a/content/browser/frame_host/render_frame_host_manager.cc |
| +++ b/content/browser/frame_host/render_frame_host_manager.cc |
| @@ -277,12 +277,11 @@ RenderFrameHostImpl* RenderFrameHostManager::Navigate( |
| dest_render_frame_host->SetUpMojoIfNeeded(); |
| // Recreate the opener chain. |
| - int opener_route_id = |
| - CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance()); |
| + CreateOpenerProxiesIfNeeded(dest_render_frame_host->GetSiteInstance()); |
| if (!InitRenderView(dest_render_frame_host->render_view_host(), |
| - opener_route_id, |
| MSG_ROUTING_NONE, |
| - frame_tree_node_->IsMainFrame())) |
| + frame_tree_node_->IsMainFrame(), |
| + false)) |
| return NULL; |
| // Now that we've created a new renderer, be sure to hide it if it isn't |
| @@ -863,10 +862,9 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
| // created or has crashed), initialize it. |
| if (!navigation_rfh->IsRenderFrameLive()) { |
| // Recreate the opener chain. |
| - int opener_route_id = |
| - CreateOpenerProxiesIfNeeded(navigation_rfh->GetSiteInstance()); |
| - if (!InitRenderView(navigation_rfh->render_view_host(), opener_route_id, |
| - MSG_ROUTING_NONE, frame_tree_node_->IsMainFrame())) { |
| + CreateOpenerProxiesIfNeeded(navigation_rfh->GetSiteInstance()); |
| + if (!InitRenderView(navigation_rfh->render_view_host(), MSG_ROUTING_NONE, |
| + frame_tree_node_->IsMainFrame(), false)) { |
|
nasko
2015/07/07 16:26:21
Sprinkling a ton of extra "false" params is buggin
alexmos
2015/07/08 04:42:18
Yeah, I agree it's pretty annoying. One alternati
nasko
2015/07/08 09:35:19
Yeah, I think the flag version is probably not wor
alexmos
2015/07/08 15:09:27
I suppose the scenario here is some page A opening
alexmos
2015/07/09 02:43:23
Thinking more about this, I think we may actually
|
| return nullptr; |
| } |
| @@ -1399,23 +1397,21 @@ void RenderFrameHostManager::CreatePendingRenderFrameHost( |
| if (!new_instance->GetProcess()->Init()) |
| return; |
| - int opener_route_id = CreateProxiesForNewRenderFrameHost( |
| - old_instance, new_instance, &create_render_frame_flags); |
| + CreateProxiesForNewRenderFrameHost(old_instance, new_instance, |
| + &create_render_frame_flags); |
| // Create a non-swapped-out RFH with the given opener. |
| - pending_render_frame_host_ = |
| - CreateRenderFrame(new_instance, pending_web_ui(), opener_route_id, |
| - create_render_frame_flags, nullptr); |
| + pending_render_frame_host_ = CreateRenderFrame( |
| + new_instance, pending_web_ui(), create_render_frame_flags, nullptr); |
| } |
| -int RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( |
| +void RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( |
| SiteInstance* old_instance, |
| SiteInstance* new_instance, |
| int* create_render_frame_flags) { |
| - int opener_route_id = MSG_ROUTING_NONE; |
| // Only create opener proxies if they are in the same BrowsingInstance. |
| if (new_instance->IsRelatedSiteInstance(old_instance)) |
| - opener_route_id = CreateOpenerProxiesIfNeeded(new_instance); |
| + CreateOpenerProxiesIfNeeded(new_instance); |
| if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kSitePerProcess)) { |
| // Ensure that the frame tree has RenderFrameProxyHosts for the new |
| @@ -1433,7 +1429,6 @@ int RenderFrameHostManager::CreateProxiesForNewRenderFrameHost( |
| new_instance) |
| *create_render_frame_flags |= CREATE_RF_NEEDS_RENDER_WIDGET_HOST; |
| } |
| - return opener_route_id; |
| } |
| scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
| @@ -1491,8 +1486,8 @@ bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
| return false; |
| int create_render_frame_flags = 0; |
| - int opener_route_id = CreateProxiesForNewRenderFrameHost( |
| - old_instance, new_instance, &create_render_frame_flags); |
| + CreateProxiesForNewRenderFrameHost(old_instance, new_instance, |
| + &create_render_frame_flags); |
| if (frame_tree_node_->IsMainFrame()) |
| create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; |
| @@ -1500,7 +1495,7 @@ bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
| create_render_frame_flags |= CREATE_RF_HIDDEN; |
| speculative_render_frame_host_ = |
| CreateRenderFrame(new_instance, speculative_web_ui_.get(), |
| - opener_route_id, create_render_frame_flags, nullptr); |
| + create_render_frame_flags, nullptr); |
| if (!speculative_render_frame_host_) { |
| speculative_web_ui_.reset(); |
| @@ -1512,7 +1507,6 @@ bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
| scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
| SiteInstance* instance, |
| WebUIImpl* web_ui, |
| - int opener_route_id, |
| int flags, |
| int* view_routing_id_ptr) { |
| bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
| @@ -1574,9 +1568,9 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
| proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
| } |
| - success = |
| - InitRenderView(render_view_host, opener_route_id, proxy_routing_id, |
| - !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); |
| + success = InitRenderView(render_view_host, proxy_routing_id, |
| + !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION), |
| + !!(flags & CREATE_RF_SUPPRESS_OPENER)); |
| if (success) { |
| // Remember that InitRenderView also created the RenderFrameProxy. |
| if (swapped_out) |
| @@ -1629,7 +1623,8 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( |
| return nullptr; |
| } |
| -int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { |
| +int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance, |
| + bool suppress_opener) { |
| // A RenderFrameProxyHost should never be created in the same SiteInstance as |
| // the current RFH. |
| CHECK(instance); |
| @@ -1661,8 +1656,8 @@ int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { |
| if (RenderFrameHostManager::IsSwappedOutStateForbidden() && |
| frame_tree_node_->IsMainFrame()) { |
| - InitRenderView( |
| - render_view_host, MSG_ROUTING_NONE, proxy->GetRoutingID(), true); |
| + InitRenderView(render_view_host, proxy->GetRoutingID(), true, |
| + suppress_opener); |
| proxy->set_render_frame_proxy_created(true); |
| } else { |
| proxy->InitRenderFrameProxy(); |
| @@ -1674,7 +1669,7 @@ int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { |
| void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { |
| for (const auto& pair : proxy_hosts_) { |
| child->render_manager()->CreateRenderFrameProxy( |
| - pair.second->GetSiteInstance()); |
| + pair.second->GetSiteInstance(), false); |
| } |
| } |
| @@ -1687,7 +1682,7 @@ void RenderFrameHostManager::EnsureRenderViewInitialized( |
| return; |
| // Recreate the opener chain. |
| - int opener_route_id = CreateOpenerProxiesIfNeeded(instance); |
| + CreateOpenerProxiesIfNeeded(instance); |
| // If the proxy in |instance| doesn't exist, this RenderView is not swapped |
| // out and shouldn't be reinitialized here. |
| @@ -1695,8 +1690,7 @@ void RenderFrameHostManager::EnsureRenderViewInitialized( |
| if (!proxy) |
| return; |
| - InitRenderView(render_view_host, opener_route_id, proxy->GetRoutingID(), |
| - false); |
| + InitRenderView(render_view_host, proxy->GetRoutingID(), false, false); |
| proxy->set_render_frame_proxy_created(true); |
| } |
| @@ -1731,9 +1725,9 @@ void RenderFrameHostManager::SetRWHViewForInnerContents( |
| bool RenderFrameHostManager::InitRenderView( |
| RenderViewHostImpl* render_view_host, |
| - int opener_route_id, |
| int proxy_routing_id, |
| - bool for_main_frame_navigation) { |
| + bool for_main_frame_navigation, |
| + bool suppress_opener) { |
| // Ensure the renderer process is initialized before creating the |
| // RenderView. |
| if (!render_view_host->GetProcess()->Init()) |
| @@ -1765,12 +1759,15 @@ bool RenderFrameHostManager::InitRenderView( |
| } |
| } |
| + int opener_frame_routing_id = MSG_ROUTING_NONE; |
| + if (!suppress_opener) { |
| + opener_frame_routing_id = |
| + GetOpenerRoutingID(render_view_host->GetSiteInstance()); |
| + } |
| + |
| return delegate_->CreateRenderViewForRenderManager( |
| - render_view_host, |
| - opener_route_id, |
| - proxy_routing_id, |
| - frame_tree_node_->current_replication_state(), |
| - for_main_frame_navigation); |
| + render_view_host, opener_frame_routing_id, proxy_routing_id, |
| + frame_tree_node_->current_replication_state(), for_main_frame_navigation); |
| } |
| bool RenderFrameHostManager::InitRenderFrame( |
| @@ -1826,10 +1823,13 @@ int RenderFrameHostManager::GetRoutingIdForSiteInstance( |
| if (render_frame_host_->GetSiteInstance() == site_instance) |
| return render_frame_host_->GetRoutingID(); |
| - RenderFrameProxyHostMap::iterator iter = |
| - proxy_hosts_.find(site_instance->GetId()); |
| - if (iter != proxy_hosts_.end()) |
| - return iter->second->GetRoutingID(); |
| + if (pending_render_frame_host_ && |
| + pending_render_frame_host_->GetSiteInstance() == site_instance) |
| + return pending_render_frame_host_->GetRoutingID(); |
|
alexmos
2015/07/06 23:56:42
See WebContentsImplTest.FindOpenerRVHWhenPending f
nasko
2015/07/07 16:26:21
This has me slightly concerned. If we have already
alexmos
2015/07/08 04:42:18
Interestingly, if I reorder the pending RFH and th
nasko
2015/07/08 09:35:19
Thanks for the thorough explanation. Yes, indeed t
|
| + |
| + RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); |
| + if (proxy) |
| + return proxy->GetRoutingID(); |
| return MSG_ROUTING_NONE; |
| } |
| @@ -2272,19 +2272,17 @@ void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
| } |
| } |
| -int RenderFrameHostManager::CreateOpenerProxiesIfNeeded( |
| +void RenderFrameHostManager::CreateOpenerProxiesIfNeeded( |
| SiteInstance* instance) { |
| FrameTreeNode* opener = frame_tree_node_->opener(); |
| if (!opener) |
| - return MSG_ROUTING_NONE; |
| + return; |
| // Create proxies for the opener chain. |
| - return opener->render_manager()->CreateOpenerProxies(instance); |
| + opener->render_manager()->CreateOpenerProxies(instance); |
| } |
| -int RenderFrameHostManager::CreateOpenerProxies(SiteInstance* instance) { |
| - int opener_route_id = MSG_ROUTING_NONE; |
| - |
| +void RenderFrameHostManager::CreateOpenerProxies(SiteInstance* instance) { |
| // If this tab has an opener, recursively create proxies for the nodes on its |
| // frame tree. |
| // TODO(alexmos): Once we allow frame openers to be updated (which can happen |
| @@ -2294,39 +2292,42 @@ int RenderFrameHostManager::CreateOpenerProxies(SiteInstance* instance) { |
| // be traversed). |
| FrameTreeNode* opener = frame_tree_node_->opener(); |
| if (opener) |
| - opener_route_id = opener->render_manager()->CreateOpenerProxies(instance); |
| + opener->render_manager()->CreateOpenerProxies(instance); |
| // If any of the RenderViews (current, pending, or swapped out) for this |
| - // FrameTree has the same SiteInstance, use it. If such a RenderView exists, |
| - // that implies that proxies for all nodes in the tree should also exist |
| - // (when in site-per-process mode), so it is safe to exit early. |
| + // FrameTree has the same SiteInstance, then we can return early, since |
| + // proxies for other nodes in the tree should also exist (when in |
| + // site-per-process mode). |
| FrameTree* frame_tree = frame_tree_node_->frame_tree(); |
| RenderViewHostImpl* rvh = frame_tree->GetRenderViewHost(instance); |
| if (rvh && rvh->IsRenderViewLive()) |
| - return rvh->GetRoutingID(); |
| + return; |
| - int render_view_routing_id = MSG_ROUTING_NONE; |
| if (RenderFrameHostManager::IsSwappedOutStateForbidden()) { |
| // Ensure that all the nodes in the opener's frame tree have |
| // RenderFrameProxyHosts for the new SiteInstance. |
| frame_tree->CreateProxiesForSiteInstance(nullptr, instance); |
| - rvh = frame_tree->GetRenderViewHost(instance); |
| - render_view_routing_id = rvh->GetRoutingID(); |
| } else if (rvh && !rvh->IsRenderViewLive()) { |
| EnsureRenderViewInitialized(rvh, instance); |
| - render_view_routing_id = rvh->GetRoutingID(); |
| } else { |
| // Create a swapped out RenderView in the given SiteInstance if none exists, |
| // setting its opener to the given route_id. Since the opener can point to |
| // a subframe, do this on the root frame of the opener's frame tree. |
| // Return the new view's route_id. |
| frame_tree->root()->render_manager()-> |
| - CreateRenderFrame(instance, nullptr, opener_route_id, |
| + CreateRenderFrame(instance, nullptr, |
| CREATE_RF_FOR_MAIN_FRAME_NAVIGATION | |
| CREATE_RF_SWAPPED_OUT | CREATE_RF_HIDDEN, |
| - &render_view_routing_id); |
| + nullptr); |
| } |
| - return render_view_routing_id; |
| +} |
| + |
| +int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { |
| + if (!frame_tree_node_->opener()) |
| + return MSG_ROUTING_NONE; |
| + return frame_tree_node_->opener() |
|
nasko
2015/07/07 16:26:21
nit: Empty line between the two returns makes it s
alexmos
2015/07/08 04:42:18
Done.
|
| + ->render_manager() |
| + ->GetRoutingIdForSiteInstance(instance); |
| } |
| } // namespace content |