Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2017 The Chromium Authors |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "content/browser/renderer_host/overscroll_controller.h" |
| 6 | |
| 7 | #include <memory> |
| 8 | |
| 9 | #include "base/containers/queue.h" |
chaopeng | cd44c762 | 2018-04-13 04:08:21 | [diff] [blame] | 10 | #include "base/test/scoped_feature_list.h" |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 11 | #include "content/browser/renderer_host/overscroll_controller_delegate.h" |
Arthur Sonzogni | bdeca8e | 2023-09-11 08:32:12 | [diff] [blame] | 12 | #include "content/common/features.h" |
chaopeng | cd44c762 | 2018-04-13 04:08:21 | [diff] [blame] | 13 | #include "content/public/browser/overscroll_configuration.h" |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 14 | #include "content/public/test/scoped_overscroll_modes.h" |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 15 | #include "content/test/test_overscroll_delegate.h" |
| 16 | #include "testing/gtest/include/gtest/gtest.h" |
Dave Tapuska | 6db16e3 | 2020-06-09 13:58:06 | [diff] [blame] | 17 | #include "third_party/blink/public/common/input/synthetic_web_input_event_builders.h" |
Dave Tapuska | 129cef8 | 2019-12-19 16:36:48 | [diff] [blame] | 18 | #include "third_party/blink/public/common/input/web_input_event.h" |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 19 | |
| 20 | namespace content { |
| 21 | |
| 22 | class OverscrollControllerTest : public ::testing::Test { |
Peter Boström | 9b03653 | 2021-10-28 23:37:28 | [diff] [blame] | 23 | public: |
| 24 | OverscrollControllerTest(const OverscrollControllerTest&) = delete; |
| 25 | OverscrollControllerTest& operator=(const OverscrollControllerTest&) = delete; |
| 26 | |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 27 | protected: |
| 28 | OverscrollControllerTest() {} |
| 29 | ~OverscrollControllerTest() override {} |
| 30 | |
| 31 | void SetUp() override { |
chaopeng | cd44c762 | 2018-04-13 04:08:21 | [diff] [blame] | 32 | OverscrollConfig::ResetTouchpadOverscrollHistoryNavigationEnabled(); |
| 33 | scoped_feature_list_.InitAndEnableFeature( |
| 34 | features::kTouchpadOverscrollHistoryNavigation); |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 35 | delegate_ = std::make_unique<TestOverscrollDelegate>(gfx::Size(400, 300)); |
| 36 | controller_ = std::make_unique<OverscrollController>(); |
Robert Flack | c367019 | 2021-03-30 16:18:09 | [diff] [blame] | 37 | controller_->set_delegate(delegate_->GetWeakPtr()); |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 38 | } |
| 39 | |
| 40 | void TearDown() override { |
| 41 | controller_ = nullptr; |
| 42 | delegate_ = nullptr; |
| 43 | } |
| 44 | |
| 45 | // Creates and sends a mouse-wheel event to the overscroll controller. Returns |
| 46 | // |true| if the event is consumed by the overscroll controller. |
| 47 | bool SimulateMouseWheel(float dx, float dy) { |
| 48 | DCHECK(!current_event_); |
| 49 | current_event_ = std::make_unique<blink::WebMouseWheelEvent>( |
Dave Tapuska | 6db16e3 | 2020-06-09 13:58:06 | [diff] [blame] | 50 | blink::SyntheticWebMouseWheelEventBuilder::Build( |
Mohsen Izadi | ffcbc61f1 | 2020-02-09 06:31:27 | [diff] [blame] | 51 | 0, 0, dx, dy, 0, ui::ScrollGranularity::kScrollByPrecisePixel)); |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 52 | return controller_->WillHandleEvent(*current_event_); |
| 53 | } |
| 54 | |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 55 | // Creates and sends a gesture event to the overscroll controller. Returns |
| 56 | // |true| if the event is consumed by the overscroll controller. |
| 57 | bool SimulateGestureEvent(blink::WebInputEvent::Type type, |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 58 | blink::WebGestureDevice source_device, |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 59 | base::TimeTicks timestamp) { |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 60 | DCHECK(!current_event_); |
| 61 | current_event_ = std::make_unique<blink::WebGestureEvent>( |
Dave Tapuska | 6db16e3 | 2020-06-09 13:58:06 | [diff] [blame] | 62 | blink::SyntheticWebGestureEventBuilder::Build(type, source_device)); |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 63 | current_event_->SetTimeStamp(timestamp); |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 64 | return controller_->WillHandleEvent(*current_event_); |
| 65 | } |
| 66 | |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 67 | // Creates and sends a gesture-scroll-update event to the overscroll |
| 68 | // controller. Returns |true| if the event is consumed by the overscroll |
| 69 | // controller. |
| 70 | bool SimulateGestureScrollUpdate(float dx, |
| 71 | float dy, |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 72 | blink::WebGestureDevice device, |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 73 | base::TimeTicks timestamp, |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 74 | bool inertial_update) { |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 75 | DCHECK(!current_event_); |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 76 | auto event = std::make_unique<blink::WebGestureEvent>( |
Dave Tapuska | 6db16e3 | 2020-06-09 13:58:06 | [diff] [blame] | 77 | blink::SyntheticWebGestureEventBuilder::BuildScrollUpdate(dx, dy, 0, |
| 78 | device)); |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 79 | event->SetTimeStamp(timestamp); |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 80 | if (inertial_update) { |
| 81 | event->data.scroll_update.inertial_phase = |
Daniel Libby | 6ce6b95a | 2019-05-10 17:06:26 | [diff] [blame] | 82 | blink::WebGestureEvent::InertialPhaseState::kMomentum; |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 83 | } |
| 84 | current_event_ = std::move(event); |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 85 | return controller_->WillHandleEvent(*current_event_); |
| 86 | } |
| 87 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 88 | // Creates and sends a gesture-fling-start event to the overscroll controller. |
| 89 | // Returns |true| if the event is consumed by the overscroll controller. |
| 90 | bool SimulateGestureFlingStart(float velocity_x, |
| 91 | float velocity_y, |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 92 | blink::WebGestureDevice device, |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 93 | base::TimeTicks timestamp) { |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 94 | DCHECK(!current_event_); |
| 95 | current_event_ = std::make_unique<blink::WebGestureEvent>( |
Dave Tapuska | 6db16e3 | 2020-06-09 13:58:06 | [diff] [blame] | 96 | blink::SyntheticWebGestureEventBuilder::BuildFling(velocity_x, |
| 97 | velocity_y, device)); |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 98 | current_event_->SetTimeStamp(timestamp); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 99 | return controller_->WillHandleEvent(*current_event_); |
| 100 | } |
| 101 | |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 102 | // Notifies the overscroll controller that the current event is ACKed. |
| 103 | void SimulateAck(bool processed) { |
| 104 | DCHECK(current_event_); |
| 105 | controller_->ReceivedEventACK(*current_event_, processed); |
| 106 | current_event_ = nullptr; |
| 107 | } |
| 108 | |
| 109 | TestOverscrollDelegate* delegate() const { return delegate_.get(); } |
| 110 | |
| 111 | OverscrollMode controller_mode() const { |
| 112 | return controller_->overscroll_mode_; |
| 113 | } |
| 114 | |
| 115 | OverscrollSource controller_source() const { |
| 116 | return controller_->overscroll_source_; |
| 117 | } |
| 118 | |
| 119 | private: |
| 120 | std::unique_ptr<TestOverscrollDelegate> delegate_; |
| 121 | std::unique_ptr<OverscrollController> controller_; |
| 122 | |
| 123 | // Keeps track of the last event that has been processed by the overscroll |
| 124 | // controller which is not yet ACKed. Will be null if no event is processed or |
| 125 | // the last event is ACKed. |
| 126 | std::unique_ptr<blink::WebInputEvent> current_event_; |
| 127 | |
chaopeng | cd44c762 | 2018-04-13 04:08:21 | [diff] [blame] | 128 | base::test::ScopedFeatureList scoped_feature_list_; |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 129 | }; |
| 130 | |
| 131 | // Tests that if a mouse-wheel is consumed by content before overscroll is |
| 132 | // initiated, overscroll will not initiate anymore. |
| 133 | TEST_F(OverscrollControllerTest, MouseWheelConsumedPreventsOverscroll) { |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 134 | const base::TimeTicks timestamp = |
| 135 | blink::WebInputEvent::GetStaticTimeStampForTests(); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 136 | |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 137 | // Simulate a mouse-wheel, ACK it as not processed, simulate the corresponding |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 138 | // gesture scroll-update event, and ACK it as not processed. Since it is not |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 139 | // passing the start threshold, no overscroll should happen. |
| 140 | EXPECT_FALSE(SimulateMouseWheel(10, 0)); |
| 141 | SimulateAck(false); |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 142 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 143 | 10, 0, blink::WebGestureDevice::kTouchpad, timestamp, false)); |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 144 | SimulateAck(false); |
| 145 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 146 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 147 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 148 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 149 | |
| 150 | // Simulate a mouse-wheel and ACK it as processed. No gesture scroll-update |
| 151 | // needs to be simulated. Still no overscroll. |
| 152 | EXPECT_FALSE(SimulateMouseWheel(10, 0)); |
| 153 | SimulateAck(true); |
| 154 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 155 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 156 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 157 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 158 | |
| 159 | // Simulate a mouse-wheel and the corresponding gesture scroll-update both |
| 160 | // ACKed as not processed. Although the scroll passes overscroll start |
| 161 | // threshold, no overscroll should happen since the previous mouse-wheel was |
| 162 | // marked as processed. |
| 163 | EXPECT_FALSE(SimulateMouseWheel(100, 0)); |
| 164 | SimulateAck(false); |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 165 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 166 | 100, 0, blink::WebGestureDevice::kTouchpad, timestamp, false)); |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 167 | SimulateAck(false); |
| 168 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 169 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 170 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 171 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 172 | } |
| 173 | |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 174 | // Verifying the inertial scroll event completes overscroll. After that we will |
| 175 | // ignore the following inertial scroll events until new sequence start. |
| 176 | TEST_F(OverscrollControllerTest, |
| 177 | InertialGestureScrollUpdateCompletesOverscroll) { |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 178 | const base::TimeTicks timestamp = |
| 179 | blink::WebInputEvent::GetStaticTimeStampForTests(); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 180 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 181 | EXPECT_FALSE( |
| 182 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 183 | blink::WebGestureDevice::kTouchpad, timestamp)); |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 184 | SimulateAck(false); |
| 185 | |
| 186 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 187 | 200, 0, blink::WebGestureDevice::kTouchpad, timestamp, false)); |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 188 | SimulateAck(false); |
| 189 | EXPECT_EQ(OVERSCROLL_EAST, controller_mode()); |
| 190 | EXPECT_EQ(OverscrollSource::TOUCHPAD, controller_source()); |
| 191 | EXPECT_EQ(OVERSCROLL_EAST, delegate()->current_mode()); |
| 192 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 193 | |
| 194 | // Inertial update event complete the overscroll action. |
| 195 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 196 | 100, 0, blink::WebGestureDevice::kTouchpad, timestamp, true)); |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 197 | SimulateAck(false); |
chaopeng | a7585d79 | 2018-04-10 18:02:38 | [diff] [blame] | 198 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 199 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 200 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 201 | EXPECT_EQ(OVERSCROLL_EAST, delegate()->completed_mode()); |
| 202 | |
| 203 | // Next Inertial update event would be consumed by overscroll controller. |
| 204 | EXPECT_TRUE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 205 | 100, 0, blink::WebGestureDevice::kTouchpad, timestamp, true)); |
chaopeng | 1d469b0 | 2018-04-05 15:41:07 | [diff] [blame] | 206 | } |
| 207 | |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 208 | // Ensure inertial gesture scroll update can not start overscroll. |
| 209 | TEST_F(OverscrollControllerTest, InertialGSUsDoNotStartOverscroll) { |
| 210 | base::TimeTicks timestamp = |
| 211 | blink::WebInputEvent::GetStaticTimeStampForTests(); |
| 212 | // Inertial update event complete the overscroll action. |
| 213 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 214 | 100, 0, blink::WebGestureDevice::kTouchpad, timestamp, true)); |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 215 | SimulateAck(false); |
| 216 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 217 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 218 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 219 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 220 | } |
| 221 | |
| 222 | // After 300ms inertial gesture scroll updates, overscroll must get cancelled |
| 223 | // if not completed. |
| 224 | TEST_F(OverscrollControllerTest, OnlyProcessLimitedInertialGSUEvents) { |
| 225 | base::TimeTicks timestamp = |
| 226 | blink::WebInputEvent::GetStaticTimeStampForTests(); |
| 227 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 228 | EXPECT_FALSE( |
| 229 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 230 | blink::WebGestureDevice::kTouchpad, timestamp)); |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 231 | SimulateAck(false); |
| 232 | |
| 233 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 234 | 61, 0, blink::WebGestureDevice::kTouchpad, timestamp, false)); |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 235 | SimulateAck(false); |
| 236 | EXPECT_EQ(OVERSCROLL_EAST, controller_mode()); |
| 237 | EXPECT_EQ(OverscrollSource::TOUCHPAD, controller_source()); |
| 238 | EXPECT_EQ(OVERSCROLL_EAST, delegate()->current_mode()); |
| 239 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 240 | |
| 241 | // First inertial. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 242 | timestamp += base::Seconds(1); |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 243 | EXPECT_TRUE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 244 | 1, 0, blink::WebGestureDevice::kTouchpad, timestamp, true)); |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 245 | SimulateAck(true); |
| 246 | EXPECT_EQ(OVERSCROLL_EAST, controller_mode()); |
| 247 | EXPECT_EQ(OverscrollSource::TOUCHPAD, controller_source()); |
| 248 | EXPECT_EQ(OVERSCROLL_EAST, delegate()->current_mode()); |
| 249 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 250 | |
| 251 | // Not cancel in 10ms. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 252 | timestamp += base::Milliseconds(10); |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 253 | EXPECT_TRUE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 254 | 1, 0, blink::WebGestureDevice::kTouchpad, timestamp, true)); |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 255 | SimulateAck(true); |
| 256 | EXPECT_EQ(OVERSCROLL_EAST, controller_mode()); |
| 257 | EXPECT_EQ(OverscrollSource::TOUCHPAD, controller_source()); |
| 258 | EXPECT_EQ(OVERSCROLL_EAST, delegate()->current_mode()); |
| 259 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 260 | |
| 261 | // Cancel after 300ms. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 262 | timestamp += base::Milliseconds(291); |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 263 | EXPECT_TRUE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 264 | 1, 0, blink::WebGestureDevice::kTouchpad, timestamp, true)); |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 265 | SimulateAck(true); |
| 266 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 267 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 268 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 269 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 270 | |
| 271 | // Next event should be ignored. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 272 | timestamp += base::Milliseconds(100); |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 273 | EXPECT_TRUE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 274 | 1, 0, blink::WebGestureDevice::kTouchpad, timestamp, true)); |
chaopeng | 9736c52 | 2018-05-08 18:32:27 | [diff] [blame] | 275 | } |
| 276 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 277 | // Verifies that when pull-to-refresh is disabled, it is not triggered for |
| 278 | // neither touchpad nor touchscreen. |
| 279 | TEST_F(OverscrollControllerTest, PullToRefreshDisabled) { |
| 280 | ScopedPullToRefreshMode scoped_mode( |
| 281 | OverscrollConfig::PullToRefreshMode::kDisabled); |
| 282 | |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 283 | base::TimeTicks timestamp = |
| 284 | blink::WebInputEvent::GetStaticTimeStampForTests(); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 285 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 286 | EXPECT_FALSE( |
| 287 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 288 | blink::WebGestureDevice::kTouchpad, timestamp)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 289 | SimulateAck(false); |
| 290 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 291 | // Simulate a touchpad gesture scroll-update event that passes the start |
| 292 | // threshold and ACK it as not processed. Pull-to-refresh should not be |
| 293 | // triggered. |
| 294 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 295 | 0, 80, blink::WebGestureDevice::kTouchpad, timestamp, false)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 296 | SimulateAck(false); |
| 297 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 298 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 299 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 300 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 301 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 302 | timestamp += base::Seconds(1); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 303 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 304 | // Simulate a touchpad zero-velocity fling-start which would normally end |
| 305 | // pull-to-refresh, and ACK it as not processed. Nothing should happen. |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 306 | EXPECT_FALSE(SimulateGestureFlingStart( |
| 307 | 0, 0, blink::WebGestureDevice::kTouchpad, timestamp)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 308 | SimulateAck(false); |
| 309 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 310 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 311 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 312 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 313 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 314 | timestamp += base::Seconds(1); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 315 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 316 | EXPECT_FALSE( |
| 317 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 318 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 319 | SimulateAck(false); |
| 320 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 321 | // Simulate a touchscreen gesture scroll-update event that passes the start |
| 322 | // threshold and ACK it as not processed. Pull-to-refresh should not be |
| 323 | // triggered. |
| 324 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 325 | 0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 326 | SimulateAck(false); |
| 327 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 328 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 329 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 330 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 331 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 332 | timestamp += base::Seconds(1); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 333 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 334 | // Simulate a touchscreen gesture scroll-end which would normally end |
| 335 | // pull-to-refresh, and ACK it as not processed. Nothing should happen. |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 336 | EXPECT_FALSE( |
| 337 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd, |
| 338 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 339 | SimulateAck(false); |
| 340 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 341 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 342 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 343 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 344 | } |
| 345 | |
| 346 | // Verifies that when pull-to-refresh is enabled, it is triggered for both |
| 347 | // touchpad and touchscreen. |
| 348 | TEST_F(OverscrollControllerTest, PullToRefreshEnabled) { |
| 349 | ScopedPullToRefreshMode scoped_mode( |
| 350 | OverscrollConfig::PullToRefreshMode::kEnabled); |
| 351 | |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 352 | base::TimeTicks timestamp = |
| 353 | blink::WebInputEvent::GetStaticTimeStampForTests(); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 354 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 355 | EXPECT_FALSE( |
| 356 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 357 | blink::WebGestureDevice::kTouchpad, timestamp)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 358 | SimulateAck(false); |
| 359 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 360 | // Simulate a touchpad gesture scroll-update event that passes the start |
| 361 | // threshold and ACK it as not processed. Pull-to-refresh should be triggered. |
| 362 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 363 | 0, 80, blink::WebGestureDevice::kTouchpad, timestamp, false)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 364 | SimulateAck(false); |
| 365 | EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode()); |
| 366 | EXPECT_EQ(OverscrollSource::TOUCHPAD, controller_source()); |
| 367 | EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode()); |
| 368 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 369 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 370 | timestamp += base::Seconds(1); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 371 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 372 | // Simulate a touchpad zero-velocity fling-start and ACK it as not processed.. |
| 373 | // It should abort pull-to-refresh. |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 374 | EXPECT_FALSE(SimulateGestureFlingStart( |
| 375 | 0, 0, blink::WebGestureDevice::kTouchpad, timestamp)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 376 | SimulateAck(false); |
| 377 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 378 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 379 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 380 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 381 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 382 | timestamp += base::Seconds(1); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 383 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 384 | EXPECT_FALSE( |
| 385 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 386 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 387 | SimulateAck(false); |
| 388 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 389 | // Simulate a touchscreen gesture scroll-update event that passes the start |
| 390 | // threshold and ACK it as not processed. Pull-to-refresh should be triggered. |
| 391 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 392 | 0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 393 | SimulateAck(false); |
| 394 | EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode()); |
| 395 | EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source()); |
| 396 | EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode()); |
| 397 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 398 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 399 | timestamp += base::Seconds(1); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 400 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 401 | // Simulate a touchscreen gesture scroll-end and ACK it as not processed. It |
| 402 | // should abort pull-to-refresh. |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 403 | EXPECT_FALSE( |
| 404 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd, |
| 405 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 406 | SimulateAck(false); |
| 407 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 408 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 409 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 410 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 411 | } |
| 412 | |
| 413 | // Verifies that when pull-to-refresh is enabled only for touchscreen, it is |
| 414 | // triggered for touchscreen but not for touchpad. |
| 415 | TEST_F(OverscrollControllerTest, PullToRefreshEnabledTouchscreen) { |
| 416 | ScopedPullToRefreshMode scoped_mode( |
| 417 | OverscrollConfig::PullToRefreshMode::kEnabledTouchschreen); |
| 418 | |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 419 | base::TimeTicks timestamp = |
| 420 | blink::WebInputEvent::GetStaticTimeStampForTests(); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 421 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 422 | EXPECT_FALSE( |
| 423 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 424 | blink::WebGestureDevice::kTouchpad, timestamp)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 425 | SimulateAck(false); |
| 426 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 427 | // Simulate a touchpad gesture scroll-update event that passes the start |
| 428 | // threshold and ACK it as not processed. Pull-to-refresh should not be |
| 429 | // triggered. |
| 430 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 431 | 0, 80, blink::WebGestureDevice::kTouchpad, timestamp, false)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 432 | SimulateAck(false); |
| 433 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 434 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 435 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 436 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 437 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 438 | timestamp += base::Seconds(1); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 439 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 440 | // Simulate a touchpad zero-velocity fling-start which would normally end |
| 441 | // pull-to-refresh, and ACK it as not processed. Nothing should happen. |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 442 | EXPECT_FALSE(SimulateGestureFlingStart( |
| 443 | 0, 0, blink::WebGestureDevice::kTouchpad, timestamp)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 444 | SimulateAck(false); |
| 445 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 446 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 447 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 448 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 449 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 450 | timestamp += base::Seconds(1); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 451 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 452 | EXPECT_FALSE( |
| 453 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 454 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 455 | SimulateAck(false); |
| 456 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 457 | // Simulate a touchscreen gesture scroll-update event that passes the start |
| 458 | // threshold and ACK it as not processed. Pull-to-refresh should be triggered. |
| 459 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 460 | 0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 461 | SimulateAck(false); |
| 462 | EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode()); |
| 463 | EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source()); |
| 464 | EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode()); |
| 465 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 466 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 467 | timestamp += base::Seconds(1); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 468 | |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 469 | // Simulate a touchscreen gesture scroll-end and ACK it as not processed. It |
| 470 | // should abort pull-to-refresh. |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 471 | EXPECT_FALSE( |
| 472 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd, |
| 473 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8c59ba5 | 2018-04-12 18:52:01 | [diff] [blame] | 474 | SimulateAck(false); |
| 475 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 476 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 477 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 478 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 479 | } |
| 480 | |
chaopeng | cd44c762 | 2018-04-13 04:08:21 | [diff] [blame] | 481 | // Ensure disabling kTouchpadOverscrollHistoryNavigation will prevent overscroll |
| 482 | // from touchpad. |
| 483 | TEST_F(OverscrollControllerTest, DisableTouchpadOverscrollHistoryNavigation) { |
| 484 | base::test::ScopedFeatureList feature_list; |
| 485 | feature_list.InitAndDisableFeature( |
| 486 | features::kTouchpadOverscrollHistoryNavigation); |
| 487 | ASSERT_FALSE(OverscrollConfig::TouchpadOverscrollHistoryNavigationEnabled()); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 488 | |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 489 | const base::TimeTicks timestamp = |
| 490 | blink::WebInputEvent::GetStaticTimeStampForTests(); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 491 | |
chaopeng | cd44c762 | 2018-04-13 04:08:21 | [diff] [blame] | 492 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 493 | 200, 0, blink::WebGestureDevice::kTouchpad, timestamp, false)); |
chaopeng | cd44c762 | 2018-04-13 04:08:21 | [diff] [blame] | 494 | SimulateAck(false); |
| 495 | |
| 496 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 497 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 498 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 499 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 500 | } |
| 501 | |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 502 | // Verifies that if an overscroll happens before cool off period after a page |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 503 | // scroll, it does not trigger pull-to-refresh. Verifies following sequence of |
| 504 | // scrolls: |
| 505 | // 1) Page scroll; |
| 506 | // 2) Scroll before cool off -> PTR not triggered; |
| 507 | // 3) Scroll before cool off -> PTR not triggered; |
| 508 | // 4) Scroll after cool off -> PTR triggered; |
| 509 | // 5) Scroll before cool off -> PTR triggered. |
| 510 | TEST_F(OverscrollControllerTest, PullToRefreshBeforeCoolOff) { |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 511 | ScopedPullToRefreshMode scoped_mode( |
| 512 | OverscrollConfig::PullToRefreshMode::kEnabled); |
| 513 | |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 514 | // 1) Page scroll. |
Daniel Cheng | 224569ee | 2018-04-25 05:45:06 | [diff] [blame] | 515 | base::TimeTicks timestamp = |
| 516 | blink::WebInputEvent::GetStaticTimeStampForTests(); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 517 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 518 | EXPECT_FALSE( |
| 519 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 520 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 521 | SimulateAck(false); |
| 522 | |
| 523 | // Simulate a touchscreen gesture scroll-update event that passes the start |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 524 | // threshold and ACK it as processed. Pull-to-refresh should not be triggered. |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 525 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 526 | 0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 527 | SimulateAck(true); |
| 528 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 529 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 530 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 531 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 532 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 533 | timestamp += base::Seconds(1); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 534 | |
| 535 | // Simulate a touchscreen gesture scroll-end which would normally end |
| 536 | // pull-to-refresh, and ACK it as not processed. Nothing should happen. |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 537 | EXPECT_FALSE( |
| 538 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd, |
| 539 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 540 | SimulateAck(false); |
| 541 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 542 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 543 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 544 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 545 | |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 546 | // 2) Scroll before cool off -> PTR not triggered. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 547 | timestamp += base::Milliseconds(500); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 548 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 549 | EXPECT_FALSE( |
| 550 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 551 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 552 | SimulateAck(false); |
| 553 | |
| 554 | // Simulate a touchscreen gesture scroll-update event that passes the start |
| 555 | // threshold and ACK it as not processed. Pull-to-refresh should not be |
| 556 | // triggered. |
| 557 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 558 | 0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 559 | SimulateAck(false); |
| 560 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 561 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 562 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 563 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 564 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 565 | timestamp += base::Seconds(1); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 566 | |
| 567 | // Simulate a touchscreen gesture scroll-end which would normally end |
| 568 | // pull-to-refresh, and ACK it as not processed. Nothing should happen. |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 569 | EXPECT_FALSE( |
| 570 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd, |
| 571 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 572 | SimulateAck(false); |
| 573 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 574 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 575 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 576 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 577 | |
| 578 | // 3) Scroll before cool off -> PTR not triggered. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 579 | timestamp += base::Milliseconds(500); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 580 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 581 | EXPECT_FALSE( |
| 582 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 583 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 584 | SimulateAck(false); |
| 585 | |
| 586 | // Simulate a touchscreen gesture scroll-update event that passes the start |
| 587 | // threshold and ACK it as not processed. Pull-to-refresh should not be |
| 588 | // triggered. |
| 589 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 590 | 0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 591 | SimulateAck(false); |
| 592 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 593 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 594 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 595 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 596 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 597 | timestamp += base::Seconds(1); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 598 | |
| 599 | // Simulate a touchscreen gesture scroll-end which would normally end |
| 600 | // pull-to-refresh, and ACK it as not processed. Nothing should happen. |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 601 | EXPECT_FALSE( |
| 602 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd, |
| 603 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 604 | SimulateAck(false); |
| 605 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 606 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 607 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 608 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 609 | |
| 610 | // 4) Scroll after cool off -> PTR triggered. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 611 | timestamp += base::Seconds(1); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 612 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 613 | EXPECT_FALSE( |
| 614 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 615 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 616 | SimulateAck(false); |
| 617 | |
| 618 | // Simulate a touchscreen gesture scroll-update event that passes the start |
| 619 | // threshold and ACK it as not processed. Pull-to-refresh should be triggered. |
| 620 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 621 | 0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 622 | SimulateAck(false); |
| 623 | EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode()); |
| 624 | EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source()); |
| 625 | EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode()); |
| 626 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 627 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 628 | timestamp += base::Seconds(1); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 629 | |
| 630 | // Simulate a touchscreen gesture scroll-end which will end pull-to-refresh, |
| 631 | // and ACK it as not processed. Pull-to-refresh should be aborted. |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 632 | EXPECT_FALSE( |
| 633 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd, |
| 634 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 635 | SimulateAck(false); |
| 636 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 637 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 638 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 639 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 640 | |
| 641 | // 5) Scroll before cool off -> PTR triggered. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 642 | timestamp += base::Milliseconds(500); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 643 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 644 | EXPECT_FALSE( |
| 645 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 646 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 647 | SimulateAck(false); |
| 648 | |
| 649 | // Simulate a touchscreen gesture scroll-update event that passes the start |
| 650 | // threshold and ACK it as not processed. Pull-to-refresh should be triggered. |
| 651 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 652 | 0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 653 | SimulateAck(false); |
| 654 | EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode()); |
| 655 | EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source()); |
| 656 | EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode()); |
| 657 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 658 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 659 | timestamp += base::Seconds(1); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 660 | |
| 661 | // Simulate a touchscreen gesture scroll-end which will end pull-to-refresh, |
| 662 | // and ACK it as not processed. Pull-to-refresh should be aborted. |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 663 | EXPECT_FALSE( |
| 664 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd, |
| 665 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 666 | SimulateAck(false); |
| 667 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 668 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 669 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 670 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 671 | } |
| 672 | |
| 673 | // Verifies that if an overscroll happens after cool off period after a page |
| 674 | // scroll, it triggers pull-to-refresh. Verifies the following sequence of |
| 675 | // scrolls: |
| 676 | // 1) Page scroll; |
| 677 | // 2) Scroll after cool off -> PTR triggered; |
| 678 | // 3) Scroll before cool off -> PTR triggered; |
| 679 | TEST_F(OverscrollControllerTest, PullToRefreshAfterCoolOff) { |
| 680 | ScopedPullToRefreshMode scoped_mode( |
| 681 | OverscrollConfig::PullToRefreshMode::kEnabled); |
| 682 | |
| 683 | // 1) Page scroll. |
| 684 | base::TimeTicks timestamp = |
| 685 | blink::WebInputEvent::GetStaticTimeStampForTests(); |
| 686 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 687 | EXPECT_FALSE( |
| 688 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 689 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 690 | SimulateAck(false); |
| 691 | |
| 692 | // Simulate a touchscreen gesture scroll-update event that passes the start |
| 693 | // threshold and ACK it as processed. Pull-to-refresh should not be triggered. |
| 694 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 695 | 0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 696 | SimulateAck(true); |
| 697 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 698 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 699 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 700 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 701 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 702 | timestamp += base::Seconds(1); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 703 | |
| 704 | // Simulate a touchscreen gesture scroll-end which would normally end |
| 705 | // pull-to-refresh, and ACK it as not processed. Nothing should happen. |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 706 | EXPECT_FALSE( |
| 707 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd, |
| 708 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 709 | SimulateAck(false); |
| 710 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 711 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 712 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 713 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 714 | |
| 715 | // 2) Scroll after cool off -> PTR triggered. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 716 | timestamp += base::Seconds(1); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 717 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 718 | EXPECT_FALSE( |
| 719 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 720 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 721 | SimulateAck(false); |
| 722 | |
| 723 | // Simulate a touchscreen gesture scroll-update event that passes the start |
| 724 | // threshold and ACK it as not processed. Pull-to-refresh should be triggered. |
| 725 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 726 | 0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 727 | SimulateAck(false); |
| 728 | EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode()); |
| 729 | EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source()); |
| 730 | EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode()); |
| 731 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 732 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 733 | timestamp += base::Seconds(1); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 734 | |
| 735 | // Simulate a touchscreen gesture scroll-end which will end pull-to-refresh, |
| 736 | // and ACK it as not processed. Pull-to-refresh should be aborted. |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 737 | EXPECT_FALSE( |
| 738 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd, |
| 739 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 740 | SimulateAck(false); |
| 741 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 742 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 743 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 744 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 745 | |
| 746 | // 3) Scroll before cool off -> PTR triggered. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 747 | timestamp += base::Milliseconds(500); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 748 | |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 749 | EXPECT_FALSE( |
| 750 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollBegin, |
| 751 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 752 | SimulateAck(false); |
| 753 | |
| 754 | // Simulate a touchscreen gesture scroll-update event that passes the start |
| 755 | // threshold and ACK it as not processed. Pull-to-refresh should be triggered. |
| 756 | EXPECT_FALSE(SimulateGestureScrollUpdate( |
Daniel Cheng | 7f9ec90 | 2019-04-18 05:07:00 | [diff] [blame] | 757 | 0, 80, blink::WebGestureDevice::kTouchscreen, timestamp, false)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 758 | SimulateAck(false); |
| 759 | EXPECT_EQ(OVERSCROLL_SOUTH, controller_mode()); |
| 760 | EXPECT_EQ(OverscrollSource::TOUCHSCREEN, controller_source()); |
| 761 | EXPECT_EQ(OVERSCROLL_SOUTH, delegate()->current_mode()); |
| 762 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
| 763 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 764 | timestamp += base::Seconds(1); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 765 | |
| 766 | // Simulate a touchscreen gesture scroll-end which will end pull-to-refresh, |
| 767 | // and ACK it as not processed. Pull-to-refresh should be aborted. |
Dave Tapuska | 347d60a | 2020-04-21 23:55:47 | [diff] [blame] | 768 | EXPECT_FALSE( |
| 769 | SimulateGestureEvent(blink::WebInputEvent::Type::kGestureScrollEnd, |
| 770 | blink::WebGestureDevice::kTouchscreen, timestamp)); |
Mohsen Izadi | 8f43c2c5 | 2018-10-09 17:17:11 | [diff] [blame] | 771 | SimulateAck(false); |
| 772 | EXPECT_EQ(OVERSCROLL_NONE, controller_mode()); |
| 773 | EXPECT_EQ(OverscrollSource::NONE, controller_source()); |
| 774 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->current_mode()); |
| 775 | EXPECT_EQ(OVERSCROLL_NONE, delegate()->completed_mode()); |
Mohsen Izadi | 5a658351 | 2018-04-23 18:31:19 | [diff] [blame] | 776 | } |
| 777 | |
Mohsen Izadi | 9830436c | 2017-12-21 18:02:46 | [diff] [blame] | 778 | } // namespace content |