summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/renderer_host/gesture_event_filter.cc1
-rw-r--r--content/browser/renderer_host/render_widget_host_view_win.cc2
-rw-r--r--content/browser/renderer_host/web_input_event_aurax11.cc2
-rw-r--r--ui/aura/gestures/gesture_recognizer_unittest.cc282
-rw-r--r--ui/aura/window_unittest.cc9
-rw-r--r--ui/base/events/event_constants.h1
-rw-r--r--ui/base/gestures/gesture_sequence.cc18
-rw-r--r--ui/base/gestures/gesture_sequence.h2
8 files changed, 181 insertions, 136 deletions
diff --git a/content/browser/renderer_host/gesture_event_filter.cc b/content/browser/renderer_host/gesture_event_filter.cc
index 1e0be1f..6c2cac2 100644
--- a/content/browser/renderer_host/gesture_event_filter.cc
+++ b/content/browser/renderer_host/gesture_event_filter.cc
@@ -136,6 +136,7 @@ void GestureEventFilter::Reset() {
}
void GestureEventFilter::ProcessGestureAck(bool processed, int type) {
+ DCHECK_EQ(coalesced_gesture_events_.front().type, type);
coalesced_gesture_events_.pop_front();
if (!coalesced_gesture_events_.empty()) {
WebGestureEvent next_gesture_event = coalesced_gesture_events_.front();
diff --git a/content/browser/renderer_host/render_widget_host_view_win.cc b/content/browser/renderer_host/render_widget_host_view_win.cc
index 24e0f6b..008aa09 100644
--- a/content/browser/renderer_host/render_widget_host_view_win.cc
+++ b/content/browser/renderer_host/render_widget_host_view_win.cc
@@ -339,6 +339,8 @@ WebKit::WebInputEvent::Type ConvertToWebInputEvent(ui::EventType t) {
return WebKit::WebGestureEvent::GestureTap;
case ui::ET_GESTURE_TAP_DOWN:
return WebKit::WebGestureEvent::GestureTapDown;
+ case ui::ET_GESTURE_TAP_CANCEL:
+ return WebKit::WebInputEvent::Undefined;
case ui::ET_GESTURE_DOUBLE_TAP:
return WebKit::WebGestureEvent::GestureDoubleTap;
case ui::ET_GESTURE_LONG_PRESS:
diff --git a/content/browser/renderer_host/web_input_event_aurax11.cc b/content/browser/renderer_host/web_input_event_aurax11.cc
index f135296..4022eb1 100644
--- a/content/browser/renderer_host/web_input_event_aurax11.cc
+++ b/content/browser/renderer_host/web_input_event_aurax11.cc
@@ -414,6 +414,8 @@ WebKit::WebGestureEvent MakeWebGestureEventFromAuraEvent(
case ui::ET_GESTURE_BEGIN:
case ui::ET_GESTURE_END:
case ui::ET_GESTURE_MULTIFINGER_SWIPE:
+ case ui::ET_GESTURE_TAP_CANCEL:
+ gesture_event.type = WebKit::WebInputEvent::Undefined;
break;
default:
NOTREACHED() << "Unknown gesture type: " << event->type();
diff --git a/ui/aura/gestures/gesture_recognizer_unittest.cc b/ui/aura/gestures/gesture_recognizer_unittest.cc
index 85dac46..17e33c9 100644
--- a/ui/aura/gestures/gesture_recognizer_unittest.cc
+++ b/ui/aura/gestures/gesture_recognizer_unittest.cc
@@ -30,12 +30,38 @@ std::string WindowIDAsString(ui::GestureConsumer* consumer) {
base::IntToString(static_cast<Window*>(consumer)->id()) : "?";
}
+#define EXPECT_0_EVENTS(events) \
+ EXPECT_EQ(0u, events.size())
+
+#define EXPECT_1_EVENT(events, e0) \
+ EXPECT_EQ(1u, events.size()); \
+ EXPECT_EQ(e0, events[0])
+
+#define EXPECT_2_EVENTS(events, e0, e1) \
+ EXPECT_EQ(2u, events.size()); \
+ EXPECT_EQ(e0, events[0]); \
+ EXPECT_EQ(e1, events[1])
+
+#define EXPECT_3_EVENTS(events, e0, e1, e2) \
+ EXPECT_EQ(3u, events.size()); \
+ EXPECT_EQ(e0, events[0]); \
+ EXPECT_EQ(e1, events[1]); \
+ EXPECT_EQ(e2, events[2])
+
+#define EXPECT_4_EVENTS(events, e0, e1, e2, e3) \
+ EXPECT_EQ(4u, events.size()); \
+ EXPECT_EQ(e0, events[0]); \
+ EXPECT_EQ(e1, events[1]); \
+ EXPECT_EQ(e2, events[2]); \
+ EXPECT_EQ(e3, events[3])
+
// A delegate that keeps track of gesture events.
class GestureEventConsumeDelegate : public TestWindowDelegate {
public:
GestureEventConsumeDelegate()
: tap_(false),
tap_down_(false),
+ tap_cancel_(false),
begin_(false),
end_(false),
double_tap_(false),
@@ -64,8 +90,10 @@ class GestureEventConsumeDelegate : public TestWindowDelegate {
virtual ~GestureEventConsumeDelegate() {}
void Reset() {
+ events_.clear();
tap_ = false;
tap_down_ = false;
+ tap_cancel_ = false;
begin_ = false;
end_ = false;
double_tap_ = false;
@@ -95,8 +123,11 @@ class GestureEventConsumeDelegate : public TestWindowDelegate {
tap_count_ = 0;
}
+ const std::vector<ui::EventType>& events() const { return events_; };
+
bool tap() const { return tap_; }
bool tap_down() const { return tap_down_; }
+ bool tap_cancel() const { return tap_cancel_; }
bool begin() const { return begin_; }
bool end() const { return end_; }
bool double_tap() const { return double_tap_; }
@@ -134,6 +165,7 @@ class GestureEventConsumeDelegate : public TestWindowDelegate {
virtual ui::EventResult OnGestureEvent(
ui::GestureEvent* gesture) OVERRIDE {
+ events_.push_back(gesture->type());
bounding_box_ = gesture->details().bounding_box();
switch (gesture->type()) {
case ui::ET_GESTURE_TAP:
@@ -144,6 +176,9 @@ class GestureEventConsumeDelegate : public TestWindowDelegate {
case ui::ET_GESTURE_TAP_DOWN:
tap_down_ = true;
break;
+ case ui::ET_GESTURE_TAP_CANCEL:
+ tap_cancel_ = true;
+ break;
case ui::ET_GESTURE_BEGIN:
begin_ = true;
break;
@@ -205,8 +240,11 @@ class GestureEventConsumeDelegate : public TestWindowDelegate {
}
private:
+ std::vector<ui::EventType> events_;
+
bool tap_;
bool tap_down_;
+ bool tap_cancel_;
bool begin_;
bool end_;
bool double_tap_;
@@ -453,6 +491,7 @@ TEST_F(GestureRecognizerTest, GestureEventTap) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press);
EXPECT_FALSE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_TRUE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -470,6 +509,7 @@ TEST_F(GestureRecognizerTest, GestureEventTap) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release);
EXPECT_TRUE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_TRUE(delegate->end());
EXPECT_FALSE(delegate->double_tap());
@@ -502,6 +542,7 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press);
EXPECT_FALSE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_TRUE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -521,6 +562,7 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release);
EXPECT_TRUE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_TRUE(delegate->end());
EXPECT_FALSE(delegate->double_tap());
@@ -546,6 +588,7 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press);
EXPECT_FALSE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_TRUE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -563,6 +606,7 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release);
EXPECT_TRUE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_TRUE(delegate->end());
EXPECT_FALSE(delegate->double_tap());
@@ -588,7 +632,9 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press);
EXPECT_FALSE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_TRUE(delegate->begin());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -604,6 +650,7 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -621,6 +668,7 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release);
EXPECT_TRUE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_TRUE(delegate->end());
EXPECT_FALSE(delegate->double_tap());
@@ -646,6 +694,7 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press);
EXPECT_FALSE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_TRUE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -662,6 +711,7 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -678,6 +728,7 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move1);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -694,6 +745,7 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move2);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -711,6 +763,7 @@ TEST_F(GestureRecognizerTest, GestureEventTapRegion) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release);
EXPECT_TRUE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_TRUE(delegate->end());
EXPECT_FALSE(delegate->double_tap());
@@ -742,26 +795,19 @@ TEST_F(GestureRecognizerTest, GestureEventScroll) {
ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
kTouchId, GetTime());
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press);
- EXPECT_FALSE(delegate->tap());
- EXPECT_TRUE(delegate->tap_down());
- EXPECT_TRUE(delegate->begin());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
+ EXPECT_2_EVENTS(delegate->events(),
+ ui::ET_GESTURE_BEGIN,
+ ui::ET_GESTURE_TAP_DOWN);
// Move the touch-point enough so that it is considered as a scroll. This
// should generate both SCROLL_BEGIN and SCROLL_UPDATE gestures.
// The first movement is diagonal, to ensure that we have a free scroll,
// and not a rail scroll.
SendScrollEvent(root_window(), 130, 230, kTouchId, delegate.get());
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->begin());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_TRUE(delegate->scroll_begin());
- EXPECT_TRUE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
+ EXPECT_3_EVENTS(delegate->events(),
+ ui::ET_GESTURE_TAP_CANCEL,
+ ui::ET_GESTURE_SCROLL_BEGIN,
+ ui::ET_GESTURE_SCROLL_UPDATE);
EXPECT_EQ(29, delegate->scroll_x());
EXPECT_EQ(29, delegate->scroll_y());
EXPECT_EQ(0, delegate->scroll_velocity_x());
@@ -775,25 +821,13 @@ TEST_F(GestureRecognizerTest, GestureEventScroll) {
// Move some more to generate a few more scroll updates.
SendScrollEvent(root_window(), 110, 211, kTouchId, delegate.get());
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->begin());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_TRUE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
+ EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
EXPECT_EQ(-20, delegate->scroll_x());
EXPECT_EQ(-19, delegate->scroll_y());
EXPECT_TRUE(delegate->bounding_box().IsEmpty());
SendScrollEvent(root_window(), 140, 215, kTouchId, delegate.get());
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->begin());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_TRUE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
+ EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
EXPECT_EQ(30, delegate->scroll_x());
EXPECT_EQ(4, delegate->scroll_y());
EXPECT_TRUE(delegate->bounding_box().IsEmpty());
@@ -804,14 +838,9 @@ TEST_F(GestureRecognizerTest, GestureEventScroll) {
kTouchId, press.time_stamp() +
base::TimeDelta::FromMilliseconds(50));
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->begin());
- EXPECT_TRUE(delegate->end());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_TRUE(delegate->scroll_end());
+ EXPECT_2_EVENTS(delegate->events(),
+ ui::ET_GESTURE_SCROLL_END,
+ ui::ET_GESTURE_END);
EXPECT_TRUE(delegate->bounding_box().IsEmpty());
}
@@ -1012,6 +1041,7 @@ TEST_F(GestureRecognizerTest, GestureEventLongPress) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press1);
EXPECT_TRUE(delegate->tap_down());
EXPECT_TRUE(delegate->begin());
+ EXPECT_FALSE(delegate->tap_cancel());
// We haven't pressed long enough for a long press to occur
EXPECT_FALSE(delegate->long_press());
@@ -1020,12 +1050,16 @@ TEST_F(GestureRecognizerTest, GestureEventLongPress) {
gesture_sequence->ForceTimeout();
EXPECT_TRUE(delegate->long_press());
EXPECT_EQ(0, delegate->touch_id());
+ EXPECT_FALSE(delegate->tap_cancel());
delegate->Reset();
ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
kTouchId, GetTime());
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release1);
EXPECT_FALSE(delegate->long_press());
+
+ // Note the tap down isn't cancelled until the release
+ EXPECT_TRUE(delegate->tap_cancel());
}
// Check that scrolling cancels a long press
@@ -1056,18 +1090,21 @@ TEST_F(GestureRecognizerTest, GestureEventLongPressCancelledByScroll) {
// We haven't pressed long enough for a long press to occur
EXPECT_FALSE(delegate->long_press());
+ EXPECT_FALSE(delegate->tap_cancel());
// Scroll around, to cancel the long press
SendScrollEvent(root_window(), 130, 230, kTouchId, delegate.get());
// Wait until the timer runs out
gesture_sequence->ForceTimeout();
EXPECT_FALSE(delegate->long_press());
+ EXPECT_TRUE(delegate->tap_cancel());
delegate->Reset();
ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
kTouchId, GetTime());
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release1);
EXPECT_FALSE(delegate->long_press());
+ EXPECT_FALSE(delegate->tap_cancel());
}
// Check that second tap cancels a long press
@@ -1106,6 +1143,7 @@ TEST_F(GestureRecognizerTest, GestureEventLongPressCancelledBySecondTap) {
kTouchId2, GetTime());
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press2);
EXPECT_FALSE(delegate->tap_down()); // no touch down for second tap.
+ EXPECT_TRUE(delegate->tap_cancel());
EXPECT_TRUE(delegate->begin());
// Wait until the timer runs out
@@ -1120,6 +1158,7 @@ TEST_F(GestureRecognizerTest, GestureEventLongPressCancelledBySecondTap) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release1);
EXPECT_FALSE(delegate->long_press());
EXPECT_TRUE(delegate->two_finger_tap());
+ EXPECT_FALSE(delegate->tap_cancel());
}
// Check that horizontal scroll gestures cause scrolls on horizontal rails.
@@ -1233,6 +1272,7 @@ TEST_F(GestureRecognizerTest, GestureTapFollowedByScroll) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press);
EXPECT_FALSE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -1247,6 +1287,7 @@ TEST_F(GestureRecognizerTest, GestureTapFollowedByScroll) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release);
EXPECT_TRUE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -1261,6 +1302,7 @@ TEST_F(GestureRecognizerTest, GestureTapFollowedByScroll) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press1);
EXPECT_FALSE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -1276,6 +1318,7 @@ TEST_F(GestureRecognizerTest, GestureTapFollowedByScroll) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_TRUE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_TRUE(delegate->scroll_begin());
EXPECT_TRUE(delegate->scroll_update());
@@ -1290,6 +1333,7 @@ TEST_F(GestureRecognizerTest, GestureTapFollowedByScroll) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move1);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_TRUE(delegate->scroll_update());
@@ -1303,6 +1347,7 @@ TEST_F(GestureRecognizerTest, GestureTapFollowedByScroll) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move2);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_TRUE(delegate->scroll_update());
@@ -1317,6 +1362,7 @@ TEST_F(GestureRecognizerTest, GestureTapFollowedByScroll) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release1);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -1343,6 +1389,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press);
EXPECT_FALSE(queued_delegate->tap());
EXPECT_FALSE(queued_delegate->tap_down());
+ EXPECT_FALSE(queued_delegate->tap_cancel());
EXPECT_FALSE(queued_delegate->begin());
EXPECT_FALSE(queued_delegate->double_tap());
EXPECT_FALSE(queued_delegate->scroll_begin());
@@ -1358,6 +1405,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release);
EXPECT_FALSE(queued_delegate->tap());
EXPECT_FALSE(queued_delegate->tap_down());
+ EXPECT_FALSE(queued_delegate->tap_cancel());
EXPECT_FALSE(queued_delegate->begin());
EXPECT_FALSE(queued_delegate->end());
EXPECT_FALSE(queued_delegate->double_tap());
@@ -1377,6 +1425,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press2);
EXPECT_FALSE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(queued_delegate->begin());
EXPECT_FALSE(queued_delegate->end());
EXPECT_FALSE(delegate->double_tap());
@@ -1394,6 +1443,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
EXPECT_FALSE(queued_delegate->tap());
EXPECT_TRUE(queued_delegate->tap_down());
EXPECT_TRUE(queued_delegate->begin());
+ EXPECT_FALSE(queued_delegate->tap_cancel());
EXPECT_FALSE(queued_delegate->end());
EXPECT_FALSE(queued_delegate->double_tap());
EXPECT_FALSE(queued_delegate->scroll_begin());
@@ -1405,6 +1455,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
queued_delegate->ReceivedAck();
EXPECT_TRUE(queued_delegate->tap());
EXPECT_FALSE(queued_delegate->tap_down());
+ EXPECT_FALSE(queued_delegate->tap_cancel());
EXPECT_FALSE(queued_delegate->begin());
EXPECT_TRUE(queued_delegate->end());
EXPECT_FALSE(queued_delegate->double_tap());
@@ -1420,6 +1471,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press3);
EXPECT_FALSE(queued_delegate->tap());
EXPECT_FALSE(queued_delegate->tap_down());
+ EXPECT_FALSE(queued_delegate->tap_cancel());
EXPECT_FALSE(queued_delegate->begin());
EXPECT_FALSE(queued_delegate->end());
EXPECT_FALSE(queued_delegate->begin());
@@ -1436,6 +1488,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press4);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_FALSE(delegate->end());
EXPECT_FALSE(delegate->double_tap());
@@ -1444,6 +1497,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
EXPECT_FALSE(delegate->scroll_end());
EXPECT_FALSE(queued_delegate->tap());
EXPECT_FALSE(queued_delegate->tap_down());
+ EXPECT_FALSE(queued_delegate->tap_cancel());
EXPECT_FALSE(queued_delegate->begin());
EXPECT_FALSE(queued_delegate->end());
EXPECT_FALSE(queued_delegate->double_tap());
@@ -1461,6 +1515,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -1468,6 +1523,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
EXPECT_FALSE(delegate->scroll_end());
EXPECT_FALSE(queued_delegate->tap());
EXPECT_FALSE(queued_delegate->tap_down());
+ EXPECT_FALSE(queued_delegate->tap_cancel());
EXPECT_FALSE(queued_delegate->begin());
EXPECT_FALSE(queued_delegate->double_tap());
EXPECT_FALSE(queued_delegate->scroll_begin());
@@ -1479,6 +1535,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
EXPECT_FALSE(queued_delegate->tap());
EXPECT_TRUE(queued_delegate->tap_down());
EXPECT_TRUE(queued_delegate->begin());
+ EXPECT_FALSE(queued_delegate->tap_cancel());
EXPECT_FALSE(queued_delegate->end());
EXPECT_FALSE(queued_delegate->double_tap());
EXPECT_FALSE(queued_delegate->scroll_begin());
@@ -1489,6 +1546,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
queued_delegate->ReceivedAck();
EXPECT_FALSE(queued_delegate->tap());
EXPECT_FALSE(queued_delegate->tap_down()); // no touch down for second tap.
+ EXPECT_TRUE(queued_delegate->tap_cancel());
EXPECT_TRUE(queued_delegate->begin());
EXPECT_FALSE(queued_delegate->end());
EXPECT_FALSE(queued_delegate->double_tap());
@@ -1503,6 +1561,7 @@ TEST_F(GestureRecognizerTest, AsynchronousGestureRecognition) {
queued_delegate->ReceivedAck();
EXPECT_FALSE(queued_delegate->tap());
EXPECT_FALSE(queued_delegate->tap_down());
+ EXPECT_FALSE(queued_delegate->tap_cancel());
EXPECT_FALSE(queued_delegate->begin());
EXPECT_FALSE(queued_delegate->end());
EXPECT_FALSE(queued_delegate->double_tap());
@@ -1532,12 +1591,9 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromScroll) {
ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
kTouchId1, GetTime());
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&press);
- EXPECT_FALSE(delegate->tap());
- EXPECT_TRUE(delegate->tap_down());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
+ EXPECT_2_EVENTS(delegate->events(),
+ ui::ET_GESTURE_BEGIN,
+ ui::ET_GESTURE_TAP_DOWN);
// Move the touch-point enough so that it is considered as a scroll. This
// should generate both SCROLL_BEGIN and SCROLL_UPDATE gestures.
@@ -1545,12 +1601,10 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromScroll) {
ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(130, 301),
kTouchId1, GetTime());
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&move);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_TRUE(delegate->scroll_begin());
- EXPECT_TRUE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
+ EXPECT_3_EVENTS(delegate->events(),
+ ui::ET_GESTURE_TAP_CANCEL,
+ ui::ET_GESTURE_SCROLL_BEGIN,
+ ui::ET_GESTURE_SCROLL_UPDATE);
// Press the second finger. It should cause pinch-begin. Note that we will not
// transition to two finger tap here because the touch points are far enough.
@@ -1558,13 +1612,9 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromScroll) {
ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10),
kTouchId2, GetTime());
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&press2);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down()); // no touch down for second tap.
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
- EXPECT_TRUE(delegate->pinch_begin());
+ EXPECT_2_EVENTS(delegate->events(),
+ ui::ET_GESTURE_BEGIN,
+ ui::ET_GESTURE_PINCH_BEGIN);
EXPECT_EQ(gfx::Rect(10, 10, 120, 291).ToString(),
delegate->bounding_box().ToString());
@@ -1573,14 +1623,7 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromScroll) {
ui::TouchEvent move3(ui::ET_TOUCH_MOVED, gfx::Point(95, 201),
kTouchId1, GetTime());
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&move3);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
- EXPECT_FALSE(delegate->pinch_begin());
- EXPECT_TRUE(delegate->pinch_update());
+ EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_PINCH_UPDATE);
EXPECT_EQ(gfx::Rect(10, 10, 85, 191).ToString(),
delegate->bounding_box().ToString());
@@ -1589,14 +1632,7 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromScroll) {
ui::TouchEvent move4(ui::ET_TOUCH_MOVED, gfx::Point(55, 15),
kTouchId2, GetTime());
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&move4);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
- EXPECT_FALSE(delegate->pinch_begin());
- EXPECT_TRUE(delegate->pinch_update());
+ EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_PINCH_UPDATE);
EXPECT_EQ(gfx::Rect(55, 15, 40, 186).ToString(),
delegate->bounding_box().ToString());
@@ -1606,13 +1642,9 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromScroll) {
kTouchId1, press.time_stamp() +
base::TimeDelta::FromMilliseconds(50));
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&release);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
- EXPECT_TRUE(delegate->pinch_end());
+ EXPECT_2_EVENTS(delegate->events(),
+ ui::ET_GESTURE_PINCH_END,
+ ui::ET_GESTURE_END);
EXPECT_EQ(gfx::Rect(55, 15, 46, 186).ToString(),
delegate->bounding_box().ToString());
@@ -1621,14 +1653,7 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromScroll) {
ui::TouchEvent move5(ui::ET_TOUCH_MOVED, gfx::Point(25, 10),
kTouchId2, GetTime());
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&move5);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_TRUE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
- EXPECT_FALSE(delegate->pinch_begin());
- EXPECT_FALSE(delegate->pinch_update());
+ EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
EXPECT_TRUE(delegate->bounding_box().IsEmpty());
}
@@ -1700,12 +1725,9 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromTap) {
ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 301),
kTouchId1, GetTime());
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&press);
- EXPECT_FALSE(delegate->tap());
- EXPECT_TRUE(delegate->tap_down());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
+ EXPECT_2_EVENTS(delegate->events(),
+ ui::ET_GESTURE_BEGIN,
+ ui::ET_GESTURE_TAP_DOWN);
EXPECT_TRUE(delegate->bounding_box().IsEmpty());
// Press the second finger far enough to break two finger tap. It should
@@ -1714,13 +1736,11 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromTap) {
ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10),
kTouchId2, GetTime());
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&press2);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down()); // no touch down for second tap.
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_TRUE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
- EXPECT_TRUE(delegate->pinch_begin());
+ EXPECT_4_EVENTS(delegate->events(),
+ ui::ET_GESTURE_TAP_CANCEL,
+ ui::ET_GESTURE_BEGIN,
+ ui::ET_GESTURE_PINCH_BEGIN,
+ ui::ET_GESTURE_SCROLL_BEGIN);
EXPECT_EQ(gfx::Rect(10, 10, 91, 291).ToString(),
delegate->bounding_box().ToString());
@@ -1729,14 +1749,7 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromTap) {
ui::TouchEvent move3(ui::ET_TOUCH_MOVED, gfx::Point(65, 201),
kTouchId1, GetTime());
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&move3);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
- EXPECT_FALSE(delegate->pinch_begin());
- EXPECT_TRUE(delegate->pinch_update());
+ EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_PINCH_UPDATE);
EXPECT_EQ(gfx::Rect(10, 10, 55, 191).ToString(),
delegate->bounding_box().ToString());
@@ -1745,14 +1758,7 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromTap) {
ui::TouchEvent move4(ui::ET_TOUCH_MOVED, gfx::Point(55, 15),
kTouchId2, GetTime());
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&move4);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
- EXPECT_FALSE(delegate->pinch_begin());
- EXPECT_TRUE(delegate->pinch_update());
+ EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_PINCH_UPDATE);
EXPECT_EQ(gfx::Rect(55, 15, 10, 186).ToString(),
delegate->bounding_box().ToString());
@@ -1762,13 +1768,9 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromTap) {
kTouchId1, press.time_stamp() +
base::TimeDelta::FromMilliseconds(50));
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&release);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_FALSE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
- EXPECT_TRUE(delegate->pinch_end());
+ EXPECT_2_EVENTS(delegate->events(),
+ ui::ET_GESTURE_PINCH_END,
+ ui::ET_GESTURE_END);
EXPECT_EQ(gfx::Rect(55, 15, 46, 186).ToString(),
delegate->bounding_box().ToString());
@@ -1777,14 +1779,7 @@ TEST_F(GestureRecognizerTest, GestureEventPinchFromTap) {
ui::TouchEvent move5(ui::ET_TOUCH_MOVED, gfx::Point(25, 10),
kTouchId2, GetTime());
root->AsRootWindowHostDelegate()->OnHostTouchEvent(&move5);
- EXPECT_FALSE(delegate->tap());
- EXPECT_FALSE(delegate->tap_down());
- EXPECT_FALSE(delegate->double_tap());
- EXPECT_FALSE(delegate->scroll_begin());
- EXPECT_TRUE(delegate->scroll_update());
- EXPECT_FALSE(delegate->scroll_end());
- EXPECT_FALSE(delegate->pinch_begin());
- EXPECT_FALSE(delegate->pinch_update());
+ EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
EXPECT_TRUE(delegate->bounding_box().IsEmpty());
}
@@ -1939,6 +1934,7 @@ TEST_F(GestureRecognizerTest, NoTapWithPreventDefaultedRelease) {
delegate->Reset();
delegate->ReceivedAckPreventDefaulted();
EXPECT_FALSE(delegate->tap());
+ EXPECT_TRUE(delegate->tap_cancel());
}
TEST_F(GestureRecognizerTest, PinchScrollWithPreventDefaultedRelease) {
@@ -1970,6 +1966,7 @@ TEST_F(GestureRecognizerTest, PinchScrollWithPreventDefaultedRelease) {
// Ack the move event.
delegate->ReceivedAck();
+ EXPECT_TRUE(delegate->tap_cancel());
EXPECT_TRUE(delegate->scroll_begin());
delegate->Reset();
@@ -2048,6 +2045,7 @@ TEST_F(GestureRecognizerTest, CaptureSendsGestureEnd) {
RunAllPendingInMessageLoop();
EXPECT_TRUE(delegate->end());
+ EXPECT_TRUE(delegate->tap_cancel());
}
TEST_F(GestureRecognizerTest, PressDoesNotCrash) {
@@ -2074,6 +2072,7 @@ TEST_F(GestureRecognizerTest, PressDoesNotCrash) {
// This new press should not generate a tap-down.
EXPECT_FALSE(delegate->begin());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->scroll_begin());
}
@@ -2118,6 +2117,7 @@ TEST_F(GestureRecognizerTest, SyncTouchEventWithQueuedTouchEvents) {
queued_delegate->ReceivedAck();
RunAllPendingInMessageLoop();
+ EXPECT_TRUE(queued_delegate->tap_cancel());
EXPECT_TRUE(queued_delegate->scroll_begin());
EXPECT_TRUE(queued_delegate->scroll_update());
EXPECT_TRUE(queued_delegate->scroll_end());
@@ -2141,6 +2141,7 @@ TEST_F(GestureRecognizerTest, TwoFingerTap) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press1);
EXPECT_FALSE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -2154,6 +2155,7 @@ TEST_F(GestureRecognizerTest, TwoFingerTap) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press2);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down()); // no touch down for second tap.
+ EXPECT_TRUE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -2171,6 +2173,7 @@ TEST_F(GestureRecognizerTest, TwoFingerTap) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move2);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -2188,6 +2191,7 @@ TEST_F(GestureRecognizerTest, TwoFingerTap) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release1);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -2205,6 +2209,7 @@ TEST_F(GestureRecognizerTest, TwoFingerTap) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release2);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -2459,6 +2464,7 @@ TEST_F(GestureRecognizerTest, VeryWideTwoFingerTouchDownShouldBeAPinch) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press1);
EXPECT_FALSE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -2472,6 +2478,7 @@ TEST_F(GestureRecognizerTest, VeryWideTwoFingerTouchDownShouldBeAPinch) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press2);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down()); // no touch down for second tap.
+ EXPECT_TRUE(delegate->tap_cancel());
EXPECT_FALSE(delegate->double_tap());
EXPECT_TRUE(delegate->scroll_begin());
EXPECT_FALSE(delegate->scroll_update());
@@ -2578,6 +2585,7 @@ TEST_F(GestureRecognizerTest, GestureEventScrollTouchMoveConsumed) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press);
EXPECT_FALSE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_TRUE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -2586,10 +2594,14 @@ TEST_F(GestureRecognizerTest, GestureEventScrollTouchMoveConsumed) {
// Move the touch-point enough so that it would normally be considered a
// scroll. But since the touch-moves will be consumed, the scroll should not
- // start.
+ // start. We should, however, get the TAP_CANCEL event now (since it's now
+ // impossible for the gesture to become a tap).
SendScrollEvent(root_window(), 130, 230, kTouchId, delegate.get());
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ // TODO(rbyers): Really we should get the TapCancel here instead of below,
+ // but this is a symptom of a larger issue: crbug.com/146397.
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -2601,6 +2613,7 @@ TEST_F(GestureRecognizerTest, GestureEventScrollTouchMoveConsumed) {
SendScrollEvent(root_window(), 159, 259, kTouchId, delegate.get());
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_TRUE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_TRUE(delegate->scroll_begin());
@@ -2620,6 +2633,7 @@ TEST_F(GestureRecognizerTest, GestureEventScrollTouchMoveConsumed) {
SendScrollEvent(root_window(), 110, 211, kTouchId, delegate.get());
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -2631,6 +2645,7 @@ TEST_F(GestureRecognizerTest, GestureEventScrollTouchMoveConsumed) {
SendScrollEvent(root_window(), 140, 215, kTouchId, delegate.get());
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_FALSE(delegate->double_tap());
EXPECT_FALSE(delegate->scroll_begin());
@@ -2647,6 +2662,7 @@ TEST_F(GestureRecognizerTest, GestureEventScrollTouchMoveConsumed) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&release);
EXPECT_FALSE(delegate->tap());
EXPECT_FALSE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->begin());
EXPECT_TRUE(delegate->end());
EXPECT_FALSE(delegate->double_tap());
@@ -2688,6 +2704,7 @@ TEST_F(GestureRecognizerTest, GestureEventDoubleTap) {
EXPECT_TRUE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_TRUE(delegate->begin());
EXPECT_TRUE(delegate->end());
EXPECT_TRUE(delegate->double_tap());
@@ -2731,6 +2748,7 @@ TEST_F(GestureRecognizerTest, TwoTapsFarApart) {
EXPECT_TRUE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_TRUE(delegate->begin());
EXPECT_TRUE(delegate->end());
EXPECT_FALSE(delegate->double_tap());
@@ -2775,6 +2793,7 @@ TEST_F(GestureRecognizerTest, TwoTapsWithDelayBetween) {
EXPECT_TRUE(delegate->tap());
EXPECT_TRUE(delegate->tap_down());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_TRUE(delegate->begin());
EXPECT_TRUE(delegate->end());
EXPECT_FALSE(delegate->double_tap());
@@ -2830,6 +2849,7 @@ TEST_F(GestureRecognizerTest, BoundingBoxRadiusChange) {
move2.set_radius_y(60);
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move2);
EXPECT_FALSE(delegate->tap());
+ EXPECT_FALSE(delegate->tap_cancel());
EXPECT_FALSE(delegate->scroll_update());
EXPECT_FALSE(delegate->pinch_update());
diff --git a/ui/aura/window_unittest.cc b/ui/aura/window_unittest.cc
index 5159846..5c93819 100644
--- a/ui/aura/window_unittest.cc
+++ b/ui/aura/window_unittest.cc
@@ -927,9 +927,10 @@ TEST_F(WindowTest, TransferCaptureTouchEvents) {
d1.ResetCounts();
d2.ResetCounts();
- // Set capture on |w2|, this should send a cancel to |w1| but not |w2|.
+ // Set capture on |w2|, this should send a cancel (TAP_CANCEL, END) to |w1|
+ // but not |w2|.
w2->SetCapture();
- EXPECT_EQ(1, d1.gesture_event_count());
+ EXPECT_EQ(2, d1.gesture_event_count());
EXPECT_EQ(0, d2.gesture_event_count());
d1.ResetCounts();
d2.ResetCounts();
@@ -949,8 +950,8 @@ TEST_F(WindowTest, TransferCaptureTouchEvents) {
root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&m3);
EXPECT_EQ(0, d1.gesture_event_count());
EXPECT_EQ(0, d2.gesture_event_count());
- // |w3| gets two events, both scroll related.
- EXPECT_EQ(2, d3.gesture_event_count());
+ // |w3| gets a TAP_CANCEL and two scroll related events.
+ EXPECT_EQ(3, d3.gesture_event_count());
}
// Changes capture while capture is already ongoing.
diff --git a/ui/base/events/event_constants.h b/ui/base/events/event_constants.h
index 43a0e90..6785633 100644
--- a/ui/base/events/event_constants.h
+++ b/ui/base/events/event_constants.h
@@ -52,6 +52,7 @@ enum EventType {
ET_GESTURE_SCROLL_UPDATE,
ET_GESTURE_TAP,
ET_GESTURE_TAP_DOWN,
+ ET_GESTURE_TAP_CANCEL,
ET_GESTURE_BEGIN, // Sent before any other gesture types.
ET_GESTURE_END, // Sent after any other gestures.
ET_GESTURE_DOUBLE_TAP,
diff --git a/ui/base/gestures/gesture_sequence.cc b/ui/base/gestures/gesture_sequence.cc
index d668a1e..2c3b599 100644
--- a/ui/base/gestures/gesture_sequence.cc
+++ b/ui/base/gestures/gesture_sequence.cc
@@ -368,11 +368,14 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture(
case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED:
if (Click(event, point, gestures.get()))
point.UpdateForTap();
+ else
+ PrependTapCancelGestureEvent(point, gestures.get());
set_state(GS_NO_GESTURE);
break;
case GST_PENDING_SYNTHETIC_CLICK_FIRST_MOVED:
case GST_PENDING_SYNTHETIC_CLICK_FIRST_STATIONARY:
if (ScrollStart(event, point, gestures.get())) {
+ PrependTapCancelGestureEvent(point, gestures.get());
set_state(GS_SCROLL);
if (ScrollUpdate(event, point, gestures.get()))
point.UpdateForScroll();
@@ -380,6 +383,7 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture(
break;
case GST_PENDING_SYNTHETIC_CLICK_FIRST_RELEASED_HANDLED:
case GST_PENDING_SYNTHETIC_CLICK_FIRST_CANCELLED:
+ PrependTapCancelGestureEvent(point, gestures.get());
set_state(GS_NO_GESTURE);
break;
case GST_SCROLL_FIRST_MOVED:
@@ -394,8 +398,10 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture(
ScrollEnd(event, point, gestures.get());
set_state(GS_NO_GESTURE);
break;
- case GST_SCROLL_SECOND_PRESSED:
case GST_PENDING_SYNTHETIC_CLICK_SECOND_PRESSED:
+ PrependTapCancelGestureEvent(point, gestures.get());
+ // fall through
+ case GST_SCROLL_SECOND_PRESSED:
if (IsSecondTouchDownCloseEnoughForTwoFingerTap()) {
TwoFingerTouchDown(event, point, gestures.get());
set_state(GS_PENDING_TWO_FINGER_TAP);
@@ -597,6 +603,16 @@ void GestureSequence::AppendTapDownGestureEvent(const GesturePoint& point,
1 << point.touch_id()));
}
+void GestureSequence::PrependTapCancelGestureEvent(const GesturePoint& point,
+ Gestures* gestures) {
+ gestures->insert(gestures->begin(), CreateGestureEvent(
+ GestureEventDetails(ui::ET_GESTURE_TAP_CANCEL, 0, 0),
+ point.first_touch_position(),
+ flags_,
+ base::Time::FromDoubleT(point.last_touch_time()),
+ 1 << point.touch_id()));
+}
+
void GestureSequence::AppendBeginGestureEvent(const GesturePoint& point,
Gestures* gestures) {
gestures->push_back(CreateGestureEvent(
diff --git a/ui/base/gestures/gesture_sequence.h b/ui/base/gestures/gesture_sequence.h
index e6988e5..0581f1e 100644
--- a/ui/base/gestures/gesture_sequence.h
+++ b/ui/base/gestures/gesture_sequence.h
@@ -86,6 +86,8 @@ class UI_EXPORT GestureSequence {
// Tap gestures.
void AppendTapDownGestureEvent(const GesturePoint& point, Gestures* gestures);
+ void PrependTapCancelGestureEvent(const GesturePoint& point,
+ Gestures* gestures);
void AppendBeginGestureEvent(const GesturePoint& point, Gestures* gestures);
void AppendEndGestureEvent(const GesturePoint& point, Gestures* gestures);
void AppendClickGestureEvent(const GesturePoint& point,