diff options
author | bokan <bokan@chromium.org> | 2015-01-27 20:11:50 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-28 04:13:48 +0000 |
commit | c784a6f02ed8f2cffe131c2c067c4805cd752610 (patch) | |
tree | c217d18d6d26c021f7558d0b84c48fc271aeb58f /cc/trees | |
parent | d11f81682b5fb8dfe9bb237d5db0024fceea3e6f (diff) | |
download | chromium_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}
Diffstat (limited to 'cc/trees')
-rw-r--r-- | cc/trees/layer_tree_impl.cc | 25 | ||||
-rw-r--r-- | cc/trees/layer_tree_impl.h | 1 | ||||
-rw-r--r-- | cc/trees/layer_tree_impl_unittest.cc | 69 | ||||
-rw-r--r-- | cc/trees/layer_tree_settings.cc | 1 | ||||
-rw-r--r-- | cc/trees/layer_tree_settings.h | 1 |
5 files changed, 97 insertions, 0 deletions
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; |