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 43be1e9382c12832304e21b2ff4e4dd38b18cfb0..9fe0e7d912d8b9425b43302f0e27cadddda40b69 100644 |
| --- a/content/browser/frame_host/render_frame_host_impl.cc |
| +++ b/content/browser/frame_host/render_frame_host_impl.cc |
| @@ -214,9 +214,17 @@ RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, |
| &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr()))); |
| if (widget_routing_id != MSG_ROUTING_NONE) { |
| - render_widget_host_ = new RenderWidgetHostImpl(rwh_delegate, GetProcess(), |
| - widget_routing_id, hidden); |
| - render_widget_host_->set_owned_by_render_frame_host(true); |
| + // TODO(avi): Once RenderViewHostImpl has-a RenderWidgetHostImpl, the main |
| + // render frame should probably start owning the RenderWidgetHostImpl, |
| + // so this logic checking for an already existing RWHI should be removed. |
| + // https://crbug.com/545684 |
| + render_widget_host_ = |
| + RenderWidgetHostImpl::FromID(GetProcess()->GetID(), widget_routing_id); |
| + if (!render_widget_host_) { |
| + render_widget_host_ = new RenderWidgetHostImpl(rwh_delegate, GetProcess(), |
| + widget_routing_id, hidden); |
| + render_widget_host_->set_owned_by_render_frame_host(true); |
| + } |
|
ncarter (slow)
2015/10/21 22:15:48
Does it make sense to add a DCHECK:
else {
DCHEC
dcheng
2015/10/21 23:46:51
Done.
|
| } |
| } |
| @@ -233,10 +241,6 @@ RenderFrameHostImpl::~RenderFrameHostImpl() { |
| if (IsRFHStateActive(rfh_state_)) |
| GetSiteInstance()->decrement_active_frame_count(); |
| - // Notify the FrameTree that this RFH is going away, allowing it to shut down |
| - // the corresponding RenderViewHost if it is no longer needed. |
| - frame_tree_->ReleaseRenderViewHostRef(render_view_host_); |
| - |
| // NULL out the swapout timer; in crash dumps this member will be null only if |
| // the dtor has run. |
| swapout_event_monitor_timeout_.reset(); |
| @@ -245,10 +249,15 @@ RenderFrameHostImpl::~RenderFrameHostImpl() { |
| iter.second.Run(false); |
| } |
| - if (render_widget_host_) { |
| + if (render_widget_host_ && |
| + render_widget_host_->owned_by_render_frame_host()) { |
| // Shutdown causes the RenderWidgetHost to delete itself. |
| render_widget_host_->Shutdown(); |
| } |
| + |
| + // Notify the FrameTree that this RFH is going away, allowing it to shut down |
| + // the corresponding RenderViewHost if it is no longer needed. |
| + frame_tree_->ReleaseRenderViewHostRef(render_view_host_); |
| } |
| int RenderFrameHostImpl::GetRoutingID() { |
| @@ -954,15 +963,7 @@ void RenderFrameHostImpl::OnDidDropNavigation() { |
| } |
| RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() { |
| - if (render_widget_host_) |
| - return render_widget_host_; |
| - |
| - // TODO(kenrb): Remove this fallback and have the top-level frame have a |
| - // widget host just like all the other frames. |
| - if (!GetParent()) |
| - return render_view_host_->GetWidget(); |
| - |
| - return nullptr; |
| + return render_widget_host_; |
| } |
| RenderWidgetHostView* RenderFrameHostImpl::GetView() { |
| @@ -973,7 +974,8 @@ RenderWidgetHostView* RenderFrameHostImpl::GetView() { |
| frame = static_cast<RenderFrameHostImpl*>(frame->GetParent()); |
| } |
| - return render_view_host_->GetWidget()->GetView(); |
| + NOTREACHED(); |
| + return nullptr; |
| } |
| int RenderFrameHostImpl::GetEnabledBindings() { |