Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_android.cc |
| diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc |
| index b9898a869d9c3e42e0e206cce3d8230a93d8aee9..abfc895af972fb5d73236415ff73899b636922c4 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
| @@ -562,6 +562,21 @@ void RenderWidgetHostViewAndroid::WasResized() { |
| host_->WasResized(); |
| } |
| +void RenderWidgetHostViewAndroid::DidToggleFullscreenModeForTab( |
| + bool entered_fullscreen, |
| + bool will_cause_resize) { |
| + if (!fullscreen_transitioning_) { |
| + fullscreen_transitioning_ = true; |
|
Khushal
2017/06/07 05:36:01
The reason why I suggested the enum was so its eas
liberato (no reviews please)
2017/06/13 22:06:42
+1. it took me several reads to notice that |fulls
steimel
2017/06/13 23:15:44
Done.
|
| + // TODO(steimel): Do we always want to await a resize? Danger of getting |
| + // stuck with a black screen if we await one that's not going to occur. |
| + // However, even when |will_cause_resize| == false, I still see a resize |
| + // occurring, which means that even if there are cases in which we don't |
| + // want to await a resize, we won't be able to tell from that parameter. |
| + awaiting_resize_ = true; |
| + } |
| + HideFullscreenTransitionJank(); |
| +} |
| + |
| void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { |
| // Ignore the given size as only the Java code has the power to |
| // resize the view on Android. |
| @@ -1181,6 +1196,35 @@ void RenderWidgetHostViewAndroid::DidCreateNewRendererCompositorFrameSink( |
| surface_returned_resources_.clear(); |
| } |
| +bool RenderWidgetHostViewAndroid::HasFullscreenTransitionJank( |
| + const cc::CompositorFrame& frame) const { |
| + // We only check for fullscreen jank during a fullscreen transition. |
| + if (fullscreen_transitioning_) { |
|
liberato (no reviews please)
2017/06/13 22:06:42
if (!fullscreen_transitioning_)
return false;
o
steimel
2017/06/13 23:15:44
This has been completely refactored now :)
|
| + gfx::Size frame_size = frame.render_pass_list.back()->output_rect.size(); |
| + bool mismatched_layer_sizes = view_.GetPhysicalBackingSize() != frame_size; |
| + |
| + bool mismatched_fullscreen_states = |
| + content_view_core_ && |
| + (content_view_core_->GetWebContents()->IsFullscreen() != |
| + frame.metadata.is_fullscreen); |
| + |
| + return mismatched_fullscreen_states || mismatched_layer_sizes || |
| + awaiting_resize_; |
|
Khushal
2017/06/07 05:36:01
When do we hit this case? Where layer sizes and fu
steimel
2017/06/13 23:15:44
Discussed offline
|
| + } |
| + |
| + return false; |
| +} |
| + |
| +void RenderWidgetHostViewAndroid::HideFullscreenTransitionJank() { |
| + EvictDelegatedFrame(); |
| + UpdateBackgroundColor(SK_ColorBLACK); |
| +} |
| + |
| +void RenderWidgetHostViewAndroid::EndFullscreenTransition() { |
| + fullscreen_transitioning_ = false; |
| + awaiting_resize_ = false; |
| +} |
| + |
| void RenderWidgetHostViewAndroid::SubmitCompositorFrame( |
| const cc::LocalSurfaceId& local_surface_id, |
| cc::CompositorFrame frame) { |
| @@ -1189,6 +1233,8 @@ void RenderWidgetHostViewAndroid::SubmitCompositorFrame( |
| return; |
| } |
| + bool has_jank = HasFullscreenTransitionJank(frame); |
| + |
| last_scroll_offset_ = frame.metadata.root_scroll_offset; |
| DCHECK(!frame.render_pass_list.empty()); |
| @@ -1225,6 +1271,12 @@ void RenderWidgetHostViewAndroid::SubmitCompositorFrame( |
| // As the metadata update may trigger view invalidation, always call it after |
| // any potential compositor scheduling. |
| OnFrameMetadataUpdated(std::move(metadata), is_transparent); |
| + |
| + if (has_jank) { |
| + HideFullscreenTransitionJank(); |
| + } else if (fullscreen_transitioning_) { |
| + EndFullscreenTransition(); |
| + } |
| } |
| void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { |
| @@ -1240,6 +1292,7 @@ void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { |
| frame_evictor_->DiscardedFrame(); |
| delegated_frame_host_->DestroyDelegatedContent(); |
| + current_surface_size_.SetSize(0, 0); |
| } |
| void RenderWidgetHostViewAndroid::OnDidNotProduceFrame( |
| @@ -1938,9 +1991,13 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
| } |
| if (content_view_core) { |
| content_view_core->AddObserver(this); |
| + content::WebContentsObserver::Observe( |
| + content_view_core->GetWebContents()); |
| ui::ViewAndroid* parent_view = content_view_core->GetViewAndroid(); |
| parent_view->AddChild(&view_); |
| parent_view->GetLayer()->AddChild(view_.GetLayer()); |
| + } else { |
| + content::WebContentsObserver::Observe(NULL); |
| } |
| content_view_core_ = content_view_core; |
| } |
| @@ -2021,6 +2078,16 @@ void RenderWidgetHostViewAndroid::OnGestureEvent( |
| } |
| void RenderWidgetHostViewAndroid::OnPhysicalBackingSizeChanged() { |
| + // If we're entering a fullscreen transition, show black until the transition |
| + // is completed. |
| + if (content_view_core_) { |
| + bool is_fullscreen = content_view_core_->GetWebContents()->IsFullscreen(); |
|
Khushal
2017/06/07 05:36:01
Shouldn't be able to include WebContents here but
steimel
2017/06/13 23:15:44
Refactored to store what we get when WebContents t
|
| + if (is_fullscreen || fullscreen_transitioning_) { |
| + fullscreen_transitioning_ = true; |
| + awaiting_resize_ = false; |
| + HideFullscreenTransitionJank(); |
| + } |
| + } |
| WasResized(); |
| } |