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

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: sync again 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 b2ddeb852a9ac7690efbee40424f1c3967825030..722f584e35ccad0815926b6dee5e6065aad8e953 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::ResetProxiesInSiteInstanceForNewProcess,
+ ids_to_keep.back()));
+ ids_to_keep.pop_back();
+ }
}
void RenderFrameHostManager::SwapOutOldFrame(
@@ -569,6 +588,8 @@ 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(
@@ -813,6 +834,18 @@ bool RenderFrameHostManager::ClearProxiesInSiteInstance(
return true;
}
+// static.
+bool RenderFrameHostManager::ResetProxiesInSiteInstanceForNewProcess(
+ 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_.
@@ -1380,6 +1413,24 @@ 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);
+ DCHECK(proxy);
nasko 2015/01/20 23:51:23 nit: no need for DCHECK, it will crash on the next
lazyboy 2015/01/21 18:52:14 Done.
+ InitRenderView(render_view_host, opener_route_id, proxy->GetRoutingID(),
+ source->IsMainFrame());
+}
+
bool RenderFrameHostManager::InitRenderView(
RenderViewHostImpl* render_view_host,
int opener_route_id,
@@ -1441,6 +1492,8 @@ bool RenderFrameHostManager::InitRenderFrame(
if (existing_proxy) {
proxy_routing_id = existing_proxy->GetRoutingID();
CHECK_NE(proxy_routing_id, MSG_ROUTING_NONE);
+ if (!existing_proxy->IsRenderFrameProxyLive())
+ existing_proxy->InitRenderFrameProxy();
}
return delegate_->CreateRenderFrameForRenderManager(render_frame_host,
parent_routing_id,

Powered by Google App Engine
This is Rietveld 408576698