scrollbar_animation_controller_thinning_unittest.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/animation/scrollbar_animation_controller_thinning.h"
6
7#include "cc/layers/solid_color_scrollbar_layer_impl.h"
8#include "cc/test/fake_impl_proxy.h"
9#include "cc/test/fake_layer_tree_host_impl.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12namespace cc {
13namespace {
14
15class ScrollbarAnimationControllerThinningTest : public testing::Test {
16 public:
17  ScrollbarAnimationControllerThinningTest() : host_impl_(&proxy_) {}
18
19 protected:
20  virtual void SetUp() {
21    scroll_layer_ = LayerImpl::Create(host_impl_.active_tree(), 1);
22    const int kId = 2;
23    const int kThumbThickness = 10;
24    const bool kIsLeftSideVerticalScrollbar = false;
25    scrollbar_layer_ = SolidColorScrollbarLayerImpl::Create(
26        host_impl_.active_tree(), kId, HORIZONTAL, kThumbThickness,
27        kIsLeftSideVerticalScrollbar);
28
29    scroll_layer_->SetMaxScrollOffset(gfx::Vector2d(50, 50));
30    scroll_layer_->SetBounds(gfx::Size(50, 50));
31    scroll_layer_->SetHorizontalScrollbarLayer(scrollbar_layer_.get());
32
33    scrollbar_controller_ = ScrollbarAnimationControllerThinning::CreateForTest(
34        scroll_layer_.get(),
35        base::TimeDelta::FromSeconds(2),
36        base::TimeDelta::FromSeconds(3));
37  }
38
39  FakeImplProxy proxy_;
40  FakeLayerTreeHostImpl host_impl_;
41  scoped_ptr<ScrollbarAnimationControllerThinning> scrollbar_controller_;
42  scoped_ptr<LayerImpl> scroll_layer_;
43  scoped_ptr<SolidColorScrollbarLayerImpl> scrollbar_layer_;
44};
45
46TEST_F(ScrollbarAnimationControllerThinningTest, Idle) {
47  scrollbar_controller_->Animate(base::TimeTicks());
48  EXPECT_FLOAT_EQ(0.7f, scrollbar_layer_->opacity());
49  EXPECT_FLOAT_EQ(0.4f, scrollbar_layer_->thumb_thickness_scale_factor());
50}
51
52TEST_F(ScrollbarAnimationControllerThinningTest, AwakenByScrollGesture) {
53  base::TimeTicks time;
54  time += base::TimeDelta::FromSeconds(1);
55  scrollbar_controller_->DidScrollGestureBegin();
56  EXPECT_FALSE(scrollbar_controller_->IsAnimating());
57  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
58  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
59
60  time += base::TimeDelta::FromSeconds(100);
61  scrollbar_controller_->Animate(time);
62  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
63  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
64  scrollbar_controller_->DidScrollGestureEnd(time);
65
66  EXPECT_TRUE(scrollbar_controller_->IsAnimating());
67  EXPECT_EQ(2, scrollbar_controller_->DelayBeforeStart(time).InSeconds());
68
69  time += base::TimeDelta::FromSeconds(1);
70  scrollbar_controller_->Animate(time);
71  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
72  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
73
74  time += base::TimeDelta::FromSeconds(1);
75  scrollbar_controller_->Animate(time);
76  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
77  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
78
79  time += base::TimeDelta::FromSeconds(1);
80  scrollbar_controller_->Animate(time);
81  EXPECT_FLOAT_EQ(0.9f, scrollbar_layer_->opacity());
82  EXPECT_FLOAT_EQ(0.8f, scrollbar_layer_->thumb_thickness_scale_factor());
83
84  time += base::TimeDelta::FromSeconds(1);
85  scrollbar_controller_->Animate(time);
86  EXPECT_FLOAT_EQ(0.8f, scrollbar_layer_->opacity());
87  EXPECT_FLOAT_EQ(0.6f, scrollbar_layer_->thumb_thickness_scale_factor());
88
89  time += base::TimeDelta::FromSeconds(1);
90
91  scrollbar_controller_->DidScrollGestureBegin();
92  scrollbar_controller_->DidScrollGestureEnd(time);
93
94  time += base::TimeDelta::FromSeconds(1);
95  scrollbar_controller_->Animate(time);
96  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
97  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
98
99  time += base::TimeDelta::FromSeconds(1);
100  scrollbar_controller_->Animate(time);
101  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
102  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
103
104  time += base::TimeDelta::FromSeconds(1);
105  scrollbar_controller_->Animate(time);
106  EXPECT_FLOAT_EQ(0.9f, scrollbar_layer_->opacity());
107  EXPECT_FLOAT_EQ(0.8f, scrollbar_layer_->thumb_thickness_scale_factor());
108
109  time += base::TimeDelta::FromSeconds(1);
110  scrollbar_controller_->Animate(time);
111  EXPECT_FLOAT_EQ(0.8f, scrollbar_layer_->opacity());
112  EXPECT_FLOAT_EQ(0.6f, scrollbar_layer_->thumb_thickness_scale_factor());
113
114  time += base::TimeDelta::FromSeconds(1);
115  scrollbar_controller_->Animate(time);
116  EXPECT_FLOAT_EQ(0.7f, scrollbar_layer_->opacity());
117  EXPECT_FLOAT_EQ(0.4f, scrollbar_layer_->thumb_thickness_scale_factor());
118}
119
120TEST_F(ScrollbarAnimationControllerThinningTest, AwakenByProgrammaticScroll) {
121  base::TimeTicks time;
122  time += base::TimeDelta::FromSeconds(1);
123  EXPECT_TRUE(scrollbar_controller_->DidScrollUpdate(time));
124  EXPECT_TRUE(scrollbar_controller_->IsAnimating());
125  EXPECT_EQ(2, scrollbar_controller_->DelayBeforeStart(time).InSeconds());
126  scrollbar_controller_->Animate(time);
127  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
128  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
129
130  time += base::TimeDelta::FromSeconds(1);
131  scrollbar_controller_->Animate(time);
132  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
133  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
134  EXPECT_TRUE(scrollbar_controller_->DidScrollUpdate(time));
135
136  time += base::TimeDelta::FromSeconds(1);
137  scrollbar_controller_->Animate(time);
138  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
139  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
140
141  time += base::TimeDelta::FromSeconds(1);
142  scrollbar_controller_->Animate(time);
143  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
144  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
145
146  time += base::TimeDelta::FromSeconds(1);
147  scrollbar_controller_->Animate(time);
148  EXPECT_FLOAT_EQ(0.9f, scrollbar_layer_->opacity());
149  EXPECT_FLOAT_EQ(0.8f, scrollbar_layer_->thumb_thickness_scale_factor());
150
151  time += base::TimeDelta::FromSeconds(1);
152  scrollbar_controller_->Animate(time);
153  EXPECT_FLOAT_EQ(0.8f, scrollbar_layer_->opacity());
154  EXPECT_FLOAT_EQ(0.6f, scrollbar_layer_->thumb_thickness_scale_factor());
155
156  time += base::TimeDelta::FromSeconds(1);
157  EXPECT_TRUE(scrollbar_controller_->DidScrollUpdate(time));
158  time += base::TimeDelta::FromSeconds(1);
159  scrollbar_controller_->Animate(time);
160  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
161  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
162
163  time += base::TimeDelta::FromSeconds(1);
164  scrollbar_controller_->Animate(time);
165  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
166  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
167
168  time += base::TimeDelta::FromSeconds(1);
169  scrollbar_controller_->Animate(time);
170  EXPECT_FLOAT_EQ(0.9f, scrollbar_layer_->opacity());
171  EXPECT_FLOAT_EQ(0.8f, scrollbar_layer_->thumb_thickness_scale_factor());
172
173  time += base::TimeDelta::FromSeconds(1);
174  scrollbar_controller_->Animate(time);
175  EXPECT_FLOAT_EQ(0.8f, scrollbar_layer_->opacity());
176  EXPECT_FLOAT_EQ(0.6f, scrollbar_layer_->thumb_thickness_scale_factor());
177
178  time += base::TimeDelta::FromSeconds(1);
179  scrollbar_controller_->Animate(time);
180  EXPECT_FLOAT_EQ(0.7f, scrollbar_layer_->opacity());
181  EXPECT_FLOAT_EQ(0.4f, scrollbar_layer_->thumb_thickness_scale_factor());
182}
183
184TEST_F(ScrollbarAnimationControllerThinningTest, MouseOverAndOut) {
185  base::TimeTicks time;
186  time += base::TimeDelta::FromSeconds(1);
187  EXPECT_TRUE(scrollbar_controller_->DidScrollUpdate(time));
188  EXPECT_TRUE(scrollbar_controller_->IsAnimating());
189  EXPECT_EQ(2, scrollbar_controller_->DelayBeforeStart(time).InSeconds());
190  scrollbar_controller_->Animate(time);
191  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
192  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
193
194  time += base::TimeDelta::FromSeconds(4);
195  scrollbar_controller_->Animate(time);
196  EXPECT_FLOAT_EQ(0.8f, scrollbar_layer_->opacity());
197  EXPECT_FLOAT_EQ(0.6f, scrollbar_layer_->thumb_thickness_scale_factor());
198
199  scrollbar_controller_->DidMouseMoveNear(time, 0);
200  scrollbar_controller_->Animate(time);
201  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
202  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
203
204  time += base::TimeDelta::FromSeconds(4);
205  scrollbar_controller_->Animate(time);
206  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
207  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
208
209  scrollbar_controller_->DidMouseMoveOffScrollbar(time);
210  scrollbar_controller_->Animate(time);
211  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
212  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->thumb_thickness_scale_factor());
213
214  time += base::TimeDelta::FromSeconds(4);
215  scrollbar_controller_->Animate(time);
216  EXPECT_FLOAT_EQ(0.8f, scrollbar_layer_->opacity());
217  EXPECT_FLOAT_EQ(0.6f, scrollbar_layer_->thumb_thickness_scale_factor());
218
219  time += base::TimeDelta::FromSeconds(1);
220  scrollbar_controller_->Animate(time);
221  EXPECT_FLOAT_EQ(0.7f, scrollbar_layer_->opacity());
222  EXPECT_FLOAT_EQ(0.4f, scrollbar_layer_->thumb_thickness_scale_factor());
223}
224
225}  // namespace
226}  // namespace cc
227