summaryrefslogtreecommitdiffstats
path: root/ui/events
diff options
context:
space:
mode:
authortdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-26 18:17:41 +0000
committertdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-26 18:17:41 +0000
commit8414957afa70832caf617f0b4d04ddd63f95fbee (patch)
treed4844852c2c5be8f8d500b9e4e058239eacf1cb7 /ui/events
parentfad416d5d79a00cd4b222e6ea508542bc81aab52 (diff)
downloadchromium_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.h17
-rw-r--r--ui/events/gestures/gesture_recognizer.h3
-rw-r--r--ui/events/gestures/gesture_recognizer_impl.cc38
-rw-r--r--ui/events/gestures/gesture_recognizer_impl.h2
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(