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

Unified Diff: ui/views/view_targeter_unittest.cc

Issue 481433006: Support targeting for gestures in ViewTargeter (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: whitespace Created 6 years, 4 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
Index: ui/views/view_targeter_unittest.cc
diff --git a/ui/views/view_targeter_unittest.cc b/ui/views/view_targeter_unittest.cc
index 5757793df161c468c30fb36ba5e95733bd1ad036..5116619e6e74e43b9a312ecdd895a85307de3813 100644
--- a/ui/views/view_targeter_unittest.cc
+++ b/ui/views/view_targeter_unittest.cc
@@ -76,7 +76,26 @@ class TestMaskedView : public View, public MaskedTargeterDelegate {
namespace test {
-typedef ViewsTestBase ViewTargeterTest;
+// TODO(tdanderson): Clean up this test suite by moving common code/state into
+// ViewTargeterTest and overriding SetUp(), TearDown(), etc.
+// See crbug.com/355680.
+class ViewTargeterTest : public ViewsTestBase {
+ public:
+ ViewTargeterTest() {}
+ virtual ~ViewTargeterTest() {}
+
+ void SetGestureHandler(internal::RootView* root_view, View* handler) {
+ root_view->gesture_handler_ = handler;
+ }
+
+ void SetDispatchToGestureHandler(internal::RootView* root_view,
+ bool dispatch) {
+ root_view->dispatch_to_gesture_handler_ = dispatch;
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ViewTargeterTest);
+};
namespace {
@@ -208,6 +227,96 @@ TEST_F(ViewTargeterTest, ViewTargeterForScrollEvents) {
EXPECT_EQ(content, static_cast<View*>(current_target));
}
+// Convenience to make constructing a GestureEvent simpler.
+class GestureEventForTest : public ui::GestureEvent {
+ public:
+ GestureEventForTest(ui::EventType type, int x, int y)
+ : GestureEvent(x,
+ y,
+ 0,
+ base::TimeDelta(),
+ ui::GestureEventDetails(type, 0.0f, 0.0f)) {}
+
+ GestureEventForTest(ui::GestureEventDetails details, int x, int y)
+ : GestureEvent(x, y, 0, base::TimeDelta(), details) {}
+};
+
+// Verifies that the the functions ViewTargeter::FindTargetForEvent()
+// and ViewTargeter::FindNextBestTarget() are implemented correctly
+// for gesture events.
+TEST_F(ViewTargeterTest, ViewTargeterForGestureEvents) {
+ Widget widget;
+ Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
+ init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ init_params.bounds = gfx::Rect(0, 0, 200, 200);
+ widget.Init(init_params);
+
+ // The coordinates used for SetBounds() are in the parent coordinate space.
+ View* content = new View;
+ content->SetBounds(0, 0, 100, 100);
+ View* child = new View;
+ child->SetBounds(50, 50, 20, 20);
+ View* grandchild = new View;
+ grandchild->SetBounds(0, 0, 5, 5);
+
+ widget.SetContentsView(content);
+ content->AddChildView(child);
+ child->AddChildView(grandchild);
+
+ internal::RootView* root_view =
+ static_cast<internal::RootView*>(widget.GetRootView());
+ ViewTargeter* view_targeter = new ViewTargeter(root_view);
+ ui::EventTargeter* targeter = view_targeter;
+ root_view->SetEventTargeter(make_scoped_ptr(view_targeter));
+
+ // Define a GESTURE_TAP and a GESTURE_SCROLL_BEGIN.
+ gfx::Rect bounding_box(gfx::Point(46, 46), gfx::Size(8, 8));
+ gfx::Point center_point(bounding_box.CenterPoint());
+ ui::GestureEventDetails details(ui::ET_GESTURE_TAP, 0.0f, 0.0f);
+ details.set_bounding_box(bounding_box);
+ GestureEventForTest tap(details, center_point.x(), center_point.y());
+ details = ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN, 0.0f, 0.0f);
+ details.set_bounding_box(bounding_box);
+ GestureEventForTest scroll_begin(details, center_point.x(), center_point.y());
+
+ // Assume that the view currently handling gestures has been set as
+ // |grandchild| by a previous gesture event. Thus subsequent gesture events
+ // should be initially targeted to |grandchild|, and re-targeting should
+ // be prohibited for all gesture event types except for GESTURE_SCROLL_BEGIN
+ // (which should be re-targeted to the parent of |grandchild|).
+ SetDispatchToGestureHandler(root_view, true);
+ SetGestureHandler(root_view, grandchild);
+ EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &tap));
+ EXPECT_EQ(NULL, targeter->FindNextBestTarget(grandchild, &tap));
+ EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &scroll_begin));
+ EXPECT_EQ(child, targeter->FindNextBestTarget(grandchild, &scroll_begin));
+
+ // Assume that the view currently handling gestures is still set as
+ // |grandchild|, but this was not done by a previous gesture. Thus we are
+ // in the process of finding the View to which subsequent gestures will be
+ // dispatched, so all gesture events should be re-targeted up the ancestor
+ // chain.
+ SetDispatchToGestureHandler(root_view, false);
+ EXPECT_EQ(child, targeter->FindNextBestTarget(grandchild, &tap));
+ EXPECT_EQ(child, targeter->FindNextBestTarget(grandchild, &scroll_begin));
+
+ // Assume that the default gesture handler was set by the previous gesture,
+ // but that this handler is currently NULL. No gesture events should be
+ // re-targeted in this case (regardless of the view that is passed in to
+ // FindNextBestTarget() as the previous target).
+ SetGestureHandler(root_view, NULL);
+ SetDispatchToGestureHandler(root_view, true);
+ EXPECT_EQ(NULL, targeter->FindNextBestTarget(child, &tap));
+ EXPECT_EQ(NULL, targeter->FindNextBestTarget(NULL, &tap));
+ EXPECT_EQ(NULL, targeter->FindNextBestTarget(content, &scroll_begin));
+
+ // If no default gesture handler is currently set, targeting should be
+ // performed using the location of the gesture event.
+ SetDispatchToGestureHandler(root_view, false);
+ EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &tap));
+ EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &scroll_begin));
+}
+
// Tests that the functions ViewTargeterDelegate::DoesIntersectRect()
// and MaskedTargeterDelegate::DoesIntersectRect() work as intended when
// called on views which are derived from ViewTargeterDelegate.

Powered by Google App Engine
This is Rietveld 408576698