summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-07 21:06:59 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-07 21:06:59 +0000
commit3057393e317509831e09b3cb81d2555cbae2e083 (patch)
treeb0f11163ffecced884037b5b12c77fb0a6946429 /ui
parentf98d573dea5090e90271b2ea44a5e2685c5189b9 (diff)
downloadchromium_src-3057393e317509831e09b3cb81d2555cbae2e083.zip
chromium_src-3057393e317509831e09b3cb81d2555cbae2e083.tar.gz
chromium_src-3057393e317509831e09b3cb81d2555cbae2e083.tar.bz2
gesture recognizer: Make sure the pinch/scroll only when the finger is moved for real.
Change in the radius for any of the touch-points changes the bounding box of the points, but in such cases, we do not want to trigger either scroll or pinch updates. BUG=none TBR=ben@chromium.org Review URL: https://chromiumcodereview.appspot.com/10837107 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@150400 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r--ui/aura/gestures/gesture_recognizer_unittest.cc50
-rw-r--r--ui/base/gestures/gesture_sequence.cc20
2 files changed, 68 insertions, 2 deletions
diff --git a/ui/aura/gestures/gesture_recognizer_unittest.cc b/ui/aura/gestures/gesture_recognizer_unittest.cc
index cda1348..2ade20e 100644
--- a/ui/aura/gestures/gesture_recognizer_unittest.cc
+++ b/ui/aura/gestures/gesture_recognizer_unittest.cc
@@ -2516,5 +2516,55 @@ TEST_F(GestureRecognizerTest, TwoTapsWithDelayBetween) {
EXPECT_EQ(1, delegate->tap_count());
}
+// Checks that if the bounding-box of a gesture changes because of change in
+// radius of a touch-point, and not because of change in position, then there
+// are not gesture events from that.
+TEST_F(GestureRecognizerTest, BoundingBoxRadiusChange) {
+ scoped_ptr<GestureEventConsumeDelegate> delegate(
+ new GestureEventConsumeDelegate());
+ const int kWindowWidth = 234;
+ const int kWindowHeight = 345;
+ const int kTouchId = 5, kTouchId2 = 7;
+ gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
+ scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
+ delegate.get(), -1234, bounds, NULL));
+
+ TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201), kTouchId,
+ GetTime());
+ root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press1);
+ EXPECT_TRUE(delegate->bounding_box().IsEmpty());
+
+ delegate->Reset();
+
+ TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(201, 201), kTouchId2,
+ press1.time_stamp() + base::TimeDelta::FromMilliseconds(400));
+ press2.set_radius_x(5);
+ root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&press2);
+ EXPECT_FALSE(delegate->pinch_begin());
+
+ delegate->Reset();
+
+ TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(141, 201), kTouchId,
+ press1.time_stamp() + base::TimeDelta::FromMilliseconds(40));
+ root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move1);
+ EXPECT_TRUE(delegate->pinch_begin());
+ EXPECT_EQ(gfx::Rect(141, 196, 65, 10).ToString(),
+ delegate->bounding_box().ToString());
+
+ delegate->Reset();
+
+ // The position doesn't move, but the radius changes.
+ TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(101, 201), kTouchId,
+ press2.time_stamp() + base::TimeDelta::FromMilliseconds(40));
+ move2.set_radius_x(50);
+ move2.set_radius_y(60);
+ root_window()->AsRootWindowHostDelegate()->OnHostTouchEvent(&move2);
+ EXPECT_FALSE(delegate->tap());
+ EXPECT_FALSE(delegate->scroll_update());
+ EXPECT_FALSE(delegate->pinch_update());
+
+ delegate->Reset();
+}
+
} // namespace test
} // namespace aura
diff --git a/ui/base/gestures/gesture_sequence.cc b/ui/base/gestures/gesture_sequence.cc
index 42c19b3..b52babb 100644
--- a/ui/base/gestures/gesture_sequence.cc
+++ b/ui/base/gestures/gesture_sequence.cc
@@ -675,12 +675,12 @@ void GestureSequence::AppendScrollGestureUpdate(const GesturePoint& point,
gfx::Point current_center = bounding_box_.CenterPoint();
int dx = current_center.x() - bounding_box_last_center_.x();
int dy = current_center.y() - bounding_box_last_center_.y();
- if (dx == 0 && dy == 0)
- return;
if (scroll_type_ == ST_HORIZONTAL)
dy = 0;
else if (scroll_type_ == ST_VERTICAL)
dx = 0;
+ if (dx == 0 && dy == 0)
+ return;
gestures->push_back(CreateGestureEvent(
GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, dx, dy),
@@ -908,6 +908,22 @@ bool GestureSequence::PinchUpdate(const TouchEvent& event,
const GesturePoint& point, Gestures* gestures) {
DCHECK(state_ == GS_PINCH);
+ // It is possible that the none of the touch-points changed their position,
+ // but their radii changed, and that caused the bounding box to also change.
+ // But in such cases, we do not want to either pinch or scroll.
+ // To avoid small jiggles, it is also necessary to make sure that at least one
+ // of the fingers moved enough before a pinch or scroll update is created.
+ bool did_scroll = false;
+ for (int i = 0; i < kMaxGesturePoints; ++i) {
+ if (!points_[i].in_use() || !points_[i].DidScroll(event, 2))
+ continue;
+ did_scroll = true;
+ break;
+ }
+
+ if (!did_scroll)
+ return false;
+
float distance = BoundingBoxDiagonal(bounding_box_);
if (abs(distance - pinch_distance_current_) >=