Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(468)

Unified Diff: ui/views/widget/widget_unittest.cc

Issue 406943002: Add test WidgetTest.GestureEventDispatch (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/view_unittest.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/widget/widget_unittest.cc
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc
index 36a83f1a82b6d3bf19e2c9ff5e5538c1744c91a7..a4ac6e4a42c0aa876812191ab9cbb83a483f078e 100644
--- a/ui/views/widget/widget_unittest.cc
+++ b/ui/views/widget/widget_unittest.cc
@@ -2011,6 +2011,119 @@ TEST_F(WidgetTest, GestureHandlerNotSetOnGestureEnd) {
widget->Close();
}
+// Tests that a (non-scroll) gesture event is dispatched to the correct views
+// in a view hierarchy and that the default gesture handler in RootView is set
+// correctly.
+// TODO(tdanderson): Create a test similar to ViewTest.ScrollGestureEvent.
+TEST_F(WidgetTest, GestureEventDispatch) {
+ Widget* widget = CreateTopLevelNativeWidget();
+ widget->SetBounds(gfx::Rect(0, 0, 300, 300));
+
+ // Define a hierarchy of four views (coordinates are in
+ // their parent coordinate space).
+ // v1 (0, 0, 300, 300)
+ // v2 (0, 0, 100, 100)
+ // v3 (0, 0, 50, 50)
+ // v4(0, 0, 10, 10)
+ EventCountView* v1 = new EventCountView();
+ v1->SetBounds(0, 0, 300, 300);
+ EventCountView* v2 = new EventCountView();
+ v2->SetBounds(0, 0, 100, 100);
+ EventCountView* v3 = new EventCountView();
+ v3->SetBounds(0, 0, 50, 50);
+ EventCountView* v4 = new EventCountView();
+ v4->SetBounds(0, 0, 10, 10);
+ internal::RootView* root_view =
+ static_cast<internal::RootView*>(widget->GetRootView());
+ root_view->AddChildView(v1);
+ v1->AddChildView(v2);
+ v2->AddChildView(v3);
+ v3->AddChildView(v4);
+
+ widget->Show();
+
+ // No gesture handler is set in the root view and none of the views in the
+ // view hierarchy handle a ui::ET_GESTURE_TAP event. In this case the tap
+ // event should be dispatched to all views in the hierarchy, the gesture
+ // handler should remain unset, and the event should remain unhandled.
+ GestureEventForTest tap(ui::ET_GESTURE_TAP, 5, 5);
+ EXPECT_EQ(NULL, GetGestureHandler(root_view));
+ widget->OnGestureEvent(&tap);
+ EXPECT_EQ(1, v1->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(1, v2->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(1, v3->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(1, v4->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(NULL, GetGestureHandler(root_view));
+ EXPECT_FALSE(tap.handled());
+
+ // No gesture handler is set in the root view and |v1|, |v2|, and |v3| all
+ // handle a ui::ET_GESTURE_TAP event. In this case the tap event should be
+ // dispatched to |v4| and |v3|, the gesture handler should be set to |v3|,
+ // and the event should be marked as handled.
+ v1->ResetCounts();
+ v2->ResetCounts();
+ v3->ResetCounts();
+ v4->ResetCounts();
+ v1->set_handle_mode(EventCountView::CONSUME_EVENTS);
+ v2->set_handle_mode(EventCountView::CONSUME_EVENTS);
+ v3->set_handle_mode(EventCountView::CONSUME_EVENTS);
+ tap = GestureEventForTest(ui::ET_GESTURE_TAP, 5, 5);
+ widget->OnGestureEvent(&tap);
+ EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(1, v3->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(1, v4->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(v3, GetGestureHandler(root_view));
+ EXPECT_TRUE(tap.handled());
+
+ // The gesture handler is set to |v3| and all views handle all gesture event
+ // types. In this case subsequent gesture events should only be dispatched to
+ // |v3| and marked as handled. The gesture handler should remain as |v3|.
+ v1->ResetCounts();
+ v2->ResetCounts();
+ v3->ResetCounts();
+ v4->ResetCounts();
+ v4->set_handle_mode(EventCountView::CONSUME_EVENTS);
+ tap = GestureEventForTest(ui::ET_GESTURE_TAP, 5, 5);
+ widget->OnGestureEvent(&tap);
+ EXPECT_TRUE(tap.handled());
+ GestureEventForTest show_press(ui::ET_GESTURE_SHOW_PRESS, 5, 5);
+ widget->OnGestureEvent(&show_press);
+ tap = GestureEventForTest(ui::ET_GESTURE_TAP, 5, 5);
+ widget->OnGestureEvent(&tap);
+ EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(2, v3->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(0, v4->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_SHOW_PRESS));
+ EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_SHOW_PRESS));
+ EXPECT_EQ(1, v3->GetEventCount(ui::ET_GESTURE_SHOW_PRESS));
+ EXPECT_EQ(0, v4->GetEventCount(ui::ET_GESTURE_SHOW_PRESS));
+ EXPECT_TRUE(tap.handled());
+ EXPECT_TRUE(show_press.handled());
+ EXPECT_EQ(v3, GetGestureHandler(root_view));
+
+ // The gesture handler is set to |v3|, but |v3| does not handle
+ // ui::ET_GESTURE_TAP events. In this case a tap gesture should be dispatched
+ // only to |v3|, but the event should remain unhandled. The gesture handler
+ // should remain as |v3|.
+ v1->ResetCounts();
+ v2->ResetCounts();
+ v3->ResetCounts();
+ v4->ResetCounts();
+ v3->set_handle_mode(EventCountView::PROPAGATE_EVENTS);
+ tap = GestureEventForTest(ui::ET_GESTURE_TAP, 5, 5);
+ widget->OnGestureEvent(&tap);
+ EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(1, v3->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_EQ(0, v4->GetEventCount(ui::ET_GESTURE_TAP));
+ EXPECT_FALSE(tap.handled());
+ EXPECT_EQ(v3, GetGestureHandler(root_view));
+
+ widget->Close();
+}
+
// Test the result of Widget::GetAllChildWidgets().
TEST_F(WidgetTest, GetAllChildWidgets) {
// Create the following widget hierarchy:
« no previous file with comments | « ui/views/view_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698