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 f284e5765ae46ad8fe3d6ec78e6a8c38ec56c3af..955722f56b1ab1c5aee495391be5c2b87078fb3c 100644 |
| --- a/content/browser/frame_host/render_frame_host_impl.cc |
| +++ b/content/browser/frame_host/render_frame_host_impl.cc |
| @@ -119,6 +119,7 @@ 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, |
| @@ -139,6 +140,7 @@ RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, |
| no_create_browser_accessibility_manager_for_testing_(false), |
| weak_ptr_factory_(this) { |
| bool is_swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); |
| + bool hidden = !!(flags & CREATE_RF_HIDDEN); |
| frame_tree_->RegisterRenderFrameHost(this); |
| GetProcess()->AddRoute(routing_id_, this); |
| g_routing_id_frame_map.Get().insert(std::make_pair( |
| @@ -155,6 +157,12 @@ RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, |
| SetUpMojoIfNeeded(); |
| swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind( |
| &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr()))); |
| + |
| + if (flags & CREATE_RF_NEEDS_RENDER_WIDGET_HOST) { |
| + render_widget_host_.reset(new RenderWidgetHostImpl( |
| + rwh_delegate, GetProcess(), MSG_ROUTING_NONE, hidden)); |
| + render_widget_host_->set_owned_by_render_frame_host(true); |
| + } |
| } |
| RenderFrameHostImpl::~RenderFrameHostImpl() { |
| @@ -179,6 +187,9 @@ RenderFrameHostImpl::~RenderFrameHostImpl() { |
| // NULL out the swapout timer; in crash dumps this member will be null only if |
| // the dtor has run. |
| swapout_event_monitor_timeout_.reset(); |
| + |
| + if (render_widget_host_) |
| + render_widget_host_->Cleanup(); |
| } |
| int RenderFrameHostImpl::GetRoutingID() { |
| @@ -514,14 +525,36 @@ bool RenderFrameHostImpl::CreateRenderFrame(int parent_routing_id, |
| DCHECK(GetProcess()->HasConnection()); |
| + 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, proxy_routing_id, |
| - frame_tree_node()->current_replication_state())); |
| + frame_tree_node()->current_replication_state(), |
| + widget_params)); |
| + |
| + // The RenderWidgetHost takes ownership of its view. It is tied to the |
| + // lifetime of the current RenderProcessHost for this RenderFrameHost. |
| + if (render_widget_host_) { |
| + RenderWidgetHostView* rwhv = |
| + new RenderWidgetHostViewChildFrame(render_widget_host_.get()); |
| + rwhv->Hide(); |
| + } |
| // The renderer now has a RenderFrame for this RenderFrameHost. Note that |
| // this path is only used for out-of-process iframes. Main frame RenderFrames |
| // are created with their RenderView, and same-site iframes are created at the |
| // time of OnCreateChildFrame. |
| - set_render_frame_created(true); |
| + SetRenderFrameCreated(true); |
| return true; |
| } |
| @@ -540,6 +573,12 @@ bool RenderFrameHostImpl::IsRenderFrameLive() { |
| return is_live; |
| } |
| +void RenderFrameHostImpl::SetRenderFrameCreated(bool created) { |
| + render_frame_created_ = created; |
| + if (created && render_widget_host_) |
| + render_widget_host_->InitForFrame(); |
| +} |
| + |
| void RenderFrameHostImpl::Init() { |
| GetProcess()->ResumeRequestsForView(routing_id_); |
| } |
| @@ -581,7 +620,7 @@ void RenderFrameHostImpl::OnCreateChildFrame(int new_routing_id, |
| // We know that the RenderFrame has been created in this case, immediately |
| // after the CreateChildFrame IPC was sent. |
| - new_frame->set_render_frame_created(true); |
| + new_frame->SetRenderFrameCreated(true); |
| new_frame->frame_tree_node()->set_sandbox_flags(sandbox_flags); |
| @@ -732,7 +771,27 @@ void RenderFrameHostImpl::OnDidDropNavigation() { |
| } |
| RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() { |
| - return static_cast<RenderWidgetHostImpl*>(render_view_host_); |
| + 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. |
| + if (!GetParent()) |
| + return static_cast<RenderWidgetHostImpl*>(render_view_host_); |
| + |
| + return nullptr; |
|
mlamouri (slow - plz ping)
2015/01/23 12:16:30
Why is that not:
return GetParent()->GetRenderWi
|
| +} |
| + |
| +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() { |