Index: ui/events/gesture_detection/gesture_provider.cc |
diff --git a/ui/events/gesture_detection/gesture_provider.cc b/ui/events/gesture_detection/gesture_provider.cc |
index dbe4de4cdc83b50b7a48d4494d7722fe1c7a8df4..8a712ac82898a2043bfbd02afacde4dcf8204254 100644 |
--- a/ui/events/gesture_detection/gesture_provider.cc |
+++ b/ui/events/gesture_detection/gesture_provider.cc |
@@ -42,22 +42,20 @@ gfx::RectF GetBoundingBox(const MotionEvent& event) { |
return bounds; |
} |
-GestureEventData CreateGesture(EventType type, |
+GestureEventData CreateGesture(const GestureEventDetails& details, |
int motion_event_id, |
base::TimeTicks time, |
float x, |
float y, |
size_t touch_point_count, |
- const gfx::RectF& bounding_box, |
- const GestureEventDetails& details) { |
- return GestureEventData(type, |
+ const gfx::RectF& bounding_box) { |
+ return GestureEventData(details, |
motion_event_id, |
time, |
x, |
y, |
static_cast<int>(touch_point_count), |
- bounding_box, |
- details); |
+ bounding_box); |
} |
GestureEventData CreateGesture(EventType type, |
@@ -76,17 +74,15 @@ GestureEventData CreateGesture(EventType type, |
bounding_box); |
} |
-GestureEventData CreateGesture(EventType type, |
- const MotionEvent& event, |
- const GestureEventDetails& details) { |
- return CreateGesture(type, |
+GestureEventData CreateGesture(const GestureEventDetails& details, |
+ const MotionEvent& event) { |
+ return CreateGesture(details, |
event.GetId(), |
event.GetEventTime(), |
event.GetX(), |
event.GetY(), |
event.GetPointerCount(), |
- GetBoundingBox(event), |
- details); |
+ GetBoundingBox(event)); |
} |
GestureEventData CreateGesture(EventType type, |
@@ -100,8 +96,7 @@ GestureEventData CreateGesture(EventType type, |
GetBoundingBox(event)); |
} |
-GestureEventDetails CreateTapGestureDetails(EventType type, |
- const MotionEvent& event) { |
+GestureEventDetails CreateTapGestureDetails(EventType type) { |
// Set the tap count to 1 even for ET_GESTURE_DOUBLE_TAP, in order to be |
// consistent with double tap behavior on a mobile viewport. See |
// crbug.com/234986 for context. |
@@ -116,7 +111,8 @@ GestureEventDetails CreateTapGestureDetails(EventType type, |
GestureProvider::Config::Config() |
: display(gfx::Display::kInvalidDisplayID, gfx::Rect(1, 1)), |
disable_click_delay(false), |
- gesture_begin_end_types_enabled(false) {} |
+ gesture_begin_end_types_enabled(false), |
+ min_gesture_bounds_length(0) {} |
GestureProvider::Config::~Config() {} |
@@ -205,14 +201,13 @@ class GestureProvider::ScaleGestureListenerImpl |
std::abs(dy)); |
} |
GestureEventDetails pinch_details(ET_GESTURE_PINCH_UPDATE, scale, 0); |
- provider_->Send(CreateGesture(ET_GESTURE_PINCH_UPDATE, |
+ provider_->Send(CreateGesture(pinch_details, |
e.GetId(), |
detector.GetEventTime(), |
detector.GetFocusX(), |
detector.GetFocusY(), |
e.GetPointerCount(), |
- GetBoundingBox(e), |
- pinch_details)); |
+ GetBoundingBox(e))); |
return true; |
} |
@@ -303,7 +298,7 @@ class GestureProvider::GestureListenerImpl |
seen_first_scroll_event_ = false; |
GestureEventDetails tap_details(ET_GESTURE_TAP_DOWN, 0, 0); |
- provider_->Send(CreateGesture(ET_GESTURE_TAP_DOWN, e, tap_details)); |
+ provider_->Send(CreateGesture(tap_details, e)); |
// Return true to indicate that we want to handle touch. |
return true; |
@@ -345,28 +340,26 @@ class GestureProvider::GestureListenerImpl |
// Use the co-ordinates from the touch down, as these co-ordinates are |
// used to determine which layer the scroll should affect. |
- provider_->Send(CreateGesture(ET_GESTURE_SCROLL_BEGIN, |
+ provider_->Send(CreateGesture(scroll_details, |
e2.GetId(), |
e2.GetEventTime(), |
e1.GetX(), |
e1.GetY(), |
e2.GetPointerCount(), |
- GetBoundingBox(e2), |
- scroll_details)); |
+ GetBoundingBox(e2))); |
} |
if (distance_x || distance_y) { |
const gfx::RectF bounding_box = GetBoundingBox(e2); |
GestureEventDetails scroll_details( |
ET_GESTURE_SCROLL_UPDATE, -distance_x, -distance_y); |
- provider_->Send(CreateGesture(ET_GESTURE_SCROLL_UPDATE, |
+ provider_->Send(CreateGesture(scroll_details, |
e2.GetId(), |
e2.GetEventTime(), |
bounding_box.CenterPoint().x(), |
bounding_box.CenterPoint().y(), |
e2.GetPointerCount(), |
- bounding_box, |
- scroll_details)); |
+ bounding_box)); |
} |
return true; |
@@ -393,7 +386,7 @@ class GestureProvider::GestureListenerImpl |
float velocity_x, |
float velocity_y) OVERRIDE { |
GestureEventDetails swipe_details(ET_GESTURE_SWIPE, velocity_x, velocity_y); |
- provider_->Send(CreateGesture(ET_GESTURE_SWIPE, e2, swipe_details)); |
+ provider_->Send(CreateGesture(swipe_details, e2)); |
return true; |
} |
@@ -404,21 +397,19 @@ class GestureProvider::GestureListenerImpl |
GestureEventDetails two_finger_tap_details(ET_GESTURE_TWO_FINGER_TAP, |
e1.GetTouchMajor(), |
e1.GetTouchMajor()); |
- provider_->Send(CreateGesture(ET_GESTURE_TWO_FINGER_TAP, |
+ provider_->Send(CreateGesture(two_finger_tap_details, |
e2.GetId(), |
e2.GetEventTime(), |
e1.GetX(), |
e1.GetY(), |
e2.GetPointerCount(), |
- GetBoundingBox(e2), |
- two_finger_tap_details)); |
+ GetBoundingBox(e2))); |
return true; |
} |
virtual void OnShowPress(const MotionEvent& e) OVERRIDE { |
GestureEventDetails show_press_details(ET_GESTURE_SHOW_PRESS, 0, 0); |
- provider_->Send( |
- CreateGesture(ET_GESTURE_SHOW_PRESS, e, show_press_details)); |
+ provider_->Send(CreateGesture(show_press_details, e)); |
} |
virtual bool OnSingleTapUp(const MotionEvent& e) OVERRIDE { |
@@ -439,9 +430,7 @@ class GestureProvider::GestureListenerImpl |
// Notify Blink about this tapUp event anyway, when none of the above |
// conditions applied. |
provider_->Send(CreateGesture( |
- ET_GESTURE_TAP_UNCONFIRMED, |
- e, |
- CreateTapGestureDetails(ET_GESTURE_TAP_UNCONFIRMED, e))); |
+ CreateTapGestureDetails(ET_GESTURE_TAP_UNCONFIRMED), e)); |
} |
} |
@@ -459,8 +448,7 @@ class GestureProvider::GestureListenerImpl |
ignore_single_tap_ = true; |
- provider_->Send(CreateGesture( |
- ET_GESTURE_TAP, e, CreateTapGestureDetails(ET_GESTURE_TAP, e))); |
+ provider_->Send(CreateGesture(CreateTapGestureDetails(ET_GESTURE_TAP), e)); |
return true; |
} |
@@ -476,9 +464,7 @@ class GestureProvider::GestureListenerImpl |
if (!provider_->IsPinchInProgress() && |
!provider_->IsScrollInProgress()) { |
provider_->Send( |
- CreateGesture(ET_GESTURE_DOUBLE_TAP, |
- e, |
- CreateTapGestureDetails(ET_GESTURE_DOUBLE_TAP, e))); |
+ CreateGesture(CreateTapGestureDetails(ET_GESTURE_DOUBLE_TAP), e)); |
return true; |
} |
break; |
@@ -493,8 +479,7 @@ class GestureProvider::GestureListenerImpl |
SetIgnoreSingleTap(true); |
GestureEventDetails long_press_details(ET_GESTURE_LONG_PRESS, 0, 0); |
- provider_->Send( |
- CreateGesture(ET_GESTURE_LONG_PRESS, e, long_press_details)); |
+ provider_->Send(CreateGesture(long_press_details, e)); |
// Returning true puts the GestureDetector in "longpress" mode, disabling |
// further scrolling. This is undesirable, as it is quite common for a |
@@ -554,7 +539,8 @@ GestureProvider::GestureProvider(const Config& config, |
pinch_in_progress_(false), |
double_tap_support_for_page_(true), |
double_tap_support_for_platform_(true), |
- gesture_begin_end_types_enabled_(config.gesture_begin_end_types_enabled) { |
+ gesture_begin_end_types_enabled_(config.gesture_begin_end_types_enabled), |
+ min_gesture_bounds_length_(config.min_gesture_bounds_length) { |
DCHECK(client); |
InitGestureDetectors(config); |
} |
@@ -644,25 +630,33 @@ void GestureProvider::Fling(const MotionEvent& event, |
// start hint. |
GestureEventDetails scroll_details( |
ET_GESTURE_SCROLL_BEGIN, velocity_x, velocity_y); |
- Send(CreateGesture(ET_GESTURE_SCROLL_BEGIN, event, scroll_details)); |
+ Send(CreateGesture(scroll_details, event)); |
} |
EndTouchScrollIfNecessary(event, false); |
GestureEventDetails fling_details( |
ET_SCROLL_FLING_START, velocity_x, velocity_y); |
- Send(CreateGesture( |
- ET_SCROLL_FLING_START, event, fling_details)); |
+ Send(CreateGesture(fling_details, event)); |
} |
-void GestureProvider::Send(const GestureEventData& gesture) { |
+void GestureProvider::Send(GestureEventData gesture) { |
DCHECK(!gesture.time.is_null()); |
// The only valid events that should be sent without an active touch sequence |
// are SHOW_PRESS and TAP, potentially triggered by the double-tap |
// delay timing out. |
- DCHECK(current_down_event_ || gesture.type == ET_GESTURE_TAP || |
- gesture.type == ET_GESTURE_SHOW_PRESS); |
- |
- switch (gesture.type) { |
+ DCHECK(current_down_event_ || gesture.type() == ET_GESTURE_TAP || |
+ gesture.type() == ET_GESTURE_SHOW_PRESS); |
+ |
+ // TODO(jdduke): Provide a way of skipping this clamping for stylus and/or |
+ // mouse-based input, perhaps by exposing the source type on MotionEvent. |
+ const gfx::RectF& gesture_bounds = gesture.details.bounding_box_f(); |
+ gesture.details.set_bounding_box(gfx::RectF( |
+ gesture_bounds.x(), |
+ gesture_bounds.y(), |
+ std::max(min_gesture_bounds_length_, gesture_bounds.width()), |
+ std::max(min_gesture_bounds_length_, gesture_bounds.height()))); |
+ |
+ switch (gesture.type()) { |
case ET_GESTURE_LONG_PRESS: |
DCHECK(!scale_gesture_listener_->IsScaleGestureDetectionInProgress()); |
current_longpress_time_ = gesture.time; |
@@ -720,7 +714,7 @@ bool GestureProvider::SendLongTapIfNecessary(const MotionEvent& event) { |
!current_longpress_time_.is_null() && |
!scale_gesture_listener_->IsScaleGestureDetectionInProgress()) { |
GestureEventDetails long_tap_details(ET_GESTURE_LONG_TAP, 0, 0); |
- Send(CreateGesture(ET_GESTURE_LONG_TAP, event, long_tap_details)); |
+ Send(CreateGesture(long_tap_details, event)); |
return true; |
} |
return false; |