summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorhugo.holgersson <hugo.holgersson@sonymobile.com>2015-08-17 07:07:19 -0700
committerCommit bot <commit-bot@chromium.org>2015-08-17 14:07:56 +0000
commite5e7aa9323e8391a36a2e2a624078279362f62c6 (patch)
treeb3b5f993868c8363484dad5104bbe5b6d0b83b70 /cc
parent29c17d0ac530145d9fa2eba928fd33737fd4b296 (diff)
downloadchromium_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.cc23
-rw-r--r--cc/trees/layer_tree_host_impl_unittest.cc59
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 {