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

Side by Side Diff: ui/views/controls/menu/menu_runner_unittest.cc

Issue 1652133003: Fix non-Latin key event handling for menu mnemonics (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added tests Created 4 years, 10 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 unified diff | Download patch
« no previous file with comments | « ui/views/controls/menu/menu_key_event_handler.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « ui/views/controls/menu/menu_key_event_handler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698