summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorTim Dresser <tdresser@chromium.org>2014-08-25 10:13:09 -0400
committerTim Dresser <tdresser@chromium.org>2014-08-25 14:14:42 +0000
commit599faf2e757dc2b77737ef1ac6b5115c78c3b2ea (patch)
treecbd21604dc035df72fc03e620f756ae659db8c5b /ui
parenta08656d588a948bce7a53c4f6b77595e32102e6c (diff)
downloadchromium_src-599faf2e757dc2b77737ef1ac6b5115c78c3b2ea.zip
chromium_src-599faf2e757dc2b77737ef1ac6b5115c78c3b2ea.tar.gz
chromium_src-599faf2e757dc2b77737ef1ac6b5115c78c3b2ea.tar.bz2
Previously our handling of ignored touches would put the gesture recognizer into a very confused state.
BUG=405519 TEST=GestureRecognizerTest.IgnoredEventsDontPreventFutureEvents Review URL: https://codereview.chromium.org/489213003 Cr-Commit-Position: refs/heads/master@{#291255} git-svn-id: svn://svn.chromium.org/chrome/trunk/src@291255 0039d316-1c4b-4281-b951-d872f2087c98 (cherry picked from commit 21e657e70100ae4528b0027ddc68611a64a6d8a5) TBR=sadrul Conflicts: ui/aura/gestures/gesture_recognizer_unittest.cc Review URL: https://codereview.chromium.org/472133005 Cr-Commit-Position: refs/branch-heads/2125@{#77} Cr-Branched-From: b68026d94bda36dd106a3d91a098719f952a9477-refs/heads/master@{#290040}
Diffstat (limited to 'ui')
-rw-r--r--ui/aura/gestures/gesture_recognizer_unittest.cc52
-rw-r--r--ui/aura/window_event_dispatcher.cc6
2 files changed, 55 insertions, 3 deletions
diff --git a/ui/aura/gestures/gesture_recognizer_unittest.cc b/ui/aura/gestures/gesture_recognizer_unittest.cc
index 963b24d..aa72bef 100644
--- a/ui/aura/gestures/gesture_recognizer_unittest.cc
+++ b/ui/aura/gestures/gesture_recognizer_unittest.cc
@@ -4574,6 +4574,58 @@ TEST_P(GestureRecognizerTest, EagerGestureDetection) {
EXPECT_FALSE(delegate->long_press());
}
+// This tests crbug.com/405519, in which events which the gesture detector
+// ignores cause future events to also be thrown away.
+TEST_P(GestureRecognizerTest, IgnoredEventsDontPreventFutureEvents) {
+ if (!UsingUnifiedGR())
+ return;
+
+ scoped_ptr<QueueTouchEventDelegate> delegate(
+ new QueueTouchEventDelegate(host()->dispatcher()));
+ TimedEvents tes;
+ const int kWindowWidth = 300;
+ const int kWindowHeight = 400;
+ const int kTouchId1 = 3;
+ gfx::Rect bounds(5, 5, kWindowWidth, kWindowHeight);
+ scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
+ delegate.get(), -1234, bounds, root_window()));
+ delegate->set_window(window.get());
+
+ ui::TouchEvent press1(
+ ui::ET_TOUCH_PRESSED, gfx::Point(101, 301), kTouchId1, tes.Now());
+ DispatchEventUsingWindowDispatcher(&press1);
+ delegate->ReceivedAck();
+
+ EXPECT_2_EVENTS(
+ delegate->events(), ui::ET_GESTURE_BEGIN, ui::ET_GESTURE_TAP_DOWN);
+
+ // Move the first finger.
+ delegate->Reset();
+ ui::TouchEvent move1(
+ ui::ET_TOUCH_MOVED, gfx::Point(65, 201), kTouchId1, tes.Now());
+ DispatchEventUsingWindowDispatcher(&move1);
+ delegate->ReceivedAck();
+
+ EXPECT_3_EVENTS(delegate->events(),
+ ui::ET_GESTURE_TAP_CANCEL,
+ ui::ET_GESTURE_SCROLL_BEGIN,
+ ui::ET_GESTURE_SCROLL_UPDATE);
+
+ delegate->Reset();
+ ui::TouchEvent move2(
+ ui::ET_TOUCH_MOVED, gfx::Point(65, 202), kTouchId1, tes.Now());
+ DispatchEventUsingWindowDispatcher(&move2);
+
+ // Send a touchmove event at the same location as the previous touchmove
+ // event. This shouldn't do anything.
+ ui::TouchEvent move3(
+ ui::ET_TOUCH_MOVED, gfx::Point(65, 202), kTouchId1, tes.Now());
+ DispatchEventUsingWindowDispatcher(&move3);
+
+ delegate->ReceivedAck();
+ EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
+}
+
INSTANTIATE_TEST_CASE_P(GestureRecognizer,
GestureRecognizerTest,
::testing::Bool());
diff --git a/ui/aura/window_event_dispatcher.cc b/ui/aura/window_event_dispatcher.cc
index 350066f..7b40c71 100644
--- a/ui/aura/window_event_dispatcher.cc
+++ b/ui/aura/window_event_dispatcher.cc
@@ -893,11 +893,11 @@ void WindowEventDispatcher::PreDispatchTouchEvent(Window* target,
ui::TouchEvent orig_event(*event, target, window());
// If the touch event is invalid in some way, the gesture recognizer will
- // reject it. In this case, stop the touch from reaching the next event
- // phase.
+ // reject it. This must call |StopPropagation()|, in order to prevent the
+ // touch from being acked in |PostDispatchEvent|.
if (!ui::GestureRecognizer::Get()->ProcessTouchEventPreDispatch(orig_event,
target)) {
- event->SetHandled();
+ event->StopPropagation();
}
}