diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-16 22:55:56 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-16 22:55:56 +0000 |
commit | c668522f91e959693c1601e416d17d10a1a4136e (patch) | |
tree | 74f882b07005692655d88a415bebbe5e6ccba951 /ui/views/view_unittest.cc | |
parent | c948be0db1a1e68ca21936e4a7a89f6fc6dd076a (diff) | |
download | chromium_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.cc | 111 |
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 //////////////////////////////////////////////////////////////////////////////// |