Commit b9001acb authored by Xida Chen's avatar Xida Chen Committed by Commit Bot

Mark gesture sequence in progress true for GestureTapCancel

Right now in TouchActionFilter, we set |gesture_sequence_in_progress_|
false when processing GestureTap and GestureTapCancel. This is wrong
with considering the following gesture sequence:
1. A simple tap: GestureTapDown-->GestureTapUnconfirmed-->GestureTap
2. Double tap: GestureTapDown-->GestureTapUnconfirmed-->GestureTapCancel
-->GestureTapDown-->GestureTapCancel-->GestureDoubleTap
3. A gesture scroll: GestureTapDown-->GestureTapCancel
-->GestureScrollBegin-->GestureScrollUpdate-->GestureScrollEnd
4. A fling: GestureTapDown-->GestureTapCancel-->GestureScrollBegin
-->GestureScrollUpdate-->GestureScrollEnd

All these sequence indicates that the gesture_sequence_in_progress_
should be true when filtering a GestureTapCancel and false when
GestureTap. This CL does that.

In additional to that, this CL also mark gesture_sequence_in_progress_
false when it is GestureLongTap or GestureTwoFingerTap. Unit tests
are added for both cases.

TBR=dtapuska@chromium.org

Bug: 851644
Change-Id: I40e70cb95a93c20b13952c571d1e1108405c6051
Reviewed-on: https://chromium-review.googlesource.com/1190423
Commit-Queue: Xida Chen <xidachen@chromium.org>
Reviewed-by: default avatarSahel Sharify <sahel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#586351}
parent 38b202fe
......@@ -157,7 +157,6 @@ FilterGestureEventResult TouchActionFilter::FilterGestureEvent(
}
case WebInputEvent::kGestureTap:
case WebInputEvent::kGestureTapCancel:
gesture_sequence_in_progress_ = false;
gesture_sequence_.append("A");
if (drop_current_tap_ending_event_) {
......@@ -166,6 +165,14 @@ FilterGestureEventResult TouchActionFilter::FilterGestureEvent(
}
break;
case WebInputEvent::kGestureTapCancel:
gesture_sequence_.append("K");
if (drop_current_tap_ending_event_) {
drop_current_tap_ending_event_ = false;
return FilterGestureEventResult::kFilterGestureEventFiltered;
}
break;
case WebInputEvent::kGestureTapDown:
gesture_sequence_.append("O");
gesture_sequence_in_progress_ = true;
......@@ -184,6 +191,11 @@ FilterGestureEventResult TouchActionFilter::FilterGestureEvent(
DCHECK(!drop_current_tap_ending_event_);
break;
case WebInputEvent::kGestureLongTap:
case WebInputEvent::kGestureTwoFingerTap:
gesture_sequence_in_progress_ = false;
break;
default:
// Gesture events unrelated to touch actions (panning/zooming) are left
// alone.
......
......@@ -894,9 +894,10 @@ TEST_F(TouchActionFilterTest, TouchActionNotResetWithinGestureSequence) {
EXPECT_FALSE(ScrollingTouchAction().has_value());
}
// This test ensures that when the IPC message OnHasTouchEventHandlers is
// received in the middle of a gesture sequence, the touch action is not reset.
TEST_F(TouchActionFilterTest, OnHasTouchEventHandlersReceivedDuringScroll) {
// The following 3 tests ensures that when the IPC message
// OnHasTouchEventHandlers is received in the middle of a gesture sequence, the
// touch action is not reset.
TEST_F(TouchActionFilterTest, OnHasTouchEventHandlersReceivedDuringTap) {
filter_.OnHasTouchEventHandlers(false);
WebGestureEvent tap_down = SyntheticWebGestureEventBuilder::Build(
......@@ -916,28 +917,104 @@ TEST_F(TouchActionFilterTest, OnHasTouchEventHandlersReceivedDuringScroll) {
// reset the |allowed_touch_action_|.
filter_.ResetTouchAction();
EXPECT_FALSE(filter_.allowed_touch_action().has_value());
}
TEST_F(TouchActionFilterTest, OnHasTouchEventHandlersReceivedDuringDoubleTap) {
filter_.OnHasTouchEventHandlers(false);
WebGestureEvent tap_down = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::kGestureTapDown, kSourceDevice);
WebGestureEvent tap_cancel = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::kGestureTapCancel, kSourceDevice);
WebGestureEvent double_tap = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::kGestureDoubleTap, kSourceDevice);
// Simulate a double tap gesture: GTD-->GTC-->GTD-->GTC-->GDT.
EXPECT_EQ(filter_.FilterGestureEvent(&tap_down),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_EQ(ScrollingTouchAction().value(), cc::kTouchActionAuto);
filter_.OnHasTouchEventHandlers(true);
// Simulate a double tap gesture: GTD-->GT-->GTD-->GDT.
EXPECT_EQ(filter_.FilterGestureEvent(&tap_cancel),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_TRUE(ScrollingTouchAction().has_value());
filter_.OnSetTouchAction(cc::kTouchActionPan);
EXPECT_EQ(filter_.FilterGestureEvent(&tap_down),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_EQ(ScrollingTouchAction().value(), cc::kTouchActionPan);
EXPECT_EQ(filter_.FilterGestureEvent(&tap),
EXPECT_EQ(filter_.FilterGestureEvent(&tap_cancel),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_TRUE(ScrollingTouchAction().has_value());
filter_.OnSetTouchAction(cc::kTouchActionPan);
EXPECT_EQ(filter_.FilterGestureEvent(&double_tap),
FilterGestureEventResult::kFilterGestureEventAllowed);
}
TEST_F(TouchActionFilterTest, OnHasTouchEventHandlersReceivedDuringScroll) {
filter_.OnHasTouchEventHandlers(false);
WebGestureEvent tap_down = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::kGestureTapDown, kSourceDevice);
WebGestureEvent tap_cancel = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::kGestureTapCancel, kSourceDevice);
WebGestureEvent scroll_begin =
SyntheticWebGestureEventBuilder::BuildScrollBegin(5, 0, kSourceDevice);
WebGestureEvent scroll_update =
SyntheticWebGestureEventBuilder::BuildScrollUpdate(5, 0, 0,
kSourceDevice);
WebGestureEvent scroll_end = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::kGestureScrollEnd, kSourceDevice);
// Simulate a gesture scroll: GTD-->GTC-->GSB-->GSU-->GSE.
EXPECT_EQ(filter_.FilterGestureEvent(&tap_down),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_EQ(filter_.FilterGestureEvent(&tap_cancel),
FilterGestureEventResult::kFilterGestureEventAllowed);
filter_.OnHasTouchEventHandlers(true);
filter_.OnSetTouchAction(cc::kTouchActionPan);
EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_EQ(ScrollingTouchAction().value(), cc::kTouchActionPan);
WebGestureEvent double_tap = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::kGestureDoubleTap, kSourceDevice);
EXPECT_EQ(filter_.FilterGestureEvent(&scroll_update),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end),
FilterGestureEventResult::kFilterGestureEventAllowed);
}
// If OnHasTouchEventHandlers IPC is received after LongTap or TwoFingerTap,
// the touch action should be reset.
TEST_F(TouchActionFilterTest,
OnHasTouchEventHandlersReceivedAfterLongTapOrTwoFingerTap) {
filter_.OnHasTouchEventHandlers(false);
WebGestureEvent tap_down = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::kGestureTapDown, kSourceDevice);
WebGestureEvent tap_cancel = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::kGestureTapCancel, kSourceDevice);
WebGestureEvent long_tap = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::kGestureLongTap, kSourceDevice);
EXPECT_EQ(filter_.FilterGestureEvent(&tap_down),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_EQ(filter_.FilterGestureEvent(&tap),
EXPECT_EQ(filter_.FilterGestureEvent(&tap_cancel),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_EQ(filter_.FilterGestureEvent(&double_tap),
EXPECT_EQ(filter_.FilterGestureEvent(&long_tap),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_EQ(ScrollingTouchAction().value(), cc::kTouchActionAuto);
filter_.OnHasTouchEventHandlers(true);
EXPECT_FALSE(ScrollingTouchAction().has_value());
filter_.OnHasTouchEventHandlers(false);
WebGestureEvent two_finger_tap = SyntheticWebGestureEventBuilder::Build(
WebInputEvent::kGestureTwoFingerTap, kSourceDevice);
EXPECT_EQ(filter_.FilterGestureEvent(&tap_down),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_EQ(filter_.FilterGestureEvent(&tap_cancel),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_EQ(filter_.FilterGestureEvent(&two_finger_tap),
FilterGestureEventResult::kFilterGestureEventAllowed);
EXPECT_EQ(ScrollingTouchAction().value(), cc::kTouchActionAuto);
filter_.OnHasTouchEventHandlers(true);
EXPECT_FALSE(ScrollingTouchAction().has_value());
}
// If the renderer is busy, the gesture event might have come before the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment