summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-12 22:19:43 +0000
committertdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-12 22:19:43 +0000
commit08d67e4794cbcf4c313adc8fe86b6e1b88a6e970 (patch)
tree73404dd7b8056e9a0a5c497cb2a5b270c36b19a3
parentc5dd54b0b5960408f334c540914c138f1a8a7e57 (diff)
downloadchromium_src-08d67e4794cbcf4c313adc8fe86b6e1b88a6e970.zip
chromium_src-08d67e4794cbcf4c313adc8fe86b6e1b88a6e970.tar.gz
chromium_src-08d67e4794cbcf4c313adc8fe86b6e1b88a6e970.tar.bz2
Pass location with gestures created in TouchDispositionGestureFilter
Aura uses the locations of some ending events which weren't being assigned locations in the TDGF. To use the unified GR on Aura, we need these locations to be assigned correctly. We use the location of the first pointer down when the gesture was created a the location of the gestures created by the TDGF. BUG=371875 TEST=TouchDispositionGestureFilterTest.* Review URL: https://codereview.chromium.org/277373002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@269893 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--ui/events/gesture_detection/gesture_event_data_packet.cc17
-rw-r--r--ui/events/gesture_detection/gesture_event_data_packet.h6
-rw-r--r--ui/events/gesture_detection/touch_disposition_gesture_filter.cc82
-rw-r--r--ui/events/gesture_detection/touch_disposition_gesture_filter.h8
-rw-r--r--ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc31
5 files changed, 96 insertions, 48 deletions
diff --git a/ui/events/gesture_detection/gesture_event_data_packet.cc b/ui/events/gesture_detection/gesture_event_data_packet.cc
index 58d4e50..5fc9190 100644
--- a/ui/events/gesture_detection/gesture_event_data_packet.cc
+++ b/ui/events/gesture_detection/gesture_event_data_packet.cc
@@ -36,8 +36,12 @@ GestureEventDataPacket::GestureEventDataPacket()
: gesture_count_(0), gesture_source_(UNDEFINED) {}
GestureEventDataPacket::GestureEventDataPacket(base::TimeTicks timestamp,
- GestureSource source)
- : timestamp_(timestamp), gesture_count_(0), gesture_source_(source) {
+ GestureSource source,
+ gfx::PointF touch_location)
+ : timestamp_(timestamp),
+ gesture_count_(0),
+ touch_location_(touch_location),
+ gesture_source_(source) {
DCHECK_NE(gesture_source_, UNDEFINED);
}
@@ -45,6 +49,7 @@ GestureEventDataPacket::GestureEventDataPacket(
const GestureEventDataPacket& other)
: timestamp_(other.timestamp_),
gesture_count_(other.gesture_count_),
+ touch_location_(other.touch_location_),
gesture_source_(other.gesture_source_) {
std::copy(other.gestures_, other.gestures_ + other.gesture_count_, gestures_);
}
@@ -56,6 +61,7 @@ GestureEventDataPacket& GestureEventDataPacket::operator=(
timestamp_ = other.timestamp_;
gesture_count_ = other.gesture_count_;
gesture_source_ = other.gesture_source_;
+ touch_location_ = other.touch_location_;
std::copy(other.gestures_, other.gestures_ + other.gesture_count_, gestures_);
return *this;
}
@@ -68,12 +74,15 @@ void GestureEventDataPacket::Push(const GestureEventData& gesture) {
GestureEventDataPacket GestureEventDataPacket::FromTouch(
const ui::MotionEvent& touch) {
- return GestureEventDataPacket(touch.GetEventTime(), ToGestureSource(touch));
+ return GestureEventDataPacket(touch.GetEventTime(),
+ ToGestureSource(touch),
+ gfx::PointF(touch.GetX(), touch.GetY()));
}
GestureEventDataPacket GestureEventDataPacket::FromTouchTimeout(
const GestureEventData& gesture) {
- GestureEventDataPacket packet(gesture.time, TOUCH_TIMEOUT);
+ GestureEventDataPacket packet(
+ gesture.time, TOUCH_TIMEOUT, gfx::PointF(gesture.x, gesture.y));
packet.Push(gesture);
return packet;
}
diff --git a/ui/events/gesture_detection/gesture_event_data_packet.h b/ui/events/gesture_detection/gesture_event_data_packet.h
index fee86f1..777b0d5 100644
--- a/ui/events/gesture_detection/gesture_event_data_packet.h
+++ b/ui/events/gesture_detection/gesture_event_data_packet.h
@@ -44,14 +44,18 @@ class GESTURE_DETECTION_EXPORT GestureEventDataPacket {
const GestureEventData& gesture(size_t i) const { return gestures_[i]; }
size_t gesture_count() const { return gesture_count_; }
GestureSource gesture_source() const { return gesture_source_; }
+ gfx::PointF touch_location() const { return touch_location_; }
private:
- GestureEventDataPacket(base::TimeTicks timestamp, GestureSource source);
+ GestureEventDataPacket(base::TimeTicks timestamp,
+ GestureSource source,
+ gfx::PointF touch_location);
enum { kMaxGesturesPerTouch = 5 };
base::TimeTicks timestamp_;
GestureEventData gestures_[kMaxGesturesPerTouch];
size_t gesture_count_;
+ gfx::PointF touch_location_;
GestureSource gesture_source_;
};
diff --git a/ui/events/gesture_detection/touch_disposition_gesture_filter.cc b/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
index bfff780..a1b4543 100644
--- a/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
+++ b/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
@@ -17,15 +17,16 @@ COMPILE_ASSERT(ET_GESTURE_TYPE_END - ET_GESTURE_TYPE_START < 32,
GestureEventData CreateGesture(EventType type,
int motion_event_id,
- const base::TimeTicks& timestamp) {
+ const base::TimeTicks& timestamp,
+ const gfx::PointF& location) {
GestureEventDetails details(type, 0, 0);
return GestureEventData(type,
motion_event_id,
timestamp,
- 0,
- 0,
+ location.x(),
+ location.y(),
1,
- gfx::RectF(0, 0, 0, 0),
+ gfx::RectF(location.x(), location.y(), 0, 0),
details);
}
@@ -129,11 +130,14 @@ TouchDispositionGestureFilter::TouchDispositionGestureFilter(
needs_tap_ending_event_(false),
needs_show_press_event_(false),
needs_fling_ending_event_(false),
- needs_scroll_ending_event_(false) {
+ needs_scroll_ending_event_(false),
+ packet_being_sent_(NULL) {
DCHECK(client_);
}
-TouchDispositionGestureFilter::~TouchDispositionGestureFilter() {}
+TouchDispositionGestureFilter::~TouchDispositionGestureFilter() {
+ DCHECK(!packet_being_sent_);
+}
TouchDispositionGestureFilter::PacketResult
TouchDispositionGestureFilter::OnGesturePacket(
@@ -205,10 +209,12 @@ bool TouchDispositionGestureFilter::IsEmpty() const {
void TouchDispositionGestureFilter::FilterAndSendPacket(
const GestureEventDataPacket& packet) {
+ base::AutoReset<const GestureEventDataPacket*> packet_being_sent(
+ &packet_being_sent_, &packet);
if (packet.gesture_source() == GestureEventDataPacket::TOUCH_SEQUENCE_START) {
- CancelTapIfNecessary(packet.timestamp());
- EndScrollIfNecessary(packet.timestamp());
- CancelFlingIfNecessary(packet.timestamp());
+ CancelTapIfNecessary();
+ EndScrollIfNecessary();
+ CancelFlingIfNecessary();
}
for (size_t i = 0; i < packet.gesture_count(); ++i) {
@@ -216,7 +222,7 @@ void TouchDispositionGestureFilter::FilterAndSendPacket(
DCHECK(ET_GESTURE_TYPE_START <= gesture.type &&
gesture.type <= ET_GESTURE_TYPE_END);
if (state_.Filter(gesture.type)) {
- CancelTapIfNecessary(gesture.time);
+ CancelTapIfNecessary();
continue;
}
SendGesture(gesture);
@@ -224,11 +230,11 @@ void TouchDispositionGestureFilter::FilterAndSendPacket(
if (packet.gesture_source() ==
GestureEventDataPacket::TOUCH_SEQUENCE_CANCEL) {
- EndScrollIfNecessary(packet.timestamp());
- CancelTapIfNecessary(packet.timestamp());
+ EndScrollIfNecessary();
+ CancelTapIfNecessary();
} else if (packet.gesture_source() ==
GestureEventDataPacket::TOUCH_SEQUENCE_END) {
- EndScrollIfNecessary(packet.timestamp());
+ EndScrollIfNecessary();
}
}
@@ -239,8 +245,8 @@ void TouchDispositionGestureFilter::SendGesture(const GestureEventData& event) {
case ET_GESTURE_LONG_TAP:
if (!needs_tap_ending_event_)
return;
- CancelTapIfNecessary(event.time);
- CancelFlingIfNecessary(event.time);
+ CancelTapIfNecessary();
+ CancelFlingIfNecessary();
break;
case ET_GESTURE_TAP_DOWN:
DCHECK(!needs_tap_ending_event_);
@@ -254,7 +260,7 @@ void TouchDispositionGestureFilter::SendGesture(const GestureEventData& event) {
needs_show_press_event_ = false;
break;
case ET_GESTURE_DOUBLE_TAP:
- CancelTapIfNecessary(event.time);
+ CancelTapIfNecessary();
needs_show_press_event_ = false;
break;
case ET_GESTURE_TAP:
@@ -271,9 +277,9 @@ void TouchDispositionGestureFilter::SendGesture(const GestureEventData& event) {
needs_tap_ending_event_ = false;
break;
case ET_GESTURE_SCROLL_BEGIN:
- CancelTapIfNecessary(event.time);
- CancelFlingIfNecessary(event.time);
- EndScrollIfNecessary(event.time);
+ CancelTapIfNecessary();
+ CancelFlingIfNecessary();
+ EndScrollIfNecessary();
ending_event_motion_event_id_ = event.motion_event_id;
needs_scroll_ending_event_ = true;
break;
@@ -281,7 +287,7 @@ void TouchDispositionGestureFilter::SendGesture(const GestureEventData& event) {
needs_scroll_ending_event_ = false;
break;
case ET_SCROLL_FLING_START:
- CancelFlingIfNecessary(event.time);
+ CancelFlingIfNecessary();
ending_event_motion_event_id_ = event.motion_event_id;
needs_fling_ending_event_ = true;
needs_scroll_ending_event_ = false;
@@ -295,33 +301,39 @@ void TouchDispositionGestureFilter::SendGesture(const GestureEventData& event) {
client_->ForwardGestureEvent(event);
}
-void TouchDispositionGestureFilter::CancelTapIfNecessary(
- const base::TimeTicks& timestamp) {
- if (!needs_tap_ending_event_)
+void TouchDispositionGestureFilter::CancelTapIfNecessary() {
+ DCHECK(packet_being_sent_);
+ if (!needs_tap_ending_event_ || !packet_being_sent_)
return;
- SendGesture(CreateGesture(
- ET_GESTURE_TAP_CANCEL, ending_event_motion_event_id_, timestamp));
+ SendGesture(CreateGesture(ET_GESTURE_TAP_CANCEL,
+ ending_event_motion_event_id_,
+ packet_being_sent_->timestamp(),
+ packet_being_sent_->touch_location()));
DCHECK(!needs_tap_ending_event_);
}
-void TouchDispositionGestureFilter::CancelFlingIfNecessary(
- const base::TimeTicks& timestamp) {
- if (!needs_fling_ending_event_)
+void TouchDispositionGestureFilter::CancelFlingIfNecessary() {
+ DCHECK(packet_being_sent_);
+ if (!needs_fling_ending_event_ || !packet_being_sent_)
return;
- SendGesture(CreateGesture(
- ET_SCROLL_FLING_CANCEL, ending_event_motion_event_id_, timestamp));
+ SendGesture(CreateGesture(ET_SCROLL_FLING_CANCEL,
+ ending_event_motion_event_id_,
+ packet_being_sent_->timestamp(),
+ packet_being_sent_->touch_location()));
DCHECK(!needs_fling_ending_event_);
}
-void TouchDispositionGestureFilter::EndScrollIfNecessary(
- const base::TimeTicks& timestamp) {
- if (!needs_scroll_ending_event_)
+void TouchDispositionGestureFilter::EndScrollIfNecessary() {
+ DCHECK(packet_being_sent_);
+ if (!needs_scroll_ending_event_ || !packet_being_sent_)
return;
- SendGesture(CreateGesture(
- ET_GESTURE_SCROLL_END, ending_event_motion_event_id_, timestamp));
+ SendGesture(CreateGesture(ET_GESTURE_SCROLL_END,
+ ending_event_motion_event_id_,
+ packet_being_sent_->timestamp(),
+ packet_being_sent_->touch_location()));
DCHECK(!needs_scroll_ending_event_);
}
diff --git a/ui/events/gesture_detection/touch_disposition_gesture_filter.h b/ui/events/gesture_detection/touch_disposition_gesture_filter.h
index fc49301..e3ffd2b 100644
--- a/ui/events/gesture_detection/touch_disposition_gesture_filter.h
+++ b/ui/events/gesture_detection/touch_disposition_gesture_filter.h
@@ -78,9 +78,9 @@ class GESTURE_DETECTION_EXPORT TouchDispositionGestureFilter {
void FilterAndSendPacket(const GestureEventDataPacket& packet);
void SendGesture(const GestureEventData& gesture);
- void CancelTapIfNecessary(const base::TimeTicks& timestamp);
- void CancelFlingIfNecessary(const base::TimeTicks& timestamp);
- void EndScrollIfNecessary(const base::TimeTicks& timestamp);
+ void CancelTapIfNecessary();
+ void CancelFlingIfNecessary();
+ void EndScrollIfNecessary();
void PopGestureSequence();
GestureSequence& Head();
GestureSequence& Tail();
@@ -98,6 +98,8 @@ class GESTURE_DETECTION_EXPORT TouchDispositionGestureFilter {
bool needs_show_press_event_;
bool needs_fling_ending_event_;
bool needs_scroll_ending_event_;
+ // Only valid in the scope of |FilterAndSendPacket()|.
+ const GestureEventDataPacket* packet_being_sent_;
DISALLOW_COPY_AND_ASSIGN(TouchDispositionGestureFilter);
};
diff --git a/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc b/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
index 6e78240..391c669 100644
--- a/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
+++ b/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
@@ -32,6 +32,7 @@ class TouchDispositionGestureFilterTest
++sent_gesture_count_;
last_sent_gesture_time_ = event.time;
sent_gestures_.push_back(event.type);
+ last_sent_gesture_location_ = gfx::PointF(event.x, event.y);
if (cancel_after_next_gesture_) {
CancelTouchPoint();
SendTouchNotConsumedAck();
@@ -177,13 +178,22 @@ class TouchDispositionGestureFilterTest
return sent_gestures;
}
+ gfx::PointF LastSentGestureLocation() {
+ return last_sent_gesture_location_;
+ }
+
void SetCancelAfterNextGesture(bool cancel_after_next_gesture) {
cancel_after_next_gesture_ = cancel_after_next_gesture;
}
- static GestureEventData CreateGesture(EventType type) {
- return GestureEventData(
- type, 0, base::TimeTicks(), 0, 0, 1, gfx::RectF(0, 0, 0, 0));
+ GestureEventData CreateGesture(EventType type) {
+ return GestureEventData(type,
+ 0,
+ base::TimeTicks(),
+ touch_event_.GetX(0),
+ touch_event_.GetY(0),
+ 1,
+ gfx::RectF(0, 0, 0, 0));
}
private:
@@ -194,6 +204,7 @@ class TouchDispositionGestureFilterTest
size_t sent_gesture_count_;
base::TimeTicks last_sent_gesture_time_;
GestureList sent_gestures_;
+ gfx::PointF last_sent_gesture_location_;
};
TEST_F(TouchDispositionGestureFilterTest, BasicNoGestures) {
@@ -569,6 +580,7 @@ TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnNewTouchSequence) {
EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL),
GetAndResetSentGestures()));
EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
+ EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
ReleaseTouchPoint();
SendTouchNotConsumedAck();
EXPECT_FALSE(GesturesSent());
@@ -589,6 +601,7 @@ TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnTouchReleaseIfNoFling) {
EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
GetAndResetSentGestures()));
EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
+ EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
}
TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnNewTouchSequence) {
@@ -604,11 +617,12 @@ TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnNewTouchSequence) {
// A new touch sequence should end the outstanding scroll.
ResetTouchPoints();
- PressTouchPoint(1, 1);
+ PressTouchPoint(2, 3);
SendTouchConsumedAck();
EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
GetAndResetSentGestures()));
EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
+ EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(2, 3));
}
TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnScrollBegin) {
@@ -641,7 +655,7 @@ TEST_F(TouchDispositionGestureFilterTest, FlingNotCancelledIfGFCEventReceived) {
PressTouchPoint(1, 1);
SendTouchNotConsumedAck();
PushGesture(ET_SCROLL_FLING_START);
- MoveTouchPoint(0, 1, 1);
+ MoveTouchPoint(0, 2, 3);
SendTouchNotConsumedAck();
PushGesture(ET_SCROLL_FLING_CANCEL);
ReleaseTouchPoint();
@@ -650,6 +664,7 @@ TEST_F(TouchDispositionGestureFilterTest, FlingNotCancelledIfGFCEventReceived) {
ET_SCROLL_FLING_START,
ET_SCROLL_FLING_CANCEL),
GetAndResetSentGestures()));
+ EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(2, 3));
// A new touch sequence will not inject a ET_SCROLL_FLING_CANCEL, as the fling
// has already been cancelled.
@@ -689,6 +704,7 @@ TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenTouchConsumed) {
SendTouchConsumedAck();
EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
GetAndResetSentGestures()));
+ EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(2, 2));
}
TEST_F(TouchDispositionGestureFilterTest,
@@ -888,6 +904,7 @@ TEST_F(TouchDispositionGestureFilterTest, TapAndScrollCancelledOnTouchCancel) {
EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
GetAndResetSentGestures()));
EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
+ EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
PushGesture(ET_GESTURE_SCROLL_BEGIN);
PressTouchPoint(1, 1);
@@ -902,6 +919,7 @@ TEST_F(TouchDispositionGestureFilterTest, TapAndScrollCancelledOnTouchCancel) {
EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
GetAndResetSentGestures()));
EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
+ EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
}
TEST_F(TouchDispositionGestureFilterTest,
@@ -928,6 +946,7 @@ TEST_F(TouchDispositionGestureFilterTest,
SendTouchNotConsumedAck();
EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_END, ET_GESTURE_SCROLL_END),
GetAndResetSentGestures()));
+ EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(2, 2));
PushGesture(ET_GESTURE_BEGIN);
PushGesture(ET_GESTURE_SCROLL_BEGIN);
@@ -950,6 +969,7 @@ TEST_F(TouchDispositionGestureFilterTest, TapCancelledOnTouchCancel) {
EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
GetAndResetSentGestures()));
EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
+ EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
}
// Test that a GestureEvent whose dispatch causes a cancel event to be fired
@@ -962,6 +982,7 @@ TEST_F(TouchDispositionGestureFilterTest, TestCancelMidGesture) {
EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN,
ET_GESTURE_TAP_CANCEL),
GetAndResetSentGestures()));
+ EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
}
// Test that a MultiFingerSwipe event is dispatched when appropriate.