Index: content/browser/frame_host/render_frame_host_impl.cc |
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc |
index cd2d1a0935bed05796f83addcdecaf193ab4d031..cebe50e413d7efac436903e81b0414f582cba1b5 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -173,10 +173,11 @@ RenderFrameHostImpl* RenderFrameHostImpl::FromID(int process_id, |
RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, |
RenderFrameHostDelegate* delegate, |
+ RenderWidgetHostDelegate* rwh_delegate, |
FrameTree* frame_tree, |
FrameTreeNode* frame_tree_node, |
int routing_id, |
- bool is_swapped_out) |
+ int flags) |
: render_view_host_(render_view_host), |
delegate_(delegate), |
cross_process_frame_connector_(NULL), |
@@ -189,6 +190,8 @@ RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, |
is_waiting_for_beforeunload_ack_(false), |
unload_ack_is_for_cross_site_transition_(false), |
weak_ptr_factory_(this) { |
+ bool is_swapped_out = flags & SWAPPED_OUT; |
+ bool hidden = flags & HIDDEN; |
frame_tree_->RegisterRenderFrameHost(this); |
GetProcess()->AddRoute(routing_id_, this); |
g_routing_id_frame_map.Get().insert(std::make_pair( |
@@ -214,6 +217,14 @@ RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, |
swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind( |
&RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr()))); |
+ |
+ if (flags & CREATE_RENDER_WIDGET_HOST) { |
+ render_widget_host_.reset( |
+ new RenderWidgetHostImpl(rwh_delegate, |
+ GetProcess(), |
+ MSG_ROUTING_NONE, |
+ hidden)); |
+ } |
} |
RenderFrameHostImpl::~RenderFrameHostImpl() { |
@@ -556,7 +567,25 @@ bool RenderFrameHostImpl::CreateRenderFrame(int parent_routing_id) { |
DCHECK(GetProcess()->HasConnection()); |
- Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id)); |
+ FrameMsg_NewFrame_WidgetParams widget_params; |
+ if (render_widget_host_) { |
+ widget_params.routing_id = render_widget_host_->GetRoutingID(); |
+ widget_params.surface_id = render_widget_host_->surface_id(); |
+ widget_params.hidden = render_widget_host_->is_hidden(); |
+ } else { |
+ // MSG_ROUTING_NONE will prevent a new RenderWidget from being created in |
+ // the renderer process. |
+ widget_params.routing_id = MSG_ROUTING_NONE; |
+ widget_params.surface_id = 0; |
+ widget_params.hidden = true; |
+ } |
+ |
+ Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id, widget_params)); |
+ |
+ // The lifetime of the view gets tied to the lifetime of the |
+ // current render process for this RenderFrameHost. |
+ if (render_widget_host_) |
+ new RenderWidgetHostViewChildFrame(render_widget_host_.get()); |
// The renderer now has a RenderFrame for this RenderFrameHost. Note that |
// this path is only used for out-of-process iframes. Main frame RenderFrames |
@@ -746,9 +775,26 @@ void RenderFrameHostImpl::OnDidCommitProvisionalLoad(const IPC::Message& msg) { |
} |
RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() { |
+ if (render_widget_host_) |
+ return render_widget_host_.get(); |
+ |
+ // TODO(kenrb): When RenderViewHost no longer inherits RenderWidgetHost, |
+ // we can remove this fallback. Currently it is only used for the main |
+ // frame. |
return static_cast<RenderWidgetHostImpl*>(render_view_host_); |
} |
+RenderWidgetHostView* RenderFrameHostImpl::GetView() { |
+ RenderFrameHostImpl* frame = this; |
+ while (frame) { |
+ if (frame->render_widget_host_) |
+ return frame->render_widget_host_->GetView(); |
+ frame = static_cast<RenderFrameHostImpl*>(frame->GetParent()); |
+ } |
+ |
+ return render_view_host_->GetView(); |
+} |
+ |
int RenderFrameHostImpl::GetEnabledBindings() { |
return render_view_host_->GetEnabledBindings(); |
} |