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 51ff7dfc3d4c26952e2021c99779a684ebaed0ac..f07efab61f4fe1504186974481be50128de69345 100644 |
--- a/content/browser/renderer_host/overscroll_controller.cc |
+++ b/content/browser/renderer_host/overscroll_controller.cc |
@@ -64,23 +64,25 @@ bool OverscrollController::WillDispatchEvent( |
// touch-scrolls maintain state in the renderer side (in the compositor, for |
// example), and the event that completes this action needs to be sent to |
// the renderer so that those states can be updated/reset appropriately. |
- // Send the event through the host when appropriate. |
- if (ShouldForwardToHost(event)) { |
+ if (WebKit::WebInputEvent::isGestureEventType(event.type)) { |
+ // A gesture-event isn't sent to the GestureEventFilter when overscroll is |
+ // in progress. So dispatch the event through the RenderWidgetHost so that |
+ // it can reach the GestureEventFilter. |
const WebKit::WebGestureEvent& gevent = |
static_cast<const WebKit::WebGestureEvent&>(event); |
return render_widget_host_->ShouldForwardGestureEvent( |
GestureEventWithLatencyInfo(gevent, latency_info)); |
} |
- return false; |
+ return true; |
} |
if (overscroll_mode_ != OVERSCROLL_NONE && DispatchEventResetsState(event)) { |
SetOverscrollMode(OVERSCROLL_NONE); |
- // The overscroll gesture status is being reset. If the event is a |
- // gesture event (from either touchscreen or trackpad), then make sure the |
- // host gets the event first (if it didn't already process it). |
- if (ShouldForwardToHost(event)) { |
+ if (WebKit::WebInputEvent::isGestureEventType(event.type)) { |
+ // A gesture-event isn't sent to the GestureEventFilter when overscroll is |
+ // in progress. So dispatch the event through the RenderWidgetHost so that |
+ // it can reach the GestureEventFilter. |
const WebKit::WebGestureEvent& gevent = |
static_cast<const WebKit::WebGestureEvent&>(event); |
return render_widget_host_->ShouldForwardGestureEvent( |
@@ -92,16 +94,9 @@ bool OverscrollController::WillDispatchEvent( |
} |
if (overscroll_mode_ != OVERSCROLL_NONE) { |
- // Consume the event and update overscroll state when in the middle of the |
- // overscroll gesture. |
- ProcessEventForOverscroll(event); |
- |
- if (event.type == WebKit::WebInputEvent::TouchEnd || |
- event.type == WebKit::WebInputEvent::TouchCancel || |
- event.type == WebKit::WebInputEvent::TouchMove) { |
- return true; |
- } |
- return false; |
+ // Consume the event only if it updates the overscroll state. |
+ if (ProcessEventForOverscroll(event)) |
+ return false; |
} |
return true; |
@@ -226,18 +221,20 @@ bool OverscrollController::DispatchEventResetsState( |
} |
} |
-void OverscrollController::ProcessEventForOverscroll( |
+bool OverscrollController::ProcessEventForOverscroll( |
const WebKit::WebInputEvent& event) { |
+ bool event_processed = false; |
switch (event.type) { |
case WebKit::WebInputEvent::MouseWheel: { |
const WebKit::WebMouseWheelEvent& wheel = |
static_cast<const WebKit::WebMouseWheelEvent&>(event); |
if (!wheel.hasPreciseScrollingDeltas) |
- return; |
+ break; |
ProcessOverscroll(wheel.deltaX * wheel.accelerationRatioX, |
wheel.deltaY * wheel.accelerationRatioY, |
wheel.type); |
+ event_processed = true; |
break; |
} |
case WebKit::WebInputEvent::GestureScrollUpdate: { |
@@ -246,6 +243,7 @@ void OverscrollController::ProcessEventForOverscroll( |
ProcessOverscroll(gesture.data.scrollUpdate.deltaX, |
gesture.data.scrollUpdate.deltaY, |
gesture.type); |
+ event_processed = true; |
break; |
} |
case WebKit::WebInputEvent::GestureFlingStart: { |
@@ -258,12 +256,14 @@ void OverscrollController::ProcessEventForOverscroll( |
if ((overscroll_mode_ == OVERSCROLL_WEST && velocity_x < 0) || |
(overscroll_mode_ == OVERSCROLL_EAST && velocity_x > 0)) { |
CompleteAction(); |
+ event_processed = true; |
break; |
} |
} else if (fabs(velocity_y) > kFlingVelocityThreshold) { |
if ((overscroll_mode_ == OVERSCROLL_NORTH && velocity_y < 0) || |
(overscroll_mode_ == OVERSCROLL_SOUTH && velocity_y > 0)) { |
CompleteAction(); |
+ event_processed = true; |
break; |
} |
} |
@@ -278,6 +278,7 @@ void OverscrollController::ProcessEventForOverscroll( |
WebKit::WebInputEvent::isTouchEventType(event.type)) |
<< "Received unexpected event: " << event.type; |
} |
+ return event_processed; |
} |
void OverscrollController::ProcessOverscroll(float delta_x, |
@@ -367,14 +368,4 @@ void OverscrollController::SetOverscrollMode(OverscrollMode mode) { |
delegate_->OnOverscrollModeChange(old_mode, overscroll_mode_); |
} |
-bool OverscrollController::ShouldForwardToHost( |
- const WebKit::WebInputEvent& event) const { |
- if (!WebKit::WebInputEvent::isGestureEventType(event.type)) |
- return false; |
- |
- // If the RenderWidgetHost already processed this event, then the event must |
- // not be sent again. |
- return !render_widget_host_->HasQueuedGestureEvents(); |
-} |
- |
} // namespace content |