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 b36562c7f81320ac7bf6a218b45e3cc133bff27a..af6e2b75049057f1abdea3e8b6ed002c1936dc66 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.cc |
+++ b/content/browser/frame_host/render_frame_host_manager.cc |
@@ -503,11 +503,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. |
@@ -516,6 +527,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,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. |
nasko
2015/02/02 22:47:09
nit: empty line before comment
lazyboy
2015/02/03 00:22:42
Done.
|
+ proxy->set_render_frame_proxy_created(true); |
bool is_main_frame = frame_tree_node_->IsMainFrame(); |
if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
@@ -811,6 +832,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_. |
@@ -1378,6 +1410,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, |
@@ -1439,6 +1488,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, |