Chromium Code Reviews| Index: ui/views/controls/menu/menu_controller_unittest.cc |
| diff --git a/ui/views/controls/menu/menu_controller_unittest.cc b/ui/views/controls/menu/menu_controller_unittest.cc |
| index 7608aeae8890ab08e0e4a36feb1f12b0065f7e4f..7b777a92298a1b331b0627080801ae1714dd6b23 100644 |
| --- a/ui/views/controls/menu/menu_controller_unittest.cc |
| +++ b/ui/views/controls/menu/menu_controller_unittest.cc |
| @@ -153,6 +153,19 @@ class TestEventHandler : public ui::EventHandler { |
| DISALLOW_COPY_AND_ASSIGN(TestEventHandler); |
| }; |
| +class TestWidget : public Widget { |
|
msw
2017/06/29 19:02:10
nit: |GestureTestWidget| and comment "A test widge
minch1
2017/06/30 19:53:08
Done.
|
| + public: |
| + TestWidget() : gesture_count_(0) {} |
| + |
| + void OnGestureEvent(ui::GestureEvent* event) override { gesture_count_++; } |
| + |
| + int gesture_count() const { return gesture_count_; } |
| + |
| + private: |
| + int gesture_count_; |
| + DISALLOW_COPY_AND_ASSIGN(TestWidget); |
| +}; |
| + |
| #if defined(USE_AURA) |
| // A DragDropClient which does not trigger a nested run loop. Instead a |
| // callback is triggered during StartDragAndDrop in order to allow testing. |
| @@ -458,7 +471,7 @@ class MenuControllerTest : public ViewsTestBase { |
| menu_item()->GetSubmenu()->GetMenuItemAt(0)->CreateSubmenu(), location); |
| } |
| - Widget* owner() { return owner_.get(); } |
| + TestWidget* owner() { return owner_.get(); } |
| ui::test::EventGenerator* event_generator() { return event_generator_.get(); } |
| TestMenuItemViewShown* menu_item() { return menu_item_.get(); } |
| TestMenuDelegate* menu_delegate() { return menu_delegate_.get(); } |
| @@ -515,9 +528,11 @@ class MenuControllerTest : public ViewsTestBase { |
| menu_controller_ = nullptr; |
| } |
| + int CountOwnerOnGestureEvent() { return owner_->gesture_count(); } |
| + |
| private: |
| void Init() { |
| - owner_.reset(new Widget); |
| + owner_.reset(new TestWidget); |
|
msw
2017/06/29 19:02:10
nit: owner = base::MakeUnique<TestWidget>(); (opti
minch1
2017/06/30 19:53:08
Done.
|
| Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); |
| params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| owner_->Init(params); |
| @@ -552,7 +567,7 @@ class MenuControllerTest : public ViewsTestBase { |
| // Not owned. |
| DestructingTestViewsDelegate* test_views_delegate_; |
| - std::unique_ptr<Widget> owner_; |
| + std::unique_ptr<TestWidget> owner_; |
| std::unique_ptr<ui::test::EventGenerator> event_generator_; |
| std::unique_ptr<TestMenuItemViewShown> menu_item_; |
| std::unique_ptr<TestMenuControllerDelegate> menu_controller_delegate_; |
| @@ -1106,6 +1121,37 @@ TEST_F(MenuControllerTest, DoubleAsynchronousNested) { |
| EXPECT_EQ(1, nested_delegate->on_menu_closed_called()); |
| } |
| +#if !defined(OS_MACOSX) |
| +TEST_F(MenuControllerTest, PreserveGestureForOwner) { |
| + MenuController* controller = menu_controller(); |
| + MenuItemView* item = menu_item(); |
| + controller->Run(owner(), nullptr, item, gfx::Rect(), |
| + MENU_ANCHOR_FIXED_BOTTOMCENTER, false, false); |
| + SubmenuView* sub_menu = item->GetSubmenu(); |
| + sub_menu->ShowAt(owner(), gfx::Rect(0, 0, 100, 100), true); |
| + |
| + // Gesture triggered outside the menu. |
|
msw
2017/06/29 19:02:10
nit: "The menu's owner should receive gestures tri
minch1
2017/06/30 19:53:08
Done.
|
| + gfx::Point location(sub_menu->bounds().bottom_left().x(), |
| + sub_menu->bounds().bottom_left().y() + 10); |
| + ui::GestureEvent event(location.x(), location.y(), 0, ui::EventTimeForNow(), |
| + ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN)); |
| + controller->set_send_gesture_events_to_owner(true); |
|
msw
2017/06/29 19:02:10
optional nit: test that gesture events are not sen
minch1
2017/06/30 19:53:08
Done.
|
| + controller->OnGestureEvent(sub_menu, &event); |
| + EXPECT_EQ(CountOwnerOnGestureEvent(), 1); |
| + |
| + ui::GestureEvent event2(location.x(), location.y(), 0, ui::EventTimeForNow(), |
| + ui::GestureEventDetails(ui::ET_GESTURE_END)); |
| + |
| + controller->OnGestureEvent(sub_menu, &event2); |
| + EXPECT_EQ(CountOwnerOnGestureEvent(), 2); |
| + |
| + // ET_GESTURE_END disabled preserve_current_gesture_for_owner. Then |
|
msw
2017/06/29 19:02:10
nit: ET_GESTURE_END resets the |send_gesture_event
minch1
2017/06/30 19:53:08
Done.
|
| + // OnGestureEvent of the owner will not be called. |
| + controller->OnGestureEvent(sub_menu, &event2); |
| + EXPECT_EQ(CountOwnerOnGestureEvent(), 2); |
| +} |
| +#endif // !defined(OS_MACOSX) |
| + |
| // Tests that a nested menu does not crash when trying to repost events that |
| // occur outside of the bounds of the menu. Instead a proper shutdown should |
| // occur. |