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 && |