| Index: ui/events/gestures/gesture_recognizer_impl.cc
|
| diff --git a/ui/events/gestures/gesture_recognizer_impl.cc b/ui/events/gestures/gesture_recognizer_impl.cc
|
| index 206ef82c178bf176cb6c3c40ecc5edf0ed95f2e8..5b2263f7e49e09e907ba9e893c0d593ec9d9af2e 100644
|
| --- a/ui/events/gestures/gesture_recognizer_impl.cc
|
| +++ b/ui/events/gestures/gesture_recognizer_impl.cc
|
| @@ -244,6 +244,8 @@ GestureProviderAura* GestureRecognizerImpl::GetGestureProviderForConsumer(
|
|
|
| void GestureRecognizerImpl::SetupTargets(const TouchEvent& event,
|
| GestureConsumer* target) {
|
| + event_to_gesture_provider_[event.unique_event_id()] =
|
| + GetGestureProviderForConsumer(target);
|
| if (event.type() == ui::ET_TOUCH_RELEASED ||
|
| event.type() == ui::ET_TOUCH_CANCELLED) {
|
| touch_id_target_.erase(event.pointer_details().id);
|
| @@ -280,8 +282,18 @@ GestureRecognizer::Gestures GestureRecognizerImpl::AckTouchEvent(
|
| uint32_t unique_event_id,
|
| ui::EventResult result,
|
| GestureConsumer* consumer) {
|
| - GestureProviderAura* gesture_provider =
|
| - GetGestureProviderForConsumer(consumer);
|
| + GestureProviderAura* gesture_provider = nullptr;
|
| +
|
| + // Check if we have already processed this event before dispatch and have a
|
| + // consumer associated with it.
|
| + auto event_to_gesture_provider_iterator =
|
| + event_to_gesture_provider_.find(unique_event_id);
|
| + if (event_to_gesture_provider_iterator != event_to_gesture_provider_.end()) {
|
| + gesture_provider = event_to_gesture_provider_iterator->second;
|
| + event_to_gesture_provider_.erase(event_to_gesture_provider_iterator);
|
| + } else {
|
| + gesture_provider = GetGestureProviderForConsumer(consumer);
|
| + }
|
| gesture_provider->OnTouchEventAck(unique_event_id, result != ER_UNHANDLED);
|
| return gesture_provider->GetAndResetPendingGestures();
|
| }
|
|
|