diff options
author | hugo.holgersson <hugo.holgersson@sonymobile.com> | 2015-08-17 07:07:19 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-17 14:07:56 +0000 |
commit | e5e7aa9323e8391a36a2e2a624078279362f62c6 (patch) | |
tree | b3b5f993868c8363484dad5104bbe5b6d0b83b70 /cc | |
parent | 29c17d0ac530145d9fa2eba928fd33737fd4b296 (diff) | |
download | chromium_src-e5e7aa9323e8391a36a2e2a624078279362f62c6.zip chromium_src-e5e7aa9323e8391a36a2e2a624078279362f62c6.tar.gz chromium_src-e5e7aa9323e8391a36a2e2a624078279362f62c6.tar.bz2 |
Lock video controls' position during fullscreen
Problem:
Video controls can be scrolled (moved) when
an Android WebView does fullscreen-video.
Solution:
When visual viewport's scrolling is disabled
using setUserScrollable(false, false), do
also disable over-scrolling (do not send
overscroll-events to the Android WebView).
BUG=448738
TEST=
1. Start com.android.browser and go to
http://robnyman.github.io/fullscreen/ .
2. Start video playback.
3. Go fullscreen on video.
4. Fling the screen.
5. Notice 1: Video controls cannot move.
6. Notice 2: No "over glow" (compare with
Android Chrome or Lollipop's WebView).
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1228423002
Cr-Commit-Position: refs/heads/master@{#343675}
Diffstat (limited to 'cc')
-rw-r--r-- | cc/trees/layer_tree_host_impl.cc | 23 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl_unittest.cc | 59 |
2 files changed, 76 insertions, 6 deletions
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 5b52d07..49d1821 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc @@ -1499,19 +1499,21 @@ CompositorFrameMetadata LayerTreeHostImpl::MakeCompositorFrameMetadata() const { active_tree_->GetViewportSelection(&metadata.selection); - LayerImpl* root_layer_for_overflow = OuterViewportScrollLayer() - ? OuterViewportScrollLayer() - : InnerViewportScrollLayer(); - if (root_layer_for_overflow) { + if (OuterViewportScrollLayer()) { metadata.root_overflow_x_hidden = - !root_layer_for_overflow->user_scrollable_horizontal(); + !OuterViewportScrollLayer()->user_scrollable_horizontal(); metadata.root_overflow_y_hidden = - !root_layer_for_overflow->user_scrollable_vertical(); + !OuterViewportScrollLayer()->user_scrollable_vertical(); } if (!InnerViewportScrollLayer()) return metadata; + metadata.root_overflow_x_hidden |= + !InnerViewportScrollLayer()->user_scrollable_horizontal(); + metadata.root_overflow_y_hidden |= + !InnerViewportScrollLayer()->user_scrollable_vertical(); + // TODO(miletus) : Change the metadata to hold ScrollOffset. metadata.root_scroll_offset = gfx::ScrollOffsetToVector2dF( active_tree_->TotalScrollOffset()); @@ -2749,6 +2751,15 @@ InputHandlerScrollResult LayerTreeHostImpl::ScrollBy( accumulated_root_overscroll_.set_y(0); gfx::Vector2dF unused_root_delta(scroll_state.delta_x(), scroll_state.delta_y()); + + // When inner viewport is unscrollable, disable overscrolls. + if (InnerViewportScrollLayer()) { + if (!InnerViewportScrollLayer()->user_scrollable_horizontal()) + unused_root_delta.set_x(0); + if (!InnerViewportScrollLayer()->user_scrollable_vertical()) + unused_root_delta.set_y(0); + } + accumulated_root_overscroll_ += unused_root_delta; bool did_scroll_top_controls = diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index e32780f..127679c 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc @@ -2216,6 +2216,39 @@ TEST_F(LayerTreeHostImplTest, CompositorFrameMetadata) { EXPECT_TRUE(metadata.root_overflow_y_hidden); } + // Re-enable scrollability and verify that overflows are no longer hidden. + { + host_impl_->active_tree() + ->OuterViewportScrollLayer() + ->set_user_scrollable_horizontal(true); + host_impl_->active_tree() + ->OuterViewportScrollLayer() + ->set_user_scrollable_vertical(true); + CompositorFrameMetadata metadata = + host_impl_->MakeCompositorFrameMetadata(); + EXPECT_FALSE(metadata.root_overflow_x_hidden); + EXPECT_FALSE(metadata.root_overflow_y_hidden); + } + + // Root "overflow: hidden" properties should also be reflected on the + // inner viewport scroll layer. + { + host_impl_->active_tree() + ->InnerViewportScrollLayer() + ->set_user_scrollable_horizontal(false); + CompositorFrameMetadata metadata = + host_impl_->MakeCompositorFrameMetadata(); + EXPECT_TRUE(metadata.root_overflow_x_hidden); + EXPECT_FALSE(metadata.root_overflow_y_hidden); + + host_impl_->active_tree() + ->InnerViewportScrollLayer() + ->set_user_scrollable_vertical(false); + metadata = host_impl_->MakeCompositorFrameMetadata(); + EXPECT_TRUE(metadata.root_overflow_x_hidden); + EXPECT_TRUE(metadata.root_overflow_y_hidden); + } + // Page scale should update metadata correctly (shrinking only the viewport). host_impl_->ScrollBegin(gfx::Point(), InputHandler::GESTURE); host_impl_->PinchGestureBegin(); @@ -7660,6 +7693,32 @@ TEST_F(LayerTreeHostImplVirtualViewportTest, host_impl_->ScrollEnd(); } +TEST_F(LayerTreeHostImplVirtualViewportTest, + NoOverscrollWhenInnerViewportCantScroll) { + InputHandlerScrollResult scroll_result; + gfx::Size content_size = gfx::Size(100, 160); + gfx::Size outer_viewport = gfx::Size(50, 80); + gfx::Size inner_viewport = gfx::Size(25, 40); + SetupVirtualViewportLayers(content_size, outer_viewport, inner_viewport); + DrawFrame(); + + // Make inner viewport unscrollable. + LayerImpl* inner_scroll = host_impl_->InnerViewportScrollLayer(); + inner_scroll->set_user_scrollable_horizontal(false); + inner_scroll->set_user_scrollable_vertical(false); + + // Ensure inner viewport doesn't react to scrolls (test it's unscrollable). + EXPECT_VECTOR_EQ(gfx::Vector2dF(), inner_scroll->CurrentScrollOffset()); + EXPECT_EQ(InputHandler::SCROLL_STARTED, + host_impl_->ScrollBegin(gfx::Point(), InputHandler::GESTURE)); + scroll_result = host_impl_->ScrollBy(gfx::Point(), gfx::Vector2dF(0, 100)); + EXPECT_VECTOR_EQ(gfx::Vector2dF(), inner_scroll->CurrentScrollOffset()); + + // When inner viewport is unscrollable, a fling gives zero overscroll. + EXPECT_FALSE(scroll_result.did_overscroll_root); + EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll()); +} + class LayerTreeHostImplWithImplicitLimitsTest : public LayerTreeHostImplTest { public: void SetUp() override { |