Chromium Code Reviews| 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 7be414e7cc4e91facd5fe3d789e1370d81a0c57b..4fe870a495609c0a2d63a978927299e16f2b9af2 100644 |
| --- a/content/browser/frame_host/render_frame_host_impl.cc |
| +++ b/content/browser/frame_host/render_frame_host_impl.cc |
| @@ -172,10 +172,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), |
| @@ -188,6 +189,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( |
| @@ -213,6 +216,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() { |
| @@ -554,7 +565,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. |
|
nasko
2014/10/02 20:41:44
Does that imply that if the process crashes and we
kenrb
2014/10/03 17:23:32
That's the way it is supposed to work, although it
|
| + 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 |
| @@ -744,6 +773,12 @@ 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_); |
| } |