1 // Copyright 2012 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.
5 #include "cc/animation/scrollbar_animation_controller_linear_fade.h"
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 "cc/test/test_shared_bitmap_manager.h"
11 #include "testing/gtest/include/gtest/gtest.h"
16 class ScrollbarAnimationControllerLinearFadeTest
: public testing::Test
{
18 ScrollbarAnimationControllerLinearFadeTest()
19 : host_impl_(&proxy_
, &shared_bitmap_manager_
) {}
22 virtual void SetUp() {
23 const int kThumbThickness
= 10;
24 const int kTrackStart
= 0;
25 const bool kIsLeftSideVerticalScrollbar
= false;
26 const bool kIsOverlayScrollbar
= true; // Allow opacity animations.
28 scoped_ptr
<LayerImpl
> scroll_layer
=
29 LayerImpl::Create(host_impl_
.active_tree(), 1);
31 SolidColorScrollbarLayerImpl::Create(host_impl_
.active_tree(),
36 kIsLeftSideVerticalScrollbar
,
38 clip_layer_
= LayerImpl::Create(host_impl_
.active_tree(), 3);
39 scroll_layer
->SetScrollClipLayer(clip_layer_
->id());
40 LayerImpl
* scroll_layer_ptr
= scroll_layer
.get();
41 clip_layer_
->AddChild(scroll_layer
.Pass());
43 scrollbar_layer_
->SetClipLayerById(clip_layer_
->id());
44 scrollbar_layer_
->SetScrollLayerById(scroll_layer_ptr
->id());
45 clip_layer_
->SetBounds(gfx::Size(100, 100));
46 scroll_layer_ptr
->SetBounds(gfx::Size(50, 50));
48 scrollbar_controller_
= ScrollbarAnimationControllerLinearFade::Create(
50 base::TimeDelta::FromSeconds(2),
51 base::TimeDelta::FromSeconds(3));
55 TestSharedBitmapManager shared_bitmap_manager_
;
56 FakeLayerTreeHostImpl host_impl_
;
57 scoped_ptr
<ScrollbarAnimationControllerLinearFade
> scrollbar_controller_
;
58 scoped_ptr
<LayerImpl
> clip_layer_
;
59 scoped_ptr
<SolidColorScrollbarLayerImpl
> scrollbar_layer_
;
62 TEST_F(ScrollbarAnimationControllerLinearFadeTest
, HiddenInBegin
) {
63 scrollbar_controller_
->Animate(base::TimeTicks());
64 EXPECT_FLOAT_EQ(0.0f
, scrollbar_layer_
->opacity());
67 TEST_F(ScrollbarAnimationControllerLinearFadeTest
,
68 HiddenAfterNonScrollingGesture
) {
69 scrollbar_controller_
->DidScrollGestureBegin();
70 EXPECT_FALSE(scrollbar_controller_
->IsAnimating());
71 EXPECT_FALSE(scrollbar_controller_
->Animate(base::TimeTicks()));
72 EXPECT_FLOAT_EQ(0.0f
, scrollbar_layer_
->opacity());
75 time
+= base::TimeDelta::FromSeconds(100);
76 EXPECT_FALSE(scrollbar_controller_
->Animate(time
));
77 EXPECT_FLOAT_EQ(0.0f
, scrollbar_layer_
->opacity());
78 scrollbar_controller_
->DidScrollGestureEnd(time
);
80 time
+= base::TimeDelta::FromSeconds(100);
81 EXPECT_FALSE(scrollbar_controller_
->IsAnimating());
82 EXPECT_FALSE(scrollbar_controller_
->Animate(time
));
83 EXPECT_FLOAT_EQ(0.0f
, scrollbar_layer_
->opacity());
86 TEST_F(ScrollbarAnimationControllerLinearFadeTest
, AwakenByScrollingGesture
) {
88 time
+= base::TimeDelta::FromSeconds(1);
89 scrollbar_controller_
->DidScrollGestureBegin();
90 scrollbar_controller_
->Animate(time
);
91 EXPECT_FALSE(scrollbar_controller_
->IsAnimating());
92 EXPECT_FLOAT_EQ(0.0f
, scrollbar_layer_
->opacity());
94 EXPECT_FALSE(scrollbar_controller_
->DidScrollUpdate(time
));
95 EXPECT_FALSE(scrollbar_controller_
->IsAnimating());
96 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
98 time
+= base::TimeDelta::FromSeconds(100);
99 scrollbar_controller_
->Animate(time
);
100 EXPECT_FALSE(scrollbar_controller_
->IsAnimating());
101 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
102 scrollbar_controller_
->DidScrollGestureEnd(time
);
104 EXPECT_TRUE(scrollbar_controller_
->IsAnimating());
105 EXPECT_EQ(2, scrollbar_controller_
->DelayBeforeStart(time
).InSeconds());
107 time
+= base::TimeDelta::FromSeconds(1);
108 scrollbar_controller_
->Animate(time
);
109 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
111 time
+= base::TimeDelta::FromSeconds(1);
112 scrollbar_controller_
->Animate(time
);
113 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
115 time
+= base::TimeDelta::FromSeconds(1);
116 scrollbar_controller_
->Animate(time
);
117 EXPECT_FLOAT_EQ(2.0f
/ 3.0f
, scrollbar_layer_
->opacity());
119 time
+= base::TimeDelta::FromSeconds(1);
120 scrollbar_controller_
->Animate(time
);
121 EXPECT_FLOAT_EQ(1.0f
/ 3.0f
, scrollbar_layer_
->opacity());
123 time
+= base::TimeDelta::FromSeconds(1);
125 scrollbar_controller_
->DidScrollGestureBegin();
126 EXPECT_FALSE(scrollbar_controller_
->DidScrollUpdate(time
));
127 scrollbar_controller_
->DidScrollGestureEnd(time
);
129 time
+= base::TimeDelta::FromSeconds(1);
130 scrollbar_controller_
->Animate(time
);
131 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
133 time
+= base::TimeDelta::FromSeconds(1);
134 scrollbar_controller_
->Animate(time
);
135 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
137 time
+= base::TimeDelta::FromSeconds(1);
138 scrollbar_controller_
->Animate(time
);
139 EXPECT_FLOAT_EQ(2.0f
/ 3.0f
, scrollbar_layer_
->opacity());
141 time
+= base::TimeDelta::FromSeconds(1);
142 scrollbar_controller_
->Animate(time
);
143 EXPECT_FLOAT_EQ(1.0f
/ 3.0f
, scrollbar_layer_
->opacity());
145 time
+= base::TimeDelta::FromSeconds(1);
146 scrollbar_controller_
->Animate(time
);
147 EXPECT_FLOAT_EQ(0.0f
, scrollbar_layer_
->opacity());
150 TEST_F(ScrollbarAnimationControllerLinearFadeTest
, AwakenByProgrammaticScroll
) {
151 base::TimeTicks time
;
152 time
+= base::TimeDelta::FromSeconds(1);
153 EXPECT_TRUE(scrollbar_controller_
->DidScrollUpdate(time
));
154 EXPECT_TRUE(scrollbar_controller_
->IsAnimating());
155 EXPECT_EQ(2, scrollbar_controller_
->DelayBeforeStart(time
).InSeconds());
156 scrollbar_controller_
->Animate(time
);
157 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
159 time
+= base::TimeDelta::FromSeconds(1);
160 scrollbar_controller_
->Animate(time
);
161 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
162 EXPECT_TRUE(scrollbar_controller_
->DidScrollUpdate(time
));
164 time
+= base::TimeDelta::FromSeconds(1);
165 scrollbar_controller_
->Animate(time
);
166 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
168 time
+= base::TimeDelta::FromSeconds(1);
169 scrollbar_controller_
->Animate(time
);
170 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
172 time
+= base::TimeDelta::FromSeconds(1);
173 scrollbar_controller_
->Animate(time
);
174 EXPECT_FLOAT_EQ(2.0f
/ 3.0f
, scrollbar_layer_
->opacity());
176 time
+= base::TimeDelta::FromSeconds(1);
177 scrollbar_controller_
->Animate(time
);
178 EXPECT_FLOAT_EQ(1.0f
/ 3.0f
, scrollbar_layer_
->opacity());
180 time
+= base::TimeDelta::FromSeconds(1);
181 EXPECT_TRUE(scrollbar_controller_
->DidScrollUpdate(time
));
182 time
+= base::TimeDelta::FromSeconds(1);
183 scrollbar_controller_
->Animate(time
);
184 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
186 time
+= base::TimeDelta::FromSeconds(1);
187 scrollbar_controller_
->Animate(time
);
188 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
190 time
+= base::TimeDelta::FromSeconds(1);
191 scrollbar_controller_
->Animate(time
);
192 EXPECT_FLOAT_EQ(2.0f
/ 3.0f
, scrollbar_layer_
->opacity());
194 time
+= base::TimeDelta::FromSeconds(1);
195 scrollbar_controller_
->Animate(time
);
196 EXPECT_FLOAT_EQ(1.0f
/ 3.0f
, scrollbar_layer_
->opacity());
198 time
+= base::TimeDelta::FromSeconds(1);
199 scrollbar_controller_
->Animate(time
);
200 EXPECT_FLOAT_EQ(0.0f
, scrollbar_layer_
->opacity());
203 TEST_F(ScrollbarAnimationControllerLinearFadeTest
,
204 AnimationPreservedByNonScrollingGesture
) {
205 base::TimeTicks time
;
206 time
+= base::TimeDelta::FromSeconds(1);
207 EXPECT_TRUE(scrollbar_controller_
->DidScrollUpdate(time
));
208 EXPECT_TRUE(scrollbar_controller_
->IsAnimating());
209 scrollbar_controller_
->Animate(time
);
210 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
212 time
+= base::TimeDelta::FromSeconds(3);
213 scrollbar_controller_
->Animate(time
);
214 EXPECT_FLOAT_EQ(2.0f
/ 3.0f
, scrollbar_layer_
->opacity());
216 scrollbar_controller_
->DidScrollGestureBegin();
217 EXPECT_TRUE(scrollbar_controller_
->IsAnimating());
218 EXPECT_FLOAT_EQ(2.0f
/ 3.0f
, scrollbar_layer_
->opacity());
220 time
+= base::TimeDelta::FromSeconds(1);
221 scrollbar_controller_
->Animate(time
);
222 EXPECT_FLOAT_EQ(1.0f
/ 3.0f
, scrollbar_layer_
->opacity());
224 scrollbar_controller_
->DidScrollGestureEnd(time
);
225 EXPECT_TRUE(scrollbar_controller_
->IsAnimating());
226 EXPECT_FLOAT_EQ(1.0f
/ 3.0f
, scrollbar_layer_
->opacity());
228 time
+= base::TimeDelta::FromSeconds(1);
229 EXPECT_FALSE(scrollbar_controller_
->Animate(time
));
230 EXPECT_FLOAT_EQ(0.0f
, scrollbar_layer_
->opacity());
233 TEST_F(ScrollbarAnimationControllerLinearFadeTest
,
234 AnimationOverriddenByScrollingGesture
) {
235 base::TimeTicks time
;
236 time
+= base::TimeDelta::FromSeconds(1);
237 EXPECT_TRUE(scrollbar_controller_
->DidScrollUpdate(time
));
238 EXPECT_TRUE(scrollbar_controller_
->IsAnimating());
239 scrollbar_controller_
->Animate(time
);
240 EXPECT_FLOAT_EQ(1.0f
, scrollbar_layer_
->opacity());
242 time
+= base::TimeDelta::FromSeconds(3);
243 scrollbar_controller_
->Animate(time
);
244 EXPECT_FLOAT_EQ(2.0f
/ 3.0f
, scrollbar_layer_
->opacity());
246 scrollbar_controller_
->DidScrollGestureBegin();
247 EXPECT_TRUE(scrollbar_controller_
->IsAnimating());
248 EXPECT_FLOAT_EQ(2.0f
/ 3.0f
, scrollbar_layer_
->opacity());
250 time
+= base::TimeDelta::FromSeconds(1);
251 scrollbar_controller_
->Animate(time
);
252 EXPECT_FLOAT_EQ(1.0f
/ 3.0f
, scrollbar_layer_
->opacity());
254 time
+= base::TimeDelta::FromSeconds(1);
255 EXPECT_FALSE(scrollbar_controller_
->DidScrollUpdate(time
));
256 EXPECT_FALSE(scrollbar_controller_
->IsAnimating());
257 EXPECT_FLOAT_EQ(1, scrollbar_layer_
->opacity());
259 time
+= base::TimeDelta::FromSeconds(1);
260 scrollbar_controller_
->DidScrollGestureEnd(time
);
261 EXPECT_TRUE(scrollbar_controller_
->IsAnimating());
262 EXPECT_FLOAT_EQ(1, scrollbar_layer_
->opacity());