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 6bb8df43f18c52bd7d062cfe36f7465a7172d4f8..34d487c211371f7e7422ca07bd816d93a3d2e327 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -457,17 +457,24 @@ ServiceRegistry* RenderFrameHostImpl::GetServiceRegistry() { |
blink::WebPageVisibilityState RenderFrameHostImpl::GetVisibilityState() { |
// Works around the crashes seen in https://crbug.com/501863, where the |
// active WebContents from a browser iterator may contain a render frame |
- // detached from the frame tree. |
- RenderWidgetHostView* view = RenderFrameHostImpl::GetView(); |
- if (!view || !view->GetRenderWidgetHost()) |
+ // detached from the frame tree. This tries to find a RenderWidgetHost |
+ // attached to an ancestor frame, and defaults to visibility hidden if |
+ // it fails. |
+ // TODO(yfriedman, peter): Ideally this would never be called on an |
+ // unattached frame and we could omit this check. See |
+ // https://crbug.com/615867. |
+ RenderFrameHostImpl* frame = this; |
+ while (frame) { |
+ if (frame->render_widget_host_) |
+ break; |
+ frame = frame->GetParent(); |
+ } |
+ if (!frame) |
return blink::WebPageVisibilityStateHidden; |
- // TODO(mlamouri,kenrb): call GetRenderWidgetHost() directly when it stops |
- // returning nullptr in some cases. See https://crbug.com/455245. |
blink::WebPageVisibilityState visibility_state = |
- RenderWidgetHostImpl::From(view->GetRenderWidgetHost())->is_hidden() |
- ? blink::WebPageVisibilityStateHidden |
- : blink::WebPageVisibilityStateVisible; |
+ GetRenderWidgetHost()->is_hidden() ? blink::WebPageVisibilityStateHidden |
+ : blink::WebPageVisibilityStateVisible; |
GetContentClient()->browser()->OverridePageVisibilityState(this, |
&visibility_state); |
return visibility_state; |
@@ -1177,21 +1184,21 @@ void RenderFrameHostImpl::OnUpdateState(const PageState& state) { |
} |
RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() { |
- return render_widget_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 frame->render_widget_host_; |
+ frame = frame->GetParent(); |
} |
NOTREACHED(); |
return nullptr; |
} |
+RenderWidgetHostView* RenderFrameHostImpl::GetView() { |
+ return GetRenderWidgetHost()->GetView(); |
+} |
+ |
GlobalFrameRoutingId RenderFrameHostImpl::GetGlobalFrameRoutingId() { |
return GlobalFrameRoutingId(GetProcess()->GetID(), GetRoutingID()); |
} |
@@ -2379,10 +2386,7 @@ void RenderFrameHostImpl::InvalidateMojoConnection() { |
} |
bool RenderFrameHostImpl::IsFocused() { |
- // TODO(mlamouri,kenrb): call GetRenderWidgetHost() directly when it stops |
- // returning nullptr in some cases. See https://crbug.com/455245. |
- return RenderWidgetHostImpl::From( |
- GetView()->GetRenderWidgetHost())->is_focused() && |
+ return GetRenderWidgetHost()->is_focused() && |
frame_tree_->GetFocusedFrame() && |
(frame_tree_->GetFocusedFrame() == frame_tree_node() || |
frame_tree_->GetFocusedFrame()->IsDescendantOf(frame_tree_node())); |