diff options
author | jdduke <jdduke@chromium.org> | 2015-02-11 22:28:20 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-12 06:28:50 +0000 |
commit | 2afdbf72bcfa0a2e30d31a37ca6499dcb99a62aa (patch) | |
tree | 22e2334dc83b82ccb0f367e9bc2070615863437f /cc | |
parent | 55f1e5199dcc7363466ff424e2a1325c2fc9fa6f (diff) | |
download | chromium_src-2afdbf72bcfa0a2e30d31a37ca6499dcb99a62aa.zip chromium_src-2afdbf72bcfa0a2e30d31a37ca6499dcb99a62aa.tar.gz chromium_src-2afdbf72bcfa0a2e30d31a37ca6499dcb99a62aa.tar.bz2 |
[Android] Disable pull-to-refresh with overflow-y:hidden
Currently, the only way to disable the pull-to-refresh effect is to
explictly preventDefault the causal touches or suppress their default
actions with touch-action: none. However, the latter prevents
any kind of accelerated scrolling, and the former can be to get right
with composed or nested scrollable content.
Use the overflow-y:hidden property on the root element as a signal to
disable the effect. This dovetails with how this property both prevents
hiding of the top controls and suppresses the overscroll glow effect.
BUG=456515,456300
Review URL: https://codereview.chromium.org/910373002
Cr-Commit-Position: refs/heads/master@{#315938}
Diffstat (limited to 'cc')
-rw-r--r-- | cc/output/compositor_frame_metadata.cc | 4 | ||||
-rw-r--r-- | cc/output/compositor_frame_metadata.h | 2 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl.cc | 10 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl_unittest.cc | 20 |
4 files changed, 35 insertions, 1 deletions
diff --git a/cc/output/compositor_frame_metadata.cc b/cc/output/compositor_frame_metadata.cc index 039f69d3..dad78a0 100644 --- a/cc/output/compositor_frame_metadata.cc +++ b/cc/output/compositor_frame_metadata.cc @@ -10,7 +10,9 @@ CompositorFrameMetadata::CompositorFrameMetadata() : device_scale_factor(0.f), page_scale_factor(0.f), min_page_scale_factor(0.f), - max_page_scale_factor(0.f) { + max_page_scale_factor(0.f), + root_overflow_x_hidden(false), + root_overflow_y_hidden(false) { } CompositorFrameMetadata::~CompositorFrameMetadata() { diff --git a/cc/output/compositor_frame_metadata.h b/cc/output/compositor_frame_metadata.h index a6fe2d4..e92a84d 100644 --- a/cc/output/compositor_frame_metadata.h +++ b/cc/output/compositor_frame_metadata.h @@ -34,6 +34,8 @@ class CC_EXPORT CompositorFrameMetadata { gfx::SizeF root_layer_size; float min_page_scale_factor; float max_page_scale_factor; + bool root_overflow_x_hidden; + bool root_overflow_y_hidden; // Used to position the Android location top bar and page content, whose // precise position is computed by the renderer compositor. diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index bd77d84..95e1ab1 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc @@ -1458,6 +1458,16 @@ CompositorFrameMetadata LayerTreeHostImpl::MakeCompositorFrameMetadata() const { active_tree_->GetViewportSelection(&metadata.selection_start, &metadata.selection_end); + LayerImpl* root_layer_for_overflow = OuterViewportScrollLayer() + ? OuterViewportScrollLayer() + : InnerViewportScrollLayer(); + if (root_layer_for_overflow) { + metadata.root_overflow_x_hidden = + !root_layer_for_overflow->user_scrollable_horizontal(); + metadata.root_overflow_y_hidden = + !root_layer_for_overflow->user_scrollable_vertical(); + } + if (!InnerViewportScrollLayer()) return metadata; diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 23e90e1..4deb8e4 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc @@ -1844,6 +1844,8 @@ TEST_F(LayerTreeHostImplTest, CompositorFrameMetadata) { EXPECT_EQ(gfx::SizeF(100.f, 100.f), metadata.root_layer_size); EXPECT_EQ(0.5f, metadata.min_page_scale_factor); EXPECT_EQ(4.f, metadata.max_page_scale_factor); + EXPECT_FALSE(metadata.root_overflow_x_hidden); + EXPECT_FALSE(metadata.root_overflow_y_hidden); } // Scrolling should update metadata immediately. @@ -1862,6 +1864,24 @@ TEST_F(LayerTreeHostImplTest, CompositorFrameMetadata) { EXPECT_EQ(gfx::Vector2dF(0.f, 10.f), metadata.root_scroll_offset); } + // Root "overflow: hidden" properties should be reflected. + { + 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(); |