Index: content/browser/frame_host/render_frame_proxy_host.cc |
diff --git a/content/browser/frame_host/render_frame_proxy_host.cc b/content/browser/frame_host/render_frame_proxy_host.cc |
index 5406cc86cd4c19128835945ceaaa1cb4e71750f3..a83e96ba5dd31c9d2b575d146b32498ac1886c69 100644 |
--- a/content/browser/frame_host/render_frame_proxy_host.cc |
+++ b/content/browser/frame_host/render_frame_proxy_host.cc |
@@ -58,7 +58,8 @@ RenderFrameProxyHost::RenderFrameProxyHost(SiteInstance* site_instance, |
RenderFrameProxyHostID(GetProcess()->GetID(), routing_id_), |
this)).second); |
CHECK_IMPLIES(!render_view_host, |
- frame_tree_node_->render_manager()->ForInnerDelegate()); |
+ frame_tree_node_->render_manager()->ForInnerDelegate() && |
+ frame_tree_node_->IsMainFrame()); |
if (render_view_host) |
frame_tree_node_->frame_tree()->AddRenderViewHostRef(render_view_host_); |
@@ -67,12 +68,14 @@ RenderFrameProxyHost::RenderFrameProxyHost(SiteInstance* site_instance, |
->render_manager() |
->current_frame_host() |
->GetSiteInstance() == site_instance; |
+ bool is_proxy_to_outer_delegate = |
+ frame_tree_node_->IsMainFrame() && |
+ frame_tree_node_->render_manager()->ForInnerDelegate(); |
// If this is a proxy to parent frame or this proxy is for the inner |
// WebContents's FrameTreeNode in outer WebContents's SiteInstance, then we |
// need a CrossProcessFrameConnector. |
- if (is_proxy_to_parent || |
- frame_tree_node_->render_manager()->ForInnerDelegate()) { |
+ if (is_proxy_to_parent || is_proxy_to_outer_delegate) { |
// The RenderFrameHost navigating cross-process is destroyed and a proxy for |
// it is created in the parent's process. CrossProcessFrameConnector |
// initialization only needs to happen on an initial cross-process |
@@ -199,6 +202,8 @@ void RenderFrameProxyHost::DisownOpener() { |
void RenderFrameProxyHost::OnDetach() { |
if (frame_tree_node_->render_manager()->ForInnerDelegate()) { |
+ // Only main frame proxy can detach for inner WebContents. |
+ DCHECK(frame_tree_node_->IsMainFrame()); |
frame_tree_node_->render_manager()->RemoveOuterDelegateFrame(); |
return; |
} |