summaryrefslogtreecommitdiffstats
path: root/ui/views/view_unittest.cc
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-16 22:55:56 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-16 22:55:56 +0000
commitc668522f91e959693c1601e416d17d10a1a4136e (patch)
tree74f882b07005692655d88a415bebbe5e6ccba951 /ui/views/view_unittest.cc
parentc948be0db1a1e68ca21936e4a7a89f6fc6dd076a (diff)
downloadchromium_src-c668522f91e959693c1601e416d17d10a1a4136e.zip
chromium_src-c668522f91e959693c1601e416d17d10a1a4136e.tar.gz
chromium_src-c668522f91e959693c1601e416d17d10a1a4136e.tar.bz2
views: Allow having a different event handler for scroll-gestures from the default gesture handler.
This fixes gesture-scrolling in the app-list. BUG=129774 TEST=views_unittests Review URL: https://chromiumcodereview.appspot.com/10786017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@146918 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/views/view_unittest.cc')
-rw-r--r--ui/views/view_unittest.cc111
1 files changed, 110 insertions, 1 deletions
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
index 4fd87b3..ad3949d 100644
--- a/ui/views/view_unittest.cc
+++ b/ui/views/view_unittest.cc
@@ -272,13 +272,14 @@ class TestViewConsumeGesture : public TestView {
TestViewConsumeGesture() : TestView() {}
virtual ~TestViewConsumeGesture() {}
- private:
+ protected:
virtual ui::GestureStatus OnGestureEvent(const GestureEvent& event) OVERRIDE {
last_gesture_event_type_ = event.type();
location_.SetPoint(event.x(), event.y());
return ui::GESTURE_STATUS_CONSUMED;
}
+ private:
DISALLOW_COPY_AND_ASSIGN(TestViewConsumeGesture);
};
@@ -296,6 +297,23 @@ class TestViewIgnoreGesture: public TestView {
DISALLOW_COPY_AND_ASSIGN(TestViewIgnoreGesture);
};
+// A view subclass that ignores all scroll-gesture events, but consume all other
+// gesture events.
+class TestViewIgnoreScrollGestures : public TestViewConsumeGesture {
+ public:
+ TestViewIgnoreScrollGestures() {}
+ virtual ~TestViewIgnoreScrollGestures() {}
+
+ private:
+ virtual ui::GestureStatus OnGestureEvent(const GestureEvent& event) OVERRIDE {
+ if (event.IsScrollGestureEvent())
+ return ui::GESTURE_STATUS_UNKNOWN;
+ return TestViewConsumeGesture::OnGestureEvent(event);
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(TestViewIgnoreScrollGestures);
+};
+
////////////////////////////////////////////////////////////////////////////////
// OnBoundsChanged
////////////////////////////////////////////////////////////////////////////////
@@ -629,6 +647,97 @@ TEST_F(ViewTest, GestureEvent) {
widget->CloseNow();
}
+TEST_F(ViewTest, ScrollGestureEvent) {
+ // Views hierarchy for non delivery of GestureEvent.
+ TestView* v1 = new TestViewConsumeGesture();
+ v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
+
+ TestView* v2 = new TestViewIgnoreScrollGestures();
+ v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100));
+
+ TestView* v3 = new TestViewIgnoreGesture();
+ v3->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
+
+ scoped_ptr<Widget> widget(new Widget());
+ Widget::InitParams params(Widget::InitParams::TYPE_POPUP);
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.bounds = gfx::Rect(50, 50, 650, 650);
+ widget->Init(params);
+ View* root = widget->GetRootView();
+
+ root->AddChildView(v1);
+ v1->AddChildView(v2);
+ v2->AddChildView(v3);
+
+ // |v3| completely obscures |v2|, but all the gesture events on |v3| should
+ // reach |v2| because |v3| doesn't process any gesture events. However, since
+ // |v2| does process gesture events, gesture events on |v3| or |v2| should not
+ // reach |v1|.
+
+ v1->Reset();
+ v2->Reset();
+ v3->Reset();
+
+ // Gesture on |v3|
+ GestureEventForTest g1(ui::ET_GESTURE_TAP, 110, 110, 0);
+ root->OnGestureEvent(g1);
+ EXPECT_EQ(ui::ET_GESTURE_TAP, v2->last_gesture_event_type_);
+ EXPECT_EQ(gfx::Point(10, 10), v2->location_);
+ EXPECT_EQ(ui::ET_UNKNOWN, v1->last_gesture_event_type_);
+
+ v2->Reset();
+
+ // Send scroll gestures on |v3|. The gesture should reach |v2|, however,
+ // since it does not process scroll-gesture events, these events should reach
+ // |v1|.
+ GestureEventForTest gscroll_begin(ui::ET_GESTURE_SCROLL_BEGIN, 115, 115, 0);
+ root->OnGestureEvent(gscroll_begin);
+ EXPECT_EQ(ui::ET_UNKNOWN, v2->last_gesture_event_type_);
+ EXPECT_EQ(ui::ET_GESTURE_SCROLL_BEGIN, v1->last_gesture_event_type_);
+ v1->Reset();
+
+ // Send a second tap on |v1|. The event should reach |v2| since it is the
+ // default gesture handler, and not |v1| (even though it is the view under the
+ // point, and is the scroll event handler).
+ GestureEventForTest second_tap(ui::ET_GESTURE_TAP, 70, 70, 0);
+ root->OnGestureEvent(second_tap);
+ EXPECT_EQ(ui::ET_GESTURE_TAP, v2->last_gesture_event_type_);
+ EXPECT_EQ(ui::ET_UNKNOWN, v1->last_gesture_event_type_);
+ v2->Reset();
+
+ GestureEventForTest gscroll_end(ui::ET_GESTURE_SCROLL_END, 50, 50, 0);
+ root->OnGestureEvent(gscroll_end);
+ EXPECT_EQ(ui::ET_GESTURE_SCROLL_END, v1->last_gesture_event_type_);
+ v1->Reset();
+
+ // Simulate an up so that RootView is no longer targetting |v3|.
+ GestureEventForTest g1_up(ui::ET_GESTURE_END, 110, 110, 0);
+ root->OnGestureEvent(g1_up);
+ EXPECT_EQ(ui::ET_GESTURE_END, v2->last_gesture_event_type_);
+
+ v1->Reset();
+ v2->Reset();
+ v3->Reset();
+
+ // Gesture on |v1|
+ GestureEventForTest g2(ui::ET_GESTURE_TAP, 80, 80, 0);
+ root->OnGestureEvent(g2);
+ EXPECT_EQ(ui::ET_GESTURE_TAP, v1->last_gesture_event_type_);
+ EXPECT_EQ(gfx::Point(80, 80), v1->location_);
+ EXPECT_EQ(ui::ET_UNKNOWN, v2->last_gesture_event_type_);
+
+ // Send event |g1| again. Even though the coordinates target |v3| it should go
+ // to |v1| as that is the view the touch was initially down on.
+ v1->last_gesture_event_type_ = ui::ET_UNKNOWN;
+ v3->last_gesture_event_type_ = ui::ET_UNKNOWN;
+ root->OnGestureEvent(g1);
+ EXPECT_EQ(ui::ET_GESTURE_TAP, v1->last_gesture_event_type_);
+ EXPECT_EQ(ui::ET_UNKNOWN, v3->last_gesture_event_type_);
+ EXPECT_EQ("110,110", v1->location_.ToString());
+
+ widget->CloseNow();
+}
+
////////////////////////////////////////////////////////////////////////////////
// Painting
////////////////////////////////////////////////////////////////////////////////