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.
5 #include "cc/input/top_controls_manager.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/time/time.h"
9 #include "cc/input/top_controls_manager_client.h"
10 #include "cc/layers/layer_impl.h"
11 #include "cc/test/fake_impl_proxy.h"
12 #include "cc/test/fake_layer_tree_host_impl.h"
13 #include "cc/test/test_shared_bitmap_manager.h"
14 #include "cc/trees/layer_tree_impl.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "ui/gfx/frame_time.h"
17 #include "ui/gfx/vector2d_f.h"
22 static const float kTopControlsHeight
= 100;
24 class MockTopControlsManagerClient
: public TopControlsManagerClient
{
26 MockTopControlsManagerClient(float top_controls_show_threshold
,
27 float top_controls_hide_threshold
)
28 : host_impl_(&proxy_
, &shared_bitmap_manager_
),
29 redraw_needed_(false),
30 update_draw_properties_needed_(false),
31 top_controls_top_offset_(0.f
),
32 top_controls_show_threshold_(top_controls_show_threshold
),
33 top_controls_hide_threshold_(top_controls_hide_threshold
) {
34 active_tree_
= LayerTreeImpl::create(&host_impl_
);
35 root_scroll_layer_
= LayerImpl::Create(active_tree_
.get(), 1);
38 virtual ~MockTopControlsManagerClient() {}
40 virtual void DidChangeTopControlsPosition() OVERRIDE
{
41 redraw_needed_
= true;
42 update_draw_properties_needed_
= true;
45 virtual bool HaveRootScrollLayer() const OVERRIDE
{
49 virtual void SetControlsTopOffset(float offset
) OVERRIDE
{
50 top_controls_top_offset_
= offset
;
53 virtual float ControlsTopOffset() const OVERRIDE
{
54 return top_controls_top_offset_
;
57 LayerImpl
* rootScrollLayer() {
58 return root_scroll_layer_
.get();
61 TopControlsManager
* manager() {
63 manager_
= TopControlsManager::Create(this,
65 top_controls_show_threshold_
,
66 top_controls_hide_threshold_
);
68 return manager_
.get();
73 TestSharedBitmapManager shared_bitmap_manager_
;
74 FakeLayerTreeHostImpl host_impl_
;
75 scoped_ptr
<LayerTreeImpl
> active_tree_
;
76 scoped_ptr
<LayerImpl
> root_scroll_layer_
;
77 scoped_ptr
<TopControlsManager
> manager_
;
79 bool update_draw_properties_needed_
;
81 float top_controls_top_offset_
;
82 float top_controls_show_threshold_
;
83 float top_controls_hide_threshold_
;
86 TEST(TopControlsManagerTest
, EnsureScrollThresholdApplied
) {
87 MockTopControlsManagerClient
client(0.5f
, 0.5f
);
88 TopControlsManager
* manager
= client
.manager();
90 manager
->ScrollBegin();
92 // Scroll down to hide the controls entirely.
93 manager
->ScrollBy(gfx::Vector2dF(0.f
, 30.f
));
94 EXPECT_EQ(-30.f
, manager
->ControlsTopOffset());
96 manager
->ScrollBy(gfx::Vector2dF(0.f
, 30.f
));
97 EXPECT_EQ(-60.f
, manager
->ControlsTopOffset());
99 manager
->ScrollBy(gfx::Vector2dF(0.f
, 100.f
));
100 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
102 // Scroll back up a bit and ensure the controls don't move until we cross
104 manager
->ScrollBy(gfx::Vector2dF(0.f
, -10.f
));
105 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
107 manager
->ScrollBy(gfx::Vector2dF(0.f
, -50.f
));
108 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
110 // After hitting the threshold, further scrolling up should result in the top
112 manager
->ScrollBy(gfx::Vector2dF(0.f
, -10.f
));
113 EXPECT_EQ(-90.f
, manager
->ControlsTopOffset());
115 manager
->ScrollBy(gfx::Vector2dF(0.f
, -50.f
));
116 EXPECT_EQ(-40.f
, manager
->ControlsTopOffset());
118 // Reset the scroll threshold by going further up the page than the initial
120 manager
->ScrollBy(gfx::Vector2dF(0.f
, -100.f
));
121 EXPECT_EQ(0.f
, manager
->ControlsTopOffset());
123 // See that scrolling down the page now will result in the controls hiding.
124 manager
->ScrollBy(gfx::Vector2dF(0.f
, 20.f
));
125 EXPECT_EQ(-20.f
, manager
->ControlsTopOffset());
127 manager
->ScrollEnd();
130 TEST(TopControlsManagerTest
, PartialShownHideAnimation
) {
131 MockTopControlsManagerClient
client(0.5f
, 0.5f
);
132 TopControlsManager
* manager
= client
.manager();
133 manager
->ScrollBegin();
134 manager
->ScrollBy(gfx::Vector2dF(0.f
, 300.f
));
135 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
136 EXPECT_EQ(0.f
, manager
->ContentTopOffset());
137 manager
->ScrollEnd();
139 manager
->ScrollBegin();
140 manager
->ScrollBy(gfx::Vector2dF(0.f
, -15.f
));
141 EXPECT_EQ(-85.f
, manager
->ControlsTopOffset());
142 EXPECT_EQ(15.f
, manager
->ContentTopOffset());
143 manager
->ScrollEnd();
145 EXPECT_TRUE(manager
->animation());
147 base::TimeTicks time
= gfx::FrameTime::Now();
148 float previous_offset
= manager
->ControlsTopOffset();
149 while (manager
->animation()) {
150 time
= base::TimeDelta::FromMicroseconds(100) + time
;
151 manager
->Animate(time
);
152 EXPECT_LT(manager
->ControlsTopOffset(), previous_offset
);
153 previous_offset
= manager
->ControlsTopOffset();
155 EXPECT_FALSE(manager
->animation());
156 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
157 EXPECT_EQ(0.f
, manager
->ContentTopOffset());
160 TEST(TopControlsManagerTest
, PartialShownShowAnimation
) {
161 MockTopControlsManagerClient
client(0.5f
, 0.5f
);
162 TopControlsManager
* manager
= client
.manager();
163 manager
->ScrollBegin();
164 manager
->ScrollBy(gfx::Vector2dF(0.f
, 300.f
));
165 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
166 EXPECT_EQ(0.f
, manager
->ContentTopOffset());
167 manager
->ScrollEnd();
169 manager
->ScrollBegin();
170 manager
->ScrollBy(gfx::Vector2dF(0.f
, -70.f
));
171 EXPECT_EQ(-30.f
, manager
->ControlsTopOffset());
172 EXPECT_EQ(70.f
, manager
->ContentTopOffset());
173 manager
->ScrollEnd();
175 EXPECT_TRUE(manager
->animation());
177 base::TimeTicks time
= gfx::FrameTime::Now();
178 float previous_offset
= manager
->ControlsTopOffset();
179 while (manager
->animation()) {
180 time
= base::TimeDelta::FromMicroseconds(100) + time
;
181 manager
->Animate(time
);
182 EXPECT_GT(manager
->ControlsTopOffset(), previous_offset
);
183 previous_offset
= manager
->ControlsTopOffset();
185 EXPECT_FALSE(manager
->animation());
186 EXPECT_EQ(0.f
, manager
->ControlsTopOffset());
187 EXPECT_EQ(100.f
, manager
->ContentTopOffset());
190 TEST(TopControlsManagerTest
, PartialHiddenWithAmbiguousThresholdShows
) {
191 MockTopControlsManagerClient
client(0.25f
, 0.25f
);
192 TopControlsManager
* manager
= client
.manager();
194 manager
->ScrollBegin();
196 manager
->ScrollBy(gfx::Vector2dF(0.f
, 20.f
));
197 EXPECT_EQ(-20.f
, manager
->ControlsTopOffset());
198 EXPECT_EQ(80.f
, manager
->ContentTopOffset());
200 manager
->ScrollEnd();
201 EXPECT_TRUE(manager
->animation());
203 base::TimeTicks time
= gfx::FrameTime::Now();
204 float previous_offset
= manager
->ControlsTopOffset();
205 while (manager
->animation()) {
206 time
= base::TimeDelta::FromMicroseconds(100) + time
;
207 manager
->Animate(time
);
208 EXPECT_GT(manager
->ControlsTopOffset(), previous_offset
);
209 previous_offset
= manager
->ControlsTopOffset();
211 EXPECT_FALSE(manager
->animation());
212 EXPECT_EQ(0.f
, manager
->ControlsTopOffset());
213 EXPECT_EQ(100.f
, manager
->ContentTopOffset());
216 TEST(TopControlsManagerTest
, PartialHiddenWithAmbiguousThresholdHides
) {
217 MockTopControlsManagerClient
client(0.25f
, 0.25f
);
218 TopControlsManager
* manager
= client
.manager();
220 manager
->ScrollBegin();
222 manager
->ScrollBy(gfx::Vector2dF(0.f
, 30.f
));
223 EXPECT_EQ(-30.f
, manager
->ControlsTopOffset());
224 EXPECT_EQ(70.f
, manager
->ContentTopOffset());
226 manager
->ScrollEnd();
227 EXPECT_TRUE(manager
->animation());
229 base::TimeTicks time
= gfx::FrameTime::Now();
230 float previous_offset
= manager
->ControlsTopOffset();
231 while (manager
->animation()) {
232 time
= base::TimeDelta::FromMicroseconds(100) + time
;
233 manager
->Animate(time
);
234 EXPECT_LT(manager
->ControlsTopOffset(), previous_offset
);
235 previous_offset
= manager
->ControlsTopOffset();
237 EXPECT_FALSE(manager
->animation());
238 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
239 EXPECT_EQ(0.f
, manager
->ContentTopOffset());
242 TEST(TopControlsManagerTest
, PartialShownWithAmbiguousThresholdHides
) {
243 MockTopControlsManagerClient
client(0.25f
, 0.25f
);
244 TopControlsManager
* manager
= client
.manager();
246 manager
->ScrollBy(gfx::Vector2dF(0.f
, 200.f
));
247 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
248 EXPECT_EQ(0.f
, manager
->ContentTopOffset());
250 manager
->ScrollBegin();
252 manager
->ScrollBy(gfx::Vector2dF(0.f
, -20.f
));
253 EXPECT_EQ(-80.f
, manager
->ControlsTopOffset());
254 EXPECT_EQ(20.f
, manager
->ContentTopOffset());
256 manager
->ScrollEnd();
257 EXPECT_TRUE(manager
->animation());
259 base::TimeTicks time
= gfx::FrameTime::Now();
260 float previous_offset
= manager
->ControlsTopOffset();
261 while (manager
->animation()) {
262 time
= base::TimeDelta::FromMicroseconds(100) + time
;
263 manager
->Animate(time
);
264 EXPECT_LT(manager
->ControlsTopOffset(), previous_offset
);
265 previous_offset
= manager
->ControlsTopOffset();
267 EXPECT_FALSE(manager
->animation());
268 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
269 EXPECT_EQ(0.f
, manager
->ContentTopOffset());
272 TEST(TopControlsManagerTest
, PartialShownWithAmbiguousThresholdShows
) {
273 MockTopControlsManagerClient
client(0.25f
, 0.25f
);
274 TopControlsManager
* manager
= client
.manager();
276 manager
->ScrollBy(gfx::Vector2dF(0.f
, 200.f
));
277 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
278 EXPECT_EQ(0.f
, manager
->ContentTopOffset());
280 manager
->ScrollBegin();
282 manager
->ScrollBy(gfx::Vector2dF(0.f
, -30.f
));
283 EXPECT_EQ(-70.f
, manager
->ControlsTopOffset());
284 EXPECT_EQ(30.f
, manager
->ContentTopOffset());
286 manager
->ScrollEnd();
287 EXPECT_TRUE(manager
->animation());
289 base::TimeTicks time
= gfx::FrameTime::Now();
290 float previous_offset
= manager
->ControlsTopOffset();
291 while (manager
->animation()) {
292 time
= base::TimeDelta::FromMicroseconds(100) + time
;
293 manager
->Animate(time
);
294 EXPECT_GT(manager
->ControlsTopOffset(), previous_offset
);
295 previous_offset
= manager
->ControlsTopOffset();
297 EXPECT_FALSE(manager
->animation());
298 EXPECT_EQ(0.f
, manager
->ControlsTopOffset());
299 EXPECT_EQ(100.f
, manager
->ContentTopOffset());
302 TEST(TopControlsManagerTest
, PinchIgnoresScroll
) {
303 MockTopControlsManagerClient
client(0.5f
, 0.5f
);
304 TopControlsManager
* manager
= client
.manager();
306 // Hide the controls.
307 manager
->ScrollBegin();
308 EXPECT_EQ(0.f
, manager
->ControlsTopOffset());
310 manager
->ScrollBy(gfx::Vector2dF(0.f
, 300.f
));
311 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
313 manager
->PinchBegin();
314 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
316 // Scrolls are ignored during pinch.
317 manager
->ScrollBy(gfx::Vector2dF(0.f
, -15.f
));
318 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
320 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
322 // Scrolls should no long be ignored.
323 manager
->ScrollBy(gfx::Vector2dF(0.f
, -15.f
));
324 EXPECT_EQ(-85.f
, manager
->ControlsTopOffset());
325 EXPECT_EQ(15.f
, manager
->ContentTopOffset());
326 manager
->ScrollEnd();
328 EXPECT_TRUE(manager
->animation());
331 TEST(TopControlsManagerTest
, PinchBeginStartsAnimationIfNecessary
) {
332 MockTopControlsManagerClient
client(0.5f
, 0.5f
);
333 TopControlsManager
* manager
= client
.manager();
335 manager
->ScrollBegin();
336 manager
->ScrollBy(gfx::Vector2dF(0.f
, 300.f
));
337 EXPECT_EQ(-100.f
, manager
->ControlsTopOffset());
339 manager
->PinchBegin();
340 EXPECT_FALSE(manager
->animation());
343 EXPECT_FALSE(manager
->animation());
345 manager
->ScrollBy(gfx::Vector2dF(0.f
, -15.f
));
346 EXPECT_EQ(-85.f
, manager
->ControlsTopOffset());
347 EXPECT_EQ(15.f
, manager
->ContentTopOffset());
349 manager
->PinchBegin();
350 EXPECT_TRUE(manager
->animation());
352 base::TimeTicks time
= base::TimeTicks::Now();
353 float previous_offset
= manager
->ControlsTopOffset();
354 while (manager
->animation()) {
355 time
= base::TimeDelta::FromMicroseconds(100) + time
;
356 manager
->Animate(time
);
357 EXPECT_LT(manager
->ControlsTopOffset(), previous_offset
);
358 previous_offset
= manager
->ControlsTopOffset();
360 EXPECT_FALSE(manager
->animation());
363 EXPECT_FALSE(manager
->animation());
365 manager
->ScrollBy(gfx::Vector2dF(0.f
, -55.f
));
366 EXPECT_EQ(-45.f
, manager
->ControlsTopOffset());
367 EXPECT_EQ(55.f
, manager
->ContentTopOffset());
368 EXPECT_FALSE(manager
->animation());
370 manager
->ScrollEnd();
371 EXPECT_TRUE(manager
->animation());
373 time
= base::TimeTicks::Now();
374 previous_offset
= manager
->ControlsTopOffset();
375 while (manager
->animation()) {
376 time
= base::TimeDelta::FromMicroseconds(100) + time
;
377 manager
->Animate(time
);
378 EXPECT_GT(manager
->ControlsTopOffset(), previous_offset
);
379 previous_offset
= manager
->ControlsTopOffset();
381 EXPECT_FALSE(manager
->animation());
382 EXPECT_EQ(0.f
, manager
->ControlsTopOffset());