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 |