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