| 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
|
|
|