Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(77)

Side by Side Diff: content/browser/android/overscroll_refresh_unittest.cc

Issue 894193005: [Android] Use the platform SwipeRefreshLayout (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW
« no previous file with comments | « content/browser/android/overscroll_refresh.cc ('k') | content/browser/renderer_host/render_widget_host_view_android.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698