Commit c784a6f0 authored by bokan's avatar bokan Committed by Commit bot

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}
parent d11f8168
...@@ -1347,15 +1347,8 @@ void LayerImpl::SetScrollbarPosition(ScrollbarLayerImplBase* scrollbar_layer, ...@@ -1347,15 +1347,8 @@ void LayerImpl::SetScrollbarPosition(ScrollbarLayerImplBase* scrollbar_layer,
// scrolls that move the pinch virtual viewport (i.e. trigger from // scrolls that move the pinch virtual viewport (i.e. trigger from
// either inner or outer viewport). // either inner or outer viewport).
if (scrollbar_animation_controller_) { if (scrollbar_animation_controller_) {
// When both non-overlay and overlay scrollbars are both present, don't // Non-overlay scrollbars shouldn't trigger animations.
// animate the overlay scrollbars when page scale factor is at the min. if (scrollbar_layer->is_overlay_scrollbar())
// 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)
scrollbar_animation_controller_->DidScrollUpdate(on_resize); scrollbar_animation_controller_->DidScrollUpdate(on_resize);
} }
} }
......
...@@ -33,8 +33,10 @@ ScrollbarLayerImplBase::~ScrollbarLayerImplBase() {} ...@@ -33,8 +33,10 @@ ScrollbarLayerImplBase::~ScrollbarLayerImplBase() {}
void ScrollbarLayerImplBase::PushPropertiesTo(LayerImpl* layer) { void ScrollbarLayerImplBase::PushPropertiesTo(LayerImpl* layer) {
float active_opacity = layer->opacity(); float active_opacity = layer->opacity();
bool active_hidden = layer->hide_layer_and_subtree();
LayerImpl::PushPropertiesTo(layer); LayerImpl::PushPropertiesTo(layer);
layer->SetOpacity(active_opacity); layer->SetOpacity(active_opacity);
layer->SetHideLayerAndSubtree(active_hidden);
DCHECK(layer->ToScrollbarLayer()); DCHECK(layer->ToScrollbarLayer());
layer->ToScrollbarLayer()->set_is_overlay_scrollbar(is_overlay_scrollbar_); layer->ToScrollbarLayer()->set_is_overlay_scrollbar(is_overlay_scrollbar_);
PushScrollClipPropertiesTo(layer); PushScrollClipPropertiesTo(layer);
......
...@@ -395,6 +395,29 @@ void LayerTreeImpl::DidUpdatePageScale() { ...@@ -395,6 +395,29 @@ void LayerTreeImpl::DidUpdatePageScale() {
} }
ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer()); 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() { SyncedProperty<ScaleGroup>* LayerTreeImpl::page_scale_factor() {
...@@ -476,6 +499,8 @@ void LayerTreeImpl::SetViewportLayersFromIds( ...@@ -476,6 +499,8 @@ void LayerTreeImpl::SetViewportLayersFromIds(
DCHECK(outer_viewport_scroll_layer_ || DCHECK(outer_viewport_scroll_layer_ ||
outer_viewport_scroll_layer_id == Layer::INVALID_ID); outer_viewport_scroll_layer_id == Layer::INVALID_ID);
HideInnerViewportScrollbarsIfNearMinimumScale();
if (!root_layer_scroll_offset_delegate_) if (!root_layer_scroll_offset_delegate_)
return; return;
......
...@@ -343,6 +343,7 @@ class CC_EXPORT LayerTreeImpl { ...@@ -343,6 +343,7 @@ class CC_EXPORT LayerTreeImpl {
bool SetPageScaleFactorLimits(float min_page_scale_factor, bool SetPageScaleFactorLimits(float min_page_scale_factor,
float max_page_scale_factor); float max_page_scale_factor);
void DidUpdatePageScale(); void DidUpdatePageScale();
void HideInnerViewportScrollbarsIfNearMinimumScale();
LayerTreeHostImpl* layer_tree_host_impl_; LayerTreeHostImpl* layer_tree_host_impl_;
int source_frame_number_; int source_frame_number_;
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "cc/layers/heads_up_display_layer_impl.h" #include "cc/layers/heads_up_display_layer_impl.h"
#include "cc/layers/layer.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_impl_proxy.h"
#include "cc/test/fake_layer_tree_host_impl.h" #include "cc/test/fake_layer_tree_host_impl.h"
#include "cc/test/fake_output_surface.h" #include "cc/test/fake_output_surface.h"
...@@ -23,6 +24,7 @@ class LayerTreeImplTest : public LayerTreeHostCommonTest { ...@@ -23,6 +24,7 @@ class LayerTreeImplTest : public LayerTreeHostCommonTest {
LayerTreeImplTest() { LayerTreeImplTest() {
LayerTreeSettings settings; LayerTreeSettings settings;
settings.layer_transforms_should_scale_layer_contents = true; settings.layer_transforms_should_scale_layer_contents = true;
settings.scrollbar_show_scale_threshold = 1.1f;
host_impl_.reset( host_impl_.reset(
new FakeLayerTreeHostImpl(settings, &proxy_, &shared_bitmap_manager_)); new FakeLayerTreeHostImpl(settings, &proxy_, &shared_bitmap_manager_));
EXPECT_TRUE(host_impl_->InitializeRenderer(FakeOutputSurface::Create3d())); EXPECT_TRUE(host_impl_->InitializeRenderer(FakeOutputSurface::Create3d()));
...@@ -1371,6 +1373,73 @@ TEST_F(LayerTreeImplTest, ...@@ -1371,6 +1373,73 @@ TEST_F(LayerTreeImplTest,
EXPECT_FALSE(result_layer); 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, TEST_F(LayerTreeImplTest,
HitCheckingTouchHandlerRegionsForSinglePositionedLayer) { HitCheckingTouchHandlerRegionsForSinglePositionedLayer) {
scoped_ptr<LayerImpl> root = scoped_ptr<LayerImpl> root =
......
...@@ -35,6 +35,7 @@ LayerTreeSettings::LayerTreeSettings() ...@@ -35,6 +35,7 @@ LayerTreeSettings::LayerTreeSettings()
scrollbar_fade_delay_ms(0), scrollbar_fade_delay_ms(0),
scrollbar_fade_resize_delay_ms(0), scrollbar_fade_resize_delay_ms(0),
scrollbar_fade_duration_ms(0), scrollbar_fade_duration_ms(0),
scrollbar_show_scale_threshold(1.0f),
solid_color_scrollbar_color(SK_ColorWHITE), solid_color_scrollbar_color(SK_ColorWHITE),
calculate_top_controls_position(false), calculate_top_controls_position(false),
timeout_and_draw_when_animation_checkerboards(true), timeout_and_draw_when_animation_checkerboards(true),
......
...@@ -47,6 +47,7 @@ class CC_EXPORT LayerTreeSettings { ...@@ -47,6 +47,7 @@ class CC_EXPORT LayerTreeSettings {
int scrollbar_fade_delay_ms; int scrollbar_fade_delay_ms;
int scrollbar_fade_resize_delay_ms; int scrollbar_fade_resize_delay_ms;
int scrollbar_fade_duration_ms; int scrollbar_fade_duration_ms;
float scrollbar_show_scale_threshold;
SkColor solid_color_scrollbar_color; SkColor solid_color_scrollbar_color;
bool calculate_top_controls_position; bool calculate_top_controls_position;
bool timeout_and_draw_when_animation_checkerboards; bool timeout_and_draw_when_animation_checkerboards;
......
...@@ -403,6 +403,11 @@ void RenderWidgetCompositor::Initialize() { ...@@ -403,6 +403,11 @@ void RenderWidgetCompositor::Initialize() {
settings.scrollbar_fade_delay_ms = 500; settings.scrollbar_fade_delay_ms = 500;
settings.scrollbar_fade_resize_delay_ms = 500; settings.scrollbar_fade_resize_delay_ms = 500;
settings.scrollbar_fade_duration_ms = 300; 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 #endif
if (cmd->HasSwitch(switches::kEnableLowResTiling)) if (cmd->HasSwitch(switches::kEnableLowResTiling))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment