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

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

Issue 438393004: Revert of Start using RenderFrameProxyHost objects. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 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 5b025773024674c10d8372d314b8ad9e4f56a72d..9973a8657557899523f41b4e45c838445fc7a3ce 100644
--- a/content/browser/frame_host/render_frame_host_manager.cc
+++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -538,10 +538,7 @@
RenderFrameProxyHost* proxy = new RenderFrameProxyHost(
render_frame_host_->GetSiteInstance(), frame_tree_node_);
- std::pair<RenderFrameProxyHostMap::iterator, bool> result =
- proxy_hosts_.insert(std::make_pair(
- render_frame_host_->GetSiteInstance()->GetId(), proxy));
- CHECK(result.second) << "Inserting a duplicate item.";
+ proxy_hosts_[render_frame_host_->GetSiteInstance()->GetId()] = proxy;
// Tell the old frame it is being swapped out. This will fire the unload
// handler in the background (without firing the beforeunload handler a second
@@ -912,13 +909,24 @@
if (frame_routing_id == MSG_ROUTING_NONE)
frame_routing_id = site_instance->GetProcess()->GetNextRoutingID();
- // Create a RVH for the new frame or find an existing one.
+ // Create a RVH for main frames, or find the existing one for subframes.
FrameTree* frame_tree = frame_tree_node_->frame_tree();
- RenderViewHostImpl* render_view_host =
- frame_tree->GetRenderViewHost(site_instance);
- if (!render_view_host) {
- render_view_host = frame_tree->CreateRenderViewHost(
+ RenderViewHostImpl* render_view_host = NULL;
+ if (frame_tree_node_->IsMainFrame()) {
+ render_view_host = frame_tree->CreateRenderViewHostForMainFrame(
site_instance, view_routing_id, frame_routing_id, swapped_out, hidden);
+ } else {
+ render_view_host = frame_tree->GetRenderViewHostForSubFrame(site_instance);
+
+ // If we haven't found a RVH for a subframe RFH, it's because we currently
+ // do not create top-level RFHs for pending subframe navigations. Create
+ // the RVH here for now.
+ // TODO(creis): Mirror the frame tree so this check isn't necessary.
+ if (!render_view_host) {
+ render_view_host = frame_tree->CreateRenderViewHostForMainFrame(
+ site_instance, view_routing_id, frame_routing_id, swapped_out,
+ hidden);
+ }
}
// TODO(creis): Pass hidden to RFH.
@@ -932,19 +940,13 @@
return render_frame_host.Pass();
}
-int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance,
- int opener_route_id,
- bool swapped_out,
- bool for_main_frame_navigation,
- bool hidden) {
+int RenderFrameHostManager::CreateRenderFrame(
+ SiteInstance* instance,
+ int opener_route_id,
+ bool swapped_out,
+ bool hidden) {
CHECK(instance);
DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden.
-
- // TODO(nasko): Remove the following CHECK once cross-site navigation no
- // longer relies on swapped out RFH for the top-level frame.
- if (!frame_tree_node_->IsMainFrame()) {
- CHECK(!swapped_out);
- }
scoped_ptr<RenderFrameHostImpl> new_render_frame_host;
RenderFrameHostImpl* frame_to_announce = NULL;
@@ -1004,22 +1006,12 @@
proxy_routing_id = proxy->GetRoutingID();
}
- bool success = InitRenderView(render_view_host,
- opener_route_id,
- proxy_routing_id,
- for_main_frame_navigation);
- if (success) {
- if (frame_tree_node_->IsMainFrame()) {
- // Don't show the main frame's view until we get a DidNavigate from it.
- render_view_host->GetView()->Hide();
- } else if (!swapped_out) {
- // Init the RFH, so a RenderFrame is created in the renderer.
- DCHECK(new_render_frame_host.get());
- success = InitRenderFrame(new_render_frame_host.get());
- }
- if (swapped_out) {
- proxy_hosts_[instance->GetId()]->InitRenderFrameProxy();
- }
+ bool success = InitRenderView(
+ render_view_host, opener_route_id, proxy_routing_id,
+ frame_tree_node_->IsMainFrame());
+ if (success && frame_tree_node_->IsMainFrame()) {
+ // Don't show the main frame's view until we get a DidNavigate from it.
+ render_view_host->GetView()->Hide();
} else if (!swapped_out && pending_render_frame_host_) {
CancelPending();
}
@@ -1038,26 +1030,10 @@
return routing_id;
}
-int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) {
- // A RenderFrameProxyHost should never be created in the same SiteInstance as
- // the current RFH.
- CHECK(instance);
- CHECK_NE(instance, render_frame_host_->GetSiteInstance());
-
- RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
- if (proxy)
- return proxy->GetRoutingID();
-
- proxy = new RenderFrameProxyHost(instance, frame_tree_node_);
- proxy_hosts_[instance->GetId()] = proxy;
- proxy->InitRenderFrameProxy();
- return proxy->GetRoutingID();
-}
-
bool RenderFrameHostManager::InitRenderView(RenderViewHost* render_view_host,
int opener_route_id,
int proxy_routing_id,
- bool for_main_frame_navigation) {
+ bool for_main_frame) {
// We may have initialized this RenderViewHost for another RenderFrameHost.
if (render_view_host->IsRenderViewLive())
return true;
@@ -1079,40 +1055,7 @@
}
return delegate_->CreateRenderViewForRenderManager(
- render_view_host,
- opener_route_id,
- proxy_routing_id,
- for_main_frame_navigation);
-}
-
-bool RenderFrameHostManager::InitRenderFrame(
- RenderFrameHost* render_frame_host) {
- RenderFrameHostImpl* rfh =
- static_cast<RenderFrameHostImpl*>(render_frame_host);
- if (rfh->IsRenderFrameLive())
- return true;
-
- int parent_routing_id = MSG_ROUTING_NONE;
- if (frame_tree_node_->parent()) {
- parent_routing_id = frame_tree_node_->parent()->render_manager()->
- GetRoutingIdForSiteInstance(render_frame_host->GetSiteInstance());
- CHECK_NE(parent_routing_id, MSG_ROUTING_NONE);
- }
- return delegate_->CreateRenderFrameForRenderManager(render_frame_host,
- parent_routing_id);
-}
-
-int RenderFrameHostManager::GetRoutingIdForSiteInstance(
- SiteInstance* site_instance) {
- 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();
-
- return MSG_ROUTING_NONE;
+ render_view_host, opener_route_id, proxy_routing_id, for_main_frame);
}
void RenderFrameHostManager::CommitPending() {
@@ -1232,7 +1175,7 @@
// the RenderFrameHost should be put in the map of RenderFrameHosts pending
// shutdown. Otherwise, it is stored in the map of proxy hosts.
if (old_render_frame_host->render_view_host()->rvh_state() ==
- RenderViewHostImpl::STATE_PENDING_SHUTDOWN) {
+ RenderViewHostImpl::STATE_PENDING_SHUTDOWN) {
// The proxy for this RenderFrameHost is created when sending the
// SwapOut message, so check if it already exists and delete it.
RenderFrameProxyHostMap::iterator iter =
@@ -1249,29 +1192,23 @@
linked_ptr<RenderFrameHostImpl>(old_render_frame_host.release());
}
} else {
- CHECK(proxy_hosts_.find(render_frame_host_->GetSiteInstance()->GetId()) ==
- proxy_hosts_.end());
-
// Capture the active view count on the old RFH SiteInstance, since the
- // ownership might be passed into the proxy and the pointer will be
- // invalid.
+ // ownership will be passed into the proxy and the pointer will be invalid.
int active_view_count =
static_cast<SiteInstanceImpl*>(old_render_frame_host->GetSiteInstance())
->active_view_count();
- if (is_main_frame) {
- RenderFrameProxyHostMap::iterator iter =
- proxy_hosts_.find(old_site_instance_id);
- CHECK(iter != proxy_hosts_.end());
- iter->second->TakeFrameHostOwnership(old_render_frame_host.Pass());
- }
+ RenderFrameProxyHostMap::iterator iter =
+ proxy_hosts_.find(old_site_instance_id);
+ CHECK(iter != proxy_hosts_.end());
+ iter->second->TakeFrameHostOwnership(old_render_frame_host.Pass());
// If there are no active views in this SiteInstance, it means that
// this RFH was the last active one in the SiteInstance. Now that we
- // know that all RFHs are swapped out, we can delete all the RFPHs and
- // RVHs in this SiteInstance.
+ // know that all RFHs are swapped out, we can delete all the RFHs and RVHs
+ // in this SiteInstance.
if (!active_view_count) {
- ShutdownRenderFrameProxyHostsInSiteInstance(old_site_instance_id);
+ ShutdownRenderFrameHostsInSiteInstance(old_site_instance_id);
} else {
// If this is a subframe, it should have a CrossProcessFrameConnector
// created already and we just need to link it to the proper view in the
@@ -1287,7 +1224,7 @@
}
}
-void RenderFrameHostManager::ShutdownRenderFrameProxyHostsInSiteInstance(
+void RenderFrameHostManager::ShutdownRenderFrameHostsInSiteInstance(
int32 site_instance_id) {
// First remove any swapped out RFH for this SiteInstance from our own list.
ClearProxiesInSiteInstance(site_instance_id, frame_tree_node_);
@@ -1325,8 +1262,11 @@
cross_navigation_pending_ = false;
}
+ // render_frame_host_'s SiteInstance and new_instance will not be deleted
+ // before the end of this method, so we don't have to worry about their ref
+ // counts dropping to zero.
SiteInstance* current_instance = render_frame_host_->GetSiteInstance();
- scoped_refptr<SiteInstance> new_instance = current_instance;
+ SiteInstance* new_instance = current_instance;
// We do not currently swap processes for navigations in webview tag guests.
bool is_guest_scheme = current_instance->GetSiteURL().SchemeIs(kGuestScheme);
@@ -1368,22 +1308,11 @@
if (new_instance->IsRelatedSiteInstance(current_instance)) {
opener_route_id =
delegate_->CreateOpenerRenderViewsForRenderManager(new_instance);
-
- if (CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kSitePerProcess)) {
- // Ensure that the frame tree has RenderFrameProxyHosts for the new
- // SiteInstance in all nodes except the current one.
- frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance(
- frame_tree_node_, new_instance);
- }
}
// Create a non-swapped-out pending RFH with the given opener and navigate
// it.
- int route_id = CreateRenderFrame(new_instance,
- opener_route_id,
- false,
- frame_tree_node_->IsMainFrame(),
+ int route_id = CreateRenderFrame(new_instance, opener_route_id, false,
delegate_->IsHidden());
if (route_id == MSG_ROUTING_NONE)
return NULL;
@@ -1508,8 +1437,7 @@
new RenderFrameProxyHost(site_instance, frame_tree_node_);
proxy_hosts_[site_instance->GetId()] = proxy;
pending_render_frame_host->SwapOut(proxy);
- if (frame_tree_node_->IsMainFrame())
- proxy->TakeFrameHostOwnership(pending_render_frame_host.Pass());
+ proxy->TakeFrameHostOwnership(pending_render_frame_host.Pass());
} else {
// We won't be coming back, so delete this one.
pending_render_frame_host.reset();
@@ -1550,10 +1478,6 @@
rvh->GetSiteInstance());
if (!proxy)
return false;
- // If there is a proxy without RFH, it is for a subframe in the SiteInstance
- // of |rvh|. Subframes should be ignored in this case.
- if (!proxy->render_frame_host())
- return false;
return IsOnSwappedOutList(proxy->render_frame_host());
}
« no previous file with comments | « content/browser/frame_host/render_frame_host_manager.h ('k') | content/browser/frame_host/render_frame_proxy_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698