Chromium Code Reviews| Index: content/browser/renderer_host/overscroll_controller.cc |
| diff --git a/content/browser/renderer_host/overscroll_controller.cc b/content/browser/renderer_host/overscroll_controller.cc |
| index b622dc8533807e3a2d82635c6dde454e25cc4232..6072bfc3fd96557b949651d3bf73903c09a04e65 100644 |
| --- a/content/browser/renderer_host/overscroll_controller.cc |
| +++ b/content/browser/renderer_host/overscroll_controller.cc |
| @@ -7,6 +7,7 @@ |
| #include "base/command_line.h" |
| #include "base/logging.h" |
| #include "content/browser/renderer_host/overscroll_controller_delegate.h" |
| +#include "content/common/input/input_event_utils.h" |
| #include "content/public/browser/overscroll_configuration.h" |
| #include "content/public/common/content_switches.h" |
| @@ -19,6 +20,12 @@ bool IsScrollEndEffectEnabled() { |
| switches::kScrollEndEffect) == "1"; |
| } |
| +bool IsGestureEventFromTouchscreen(const blink::WebInputEvent& event) { |
|
tdresser
2016/02/18 14:35:21
Maybe DCHECK that this is a gesture event?
dtapuska
2016/02/18 21:03:44
Done.
|
| + const blink::WebGestureEvent& gesture = |
| + static_cast<const blink::WebGestureEvent&>(event); |
| + return gesture.sourceDevice == blink::WebGestureDeviceTouchscreen; |
| +} |
| + |
| } // namespace |
| namespace content { |
| @@ -28,8 +35,8 @@ OverscrollController::OverscrollController() |
| scroll_state_(STATE_UNKNOWN), |
| overscroll_delta_x_(0.f), |
| overscroll_delta_y_(0.f), |
| - delegate_(NULL) { |
| -} |
| + delegate_(NULL), |
| + use_gesutre_wheel_scrolling_(UseGestureBasedWheelScrolling()) {} |
|
tdresser
2016/02/18 14:35:21
use_gesutre -> use_gesture
dtapuska
2016/02/18 21:03:44
Done.
|
| OverscrollController::~OverscrollController() { |
| } |
| @@ -40,17 +47,24 @@ bool OverscrollController::WillHandleEvent(const blink::WebInputEvent& event) { |
| overscroll_delta_x_ || overscroll_delta_y_) { |
| switch (event.type) { |
| case blink::WebInputEvent::GestureScrollEnd: |
| + // Gesture scroll end is sent based on a timeout avoid |
|
tdresser
2016/02/18 14:35:21
timeout avoid -> timeout to avoid
dtapuska
2016/02/18 21:03:44
Done.
|
| + // resetting on events from the touchpad. |
| + reset_scroll_state = IsGestureEventFromTouchscreen(event); |
| + break; |
| + |
| case blink::WebInputEvent::GestureFlingStart: |
| reset_scroll_state = true; |
| break; |
| case blink::WebInputEvent::MouseWheel: { |
| - const blink::WebMouseWheelEvent& wheel = |
| - static_cast<const blink::WebMouseWheelEvent&>(event); |
| - if (!wheel.hasPreciseScrollingDeltas || |
| - wheel.phase == blink::WebMouseWheelEvent::PhaseEnded || |
| - wheel.phase == blink::WebMouseWheelEvent::PhaseCancelled) { |
| - reset_scroll_state = true; |
| + if (!use_gesutre_wheel_scrolling_) { |
|
tdresser
2016/02/18 14:35:21
This might be clearer if you invert the condition.
dtapuska
2016/02/18 21:03:44
Done.
|
| + const blink::WebMouseWheelEvent& wheel = |
| + static_cast<const blink::WebMouseWheelEvent&>(event); |
| + if (!wheel.hasPreciseScrollingDeltas || |
| + wheel.phase == blink::WebMouseWheelEvent::PhaseEnded || |
| + wheel.phase == blink::WebMouseWheelEvent::PhaseCancelled) { |
| + reset_scroll_state = true; |
| + } |
| } |
| break; |
| } |
| @@ -95,6 +109,10 @@ bool OverscrollController::WillHandleEvent(const blink::WebInputEvent& event) { |
| void OverscrollController::ReceivedEventACK(const blink::WebInputEvent& event, |
| bool processed) { |
| + if (use_gesutre_wheel_scrolling_ && |
| + event.type == blink::WebInputEvent::MouseWheel) |
| + return; |
| + |
| if (processed) { |
| // If a scroll event is consumed by the page, i.e. some content on the page |
| // has been scrolled, then there is not going to be an overscroll gesture, |
| @@ -142,6 +160,12 @@ bool OverscrollController::DispatchEventCompletesAction ( |
| event.type != blink::WebInputEvent::GestureFlingStart) |
| return false; |
| + // Gesture scroll end is sent based on a timeout avoid |
| + // resetting on events from the touchpad. |
|
tdresser
2016/02/18 14:35:21
resetting what?
dtapuska
2016/02/18 14:41:17
Resetting the overscroll to OVERSCROLL_NONE state.
|
| + if (event.type == blink::WebInputEvent::GestureScrollEnd && |
| + !IsGestureEventFromTouchscreen(event)) |
| + return false; |
| + |
| if (!delegate_) |
| return false; |
| @@ -192,13 +216,23 @@ bool OverscrollController::DispatchEventResetsState( |
| const blink::WebInputEvent& event) const { |
| switch (event.type) { |
| case blink::WebInputEvent::MouseWheel: { |
| - // Only wheel events with precise deltas (i.e. from trackpad) contribute |
| - // to the overscroll gesture. |
| - const blink::WebMouseWheelEvent& wheel = |
| - static_cast<const blink::WebMouseWheelEvent&>(event); |
| - return !wheel.hasPreciseScrollingDeltas; |
| + if (use_gesutre_wheel_scrolling_) { |
| + return false; |
| + } else { |
|
tdresser
2016/02/18 14:35:20
Don't need the "else", as there's a return above.
dtapuska
2016/02/18 21:03:44
Done.
|
| + // Only wheel events with precise deltas (i.e. from trackpad) contribute |
| + // to the overscroll gesture. |
| + const blink::WebMouseWheelEvent& wheel = |
| + static_cast<const blink::WebMouseWheelEvent&>(event); |
| + return !wheel.hasPreciseScrollingDeltas; |
| + } |
| } |
| + // Gesture scroll begin/ends come based on a timeout avoid |
| + // resetting on events from the touchpad. |
| + case blink::WebInputEvent::GestureScrollBegin: |
| + case blink::WebInputEvent::GestureScrollEnd: |
| + return IsGestureEventFromTouchscreen(event); |
| + |
| case blink::WebInputEvent::GestureScrollUpdate: |
| case blink::WebInputEvent::GestureFlingCancel: |
| return false; |
| @@ -217,20 +251,19 @@ bool OverscrollController::ProcessEventForOverscroll( |
| case blink::WebInputEvent::MouseWheel: { |
| const blink::WebMouseWheelEvent& wheel = |
| static_cast<const blink::WebMouseWheelEvent&>(event); |
| - if (!wheel.hasPreciseScrollingDeltas) |
| + if (use_gesutre_wheel_scrolling_ || !wheel.hasPreciseScrollingDeltas) |
| break; |
| event_processed = |
| ProcessOverscroll(wheel.deltaX * wheel.accelerationRatioX, |
| - wheel.deltaY * wheel.accelerationRatioY, |
| - wheel.type); |
| + wheel.deltaY * wheel.accelerationRatioY, true); |
| break; |
| } |
| case blink::WebInputEvent::GestureScrollUpdate: { |
| const blink::WebGestureEvent& gesture = |
| static_cast<const blink::WebGestureEvent&>(event); |
| - event_processed = ProcessOverscroll(gesture.data.scrollUpdate.deltaX, |
| - gesture.data.scrollUpdate.deltaY, |
| - gesture.type); |
| + event_processed = ProcessOverscroll( |
| + gesture.data.scrollUpdate.deltaX, gesture.data.scrollUpdate.deltaY, |
| + gesture.sourceDevice == blink::WebGestureDeviceTouchpad); |
| break; |
| } |
| case blink::WebInputEvent::GestureFlingStart: { |
| @@ -270,15 +303,14 @@ bool OverscrollController::ProcessEventForOverscroll( |
| bool OverscrollController::ProcessOverscroll(float delta_x, |
| float delta_y, |
| - blink::WebInputEvent::Type type) { |
| + bool is_touchpad) { |
| if (scroll_state_ != STATE_CONTENT_SCROLLING) |
| overscroll_delta_x_ += delta_x; |
| overscroll_delta_y_ += delta_y; |
| float horiz_threshold = GetOverscrollConfig( |
| - WebInputEvent::isGestureEventType(type) ? |
| - OVERSCROLL_CONFIG_HORIZ_THRESHOLD_START_TOUCHSCREEN : |
| - OVERSCROLL_CONFIG_HORIZ_THRESHOLD_START_TOUCHPAD); |
| + is_touchpad ? OVERSCROLL_CONFIG_HORIZ_THRESHOLD_START_TOUCHPAD |
| + : OVERSCROLL_CONFIG_HORIZ_THRESHOLD_START_TOUCHSCREEN); |
| float vert_threshold = GetOverscrollConfig( |
| OVERSCROLL_CONFIG_VERT_THRESHOLD_START); |
| if (fabs(overscroll_delta_x_) <= horiz_threshold && |