| 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 |