diff options
author | tdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-26 18:17:41 +0000 |
---|---|---|
committer | tdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-26 18:17:41 +0000 |
commit | 8414957afa70832caf617f0b4d04ddd63f95fbee (patch) | |
tree | d4844852c2c5be8f8d500b9e4e058239eacf1cb7 /ui/events | |
parent | fad416d5d79a00cd4b222e6ea508542bc81aab52 (diff) | |
download | chromium_src-8414957afa70832caf617f0b4d04ddd63f95fbee.zip chromium_src-8414957afa70832caf617f0b4d04ddd63f95fbee.tar.gz chromium_src-8414957afa70832caf617f0b4d04ddd63f95fbee.tar.bz2 |
Cancel active touches when their window can no longer receive events.
|Window::CanAcceptEvent| always returns true for cancel events and gesture events which indicate the end of a gesture.
We fire a cancel event for each active touch on a window when the window is hidden.
BUG=151871
TEST=RootWindowTest.WindowHideCancelsActiveTouches
Review URL: https://codereview.chromium.org/35533002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@237357 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/events')
-rw-r--r-- | ui/events/event.h | 17 | ||||
-rw-r--r-- | ui/events/gestures/gesture_recognizer.h | 3 | ||||
-rw-r--r-- | ui/events/gestures/gesture_recognizer_impl.cc | 38 | ||||
-rw-r--r-- | ui/events/gestures/gesture_recognizer_impl.h | 2 |
4 files changed, 49 insertions, 11 deletions
diff --git a/ui/events/event.h b/ui/events/event.h index fd33f84..71c8f67 100644 --- a/ui/events/event.h +++ b/ui/events/event.h @@ -124,6 +124,8 @@ class EVENTS_EXPORT Event { case ET_GESTURE_LONG_TAP: case ET_GESTURE_MULTIFINGER_SWIPE: case ET_GESTURE_SHOW_PRESS: + // When adding a gesture event which is paired with an event which + // occurs earlier, add the event to |IsEndingEvent|. return true; case ET_SCROLL_FLING_CANCEL: @@ -138,6 +140,21 @@ class EVENTS_EXPORT Event { return false; } + // An ending event is paired with the event which started it. Setting capture + // should not prevent ending events from getting to their initial target. + bool IsEndingEvent() const { + switch(type_) { + case ui::ET_TOUCH_CANCELLED: + case ui::ET_GESTURE_TAP_CANCEL: + case ui::ET_GESTURE_END: + case ui::ET_GESTURE_SCROLL_END: + case ui::ET_GESTURE_PINCH_END: + return true; + default: + return false; + } + } + bool IsScrollEvent() const { // Flings can be GestureEvents too. EF_FROM_TOUCH determins if they're // Gesture or Scroll events. diff --git a/ui/events/gestures/gesture_recognizer.h b/ui/events/gestures/gesture_recognizer.h index fd5136d..88f230f 100644 --- a/ui/events/gestures/gesture_recognizer.h +++ b/ui/events/gestures/gesture_recognizer.h @@ -66,6 +66,9 @@ class EVENTS_EXPORT GestureRecognizer { virtual bool GetLastTouchPointForTarget(GestureConsumer* consumer, gfx::Point* point) = 0; + // Sends a touch cancel event for every active touch. + virtual void CancelActiveTouches(GestureConsumer* consumer) = 0; + // Subscribes |helper| for dispatching async gestures such as long press. // The Gesture Recognizer does NOT take ownership of |helper| and it is the // responsibility of the |helper| to call |RemoveGestureEventHelper()| on diff --git a/ui/events/gestures/gesture_recognizer_impl.cc b/ui/events/gestures/gesture_recognizer_impl.cc index a3bb9cc..50a159b 100644 --- a/ui/events/gestures/gesture_recognizer_impl.cc +++ b/ui/events/gestures/gesture_recognizer_impl.cc @@ -126,17 +126,7 @@ void GestureRecognizerImpl::TransferEventsTo(GestureConsumer* current_consumer, } } - while (!ids.empty()) { - int touch_id = ids.begin()->first; - GestureConsumer* target = ids.begin()->second; - TouchEvent touch_event(ui::ET_TOUCH_CANCELLED, gfx::Point(0, 0), - ui::EF_IS_SYNTHESIZED, touch_id, - ui::EventTimeForNow(), 0.0f, 0.0f, 0.0f, 0.0f); - GestureEventHelper* helper = FindDispatchHelperForConsumer(target); - if (helper) - helper->DispatchCancelTouchEvent(&touch_event); - ids.erase(ids.begin()); - } + CancelTouches(&ids); // Transfer events from |current_consumer| to |new_consumer|. if (current_consumer && new_consumer) { @@ -158,6 +148,17 @@ bool GestureRecognizerImpl::GetLastTouchPointForTarget( return true; } +void GestureRecognizerImpl::CancelActiveTouches( + GestureConsumer* consumer) { + std::vector<std::pair<int, GestureConsumer*> > ids; + for (TouchIdToConsumerMap::const_iterator i = touch_id_target_.begin(); + i != touch_id_target_.end(); ++i) { + if (i->second == consumer) + ids.push_back(std::make_pair(i->first, i->second)); + } + CancelTouches(&ids); +} + //////////////////////////////////////////////////////////////////////////////// // GestureRecognizerImpl, protected: @@ -191,6 +192,21 @@ void GestureRecognizerImpl::SetupTargets(const TouchEvent& event, } } +void GestureRecognizerImpl::CancelTouches( + std::vector<std::pair<int, GestureConsumer*> >* touches) { + while (!touches->empty()) { + int touch_id = touches->begin()->first; + GestureConsumer* target = touches->begin()->second; + TouchEvent touch_event(ui::ET_TOUCH_CANCELLED, gfx::Point(0, 0), + ui::EF_IS_SYNTHESIZED, touch_id, + ui::EventTimeForNow(), 0.0f, 0.0f, 0.0f, 0.0f); + GestureEventHelper* helper = FindDispatchHelperForConsumer(target); + if (helper) + helper->DispatchCancelTouchEvent(&touch_event); + touches->erase(touches->begin()); + } +} + GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture( const TouchEvent& event, ui::EventResult result, diff --git a/ui/events/gestures/gesture_recognizer_impl.h b/ui/events/gestures/gesture_recognizer_impl.h index 051454c..6e45c13 100644 --- a/ui/events/gestures/gesture_recognizer_impl.h +++ b/ui/events/gestures/gesture_recognizer_impl.h @@ -43,6 +43,7 @@ class EVENTS_EXPORT GestureRecognizerImpl : public GestureRecognizer, GestureConsumer* new_consumer) OVERRIDE; virtual bool GetLastTouchPointForTarget(GestureConsumer* consumer, gfx::Point* point) OVERRIDE; + virtual void CancelActiveTouches(GestureConsumer* consumer) OVERRIDE; protected: virtual GestureSequence* CreateSequence(GestureSequenceDelegate* delegate); @@ -51,6 +52,7 @@ class EVENTS_EXPORT GestureRecognizerImpl : public GestureRecognizer, private: // Sets up the target consumer for gestures based on the touch-event. void SetupTargets(const TouchEvent& event, GestureConsumer* consumer); + void CancelTouches(std::vector<std::pair<int, GestureConsumer*> >* touches); // Overridden from GestureRecognizer virtual Gestures* ProcessTouchEventForGesture( |