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/android/resources/resource_manager.h" | |
9 | 8 |
10 namespace content { | 9 namespace content { |
11 | 10 |
12 class OverscrollRefreshTest : public OverscrollRefreshClient, | 11 class OverscrollRefreshTest : public OverscrollRefreshHandler, |
13 public ui::ResourceManager, | |
14 public testing::Test { | 12 public testing::Test { |
15 public: | 13 public: |
16 OverscrollRefreshTest() | 14 OverscrollRefreshTest() {} |
17 : refresh_triggered_(false), still_refreshing_(false) {} | 15 |
18 | 16 // OverscrollRefreshHandler implementation. |
19 // OverscrollRefreshClient implementation. | 17 bool PullStart() override { |
20 void TriggerRefresh() override { | 18 started_ = true; |
21 refresh_triggered_ = true; | 19 return true; |
22 still_refreshing_ = true; | 20 } |
23 } | 21 |
24 | 22 void PullUpdate(float delta) override { delta_ += delta; } |
25 bool IsStillRefreshing() const override { return still_refreshing_; } | 23 |
26 | 24 void PullRelease(bool allow_refresh) override { |
27 // ResourceManager implementation. | 25 released_ = true; |
28 base::android::ScopedJavaLocalRef<jobject> GetJavaObject() override { | 26 refresh_allowed_ = allow_refresh; |
29 return base::android::ScopedJavaLocalRef<jobject>(); | 27 } |
30 } | 28 |
31 | 29 void PullReset() override { reset_ = true; } |
32 Resource* GetResource(ui::AndroidResourceType res_type, int res_id) override { | 30 |
33 return nullptr; | 31 bool GetAndResetPullStarted() { |
34 } | 32 bool result = started_; |
35 | 33 started_ = false; |
36 void PreloadResource(ui::AndroidResourceType res_type, int res_id) override {} | 34 return result; |
37 | 35 } |
38 bool GetAndResetRefreshTriggered() { | 36 |
39 bool triggered = refresh_triggered_; | 37 float GetAndResetPullDelta() { |
40 refresh_triggered_ = false; | 38 float result = delta_; |
41 return triggered; | 39 delta_ = 0; |
42 } | 40 return result; |
43 | 41 } |
44 void PullBeyondActivationThreshold(OverscrollRefresh* effect) { | 42 |
45 for (int i = 0; i < OverscrollRefresh::kMinPullsToActivate; ++i) | 43 bool GetAndResetPullReleased() { |
46 EXPECT_TRUE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 100))); | 44 bool result = released_; |
47 } | 45 released_ = false; |
48 | 46 return result; |
49 protected: | 47 } |
50 | 48 |
51 scoped_ptr<OverscrollRefresh> CreateEffect() { | 49 bool GetAndResetRefreshAllowed() { |
52 const float kDragTargetPixels = 100; | 50 bool result = refresh_allowed_; |
53 const bool kMirror = false; | 51 refresh_allowed_ = false; |
54 scoped_ptr<OverscrollRefresh> effect( | 52 return result; |
55 new OverscrollRefresh(this, this, kDragTargetPixels, kMirror)); | 53 } |
56 | 54 |
57 const gfx::SizeF kViewportSize(512, 512); | 55 bool GetAndResetPullReset() { |
58 const gfx::Vector2dF kScrollOffset; | 56 bool result = reset_; |
59 const bool kOverflowYHidden = false; | 57 reset_ = false; |
60 effect->UpdateDisplay(kViewportSize, kScrollOffset, kOverflowYHidden); | 58 return result; |
61 | 59 } |
62 return effect.Pass(); | |
63 } | |
64 | |
65 void SignalRefreshCompleted() { still_refreshing_ = false; } | |
66 | 60 |
67 private: | 61 private: |
68 bool refresh_triggered_; | 62 float delta_ = 0; |
69 bool still_refreshing_; | 63 bool started_ = false; |
| 64 bool released_ = false; |
| 65 bool reset_ = false; |
| 66 bool refresh_allowed_ = false; |
70 }; | 67 }; |
71 | 68 |
72 TEST_F(OverscrollRefreshTest, Basic) { | 69 TEST_F(OverscrollRefreshTest, Basic) { |
73 scoped_ptr<OverscrollRefresh> effect = CreateEffect(); | 70 OverscrollRefresh effect(this); |
74 | 71 |
75 EXPECT_FALSE(effect->IsActive()); | 72 EXPECT_FALSE(effect.IsActive()); |
76 EXPECT_FALSE(effect->IsAwaitingScrollUpdateAck()); | 73 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
77 | 74 |
78 effect->OnScrollBegin(); | 75 effect.OnScrollBegin(); |
79 EXPECT_FALSE(effect->IsActive()); | 76 EXPECT_FALSE(effect.IsActive()); |
80 EXPECT_TRUE(effect->IsAwaitingScrollUpdateAck()); | 77 EXPECT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
81 | 78 |
82 // The initial scroll should not be consumed, as it should first be offered | 79 // The initial scroll should not be consumed, as it should first be offered |
83 // to content. | 80 // to content. |
84 gfx::Vector2dF scroll_up(0, 10); | 81 gfx::Vector2dF scroll_up(0, 10); |
85 EXPECT_FALSE(effect->WillHandleScrollUpdate(scroll_up)); | 82 EXPECT_FALSE(effect.WillHandleScrollUpdate(scroll_up)); |
86 EXPECT_FALSE(effect->IsActive()); | 83 EXPECT_FALSE(effect.IsActive()); |
87 EXPECT_TRUE(effect->IsAwaitingScrollUpdateAck()); | 84 EXPECT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
88 | 85 |
89 // The unconsumed, overscrolling scroll will trigger the effect-> | 86 // The unconsumed, overscrolling scroll will trigger the effect. |
90 effect->OnScrollUpdateAck(false); | 87 effect.OnScrollUpdateAck(false); |
91 EXPECT_TRUE(effect->IsActive()); | 88 EXPECT_TRUE(effect.IsActive()); |
92 EXPECT_FALSE(effect->IsAwaitingScrollUpdateAck()); | 89 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
| 90 EXPECT_TRUE(GetAndResetPullStarted()); |
93 | 91 |
94 // Further scrolls will be consumed. | 92 // Further scrolls will be consumed. |
95 EXPECT_TRUE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); | 93 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 50))); |
96 EXPECT_TRUE(effect->IsActive()); | 94 EXPECT_EQ(50.f, GetAndResetPullDelta()); |
| 95 EXPECT_TRUE(effect.IsActive()); |
97 | 96 |
98 // Even scrolls in the down direction should be consumed. | 97 // Even scrolls in the down direction should be consumed. |
99 EXPECT_TRUE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, -50))); | 98 EXPECT_TRUE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, -50))); |
100 EXPECT_TRUE(effect->IsActive()); | 99 EXPECT_EQ(-50.f, GetAndResetPullDelta()); |
101 | 100 EXPECT_TRUE(effect.IsActive()); |
102 // Feed enough scrolls to the effect to exceeds the threshold. | |
103 PullBeyondActivationThreshold(effect.get()); | |
104 EXPECT_TRUE(effect->IsActive()); | |
105 | 101 |
106 // Ending the scroll while beyond the threshold should trigger a refresh. | 102 // Ending the scroll while beyond the threshold should trigger a refresh. |
107 gfx::Vector2dF zero_velocity; | 103 gfx::Vector2dF zero_velocity; |
108 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 104 EXPECT_FALSE(GetAndResetPullReleased()); |
109 effect->OnScrollEnd(zero_velocity); | 105 effect.OnScrollEnd(zero_velocity); |
110 EXPECT_TRUE(effect->IsActive()); | 106 EXPECT_FALSE(effect.IsActive()); |
111 EXPECT_TRUE(GetAndResetRefreshTriggered()); | 107 EXPECT_TRUE(GetAndResetPullReleased()); |
112 SignalRefreshCompleted(); | 108 EXPECT_TRUE(GetAndResetRefreshAllowed()); |
113 | |
114 // Ensure animation doesn't explode. | |
115 base::TimeTicks initial_time = base::TimeTicks::Now(); | |
116 base::TimeTicks current_time = initial_time; | |
117 scoped_refptr<cc::Layer> layer = cc::Layer::Create(); | |
118 while (effect->Animate(current_time, layer.get())) | |
119 current_time += base::TimeDelta::FromMilliseconds(16); | |
120 | |
121 // The effect should terminate in a timely fashion. | |
122 EXPECT_GT(current_time.ToInternalValue(), initial_time.ToInternalValue()); | |
123 EXPECT_LE( | |
124 current_time.ToInternalValue(), | |
125 (initial_time + base::TimeDelta::FromSeconds(10)).ToInternalValue()); | |
126 EXPECT_FALSE(effect->IsActive()); | |
127 } | |
128 | |
129 TEST_F(OverscrollRefreshTest, AnimationTerminatesEvenIfRefreshNeverTerminates) { | |
130 scoped_ptr<OverscrollRefresh> effect = CreateEffect(); | |
131 effect->OnScrollBegin(); | |
132 ASSERT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | |
133 ASSERT_TRUE(effect->IsAwaitingScrollUpdateAck()); | |
134 effect->OnScrollUpdateAck(false); | |
135 ASSERT_TRUE(effect->IsActive()); | |
136 PullBeyondActivationThreshold(effect.get()); | |
137 ASSERT_TRUE(effect->IsActive()); | |
138 effect->OnScrollEnd(gfx::Vector2dF(0, 0)); | |
139 ASSERT_TRUE(GetAndResetRefreshTriggered()); | |
140 | |
141 // Verify that the animation terminates even if the triggered refresh | |
142 // action never terminates (i.e., |still_refreshing_| is always true). | |
143 base::TimeTicks initial_time = base::TimeTicks::Now(); | |
144 base::TimeTicks current_time = initial_time; | |
145 scoped_refptr<cc::Layer> layer = cc::Layer::Create(); | |
146 while (effect->Animate(current_time, layer.get())) | |
147 current_time += base::TimeDelta::FromMilliseconds(16); | |
148 | |
149 EXPECT_GT(current_time.ToInternalValue(), initial_time.ToInternalValue()); | |
150 EXPECT_LE( | |
151 current_time.ToInternalValue(), | |
152 (initial_time + base::TimeDelta::FromSeconds(10)).ToInternalValue()); | |
153 EXPECT_FALSE(effect->IsActive()); | |
154 } | |
155 | |
156 TEST_F(OverscrollRefreshTest, NotTriggeredIfBelowThreshold) { | |
157 scoped_ptr<OverscrollRefresh> effect = CreateEffect(); | |
158 effect->OnScrollBegin(); | |
159 ASSERT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | |
160 ASSERT_TRUE(effect->IsAwaitingScrollUpdateAck()); | |
161 effect->OnScrollUpdateAck(false); | |
162 ASSERT_TRUE(effect->IsActive()); | |
163 | |
164 // Terminating the pull before it exceeds the threshold will prevent refresh. | |
165 EXPECT_TRUE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | |
166 effect->OnScrollEnd(gfx::Vector2dF()); | |
167 EXPECT_FALSE(GetAndResetRefreshTriggered()); | |
168 } | 109 } |
169 | 110 |
170 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialYOffsetIsNotZero) { | 111 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialYOffsetIsNotZero) { |
171 scoped_ptr<OverscrollRefresh> effect = CreateEffect(); | 112 OverscrollRefresh effect(this); |
172 | 113 |
173 // A positive y scroll offset at the start of scroll will prevent activation, | 114 // A positive y scroll offset at the start of scroll will prevent activation, |
174 // even if the subsequent scroll overscrolls upward. | 115 // even if the subsequent scroll overscrolls upward. |
175 gfx::SizeF viewport_size(512, 512); | |
176 gfx::Vector2dF nonzero_offset(0, 10); | 116 gfx::Vector2dF nonzero_offset(0, 10); |
177 bool overflow_y_hidden = false; | 117 bool overflow_y_hidden = false; |
178 effect->UpdateDisplay(viewport_size, nonzero_offset, overflow_y_hidden); | 118 effect.OnFrameUpdated(nonzero_offset, overflow_y_hidden); |
179 effect->OnScrollBegin(); | 119 effect.OnScrollBegin(); |
180 | 120 |
181 ASSERT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 121 effect.OnFrameUpdated(gfx::Vector2dF(), overflow_y_hidden); |
182 EXPECT_FALSE(effect->IsActive()); | 122 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
183 EXPECT_FALSE(effect->IsAwaitingScrollUpdateAck()); | 123 EXPECT_FALSE(effect.IsActive()); |
184 effect->OnScrollUpdateAck(false); | 124 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
185 EXPECT_FALSE(effect->IsActive()); | 125 effect.OnScrollUpdateAck(false); |
186 EXPECT_FALSE(effect->IsAwaitingScrollUpdateAck()); | 126 EXPECT_FALSE(effect.IsActive()); |
187 EXPECT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | 127 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
188 effect->OnScrollEnd(gfx::Vector2dF()); | 128 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); |
189 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 129 effect.OnScrollEnd(gfx::Vector2dF()); |
| 130 EXPECT_FALSE(GetAndResetPullStarted()); |
| 131 EXPECT_FALSE(GetAndResetPullReleased()); |
190 } | 132 } |
191 | 133 |
192 TEST_F(OverscrollRefreshTest, NotTriggeredIfOverflowYHidden) { | 134 TEST_F(OverscrollRefreshTest, NotTriggeredIfOverflowYHidden) { |
193 scoped_ptr<OverscrollRefresh> effect = CreateEffect(); | 135 OverscrollRefresh effect(this); |
194 | 136 |
195 // "overflow-y: hidden" on the root layer will prevent activation, | 137 // overflow-y:hidden at the start of scroll will prevent activation. |
196 // even if the subsequent scroll overscrolls upward. | |
197 gfx::SizeF viewport_size(512, 512); | |
198 gfx::Vector2dF zero_offset; | 138 gfx::Vector2dF zero_offset; |
199 bool overflow_y_hidden = true; | 139 bool overflow_y_hidden = true; |
200 effect->UpdateDisplay(viewport_size, zero_offset, overflow_y_hidden); | 140 effect.OnFrameUpdated(zero_offset, overflow_y_hidden); |
201 effect->OnScrollBegin(); | 141 effect.OnScrollBegin(); |
202 ASSERT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 142 |
203 EXPECT_FALSE(effect->IsActive()); | 143 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
204 EXPECT_FALSE(effect->IsAwaitingScrollUpdateAck()); | 144 EXPECT_FALSE(effect.IsActive()); |
205 effect->OnScrollUpdateAck(false); | 145 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
206 EXPECT_FALSE(effect->IsActive()); | 146 effect.OnScrollUpdateAck(false); |
207 EXPECT_FALSE(effect->IsAwaitingScrollUpdateAck()); | 147 EXPECT_FALSE(effect.IsActive()); |
208 EXPECT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | 148 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
209 effect->OnScrollEnd(gfx::Vector2dF()); | 149 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); |
210 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 150 effect.OnScrollEnd(gfx::Vector2dF()); |
| 151 EXPECT_FALSE(GetAndResetPullStarted()); |
| 152 EXPECT_FALSE(GetAndResetPullReleased()); |
211 } | 153 } |
212 | 154 |
213 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollDownward) { | 155 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollDownward) { |
214 scoped_ptr<OverscrollRefresh> effect = CreateEffect(); | 156 OverscrollRefresh effect(this); |
215 effect->OnScrollBegin(); | 157 effect.OnScrollBegin(); |
216 | 158 |
217 // A downward initial scroll will prevent activation, even if the subsequent | 159 // A downward initial scroll will prevent activation, even if the subsequent |
218 // scroll overscrolls upward. | 160 // scroll overscrolls upward. |
219 ASSERT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, -10))); | 161 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, -10))); |
220 EXPECT_FALSE(effect->IsActive()); | 162 EXPECT_FALSE(effect.IsActive()); |
221 EXPECT_FALSE(effect->IsAwaitingScrollUpdateAck()); | 163 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
222 | 164 |
223 effect->OnScrollUpdateAck(false); | 165 effect.OnScrollUpdateAck(false); |
224 EXPECT_FALSE(effect->IsActive()); | 166 EXPECT_FALSE(effect.IsActive()); |
225 EXPECT_FALSE(effect->IsAwaitingScrollUpdateAck()); | 167 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
226 EXPECT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | 168 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); |
227 effect->OnScrollEnd(gfx::Vector2dF()); | 169 effect.OnScrollEnd(gfx::Vector2dF()); |
228 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 170 EXPECT_FALSE(GetAndResetPullReleased()); |
229 } | 171 } |
230 | 172 |
231 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollOrTouchConsumed) { | 173 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollOrTouchConsumed) { |
232 scoped_ptr<OverscrollRefresh> effect = CreateEffect(); | 174 OverscrollRefresh effect(this); |
233 effect->OnScrollBegin(); | 175 effect.OnScrollBegin(); |
234 ASSERT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 176 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
235 ASSERT_TRUE(effect->IsAwaitingScrollUpdateAck()); | 177 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
236 | 178 |
237 // Consumption of the initial touchmove or scroll should prevent future | 179 // Consumption of the initial touchmove or scroll should prevent future |
238 // activation. | 180 // activation. |
239 effect->OnScrollUpdateAck(true); | 181 effect.OnScrollUpdateAck(true); |
240 EXPECT_FALSE(effect->IsActive()); | 182 EXPECT_FALSE(effect.IsActive()); |
241 EXPECT_FALSE(effect->IsAwaitingScrollUpdateAck()); | 183 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
242 EXPECT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | 184 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); |
243 effect->OnScrollUpdateAck(false); | 185 effect.OnScrollUpdateAck(false); |
244 EXPECT_FALSE(effect->IsActive()); | 186 EXPECT_FALSE(effect.IsActive()); |
245 EXPECT_FALSE(effect->IsAwaitingScrollUpdateAck()); | 187 EXPECT_FALSE(effect.IsAwaitingScrollUpdateAck()); |
246 EXPECT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | 188 EXPECT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); |
247 effect->OnScrollEnd(gfx::Vector2dF()); | 189 effect.OnScrollEnd(gfx::Vector2dF()); |
248 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 190 EXPECT_FALSE(GetAndResetPullStarted()); |
249 } | 191 EXPECT_FALSE(GetAndResetPullReleased()); |
250 | |
251 TEST_F(OverscrollRefreshTest, NotTriggeredIfInitialScrollsJanked) { | |
252 scoped_ptr<OverscrollRefresh> effect = CreateEffect(); | |
253 effect->OnScrollBegin(); | |
254 ASSERT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | |
255 ASSERT_TRUE(effect->IsAwaitingScrollUpdateAck()); | |
256 effect->OnScrollUpdateAck(false); | |
257 ASSERT_TRUE(effect->IsActive()); | |
258 | |
259 // It should take more than just one or two large scrolls to trigger, | |
260 // mitigating likelihood of jank triggering the effect-> | |
261 EXPECT_TRUE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | |
262 EXPECT_TRUE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 500))); | |
263 effect->OnScrollEnd(gfx::Vector2dF()); | |
264 EXPECT_FALSE(GetAndResetRefreshTriggered()); | |
265 } | 192 } |
266 | 193 |
267 TEST_F(OverscrollRefreshTest, NotTriggeredIfFlungDownward) { | 194 TEST_F(OverscrollRefreshTest, NotTriggeredIfFlungDownward) { |
268 scoped_ptr<OverscrollRefresh> effect = CreateEffect(); | 195 OverscrollRefresh effect(this); |
269 effect->OnScrollBegin(); | 196 effect.OnScrollBegin(); |
270 ASSERT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 197 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
271 ASSERT_TRUE(effect->IsAwaitingScrollUpdateAck()); | 198 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
272 effect->OnScrollUpdateAck(false); | 199 effect.OnScrollUpdateAck(false); |
273 ASSERT_TRUE(effect->IsActive()); | 200 ASSERT_TRUE(effect.IsActive()); |
274 | 201 EXPECT_TRUE(GetAndResetPullStarted()); |
275 // Ensure the pull exceeds the necessary threshold. | |
276 PullBeyondActivationThreshold(effect.get()); | |
277 ASSERT_TRUE(effect->IsActive()); | |
278 | 202 |
279 // Terminating the pull with a down-directed fling should prevent triggering. | 203 // Terminating the pull with a down-directed fling should prevent triggering. |
280 effect->OnScrollEnd(gfx::Vector2dF(0, -1000)); | 204 effect.OnScrollEnd(gfx::Vector2dF(0, -1000)); |
281 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 205 EXPECT_TRUE(GetAndResetPullReleased()); |
| 206 EXPECT_FALSE(GetAndResetRefreshAllowed()); |
282 } | 207 } |
283 | 208 |
284 TEST_F(OverscrollRefreshTest, NotTriggeredIfReleasedWithoutActivation) { | 209 TEST_F(OverscrollRefreshTest, NotTriggeredIfReleasedWithoutActivation) { |
285 scoped_ptr<OverscrollRefresh> effect = CreateEffect(); | 210 OverscrollRefresh effect(this); |
286 effect->OnScrollBegin(); | 211 effect.OnScrollBegin(); |
287 ASSERT_FALSE(effect->WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); | 212 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
288 ASSERT_TRUE(effect->IsAwaitingScrollUpdateAck()); | 213 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
289 effect->OnScrollUpdateAck(false); | 214 effect.OnScrollUpdateAck(false); |
290 ASSERT_TRUE(effect->IsActive()); | 215 ASSERT_TRUE(effect.IsActive()); |
291 | 216 EXPECT_TRUE(GetAndResetPullStarted()); |
292 // Ensure the pull exceeds the necessary threshold. | |
293 PullBeyondActivationThreshold(effect.get()); | |
294 ASSERT_TRUE(effect->IsActive()); | |
295 | 217 |
296 // An early release should prevent the refresh action from firing. | 218 // An early release should prevent the refresh action from firing. |
297 effect->ReleaseWithoutActivation(); | 219 effect.ReleaseWithoutActivation(); |
298 effect->OnScrollEnd(gfx::Vector2dF()); | 220 effect.OnScrollEnd(gfx::Vector2dF()); |
299 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 221 EXPECT_TRUE(GetAndResetPullReleased()); |
300 | 222 EXPECT_FALSE(GetAndResetRefreshAllowed()); |
301 // The early release should trigger a dismissal animation. | 223 } |
302 EXPECT_TRUE(effect->IsActive()); | 224 |
303 base::TimeTicks initial_time = base::TimeTicks::Now(); | 225 TEST_F(OverscrollRefreshTest, NotTriggeredIfReset) { |
304 base::TimeTicks current_time = initial_time; | 226 OverscrollRefresh effect(this); |
305 scoped_refptr<cc::Layer> layer = cc::Layer::Create(); | 227 effect.OnScrollBegin(); |
306 while (effect->Animate(current_time, layer.get())) | 228 ASSERT_FALSE(effect.WillHandleScrollUpdate(gfx::Vector2dF(0, 10))); |
307 current_time += base::TimeDelta::FromMilliseconds(16); | 229 ASSERT_TRUE(effect.IsAwaitingScrollUpdateAck()); |
308 | 230 effect.OnScrollUpdateAck(false); |
309 EXPECT_GT(current_time.ToInternalValue(), initial_time.ToInternalValue()); | 231 ASSERT_TRUE(effect.IsActive()); |
310 EXPECT_FALSE(effect->IsActive()); | 232 EXPECT_TRUE(GetAndResetPullStarted()); |
311 EXPECT_FALSE(GetAndResetRefreshTriggered()); | 233 |
| 234 // An early reset should prevent the refresh action from firing. |
| 235 effect.Reset(); |
| 236 EXPECT_TRUE(GetAndResetPullReset()); |
| 237 effect.OnScrollEnd(gfx::Vector2dF()); |
| 238 EXPECT_FALSE(GetAndResetPullReleased()); |
312 } | 239 } |
313 | 240 |
314 } // namespace content | 241 } // namespace content |
OLD | NEW |