| 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 d965bf0cbbec1180bba97b4d50f22baee61e9bc6..6c581febd91294374a308c53e6675d7bec098932 100644
|
| --- a/ui/events/gesture_detection/gesture_provider.cc
|
| +++ b/ui/events/gesture_detection/gesture_provider.cc
|
| @@ -79,7 +79,8 @@ GestureEventDetails CreateTapGestureDetails(EventType type,
|
|
|
| // GestureProvider:::Config
|
|
|
| -GestureProvider::Config::Config() : disable_click_delay(false) {}
|
| +GestureProvider::Config::Config()
|
| + : disable_click_delay(false), gesture_begin_end_types_enabled(false) {}
|
|
|
| GestureProvider::Config::~Config() {}
|
|
|
| @@ -532,7 +533,8 @@ GestureProvider::GestureProvider(const Config& config,
|
| touch_scroll_in_progress_(false),
|
| pinch_in_progress_(false),
|
| double_tap_support_for_page_(true),
|
| - double_tap_support_for_platform_(true) {
|
| + double_tap_support_for_platform_(true),
|
| + gesture_begin_end_types_enabled_(config.gesture_begin_end_types_enabled) {
|
| DCHECK(client);
|
| InitGestureDetectors(config);
|
| }
|
| @@ -548,33 +550,10 @@ bool GestureProvider::OnTouchEvent(const MotionEvent& event) {
|
| const bool in_scale_gesture =
|
| scale_gesture_listener_->IsScaleGestureDetectionInProgress();
|
|
|
| - if (event.GetAction() == MotionEvent::ACTION_DOWN) {
|
| - current_down_event_ = event.Clone();
|
| - touch_scroll_in_progress_ = false;
|
| - needs_show_press_event_ = true;
|
| - current_longpress_time_ = base::TimeTicks();
|
| - SendTapCancelIfNecessary(event);
|
| - }
|
| -
|
| - bool handled = gesture_listener_->OnTouchEvent(event, in_scale_gesture);
|
| - handled |= scale_gesture_listener_->OnTouchEvent(event);
|
| -
|
| - if (event.GetAction() == MotionEvent::ACTION_UP ||
|
| - event.GetAction() == MotionEvent::ACTION_CANCEL) {
|
| - // Note: This call will have no effect if a fling was just generated, as
|
| - // |Fling()| will have already signalled an end to touch-scrolling.
|
| - EndTouchScrollIfNecessary(event, true);
|
| -
|
| - // We shouldn't necessarily cancel a tap on ACTION_UP, as the double-tap
|
| - // timeout may yet trigger a SINGLE_TAP.
|
| - if (event.GetAction() == MotionEvent::ACTION_CANCEL)
|
| - SendTapCancelIfNecessary(event);
|
| -
|
| - UpdateDoubleTapDetectionSupport();
|
| -
|
| - current_down_event_.reset();
|
| - }
|
| -
|
| + OnTouchEventHandlingBegin(event);
|
| + gesture_listener_->OnTouchEvent(event, in_scale_gesture);
|
| + scale_gesture_listener_->OnTouchEvent(event);
|
| + OnTouchEventHandlingEnd(event);
|
| return true;
|
| }
|
|
|
| @@ -677,6 +656,7 @@ void GestureProvider::Send(const GestureEventData& gesture) {
|
| switch (gesture.type) {
|
| case ET_GESTURE_TAP_DOWN:
|
| needs_tap_ending_event_ = true;
|
| + needs_show_press_event_ = true;
|
| break;
|
| case ET_GESTURE_TAP_UNCONFIRMED:
|
| needs_show_press_event_ = false;
|
| @@ -786,4 +766,58 @@ void GestureProvider::UpdateDoubleTapDetectionSupport() {
|
| scale_gesture_listener_->SetDoubleTapEnabled(supports_double_tap);
|
| }
|
|
|
| +void GestureProvider::OnTouchEventHandlingBegin(const MotionEvent& event) {
|
| + switch (event.GetAction()) {
|
| + case MotionEvent::ACTION_DOWN:
|
| + current_down_event_ = event.Clone();
|
| + touch_scroll_in_progress_ = false;
|
| + needs_show_press_event_ = false;
|
| + current_longpress_time_ = base::TimeTicks();
|
| + SendTapCancelIfNecessary(event);
|
| + if (gesture_begin_end_types_enabled_)
|
| + Send(CreateGesture(ET_GESTURE_BEGIN, event));
|
| + break;
|
| + case MotionEvent::ACTION_POINTER_DOWN:
|
| + if (gesture_begin_end_types_enabled_)
|
| + Send(CreateGesture(ET_GESTURE_BEGIN, event));
|
| + break;
|
| + case MotionEvent::ACTION_POINTER_UP:
|
| + case MotionEvent::ACTION_UP:
|
| + case MotionEvent::ACTION_CANCEL:
|
| + case MotionEvent::ACTION_MOVE:
|
| + break;
|
| + }
|
| +}
|
| +
|
| +void GestureProvider::OnTouchEventHandlingEnd(const MotionEvent& event) {
|
| + switch (event.GetAction()) {
|
| + case MotionEvent::ACTION_UP:
|
| + case MotionEvent::ACTION_CANCEL:
|
| + // Note: This call will have no effect if a fling was just generated, as
|
| + // |Fling()| will have already signalled an end to touch-scrolling.
|
| + EndTouchScrollIfNecessary(event, true);
|
| +
|
| + // We shouldn't necessarily cancel a tap on ACTION_UP, as the double-tap
|
| + // timeout may yet trigger a SINGLE_TAP.
|
| + if (event.GetAction() == MotionEvent::ACTION_CANCEL)
|
| + SendTapCancelIfNecessary(event);
|
| +
|
| + UpdateDoubleTapDetectionSupport();
|
| +
|
| + if (gesture_begin_end_types_enabled_)
|
| + Send(CreateGesture(ET_GESTURE_END, event));
|
| +
|
| + current_down_event_.reset();
|
| + break;
|
| + case MotionEvent::ACTION_POINTER_UP:
|
| + if (gesture_begin_end_types_enabled_)
|
| + Send(CreateGesture(ET_GESTURE_END, event));
|
| + break;
|
| + case MotionEvent::ACTION_DOWN:
|
| + case MotionEvent::ACTION_POINTER_DOWN:
|
| + case MotionEvent::ACTION_MOVE:
|
| + break;
|
| + }
|
| +}
|
| +
|
| } // namespace ui
|
|
|