OLD | NEW |
| (Empty) |
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/input/top_controls_manager.h" | |
6 | |
7 #include <algorithm> | |
8 #include <cmath> | |
9 #include <memory> | |
10 | |
11 #include "base/logging.h" | |
12 #include "base/time/time.h" | |
13 #include "cc/input/top_controls_manager_client.h" | |
14 #include "cc/layers/layer_impl.h" | |
15 #include "cc/test/fake_impl_task_runner_provider.h" | |
16 #include "cc/test/fake_layer_tree_host_impl.h" | |
17 #include "cc/test/test_shared_bitmap_manager.h" | |
18 #include "cc/test/test_task_graph_runner.h" | |
19 #include "cc/trees/layer_tree_impl.h" | |
20 #include "testing/gtest/include/gtest/gtest.h" | |
21 #include "ui/gfx/geometry/vector2d_f.h" | |
22 | |
23 namespace cc { | |
24 namespace { | |
25 | |
26 class MockTopControlsManagerClient : public TopControlsManagerClient { | |
27 public: | |
28 MockTopControlsManagerClient(float top_controls_height, | |
29 float top_controls_show_threshold, | |
30 float top_controls_hide_threshold) | |
31 : host_impl_(&task_runner_provider_, | |
32 &shared_bitmap_manager_, | |
33 &task_graph_runner_), | |
34 redraw_needed_(false), | |
35 update_draw_properties_needed_(false), | |
36 bottom_controls_height_(0.f), | |
37 top_controls_shown_ratio_(1.f), | |
38 top_controls_height_(top_controls_height), | |
39 top_controls_show_threshold_(top_controls_show_threshold), | |
40 top_controls_hide_threshold_(top_controls_hide_threshold) { | |
41 active_tree_ = base::MakeUnique<LayerTreeImpl>( | |
42 &host_impl_, new SyncedProperty<ScaleGroup>, new SyncedTopControls, | |
43 new SyncedElasticOverscroll); | |
44 root_scroll_layer_ = LayerImpl::Create(active_tree_.get(), 1); | |
45 } | |
46 | |
47 ~MockTopControlsManagerClient() override {} | |
48 | |
49 void DidChangeTopControlsPosition() override { | |
50 redraw_needed_ = true; | |
51 update_draw_properties_needed_ = true; | |
52 } | |
53 | |
54 bool HaveRootScrollLayer() const override { return true; } | |
55 | |
56 float BottomControlsHeight() const override { | |
57 return bottom_controls_height_; | |
58 } | |
59 | |
60 float TopControlsHeight() const override { return top_controls_height_; } | |
61 | |
62 void SetCurrentTopControlsShownRatio(float ratio) override { | |
63 ASSERT_FALSE(std::isnan(ratio)); | |
64 ASSERT_FALSE(ratio == std::numeric_limits<float>::infinity()); | |
65 ASSERT_FALSE(ratio == -std::numeric_limits<float>::infinity()); | |
66 ratio = std::max(ratio, 0.f); | |
67 ratio = std::min(ratio, 1.f); | |
68 top_controls_shown_ratio_ = ratio; | |
69 } | |
70 | |
71 float CurrentTopControlsShownRatio() const override { | |
72 return top_controls_shown_ratio_; | |
73 } | |
74 | |
75 LayerImpl* rootScrollLayer() { | |
76 return root_scroll_layer_.get(); | |
77 } | |
78 | |
79 TopControlsManager* manager() { | |
80 if (!manager_) { | |
81 manager_ = TopControlsManager::Create(this, | |
82 top_controls_show_threshold_, | |
83 top_controls_hide_threshold_); | |
84 } | |
85 return manager_.get(); | |
86 } | |
87 | |
88 void SetTopControlsHeight(float height) { top_controls_height_ = height; } | |
89 | |
90 void SetBottomControlsHeight(float height) { | |
91 bottom_controls_height_ = height; | |
92 } | |
93 | |
94 private: | |
95 FakeImplTaskRunnerProvider task_runner_provider_; | |
96 TestSharedBitmapManager shared_bitmap_manager_; | |
97 TestTaskGraphRunner task_graph_runner_; | |
98 FakeLayerTreeHostImpl host_impl_; | |
99 std::unique_ptr<LayerTreeImpl> active_tree_; | |
100 std::unique_ptr<LayerImpl> root_scroll_layer_; | |
101 std::unique_ptr<TopControlsManager> manager_; | |
102 bool redraw_needed_; | |
103 bool update_draw_properties_needed_; | |
104 | |
105 float bottom_controls_height_; | |
106 float top_controls_shown_ratio_; | |
107 float top_controls_height_; | |
108 float top_controls_show_threshold_; | |
109 float top_controls_hide_threshold_; | |
110 }; | |
111 | |
112 TEST(TopControlsManagerTest, EnsureScrollThresholdApplied) { | |
113 MockTopControlsManagerClient client(100.f, 0.5f, 0.5f); | |
114 TopControlsManager* manager = client.manager(); | |
115 | |
116 manager->ScrollBegin(); | |
117 | |
118 // Scroll down to hide the controls entirely. | |
119 manager->ScrollBy(gfx::Vector2dF(0.f, 30.f)); | |
120 EXPECT_FLOAT_EQ(-30.f, manager->ControlsTopOffset()); | |
121 | |
122 manager->ScrollBy(gfx::Vector2dF(0.f, 30.f)); | |
123 EXPECT_FLOAT_EQ(-60.f, manager->ControlsTopOffset()); | |
124 | |
125 manager->ScrollBy(gfx::Vector2dF(0.f, 100.f)); | |
126 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
127 | |
128 // Scroll back up a bit and ensure the controls don't move until we cross | |
129 // the threshold. | |
130 manager->ScrollBy(gfx::Vector2dF(0.f, -10.f)); | |
131 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
132 | |
133 manager->ScrollBy(gfx::Vector2dF(0.f, -50.f)); | |
134 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
135 | |
136 // After hitting the threshold, further scrolling up should result in the top | |
137 // controls showing. | |
138 manager->ScrollBy(gfx::Vector2dF(0.f, -10.f)); | |
139 EXPECT_FLOAT_EQ(-90.f, manager->ControlsTopOffset()); | |
140 | |
141 manager->ScrollBy(gfx::Vector2dF(0.f, -50.f)); | |
142 EXPECT_FLOAT_EQ(-40.f, manager->ControlsTopOffset()); | |
143 | |
144 // Reset the scroll threshold by going further up the page than the initial | |
145 // threshold. | |
146 manager->ScrollBy(gfx::Vector2dF(0.f, -100.f)); | |
147 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset()); | |
148 | |
149 // See that scrolling down the page now will result in the controls hiding. | |
150 manager->ScrollBy(gfx::Vector2dF(0.f, 20.f)); | |
151 EXPECT_FLOAT_EQ(-20.f, manager->ControlsTopOffset()); | |
152 | |
153 manager->ScrollEnd(); | |
154 } | |
155 | |
156 TEST(TopControlsManagerTest, PartialShownHideAnimation) { | |
157 MockTopControlsManagerClient client(100.f, 0.5f, 0.5f); | |
158 TopControlsManager* manager = client.manager(); | |
159 manager->ScrollBegin(); | |
160 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f)); | |
161 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
162 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset()); | |
163 manager->ScrollEnd(); | |
164 | |
165 manager->ScrollBegin(); | |
166 manager->ScrollBy(gfx::Vector2dF(0.f, -15.f)); | |
167 EXPECT_FLOAT_EQ(-85.f, manager->ControlsTopOffset()); | |
168 EXPECT_FLOAT_EQ(15.f, manager->ContentTopOffset()); | |
169 manager->ScrollEnd(); | |
170 | |
171 EXPECT_TRUE(manager->has_animation()); | |
172 | |
173 base::TimeTicks time = base::TimeTicks::Now(); | |
174 float previous; | |
175 while (manager->has_animation()) { | |
176 previous = manager->TopControlsShownRatio(); | |
177 time = base::TimeDelta::FromMicroseconds(100) + time; | |
178 manager->Animate(time); | |
179 EXPECT_LT(manager->TopControlsShownRatio(), previous); | |
180 } | |
181 EXPECT_FALSE(manager->has_animation()); | |
182 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
183 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset()); | |
184 } | |
185 | |
186 TEST(TopControlsManagerTest, PartialShownShowAnimation) { | |
187 MockTopControlsManagerClient client(100.f, 0.5f, 0.5f); | |
188 TopControlsManager* manager = client.manager(); | |
189 manager->ScrollBegin(); | |
190 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f)); | |
191 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
192 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset()); | |
193 manager->ScrollEnd(); | |
194 | |
195 manager->ScrollBegin(); | |
196 manager->ScrollBy(gfx::Vector2dF(0.f, -70.f)); | |
197 EXPECT_FLOAT_EQ(-30.f, manager->ControlsTopOffset()); | |
198 EXPECT_FLOAT_EQ(70.f, manager->ContentTopOffset()); | |
199 manager->ScrollEnd(); | |
200 | |
201 EXPECT_TRUE(manager->has_animation()); | |
202 | |
203 base::TimeTicks time = base::TimeTicks::Now(); | |
204 float previous; | |
205 while (manager->has_animation()) { | |
206 previous = manager->TopControlsShownRatio(); | |
207 time = base::TimeDelta::FromMicroseconds(100) + time; | |
208 manager->Animate(time); | |
209 EXPECT_GT(manager->TopControlsShownRatio(), previous); | |
210 } | |
211 EXPECT_FALSE(manager->has_animation()); | |
212 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset()); | |
213 EXPECT_FLOAT_EQ(100.f, manager->ContentTopOffset()); | |
214 } | |
215 | |
216 TEST(TopControlsManagerTest, PartialHiddenWithAmbiguousThresholdShows) { | |
217 MockTopControlsManagerClient client(100.f, 0.25f, 0.25f); | |
218 TopControlsManager* manager = client.manager(); | |
219 | |
220 manager->ScrollBegin(); | |
221 | |
222 manager->ScrollBy(gfx::Vector2dF(0.f, 20.f)); | |
223 EXPECT_FLOAT_EQ(-20.f, manager->ControlsTopOffset()); | |
224 EXPECT_FLOAT_EQ(80.f, manager->ContentTopOffset()); | |
225 | |
226 manager->ScrollEnd(); | |
227 EXPECT_TRUE(manager->has_animation()); | |
228 | |
229 base::TimeTicks time = base::TimeTicks::Now(); | |
230 float previous; | |
231 while (manager->has_animation()) { | |
232 previous = manager->TopControlsShownRatio(); | |
233 time = base::TimeDelta::FromMicroseconds(100) + time; | |
234 manager->Animate(time); | |
235 EXPECT_GT(manager->TopControlsShownRatio(), previous); | |
236 } | |
237 EXPECT_FALSE(manager->has_animation()); | |
238 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset()); | |
239 EXPECT_FLOAT_EQ(100.f, manager->ContentTopOffset()); | |
240 } | |
241 | |
242 TEST(TopControlsManagerTest, PartialHiddenWithAmbiguousThresholdHides) { | |
243 MockTopControlsManagerClient client(100.f, 0.25f, 0.25f); | |
244 TopControlsManager* manager = client.manager(); | |
245 | |
246 manager->ScrollBegin(); | |
247 | |
248 manager->ScrollBy(gfx::Vector2dF(0.f, 30.f)); | |
249 EXPECT_FLOAT_EQ(-30.f, manager->ControlsTopOffset()); | |
250 EXPECT_FLOAT_EQ(70.f, manager->ContentTopOffset()); | |
251 | |
252 manager->ScrollEnd(); | |
253 EXPECT_TRUE(manager->has_animation()); | |
254 | |
255 base::TimeTicks time = base::TimeTicks::Now(); | |
256 float previous; | |
257 while (manager->has_animation()) { | |
258 previous = manager->TopControlsShownRatio(); | |
259 time = base::TimeDelta::FromMicroseconds(100) + time; | |
260 manager->Animate(time); | |
261 EXPECT_LT(manager->TopControlsShownRatio(), previous); | |
262 } | |
263 EXPECT_FALSE(manager->has_animation()); | |
264 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
265 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset()); | |
266 } | |
267 | |
268 TEST(TopControlsManagerTest, PartialShownWithAmbiguousThresholdHides) { | |
269 MockTopControlsManagerClient client(100.f, 0.25f, 0.25f); | |
270 TopControlsManager* manager = client.manager(); | |
271 | |
272 manager->ScrollBy(gfx::Vector2dF(0.f, 200.f)); | |
273 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
274 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset()); | |
275 | |
276 manager->ScrollBegin(); | |
277 | |
278 manager->ScrollBy(gfx::Vector2dF(0.f, -20.f)); | |
279 EXPECT_FLOAT_EQ(-80.f, manager->ControlsTopOffset()); | |
280 EXPECT_FLOAT_EQ(20.f, manager->ContentTopOffset()); | |
281 | |
282 manager->ScrollEnd(); | |
283 EXPECT_TRUE(manager->has_animation()); | |
284 | |
285 base::TimeTicks time = base::TimeTicks::Now(); | |
286 float previous; | |
287 while (manager->has_animation()) { | |
288 previous = manager->TopControlsShownRatio(); | |
289 time = base::TimeDelta::FromMicroseconds(100) + time; | |
290 manager->Animate(time); | |
291 EXPECT_LT(manager->TopControlsShownRatio(), previous); | |
292 } | |
293 EXPECT_FALSE(manager->has_animation()); | |
294 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
295 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset()); | |
296 } | |
297 | |
298 TEST(TopControlsManagerTest, PartialShownWithAmbiguousThresholdShows) { | |
299 MockTopControlsManagerClient client(100.f, 0.25f, 0.25f); | |
300 TopControlsManager* manager = client.manager(); | |
301 | |
302 manager->ScrollBy(gfx::Vector2dF(0.f, 200.f)); | |
303 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
304 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset()); | |
305 | |
306 manager->ScrollBegin(); | |
307 | |
308 manager->ScrollBy(gfx::Vector2dF(0.f, -30.f)); | |
309 EXPECT_FLOAT_EQ(-70.f, manager->ControlsTopOffset()); | |
310 EXPECT_FLOAT_EQ(30.f, manager->ContentTopOffset()); | |
311 | |
312 manager->ScrollEnd(); | |
313 EXPECT_TRUE(manager->has_animation()); | |
314 | |
315 base::TimeTicks time = base::TimeTicks::Now(); | |
316 float previous; | |
317 while (manager->has_animation()) { | |
318 previous = manager->TopControlsShownRatio(); | |
319 time = base::TimeDelta::FromMicroseconds(100) + time; | |
320 manager->Animate(time); | |
321 EXPECT_GT(manager->TopControlsShownRatio(), previous); | |
322 } | |
323 EXPECT_FALSE(manager->has_animation()); | |
324 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset()); | |
325 EXPECT_FLOAT_EQ(100.f, manager->ContentTopOffset()); | |
326 } | |
327 | |
328 TEST(TopControlsManagerTest, PinchIgnoresScroll) { | |
329 MockTopControlsManagerClient client(100.f, 0.5f, 0.5f); | |
330 TopControlsManager* manager = client.manager(); | |
331 | |
332 // Hide the controls. | |
333 manager->ScrollBegin(); | |
334 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset()); | |
335 | |
336 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f)); | |
337 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
338 | |
339 manager->PinchBegin(); | |
340 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
341 | |
342 // Scrolls are ignored during pinch. | |
343 manager->ScrollBy(gfx::Vector2dF(0.f, -15.f)); | |
344 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
345 manager->PinchEnd(); | |
346 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
347 | |
348 // Scrolls should no long be ignored. | |
349 manager->ScrollBy(gfx::Vector2dF(0.f, -15.f)); | |
350 EXPECT_FLOAT_EQ(-85.f, manager->ControlsTopOffset()); | |
351 EXPECT_FLOAT_EQ(15.f, manager->ContentTopOffset()); | |
352 manager->ScrollEnd(); | |
353 | |
354 EXPECT_TRUE(manager->has_animation()); | |
355 } | |
356 | |
357 TEST(TopControlsManagerTest, PinchBeginStartsAnimationIfNecessary) { | |
358 MockTopControlsManagerClient client(100.f, 0.5f, 0.5f); | |
359 TopControlsManager* manager = client.manager(); | |
360 | |
361 manager->ScrollBegin(); | |
362 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f)); | |
363 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
364 | |
365 manager->PinchBegin(); | |
366 EXPECT_FALSE(manager->has_animation()); | |
367 | |
368 manager->PinchEnd(); | |
369 EXPECT_FALSE(manager->has_animation()); | |
370 | |
371 manager->ScrollBy(gfx::Vector2dF(0.f, -15.f)); | |
372 EXPECT_FLOAT_EQ(-85.f, manager->ControlsTopOffset()); | |
373 EXPECT_FLOAT_EQ(15.f, manager->ContentTopOffset()); | |
374 | |
375 manager->PinchBegin(); | |
376 EXPECT_TRUE(manager->has_animation()); | |
377 | |
378 base::TimeTicks time = base::TimeTicks::Now(); | |
379 float previous; | |
380 while (manager->has_animation()) { | |
381 previous = manager->TopControlsShownRatio(); | |
382 time = base::TimeDelta::FromMicroseconds(100) + time; | |
383 manager->Animate(time); | |
384 EXPECT_LT(manager->TopControlsShownRatio(), previous); | |
385 } | |
386 EXPECT_FALSE(manager->has_animation()); | |
387 | |
388 manager->PinchEnd(); | |
389 EXPECT_FALSE(manager->has_animation()); | |
390 | |
391 manager->ScrollBy(gfx::Vector2dF(0.f, -55.f)); | |
392 EXPECT_FLOAT_EQ(-45.f, manager->ControlsTopOffset()); | |
393 EXPECT_FLOAT_EQ(55.f, manager->ContentTopOffset()); | |
394 EXPECT_FALSE(manager->has_animation()); | |
395 | |
396 manager->ScrollEnd(); | |
397 EXPECT_TRUE(manager->has_animation()); | |
398 | |
399 time = base::TimeTicks::Now(); | |
400 while (manager->has_animation()) { | |
401 previous = manager->TopControlsShownRatio(); | |
402 time = base::TimeDelta::FromMicroseconds(100) + time; | |
403 manager->Animate(time); | |
404 EXPECT_GT(manager->TopControlsShownRatio(), previous); | |
405 } | |
406 EXPECT_FALSE(manager->has_animation()); | |
407 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset()); | |
408 } | |
409 | |
410 TEST(TopControlsManagerTest, HeightChangeMaintainsFullyVisibleControls) { | |
411 MockTopControlsManagerClient client(0.f, 0.5f, 0.5f); | |
412 TopControlsManager* manager = client.manager(); | |
413 | |
414 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset()); | |
415 | |
416 client.SetTopControlsHeight(100.f); | |
417 EXPECT_FALSE(manager->has_animation()); | |
418 EXPECT_FLOAT_EQ(100.f, manager->TopControlsHeight()); | |
419 EXPECT_FLOAT_EQ(0, manager->ControlsTopOffset()); | |
420 | |
421 client.SetTopControlsHeight(50.f); | |
422 EXPECT_FALSE(manager->has_animation()); | |
423 EXPECT_FLOAT_EQ(50.f, manager->TopControlsHeight()); | |
424 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset()); | |
425 } | |
426 | |
427 TEST(TopControlsManagerTest, GrowingHeightKeepsTopControlsHidden) { | |
428 MockTopControlsManagerClient client(0.f, 0.5f, 0.5f); | |
429 TopControlsManager* manager = client.manager(); | |
430 client.SetTopControlsHeight(1.f); | |
431 manager->UpdateTopControlsState(HIDDEN, HIDDEN, false); | |
432 EXPECT_EQ(-1.f, manager->ControlsTopOffset()); | |
433 EXPECT_EQ(0.f, manager->ContentTopOffset()); | |
434 | |
435 client.SetTopControlsHeight(50.f); | |
436 EXPECT_FALSE(manager->has_animation()); | |
437 EXPECT_EQ(-50.f, manager->ControlsTopOffset()); | |
438 EXPECT_EQ(0.f, manager->ContentTopOffset()); | |
439 | |
440 client.SetTopControlsHeight(100.f); | |
441 EXPECT_FALSE(manager->has_animation()); | |
442 EXPECT_EQ(-100.f, manager->ControlsTopOffset()); | |
443 EXPECT_EQ(0.f, manager->ContentTopOffset()); | |
444 } | |
445 | |
446 TEST(TopControlsManagerTest, ShrinkingHeightKeepsTopControlsHidden) { | |
447 MockTopControlsManagerClient client(100.f, 0.5f, 0.5f); | |
448 TopControlsManager* manager = client.manager(); | |
449 | |
450 manager->ScrollBegin(); | |
451 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f)); | |
452 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset()); | |
453 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset()); | |
454 manager->ScrollEnd(); | |
455 | |
456 client.SetTopControlsHeight(50.f); | |
457 EXPECT_FALSE(manager->has_animation()); | |
458 EXPECT_FLOAT_EQ(-50.f, manager->ControlsTopOffset()); | |
459 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset()); | |
460 | |
461 client.SetTopControlsHeight(0.f); | |
462 EXPECT_FALSE(manager->has_animation()); | |
463 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset()); | |
464 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset()); | |
465 } | |
466 | |
467 TEST(TopControlsManagerTest, ScrollByWithZeroHeightControlsIsNoop) { | |
468 MockTopControlsManagerClient client(0.f, 0.5f, 0.5f); | |
469 TopControlsManager* manager = client.manager(); | |
470 manager->UpdateTopControlsState(BOTH, BOTH, false); | |
471 | |
472 manager->ScrollBegin(); | |
473 gfx::Vector2dF pending = manager->ScrollBy(gfx::Vector2dF(0.f, 20.f)); | |
474 EXPECT_FLOAT_EQ(20.f, pending.y()); | |
475 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset()); | |
476 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset()); | |
477 EXPECT_FLOAT_EQ(1.f, client.CurrentTopControlsShownRatio()); | |
478 manager->ScrollEnd(); | |
479 } | |
480 | |
481 TEST(TopControlsManagerTest, ScrollThenRestoreBottomControls) { | |
482 MockTopControlsManagerClient client(100.f, 0.5f, 0.5f); | |
483 client.SetBottomControlsHeight(100.f); | |
484 TopControlsManager* manager = client.manager(); | |
485 manager->ScrollBegin(); | |
486 manager->ScrollBy(gfx::Vector2dF(0.f, 20.f)); | |
487 EXPECT_FLOAT_EQ(80.f, manager->ContentBottomOffset()); | |
488 EXPECT_FLOAT_EQ(0.8f, manager->BottomControlsShownRatio()); | |
489 manager->ScrollEnd(); | |
490 | |
491 manager->ScrollBegin(); | |
492 manager->ScrollBy(gfx::Vector2dF(0.f, -200.f)); | |
493 EXPECT_FLOAT_EQ(100.f, manager->ContentBottomOffset()); | |
494 EXPECT_FLOAT_EQ(1.f, manager->BottomControlsShownRatio()); | |
495 manager->ScrollEnd(); | |
496 } | |
497 | |
498 TEST(TopControlsManagerTest, HideAndPeekBottomControls) { | |
499 MockTopControlsManagerClient client(100.f, 0.5f, 0.5f); | |
500 client.SetBottomControlsHeight(100.f); | |
501 TopControlsManager* manager = client.manager(); | |
502 manager->ScrollBegin(); | |
503 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f)); | |
504 EXPECT_FLOAT_EQ(0.f, manager->ContentBottomOffset()); | |
505 EXPECT_FLOAT_EQ(0.f, manager->BottomControlsShownRatio()); | |
506 manager->ScrollEnd(); | |
507 | |
508 manager->ScrollBegin(); | |
509 manager->ScrollBy(gfx::Vector2dF(0.f, -15.f)); | |
510 EXPECT_FLOAT_EQ(15.f, manager->ContentBottomOffset()); | |
511 EXPECT_FLOAT_EQ(0.15f, manager->BottomControlsShownRatio()); | |
512 manager->ScrollEnd(); | |
513 } | |
514 | |
515 TEST(TopControlsManagerTest, HideAndImmediateShowKeepsControlsVisible) { | |
516 MockTopControlsManagerClient client(100.f, 0.5f, 0.5f); | |
517 client.SetBottomControlsHeight(100.f); | |
518 TopControlsManager* manager = client.manager(); | |
519 EXPECT_FLOAT_EQ(1.f, client.CurrentTopControlsShownRatio()); | |
520 | |
521 manager->UpdateTopControlsState(BOTH, HIDDEN, true); | |
522 EXPECT_TRUE(manager->has_animation()); | |
523 EXPECT_FLOAT_EQ(1.f, client.CurrentTopControlsShownRatio()); | |
524 | |
525 manager->UpdateTopControlsState(BOTH, SHOWN, true); | |
526 EXPECT_FALSE(manager->has_animation()); | |
527 EXPECT_FLOAT_EQ(1.f, client.CurrentTopControlsShownRatio()); | |
528 } | |
529 | |
530 } // namespace | |
531 } // namespace cc | |
OLD | NEW |