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 988f9e876b4bdc989331f534aed27ff9014d36f5..115e2a5b4fccd42f0bee46989afed8c31b486836 100644 |
--- a/content/browser/frame_host/render_frame_proxy_host.cc |
+++ b/content/browser/frame_host/render_frame_proxy_host.cc |
@@ -53,11 +53,18 @@ RenderFrameProxyHost::RenderFrameProxyHost(SiteInstance* site_instance, |
RenderFrameProxyHostID(GetProcess()->GetID(), routing_id_), |
this)).second); |
- if (!frame_tree_node_->IsMainFrame() && |
+ // If this is a proxy to embedder created in the guest's FTN, then we |
+ // need a CrossProcessFrameConnector. |
+ bool is_proxy_to_embedder_for_guest = |
+ frame_tree_node_->IsMainFrame() && |
+ frame_tree_node_->render_manager()->current_frame_host() |
+ ->GetSiteInstance()->GetSiteURL().SchemeIs("chrome-guest"); |
+ if ((!frame_tree_node_->IsMainFrame() && |
frame_tree_node_->parent() |
->render_manager() |
->current_frame_host() |
- ->GetSiteInstance() == site_instance) { |
+ ->GetSiteInstance() == site_instance) || |
+ is_proxy_to_embedder_for_guest) { |
// 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 |
@@ -89,9 +96,17 @@ void RenderFrameProxyHost::SetChildRWHView(RenderWidgetHostView* view) { |
static_cast<RenderWidgetHostViewChildFrame*>(view)); |
} |
+// TODO(lazyboy): We can probably cache a pointer to RVH in this class |
+// as we do in RenderFrameHostImpl. |
RenderViewHostImpl* RenderFrameProxyHost::GetRenderViewHost() { |
- return frame_tree_node_->frame_tree()->GetRenderViewHost( |
- site_instance_.get()); |
+ // RVH of embedder site instance does not live in the guest RFHM, we need |
+ // to look it up in the embedder's FrameTree. |
+ RenderFrameProxyHost* proxy_to_embedder = |
+ frame_tree_node_->render_manager()->GetProxyToEmbedder(); |
+ FrameTree* frame_tree = proxy_to_embedder ? |
+ proxy_to_embedder->frame_tree_node_->frame_tree() : |
+ frame_tree_node_->frame_tree(); |
+ return frame_tree->GetRenderViewHost(site_instance_.get()); |
} |
void RenderFrameProxyHost::TakeFrameHostOwnership( |