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

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

Issue 782093002: Ensure that before creating proxy of site A, RVH of site A is initialized. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix RenderFrameHostManagerTest.CleanUpSwappedOutRVHOnProcessCrash Created 5 years, 11 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 baefe87ff15bb16c12ee8ea585baedb23b800296..8f839c4f29f02630d0200d2cfa77e907e5f51814 100644
--- a/content/browser/frame_host/render_frame_host_manager.cc
+++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -502,11 +502,22 @@ void RenderFrameHostManager::RendererProcessClosing(
// 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;
+ // Do not remove proxies in the dead process that still have active frame
+ // count though, we just reset them to be uninitialized.
+ std::list<int> ids_to_keep;
for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin();
iter != proxy_hosts_.end();
++iter) {
- if (iter->second->GetProcess() == render_process_host)
+ RenderFrameProxyHost* proxy = iter->second;
+ if (proxy->GetProcess() != render_process_host)
+ continue;
+
+ if (static_cast<SiteInstanceImpl*>(proxy->GetSiteInstance())
+ ->active_frame_count() >= 1U) {
+ ids_to_keep.push_back(iter->first);
+ } else {
ids_to_remove.push_back(iter->first);
+ }
}
// Now delete them.
@@ -515,6 +526,14 @@ void RenderFrameHostManager::RendererProcessClosing(
proxy_hosts_.erase(ids_to_remove.back());
ids_to_remove.pop_back();
}
+
+ while (!ids_to_keep.empty()) {
+ frame_tree_node_->frame_tree()->ForEach(
+ base::Bind(
+ &RenderFrameHostManager::ResetProxiesInSiteInstance,
+ ids_to_keep.back()));
+ ids_to_keep.pop_back();
+ }
}
void RenderFrameHostManager::SwapOutOldFrame(
@@ -570,6 +589,9 @@ void RenderFrameHostManager::SwapOutOldFrame(
// Tell the old RenderFrameHost to swap out and be replaced by the proxy.
old_render_frame_host->SwapOut(proxy, true);
+ // SwapOut creates a RenderFrameProxy, so set the proxy to be initialized.
+ proxy->set_render_frame_proxy_created(true);
+
bool is_main_frame = frame_tree_node_->IsMainFrame();
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kSitePerProcess) &&
@@ -811,6 +833,17 @@ bool RenderFrameHostManager::ClearProxiesInSiteInstance(
return true;
}
+// static.
+bool RenderFrameHostManager::ResetProxiesInSiteInstance(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())
+ iter->second->set_render_frame_proxy_created(false);
+
+ return true;
+}
+
bool RenderFrameHostManager::ShouldTransitionCrossSite() {
// False in the single-process mode, as it makes RVHs to accumulate
// in swapped_out_hosts_.
@@ -1393,6 +1426,23 @@ int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) {
return proxy->GetRoutingID();
}
+void RenderFrameHostManager::EnsureRenderViewInitialized(
+ FrameTreeNode* source,
+ RenderViewHostImpl* render_view_host,
+ SiteInstance* instance) {
+ DCHECK(frame_tree_node_->IsMainFrame());
+
+ if (render_view_host->IsRenderViewLive())
+ return;
+
+ // Recreate the opener chain.
+ int opener_route_id =
+ delegate_->CreateOpenerRenderViewsForRenderManager(instance);
+ RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
+ InitRenderView(render_view_host, opener_route_id, proxy->GetRoutingID(),
+ source->IsMainFrame());
+}
+
bool RenderFrameHostManager::InitRenderView(
RenderViewHostImpl* render_view_host,
int opener_route_id,
@@ -1454,6 +1504,8 @@ bool RenderFrameHostManager::InitRenderFrame(
if (existing_proxy) {
proxy_routing_id = existing_proxy->GetRoutingID();
CHECK_NE(proxy_routing_id, MSG_ROUTING_NONE);
+ if (!existing_proxy->is_render_frame_proxy_live())
+ existing_proxy->InitRenderFrameProxy();
}
return delegate_->CreateRenderFrameForRenderManager(render_frame_host,
parent_routing_id,

Powered by Google App Engine
This is Rietveld 408576698