Index: ui/events/gestures/gesture_provider_aura.cc |
diff --git a/ui/events/gestures/gesture_provider_aura.cc b/ui/events/gestures/gesture_provider_aura.cc |
index 0db2e04f882d52dd017c8e31a33d5a6638eabea7..ac882839d7c5bbd0188eabdc163ae27bcdaf672e 100644 |
--- a/ui/events/gestures/gesture_provider_aura.cc |
+++ b/ui/events/gestures/gesture_provider_aura.cc |
@@ -4,6 +4,7 @@ |
#include "ui/events/gestures/gesture_provider_aura.h" |
+#include "base/auto_reset.h" |
#include "base/logging.h" |
#include "ui/events/event.h" |
#include "ui/events/gesture_detection/gesture_config_helper.h" |
@@ -14,7 +15,8 @@ namespace ui { |
GestureProviderAura::GestureProviderAura(GestureProviderAuraClient* client) |
: client_(client), |
- filtered_gesture_provider_(ui::DefaultGestureProviderConfig(), this) { |
+ filtered_gesture_provider_(ui::DefaultGestureProviderConfig(), this), |
+ handling_event_(false) { |
filtered_gesture_provider_.SetDoubleTapSupportForPlatformEnabled(false); |
} |
@@ -48,6 +50,9 @@ bool GestureProviderAura::OnTouchEvent(const TouchEvent& event) { |
} |
void GestureProviderAura::OnTouchEventAck(bool event_consumed) { |
+ DCHECK(pending_gestures_.empty()); |
+ DCHECK(!handling_event_); |
+ base::AutoReset<bool> handling_event(&handling_event_, true); |
filtered_gesture_provider_.OnTouchEventAck(event_consumed); |
} |
@@ -69,18 +74,37 @@ void GestureProviderAura::OnGestureEvent( |
previous_tap_.reset(); |
} |
- ui::GestureEvent event(gesture.type, |
- gesture.x, |
- gesture.y, |
- last_touch_event_flags_, |
- gesture.time - base::TimeTicks(), |
- details, |
- // ui::GestureEvent stores a bitfield indicating the |
- // ids of active touch points. This is currently only |
- // used when one finger is down, and will eventually |
- // be cleaned up. See crbug.com/366707. |
- 1 << gesture.motion_event_id); |
- client_->OnGestureEvent(&event); |
+ // Memory either deleted explicitly, if |!handling_event_|, or managed by |
+ // pending_gestures_. |
+ ui::GestureEvent* event = |
jdduke (slow)
2014/05/28 16:26:00
Let's use scoped_ptr<ui::GestureEvent> if we absol
tdresser
2014/05/29 14:26:21
We need to return a ScopedVector of GestureEvents
|
+ new ui::GestureEvent(gesture.type, |
+ gesture.x, |
+ gesture.y, |
+ last_touch_event_flags_, |
+ gesture.time - base::TimeTicks(), |
+ details, |
+ // ui::GestureEvent stores a bitfield indicating the |
+ // ids of active touch points. This is currently only |
+ // used when one finger is down, and will eventually |
+ // be cleaned up. See crbug.com/366707. |
+ 1 << gesture.motion_event_id); |
+ |
+ if (!handling_event_) { |
+ // Dispatching event caused by timer. |
+ client_->OnGestureEvent(event); |
+ delete event; |
+ } else { |
+ // Memory managed by ScopedVector pending_gestures_. |
+ pending_gestures_.push_back(event); |
+ } |
+} |
+ |
+ScopedVector<GestureEvent>* GestureProviderAura::GetAndResetPendingGestures() { |
+ // Caller is responsible for deleting old_pending_gestures. |
+ ScopedVector<GestureEvent>* old_pending_gestures = |
+ new ScopedVector<GestureEvent>(); |
+ old_pending_gestures->swap(pending_gestures_); |
+ return old_pending_gestures; |
} |
bool GestureProviderAura::IsConsideredDoubleTap( |