summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authortdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-15 05:15:25 +0000
committertdresser@chromium.org <tdresser@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-15 05:15:25 +0000
commit657e2cdba1fb2a8ba6df47d8c2c5f57457436400 (patch)
tree67e6f5d17b1ac56d207b9da597d24d8e58f59dd2 /ui
parentde71a379bfe91ca68da7fe72fbe6f02cbf5bdbbd (diff)
downloadchromium_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.cc57
-rw-r--r--ui/events/gestures/gesture_sequence.cc9
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());