| 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 651c3590e50df1020770698e46d306bf1b358b2a..efd2c41774a8f95d7e7241c48ab0a5bd2cbd91f3 100644
|
| --- a/content/browser/frame_host/render_frame_host_manager.cc
|
| +++ b/content/browser/frame_host/render_frame_host_manager.cc
|
| @@ -238,10 +238,7 @@ RenderFrameHostImpl* RenderFrameHostManager::Navigate(
|
| // will add an interface to this RFH's InterfaceRegistry).
|
| dest_render_frame_host->SetUpMojoIfNeeded();
|
|
|
| - // Recreate the opener chain.
|
| - CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(),
|
| - frame_tree_node_);
|
| - if (!InitRenderView(dest_render_frame_host->render_view_host(), nullptr))
|
| + if (!ReinitializeRenderFrame(dest_render_frame_host))
|
| return nullptr;
|
|
|
| if (GetNavigatingWebUI()) {
|
| @@ -871,10 +868,9 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation(
|
| // If the RenderFrame that needs to navigate is not live (its process was just
|
| // created or has crashed), initialize it.
|
| if (!navigation_rfh->IsRenderFrameLive()) {
|
| - // Recreate the opener chain.
|
| - CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_);
|
| - if (!InitRenderView(navigation_rfh->render_view_host(), nullptr))
|
| + if (!ReinitializeRenderFrame(navigation_rfh))
|
| return nullptr;
|
| +
|
| notify_webui_of_rv_creation = true;
|
|
|
| if (navigation_rfh == render_frame_host_.get()) {
|
| @@ -887,7 +883,6 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation(
|
| delegate_->NotifyMainFrameSwappedFromRenderManager(
|
| nullptr, render_frame_host_->render_view_host());
|
| }
|
| - DCHECK(navigation_rfh->IsRenderFrameLive());
|
| }
|
|
|
| // If a WebUI was created in a speculative RenderFrameHost or a new RenderView
|
| @@ -2026,6 +2021,39 @@ bool RenderFrameHostManager::InitRenderFrame(
|
| previous_sibling_routing_id);
|
| }
|
|
|
| +bool RenderFrameHostManager::ReinitializeRenderFrame(
|
| + RenderFrameHostImpl* render_frame_host) {
|
| + // This should be used only when the RenderFrame is not live.
|
| + DCHECK(!render_frame_host->IsRenderFrameLive());
|
| +
|
| + // Recreate the opener chain.
|
| + CreateOpenerProxies(render_frame_host->GetSiteInstance(), frame_tree_node_);
|
| +
|
| + // Main frames need both the RenderView and RenderFrame reinitialized, so
|
| + // use InitRenderView. For cross-process subframes, InitRenderView won't
|
| + // recreate the RenderFrame, so use InitRenderFrame instead. Note that for
|
| + // subframe RenderFrameHosts, the swapped out RenderView in their
|
| + // SiteInstance will be recreated as part of CreateOpenerProxies above.
|
| + if (!frame_tree_node_->parent()) {
|
| + DCHECK(!GetRenderFrameProxyHost(render_frame_host->GetSiteInstance()));
|
| + if (!InitRenderView(render_frame_host->render_view_host(), nullptr))
|
| + return false;
|
| + } else {
|
| + if (!InitRenderFrame(render_frame_host))
|
| + return false;
|
| +
|
| + // When a subframe renderer dies, its RenderWidgetHostView is cleared in
|
| + // its CrossProcessFrameConnector, so we need to restore it now that it
|
| + // is re-initialized.
|
| + RenderFrameProxyHost* proxy_to_parent = GetProxyToParent();
|
| + if (proxy_to_parent)
|
| + GetProxyToParent()->SetChildRWHView(render_frame_host->GetView());
|
| + }
|
| +
|
| + DCHECK(render_frame_host->IsRenderFrameLive());
|
| + return true;
|
| +}
|
| +
|
| int RenderFrameHostManager::GetRoutingIdForSiteInstance(
|
| SiteInstance* site_instance) {
|
| if (render_frame_host_->GetSiteInstance() == site_instance)
|
|
|