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 2da5ad962dfed375abda9c138e1ef5a92d183fbd..c40b0e9e27d3b9e9b8864d6bef19fae5f230e510 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
| @@ -71,6 +71,7 @@ |
| #include "content/public/browser/devtools_agent_host.h" |
| #include "content/public/browser/render_view_host.h" |
| #include "content/public/browser/render_widget_host_iterator.h" |
| +#include "content/public/common/content_features.h" |
| #include "content/public/common/content_switches.h" |
| #include "gpu/command_buffer/client/gles2_implementation.h" |
| #include "gpu/command_buffer/client/gles2_interface.h" |
| @@ -565,6 +566,12 @@ void RenderWidgetHostViewAndroid::WasResized() { |
| host_->WasResized(); |
| } |
| +void RenderWidgetHostViewAndroid::OnFullscreenStateChanged( |
| + bool entered_fullscreen) { |
| + web_contents_is_fullscreen_ = entered_fullscreen; |
| + UpdateFullscreenState(); |
| +} |
| + |
| 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. |
| @@ -1184,6 +1191,58 @@ void RenderWidgetHostViewAndroid::DidCreateNewRendererCompositorFrameSink( |
| surface_returned_resources_.clear(); |
| } |
| +void RenderWidgetHostViewAndroid::UpdateFullscreenState() { |
| + if (!base::FeatureList::IsEnabled(features::kHideFullscreenTransitionJank)) |
| + return; |
| + |
| + bool mismatched_fullscreen_states = |
| + web_contents_is_fullscreen_ != current_frame_is_fullscreen_; |
| + bool mismatched_sizes = |
| + view_.GetPhysicalBackingSize() != current_surface_size_; |
| + |
| + switch (fullscreen_state_) { |
| + // From kNotFullscreen, we transition to kEnteringFullscreen whenever the |
| + // fullscreen state changes. |
| + case FullscreenState::kNotFullscreen: |
| + if (mismatched_fullscreen_states) { |
| + DCHECK(web_contents_is_fullscreen_); |
| + fullscreen_state_ = FullscreenState::kEnteringFullscreen; |
| + fullscreen_transition_awaiting_resize_ = true; |
|
boliu
2017/06/20 20:54:44
this seems way too brittle. how do you know enter/
aelias_OOO_until_Jul13
2017/06/20 21:15:14
Agreed, I gave a lot of feedback/suggestions about
Khushal
2017/06/20 21:26:35
You're right, this is a brittle assumption. We nee
Khushal
2017/06/20 21:44:03
How do you feel about an API via ViewAndroidDelega
boliu
2017/06/20 22:07:51
You can get the display size directly through the
Khushal
2017/06/20 23:25:05
WebView was what I was most unsure about. Is a res
boliu
2017/06/20 23:53:51
Nope. (It's more likely the app doesn't implement
Khushal
2017/06/21 00:08:25
Oh right. WebView doesn't get any frames at all he
boliu
2017/06/21 00:32:36
I'd prefer neither. But resize is probably safer o
|
| + } |
| + break; |
| + // From kFullscreen, we transition to kExitingFullscreen on a fullscreen |
| + // state change, or to kFullscreenRotation if we get a new size. |
| + case FullscreenState::kFullscreen: |
| + if (mismatched_fullscreen_states) { |
| + DCHECK(!web_contents_is_fullscreen_); |
| + fullscreen_state_ = FullscreenState::kExitingFullscreen; |
| + fullscreen_transition_awaiting_resize_ = true; |
| + } else if (mismatched_sizes) { |
| + fullscreen_state_ = FullscreenState::kFullscreenRotation; |
| + } |
| + break; |
| + // From any transition state, once we receive a "good" frame we transition |
| + // to the proper "good" state. |
| + case FullscreenState::kExitingFullscreen: |
| + case FullscreenState::kEnteringFullscreen: |
| + case FullscreenState::kFullscreenRotation: |
| + if (!mismatched_fullscreen_states && !mismatched_sizes && |
|
boliu
2017/06/20 20:54:44
also, how do you know entering/existing fullscreen
aelias_OOO_until_Jul13
2017/06/20 21:15:14
I'm comfortable assuming that fullscreen and rotat
Khushal
2017/06/20 21:26:35
Yup, need a more explicit way to handle the resize
steimel
2017/06/20 21:28:35
A lot of good points here, though regarding the sq
boliu
2017/06/20 21:33:49
Sure square phone is not realistic. But I'm not su
Khushal
2017/06/20 21:44:03
The place where that bit is being set doesn't requ
boliu
2017/06/20 22:07:51
Err... that makes me think background color is wro
Khushal
2017/06/20 23:25:05
Hmmm, may be it should be asking for a commit...
|
| + !fullscreen_transition_awaiting_resize_) { |
| + fullscreen_state_ = web_contents_is_fullscreen_ |
| + ? FullscreenState::kFullscreen |
| + : FullscreenState::kNotFullscreen; |
| + } |
| + break; |
| + } |
| + |
| + if (fullscreen_state_ == FullscreenState::kEnteringFullscreen || |
| + fullscreen_state_ == FullscreenState::kExitingFullscreen || |
| + fullscreen_state_ == FullscreenState::kFullscreenRotation) { |
| + EvictDelegatedFrame(); |
|
boliu
2017/06/20 20:54:44
need a comment why this is desirable
steimel
2017/06/22 01:32:11
Done.
|
| + UpdateBackgroundColor(SK_ColorBLACK); |
| + } |
| +} |
| + |
| void RenderWidgetHostViewAndroid::SubmitCompositorFrame( |
| const cc::LocalSurfaceId& local_surface_id, |
| cc::CompositorFrame frame) { |
| @@ -1243,6 +1302,7 @@ void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { |
| frame_evictor_->DiscardedFrame(); |
| delegated_frame_host_->DestroyDelegatedContent(); |
| + current_surface_size_.SetSize(0, 0); |
| } |
| void RenderWidgetHostViewAndroid::OnDidNotProduceFrame( |
| @@ -1455,6 +1515,7 @@ void RenderWidgetHostViewAndroid::OnFrameMetadataUpdated( |
| touch_selection_controller_->OnViewportChanged(viewport_rect); |
| } |
| + current_frame_is_fullscreen_ = frame_metadata.is_fullscreen; |
| UpdateBackgroundColor(is_transparent ? SK_ColorTRANSPARENT |
| : frame_metadata.root_background_color); |
| @@ -1488,6 +1549,8 @@ void RenderWidgetHostViewAndroid::OnFrameMetadataUpdated( |
| frame_metadata.top_controls_height * |
| frame_metadata.top_controls_shown_ratio, |
| top_shown_pix, top_changed, is_mobile_optimized); |
| + |
| + UpdateFullscreenState(); |
| } |
| void RenderWidgetHostViewAndroid::ShowInternal() { |
| @@ -1930,6 +1993,12 @@ SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { |
| return cached_background_color_; |
| } |
| +bool RenderWidgetHostViewAndroid::CanShowThumbnailPlaceholder() const { |
| + return !(fullscreen_state_ == FullscreenState::kEnteringFullscreen || |
| + fullscreen_state_ == FullscreenState::kExitingFullscreen || |
| + fullscreen_state_ == FullscreenState::kFullscreenRotation); |
| +} |
| + |
| void RenderWidgetHostViewAndroid::SetIsInVR(bool is_in_vr) { |
| is_in_vr_ = is_in_vr; |
| } |
| @@ -2059,6 +2128,8 @@ void RenderWidgetHostViewAndroid::OnGestureEvent( |
| } |
| void RenderWidgetHostViewAndroid::OnPhysicalBackingSizeChanged() { |
| + fullscreen_transition_awaiting_resize_ = false; |
| + UpdateFullscreenState(); |
| WasResized(); |
| } |