| 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) {
|
| + 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()) {}
|
|
|
| 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
|
| + // 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_) {
|
| + 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.
|
| + 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 {
|
| + // 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 &&
|
|
|