Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1228)

Unified Diff: content/browser/frame_host/render_frame_host_manager.cc

Issue 1202593002: Move browser-to-renderer opener plumbing to frame routing IDs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@opener-create-opener-render-views
Patch Set: Remove suppress_opener Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..d3522dfa45a469a6bede7869c4fab05a8671a7ab 100644
--- a/content/browser/frame_host/render_frame_host_manager.cc
+++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -277,10 +277,8 @@ 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()))
return NULL;
@@ -863,10 +861,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())) {
return nullptr;
}
@@ -1399,23 +1396,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 +1428,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 +1485,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 +1494,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 +1506,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 +1567,8 @@ 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));
if (success) {
// Remember that InitRenderView also created the RenderFrameProxy.
if (swapped_out)
@@ -1661,8 +1653,7 @@ 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);
proxy->set_render_frame_proxy_created(true);
} else {
proxy->InitRenderFrameProxy();
@@ -1687,7 +1678,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 +1686,7 @@ void RenderFrameHostManager::EnsureRenderViewInitialized(
if (!proxy)
return;
- InitRenderView(render_view_host, opener_route_id, proxy->GetRoutingID(),
- false);
+ InitRenderView(render_view_host, proxy->GetRoutingID(), false);
proxy->set_render_frame_proxy_created(true);
}
@@ -1731,7 +1721,6 @@ void RenderFrameHostManager::SetRWHViewForInnerContents(
bool RenderFrameHostManager::InitRenderView(
RenderViewHostImpl* render_view_host,
- int opener_route_id,
int proxy_routing_id,
bool for_main_frame_navigation) {
// Ensure the renderer process is initialized before creating the
@@ -1765,12 +1754,12 @@ bool RenderFrameHostManager::InitRenderView(
}
}
+ int 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 +1815,17 @@ 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 there is a matching pending RFH, only return it if swapped out is
+ // allowed, since otherwise there should be a proxy that should be used
+ // instead.
+ if (pending_render_frame_host_ &&
+ pending_render_frame_host_->GetSiteInstance() == site_instance &&
+ !RenderFrameHostManager::IsSwappedOutStateForbidden())
+ return pending_render_frame_host_->GetRoutingID();
+
+ RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance);
+ if (proxy)
+ return proxy->GetRoutingID();
return MSG_ROUTING_NONE;
}
@@ -2272,19 +2268,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 +2288,43 @@ 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()
+ ->render_manager()
+ ->GetRoutingIdForSiteInstance(instance);
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698