summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authormfomitchev <mfomitchev@chromium.org>2015-04-13 11:35:05 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-13 18:36:52 +0000
commit8a785beffb41a0fdbbb552942bdb773420d698ee (patch)
tree1e8dbe3b496a20452bcf981405410f5da7c2d8cb /content
parent2d32187578fbf7e73ae2167f30b84c2e163a048a (diff)
downloadchromium_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.cc16
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura_unittest.cc45
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