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 14a82e6fe9460b916bcf12559ba1caef9755cabd..f221efff98fb7e9d65af7102a2fd8920e3f1577f 100644 |
| --- a/content/browser/renderer_host/overscroll_controller.cc |
| +++ b/content/browser/renderer_host/overscroll_controller.cc |
| @@ -16,6 +16,7 @@ OverscrollController::OverscrollController( |
| RenderWidgetHostImpl* render_widget_host) |
| : render_widget_host_(render_widget_host), |
| overscroll_mode_(OVERSCROLL_NONE), |
| + scroll_state_(STATE_UNKNOWN), |
| overscroll_delta_x_(0.f), |
| overscroll_delta_y_(0.f), |
| delegate_(NULL) { |
| @@ -27,6 +28,25 @@ OverscrollController::~OverscrollController() { |
| bool OverscrollController::WillDispatchEvent( |
| const WebKit::WebInputEvent& event, |
| const cc::LatencyInfo& latency_info) { |
| + if (scroll_state_ != STATE_UNKNOWN) { |
| + if (event.type == WebKit::WebInputEvent::GestureScrollEnd) { |
| + scroll_state_ = STATE_UNKNOWN; |
| + } else if (event.type == WebKit::WebInputEvent::GestureFlingStart) { |
| + // Start of a fling indicates the end of a scroll, both from touchpad and |
| + // touchscreen. So it is not necessary to check |sourceDevice| of the |
| + // event. |
| + scroll_state_ = STATE_UNKNOWN; |
| + } else if (event.type == WebKit::WebInputEvent::MouseWheel) { |
| + const WebKit::WebMouseWheelEvent& wheel = |
| + static_cast<const WebKit::WebMouseWheelEvent&>(event); |
| + if (wheel.hasPreciseScrollingDeltas && |
| + (wheel.phase == WebKit::WebMouseWheelEvent::PhaseEnded || |
| + wheel.phase == WebKit::WebMouseWheelEvent::PhaseCancelled)) { |
| + scroll_state_ = STATE_UNKNOWN; |
| + } |
| + } |
| + } |
| + |
| if (DispatchEventCompletesAction(event)) { |
| CompleteAction(); |
| @@ -79,14 +99,25 @@ bool OverscrollController::WillDispatchEvent( |
| void OverscrollController::ReceivedEventACK(const WebKit::WebInputEvent& event, |
| bool processed) { |
| - if (processed) |
| + 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, |
| + // until the current scroll ends, and a new scroll gesture starts. |
| + if (scroll_state_ == STATE_UNKNOWN) { |
|
sky
2013/05/23 00:07:49
nit: combine this into a single if.
sadrul
2013/05/23 02:01:35
Done.
|
| + if (event.type == WebKit::WebInputEvent::MouseWheel || |
| + event.type == WebKit::WebInputEvent::GestureScrollUpdate) { |
| + scroll_state_ = STATE_CONTENT_SCROLLING; |
| + } |
| + } |
| return; |
| + } |
| ProcessEventForOverscroll(event); |
| } |
| void OverscrollController::Reset() { |
| overscroll_mode_ = OVERSCROLL_NONE; |
| overscroll_delta_x_ = overscroll_delta_y_ = 0.f; |
| + scroll_state_ = STATE_UNKNOWN; |
| } |
| bool OverscrollController::DispatchEventCompletesAction ( |
| @@ -177,10 +208,11 @@ void OverscrollController::ProcessEventForOverscroll( |
| case WebKit::WebInputEvent::MouseWheel: { |
| const WebKit::WebMouseWheelEvent& wheel = |
| static_cast<const WebKit::WebMouseWheelEvent&>(event); |
| - if (wheel.hasPreciseScrollingDeltas) { |
| - ProcessOverscroll(wheel.deltaX * wheel.accelerationRatioX, |
| - wheel.deltaY * wheel.accelerationRatioY); |
| - } |
| + if (!wheel.hasPreciseScrollingDeltas) |
| + return; |
| + |
| + ProcessOverscroll(wheel.deltaX * wheel.accelerationRatioX, |
| + wheel.deltaY * wheel.accelerationRatioY); |
| break; |
| } |
| case WebKit::WebInputEvent::GestureScrollUpdate: { |
| @@ -223,6 +255,8 @@ void OverscrollController::ProcessEventForOverscroll( |
| } |
| void OverscrollController::ProcessOverscroll(float delta_x, float delta_y) { |
| + if (scroll_state_ == STATE_CONTENT_SCROLLING) |
| + return; |
| overscroll_delta_x_ += delta_x; |
| overscroll_delta_y_ += delta_y; |
| @@ -292,6 +326,8 @@ void OverscrollController::SetOverscrollMode(OverscrollMode mode) { |
| overscroll_mode_ = mode; |
| if (overscroll_mode_ == OVERSCROLL_NONE) |
| overscroll_delta_x_ = overscroll_delta_y_ = 0.f; |
| + else |
| + scroll_state_ = STATE_OVERSCROLLING; |
| if (delegate_) |
| delegate_->OnOverscrollModeChange(old_mode, overscroll_mode_); |
| } |