summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorjdduke <jdduke@chromium.org>2015-02-11 22:28:20 -0800
committerCommit bot <commit-bot@chromium.org>2015-02-12 06:28:50 +0000
commit2afdbf72bcfa0a2e30d31a37ca6499dcb99a62aa (patch)
tree22e2334dc83b82ccb0f367e9bc2070615863437f /cc
parent55f1e5199dcc7363466ff424e2a1325c2fc9fa6f (diff)
downloadchromium_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.cc4
-rw-r--r--cc/output/compositor_frame_metadata.h2
-rw-r--r--cc/trees/layer_tree_host_impl.cc10
-rw-r--r--cc/trees/layer_tree_host_impl_unittest.cc20
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();