| Index: ui/events/gestures/gesture_sequence.cc
|
| diff --git a/ui/events/gestures/gesture_sequence.cc b/ui/events/gestures/gesture_sequence.cc
|
| index 7b37f4561b0f901de0fe684c5d6ec5add5abae2a..f9f02f4912c0a6dcf337e93bfd7c4eadf260485c 100644
|
| --- a/ui/events/gestures/gesture_sequence.cc
|
| +++ b/ui/events/gestures/gesture_sequence.cc
|
| @@ -129,6 +129,12 @@ enum EdgeStateSignatureType {
|
| GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED =
|
| G(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL, 1, TS_PRESSED, TSI_NOT_PROCESSED),
|
|
|
| + GST_SYNTHETIC_CLICK_ABORTED_FIRST_RELEASED =
|
| + G(GS_SYNTHETIC_CLICK_ABORTED, 0, TS_RELEASED, TSI_ALWAYS),
|
| +
|
| + GST_SYNTHETIC_CLICK_ABORTED_SECOND_PRESSED =
|
| + G(GS_SYNTHETIC_CLICK_ABORTED, 1, TS_PRESSED, TSI_NOT_PROCESSED),
|
| +
|
| GST_SCROLL_FIRST_RELEASED =
|
| G(GS_SCROLL, 0, TS_RELEASED, TSI_ALWAYS),
|
|
|
| @@ -342,6 +348,8 @@ EdgeStateSignatureType Signature(GestureState gesture_state,
|
| case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_STATIONARY:
|
| case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED:
|
| case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED:
|
| + case GST_SYNTHETIC_CLICK_ABORTED_FIRST_RELEASED:
|
| + case GST_SYNTHETIC_CLICK_ABORTED_SECOND_PRESSED:
|
| case GST_SCROLL_FIRST_RELEASED:
|
| case GST_SCROLL_FIRST_MOVED:
|
| case GST_SCROLL_FIRST_CANCELLED:
|
| @@ -474,6 +482,16 @@ void UpdateGestureEventLatencyInfo(const TouchEvent& event,
|
| }
|
| }
|
|
|
| +bool GestureStateSupportsActiveTimer(GestureState state) {
|
| + switch(state) {
|
| + case GS_PENDING_SYNTHETIC_CLICK:
|
| + case GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL:
|
| + return true;
|
| + default:
|
| + return false;
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -557,6 +575,7 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture(
|
| set_state(GS_PENDING_SYNTHETIC_CLICK);
|
| break;
|
| case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED:
|
| + case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED:
|
| if (Click(event, point, gestures.get()))
|
| point.UpdateForTap();
|
| else
|
| @@ -572,24 +591,24 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture(
|
| point.UpdateForScroll();
|
| }
|
| break;
|
| + case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED_PROCESSED:
|
| case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_MOVED:
|
| case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_STATIONARY:
|
| - // No scrolling allowed, so nothing happens.
|
| - break;
|
| - case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED_PROCESSED:
|
| if (point.IsInScrollWindow(event)) {
|
| PrependTapCancelGestureEvent(point, gestures.get());
|
| + set_state(GS_SYNTHETIC_CLICK_ABORTED);
|
| + } else {
|
| set_state(GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL);
|
| }
|
| break;
|
| case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED_HANDLED:
|
| case GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED:
|
| + case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED_HANDLED:
|
| + case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED:
|
| PrependTapCancelGestureEvent(point, gestures.get());
|
| set_state(GS_NO_GESTURE);
|
| break;
|
| - case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED:
|
| - case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_RELEASED_HANDLED:
|
| - case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_FIRST_CANCELLED:
|
| + case GST_SYNTHETIC_CLICK_ABORTED_FIRST_RELEASED:
|
| set_state(GS_NO_GESTURE);
|
| break;
|
| case GST_SCROLL_FIRST_MOVED:
|
| @@ -605,10 +624,11 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture(
|
| set_state(GS_NO_GESTURE);
|
| break;
|
| case GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED:
|
| + case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED:
|
| PrependTapCancelGestureEvent(point, gestures.get());
|
| TwoFingerTapOrPinch(event, point, gestures.get());
|
| break;
|
| - case GST_PENDING_SYNTHETIC_CLICK_NO_SCROLL_SECOND_PRESSED:
|
| + case GST_SYNTHETIC_CLICK_ABORTED_SECOND_PRESSED:
|
| TwoFingerTapOrPinch(event, point, gestures.get());
|
| break;
|
| case GST_SCROLL_SECOND_PRESSED:
|
| @@ -751,7 +771,10 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture(
|
| << " State: " << state_
|
| << " touch id: " << event.touch_id();
|
|
|
| - if (last_state == GS_PENDING_SYNTHETIC_CLICK && state_ != last_state) {
|
| + // If the state has changed from one in which a long/show press is possible to
|
| + // one in which they are not possible, cancel the timers.
|
| + if (GestureStateSupportsActiveTimer(last_state) &&
|
| + !GestureStateSupportsActiveTimer(state_)) {
|
| GetLongPressTimer()->Stop();
|
| GetShowPressTimer()->Stop();
|
| }
|
| @@ -1102,7 +1125,8 @@ void GestureSequence::AppendTwoFingerTapGestureEvent(Gestures* gestures) {
|
| bool GestureSequence::Click(const TouchEvent& event,
|
| const GesturePoint& point,
|
| Gestures* gestures) {
|
| - DCHECK(state_ == GS_PENDING_SYNTHETIC_CLICK);
|
| + DCHECK(state_ == GS_PENDING_SYNTHETIC_CLICK ||
|
| + state_ == GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL);
|
| if (point.IsInClickWindow(event)) {
|
| int tap_count = 1;
|
| if (point.IsInTripleClickWindow(event))
|
| @@ -1187,6 +1211,7 @@ bool GestureSequence::TwoFingerTouchDown(const TouchEvent& event,
|
| Gestures* gestures) {
|
| DCHECK(state_ == GS_PENDING_SYNTHETIC_CLICK ||
|
| state_ == GS_PENDING_SYNTHETIC_CLICK_NO_SCROLL ||
|
| + state_ == GS_SYNTHETIC_CLICK_ABORTED ||
|
| state_ == GS_SCROLL);
|
|
|
| if (state_ == GS_SCROLL) {
|
|
|