OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/layers/layer.h" | 5 #include "cc/layers/layer.h" |
6 #include "content/browser/android/overscroll_refresh.h" | 6 #include "content/browser/android/overscroll_refresh.h" |
7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
8 #include "ui/base/android/system_ui_resource_manager.h" | 8 #include "ui/base/android/system_ui_resource_manager.h" |
9 | 9 |
10 namespace content { | 10 namespace content { |
11 | 11 |
| 12 const float kDragTargetPixels = 100; |
| 13 |
12 gfx::SizeF DefaultViewportSize() { | 14 gfx::SizeF DefaultViewportSize() { |
13 return gfx::SizeF(512, 512); | 15 return gfx::SizeF(512, 512); |
14 } | 16 } |
15 | 17 |
16 class OverscrollRefreshTest : public OverscrollRefreshClient, | 18 class OverscrollRefreshTest : public OverscrollRefreshClient, |
17 public ui::SystemUIResourceManager, | 19 public ui::SystemUIResourceManager, |
18 public testing::Test { | 20 public testing::Test { |
19 public: | 21 public: |
20 OverscrollRefreshTest() : refresh_triggered_(false) {} | 22 OverscrollRefreshTest() : refresh_triggered_(false) {} |
21 | 23 |
(...skipping 20 matching lines...) Expand all Loading... |
42 cc::UIResourceId GetUIResourceId(ui::SystemUIResourceType) override { | 44 cc::UIResourceId GetUIResourceId(ui::SystemUIResourceType) override { |
43 return 0; | 45 return 0; |
44 } | 46 } |
45 | 47 |
46 private: | 48 private: |
47 bool refresh_triggered_; | 49 bool refresh_triggered_; |
48 bool still_refreshing_; | 50 bool still_refreshing_; |
49 }; | 51 }; |
50 | 52 |
51 TEST_F(OverscrollRefreshTest, Basic) { | 53 TEST_F(OverscrollRefreshTest, Basic) { |
52 OverscrollRefresh effect(this, this); | 54 OverscrollRefresh effect(this, this, kDragTargetPixels); |
53 | 55 |
54 gfx::Vector2dF origin_scroll_offset; | 56 gfx::Vector2dF origin_scroll_offset; |
55 effect.UpdateDisplay(DefaultViewportSize(), origin_scroll_offset); | 57 effect.UpdateDisplay(DefaultViewportSize(), origin_scroll_offset); |
56 EXPECT_FALSE(effect.IsActive()); | 58 EXPECT_FALSE(effect.IsActive()); |
57 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); | 59 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
58 | 60 |
59 effect.OnScrollBegin(); | 61 effect.OnScrollBegin(); |
60 EXPECT_FALSE(effect.IsActive()); | 62 EXPECT_FALSE(effect.IsActive()); |
61 EXPECT_TRUE(effect.IsAwaitingScrollUpdateAck()); | 63 EXPECT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
62 | 64 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 | 107 |
106 // The effect should terminate in a timely fashion. | 108 // The effect should terminate in a timely fashion. |
107 EXPECT_GT(current_time.ToInternalValue(), initial_time.ToInternalValue()); | 109 EXPECT_GT(current_time.ToInternalValue(), initial_time.ToInternalValue()); |
108 EXPECT_LE( | 110 EXPECT_LE( |
109 current_time.ToInternalValue(), | 111 current_time.ToInternalValue(), |
110 (initial_time + base::TimeDelta::FromSeconds(10)).ToInternalValue()); | 112 (initial_time + base::TimeDelta::FromSeconds(10)).ToInternalValue()); |
111 EXPECT_FALSE(effect.IsActive()); | 113 EXPECT_FALSE(effect.IsActive()); |
112 } | 114 } |
113 | 115 |
114 TEST_F(OverscrollRefreshTest, AnimationTerminatesEvenIfRefreshNeverTerminates) { | 116 TEST_F(OverscrollRefreshTest, AnimationTerminatesEvenIfRefreshNeverTerminates) { |
115 OverscrollRefresh effect(this, this); | 117 OverscrollRefresh effect(this, this, kDragTargetPixels); |
116 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); | 118 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); |
117 effect.OnScrollBegin(); | 119 effect.OnScrollBegin(); |
118 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 120 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
119 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); | 121 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
120 effect.OnScrollUpdateAck(false); | 122 effect.OnScrollUpdateAck(false); |
121 ASSERT_TRUE(effect.IsActive()); | 123 ASSERT_TRUE(effect.IsActive()); |
122 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); | 124 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); |
123 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); | 125 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); |
124 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); | 126 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); |
125 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); | 127 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); |
(...skipping 11 matching lines...) Expand all Loading... |
137 current_time += base::TimeDelta::FromMilliseconds(16); | 139 current_time += base::TimeDelta::FromMilliseconds(16); |
138 | 140 |
139 EXPECT_GT(current_time.ToInternalValue(), initial_time.ToInternalValue()); | 141 EXPECT_GT(current_time.ToInternalValue(), initial_time.ToInternalValue()); |
140 EXPECT_LE( | 142 EXPECT_LE( |
141 current_time.ToInternalValue(), | 143 current_time.ToInternalValue(), |
142 (initial_time + base::TimeDelta::FromSeconds(10)).ToInternalValue()); | 144 (initial_time + base::TimeDelta::FromSeconds(10)).ToInternalValue()); |
143 EXPECT_FALSE(effect.IsActive()); | 145 EXPECT_FALSE(effect.IsActive()); |
144 } | 146 } |
145 | 147 |
146 TEST_F(OverscrollRefreshTest, NotTriggeredIfBelowThreshold) { | 148 TEST_F(OverscrollRefreshTest, NotTriggeredIfBelowThreshold) { |
147 OverscrollRefresh effect(this, this); | 149 OverscrollRefresh effect(this, this, kDragTargetPixels); |
148 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); | 150 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); |
149 effect.OnScrollBegin(); | 151 effect.OnScrollBegin(); |
150 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 152 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
151 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); | 153 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
152 effect.OnScrollUpdateAck(false); | 154 effect.OnScrollUpdateAck(false); |
153 ASSERT_TRUE(effect.IsActive()); | 155 ASSERT_TRUE(effect.IsActive()); |
154 | 156 |
155 // Terminating the pull before it exceeds the threshold will prevent refresh. | 157 // Terminating the pull before it exceeds the threshold will prevent refresh. |
156 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 158 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
157 effect.OnScrollEnd(gfx::Vector2dF()); | 159 effect.OnScrollEnd(gfx::Vector2dF()); |
158 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 160 EXPECT_FALSE(GetAndResetRefreshTriggered()); |
159 } | 161 } |
160 | 162 |
161 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialYOffsetIsNotZero) { | 163 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialYOffsetIsNotZero) { |
162 OverscrollRefresh effect(this, this); | 164 OverscrollRefresh effect(this, this, kDragTargetPixels); |
163 | 165 |
164 // A positive y scroll offset at the start of scroll will prevent activation, | 166 // A positive y scroll offset at the start of scroll will prevent activation, |
165 // even if the subsequent scroll overscrolls upward. | 167 // even if the subsequent scroll overscrolls upward. |
166 gfx::Vector2dF nonzero_offset(0, 10); | 168 gfx::Vector2dF nonzero_offset(0, 10); |
167 effect.UpdateDisplay(DefaultViewportSize(), nonzero_offset); | 169 effect.UpdateDisplay(DefaultViewportSize(), nonzero_offset); |
168 effect.OnScrollBegin(); | 170 effect.OnScrollBegin(); |
169 | 171 |
170 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); | 172 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); |
171 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 173 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
172 EXPECT_FALSE(effect.IsActive()); | 174 EXPECT_FALSE(effect.IsActive()); |
173 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); | 175 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
174 effect.OnScrollUpdateAck(false); | 176 effect.OnScrollUpdateAck(false); |
175 EXPECT_FALSE(effect.IsActive()); | 177 EXPECT_FALSE(effect.IsActive()); |
176 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); | 178 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
177 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | 179 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); |
178 effect.OnScrollEnd(gfx::Vector2dF()); | 180 effect.OnScrollEnd(gfx::Vector2dF()); |
179 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 181 EXPECT_FALSE(GetAndResetRefreshTriggered()); |
180 } | 182 } |
181 | 183 |
182 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollDownward) { | 184 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollDownward) { |
183 OverscrollRefresh effect(this, this); | 185 OverscrollRefresh effect(this, this, kDragTargetPixels); |
184 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); | 186 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); |
185 effect.OnScrollBegin(); | 187 effect.OnScrollBegin(); |
186 | 188 |
187 // A downward initial scroll will prevent activation, even if the subsequent | 189 // A downward initial scroll will prevent activation, even if the subsequent |
188 // scroll overscrolls upward. | 190 // scroll overscrolls upward. |
189 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, -10))); | 191 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, -10))); |
190 EXPECT_FALSE(effect.IsActive()); | 192 EXPECT_FALSE(effect.IsActive()); |
191 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); | 193 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
192 | 194 |
193 effect.OnScrollUpdateAck(false); | 195 effect.OnScrollUpdateAck(false); |
194 EXPECT_FALSE(effect.IsActive()); | 196 EXPECT_FALSE(effect.IsActive()); |
195 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); | 197 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
196 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | 198 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); |
197 effect.OnScrollEnd(gfx::Vector2dF()); | 199 effect.OnScrollEnd(gfx::Vector2dF()); |
198 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 200 EXPECT_FALSE(GetAndResetRefreshTriggered()); |
199 } | 201 } |
200 | 202 |
201 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollOrTouchConsumed) { | 203 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollOrTouchConsumed) { |
202 OverscrollRefresh effect(this, this); | 204 OverscrollRefresh effect(this, this, kDragTargetPixels); |
203 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); | 205 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); |
204 effect.OnScrollBegin(); | 206 effect.OnScrollBegin(); |
205 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 207 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
206 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); | 208 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
207 | 209 |
208 // Consumption of the initial touchmove or scroll should prevent future | 210 // Consumption of the initial touchmove or scroll should prevent future |
209 // activation. | 211 // activation. |
210 effect.OnScrollUpdateAck(true); | 212 effect.OnScrollUpdateAck(true); |
211 EXPECT_FALSE(effect.IsActive()); | 213 EXPECT_FALSE(effect.IsActive()); |
212 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); | 214 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
213 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | 215 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); |
214 effect.OnScrollUpdateAck(false); | 216 effect.OnScrollUpdateAck(false); |
215 EXPECT_FALSE(effect.IsActive()); | 217 EXPECT_FALSE(effect.IsActive()); |
216 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); | 218 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
217 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | 219 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); |
218 effect.OnScrollEnd(gfx::Vector2dF()); | 220 effect.OnScrollEnd(gfx::Vector2dF()); |
219 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 221 EXPECT_FALSE(GetAndResetRefreshTriggered()); |
220 } | 222 } |
221 | 223 |
222 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollsJanked) { | 224 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollsJanked) { |
223 OverscrollRefresh effect(this, this); | 225 OverscrollRefresh effect(this, this, kDragTargetPixels); |
224 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); | 226 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); |
225 effect.OnScrollBegin(); | 227 effect.OnScrollBegin(); |
226 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 228 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
227 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); | 229 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
228 effect.OnScrollUpdateAck(false); | 230 effect.OnScrollUpdateAck(false); |
229 ASSERT_TRUE(effect.IsActive()); | 231 ASSERT_TRUE(effect.IsActive()); |
230 | 232 |
231 // It should take more than just one or two large scrolls to trigger, | 233 // It should take more than just one or two large scrolls to trigger, |
232 // mitigating likelihood of jank triggering the effect. | 234 // mitigating likelihood of jank triggering the effect. |
233 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | 235 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); |
234 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | 236 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); |
235 effect.OnScrollEnd(gfx::Vector2dF()); | 237 effect.OnScrollEnd(gfx::Vector2dF()); |
236 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 238 EXPECT_FALSE(GetAndResetRefreshTriggered()); |
237 } | 239 } |
238 | 240 |
239 TEST_F(OverscrollRefreshTest, NotTriggeredIfFlungDownward) { | 241 TEST_F(OverscrollRefreshTest, NotTriggeredIfFlungDownward) { |
240 OverscrollRefresh effect(this, this); | 242 OverscrollRefresh effect(this, this, kDragTargetPixels); |
241 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); | 243 effect.UpdateDisplay(DefaultViewportSize(), gfx::Vector2dF()); |
242 effect.OnScrollBegin(); | 244 effect.OnScrollBegin(); |
243 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 245 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
244 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); | 246 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
245 effect.OnScrollUpdateAck(false); | 247 effect.OnScrollUpdateAck(false); |
246 ASSERT_TRUE(effect.IsActive()); | 248 ASSERT_TRUE(effect.IsActive()); |
247 | 249 |
248 // Ensure the pull exceeds the necessary threshold. | 250 // Ensure the pull exceeds the necessary threshold. |
249 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); | 251 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); |
250 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); | 252 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); |
251 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); | 253 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); |
252 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); | 254 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); |
253 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); | 255 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); |
254 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); | 256 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); |
255 | 257 |
256 // Terminating the pull with a down-directed fling should prevent triggering. | 258 // Terminating the pull with a down-directed fling should prevent triggering. |
257 effect.OnScrollEnd(gfx::Vector2dF(0, -1000)); | 259 effect.OnScrollEnd(gfx::Vector2dF(0, -1000)); |
258 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 260 EXPECT_FALSE(GetAndResetRefreshTriggered()); |
259 } | 261 } |
260 | 262 |
261 } // namespace content | 263 } // namespace content |
OLD | NEW |