Reattach inner WebContents when recreating its RenderWidgetHostView.
Bug: 772354
Change-Id: Ie82bb502cbfbf989d653d45ba7e73164de448d26
Reviewed-on: https://chromium-review.googlesource.com/713949
Reviewed-by: James MacLean <[email protected]>
Reviewed-by: Charlie Reis <[email protected]>
Reviewed-by: Ken Buchanan <[email protected]>
Commit-Queue: Lucas Gadani <[email protected]>
Cr-Commit-Position: refs/heads/master@{#508741}
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 7297db4..f985ea2 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1631,12 +1631,7 @@
render_manager->CreateOuterDelegateProxy(
outer_contents_frame->GetSiteInstance(), outer_contents_frame_impl);
- render_manager->SetRWHViewForInnerContents(
- render_manager->GetRenderWidgetHostView());
-
- static_cast<RenderWidgetHostViewChildFrame*>(
- render_manager->GetRenderWidgetHostView())
- ->RegisterFrameSinkId();
+ ReattachToOuterWebContentsFrame();
if (outer_web_contents_impl->frame_tree_.GetFocusedFrame() ==
outer_contents_frame_impl->frame_tree_node()) {
@@ -1644,12 +1639,6 @@
outer_contents_frame->GetSiteInstance());
}
- // Set up the the guest's AX tree to point back at the embedder's AX tree.
- auto* parent_frame = outer_contents_frame->GetParent();
- GetMainFrame()->set_browser_plugin_embedder_ax_tree_id(
- parent_frame->GetAXTreeID());
- GetMainFrame()->UpdateAXTreeData();
-
// At this point, we should destroy the TextInputManager which will notify all
// the RWHV in this WebContents. The RWHV in this WebContents should use the
// TextInputManager owned by the outer WebContents.
@@ -1660,6 +1649,24 @@
text_input_manager_.reset(nullptr);
}
+void WebContentsImpl::ReattachToOuterWebContentsFrame() {
+ DCHECK(node_.outer_web_contents());
+ auto* render_manager = GetRenderManager();
+ auto* parent_frame =
+ node_.OuterContentsFrameTreeNode()->current_frame_host()->GetParent();
+ render_manager->SetRWHViewForInnerContents(
+ render_manager->GetRenderWidgetHostView());
+
+ static_cast<RenderWidgetHostViewChildFrame*>(
+ render_manager->GetRenderWidgetHostView())
+ ->RegisterFrameSinkId();
+
+ // Set up the the guest's AX tree to point back at the embedder's AX tree.
+ GetMainFrame()->set_browser_plugin_embedder_ax_tree_id(
+ parent_frame->GetAXTreeID());
+ GetMainFrame()->UpdateAXTreeData();
+}
+
void WebContentsImpl::DidChangeVisibleSecurityState() {
if (delegate_) {
delegate_->VisibleSecurityStateChanged(this);
@@ -5533,6 +5540,9 @@
return false;
}
+ if (proxy_routing_id == MSG_ROUTING_NONE && node_.outer_web_contents())
+ ReattachToOuterWebContentsFrame();
+
SetHistoryOffsetAndLengthForView(render_view_host,
controller_.GetLastCommittedEntryIndex(),
controller_.GetEntryCount());