diff options
author | Tim Dresser <tdresser@chromium.org> | 2014-08-25 10:13:09 -0400 |
---|---|---|
committer | Tim Dresser <tdresser@chromium.org> | 2014-08-25 14:14:42 +0000 |
commit | 599faf2e757dc2b77737ef1ac6b5115c78c3b2ea (patch) | |
tree | cbd21604dc035df72fc03e620f756ae659db8c5b /ui | |
parent | a08656d588a948bce7a53c4f6b77595e32102e6c (diff) | |
download | chromium_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.cc | 52 | ||||
-rw-r--r-- | ui/aura/window_event_dispatcher.cc | 6 |
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(); } } |