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 1fd47a55a8eaf19a4be82451077a4092641fd9d2..60872bf399af31079e99f7d9096d24571cab9fdc 100644 |
--- a/ui/views/controls/menu/menu_controller_unittest.cc |
+++ b/ui/views/controls/menu/menu_controller_unittest.cc |
@@ -34,6 +34,7 @@ |
#endif |
namespace views { |
+namespace test { |
namespace { |
@@ -46,6 +47,16 @@ class TestMenuItemView : public MenuItemView { |
DISALLOW_COPY_AND_ASSIGN(TestMenuItemView); |
}; |
+class SubmenuViewShown : public SubmenuView { |
+ public: |
+ SubmenuViewShown(MenuItemView* parent) : SubmenuView(parent) {} |
+ ~SubmenuViewShown() override {} |
+ bool IsShowing() override { return true; } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(SubmenuViewShown); |
+}; |
+ |
class TestPlatformEventSource : public ui::PlatformEventSource { |
public: |
TestPlatformEventSource() { |
@@ -103,6 +114,17 @@ class TestDispatcherClient : public aura::client::DispatcherClient { |
} // namespace |
+class TestMenuItemViewShown : public MenuItemView { |
+ public: |
+ TestMenuItemViewShown() : MenuItemView(nullptr) { |
+ submenu_ = new SubmenuViewShown(this); |
+ } |
+ ~TestMenuItemViewShown() override {} |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(TestMenuItemViewShown); |
+}; |
+ |
class MenuControllerTest : public ViewsTestBase { |
public: |
MenuControllerTest() : controller_(nullptr) {} |
@@ -170,6 +192,7 @@ class MenuControllerTest : public ViewsTestBase { |
void SetPendingStateItem(MenuItemView* item) { |
controller_->pending_state_.item = item; |
+ controller_->pending_state_.submenu_open = true; |
} |
void ResetSelection() { |
@@ -178,19 +201,36 @@ class MenuControllerTest : public ViewsTestBase { |
MenuController::SELECTION_UPDATE_IMMEDIATELY); |
} |
- void IncrementSelection(int delta) { |
- controller_->IncrementSelection(delta); |
+ void IncrementSelection() { |
+ controller_->IncrementSelection(MenuController::INCREMENT_SELECTION_DOWN); |
} |
- MenuItemView* FindFirstSelectableMenuItem(MenuItemView* parent) { |
- return controller_->FindFirstSelectableMenuItem(parent); |
+ void DecrementSelection() { |
+ controller_->IncrementSelection(MenuController::INCREMENT_SELECTION_UP); |
+ } |
+ |
+ MenuItemView* FindInitialSelectableMenuItemDown(MenuItemView* parent) { |
+ return controller_->FindInitialSelectableMenuItem( |
+ parent, MenuController::INCREMENT_SELECTION_DOWN); |
+ } |
+ |
+ MenuItemView* FindInitialSelectableMenuItemUp(MenuItemView* parent) { |
+ return controller_->FindInitialSelectableMenuItem( |
+ parent, MenuController::INCREMENT_SELECTION_UP); |
} |
MenuItemView* FindNextSelectableMenuItem(MenuItemView* parent, |
- int index, |
- int delta) { |
- return controller_->FindNextSelectableMenuItem(parent, index, delta); |
+ int index) { |
+ return controller_->FindNextSelectableMenuItem( |
+ parent, index, MenuController::INCREMENT_SELECTION_DOWN); |
+ } |
+ |
+ MenuItemView* FindPreviousSelectableMenuItem(MenuItemView* parent, |
+ int index) { |
+ return controller_->FindNextSelectableMenuItem( |
+ parent, index, MenuController::INCREMENT_SELECTION_UP); |
} |
+ |
void SetupMenu(views::Widget* owner, views::MenuItemView* item) { |
ResetMenuController(); |
controller_ = new MenuController(nullptr, true, nullptr); |
@@ -341,9 +381,8 @@ class TestEventHandler : public ui::EventHandler { |
int outstanding_touches_; |
}; |
-// Tests that touch event ids are released correctly. See |
-// crbug.com/439051 for details. When the ids aren't managed |
-// correctly, we get stuck down touches. |
+// Tests that touch event ids are released correctly. See crbug.com/439051 for |
+// details. When the ids aren't managed correctly, we get stuck down touches. |
TEST_F(MenuControllerTest, TouchIdsReleasedCorrectly) { |
scoped_ptr<Widget> owner(CreateOwnerWidget()); |
TestEventHandler test_event_handler; |
@@ -375,30 +414,91 @@ TEST_F(MenuControllerTest, TouchIdsReleasedCorrectly) { |
} |
#endif // defined(USE_X11) |
-TEST_F(MenuControllerTest, FirstSelectedItem) { |
+// Tests that initial selected menu items are correct when items are enabled or |
+// disabled. |
+TEST_F(MenuControllerTest, InitialSelectedItem) { |
scoped_ptr<Widget> owner(CreateOwnerWidget()); |
scoped_ptr<TestMenuItemView> menu_item(new TestMenuItemView); |
menu_item->AppendMenuItemWithLabel(1, base::ASCIIToUTF16("One")); |
menu_item->AppendMenuItemWithLabel(2, base::ASCIIToUTF16("Two")); |
- // Disabling the item "One" gets it skipped when a menu is first opened. |
- menu_item->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(false); |
- |
+ menu_item->AppendMenuItemWithLabel(3, base::ASCIIToUTF16("Three")); |
SetupMenu(owner.get(), menu_item.get()); |
- // First selectable item should be item "Two". |
- MenuItemView* first_selectable = FindFirstSelectableMenuItem(menu_item.get()); |
+ // Leave items "Two" and "Three" enabled. |
+ menu_item->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(false); |
+ // The first selectable item should be item "Two". |
+ MenuItemView* first_selectable = |
+ FindInitialSelectableMenuItemDown(menu_item.get()); |
+ ASSERT_NE(nullptr, first_selectable); |
EXPECT_EQ(2, first_selectable->GetCommand()); |
+ // The last selectable item should be item "Three". |
+ MenuItemView* last_selectable = |
+ FindInitialSelectableMenuItemUp(menu_item.get()); |
+ ASSERT_NE(nullptr, last_selectable); |
+ EXPECT_EQ(3, last_selectable->GetCommand()); |
+ |
+ // Leave items "One" and "Two" enabled. |
+ menu_item->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(true); |
+ menu_item->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(true); |
+ menu_item->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(false); |
+ // The first selectable item should be item "One". |
+ first_selectable = FindInitialSelectableMenuItemDown(menu_item.get()); |
+ ASSERT_NE(nullptr, first_selectable); |
+ EXPECT_EQ(1, first_selectable->GetCommand()); |
+ // The last selectable item should be item "Two". |
+ last_selectable = FindInitialSelectableMenuItemUp(menu_item.get()); |
+ ASSERT_NE(nullptr, last_selectable); |
+ EXPECT_EQ(2, last_selectable->GetCommand()); |
+ |
+ // Leave only a single item "One" enabled. |
+ menu_item->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(true); |
+ menu_item->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(false); |
+ menu_item->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(false); |
+ // The first selectable item should be item "One". |
+ first_selectable = FindInitialSelectableMenuItemDown(menu_item.get()); |
+ ASSERT_NE(nullptr, first_selectable); |
+ EXPECT_EQ(1, first_selectable->GetCommand()); |
+ // The last selectable item should be item "One". |
+ last_selectable = FindInitialSelectableMenuItemUp(menu_item.get()); |
+ ASSERT_NE(nullptr, last_selectable); |
+ EXPECT_EQ(1, last_selectable->GetCommand()); |
+ |
+ // Leave only a single item "Three" enabled. |
+ menu_item->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(false); |
+ menu_item->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(false); |
+ menu_item->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(true); |
+ // The first selectable item should be item "Three". |
+ first_selectable = FindInitialSelectableMenuItemDown(menu_item.get()); |
+ ASSERT_NE(nullptr, first_selectable); |
+ EXPECT_EQ(3, first_selectable->GetCommand()); |
+ // The last selectable item should be item "Three". |
+ last_selectable = FindInitialSelectableMenuItemUp(menu_item.get()); |
+ ASSERT_NE(nullptr, last_selectable); |
+ EXPECT_EQ(3, last_selectable->GetCommand()); |
+ |
+ // Leave only a single item ("Two") selected. It should be the first and the |
+ // last selectable item. |
+ menu_item->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(false); |
+ menu_item->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(true); |
+ menu_item->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(false); |
+ first_selectable = FindInitialSelectableMenuItemDown(menu_item.get()); |
+ ASSERT_NE(nullptr, first_selectable); |
+ EXPECT_EQ(2, first_selectable->GetCommand()); |
+ last_selectable = FindInitialSelectableMenuItemUp(menu_item.get()); |
+ ASSERT_NE(nullptr, last_selectable); |
+ EXPECT_EQ(2, last_selectable->GetCommand()); |
// There should be no next or previous selectable item since there is only a |
// single enabled item in the menu. |
- SetPendingStateItem(first_selectable); |
- EXPECT_EQ(nullptr, FindNextSelectableMenuItem(menu_item.get(), 1, 1)); |
- EXPECT_EQ(nullptr, FindNextSelectableMenuItem(menu_item.get(), 1, -1)); |
+ EXPECT_EQ(nullptr, FindNextSelectableMenuItem(menu_item.get(), 1)); |
+ EXPECT_EQ(nullptr, FindPreviousSelectableMenuItem(menu_item.get(), 1)); |
// Clear references in menu controller to the menu item that is going away. |
ResetSelection(); |
} |
+// Tests that opening menu and pressing 'Down' and 'Up' iterates over enabled |
+// items. |
TEST_F(MenuControllerTest, NextSelectedItem) { |
scoped_ptr<Widget> owner(CreateOwnerWidget()); |
scoped_ptr<TestMenuItemView> menu_item(new TestMenuItemView); |
@@ -417,32 +517,58 @@ TEST_F(MenuControllerTest, NextSelectedItem) { |
// Move down in the menu. |
// Select next item. |
- IncrementSelection(1); |
+ IncrementSelection(); |
EXPECT_EQ(2, pending_state_item()->GetCommand()); |
// Skip disabled item. |
- IncrementSelection(1); |
+ IncrementSelection(); |
EXPECT_EQ(4, pending_state_item()->GetCommand()); |
// Wrap around. |
- IncrementSelection(1); |
+ IncrementSelection(); |
EXPECT_EQ(1, pending_state_item()->GetCommand()); |
// Move up in the menu. |
// Wrap around. |
- IncrementSelection(-1); |
+ DecrementSelection(); |
EXPECT_EQ(4, pending_state_item()->GetCommand()); |
// Skip disabled item. |
- IncrementSelection(-1); |
+ DecrementSelection(); |
EXPECT_EQ(2, pending_state_item()->GetCommand()); |
// Select previous item. |
- IncrementSelection(-1); |
+ DecrementSelection(); |
EXPECT_EQ(1, pending_state_item()->GetCommand()); |
// Clear references in menu controller to the menu item that is going away. |
ResetSelection(); |
} |
+// Tests that opening menu and pressing 'Up' selects the last enabled menu item. |
+TEST_F(MenuControllerTest, PreviousSelectedItem) { |
+ scoped_ptr<Widget> owner(CreateOwnerWidget()); |
+ scoped_ptr<TestMenuItemViewShown> menu_item(new TestMenuItemViewShown); |
+ menu_item->AppendMenuItemWithLabel(1, base::ASCIIToUTF16("One")); |
+ menu_item->AppendMenuItemWithLabel(2, base::ASCIIToUTF16("Two")); |
+ menu_item->AppendMenuItemWithLabel(3, base::ASCIIToUTF16("Three")); |
+ menu_item->AppendMenuItemWithLabel(4, base::ASCIIToUTF16("Four")); |
+ // Disabling the item "Four" gets it skipped when using keyboard to navigate. |
+ menu_item->GetSubmenu()->GetMenuItemAt(3)->SetEnabled(false); |
+ |
+ SetupMenu(owner.get(), menu_item.get()); |
+ |
+ // Fake initial root item selection and submenu showing. |
+ SetPendingStateItem(menu_item.get()); |
+ EXPECT_EQ(0, pending_state_item()->GetCommand()); |
+ |
+ // Move up and select a previous (in our case the last enabled) item. |
+ DecrementSelection(); |
+ EXPECT_EQ(3, pending_state_item()->GetCommand()); |
+ |
+ // Clear references in menu controller to the menu item that is going away. |
+ ResetSelection(); |
+} |
+ |
+} // namespace test |
} // namespace views |