diff options
Diffstat (limited to 'cc')
-rw-r--r-- | cc/layers/layer_impl.cc | 11 | ||||
-rw-r--r-- | cc/layers/scrollbar_layer_impl_base.cc | 2 | ||||
-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 |
7 files changed, 101 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; |