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..e20938dc69459780d9375cbbd0b88f20bf4a7b55 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
| @@ -565,6 +565,12 @@ void RenderWidgetHostViewAndroid::WasResized() { |
| host_->WasResized(); |
| } |
| +void RenderWidgetHostViewAndroid::OnFullscreenStateChanged( |
| + bool entered_fullscreen) { |
| + web_contents_is_fullscreen_ = entered_fullscreen; |
| + EvictFrameIfNecessary(false); |
|
Khushal
2017/06/14 19:43:14
nit: UpdateFullscreenState?
steimel
2017/06/14 21:46:16
Done.
|
| +} |
| + |
| 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 +1190,62 @@ void RenderWidgetHostViewAndroid::DidCreateNewRendererCompositorFrameSink( |
| surface_returned_resources_.clear(); |
| } |
| +void RenderWidgetHostViewAndroid::EvictFrameIfNecessary( |
| + bool physical_backing_resized) { |
| + bool mismatched_fullscreen_states = |
| + web_contents_is_fullscreen_ != current_frame_is_fullscreen_; |
| + bool mismatched_sizes = |
| + view_.GetPhysicalBackingSize() != current_surface_size_; |
| + |
| + if (physical_backing_resized) { |
|
liberato (no reviews please)
2017/06/14 21:01:50
nit: no need for {}
steimel
2017/06/14 21:46:16
Done.
|
| + awaiting_resize_ = false; |
| + } |
| + |
| + switch (fullscreen_state_) { |
| + // From kNotFullscreen, we transition to kEnteringFullscreen whenever the |
| + // fullscreen state changes. |
| + case FullscreenState::kNotFullscreen: |
| + if (mismatched_fullscreen_states) { |
|
Khushal
2017/06/14 19:43:14
Should this be a DCHECK that web_contents_is_fulls
steimel
2017/06/14 21:46:16
Done.
|
| + fullscreen_state_ = FullscreenState::kEnteringFullscreen; |
| + awaiting_resize_ = !physical_backing_resized; |
|
Khushal
2017/06/14 19:43:14
This should also be a DCHECK I think. You should d
steimel
2017/06/14 21:46:16
Done.
|
| + } |
| + 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) { |
|
Khushal
2017/06/14 19:43:14
Same DCHECKs here but flipped. Browser transitions
steimel
2017/06/14 21:46:16
Done.
|
| + fullscreen_state_ = FullscreenState::kExitingFullscreen; |
| + awaiting_resize_ = !physical_backing_resized; |
| + } |
| + if (mismatched_sizes) { |
| + // TODO(steimel): Do we want to restrict this transition to when the |
| + // width/height have swapped (indicating a proper rotation), or are we |
| + // fine with any size change being treated as a rotation? |
| + fullscreen_state_ = FullscreenState::kFullscreenRotation; |
|
Khushal
2017/06/14 19:43:14
The only reason we needed the extra state was to u
steimel
2017/06/14 21:46:16
Acknowledged.
|
| + } |
| + 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 && |
| + !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(); |
| + UpdateBackgroundColor(SK_ColorBLACK); |
| + } |
| +} |
| + |
| void RenderWidgetHostViewAndroid::SubmitCompositorFrame( |
| const cc::LocalSurfaceId& local_surface_id, |
| cc::CompositorFrame frame) { |
| @@ -1197,6 +1259,7 @@ void RenderWidgetHostViewAndroid::SubmitCompositorFrame( |
| cc::RenderPass* root_pass = frame.render_pass_list.back().get(); |
| current_surface_size_ = root_pass->output_rect.size(); |
| + current_frame_is_fullscreen_ = frame.metadata.is_fullscreen; |
| bool is_transparent = root_pass->has_transparent_background; |
| cc::CompositorFrameMetadata metadata = frame.metadata.Clone(); |
| @@ -1228,6 +1291,8 @@ 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); |
| + |
| + EvictFrameIfNecessary(false); |
| } |
| void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { |
| @@ -1243,6 +1308,7 @@ void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { |
| frame_evictor_->DiscardedFrame(); |
| delegated_frame_host_->DestroyDelegatedContent(); |
| + current_surface_size_.SetSize(0, 0); |
| } |
| void RenderWidgetHostViewAndroid::OnDidNotProduceFrame( |
| @@ -2059,6 +2125,9 @@ void RenderWidgetHostViewAndroid::OnGestureEvent( |
| } |
| void RenderWidgetHostViewAndroid::OnPhysicalBackingSizeChanged() { |
| + // If we're entering a fullscreen transition, show black until the transition |
| + // is completed. |
| + EvictFrameIfNecessary(true); |
| WasResized(); |
| } |