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

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

Issue 236003002: Revert 263352 "Introduce RenderFrameProxyHost object and use it ..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 years, 8 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: trunk/src/content/browser/frame_host/render_frame_host_manager.cc
===================================================================
--- trunk/src/content/browser/frame_host/render_frame_host_manager.cc (revision 263366)
+++ trunk/src/content/browser/frame_host/render_frame_host_manager.cc (working copy)
@@ -20,7 +20,6 @@
#include "content/browser/frame_host/navigator.h"
#include "content/browser/frame_host/render_frame_host_factory.h"
#include "content/browser/frame_host/render_frame_host_impl.h"
-#include "content/browser/frame_host/render_frame_proxy_host.h"
#include "content/browser/renderer_host/render_process_host_impl.h"
#include "content/browser/renderer_host/render_view_host_factory.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
@@ -90,9 +89,11 @@
// We should always have a current RenderFrameHost except in some tests.
render_frame_host_.reset();
+ // TODO(creis): Now that we aren't using Shutdown, make RenderFrameHostMap
+ // use scoped_ptrs.
// Delete any swapped out RenderFrameHosts.
- for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin();
- iter != proxy_hosts_.end();
+ for (RenderFrameHostMap::iterator iter = swapped_out_hosts_.begin();
+ iter != swapped_out_hosts_.end();
++iter) {
delete iter->second;
}
@@ -108,11 +109,9 @@
if (!site_instance)
site_instance = SiteInstance::Create(browser_context);
- render_frame_host_ = CreateRenderFrameHost(site_instance,
- view_routing_id,
- frame_routing_id,
- false,
- delegate_->IsHidden());
+ render_frame_host_ = make_scoped_ptr(
+ CreateRenderFrameHost(site_instance, view_routing_id, frame_routing_id,
+ false, delegate_->IsHidden()));
// Keep track of renderer processes as they start to shut down or are
// crashed/killed.
@@ -448,8 +447,8 @@
// TODO(creis): Take in RenderFrameHost instead, since frames can have openers.
void RenderFrameHostManager::DidDisownOpener(RenderViewHost* render_view_host) {
// Notify all swapped out hosts, including the pending RVH.
- for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin();
- iter != proxy_hosts_.end();
+ for (RenderFrameHostMap::iterator iter = swapped_out_hosts_.begin();
+ iter != swapped_out_hosts_.end();
++iter) {
DCHECK_NE(iter->second->GetSiteInstance(),
current_frame_host()->GetSiteInstance());
@@ -463,8 +462,8 @@
// swap them back in while the process is exiting. Start by finding them,
// since there could be more than one.
std::list<int> ids_to_remove;
- for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin();
- iter != proxy_hosts_.end();
+ for (RenderFrameHostMap::iterator iter = swapped_out_hosts_.begin();
+ iter != swapped_out_hosts_.end();
++iter) {
if (iter->second->GetProcess() == render_process_host)
ids_to_remove.push_back(iter->first);
@@ -472,8 +471,8 @@
// Now delete them.
while (!ids_to_remove.empty()) {
- delete proxy_hosts_[ids_to_remove.back()];
- proxy_hosts_.erase(ids_to_remove.back());
+ delete swapped_out_hosts_[ids_to_remove.back()];
+ swapped_out_hosts_.erase(ids_to_remove.back());
ids_to_remove.pop_back();
}
}
@@ -549,36 +548,34 @@
}
}
-bool RenderFrameHostManager::ClearProxiesInSiteInstance(
+bool RenderFrameHostManager::ClearSwappedOutRFHsInSiteInstance(
int32 site_instance_id,
FrameTreeNode* node) {
- RenderFrameProxyHostMap::iterator iter =
- node->render_manager()->proxy_hosts_.find(site_instance_id);
- if (iter != node->render_manager()->proxy_hosts_.end()) {
- RenderFrameProxyHost* proxy = iter->second;
+ RenderFrameHostMap::iterator iter =
+ node->render_manager()->swapped_out_hosts_.find(site_instance_id);
+ if (iter != node->render_manager()->swapped_out_hosts_.end()) {
+ RenderFrameHostImpl* swapped_out_rfh = iter->second;
// If the RVH is pending swap out, it needs to switch state to
// pending shutdown. Otherwise it is deleted.
- if (proxy->render_view_host()->rvh_state() ==
+ if (swapped_out_rfh->render_view_host()->rvh_state() ==
RenderViewHostImpl::STATE_PENDING_SWAP_OUT) {
- scoped_ptr<RenderFrameHostImpl> swapped_out_rfh = proxy->PassFrameHost();
-
swapped_out_rfh->SetPendingShutdown(base::Bind(
&RenderFrameHostManager::ClearPendingShutdownRFHForSiteInstance,
node->render_manager()->weak_factory_.GetWeakPtr(),
site_instance_id,
- swapped_out_rfh.get()));
+ swapped_out_rfh));
RFHPendingDeleteMap::iterator pending_delete_iter =
node->render_manager()->pending_delete_hosts_.find(site_instance_id);
if (pending_delete_iter ==
node->render_manager()->pending_delete_hosts_.end() ||
- pending_delete_iter->second.get() != swapped_out_rfh) {
+ pending_delete_iter->second.get() != iter->second) {
node->render_manager()->pending_delete_hosts_[site_instance_id] =
- linked_ptr<RenderFrameHostImpl>(swapped_out_rfh.release());
+ linked_ptr<RenderFrameHostImpl>(swapped_out_rfh);
}
} else {
- delete proxy;
+ delete swapped_out_rfh;
}
- node->render_manager()->proxy_hosts_.erase(site_instance_id);
+ node->render_manager()->swapped_out_hosts_.erase(site_instance_id);
}
return true;
@@ -836,7 +833,7 @@
return current_instance->GetRelatedSiteInstance(dest_url);
}
-scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost(
+RenderFrameHostImpl* RenderFrameHostManager::CreateRenderFrameHost(
SiteInstance* site_instance,
int view_routing_id,
int frame_routing_id,
@@ -865,15 +862,16 @@
}
}
+ // TODO(creis): Make render_frame_host a scoped_ptr.
// TODO(creis): Pass hidden to RFH.
- scoped_ptr<RenderFrameHostImpl> render_frame_host =
- make_scoped_ptr(RenderFrameHostFactory::Create(render_view_host,
- render_frame_delegate_,
- frame_tree,
- frame_tree_node_,
- frame_routing_id,
- swapped_out).release());
- return render_frame_host.Pass();
+ RenderFrameHostImpl* render_frame_host =
+ RenderFrameHostFactory::Create(render_view_host,
+ render_frame_delegate_,
+ frame_tree,
+ frame_tree_node_,
+ frame_routing_id,
+ swapped_out).release();
+ return render_frame_host;
}
int RenderFrameHostManager::CreateRenderFrame(
@@ -884,9 +882,6 @@
CHECK(instance);
DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden.
- scoped_ptr<RenderFrameHostImpl> new_render_frame_host;
- int routing_id = MSG_ROUTING_NONE;
-
// We are creating a pending or swapped out RFH here. We should never create
// it in the same SiteInstance as our current RFH.
CHECK_NE(render_frame_host_->GetSiteInstance(), instance);
@@ -894,22 +889,17 @@
// Check if we've already created an RFH for this SiteInstance. If so, try
// to re-use the existing one, which has already been initialized. We'll
// remove it from the list of swapped out hosts if it commits.
- RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
+ RenderFrameHostImpl* new_render_frame_host =
+ GetSwappedOutRenderFrameHost(instance);
FrameTreeNode* parent_node = NULL;
if (frame_tree_node_)
parent_node = frame_tree_node_->parent();
- if (proxy) {
- routing_id = proxy->render_view_host()->GetRoutingID();
- // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost.
+ if (new_render_frame_host) {
// Prevent the process from exiting while we're trying to use it.
if (!swapped_out) {
- new_render_frame_host = proxy->PassFrameHost();
new_render_frame_host->GetProcess()->AddPendingView();
-
- proxy_hosts_.erase(instance->GetId());
- delete proxy;
} else {
// Detect if this is a cross-process child frame that is navigating
// back to the same SiteInstance as its parent.
@@ -922,20 +912,21 @@
}
} else {
// Create a new RenderFrameHost if we don't find an existing one.
- new_render_frame_host = CreateRenderFrameHost(
- instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, swapped_out, hidden);
- RenderViewHostImpl* render_view_host =
- new_render_frame_host->render_view_host();
+ // TODO(creis): Make new_render_frame_host a scoped_ptr.
+ new_render_frame_host = CreateRenderFrameHost(instance, MSG_ROUTING_NONE,
+ MSG_ROUTING_NONE, swapped_out,
+ hidden);
- // Prevent the process from exiting while we're trying to navigate in it.
- // Otherwise, if the new RFH is swapped out already, store it.
- if (!swapped_out) {
- new_render_frame_host->GetProcess()->AddPendingView();
+ // If the new RFH is swapped out already, store it. Otherwise prevent the
+ // process from exiting while we're trying to navigate in it.
+ if (swapped_out) {
+ swapped_out_hosts_[instance->GetId()] = new_render_frame_host;
} else {
- proxy_hosts_[instance->GetId()] = new RenderFrameProxyHost(
- new_render_frame_host.Pass());
+ new_render_frame_host->GetProcess()->AddPendingView();
}
+ RenderViewHostImpl* render_view_host =
+ new_render_frame_host->render_view_host();
bool success = InitRenderView(render_view_host, opener_route_id);
if (success && frame_tree_node_->IsMainFrame()) {
// Don't show the main frame's view until we get a DidNavigate from it.
@@ -943,14 +934,13 @@
} else if (!swapped_out && pending_render_frame_host_) {
CancelPending();
}
- routing_id = render_view_host->GetRoutingID();
}
// Use this as our new pending RFH if it isn't swapped out.
if (!swapped_out)
- pending_render_frame_host_ = new_render_frame_host.Pass();
+ pending_render_frame_host_.reset(new_render_frame_host);
- return routing_id;
+ return new_render_frame_host->render_view_host()->GetRoutingID();
}
bool RenderFrameHostManager::InitRenderView(RenderViewHost* render_view_host,
@@ -1027,8 +1017,7 @@
// Swap in the pending frame and make it active. Also ensure the FrameTree
// stays in sync.
- scoped_ptr<RenderFrameHostImpl> old_render_frame_host =
- render_frame_host_.Pass();
+ RenderFrameHostImpl* old_render_frame_host = render_frame_host_.release();
render_frame_host_ = pending_render_frame_host_.Pass();
if (is_main_frame)
render_frame_host_->render_view_host()->AttachToFrameTree();
@@ -1057,7 +1046,7 @@
&RenderFrameHostManager::ClearPendingShutdownRFHForSiteInstance,
weak_factory_.GetWeakPtr(),
old_site_instance_id,
- old_render_frame_host.get()));
+ old_render_frame_host));
} else {
// TODO(creis): We'll need to set this back to false if we navigate back.
old_render_frame_host->set_swapped_out(true);
@@ -1085,45 +1074,47 @@
render_frame_host_->render_view_host());
}
- // If the old RFH is not live, just return as there is no work to do.
- if (!old_render_frame_host->render_view_host()->IsRenderViewLive()) {
- return;
- }
+ // If the pending frame was on the swapped out list, we can remove it.
+ swapped_out_hosts_.erase(render_frame_host_->GetSiteInstance()->GetId());
- // If the old RFH is live, we are swapping it out and should keep track of
- // it in case we navigate back to it, or it is waiting for the unload event
- // to execute in the background.
- // TODO(creis): Swap out the subframe in --site-per-process.
- if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess))
- DCHECK(old_render_frame_host->is_swapped_out() ||
- !RenderViewHostImpl::IsRVHStateActive(
- old_render_frame_host->render_view_host()->rvh_state()));
- // Temp fix for http://crbug.com/90867 until we do a better cleanup to make
- // sure we don't get different rvh instances for the same site instance
- // in the same rvhmgr.
- // TODO(creis): Clean this up.
- RenderFrameProxyHostMap::iterator iter =
- proxy_hosts_.find(old_site_instance_id);
- if (iter != proxy_hosts_.end() &&
- iter->second->render_frame_host() != old_render_frame_host) {
- // Delete the proxy that will be replaced in the map to avoid a leak.
- delete iter->second;
- }
-
- // If the RenderViewHost backing the RenderFrameHost is pending shutdown,
- // 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) {
- proxy_hosts_.erase(old_site_instance_id);
- RFHPendingDeleteMap::iterator pending_delete_iter =
- pending_delete_hosts_.find(old_site_instance_id);
- if (pending_delete_iter == pending_delete_hosts_.end() ||
- pending_delete_iter->second.get() != old_render_frame_host) {
- pending_delete_hosts_[old_site_instance_id] =
- linked_ptr<RenderFrameHostImpl>(old_render_frame_host.release());
+ if (old_render_frame_host->render_view_host()->IsRenderViewLive()) {
+ // If the old RFH is live, we are swapping it out and should keep track of
+ // it in case we navigate back to it, or it is waiting for the unload event
+ // to execute in the background.
+ // TODO(creis): Swap out the subframe in --site-per-process.
+ if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess))
+ DCHECK(old_render_frame_host->is_swapped_out() ||
+ !RenderViewHostImpl::IsRVHStateActive(
+ old_render_frame_host->render_view_host()->rvh_state()));
+ // Temp fix for http://crbug.com/90867 until we do a better cleanup to make
+ // sure we don't get different rvh instances for the same site instance
+ // in the same rvhmgr.
+ // TODO(creis): Clean this up.
+ RenderFrameHostMap::iterator iter =
+ swapped_out_hosts_.find(old_site_instance_id);
+ if (iter != swapped_out_hosts_.end() &&
+ iter->second != old_render_frame_host) {
+ // Delete the RFH that will be replaced in the map to avoid a leak.
+ delete iter->second;
}
- } else {
+ // If the RenderViewHost backing the RenderFrameHost is pending shutdown,
+ // the RenderFrameHost should be put in the map of RenderFrameHosts pending
+ // shutdown. Otherwise, it is stored in the map of swapped out
+ // RenderFrameHosts.
+ if (old_render_frame_host->render_view_host()->rvh_state() ==
+ RenderViewHostImpl::STATE_PENDING_SHUTDOWN) {
+ swapped_out_hosts_.erase(old_site_instance_id);
+ RFHPendingDeleteMap::iterator pending_delete_iter =
+ pending_delete_hosts_.find(old_site_instance_id);
+ if (pending_delete_iter == pending_delete_hosts_.end() ||
+ pending_delete_iter->second.get() != old_render_frame_host) {
+ pending_delete_hosts_[old_site_instance_id] =
+ linked_ptr<RenderFrameHostImpl>(old_render_frame_host);
+ }
+ } else {
+ swapped_out_hosts_[old_site_instance_id] = old_render_frame_host;
+ }
+
// 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 RFHs and RVHs
@@ -1131,23 +1122,23 @@
// swapped out list to simplify the deletion.
if (!static_cast<SiteInstanceImpl*>(
old_render_frame_host->GetSiteInstance())->active_view_count()) {
- old_render_frame_host.reset();
ShutdownRenderFrameHostsInSiteInstance(old_site_instance_id);
- } else {
- proxy_hosts_[old_site_instance_id] = new RenderFrameProxyHost(
- old_render_frame_host.Pass());
+ // This is deleted while cleaning up the SiteInstance's views.
+ old_render_frame_host = NULL;
}
+ } else {
+ delete old_render_frame_host;
}
}
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_);
+ ClearSwappedOutRFHsInSiteInstance(site_instance_id, frame_tree_node_);
// Use the safe RenderWidgetHost iterator for now to find all RenderViewHosts
// in the SiteInstance, then tell their respective FrameTrees to remove all
- // RenderFrameProxyHosts corresponding to them.
+ // swapped out RenderFrameHosts corresponding to them.
// TODO(creis): Replace this with a RenderFrameHostIterator that protects
// against use-after-frees if a later element is deleted before getting to it.
scoped_ptr<RenderWidgetHostIterator> widgets(
@@ -1162,7 +1153,7 @@
// |rvh| to Shutdown.
FrameTree* tree = rvh->GetDelegate()->GetFrameTree();
tree->ForEach(base::Bind(
- &RenderFrameHostManager::ClearProxiesInSiteInstance,
+ &RenderFrameHostManager::ClearSwappedOutRFHsInSiteInstance,
site_instance_id));
}
}
@@ -1340,11 +1331,11 @@
// We no longer need to prevent the process from exiting.
pending_render_frame_host->GetProcess()->RemovePendingView();
- // If the SiteInstance for the pending RFH is being used by others, don't
- // delete the RFH, just swap it out and it can be reused at a later point.
- SiteInstanceImpl* site_instance = static_cast<SiteInstanceImpl*>(
- pending_render_frame_host->GetSiteInstance());
- if (site_instance->active_view_count() > 1) {
+ // The pending RFH may already be on the swapped out list if we started to
+ // swap it back in and then canceled. If so, make sure it gets swapped out
+ // again. If it's not on the swapped out list (e.g., aborting a pending
+ // load), then it's safe to shut down.
+ if (IsOnSwappedOutList(pending_render_frame_host)) {
// Any currently suspended navigations are no longer needed.
pending_render_frame_host->render_view_host()->CancelSuspendedNavigations();
@@ -1378,11 +1369,11 @@
return;
// We can't look it up by SiteInstance ID, which may no longer be valid.
- for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin();
- iter != proxy_hosts_.end();
+ for (RenderFrameHostMap::iterator iter = swapped_out_hosts_.begin();
+ iter != swapped_out_hosts_.end();
++iter) {
if (iter->second->render_view_host() == rvh) {
- proxy_hosts_.erase(iter);
+ swapped_out_hosts_.erase(iter);
break;
}
}
@@ -1390,11 +1381,11 @@
bool RenderFrameHostManager::IsRVHOnSwappedOutList(
RenderViewHostImpl* rvh) const {
- RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(
+ RenderFrameHostImpl* render_frame_host = GetSwappedOutRenderFrameHost(
rvh->GetSiteInstance());
- if (!proxy)
+ if (!render_frame_host)
return false;
- return IsOnSwappedOutList(proxy->render_frame_host());
+ return IsOnSwappedOutList(render_frame_host);
}
bool RenderFrameHostManager::IsOnSwappedOutList(
@@ -1402,27 +1393,28 @@
if (!rfh->GetSiteInstance())
return false;
- RenderFrameProxyHostMap::const_iterator iter = proxy_hosts_.find(
+ RenderFrameHostMap::const_iterator iter = swapped_out_hosts_.find(
rfh->GetSiteInstance()->GetId());
- if (iter == proxy_hosts_.end())
+ if (iter == swapped_out_hosts_.end())
return false;
- return iter->second->render_frame_host() == rfh;
+ return iter->second == rfh;
}
RenderViewHostImpl* RenderFrameHostManager::GetSwappedOutRenderViewHost(
SiteInstance* instance) const {
- RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
- if (proxy)
- return proxy->render_view_host();
+ RenderFrameHostImpl* render_frame_host =
+ GetSwappedOutRenderFrameHost(instance);
+ if (render_frame_host)
+ return render_frame_host->render_view_host();
return NULL;
}
-RenderFrameProxyHost* RenderFrameHostManager::GetRenderFrameProxyHost(
+RenderFrameHostImpl* RenderFrameHostManager::GetSwappedOutRenderFrameHost(
SiteInstance* instance) const {
- RenderFrameProxyHostMap::const_iterator iter =
- proxy_hosts_.find(instance->GetId());
- if (iter != proxy_hosts_.end())
+ RenderFrameHostMap::const_iterator iter =
+ swapped_out_hosts_.find(instance->GetId());
+ if (iter != swapped_out_hosts_.end())
return iter->second;
return NULL;

Powered by Google App Engine
This is Rietveld 408576698