diff options
author | mfomitchev <mfomitchev@chromium.org> | 2015-04-13 11:35:05 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-13 18:36:52 +0000 |
commit | 8a785beffb41a0fdbbb552942bdb773420d698ee (patch) | |
tree | 1e8dbe3b496a20452bcf981405410f5da7c2d8cb /content | |
parent | 2d32187578fbf7e73ae2167f30b84c2e163a048a (diff) | |
download | chromium_src-8a785beffb41a0fdbbb552942bdb773420d698ee.zip chromium_src-8a785beffb41a0fdbbb552942bdb773420d698ee.tar.gz chromium_src-8a785beffb41a0fdbbb552942bdb773420d698ee.tar.bz2 |
Reset overscroll deltas at the end of every overscroll gesture.
Fixing the issue where the overscroll deltas can accumulate between
overscroll gestures that don't change the overscroll mode (either
because the scroll delta doesn't pass the threshold or because
overscroll is disabled in a given direction). See the bug for more
details on the issue.
BUG=476088
Review URL: https://codereview.chromium.org/1082463002
Cr-Commit-Position: refs/heads/master@{#324886}
Diffstat (limited to 'content')
-rw-r--r-- | content/browser/renderer_host/overscroll_controller.cc | 16 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_aura_unittest.cc | 45 |
2 files changed, 57 insertions, 4 deletions
diff --git a/content/browser/renderer_host/overscroll_controller.cc b/content/browser/renderer_host/overscroll_controller.cc index 86dc692..0fd5e45 100644 --- a/content/browser/renderer_host/overscroll_controller.cc +++ b/content/browser/renderer_host/overscroll_controller.cc @@ -35,11 +35,13 @@ OverscrollController::~OverscrollController() { } bool OverscrollController::WillHandleEvent(const blink::WebInputEvent& event) { - if (scroll_state_ != STATE_UNKNOWN) { + bool reset_scroll_state = false; + if (scroll_state_ != STATE_UNKNOWN || + overscroll_delta_x_ || overscroll_delta_y_) { switch (event.type) { case blink::WebInputEvent::GestureScrollEnd: case blink::WebInputEvent::GestureFlingStart: - scroll_state_ = STATE_UNKNOWN; + reset_scroll_state = true; break; case blink::WebInputEvent::MouseWheel: { @@ -48,7 +50,7 @@ bool OverscrollController::WillHandleEvent(const blink::WebInputEvent& event) { if (!wheel.hasPreciseScrollingDeltas || wheel.phase == blink::WebMouseWheelEvent::PhaseEnded || wheel.phase == blink::WebMouseWheelEvent::PhaseCancelled) { - scroll_state_ = STATE_UNKNOWN; + reset_scroll_state = true; } break; } @@ -56,12 +58,15 @@ bool OverscrollController::WillHandleEvent(const blink::WebInputEvent& event) { default: if (blink::WebInputEvent::isMouseEventType(event.type) || blink::WebInputEvent::isKeyboardEventType(event.type)) { - scroll_state_ = STATE_UNKNOWN; + reset_scroll_state = true; } break; } } + if (reset_scroll_state) + scroll_state_ = STATE_UNKNOWN; + if (DispatchEventCompletesAction(event)) { CompleteAction(); @@ -80,8 +85,11 @@ bool OverscrollController::WillHandleEvent(const blink::WebInputEvent& event) { // Consume the event only if it updates the overscroll state. if (ProcessEventForOverscroll(event)) return true; + } else if (reset_scroll_state) { + overscroll_delta_x_ = overscroll_delta_y_ = 0.f; } + return false; } diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc index f20df74..aba2b57 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc @@ -3324,4 +3324,49 @@ TEST_F(RenderWidgetHostViewAuraTest, CorrectNumberOfAcksAreDispatched) { EXPECT_EQ(2U, view_->dispatcher_->processed_touch_event_count()); } +// Tests that the scroll deltas stored within the overscroll controller get +// reset at the end of the overscroll gesture even if the overscroll threshold +// isn't surpassed and the overscroll mode stays OVERSCROLL_NONE. +TEST_F(RenderWidgetHostViewAuraOverscrollTest, ScrollDeltasResetOnEnd) { + SetUpOverscrollEnvironment(); + // Wheel event scroll ending with mouse move. + SimulateWheelEvent(-30, -10, 0, true); // sent directly + SendInputEventACK(WebInputEvent::MouseWheel, + INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); + EXPECT_EQ(-30.f, overscroll_delta_x()); + EXPECT_EQ(-10.f, overscroll_delta_y()); + SimulateMouseMove(5, 10, 0); + EXPECT_EQ(0.f, overscroll_delta_x()); + EXPECT_EQ(0.f, overscroll_delta_y()); + + // Scroll gesture. + SimulateGestureEvent(WebInputEvent::GestureScrollBegin, + blink::WebGestureDeviceTouchscreen); + SimulateGestureScrollUpdateEvent(-30, -5, 0); + SendInputEventACK(WebInputEvent::GestureScrollUpdate, + INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); + EXPECT_EQ(-30.f, overscroll_delta_x()); + EXPECT_EQ(-5.f, overscroll_delta_y()); + SimulateGestureEvent(WebInputEvent::GestureScrollEnd, + blink::WebGestureDeviceTouchscreen); + EXPECT_EQ(0.f, overscroll_delta_x()); + EXPECT_EQ(0.f, overscroll_delta_y()); + + // Wheel event scroll ending with a fling. + SimulateWheelEvent(5, 0, 0, true); + SendInputEventACK(WebInputEvent::MouseWheel, + INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SimulateWheelEvent(10, -5, 0, true); + SendInputEventACK(WebInputEvent::MouseWheel, + INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); + EXPECT_EQ(15.f, overscroll_delta_x()); + EXPECT_EQ(-5.f, overscroll_delta_y()); + SimulateGestureFlingStartEvent(0.f, 0.1f, blink::WebGestureDeviceTouchpad); + EXPECT_EQ(0.f, overscroll_delta_x()); + EXPECT_EQ(0.f, overscroll_delta_y()); +} + } // namespace content |