| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/views/controls/menu/menu_runner.h" | 5 #include "ui/views/controls/menu/menu_runner.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/strings/utf_string_conversions.h" |
| 11 #include "ui/base/ui_base_types.h" | 12 #include "ui/base/ui_base_types.h" |
| 12 #include "ui/events/test/event_generator.h" | 13 #include "ui/events/test/event_generator.h" |
| 13 #include "ui/views/controls/menu/menu_delegate.h" | 14 #include "ui/views/controls/menu/menu_delegate.h" |
| 14 #include "ui/views/controls/menu/menu_item_view.h" | 15 #include "ui/views/controls/menu/menu_item_view.h" |
| 15 #include "ui/views/controls/menu/menu_types.h" | 16 #include "ui/views/controls/menu/menu_types.h" |
| 17 #include "ui/views/controls/menu/submenu_view.h" |
| 16 #include "ui/views/test/views_test_base.h" | 18 #include "ui/views/test/views_test_base.h" |
| 17 #include "ui/views/widget/widget.h" | 19 #include "ui/views/widget/widget.h" |
| 18 | 20 |
| 19 namespace views { | 21 namespace views { |
| 20 namespace test { | 22 namespace test { |
| 21 | 23 |
| 22 // Implementation of MenuDelegate that only reports the values of calls to | 24 // Implementation of MenuDelegate that only reports the values of calls to |
| 23 // OnMenuClosed. | 25 // OnMenuClosed and ExecuteCommand. |
| 24 class TestMenuDelegate : public MenuDelegate { | 26 class TestMenuDelegate : public MenuDelegate { |
| 25 public: | 27 public: |
| 26 TestMenuDelegate(); | 28 TestMenuDelegate(); |
| 27 ~TestMenuDelegate() override; | 29 ~TestMenuDelegate() override; |
| 28 | 30 |
| 29 int on_menu_closed_called() { return on_menu_closed_called_; } | 31 int execute_command_id() const { return execute_command_id_; } |
| 30 MenuItemView* on_menu_closed_menu() { return on_menu_closed_menu_; } | 32 |
| 31 MenuRunner::RunResult on_menu_closed_run_result() { | 33 int on_menu_closed_called() const { return on_menu_closed_called_; } |
| 34 MenuItemView* on_menu_closed_menu() const { return on_menu_closed_menu_; } |
| 35 MenuRunner::RunResult on_menu_closed_run_result() const { |
| 32 return on_menu_closed_run_result_; | 36 return on_menu_closed_run_result_; |
| 33 } | 37 } |
| 34 | 38 |
| 35 // MenuDelegate: | 39 // MenuDelegate: |
| 40 void ExecuteCommand(int id) override; |
| 36 void OnMenuClosed(MenuItemView* menu, MenuRunner::RunResult result) override; | 41 void OnMenuClosed(MenuItemView* menu, MenuRunner::RunResult result) override; |
| 37 | 42 |
| 38 private: | 43 private: |
| 44 // ID of last executed command. |
| 45 int execute_command_id_; |
| 46 |
| 39 // The number of times OnMenuClosed was called. | 47 // The number of times OnMenuClosed was called. |
| 40 int on_menu_closed_called_; | 48 int on_menu_closed_called_; |
| 41 | 49 |
| 42 // The values of the last call to OnMenuClosed. | 50 // The values of the last call to OnMenuClosed. |
| 43 MenuItemView* on_menu_closed_menu_; | 51 MenuItemView* on_menu_closed_menu_; |
| 44 MenuRunner::RunResult on_menu_closed_run_result_; | 52 MenuRunner::RunResult on_menu_closed_run_result_; |
| 45 | 53 |
| 46 DISALLOW_COPY_AND_ASSIGN(TestMenuDelegate); | 54 DISALLOW_COPY_AND_ASSIGN(TestMenuDelegate); |
| 47 }; | 55 }; |
| 48 | 56 |
| 49 TestMenuDelegate::TestMenuDelegate() | 57 TestMenuDelegate::TestMenuDelegate() |
| 50 : on_menu_closed_called_(0), | 58 : execute_command_id_(0), |
| 59 on_menu_closed_called_(0), |
| 51 on_menu_closed_menu_(nullptr), | 60 on_menu_closed_menu_(nullptr), |
| 52 on_menu_closed_run_result_(MenuRunner::MENU_DELETED) {} | 61 on_menu_closed_run_result_(MenuRunner::MENU_DELETED) {} |
| 53 | 62 |
| 54 TestMenuDelegate::~TestMenuDelegate() {} | 63 TestMenuDelegate::~TestMenuDelegate() {} |
| 55 | 64 |
| 65 void TestMenuDelegate::ExecuteCommand(int id) { |
| 66 execute_command_id_ = id; |
| 67 } |
| 68 |
| 56 void TestMenuDelegate::OnMenuClosed(MenuItemView* menu, | 69 void TestMenuDelegate::OnMenuClosed(MenuItemView* menu, |
| 57 MenuRunner::RunResult result) { | 70 MenuRunner::RunResult result) { |
| 58 on_menu_closed_called_++; | 71 on_menu_closed_called_++; |
| 59 on_menu_closed_menu_ = menu; | 72 on_menu_closed_menu_ = menu; |
| 60 on_menu_closed_run_result_ = result; | 73 on_menu_closed_run_result_ = result; |
| 61 } | 74 } |
| 62 | 75 |
| 63 class MenuRunnerTest : public ViewsTestBase { | 76 class MenuRunnerTest : public ViewsTestBase { |
| 64 public: | 77 public: |
| 65 MenuRunnerTest(); | 78 MenuRunnerTest(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 94 MenuRunnerTest::~MenuRunnerTest() {} | 107 MenuRunnerTest::~MenuRunnerTest() {} |
| 95 | 108 |
| 96 void MenuRunnerTest::InitMenuRunner(int32_t run_types) { | 109 void MenuRunnerTest::InitMenuRunner(int32_t run_types) { |
| 97 menu_runner_.reset(new MenuRunner(menu_item_view_, run_types)); | 110 menu_runner_.reset(new MenuRunner(menu_item_view_, run_types)); |
| 98 } | 111 } |
| 99 | 112 |
| 100 void MenuRunnerTest::SetUp() { | 113 void MenuRunnerTest::SetUp() { |
| 101 ViewsTestBase::SetUp(); | 114 ViewsTestBase::SetUp(); |
| 102 menu_delegate_.reset(new TestMenuDelegate); | 115 menu_delegate_.reset(new TestMenuDelegate); |
| 103 menu_item_view_ = new MenuItemView(menu_delegate_.get()); | 116 menu_item_view_ = new MenuItemView(menu_delegate_.get()); |
| 117 menu_item_view_->AppendMenuItemWithLabel(1, base::ASCIIToUTF16("One")); |
| 118 menu_item_view_->AppendMenuItemWithLabel(2, |
| 119 base::WideToUTF16(L"\x062f\x0648")); |
| 104 | 120 |
| 105 owner_.reset(new Widget); | 121 owner_.reset(new Widget); |
| 106 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); | 122 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); |
| 107 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 123 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 108 owner_->Init(params); | 124 owner_->Init(params); |
| 109 owner_->Show(); | 125 owner_->Show(); |
| 110 } | 126 } |
| 111 | 127 |
| 112 void MenuRunnerTest::TearDown() { | 128 void MenuRunnerTest::TearDown() { |
| 113 owner_->CloseNow(); | 129 owner_->CloseNow(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 | 161 |
| 146 ui::test::EventGenerator generator(GetContext(), owner()->GetNativeWindow()); | 162 ui::test::EventGenerator generator(GetContext(), owner()->GetNativeWindow()); |
| 147 generator.PressKey(ui::VKEY_ESCAPE, 0); | 163 generator.PressKey(ui::VKEY_ESCAPE, 0); |
| 148 EXPECT_FALSE(runner->IsRunning()); | 164 EXPECT_FALSE(runner->IsRunning()); |
| 149 TestMenuDelegate* delegate = menu_delegate(); | 165 TestMenuDelegate* delegate = menu_delegate(); |
| 150 EXPECT_EQ(1, delegate->on_menu_closed_called()); | 166 EXPECT_EQ(1, delegate->on_menu_closed_called()); |
| 151 EXPECT_EQ(nullptr, delegate->on_menu_closed_menu()); | 167 EXPECT_EQ(nullptr, delegate->on_menu_closed_menu()); |
| 152 EXPECT_EQ(MenuRunner::NORMAL_EXIT, delegate->on_menu_closed_run_result()); | 168 EXPECT_EQ(MenuRunner::NORMAL_EXIT, delegate->on_menu_closed_run_result()); |
| 153 } | 169 } |
| 154 | 170 |
| 171 // Tests that a key press on a US keyboard layout activates the correct menu |
| 172 // item. |
| 173 TEST_F(MenuRunnerTest, LatinMnemonic) { |
| 174 InitMenuRunner(MenuRunner::ASYNC); |
| 175 MenuRunner* runner = menu_runner(); |
| 176 MenuRunner::RunResult result = runner->RunMenuAt( |
| 177 owner(), nullptr, gfx::Rect(), MENU_ANCHOR_TOPLEFT, ui::MENU_SOURCE_NONE); |
| 178 EXPECT_EQ(MenuRunner::NORMAL_EXIT, result); |
| 179 EXPECT_TRUE(runner->IsRunning()); |
| 180 |
| 181 ui::test::EventGenerator generator(GetContext(), owner()->GetNativeWindow()); |
| 182 generator.PressKey(ui::VKEY_O, 0); |
| 183 EXPECT_FALSE(runner->IsRunning()); |
| 184 TestMenuDelegate* delegate = menu_delegate(); |
| 185 EXPECT_EQ(1, delegate->execute_command_id()); |
| 186 EXPECT_EQ(1, delegate->on_menu_closed_called()); |
| 187 EXPECT_NE(nullptr, delegate->on_menu_closed_menu()); |
| 188 EXPECT_EQ(MenuRunner::NORMAL_EXIT, delegate->on_menu_closed_run_result()); |
| 189 } |
| 190 |
| 191 // Tests that a key press on a non-US keyboard layout activates the correct menu |
| 192 // item. |
| 193 TEST_F(MenuRunnerTest, NonLatinMnemonic) { |
| 194 InitMenuRunner(MenuRunner::ASYNC); |
| 195 MenuRunner* runner = menu_runner(); |
| 196 MenuRunner::RunResult result = runner->RunMenuAt( |
| 197 owner(), nullptr, gfx::Rect(), MENU_ANCHOR_TOPLEFT, ui::MENU_SOURCE_NONE); |
| 198 EXPECT_EQ(MenuRunner::NORMAL_EXIT, result); |
| 199 EXPECT_TRUE(runner->IsRunning()); |
| 200 |
| 201 ui::test::EventGenerator generator(GetContext(), owner()->GetNativeWindow()); |
| 202 ui::KeyEvent key_press(0x062f, ui::VKEY_N, 0); |
| 203 generator.Dispatch(&key_press); |
| 204 EXPECT_FALSE(runner->IsRunning()); |
| 205 TestMenuDelegate* delegate = menu_delegate(); |
| 206 EXPECT_EQ(2, delegate->execute_command_id()); |
| 207 EXPECT_EQ(1, delegate->on_menu_closed_called()); |
| 208 EXPECT_NE(nullptr, delegate->on_menu_closed_menu()); |
| 209 EXPECT_EQ(MenuRunner::NORMAL_EXIT, delegate->on_menu_closed_run_result()); |
| 210 } |
| 211 |
| 155 } // namespace test | 212 } // namespace test |
| 156 } // namespace views | 213 } // namespace views |
| OLD | NEW |