Index: content/browser/renderer_host/render_widget_host_unittest.cc |
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc |
index 60360caeecf3d95d39187272cdb110f3be5d7ddf..fd0be0a8a206fb87e0bd70e46eaa564b470f8f01 100644 |
--- a/content/browser/renderer_host/render_widget_host_unittest.cc |
+++ b/content/browser/renderer_host/render_widget_host_unittest.cc |
@@ -3126,9 +3126,9 @@ TEST_F(RenderWidgetHostTest, WheelScrollEventOverscrolls) { |
EXPECT_EQ(1U, process_->sink().message_count()); |
process_->sink().ClearMessages(); |
- // Receive ACK the first wheel event as processed. |
+ // Receive ACK the first wheel event as not processed. |
SendInputEventACK(WebInputEvent::MouseWheel, |
- INPUT_EVENT_ACK_STATE_CONSUMED); |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode()); |
EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode()); |
EXPECT_EQ(1U, process_->sink().message_count()); |
@@ -3155,6 +3155,75 @@ TEST_F(RenderWidgetHostTest, WheelScrollEventOverscrolls) { |
EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode()); |
} |
+// Tests that if some scroll events are consumed towards the start, then |
+// subsequent scrolls do not overscroll. |
+TEST_F(RenderWidgetHostTest, WheelScrollConsumedDoNotOverscroll) { |
+ host_->SetupForOverscrollControllerTest(); |
+ process_->sink().ClearMessages(); |
+ |
+ // Simulate wheel events. |
+ SimulateWheelEvent(0, -5, 0, true); // sent directly |
+ SimulateWheelEvent(0, -1, 0, true); // enqueued |
+ SimulateWheelEvent(-10, -3, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-15, -1, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-30, -3, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-20, 6, 1, true); // enqueued, different modifiers |
+ EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode()); |
+ EXPECT_EQ(1U, process_->sink().message_count()); |
+ process_->sink().ClearMessages(); |
+ |
+ // Receive ACK the first wheel event as processed. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, process_->sink().message_count()); |
+ process_->sink().ClearMessages(); |
+ |
+ // Receive ACK for the second (coalesced) event as not processed. This should |
+ // not initiate overscroll, since the beginning of the scroll has been |
+ // consumed. The queued event with different modifiers should be sent to the |
+ // renderer. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode()); |
+ EXPECT_EQ(1U, process_->sink().message_count()); |
+ |
+ process_->sink().ClearMessages(); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(0U, process_->sink().message_count()); |
+ EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode()); |
+ |
+ // Indicate the end of the scrolling from the touchpad. |
+ SimulateGestureFlingStartEvent(-1200.f, 0.f, WebGestureEvent::Touchpad); |
+ EXPECT_EQ(1U, process_->sink().message_count()); |
+ |
+ // Start another scroll. This time, do not consume any scroll events. |
+ process_->sink().ClearMessages(); |
+ SimulateWheelEvent(0, -5, 0, true); // sent directly |
+ SimulateWheelEvent(0, -1, 0, true); // enqueued |
+ SimulateWheelEvent(-10, -3, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-15, -1, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-30, -3, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-20, 6, 1, true); // enqueued, different modifiers |
+ EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode()); |
+ EXPECT_EQ(1U, process_->sink().message_count()); |
+ process_->sink().ClearMessages(); |
+ |
+ // Receive ACK for the first wheel and the subsequent coalesced event as not |
+ // processed. This should start a back-overscroll. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, process_->sink().message_count()); |
+ process_->sink().ClearMessages(); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_WEST, host_->overscroll_mode()); |
+} |
+ |
// Tests that wheel-scrolling correctly turns overscroll on and off. |
TEST_F(RenderWidgetHostTest, WheelScrollOverscrollToggle) { |
host_->SetupForOverscrollControllerTest(); |
@@ -3374,13 +3443,8 @@ TEST_F(RenderWidgetHostTest, GestureScrollOverscrolls) { |
SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
WebGestureEvent::Touchscreen); |
- SimulateGestureScrollUpdateEvent(8, -5, 0); |
- |
- // ACK both events as being processed. |
SendInputEventACK(WebInputEvent::GestureScrollBegin, |
- INPUT_EVENT_ACK_STATE_CONSUMED); |
- SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
- INPUT_EVENT_ACK_STATE_CONSUMED); |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode()); |
EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode()); |
@@ -3422,6 +3486,36 @@ TEST_F(RenderWidgetHostTest, GestureScrollOverscrolls) { |
EXPECT_EQ(1U, host_->GestureEventLastQueueEventSize()); |
} |
+// Tests that if the page is scrolled because of a scroll-gesture, then that |
+// particular scroll sequence never generates overscroll, even if there is no |
+// content to scroll on the page anymore. |
+TEST_F(RenderWidgetHostTest, GestureScrollConsumedDoNotOverscroll) { |
+ // Turn off debounce handling for test isolation. |
+ host_->SetupForOverscrollControllerTest(); |
+ host_->set_debounce_interval_time_ms(0); |
+ process_->sink().ClearMessages(); |
+ |
+ SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
+ WebGestureEvent::Touchscreen); |
+ SimulateGestureScrollUpdateEvent(8, -5, 0); |
+ |
+ // ACK both events as being processed. |
+ SendInputEventACK(WebInputEvent::GestureScrollBegin, |
+ INPUT_EVENT_ACK_STATE_CONSUMED); |
+ SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_delegate()->current_mode()); |
+ |
+ // Send another gesture event and ACK as not being processed. This should |
+ // not initiate overscroll because the beginning of the scroll event did |
+ // scroll some content on the page. |
+ SimulateGestureScrollUpdateEvent(55, -5, 0); |
+ SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, host_->overscroll_mode()); |
+} |
+ |
// Tests that the overscroll controller plays nice with touch-scrolls and the |
// gesture event filter with debounce filtering turned on. |
TEST_F(RenderWidgetHostTest, GestureScrollDebounceOverscrolls) { |