diff options
author | tdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-15 05:15:25 +0000 |
---|---|---|
committer | tdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-15 05:15:25 +0000 |
commit | 657e2cdba1fb2a8ba6df47d8c2c5f57457436400 (patch) | |
tree | 67e6f5d17b1ac56d207b9da597d24d8e58f59dd2 /ui | |
parent | de71a379bfe91ca68da7fe72fbe6f02cbf5bdbbd (diff) | |
download | chromium_src-657e2cdba1fb2a8ba6df47d8c2c5f57457436400.zip chromium_src-657e2cdba1fb2a8ba6df47d8c2c5f57457436400.tar.gz chromium_src-657e2cdba1fb2a8ba6df47d8c2c5f57457436400.tar.bz2 |
Consuming a touch move prevents only the next scroll update.
This implements (In Clank) the touch disposition handling method outlined here:
https://docs.google.com/a/chromium.org/document/d/176xYUC3WbiSl7qd08SBW4NiI4_gO0N4PN6tPAq49-68/edit?pli=1#bookmark=id.wu82d53abe2w
We also modify the way in which Aura handles touch move events to line up with the new way Android handles them. That is, consuming a touch move event prevents the next scroll update event, but does not prevent future scroll update events.
This change will have little impact until https://codereview.chromium.org/166923002/ has landed.
BUG=328503
Review URL: https://codereview.chromium.org/156783006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@251533 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/aura/gestures/gesture_recognizer_unittest.cc | 57 | ||||
-rw-r--r-- | ui/events/gestures/gesture_sequence.cc | 9 |
2 files changed, 64 insertions, 2 deletions
diff --git a/ui/aura/gestures/gesture_recognizer_unittest.cc b/ui/aura/gestures/gesture_recognizer_unittest.cc index a3fa4d2..5d17de0 100644 --- a/ui/aura/gestures/gesture_recognizer_unittest.cc +++ b/ui/aura/gestures/gesture_recognizer_unittest.cc @@ -4038,5 +4038,62 @@ TEST_F(GestureRecognizerTest, TestExceedingSlopSlowly) { } +TEST_F(GestureRecognizerTest, ScrollAlternatelyConsumedTest) { + scoped_ptr<QueueTouchEventDelegate> delegate( + new QueueTouchEventDelegate(dispatcher())); + TimedEvents tes; + const int kWindowWidth = 3000; + const int kWindowHeight = 3000; + const int kTouchId = 2; + gfx::Rect bounds(0, 0, kWindowWidth, kWindowHeight); + scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate( + delegate.get(), -1234, bounds, root_window())); + + delegate->Reset(); + + int x = 0; + int y = 0; + + ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(x, y), + kTouchId, tes.Now()); + DispatchEventUsingWindowDispatcher(&press1); + delegate->ReceivedAck(); + EXPECT_FALSE(delegate->scroll_begin()); + EXPECT_FALSE(delegate->scroll_update()); + delegate->Reset(); + + x += 100; + y += 100; + ui::TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(x, y), + kTouchId, tes.Now()); + DispatchEventUsingWindowDispatcher(&move1); + delegate->ReceivedAck(); + EXPECT_TRUE(delegate->scroll_begin()); + EXPECT_TRUE(delegate->scroll_update()); + delegate->Reset(); + + for (int i = 0; i < 3; ++i) { + x += 10; + y += 10; + ui::TouchEvent move2( + ui::ET_TOUCH_MOVED, gfx::Point(x, y), kTouchId, tes.Now()); + DispatchEventUsingWindowDispatcher(&move2); + delegate->ReceivedAck(); + EXPECT_FALSE(delegate->scroll_begin()); + EXPECT_TRUE(delegate->scroll_update()); + delegate->Reset(); + + x -= 10; + y += 10; + ui::TouchEvent move3( + ui::ET_TOUCH_MOVED, gfx::Point(x, y), kTouchId, tes.Now()); + DispatchEventUsingWindowDispatcher(&move3); + delegate->ReceivedAckPreventDefaulted(); + EXPECT_FALSE(delegate->scroll_begin()); + EXPECT_FALSE(delegate->scroll_update()); + delegate->Reset(); + } +} + } // namespace test } // namespace aura diff --git a/ui/events/gestures/gesture_sequence.cc b/ui/events/gestures/gesture_sequence.cc index 6427c17..719e67d 100644 --- a/ui/events/gestures/gesture_sequence.cc +++ b/ui/events/gestures/gesture_sequence.cc @@ -138,9 +138,11 @@ enum EdgeStateSignatureType { GST_SCROLL_FIRST_RELEASED = G(GS_SCROLL, 0, TS_RELEASED, TSI_ALWAYS), - // Once scroll has started, process all touch-move events. GST_SCROLL_FIRST_MOVED = - G(GS_SCROLL, 0, TS_MOVED, TSI_ALWAYS), + G(GS_SCROLL, 0, TS_MOVED, TSI_NOT_PROCESSED), + + GST_SCROLL_FIRST_MOVED_HANDLED = + G(GS_SCROLL, 0, TS_MOVED, TSI_PROCESSED), GST_SCROLL_FIRST_CANCELLED = G(GS_SCROLL, 0, TS_CANCELLED, TSI_ALWAYS), @@ -352,6 +354,7 @@ EdgeStateSignatureType Signature(GestureState gesture_state, case GST_SYNTHETIC_CLICK_ABORTED_SECOND_PRESSED: case GST_SCROLL_FIRST_RELEASED: case GST_SCROLL_FIRST_MOVED: + case GST_SCROLL_FIRST_MOVED_HANDLED: case GST_SCROLL_FIRST_CANCELLED: case GST_SCROLL_SECOND_PRESSED: case GST_PENDING_TWO_FINGER_TAP_FIRST_RELEASED: @@ -608,6 +611,8 @@ GestureSequence::Gestures* GestureSequence::ProcessTouchEventForGesture( if (ScrollUpdate(event, point, gestures.get(), FS_NOT_FIRST_SCROLL)) point.UpdateForScroll(); break; + case GST_SCROLL_FIRST_MOVED_HANDLED: + break; case GST_SCROLL_FIRST_RELEASED: case GST_SCROLL_FIRST_CANCELLED: ScrollEnd(event, point, gestures.get()); |