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