| Index: ui/base/gestures/gesture_recognizer_impl.cc
|
| diff --git a/ui/base/gestures/gesture_recognizer_impl.cc b/ui/base/gestures/gesture_recognizer_impl.cc
|
| index 7cb686ed1ced936327465b3b5e66bad25840b3b8..78adfab9c0e6a1b0649a75ecd68f7320a29f96a1 100644
|
| --- a/ui/base/gestures/gesture_recognizer_impl.cc
|
| +++ b/ui/base/gestures/gesture_recognizer_impl.cc
|
| @@ -17,22 +17,6 @@ namespace ui {
|
|
|
| namespace {
|
|
|
| -// This is used to pop a std::queue when returning from a function.
|
| -class ScopedPop {
|
| - public:
|
| - explicit ScopedPop(std::queue<TouchEvent*>* queue) : queue_(queue) {
|
| - }
|
| -
|
| - ~ScopedPop() {
|
| - delete queue_->front();
|
| - queue_->pop();
|
| - }
|
| -
|
| - private:
|
| - std::queue<TouchEvent*>* queue_;
|
| - DISALLOW_COPY_AND_ASSIGN(ScopedPop);
|
| -};
|
| -
|
| // CancelledTouchEvent mirrors a TouchEvent object.
|
| class MirroredTouchEvent : public TouchEvent {
|
| public:
|
| @@ -54,24 +38,6 @@ class MirroredTouchEvent : public TouchEvent {
|
| DISALLOW_COPY_AND_ASSIGN(MirroredTouchEvent);
|
| };
|
|
|
| -class QueuedTouchEvent : public MirroredTouchEvent {
|
| - public:
|
| - QueuedTouchEvent(const TouchEvent* real, EventResult result)
|
| - : MirroredTouchEvent(real),
|
| - result_(result) {
|
| - }
|
| -
|
| - virtual ~QueuedTouchEvent() {
|
| - }
|
| -
|
| - EventResult result() const { return result_; }
|
| -
|
| - private:
|
| - EventResult result_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(QueuedTouchEvent);
|
| -};
|
| -
|
| // A mirrored event, except for the type, which is always ET_TOUCH_CANCELLED.
|
| class CancelledTouchEvent : public MirroredTouchEvent {
|
| public:
|
| @@ -139,7 +105,6 @@ GestureRecognizerImpl::GestureRecognizerImpl(GestureEventHelper* helper)
|
|
|
| GestureRecognizerImpl::~GestureRecognizerImpl() {
|
| STLDeleteValues(&consumer_sequence_);
|
| - STLDeleteValues(&event_queue_);
|
| }
|
|
|
| // Checks if this finger is already down, if so, returns the current target.
|
| @@ -208,7 +173,6 @@ void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer,
|
| &touch_id_target_);
|
| TransferTouchIdToConsumerMap(current_consumer, new_consumer,
|
| &touch_id_target_for_gestures_);
|
| - TransferConsumer(current_consumer, new_consumer, &event_queue_);
|
| TransferConsumer(current_consumer, new_consumer, &consumer_sequence_);
|
| }
|
| }
|
| @@ -256,103 +220,21 @@ void GestureRecognizerImpl::SetupTargets(const TouchEvent& event,
|
| }
|
| }
|
|
|
| -GestureSequence::Gestures* GestureRecognizerImpl::AdvanceTouchQueueByOne(
|
| - GestureConsumer* consumer,
|
| - ui::EventResult result) {
|
| - CHECK(event_queue_[consumer]);
|
| - CHECK(!event_queue_[consumer]->empty());
|
| -
|
| - ScopedPop pop(event_queue_[consumer]);
|
| - TouchEvent* event = event_queue_[consumer]->front();
|
| - GestureSequence* sequence = GetGestureSequenceForConsumer(consumer);
|
| - if (result != ER_UNHANDLED &&
|
| - event->type() == ET_TOUCH_RELEASED) {
|
| - // A touch release was was processed (e.g. preventDefault()ed by a
|
| - // web-page), but we still need to process a touch cancel.
|
| - CancelledTouchEvent cancelled(event);
|
| - return sequence->ProcessTouchEventForGesture(cancelled,
|
| - ER_UNHANDLED);
|
| - }
|
| - return sequence->ProcessTouchEventForGesture(*event, result);
|
| -}
|
| -
|
| GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture(
|
| const TouchEvent& event,
|
| ui::EventResult result,
|
| GestureConsumer* target) {
|
| - if (event_queue_[target] && event_queue_[target]->size() > 0) {
|
| - // There are some queued touch-events for this target. Processing |event|
|
| - // before those queued events will result in unexpected gestures. So
|
| - // postpone the processing of the events until the queued events have been
|
| - // processed.
|
| - event_queue_[target]->push(new QueuedTouchEvent(&event, result));
|
| - return NULL;
|
| - }
|
| -
|
| SetupTargets(event, target);
|
| -
|
| GestureSequence* gesture_sequence = GetGestureSequenceForConsumer(target);
|
| return gesture_sequence->ProcessTouchEventForGesture(event, result);
|
| }
|
|
|
| -void GestureRecognizerImpl::QueueTouchEventForGesture(GestureConsumer* consumer,
|
| - const TouchEvent& event) {
|
| - if (!event_queue_[consumer])
|
| - event_queue_[consumer] = new std::queue<TouchEvent*>();
|
| - event_queue_[consumer]->push(
|
| - new QueuedTouchEvent(&event, ER_ASYNC));
|
| -
|
| - SetupTargets(event, consumer);
|
| -}
|
| -
|
| -GestureSequence::Gestures* GestureRecognizerImpl::AdvanceTouchQueue(
|
| - GestureConsumer* consumer,
|
| - bool processed) {
|
| - if (!event_queue_[consumer] || event_queue_[consumer]->empty()) {
|
| - LOG(ERROR) << "Trying to advance an empty gesture queue for " << consumer;
|
| - return NULL;
|
| - }
|
| -
|
| - scoped_ptr<GestureSequence::Gestures> gestures(
|
| - AdvanceTouchQueueByOne(consumer, processed ? ER_HANDLED :
|
| - ER_UNHANDLED));
|
| -
|
| - // Are there any queued touch-events that should be auto-dequeued?
|
| - while (!event_queue_[consumer]->empty()) {
|
| - QueuedTouchEvent* event =
|
| - static_cast<QueuedTouchEvent*>(event_queue_[consumer]->front());
|
| - if (event->result() == ER_ASYNC)
|
| - break;
|
| -
|
| - scoped_ptr<GestureSequence::Gestures> current_gestures(
|
| - AdvanceTouchQueueByOne(consumer, event->result()));
|
| - if (current_gestures.get()) {
|
| - if (!gestures.get()) {
|
| - gestures.reset(current_gestures.release());
|
| - } else {
|
| - gestures->insert(gestures->end(), current_gestures->begin(),
|
| - current_gestures->end());
|
| - // The gestures in |current_gestures| are now owned by |gestures|. Make
|
| - // sure they don't get freed with |current_gestures|.
|
| - current_gestures->weak_clear();
|
| - }
|
| - }
|
| - }
|
| -
|
| - return gestures.release();
|
| -}
|
| -
|
| -void GestureRecognizerImpl::FlushTouchQueue(GestureConsumer* consumer) {
|
| +void GestureRecognizerImpl::CleanupStateForConsumer(GestureConsumer* consumer) {
|
| if (consumer_sequence_.count(consumer)) {
|
| delete consumer_sequence_[consumer];
|
| consumer_sequence_.erase(consumer);
|
| }
|
|
|
| - if (event_queue_.count(consumer)) {
|
| - delete event_queue_[consumer];
|
| - event_queue_.erase(consumer);
|
| - }
|
| -
|
| RemoveConsumerFromMap(consumer, &touch_id_target_);
|
| RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_);
|
| }
|
|
|