summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbokan <bokan@chromium.org>2015-01-27 20:11:50 -0800
committerCommit bot <commit-bot@chromium.org>2015-01-28 04:13:48 +0000
commitc784a6f02ed8f2cffe131c2c067c4805cd752610 (patch)
treec217d18d6d26c021f7558d0b84c48fc271aeb58f
parentd11f81682b5fb8dfe9bb237d5db0024fceea3e6f (diff)
downloadchromium_src-c784a6f02ed8f2cffe131c2c067c4805cd752610.zip
chromium_src-c784a6f02ed8f2cffe131c2c067c4805cd752610.tar.gz
chromium_src-c784a6f02ed8f2cffe131c2c067c4805cd752610.tar.bz2
Hide pinch viewport scrollbars when near minimum scale.
This patch prevents the overlay scrollbars from showing up when we're near the minimum scale. The threshold can be set per-platform; by default it's 0 so the scrollbars will be visible regardless of the scale. On Windows/Linux/CrOS we'd like to prevent the scrollbars from overlaying over the window scrollbars so we set a small non-0 threshold. BUG=446411 Review URL: https://codereview.chromium.org/877863002 Cr-Commit-Position: refs/heads/master@{#313431}
-rw-r--r--cc/layers/layer_impl.cc11
-rw-r--r--cc/layers/scrollbar_layer_impl_base.cc2
-rw-r--r--cc/trees/layer_tree_impl.cc25
-rw-r--r--cc/trees/layer_tree_impl.h1
-rw-r--r--cc/trees/layer_tree_impl_unittest.cc69
-rw-r--r--cc/trees/layer_tree_settings.cc1
-rw-r--r--cc/trees/layer_tree_settings.h1
-rw-r--r--content/renderer/gpu/render_widget_compositor.cc5
8 files changed, 106 insertions, 9 deletions
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index d099a63..661baca 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -1347,15 +1347,8 @@ void LayerImpl::SetScrollbarPosition(ScrollbarLayerImplBase* scrollbar_layer,
// scrolls that move the pinch virtual viewport (i.e. trigger from
// either inner or outer viewport).
if (scrollbar_animation_controller_) {
- // When both non-overlay and overlay scrollbars are both present, don't
- // animate the overlay scrollbars when page scale factor is at the min.
- // Non-overlay scrollbars also shouldn't trigger animations.
- bool is_animatable_scrollbar =
- scrollbar_layer->is_overlay_scrollbar() &&
- ((layer_tree_impl()->current_page_scale_factor() >
- layer_tree_impl()->min_page_scale_factor()) ||
- !layer_tree_impl()->settings().use_pinch_zoom_scrollbars);
- if (is_animatable_scrollbar)
+ // Non-overlay scrollbars shouldn't trigger animations.
+ if (scrollbar_layer->is_overlay_scrollbar())
scrollbar_animation_controller_->DidScrollUpdate(on_resize);
}
}
diff --git a/cc/layers/scrollbar_layer_impl_base.cc b/cc/layers/scrollbar_layer_impl_base.cc
index beac79f..35e716b 100644
--- a/cc/layers/scrollbar_layer_impl_base.cc
+++ b/cc/layers/scrollbar_layer_impl_base.cc
@@ -33,8 +33,10 @@ ScrollbarLayerImplBase::~ScrollbarLayerImplBase() {}
void ScrollbarLayerImplBase::PushPropertiesTo(LayerImpl* layer) {
float active_opacity = layer->opacity();
+ bool active_hidden = layer->hide_layer_and_subtree();
LayerImpl::PushPropertiesTo(layer);
layer->SetOpacity(active_opacity);
+ layer->SetHideLayerAndSubtree(active_hidden);
DCHECK(layer->ToScrollbarLayer());
layer->ToScrollbarLayer()->set_is_overlay_scrollbar(is_overlay_scrollbar_);
PushScrollClipPropertiesTo(layer);
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 041c5fe..54529b6 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -395,6 +395,29 @@ void LayerTreeImpl::DidUpdatePageScale() {
}
ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer());
+
+ HideInnerViewportScrollbarsIfNearMinimumScale();
+}
+
+void LayerTreeImpl::HideInnerViewportScrollbarsIfNearMinimumScale() {
+ if (!InnerViewportContainerLayer())
+ return;
+
+ LayerImpl::ScrollbarSet* scrollbars =
+ InnerViewportContainerLayer()->scrollbars();
+
+ if (!scrollbars)
+ return;
+
+ for (LayerImpl::ScrollbarSet::iterator it = scrollbars->begin();
+ it != scrollbars->end();
+ ++it) {
+ ScrollbarLayerImplBase* scrollbar = *it;
+ float minimum_scale_to_show_at =
+ min_page_scale_factor() * settings().scrollbar_show_scale_threshold;
+ scrollbar->SetHideLayerAndSubtree(
+ current_page_scale_factor() < minimum_scale_to_show_at);
+ }
}
SyncedProperty<ScaleGroup>* LayerTreeImpl::page_scale_factor() {
@@ -476,6 +499,8 @@ void LayerTreeImpl::SetViewportLayersFromIds(
DCHECK(outer_viewport_scroll_layer_ ||
outer_viewport_scroll_layer_id == Layer::INVALID_ID);
+ HideInnerViewportScrollbarsIfNearMinimumScale();
+
if (!root_layer_scroll_offset_delegate_)
return;
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index e68bbc3..3ad278b 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -343,6 +343,7 @@ class CC_EXPORT LayerTreeImpl {
bool SetPageScaleFactorLimits(float min_page_scale_factor,
float max_page_scale_factor);
void DidUpdatePageScale();
+ void HideInnerViewportScrollbarsIfNearMinimumScale();
LayerTreeHostImpl* layer_tree_host_impl_;
int source_frame_number_;
diff --git a/cc/trees/layer_tree_impl_unittest.cc b/cc/trees/layer_tree_impl_unittest.cc
index 2c5dd05..67f98e65 100644
--- a/cc/trees/layer_tree_impl_unittest.cc
+++ b/cc/trees/layer_tree_impl_unittest.cc
@@ -6,6 +6,7 @@
#include "cc/layers/heads_up_display_layer_impl.h"
#include "cc/layers/layer.h"
+#include "cc/layers/solid_color_scrollbar_layer_impl.h"
#include "cc/test/fake_impl_proxy.h"
#include "cc/test/fake_layer_tree_host_impl.h"
#include "cc/test/fake_output_surface.h"
@@ -23,6 +24,7 @@ class LayerTreeImplTest : public LayerTreeHostCommonTest {
LayerTreeImplTest() {
LayerTreeSettings settings;
settings.layer_transforms_should_scale_layer_contents = true;
+ settings.scrollbar_show_scale_threshold = 1.1f;
host_impl_.reset(
new FakeLayerTreeHostImpl(settings, &proxy_, &shared_bitmap_manager_));
EXPECT_TRUE(host_impl_->InitializeRenderer(FakeOutputSurface::Create3d()));
@@ -1371,6 +1373,73 @@ TEST_F(LayerTreeImplTest,
EXPECT_FALSE(result_layer);
}
+TEST_F(LayerTreeImplTest, MakeScrollbarsInvisibleNearMinPageScale) {
+ const int kThumbThickness = 10;
+ const int kTrackStart = 0;
+ const bool kIsLeftSideVerticalScrollbar = false;
+ const bool kIsOverlayScrollbar = true;
+
+ LayerTreeImpl* active_tree = host_impl().active_tree();
+
+ scoped_ptr<LayerImpl> scroll_layer = LayerImpl::Create(active_tree, 1);
+ scoped_ptr<SolidColorScrollbarLayerImpl> vertical_scrollbar_layer =
+ SolidColorScrollbarLayerImpl::Create(active_tree,
+ 2,
+ VERTICAL,
+ kThumbThickness,
+ kTrackStart,
+ kIsLeftSideVerticalScrollbar,
+ kIsOverlayScrollbar);
+ scoped_ptr<SolidColorScrollbarLayerImpl> horizontal_scrollbar_layer =
+ SolidColorScrollbarLayerImpl::Create(active_tree,
+ 3,
+ HORIZONTAL,
+ kThumbThickness,
+ kTrackStart,
+ kIsLeftSideVerticalScrollbar,
+ kIsOverlayScrollbar);
+
+ scoped_ptr<LayerImpl> clip_layer = LayerImpl::Create(active_tree, 4);
+ scoped_ptr<LayerImpl> page_scale_layer = LayerImpl::Create(active_tree, 5);
+
+ scroll_layer->SetScrollClipLayer(clip_layer->id());
+
+ LayerImpl* scroll_layer_ptr = scroll_layer.get();
+ LayerImpl* page_scale_layer_ptr = page_scale_layer.get();
+
+ clip_layer->AddChild(page_scale_layer.Pass());
+ page_scale_layer_ptr->AddChild(scroll_layer.Pass());
+
+ vertical_scrollbar_layer->SetScrollLayerAndClipLayerByIds(
+ scroll_layer_ptr->id(),
+ clip_layer->id());
+ horizontal_scrollbar_layer->SetScrollLayerAndClipLayerByIds(
+ scroll_layer_ptr->id(),
+ clip_layer->id());
+
+ active_tree->PushPageScaleFromMainThread(1.0f, 1.0f, 4.0f);
+ active_tree->SetViewportLayersFromIds(
+ Layer::INVALID_ID, // Overscroll
+ page_scale_layer_ptr->id(),
+ scroll_layer_ptr->id(),
+ Layer::INVALID_ID); // Outer Scroll
+
+ EXPECT_TRUE(vertical_scrollbar_layer->hide_layer_and_subtree());
+ EXPECT_TRUE(horizontal_scrollbar_layer->hide_layer_and_subtree());
+
+ active_tree->PushPageScaleFromMainThread(1.05f, 1.0f, 4.0f);
+ EXPECT_TRUE(vertical_scrollbar_layer->hide_layer_and_subtree());
+ EXPECT_TRUE(horizontal_scrollbar_layer->hide_layer_and_subtree());
+
+ active_tree->PushPageScaleFromMainThread(1.1f, 1.0f, 4.0f);
+ EXPECT_FALSE(vertical_scrollbar_layer->hide_layer_and_subtree());
+ EXPECT_FALSE(horizontal_scrollbar_layer->hide_layer_and_subtree());
+
+ active_tree->PushPageScaleFromMainThread(1.5f, 1.0f, 4.0f);
+ EXPECT_FALSE(vertical_scrollbar_layer->hide_layer_and_subtree());
+ EXPECT_FALSE(horizontal_scrollbar_layer->hide_layer_and_subtree());
+}
+
TEST_F(LayerTreeImplTest,
HitCheckingTouchHandlerRegionsForSinglePositionedLayer) {
scoped_ptr<LayerImpl> root =
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc
index 2702d7a..d578daf 100644
--- a/cc/trees/layer_tree_settings.cc
+++ b/cc/trees/layer_tree_settings.cc
@@ -35,6 +35,7 @@ LayerTreeSettings::LayerTreeSettings()
scrollbar_fade_delay_ms(0),
scrollbar_fade_resize_delay_ms(0),
scrollbar_fade_duration_ms(0),
+ scrollbar_show_scale_threshold(1.0f),
solid_color_scrollbar_color(SK_ColorWHITE),
calculate_top_controls_position(false),
timeout_and_draw_when_animation_checkerboards(true),
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index 67e1c1d..597a279 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -47,6 +47,7 @@ class CC_EXPORT LayerTreeSettings {
int scrollbar_fade_delay_ms;
int scrollbar_fade_resize_delay_ms;
int scrollbar_fade_duration_ms;
+ float scrollbar_show_scale_threshold;
SkColor solid_color_scrollbar_color;
bool calculate_top_controls_position;
bool timeout_and_draw_when_animation_checkerboards;
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index c64a2a2..f623cb1 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -403,6 +403,11 @@ void RenderWidgetCompositor::Initialize() {
settings.scrollbar_fade_delay_ms = 500;
settings.scrollbar_fade_resize_delay_ms = 500;
settings.scrollbar_fade_duration_ms = 300;
+
+ // When pinching in, only show the pinch-viewport overlay scrollbars if the
+ // page scale is at least some threshold away from the minimum. i.e. don't
+ // show the pinch scrollbars when at minimum scale.
+ settings.scrollbar_show_scale_threshold = 1.05f;
#endif
if (cmd->HasSwitch(switches::kEnableLowResTiling))