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