summaryrefslogtreecommitdiffstats
path: root/ui/events/gestures
diff options
context:
space:
mode:
authortdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-02 18:02:51 +0000
committertdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-02 18:02:51 +0000
commitd476bfa9ea0986f1395ae6987b2f3092bfd036eb (patch)
tree196fcb7b185de4927e6996717e65e29d11740e26 /ui/events/gestures
parent89670af7c862905ba4b1e76717fa140f7c65a95c (diff)
downloadchromium_src-d476bfa9ea0986f1395ae6987b2f3092bfd036eb.zip
chromium_src-d476bfa9ea0986f1395ae6987b2f3092bfd036eb.tar.gz
chromium_src-d476bfa9ea0986f1395ae6987b2f3092bfd036eb.tar.bz2
Prepare for Unified Gesture Recognizer landing in Aura
This is the final cleanup before the unified gesture recognizer is turned on. Tests are passing with the unified GR flag on and with the flag off. BUG=332418 Test=GestureRecognizerTest.*, GestureProviderTest.* Review URL: https://codereview.chromium.org/306483003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@274277 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/events/gestures')
-rw-r--r--ui/events/gestures/gesture_provider_aura.cc49
-rw-r--r--ui/events/gestures/gesture_provider_aura.h3
-rw-r--r--ui/events/gestures/gesture_recognizer_impl.cc11
3 files changed, 44 insertions, 19 deletions
diff --git a/ui/events/gestures/gesture_provider_aura.cc b/ui/events/gestures/gesture_provider_aura.cc
index 0db2e04..edff9e3 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,36 @@ 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);
+ scoped_ptr<ui::GestureEvent> event(
+ 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.get());
+ } else {
+ // Memory managed by ScopedVector pending_gestures_.
+ pending_gestures_.push_back(event.release());
+ }
+}
+
+ScopedVector<GestureEvent>* GestureProviderAura::GetAndResetPendingGestures() {
+ if (pending_gestures_.empty())
+ return NULL;
+ // 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(
diff --git a/ui/events/gestures/gesture_provider_aura.h b/ui/events/gestures/gesture_provider_aura.h
index 5722be6..8a4b290 100644
--- a/ui/events/gestures/gesture_provider_aura.h
+++ b/ui/events/gestures/gesture_provider_aura.h
@@ -31,6 +31,7 @@ class EVENTS_EXPORT GestureProviderAura : public GestureProviderClient {
bool OnTouchEvent(const TouchEvent& event);
void OnTouchEventAck(bool event_consumed);
const MotionEventAura& pointer_state() { return pointer_state_; }
+ ScopedVector<GestureEvent>* GetAndResetPendingGestures();
// GestureProviderClient implementation
virtual void OnGestureEvent(const GestureEventData& gesture) OVERRIDE;
@@ -46,6 +47,8 @@ class EVENTS_EXPORT GestureProviderAura : public GestureProviderClient {
FilteredGestureProvider filtered_gesture_provider_;
int last_touch_event_flags_;
+ bool handling_event_;
+ ScopedVector<GestureEvent> pending_gestures_;
DISALLOW_COPY_AND_ASSIGN(GestureProviderAura);
};
diff --git a/ui/events/gestures/gesture_recognizer_impl.cc b/ui/events/gestures/gesture_recognizer_impl.cc
index c27af4aa..6ec5ccf 100644
--- a/ui/events/gestures/gesture_recognizer_impl.cc
+++ b/ui/events/gestures/gesture_recognizer_impl.cc
@@ -308,7 +308,7 @@ void GestureRecognizerImpl::DispatchGestureEvent(GestureEvent* event) {
}
}
-GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture(
+ScopedVector<GestureEvent>* GestureRecognizerImpl::ProcessTouchEventForGesture(
const TouchEvent& event,
ui::EventResult result,
GestureConsumer* target) {
@@ -322,8 +322,10 @@ GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture(
GetGestureProviderForConsumer(target);
// TODO(tdresser) - detect gestures eagerly.
if (!(result & ER_CONSUMED)) {
- if (gesture_provider->OnTouchEvent(event))
+ if (gesture_provider->OnTouchEvent(event)) {
gesture_provider->OnTouchEventAck(result != ER_UNHANDLED);
+ return gesture_provider->GetAndResetPendingGestures();
+ }
}
return NULL;
}
@@ -342,10 +344,7 @@ bool GestureRecognizerImpl::CleanupStateForConsumer(
} else {
if (consumer_gesture_provider_.count(consumer)) {
state_cleaned_up = true;
- // Don't immediately delete the GestureProvider, as we could be in the
- // middle of dispatching a set of gestures.
- base::MessageLoop::current()->DeleteSoon(
- FROM_HERE, consumer_gesture_provider_[consumer]);
+ delete consumer_gesture_provider_[consumer];
consumer_gesture_provider_.erase(consumer);
}
}