| 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(
|
|
|