Index: ui/views/widget/root_view_unittest.cc |
diff --git a/ui/views/widget/root_view_unittest.cc b/ui/views/widget/root_view_unittest.cc |
index f96a45f3b433bfcb7fc0e59fee86d32d14e7da9f..9def7726fdd97475b5724ae07a6fbbfec87babd9 100644 |
--- a/ui/views/widget/root_view_unittest.cc |
+++ b/ui/views/widget/root_view_unittest.cc |
@@ -66,8 +66,7 @@ TEST_F(RootViewTest, DeleteViewDuringKeyEventDispatch) { |
EXPECT_TRUE(got_key_event); |
} |
-// Used to determine whether or not a context menu is shown as a result of |
-// a keypress. |
+// Tracks whether a context menu is shown. |
class TestContextMenuController : public ContextMenuController { |
public: |
TestContextMenuController() |
@@ -156,5 +155,89 @@ TEST_F(RootViewTest, ContextMenuFromKeyEvent) { |
controller.Reset(); |
} |
+// View which handles all gesture events. |
+class GestureHandlingView : public View { |
+ public: |
+ GestureHandlingView() { |
+ } |
+ |
+ virtual ~GestureHandlingView() { |
+ } |
+ |
+ virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { |
+ event->SetHandled(); |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(GestureHandlingView); |
+}; |
+ |
+// Tests that context menus are shown for long press by the post-target handler |
+// installed on the RootView only if the event is targetted at a view which can |
+// show a context menu. |
+TEST_F(RootViewTest, ContextMenuFromLongPress) { |
+ 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(100,100); |
+ widget.Init(init_params); |
+ internal::RootView* root_view = |
+ static_cast<internal::RootView*>(widget.GetRootView()); |
+ |
+ // Create a view capable of showing the context menu with two children one of |
+ // which handles all gesture events (e.g. a button). |
+ TestContextMenuController controller; |
+ View* parent_view = new View; |
+ parent_view->set_context_menu_controller(&controller); |
+ widget.SetContentsView(parent_view); |
+ |
+ View* gesture_handling_child_view = new GestureHandlingView; |
+ gesture_handling_child_view->SetBoundsRect(gfx::Rect(10,10)); |
+ parent_view->AddChildView(gesture_handling_child_view); |
+ |
+ View* other_child_view = new View; |
+ other_child_view->SetBoundsRect(gfx::Rect(20, 0, 10,10)); |
+ parent_view->AddChildView(other_child_view); |
+ |
+ // |parent_view| should not show a context menu as a result of a long press on |
+ // |gesture_handling_child_view|. |
+ ui::GestureEvent begin1(ui::ET_GESTURE_BEGIN, 5, 5, 0, base::TimeDelta(), |
+ ui::GestureEventDetails(ui::ET_GESTURE_BEGIN, 0, 0), 1); |
+ ui::EventDispatchDetails details = root_view->OnEventFromSource(&begin1); |
+ |
+ ui::GestureEvent long_press1(ui::ET_GESTURE_LONG_PRESS, 5, 5, 0, |
+ base::TimeDelta(), |
+ ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS, 0, 0), 1); |
+ details = root_view->OnEventFromSource(&long_press1); |
+ |
+ ui::GestureEvent end1(ui::ET_GESTURE_END, 5, 5, 0, base::TimeDelta(), |
+ ui::GestureEventDetails(ui::ET_GESTURE_END, 0, 0), 1); |
+ details = root_view->OnEventFromSource(&end1); |
+ |
+ EXPECT_FALSE(details.target_destroyed); |
+ EXPECT_FALSE(details.dispatcher_destroyed); |
+ EXPECT_EQ(0, controller.show_context_menu_calls()); |
+ |
+ // |parent_view| should show a context menu as a result of a long press on |
+ // |other_child_view|. |
+ ui::GestureEvent begin2(ui::ET_GESTURE_BEGIN, 25, 5, 0, base::TimeDelta(), |
+ ui::GestureEventDetails(ui::ET_GESTURE_BEGIN, 0, 0), 1); |
+ details = root_view->OnEventFromSource(&begin2); |
+ |
+ ui::GestureEvent long_press2(ui::ET_GESTURE_LONG_PRESS, 25, 5, 0, |
+ base::TimeDelta(), |
+ ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS, 0, 0), 1); |
+ details = root_view->OnEventFromSource(&long_press2); |
+ |
+ ui::GestureEvent end2(ui::ET_GESTURE_END, 25, 5, 0, base::TimeDelta(), |
+ ui::GestureEventDetails(ui::ET_GESTURE_END, 0, 0), 1); |
+ details = root_view->OnEventFromSource(&end2); |
+ |
+ EXPECT_FALSE(details.target_destroyed); |
+ EXPECT_FALSE(details.dispatcher_destroyed); |
+ EXPECT_EQ(1, controller.show_context_menu_calls()); |
+} |
+ |
} // namespace test |
} // namespace views |