| Index: content/renderer/input/input_handler_proxy.cc
|
| diff --git a/content/renderer/input/input_handler_proxy.cc b/content/renderer/input/input_handler_proxy.cc
|
| index 78f0c8b822fa125fe0f5c81e068989812d9a8475..ba938b813275e5403da7c18a65f56b1e718e3908 100644
|
| --- a/content/renderer/input/input_handler_proxy.cc
|
| +++ b/content/renderer/input/input_handler_proxy.cc
|
| @@ -336,7 +336,7 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent(
|
| *static_cast<const WebGestureEvent*>(&event);
|
| return HandleGestureFling(gesture_event);
|
| } else if (event.type == WebInputEvent::GestureFlingCancel) {
|
| - if (CancelCurrentFling(true))
|
| + if (CancelCurrentFling())
|
| return DID_HANDLE;
|
| else if (!fling_may_be_active_on_main_thread_)
|
| return DROP_EVENT;
|
| @@ -357,7 +357,7 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent(
|
| // Only call |CancelCurrentFling()| if a fling was active, as it will
|
| // otherwise disrupt an in-progress touch scroll.
|
| if (fling_curve_)
|
| - CancelCurrentFling(true);
|
| + CancelCurrentFling();
|
| } else if (event.type == WebInputEvent::MouseMove) {
|
| const WebMouseEvent& mouse_event =
|
| *static_cast<const WebMouseEvent*>(&event);
|
| @@ -485,7 +485,7 @@ bool InputHandlerProxy::FilterInputEventForFlingBoosting(
|
|
|
| // Gestures from a different source should immediately interrupt the fling.
|
| if (gesture_event.sourceDevice != fling_parameters_.sourceDevice) {
|
| - FlingBoostCancelAndResumeScrollingIfNecessary();
|
| + CancelCurrentFling();
|
| return false;
|
| }
|
|
|
| @@ -500,13 +500,13 @@ bool InputHandlerProxy::FilterInputEventForFlingBoosting(
|
| fling_parameters_.sourceDevice == blink::WebGestureDeviceTouchpad
|
| ? cc::InputHandler::NonBubblingGesture
|
| : cc::InputHandler::Gesture)) {
|
| - CancelCurrentFling(true);
|
| + CancelCurrentFling();
|
| return false;
|
| }
|
|
|
| // TODO(jdduke): Use |gesture_event.data.scrollBegin.delta{X,Y}Hint| to
|
| // determine if the ScrollBegin should immediately cancel the fling.
|
| - FlingBoostExtend(gesture_event);
|
| + ExtendBoostedFlingTimeout(gesture_event);
|
| return true;
|
|
|
| case WebInputEvent::GestureScrollUpdate: {
|
| @@ -515,16 +515,19 @@ bool InputHandlerProxy::FilterInputEventForFlingBoosting(
|
| if (ShouldSuppressScrollForFlingBoosting(current_fling_velocity_,
|
| gesture_event,
|
| time_since_last_boost_event)) {
|
| - FlingBoostExtend(gesture_event);
|
| + ExtendBoostedFlingTimeout(gesture_event);
|
| return true;
|
| }
|
|
|
| - FlingBoostCancelAndResumeScrollingIfNecessary();
|
| + CancelCurrentFling();
|
| return false;
|
| }
|
|
|
| case WebInputEvent::GestureScrollEnd:
|
| - CancelCurrentFling(true);
|
| + // Clear the last fling boost event *prior* to fling cancellation,
|
| + // preventing insertion of a synthetic GestureScrollBegin.
|
| + last_fling_boost_event_ = WebGestureEvent();
|
| + CancelCurrentFling();
|
| return true;
|
|
|
| case WebInputEvent::GestureFlingStart: {
|
| @@ -576,36 +579,21 @@ bool InputHandlerProxy::FilterInputEventForFlingBoosting(
|
| default:
|
| // All other types of gestures (taps, presses, etc...) will complete the
|
| // deferred fling cancellation.
|
| - FlingBoostCancelAndResumeScrollingIfNecessary();
|
| + CancelCurrentFling();
|
| return false;
|
| }
|
| }
|
|
|
| -void InputHandlerProxy::FlingBoostExtend(const blink::WebGestureEvent& event) {
|
| - TRACE_EVENT_INSTANT0(
|
| - "input", "InputHandlerProxy::FlingBoostExtend", TRACE_EVENT_SCOPE_THREAD);
|
| +void InputHandlerProxy::ExtendBoostedFlingTimeout(
|
| + const blink::WebGestureEvent& event) {
|
| + TRACE_EVENT_INSTANT0("input",
|
| + "InputHandlerProxy::ExtendBoostedFlingTimeout",
|
| + TRACE_EVENT_SCOPE_THREAD);
|
| deferred_fling_cancel_time_seconds_ =
|
| event.timeStampSeconds + kFlingBoostTimeoutDelaySeconds;
|
| last_fling_boost_event_ = event;
|
| }
|
|
|
| -void InputHandlerProxy::FlingBoostCancelAndResumeScrollingIfNecessary() {
|
| - TRACE_EVENT_INSTANT0(
|
| - "input", "InputHandlerProxy::FlingBoostCancel", TRACE_EVENT_SCOPE_THREAD);
|
| - DCHECK(deferred_fling_cancel_time_seconds_);
|
| -
|
| - // Note: |last_fling_boost_event_| is cleared by |CancelCurrentFling()|.
|
| - WebGestureEvent last_fling_boost_event = last_fling_boost_event_;
|
| -
|
| - CancelCurrentFling(true);
|
| -
|
| - if (last_fling_boost_event.type == WebInputEvent::GestureScrollBegin ||
|
| - last_fling_boost_event.type == WebInputEvent::GestureScrollUpdate) {
|
| - // Synthesize a GestureScrollBegin, as the original was suppressed.
|
| - HandleInputEvent(ObtainGestureScrollBegin(last_fling_boost_event));
|
| - }
|
| -}
|
| -
|
| void InputHandlerProxy::Animate(base::TimeTicks time) {
|
| if (!fling_curve_)
|
| return;
|
| @@ -614,7 +602,7 @@ void InputHandlerProxy::Animate(base::TimeTicks time) {
|
|
|
| if (deferred_fling_cancel_time_seconds_ &&
|
| monotonic_time_sec > deferred_fling_cancel_time_seconds_) {
|
| - FlingBoostCancelAndResumeScrollingIfNecessary();
|
| + CancelCurrentFling();
|
| return;
|
| }
|
|
|
| @@ -645,7 +633,7 @@ void InputHandlerProxy::Animate(base::TimeTicks time) {
|
| TRACE_EVENT_INSTANT0("input",
|
| "InputHandlerProxy::animate::flingOver",
|
| TRACE_EVENT_SCOPE_THREAD);
|
| - CancelCurrentFling(true);
|
| + CancelCurrentFling();
|
| }
|
| }
|
|
|
| @@ -685,8 +673,15 @@ void InputHandlerProxy::DidOverscroll(
|
| client_->DidOverscroll(params);
|
| }
|
|
|
| -bool InputHandlerProxy::CancelCurrentFling(
|
| - bool send_fling_stopped_notification) {
|
| +bool InputHandlerProxy::CancelCurrentFling() {
|
| + if (CancelCurrentFlingWithoutNotifyingClient()) {
|
| + client_->DidStopFlinging();
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +bool InputHandlerProxy::CancelCurrentFlingWithoutNotifyingClient() {
|
| bool had_fling_animation = fling_curve_;
|
| if (had_fling_animation &&
|
| fling_parameters_.sourceDevice == blink::WebGestureDeviceTouchscreen) {
|
| @@ -707,10 +702,19 @@ bool InputHandlerProxy::CancelCurrentFling(
|
| gesture_scroll_on_impl_thread_ = false;
|
| current_fling_velocity_ = gfx::Vector2dF();
|
| fling_parameters_ = blink::WebActiveWheelFlingParameters();
|
| - deferred_fling_cancel_time_seconds_ = 0;
|
| - last_fling_boost_event_ = WebGestureEvent();
|
| - if (send_fling_stopped_notification && had_fling_animation)
|
| - client_->DidStopFlinging();
|
| +
|
| + if (deferred_fling_cancel_time_seconds_) {
|
| + deferred_fling_cancel_time_seconds_ = 0;
|
| +
|
| + WebGestureEvent last_fling_boost_event = last_fling_boost_event_;
|
| + last_fling_boost_event_ = WebGestureEvent();
|
| + if (last_fling_boost_event.type == WebInputEvent::GestureScrollBegin ||
|
| + last_fling_boost_event.type == WebInputEvent::GestureScrollUpdate) {
|
| + // Synthesize a GestureScrollBegin, as the original was suppressed.
|
| + HandleInputEvent(ObtainGestureScrollBegin(last_fling_boost_event));
|
| + }
|
| + }
|
| +
|
| return had_fling_animation;
|
| }
|
|
|
| @@ -746,7 +750,7 @@ bool InputHandlerProxy::TouchpadFlingScroll(
|
| // the subarea but then is flung "under" the pointer.
|
| client_->TransferActiveWheelFlingAnimation(fling_parameters_);
|
| fling_may_be_active_on_main_thread_ = true;
|
| - CancelCurrentFling(false);
|
| + CancelCurrentFlingWithoutNotifyingClient();
|
| break;
|
| }
|
|
|
|
|