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/browser_controls_offset_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/browser_controls_offset_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_task_graph_runner.h"
18 #include "cc/trees/layer_tree_impl.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 #include "ui/gfx/geometry/vector2d_f.h"
21
22 namespace cc {
23 namespace {
24
25 class MockBrowserControlsOffsetManagerClient
26 : public BrowserControlsOffsetManagerClient {
27 public:
MockBrowserControlsOffsetManagerClient(float top_controls_height,float browser_controls_show_threshold,float browser_controls_hide_threshold)28 MockBrowserControlsOffsetManagerClient(float top_controls_height,
29 float browser_controls_show_threshold,
30 float browser_controls_hide_threshold)
31 : host_impl_(&task_runner_provider_, &task_graph_runner_),
32 redraw_needed_(false),
33 update_draw_properties_needed_(false),
34 browser_controls_params_({top_controls_height, 0, 0, 0, false, false}),
35 bottom_controls_shown_ratio_(1.f),
36 top_controls_shown_ratio_(1.f),
37 browser_controls_show_threshold_(browser_controls_show_threshold),
38 browser_controls_hide_threshold_(browser_controls_hide_threshold) {
39 active_tree_ = std::make_unique<LayerTreeImpl>(
40 &host_impl_, new SyncedProperty<ScaleGroup>, new SyncedBrowserControls,
41 new SyncedBrowserControls, new SyncedElasticOverscroll);
42 root_scroll_layer_ = LayerImpl::Create(active_tree_.get(), 1);
43 }
44
45 ~MockBrowserControlsOffsetManagerClient() override = default;
46
DidChangeBrowserControlsPosition()47 void DidChangeBrowserControlsPosition() override {
48 redraw_needed_ = true;
49 update_draw_properties_needed_ = true;
50 }
51
HaveRootScrollNode() const52 bool HaveRootScrollNode() const override { return true; }
53
BottomControlsHeight() const54 float BottomControlsHeight() const override {
55 return browser_controls_params_.bottom_controls_height;
56 }
57
BottomControlsMinHeight() const58 float BottomControlsMinHeight() const override {
59 return browser_controls_params_.bottom_controls_min_height;
60 }
61
TopControlsHeight() const62 float TopControlsHeight() const override {
63 return browser_controls_params_.top_controls_height;
64 }
65
TopControlsMinHeight() const66 float TopControlsMinHeight() const override {
67 return browser_controls_params_.top_controls_min_height;
68 }
69
SetCurrentBrowserControlsShownRatio(float top_ratio,float bottom_ratio)70 void SetCurrentBrowserControlsShownRatio(float top_ratio,
71 float bottom_ratio) override {
72 AssertAndClamp(&top_ratio);
73 top_controls_shown_ratio_ = top_ratio;
74
75 AssertAndClamp(&bottom_ratio);
76 bottom_controls_shown_ratio_ = bottom_ratio;
77 }
78
AssertAndClamp(float * ratio)79 void AssertAndClamp(float* ratio) {
80 ASSERT_FALSE(std::isnan(*ratio));
81 ASSERT_FALSE(*ratio == std::numeric_limits<float>::infinity());
82 ASSERT_FALSE(*ratio == -std::numeric_limits<float>::infinity());
83 *ratio = std::max(*ratio, 0.f);
84 }
85
CurrentBottomControlsShownRatio() const86 float CurrentBottomControlsShownRatio() const override {
87 return bottom_controls_shown_ratio_;
88 }
89
CurrentTopControlsShownRatio() const90 float CurrentTopControlsShownRatio() const override {
91 return top_controls_shown_ratio_;
92 }
93
SetNeedsCommit()94 void SetNeedsCommit() override {}
95
rootScrollLayer()96 LayerImpl* rootScrollLayer() { return root_scroll_layer_.get(); }
97
manager()98 BrowserControlsOffsetManager* manager() {
99 if (!manager_) {
100 manager_ = BrowserControlsOffsetManager::Create(
101 this, browser_controls_show_threshold_,
102 browser_controls_hide_threshold_);
103 }
104 return manager_.get();
105 }
106
SetBrowserControlsParams(BrowserControlsParams params)107 void SetBrowserControlsParams(BrowserControlsParams params) {
108 browser_controls_params_ = params;
109
110 manager()->OnBrowserControlsParamsChanged(
111 params.animate_browser_controls_height_changes);
112 }
113
114 private:
115 FakeImplTaskRunnerProvider task_runner_provider_;
116 TestTaskGraphRunner task_graph_runner_;
117 FakeLayerTreeHostImpl host_impl_;
118 std::unique_ptr<LayerTreeImpl> active_tree_;
119 std::unique_ptr<LayerImpl> root_scroll_layer_;
120 std::unique_ptr<BrowserControlsOffsetManager> manager_;
121 bool redraw_needed_;
122 bool update_draw_properties_needed_;
123
124 BrowserControlsParams browser_controls_params_;
125 float bottom_controls_shown_ratio_;
126 float top_controls_shown_ratio_;
127 float browser_controls_show_threshold_;
128 float browser_controls_hide_threshold_;
129 };
130
TEST(BrowserControlsOffsetManagerTest,EnsureScrollThresholdApplied)131 TEST(BrowserControlsOffsetManagerTest, EnsureScrollThresholdApplied) {
132 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
133 BrowserControlsOffsetManager* manager = client.manager();
134
135 manager->ScrollBegin();
136
137 // Scroll down to hide the controls entirely.
138 manager->ScrollBy(gfx::Vector2dF(0.f, 30.f));
139 EXPECT_FLOAT_EQ(-30.f, manager->ControlsTopOffset());
140
141 manager->ScrollBy(gfx::Vector2dF(0.f, 30.f));
142 EXPECT_FLOAT_EQ(-60.f, manager->ControlsTopOffset());
143
144 manager->ScrollBy(gfx::Vector2dF(0.f, 100.f));
145 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
146
147 // Scroll back up a bit and ensure the controls don't move until we cross
148 // the threshold.
149 manager->ScrollBy(gfx::Vector2dF(0.f, -10.f));
150 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
151
152 manager->ScrollBy(gfx::Vector2dF(0.f, -50.f));
153 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
154
155 // After hitting the threshold, further scrolling up should result in the top
156 // controls showing.
157 manager->ScrollBy(gfx::Vector2dF(0.f, -10.f));
158 EXPECT_FLOAT_EQ(-90.f, manager->ControlsTopOffset());
159
160 manager->ScrollBy(gfx::Vector2dF(0.f, -50.f));
161 EXPECT_FLOAT_EQ(-40.f, manager->ControlsTopOffset());
162
163 // Reset the scroll threshold by going further up the page than the initial
164 // threshold.
165 manager->ScrollBy(gfx::Vector2dF(0.f, -100.f));
166 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
167
168 // See that scrolling down the page now will result in the controls hiding.
169 manager->ScrollBy(gfx::Vector2dF(0.f, 20.f));
170 EXPECT_FLOAT_EQ(-20.f, manager->ControlsTopOffset());
171
172 manager->ScrollEnd();
173 }
174
TEST(BrowserControlsOffsetManagerTest,EnsureScrollThresholdAppliedWithMinHeight)175 TEST(BrowserControlsOffsetManagerTest,
176 EnsureScrollThresholdAppliedWithMinHeight) {
177 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
178 BrowserControlsOffsetManager* manager = client.manager();
179
180 // First, set the min-height.
181 client.SetBrowserControlsParams({100.f, 20.f, 0.f, 0.f, false, false});
182
183 manager->ScrollBegin();
184
185 // Scroll down to hide the controls.
186 manager->ScrollBy(gfx::Vector2dF(0.f, 30.f));
187 EXPECT_FLOAT_EQ(-30.f, manager->ControlsTopOffset());
188
189 manager->ScrollBy(gfx::Vector2dF(0.f, 30.f));
190 EXPECT_FLOAT_EQ(-60.f, manager->ControlsTopOffset());
191
192 // Controls should stop scrolling when we hit the min-height.
193 manager->ScrollBy(gfx::Vector2dF(0.f, 100.f));
194 EXPECT_FLOAT_EQ(-80.f, manager->ControlsTopOffset());
195
196 // Scroll back up a bit and ensure the controls don't move until we cross
197 // the threshold.
198 manager->ScrollBy(gfx::Vector2dF(0.f, -20.f));
199 EXPECT_FLOAT_EQ(-80.f, manager->ControlsTopOffset());
200
201 manager->ScrollBy(gfx::Vector2dF(0.f, -60.f));
202 EXPECT_FLOAT_EQ(-80.f, manager->ControlsTopOffset());
203
204 // After hitting the threshold, further scrolling up should result in the top
205 // controls starting to move.
206 manager->ScrollBy(gfx::Vector2dF(0.f, -10.f));
207 EXPECT_FLOAT_EQ(-70.f, manager->ControlsTopOffset());
208
209 manager->ScrollBy(gfx::Vector2dF(0.f, -50.f));
210 EXPECT_FLOAT_EQ(-20.f, manager->ControlsTopOffset());
211
212 // Reset the scroll threshold by going further up the page than the initial
213 // threshold.
214 manager->ScrollBy(gfx::Vector2dF(0.f, -100.f));
215 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
216
217 // See that scrolling down the page now will result in the controls hiding.
218 manager->ScrollBy(gfx::Vector2dF(0.f, 20.f));
219 EXPECT_FLOAT_EQ(-20.f, manager->ControlsTopOffset());
220
221 manager->ScrollEnd();
222 }
223
TEST(BrowserControlsOffsetManagerTest,PartialShownHideAnimation)224 TEST(BrowserControlsOffsetManagerTest, PartialShownHideAnimation) {
225 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
226 BrowserControlsOffsetManager* manager = client.manager();
227 manager->ScrollBegin();
228 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
229 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
230 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
231 manager->ScrollEnd();
232
233 manager->ScrollBegin();
234 manager->ScrollBy(gfx::Vector2dF(0.f, -15.f));
235 EXPECT_FLOAT_EQ(-85.f, manager->ControlsTopOffset());
236 EXPECT_FLOAT_EQ(15.f, manager->ContentTopOffset());
237 manager->ScrollEnd();
238
239 EXPECT_TRUE(manager->HasAnimation());
240
241 base::TimeTicks time = base::TimeTicks::Now();
242
243 // First animate will establish the animaion.
244 float previous = manager->TopControlsShownRatio();
245 manager->Animate(time);
246 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
247
248 while (manager->HasAnimation()) {
249 previous = manager->TopControlsShownRatio();
250 time = base::TimeDelta::FromMicroseconds(100) + time;
251 manager->Animate(time);
252 EXPECT_LT(manager->TopControlsShownRatio(), previous);
253 }
254 EXPECT_FALSE(manager->HasAnimation());
255 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
256 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
257 }
258
TEST(BrowserControlsOffsetManagerTest,BottomControlsPartialShownHideAnimation)259 TEST(BrowserControlsOffsetManagerTest,
260 BottomControlsPartialShownHideAnimation) {
261 MockBrowserControlsOffsetManagerClient client(0.f, 0.5f, 0.5f);
262 client.SetBrowserControlsParams({0, 0, 100, 0, false, false});
263 BrowserControlsOffsetManager* manager = client.manager();
264 manager->ScrollBegin();
265 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
266 EXPECT_FLOAT_EQ(0.f, manager->BottomControlsShownRatio());
267 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
268 manager->ScrollEnd();
269
270 manager->ScrollBegin();
271 manager->ScrollBy(gfx::Vector2dF(0.f, -20.f));
272 EXPECT_FLOAT_EQ(0.2f, manager->BottomControlsShownRatio());
273 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
274 manager->ScrollEnd();
275
276 EXPECT_TRUE(manager->HasAnimation());
277
278 base::TimeTicks time = base::TimeTicks::Now();
279
280 // First animate will establish the animaion.
281 float previous = manager->TopControlsShownRatio();
282 manager->Animate(time);
283 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
284
285 while (manager->HasAnimation()) {
286 previous = manager->BottomControlsShownRatio();
287 time = base::TimeDelta::FromMicroseconds(100) + time;
288 manager->Animate(time);
289 EXPECT_LT(manager->BottomControlsShownRatio(), previous);
290 }
291 EXPECT_FALSE(manager->HasAnimation());
292 EXPECT_FLOAT_EQ(0.f, manager->BottomControlsShownRatio());
293 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
294 }
295
TEST(BrowserControlsOffsetManagerTest,PartialShownShowAnimation)296 TEST(BrowserControlsOffsetManagerTest, PartialShownShowAnimation) {
297 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
298 BrowserControlsOffsetManager* manager = client.manager();
299 manager->ScrollBegin();
300 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
301 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
302 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
303 manager->ScrollEnd();
304
305 manager->ScrollBegin();
306 manager->ScrollBy(gfx::Vector2dF(0.f, -70.f));
307 EXPECT_FLOAT_EQ(-30.f, manager->ControlsTopOffset());
308 EXPECT_FLOAT_EQ(70.f, manager->ContentTopOffset());
309 manager->ScrollEnd();
310
311 EXPECT_TRUE(manager->HasAnimation());
312
313 base::TimeTicks time = base::TimeTicks::Now();
314
315 // First animate will establish the animaion.
316 float previous = manager->TopControlsShownRatio();
317 manager->Animate(time);
318 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
319
320 while (manager->HasAnimation()) {
321 previous = manager->TopControlsShownRatio();
322 time = base::TimeDelta::FromMicroseconds(100) + time;
323 manager->Animate(time);
324 EXPECT_GT(manager->TopControlsShownRatio(), previous);
325 }
326 EXPECT_FALSE(manager->HasAnimation());
327 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
328 EXPECT_FLOAT_EQ(100.f, manager->ContentTopOffset());
329 }
330
TEST(BrowserControlsOffsetManagerTest,BottomControlsPartialShownShowAnimation)331 TEST(BrowserControlsOffsetManagerTest,
332 BottomControlsPartialShownShowAnimation) {
333 MockBrowserControlsOffsetManagerClient client(0.f, 0.5f, 0.5f);
334 client.SetBrowserControlsParams({0, 0, 100, 0, false, false});
335 BrowserControlsOffsetManager* manager = client.manager();
336
337 manager->ScrollBegin();
338 manager->ScrollBy(gfx::Vector2dF(0.f, 20.f));
339 EXPECT_FLOAT_EQ(0.8f, manager->BottomControlsShownRatio());
340 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
341 manager->ScrollEnd();
342
343 EXPECT_TRUE(manager->HasAnimation());
344
345 base::TimeTicks time = base::TimeTicks::Now();
346
347 // First animate will establish the animaion.
348 float previous = manager->TopControlsShownRatio();
349 manager->Animate(time);
350 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
351
352 while (manager->HasAnimation()) {
353 previous = manager->BottomControlsShownRatio();
354 time = base::TimeDelta::FromMicroseconds(100) + time;
355 manager->Animate(time);
356 EXPECT_GT(manager->BottomControlsShownRatio(), previous);
357 }
358 EXPECT_FALSE(manager->HasAnimation());
359 EXPECT_FLOAT_EQ(1.f, manager->BottomControlsShownRatio());
360 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
361 }
362
TEST(BrowserControlsOffsetManagerTest,PartialHiddenWithAmbiguousThresholdShows)363 TEST(BrowserControlsOffsetManagerTest,
364 PartialHiddenWithAmbiguousThresholdShows) {
365 MockBrowserControlsOffsetManagerClient client(100.f, 0.25f, 0.25f);
366 BrowserControlsOffsetManager* manager = client.manager();
367
368 manager->ScrollBegin();
369
370 manager->ScrollBy(gfx::Vector2dF(0.f, 20.f));
371 EXPECT_FLOAT_EQ(-20.f, manager->ControlsTopOffset());
372 EXPECT_FLOAT_EQ(80.f, manager->ContentTopOffset());
373
374 manager->ScrollEnd();
375 EXPECT_TRUE(manager->HasAnimation());
376
377 base::TimeTicks time = base::TimeTicks::Now();
378
379 // First animate will establish the animaion.
380 float previous = manager->TopControlsShownRatio();
381 manager->Animate(time);
382 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
383
384 while (manager->HasAnimation()) {
385 previous = manager->TopControlsShownRatio();
386 time = base::TimeDelta::FromMicroseconds(100) + time;
387 manager->Animate(time);
388 EXPECT_GT(manager->TopControlsShownRatio(), previous);
389 }
390 EXPECT_FALSE(manager->HasAnimation());
391 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
392 EXPECT_FLOAT_EQ(100.f, manager->ContentTopOffset());
393 }
394
TEST(BrowserControlsOffsetManagerTest,PartialHiddenWithAmbiguousThresholdHides)395 TEST(BrowserControlsOffsetManagerTest,
396 PartialHiddenWithAmbiguousThresholdHides) {
397 MockBrowserControlsOffsetManagerClient client(100.f, 0.25f, 0.25f);
398 BrowserControlsOffsetManager* manager = client.manager();
399
400 manager->ScrollBegin();
401
402 manager->ScrollBy(gfx::Vector2dF(0.f, 30.f));
403 EXPECT_FLOAT_EQ(-30.f, manager->ControlsTopOffset());
404 EXPECT_FLOAT_EQ(70.f, manager->ContentTopOffset());
405
406 manager->ScrollEnd();
407 EXPECT_TRUE(manager->HasAnimation());
408
409 base::TimeTicks time = base::TimeTicks::Now();
410
411 // First animate will establish the animaion.
412 float previous = manager->TopControlsShownRatio();
413 manager->Animate(time);
414 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
415
416 while (manager->HasAnimation()) {
417 previous = manager->TopControlsShownRatio();
418 time = base::TimeDelta::FromMicroseconds(100) + time;
419 manager->Animate(time);
420 EXPECT_LT(manager->TopControlsShownRatio(), previous);
421 }
422 EXPECT_FALSE(manager->HasAnimation());
423 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
424 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
425 }
426
TEST(BrowserControlsOffsetManagerTest,PartialShownWithAmbiguousThresholdHides)427 TEST(BrowserControlsOffsetManagerTest,
428 PartialShownWithAmbiguousThresholdHides) {
429 MockBrowserControlsOffsetManagerClient client(100.f, 0.25f, 0.25f);
430 BrowserControlsOffsetManager* manager = client.manager();
431
432 manager->ScrollBy(gfx::Vector2dF(0.f, 200.f));
433 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
434 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
435
436 manager->ScrollBegin();
437
438 manager->ScrollBy(gfx::Vector2dF(0.f, -20.f));
439 EXPECT_FLOAT_EQ(-80.f, manager->ControlsTopOffset());
440 EXPECT_FLOAT_EQ(20.f, manager->ContentTopOffset());
441
442 manager->ScrollEnd();
443 EXPECT_TRUE(manager->HasAnimation());
444
445 base::TimeTicks time = base::TimeTicks::Now();
446
447 // First animate will establish the animaion.
448 float previous = manager->TopControlsShownRatio();
449 manager->Animate(time);
450 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
451
452 while (manager->HasAnimation()) {
453 previous = manager->TopControlsShownRatio();
454 time = base::TimeDelta::FromMicroseconds(100) + time;
455 manager->Animate(time);
456 EXPECT_LT(manager->TopControlsShownRatio(), previous);
457 }
458 EXPECT_FALSE(manager->HasAnimation());
459 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
460 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
461 }
462
TEST(BrowserControlsOffsetManagerTest,PartialShownWithAmbiguousThresholdShows)463 TEST(BrowserControlsOffsetManagerTest,
464 PartialShownWithAmbiguousThresholdShows) {
465 MockBrowserControlsOffsetManagerClient client(100.f, 0.25f, 0.25f);
466 BrowserControlsOffsetManager* manager = client.manager();
467
468 manager->ScrollBy(gfx::Vector2dF(0.f, 200.f));
469 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
470 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
471
472 manager->ScrollBegin();
473
474 manager->ScrollBy(gfx::Vector2dF(0.f, -30.f));
475 EXPECT_FLOAT_EQ(-70.f, manager->ControlsTopOffset());
476 EXPECT_FLOAT_EQ(30.f, manager->ContentTopOffset());
477
478 manager->ScrollEnd();
479 EXPECT_TRUE(manager->HasAnimation());
480
481 base::TimeTicks time = base::TimeTicks::Now();
482
483 // First animate will establish the animaion.
484 float previous = manager->TopControlsShownRatio();
485 manager->Animate(time);
486 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
487
488 while (manager->HasAnimation()) {
489 previous = manager->TopControlsShownRatio();
490 time = base::TimeDelta::FromMicroseconds(100) + time;
491 manager->Animate(time);
492 EXPECT_GT(manager->TopControlsShownRatio(), previous);
493 }
494 EXPECT_FALSE(manager->HasAnimation());
495 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
496 EXPECT_FLOAT_EQ(100.f, manager->ContentTopOffset());
497 }
498
TEST(BrowserControlsOffsetManagerTest,PinchIgnoresScroll)499 TEST(BrowserControlsOffsetManagerTest, PinchIgnoresScroll) {
500 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
501 BrowserControlsOffsetManager* manager = client.manager();
502
503 // Hide the controls.
504 manager->ScrollBegin();
505 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
506
507 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
508 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
509
510 manager->PinchBegin();
511 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
512
513 // Scrolls are ignored during pinch.
514 manager->ScrollBy(gfx::Vector2dF(0.f, -15.f));
515 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
516 manager->PinchEnd();
517 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
518
519 // Scrolls should no long be ignored.
520 manager->ScrollBy(gfx::Vector2dF(0.f, -15.f));
521 EXPECT_FLOAT_EQ(-85.f, manager->ControlsTopOffset());
522 EXPECT_FLOAT_EQ(15.f, manager->ContentTopOffset());
523 manager->ScrollEnd();
524
525 EXPECT_TRUE(manager->HasAnimation());
526 }
527
TEST(BrowserControlsOffsetManagerTest,PinchBeginStartsAnimationIfNecessary)528 TEST(BrowserControlsOffsetManagerTest, PinchBeginStartsAnimationIfNecessary) {
529 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
530 BrowserControlsOffsetManager* manager = client.manager();
531
532 manager->ScrollBegin();
533 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
534 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
535
536 manager->PinchBegin();
537 EXPECT_FALSE(manager->HasAnimation());
538
539 manager->PinchEnd();
540 EXPECT_FALSE(manager->HasAnimation());
541
542 manager->ScrollBy(gfx::Vector2dF(0.f, -15.f));
543 EXPECT_FLOAT_EQ(-85.f, manager->ControlsTopOffset());
544 EXPECT_FLOAT_EQ(15.f, manager->ContentTopOffset());
545
546 manager->PinchBegin();
547 EXPECT_TRUE(manager->HasAnimation());
548
549 base::TimeTicks time = base::TimeTicks::Now();
550
551 // First animate will establish the animaion.
552 float previous = manager->TopControlsShownRatio();
553 manager->Animate(time);
554 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
555
556 while (manager->HasAnimation()) {
557 previous = manager->TopControlsShownRatio();
558 time = base::TimeDelta::FromMicroseconds(100) + time;
559 manager->Animate(time);
560 EXPECT_LT(manager->TopControlsShownRatio(), previous);
561 }
562 EXPECT_FALSE(manager->HasAnimation());
563
564 manager->PinchEnd();
565 EXPECT_FALSE(manager->HasAnimation());
566
567 manager->ScrollBy(gfx::Vector2dF(0.f, -55.f));
568 EXPECT_FLOAT_EQ(-45.f, manager->ControlsTopOffset());
569 EXPECT_FLOAT_EQ(55.f, manager->ContentTopOffset());
570 EXPECT_FALSE(manager->HasAnimation());
571
572 manager->ScrollEnd();
573 EXPECT_TRUE(manager->HasAnimation());
574
575 time = base::TimeTicks::Now();
576
577 // First animate will establish the animaion.
578 previous = manager->TopControlsShownRatio();
579 manager->Animate(time);
580 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
581
582 while (manager->HasAnimation()) {
583 previous = manager->TopControlsShownRatio();
584 time = base::TimeDelta::FromMicroseconds(100) + time;
585 manager->Animate(time);
586 EXPECT_GT(manager->TopControlsShownRatio(), previous);
587 }
588 EXPECT_FALSE(manager->HasAnimation());
589 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
590 }
591
TEST(BrowserControlsOffsetManagerTest,HeightIncreaseWhenFullyShownAnimation)592 TEST(BrowserControlsOffsetManagerTest, HeightIncreaseWhenFullyShownAnimation) {
593 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
594 BrowserControlsOffsetManager* manager = client.manager();
595
596 // Set the new height with animation.
597 client.SetBrowserControlsParams({150, 0, 0, 0, true, false});
598 EXPECT_TRUE(manager->HasAnimation());
599 EXPECT_FLOAT_EQ(150.f, manager->TopControlsHeight());
600 // Ratio should've been updated to avoid jumping to the new height.
601 EXPECT_FLOAT_EQ(100.f / 150.f, manager->TopControlsShownRatio());
602 // Min-height offset should stay 0 since only the height changed.
603 EXPECT_FLOAT_EQ(0.f, manager->TopControlsMinHeightOffset());
604
605 base::TimeTicks time = base::TimeTicks::Now();
606
607 // First animate will establish the animaion.
608 float previous = manager->TopControlsShownRatio();
609 manager->Animate(time);
610 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
611
612 while (manager->HasAnimation()) {
613 previous = manager->TopControlsShownRatio();
614 time = base::TimeDelta::FromMicroseconds(100) + time;
615 manager->Animate(time);
616 EXPECT_GT(manager->TopControlsShownRatio(), previous);
617 }
618 EXPECT_FALSE(manager->HasAnimation());
619 // Controls should be fully shown when the animation ends.
620 EXPECT_FLOAT_EQ(1.f, manager->TopControlsShownRatio());
621 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
622 EXPECT_FLOAT_EQ(150.f, manager->ContentTopOffset());
623 // Min-height offset should still be 0.
624 EXPECT_FLOAT_EQ(0.f, manager->TopControlsMinHeightOffset());
625 }
626
TEST(BrowserControlsOffsetManagerTest,HeightDecreaseWhenFullyShownAnimation)627 TEST(BrowserControlsOffsetManagerTest, HeightDecreaseWhenFullyShownAnimation) {
628 MockBrowserControlsOffsetManagerClient client(150.f, 0.5f, 0.5f);
629 BrowserControlsOffsetManager* manager = client.manager();
630
631 // Set the new height with animation.
632 client.SetBrowserControlsParams({100, 0, 0, 0, true, false});
633 EXPECT_TRUE(manager->HasAnimation());
634 EXPECT_FLOAT_EQ(100.f, manager->TopControlsHeight());
635 // Ratio should've been updated to avoid jumping to the new height.
636 // The ratio will be > 1 here.
637 EXPECT_FLOAT_EQ(150.f / 100.f, manager->TopControlsShownRatio());
638
639 base::TimeTicks time = base::TimeTicks::Now();
640
641 // First animate will establish the animaion.
642 float previous = manager->TopControlsShownRatio();
643 manager->Animate(time);
644 EXPECT_EQ(manager->TopControlsShownRatio(), previous);
645
646 while (manager->HasAnimation()) {
647 previous = manager->TopControlsShownRatio();
648 time = base::TimeDelta::FromMicroseconds(100) + time;
649 manager->Animate(time);
650 EXPECT_LT(manager->TopControlsShownRatio(), previous);
651 }
652 EXPECT_FALSE(manager->HasAnimation());
653 // Controls should be fully shown when the animation ends.
654 EXPECT_FLOAT_EQ(1.f, manager->TopControlsShownRatio());
655 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
656 EXPECT_FLOAT_EQ(100.f, manager->ContentTopOffset());
657 }
658
TEST(BrowserControlsOffsetManagerTest,MinHeightIncreaseWhenHiddenAnimation)659 TEST(BrowserControlsOffsetManagerTest, MinHeightIncreaseWhenHiddenAnimation) {
660 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
661 BrowserControlsOffsetManager* manager = client.manager();
662
663 // Scroll to hide.
664 manager->ScrollBegin();
665 manager->ScrollBy(gfx::Vector2dF(0.f, 100.f));
666 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
667 manager->ScrollEnd();
668
669 // Set the new min-height with animation.
670 client.SetBrowserControlsParams({100, 20, 0, 0, true, false});
671 EXPECT_TRUE(manager->HasAnimation());
672 EXPECT_FLOAT_EQ(20.f, manager->TopControlsMinHeight());
673 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
674 EXPECT_FLOAT_EQ(0.f, manager->TopControlsShownRatio());
675 EXPECT_FLOAT_EQ(0.f, manager->TopControlsMinHeightOffset());
676
677 base::TimeTicks time = base::TimeTicks::Now();
678
679 // First animate will establish the animation.
680 float previous_ratio = manager->TopControlsShownRatio();
681 float previous_min_height_offset = manager->TopControlsMinHeightOffset();
682 manager->Animate(time);
683 EXPECT_EQ(manager->TopControlsShownRatio(), previous_ratio);
684 EXPECT_EQ(manager->TopControlsMinHeightOffset(), previous_min_height_offset);
685
686 while (manager->HasAnimation()) {
687 previous_ratio = manager->TopControlsShownRatio();
688 previous_min_height_offset = manager->TopControlsMinHeightOffset();
689 time = base::TimeDelta::FromMicroseconds(100) + time;
690 manager->Animate(time);
691 EXPECT_GT(manager->TopControlsShownRatio(), previous_ratio);
692 // Min-height offset is also animated.
693 EXPECT_GT(manager->TopControlsMinHeightOffset(),
694 previous_min_height_offset);
695 }
696 EXPECT_FALSE(manager->HasAnimation());
697 // Controls should be at the new min-height when the animation ends.
698 EXPECT_FLOAT_EQ(20.f / 100.f, manager->TopControlsShownRatio());
699 EXPECT_FLOAT_EQ(20.f, manager->ContentTopOffset());
700 // Min-height offset should be equal to the min-height at the end.
701 EXPECT_FLOAT_EQ(20.f, manager->TopControlsMinHeightOffset());
702 }
703
TEST(BrowserControlsOffsetManagerTest,MinHeightSetToZeroWhenAtMinHeightAnimation)704 TEST(BrowserControlsOffsetManagerTest,
705 MinHeightSetToZeroWhenAtMinHeightAnimation) {
706 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
707 BrowserControlsOffsetManager* manager = client.manager();
708
709 // Set the min-height.
710 client.SetBrowserControlsParams({100, 20, 0, 0, true, false});
711
712 // Scroll to min-height.
713 manager->ScrollBegin();
714 manager->ScrollBy(gfx::Vector2dF(0.f, 80.f));
715 EXPECT_FLOAT_EQ(20.f, manager->ContentTopOffset());
716 manager->ScrollEnd();
717
718 // Set the new min-height with animation.
719 client.SetBrowserControlsParams({100, 0, 0, 0, true, false});
720 EXPECT_TRUE(manager->HasAnimation());
721 EXPECT_FLOAT_EQ(0.f, manager->TopControlsMinHeight());
722 // The controls should still be at the min-height.
723 EXPECT_FLOAT_EQ(20.f, manager->ContentTopOffset());
724 // Min-height offset is equal to min-height.
725 EXPECT_FLOAT_EQ(20.f, manager->TopControlsMinHeightOffset());
726
727 base::TimeTicks time = base::TimeTicks::Now();
728
729 // First animate will establish the animaion.
730 float previous_ratio = manager->TopControlsShownRatio();
731 float previous_min_height_offset = manager->TopControlsMinHeightOffset();
732 manager->Animate(time);
733 EXPECT_EQ(manager->TopControlsShownRatio(), previous_ratio);
734
735 while (manager->HasAnimation()) {
736 previous_ratio = manager->TopControlsShownRatio();
737 previous_min_height_offset = manager->TopControlsMinHeightOffset();
738 time = base::TimeDelta::FromMicroseconds(100) + time;
739 manager->Animate(time);
740 EXPECT_LT(manager->TopControlsShownRatio(), previous_ratio);
741 // Min-height offset is also animated.
742 EXPECT_LT(manager->TopControlsMinHeightOffset(),
743 previous_min_height_offset);
744 }
745 EXPECT_FALSE(manager->HasAnimation());
746 // Controls should be hidden when the animation ends.
747 EXPECT_FLOAT_EQ(0.f, manager->TopControlsShownRatio());
748 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
749 // Min-height offset will be equal to the new min-height.
750 EXPECT_FLOAT_EQ(0.f, manager->TopControlsMinHeightOffset());
751 }
752
TEST(BrowserControlsOffsetManagerTest,EnsureNoAnimationCases)753 TEST(BrowserControlsOffsetManagerTest, EnsureNoAnimationCases) {
754 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
755 BrowserControlsOffsetManager* manager = client.manager();
756
757 // No animation should run if only the min-height changes when the controls
758 // are fully shown.
759 client.SetBrowserControlsParams({100, 20, 0, 0, true, false});
760 EXPECT_FALSE(manager->HasAnimation());
761
762 // Scroll to min-height.
763 manager->ScrollBegin();
764 manager->ScrollBy(gfx::Vector2dF(0.f, 80.f));
765 EXPECT_FLOAT_EQ(20.f, manager->ContentTopOffset());
766 manager->ScrollEnd();
767
768 // No animation should run if only the height changes when the controls
769 // are at min-height.
770 client.SetBrowserControlsParams({150, 20, 0, 0, true, false});
771 EXPECT_FALSE(manager->HasAnimation());
772
773 // Set the min-height to 0 without animation.
774 client.SetBrowserControlsParams({150, 0, 0, 0, false, false});
775 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
776
777 // No animation should run if only the height changes when the controls are
778 // fully hidden.
779 client.SetBrowserControlsParams({100, 0, 0, 0, true, false});
780 EXPECT_FALSE(manager->HasAnimation());
781 }
782
TEST(BrowserControlsOffsetManagerTest,HeightChangeAnimationJumpsToEndOnScroll)783 TEST(BrowserControlsOffsetManagerTest,
784 HeightChangeAnimationJumpsToEndOnScroll) {
785 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
786 BrowserControlsOffsetManager* manager = client.manager();
787
788 EXPECT_FLOAT_EQ(100.f, manager->ContentTopOffset());
789
790 // Change the params to start an animation.
791 client.SetBrowserControlsParams({150, 30, 0, 0, true, false});
792 EXPECT_TRUE(manager->HasAnimation());
793
794 base::TimeTicks time = base::TimeTicks::Now();
795 // First animate will establish the animation.
796 float previous = manager->TopControlsShownRatio();
797 manager->Animate(time);
798 // Forward a little bit.
799 time = base::TimeDelta::FromMicroseconds(100) + time;
800 manager->Animate(time);
801
802 // Animation should be in progress.
803 EXPECT_GT(manager->TopControlsShownRatio(), previous);
804
805 manager->ScrollBegin();
806 // Scroll should cause the animation to jump to the end.
807 EXPECT_FLOAT_EQ(1.f, manager->TopControlsShownRatio());
808 EXPECT_FLOAT_EQ(150.f, manager->ContentTopOffset());
809 // Min-height offset should jump to the new min-height.
810 EXPECT_FLOAT_EQ(30.f, manager->TopControlsMinHeightOffset());
811 EXPECT_FALSE(manager->HasAnimation());
812 // Then, the scroll will move the controls as it would normally.
813 manager->ScrollBy(gfx::Vector2dF(0.f, 60.f));
814 EXPECT_FALSE(manager->HasAnimation());
815 EXPECT_FLOAT_EQ(90.f, manager->ContentTopOffset());
816 // Min-height offset won't change once the animation is complete.
817 EXPECT_FLOAT_EQ(30.f, manager->TopControlsMinHeightOffset());
818 manager->ScrollEnd();
819 }
820
TEST(BrowserControlsOffsetManagerTest,HeightChangeMaintainsFullyVisibleControls)821 TEST(BrowserControlsOffsetManagerTest,
822 HeightChangeMaintainsFullyVisibleControls) {
823 MockBrowserControlsOffsetManagerClient client(0.f, 0.5f, 0.5f);
824 BrowserControlsOffsetManager* manager = client.manager();
825
826 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
827
828 client.SetBrowserControlsParams({100, 0, 0, 0, false, false});
829 EXPECT_FALSE(manager->HasAnimation());
830 EXPECT_FLOAT_EQ(100.f, manager->TopControlsHeight());
831 EXPECT_FLOAT_EQ(0, manager->ControlsTopOffset());
832
833 client.SetBrowserControlsParams({50, 0, 0, 0, false, false});
834 EXPECT_FALSE(manager->HasAnimation());
835 EXPECT_FLOAT_EQ(50.f, manager->TopControlsHeight());
836 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
837 }
838
TEST(BrowserControlsOffsetManagerTest,ShrinkingHeightKeepsBrowserControlsHidden)839 TEST(BrowserControlsOffsetManagerTest,
840 ShrinkingHeightKeepsBrowserControlsHidden) {
841 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
842 BrowserControlsOffsetManager* manager = client.manager();
843
844 manager->ScrollBegin();
845 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
846 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
847 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
848 manager->ScrollEnd();
849
850 client.SetBrowserControlsParams({50, 0, 0, 0, false, false});
851 EXPECT_FALSE(manager->HasAnimation());
852 EXPECT_FLOAT_EQ(-50.f, manager->ControlsTopOffset());
853 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
854
855 client.SetBrowserControlsParams({0, 0, 0, 0, false, false});
856 EXPECT_FALSE(manager->HasAnimation());
857 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
858 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
859 }
860
TEST(BrowserControlsOffsetManagerTest,HeightChangeWithAnimateFalseDoesNotTriggerAnimation)861 TEST(BrowserControlsOffsetManagerTest,
862 HeightChangeWithAnimateFalseDoesNotTriggerAnimation) {
863 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
864 BrowserControlsOffsetManager* manager = client.manager();
865
866 client.SetBrowserControlsParams({150, 0, 0, 0, false, false});
867 EXPECT_FALSE(manager->HasAnimation());
868 EXPECT_FLOAT_EQ(150.f, manager->TopControlsHeight());
869 EXPECT_FLOAT_EQ(0, manager->ControlsTopOffset());
870
871 client.SetBrowserControlsParams({50, 0, 0, 0, false, false});
872 EXPECT_FALSE(manager->HasAnimation());
873 EXPECT_FLOAT_EQ(50.f, manager->TopControlsHeight());
874 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
875 }
876
TEST(BrowserControlsOffsetManagerTest,MinHeightChangeWithAnimateFalseSnapsToNewMinHeight)877 TEST(BrowserControlsOffsetManagerTest,
878 MinHeightChangeWithAnimateFalseSnapsToNewMinHeight) {
879 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
880 BrowserControlsOffsetManager* manager = client.manager();
881
882 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
883
884 // Scroll to hide the controls.
885 manager->ScrollBegin();
886 manager->ScrollBy(gfx::Vector2dF(0.f, 100.f));
887 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
888 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
889 manager->ScrollEnd();
890
891 // Change the min-height from 0 to 20.
892 client.SetBrowserControlsParams({100, 20, 0, 0, false, false});
893 EXPECT_FALSE(manager->HasAnimation());
894 EXPECT_FLOAT_EQ(20.f, manager->TopControlsMinHeight());
895 // Top controls should snap to the new min-height.
896 EXPECT_FLOAT_EQ(-80.f, manager->ControlsTopOffset());
897 EXPECT_FLOAT_EQ(20.f, manager->ContentTopOffset());
898 // Min-height offset snaps to the new min-height.
899 EXPECT_FLOAT_EQ(20.f, manager->TopControlsMinHeightOffset());
900
901 // Change the min-height from 20 to 0.
902 client.SetBrowserControlsParams({100, 0, 0, 0, false, false});
903 EXPECT_FALSE(manager->HasAnimation());
904 EXPECT_FLOAT_EQ(0.f, manager->TopControlsMinHeight());
905 // Top controls should snap to the new min-height, 0.
906 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
907 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
908 // Min-height offset snaps to the new min-height.
909 EXPECT_FLOAT_EQ(0.f, manager->TopControlsMinHeightOffset());
910 }
911
TEST(BrowserControlsOffsetManagerTest,ControlsStayAtMinHeightOnHeightChange)912 TEST(BrowserControlsOffsetManagerTest, ControlsStayAtMinHeightOnHeightChange) {
913 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
914 BrowserControlsOffsetManager* manager = client.manager();
915
916 // Set the min-height to 20.
917 client.SetBrowserControlsParams({100, 20, 0, 0, false, false});
918
919 // Scroll the controls to min-height.
920 manager->ScrollBegin();
921 manager->ScrollBy(gfx::Vector2dF(0.f, 100.f));
922 EXPECT_FLOAT_EQ(20.f, manager->ContentTopOffset());
923 manager->ScrollEnd();
924
925 // Change the height from 100 to 120.
926 client.SetBrowserControlsParams({120, 20, 0, 0, false, false});
927 EXPECT_FALSE(manager->HasAnimation());
928 EXPECT_FLOAT_EQ(120.f, manager->TopControlsHeight());
929 EXPECT_FLOAT_EQ(20.f, manager->TopControlsMinHeight());
930 // Top controls should stay at the same visible height.
931 EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
932 EXPECT_FLOAT_EQ(20.f, manager->ContentTopOffset());
933
934 // Change the height from 120 back to 100.
935 client.SetBrowserControlsParams({100, 20, 0, 0, false, false});
936 EXPECT_FALSE(manager->HasAnimation());
937 EXPECT_FLOAT_EQ(100.f, manager->TopControlsHeight());
938 EXPECT_FLOAT_EQ(20.f, manager->TopControlsMinHeight());
939 // Top controls should still stay at the same visible height.
940 EXPECT_FLOAT_EQ(-80.f, manager->ControlsTopOffset());
941 EXPECT_FLOAT_EQ(20.f, manager->ContentTopOffset());
942 }
943
TEST(BrowserControlsOffsetManagerTest,ControlsAdjustToNewHeight)944 TEST(BrowserControlsOffsetManagerTest, ControlsAdjustToNewHeight) {
945 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
946 BrowserControlsOffsetManager* manager = client.manager();
947
948 // Scroll the controls a little.
949 manager->ScrollBegin();
950 manager->ScrollBy(gfx::Vector2dF(0.f, 40.f));
951 EXPECT_FLOAT_EQ(60.f, manager->ContentTopOffset());
952
953 // Change the height from 100 to 120.
954 client.SetBrowserControlsParams({120, 0, 0, 0, false, false});
955
956 // The shown ratios should be adjusted to keep the shown height same.
957 EXPECT_FLOAT_EQ(60.f, manager->ContentTopOffset());
958
959 manager->ScrollEnd();
960 }
961
TEST(BrowserControlsOffsetManagerTest,ScrollByWithZeroHeightControlsIsNoop)962 TEST(BrowserControlsOffsetManagerTest, ScrollByWithZeroHeightControlsIsNoop) {
963 MockBrowserControlsOffsetManagerClient client(0.f, 0.5f, 0.5f);
964 BrowserControlsOffsetManager* manager = client.manager();
965 manager->UpdateBrowserControlsState(BrowserControlsState::kBoth,
966 BrowserControlsState::kBoth, false);
967
968 manager->ScrollBegin();
969 gfx::Vector2dF pending = manager->ScrollBy(gfx::Vector2dF(0.f, 20.f));
970 EXPECT_FLOAT_EQ(20.f, pending.y());
971 EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
972 EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
973 EXPECT_FLOAT_EQ(1.f, client.CurrentTopControlsShownRatio());
974 manager->ScrollEnd();
975 }
976
TEST(BrowserControlsOffsetManagerTest,ScrollThenRestoreBottomControls)977 TEST(BrowserControlsOffsetManagerTest, ScrollThenRestoreBottomControls) {
978 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
979 client.SetBrowserControlsParams({0, 0, 100, 0, false, false});
980 BrowserControlsOffsetManager* manager = client.manager();
981 manager->ScrollBegin();
982 manager->ScrollBy(gfx::Vector2dF(0.f, 20.f));
983 EXPECT_FLOAT_EQ(80.f, manager->ContentBottomOffset());
984 EXPECT_FLOAT_EQ(0.8f, manager->BottomControlsShownRatio());
985 manager->ScrollEnd();
986
987 manager->ScrollBegin();
988 manager->ScrollBy(gfx::Vector2dF(0.f, -200.f));
989 EXPECT_FLOAT_EQ(100.f, manager->ContentBottomOffset());
990 EXPECT_FLOAT_EQ(1.f, manager->BottomControlsShownRatio());
991 manager->ScrollEnd();
992 }
993
TEST(BrowserControlsOffsetManagerTest,ScrollThenRestoreBottomControlsNoTopControls)994 TEST(BrowserControlsOffsetManagerTest,
995 ScrollThenRestoreBottomControlsNoTopControls) {
996 MockBrowserControlsOffsetManagerClient client(0.f, 0.5f, 0.5f);
997 client.SetBrowserControlsParams({0, 0, 100, 0, false, false});
998 BrowserControlsOffsetManager* manager = client.manager();
999 manager->ScrollBegin();
1000 manager->ScrollBy(gfx::Vector2dF(0.f, 20.f));
1001 EXPECT_FLOAT_EQ(80.f, manager->ContentBottomOffset());
1002 EXPECT_FLOAT_EQ(0.8f, manager->BottomControlsShownRatio());
1003 manager->ScrollEnd();
1004
1005 manager->ScrollBegin();
1006 manager->ScrollBy(gfx::Vector2dF(0.f, -200.f));
1007 EXPECT_FLOAT_EQ(100.f, manager->ContentBottomOffset());
1008 EXPECT_FLOAT_EQ(1.f, manager->BottomControlsShownRatio());
1009 manager->ScrollEnd();
1010 }
1011
TEST(BrowserControlsOffsetManagerTest,HideAndPeekBottomControls)1012 TEST(BrowserControlsOffsetManagerTest, HideAndPeekBottomControls) {
1013 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
1014 client.SetBrowserControlsParams({0, 0, 100, 0, false, false});
1015 BrowserControlsOffsetManager* manager = client.manager();
1016 manager->ScrollBegin();
1017 manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
1018 EXPECT_FLOAT_EQ(0.f, manager->ContentBottomOffset());
1019 EXPECT_FLOAT_EQ(0.f, manager->BottomControlsShownRatio());
1020 manager->ScrollEnd();
1021
1022 manager->ScrollBegin();
1023 manager->ScrollBy(gfx::Vector2dF(0.f, -15.f));
1024 EXPECT_FLOAT_EQ(15.f, manager->ContentBottomOffset());
1025 EXPECT_FLOAT_EQ(0.15f, manager->BottomControlsShownRatio());
1026 manager->ScrollEnd();
1027 }
1028
TEST(BrowserControlsOffsetManagerTest,HideAndImmediateShowKeepsControlsVisible)1029 TEST(BrowserControlsOffsetManagerTest,
1030 HideAndImmediateShowKeepsControlsVisible) {
1031 MockBrowserControlsOffsetManagerClient client(100.f, 0.5f, 0.5f);
1032 client.SetBrowserControlsParams({0, 0, 100, 0, false, false});
1033 BrowserControlsOffsetManager* manager = client.manager();
1034 EXPECT_FLOAT_EQ(1.f, client.CurrentBottomControlsShownRatio());
1035
1036 manager->UpdateBrowserControlsState(BrowserControlsState::kBoth,
1037 BrowserControlsState::kHidden, true);
1038 EXPECT_TRUE(manager->HasAnimation());
1039 EXPECT_FLOAT_EQ(1.f, client.CurrentBottomControlsShownRatio());
1040
1041 manager->UpdateBrowserControlsState(BrowserControlsState::kBoth,
1042 BrowserControlsState::kShown, true);
1043 EXPECT_FALSE(manager->HasAnimation());
1044 EXPECT_FLOAT_EQ(1.f, client.CurrentBottomControlsShownRatio());
1045 }
1046
TEST(BrowserControlsOffsetManagerTest,ScrollWithMinHeightSetForTopControlsOnly)1047 TEST(BrowserControlsOffsetManagerTest,
1048 ScrollWithMinHeightSetForTopControlsOnly) {
1049 MockBrowserControlsOffsetManagerClient client(100, 0.5f, 0.5f);
1050 client.SetBrowserControlsParams({100, 30, 100, 0, false, false});
1051 BrowserControlsOffsetManager* manager = client.manager();
1052 EXPECT_FLOAT_EQ(1.f, client.CurrentTopControlsShownRatio());
1053 EXPECT_FLOAT_EQ(1.f, client.CurrentBottomControlsShownRatio());
1054
1055 // Controls don't hide completely and stop at the min-height.
1056 manager->ScrollBegin();
1057 manager->ScrollBy(gfx::Vector2dF(0, 150));
1058 EXPECT_FLOAT_EQ(30.f / 100, client.CurrentTopControlsShownRatio());
1059 EXPECT_FLOAT_EQ(0.f, client.CurrentBottomControlsShownRatio());
1060 manager->ScrollEnd();
1061
1062 // Controls scroll immediately from the min-height point.
1063 manager->ScrollBegin();
1064 manager->ScrollBy(gfx::Vector2dF(0, -70));
1065 EXPECT_FLOAT_EQ(1.f, client.CurrentTopControlsShownRatio());
1066 EXPECT_FLOAT_EQ(1.f, client.CurrentBottomControlsShownRatio());
1067 manager->ScrollEnd();
1068 }
1069
TEST(BrowserControlsOffsetManagerTest,ScrollWithMinHeightSetForBothControls)1070 TEST(BrowserControlsOffsetManagerTest, ScrollWithMinHeightSetForBothControls) {
1071 MockBrowserControlsOffsetManagerClient client(100, 0.5f, 0.5f);
1072 client.SetBrowserControlsParams({100, 30, 100, 20, false, false});
1073 BrowserControlsOffsetManager* manager = client.manager();
1074 EXPECT_FLOAT_EQ(1.f, client.CurrentTopControlsShownRatio());
1075 EXPECT_FLOAT_EQ(1.f, client.CurrentBottomControlsShownRatio());
1076
1077 // Controls don't hide completely and stop at the min-height.
1078 manager->ScrollBegin();
1079 manager->ScrollBy(gfx::Vector2dF(0, 150));
1080 EXPECT_FLOAT_EQ(30.f / 100, client.CurrentTopControlsShownRatio());
1081 EXPECT_FLOAT_EQ(20.f / 100, client.CurrentBottomControlsShownRatio());
1082 manager->ScrollEnd();
1083
1084 manager->ScrollBegin();
1085 manager->ScrollBy(gfx::Vector2dF(0, -70));
1086 EXPECT_FLOAT_EQ(1.f, client.CurrentTopControlsShownRatio());
1087 EXPECT_FLOAT_EQ(1.f, client.CurrentBottomControlsShownRatio());
1088 manager->ScrollEnd();
1089 }
1090
1091 } // namespace
1092 } // namespace cc
1093