OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/ui/ash/event_rewriter.h" | 5 #include "chrome/browser/chromeos/event_rewriter.h" |
6 | 6 |
7 #include <X11/keysym.h> | |
8 #include <X11/XF86keysym.h> | |
9 #include <X11/Xlib.h> | |
10 #undef Bool | |
11 #undef None | |
12 #undef RootWindow | |
13 | |
14 #include "ash/test/ash_test_base.h" | |
15 #include "ash/wm/window_state.h" | |
7 #include "base/basictypes.h" | 16 #include "base/basictypes.h" |
8 #include "base/command_line.h" | 17 #include "base/command_line.h" |
9 #include "base/prefs/pref_member.h" | 18 #include "base/prefs/pref_member.h" |
10 #include "base/strings/stringprintf.h" | 19 #include "base/strings/stringprintf.h" |
11 #include "chrome/common/pref_names.h" | |
12 #include "chrome/test/base/testing_pref_service_syncable.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 #include "ui/events/event.h" | |
15 | |
16 #if defined(OS_CHROMEOS) | |
17 #include <X11/keysym.h> | |
18 #include <X11/XF86keysym.h> | |
19 #include <X11/Xlib.h> | |
20 | |
21 #include "ash/test/ash_test_base.h" | |
22 #include "ash/wm/window_state.h" | |
23 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" | 20 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" |
24 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" | 21 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" |
25 #include "chrome/browser/chromeos/login/mock_user_manager.h" | 22 #include "chrome/browser/chromeos/login/mock_user_manager.h" |
26 #include "chrome/browser/chromeos/login/user_manager.h" | 23 #include "chrome/browser/chromeos/login/user_manager.h" |
27 #include "chrome/browser/chromeos/preferences.h" | 24 #include "chrome/browser/chromeos/preferences.h" |
25 #include "chrome/common/pref_names.h" | |
26 #include "chrome/test/base/testing_pref_service_syncable.h" | |
28 #include "chromeos/chromeos_switches.h" | 27 #include "chromeos/chromeos_switches.h" |
29 #include "chromeos/ime/fake_xkeyboard.h" | 28 #include "chromeos/ime/fake_xkeyboard.h" |
29 #include "testing/gtest/include/gtest/gtest.h" | |
30 #include "ui/aura/window.h" | 30 #include "ui/aura/window.h" |
31 #include "ui/events/event.h" | |
31 #include "ui/events/test/events_test_utils_x11.h" | 32 #include "ui/events/test/events_test_utils_x11.h" |
32 #include "ui/events/x/touch_factory_x11.h" | 33 #include "ui/events/x/touch_factory_x11.h" |
33 #include "ui/gfx/x/x11_types.h" | 34 #include "ui/gfx/x/x11_types.h" |
34 | 35 |
35 namespace { | 36 namespace { |
36 | 37 |
37 std::string GetRewrittenEventAsString(EventRewriter* rewriter, | 38 std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter, |
38 ui::KeyboardCode ui_keycode, | 39 ui::KeyboardCode ui_keycode, |
39 int ui_flags, | 40 int ui_flags, |
40 ui::EventType ui_type, | 41 ui::EventType ui_type, |
41 KeyCode x_keycode, | 42 KeyCode x_keycode, |
42 unsigned int x_state) { | 43 unsigned int x_state) { |
43 ui::ScopedXI2Event xev; | 44 ui::ScopedXI2Event xev; |
44 xev.InitKeyEvent(ui_type, ui_keycode, ui_flags); | 45 xev.InitKeyEvent(ui_type, ui_keycode, ui_flags); |
45 XEvent* xevent = xev; | 46 XEvent* xevent = xev; |
46 xevent->xkey.keycode = x_keycode; | 47 xevent->xkey.keycode = x_keycode; |
47 xevent->xkey.state = x_state; | 48 xevent->xkey.state = x_state; |
48 ui::KeyEvent keyevent(xev, false /* is_char */); | 49 rewriter->RewriteForTesting(xevent); |
49 rewriter->RewriteForTesting(&keyevent); | 50 ui::KeyEvent keyevent(xevent, false /* is_char */); |
50 return base::StringPrintf( | 51 return base::StringPrintf( |
51 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", | 52 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", |
52 keyevent.key_code(), keyevent.flags(), keyevent.type(), | 53 keyevent.key_code(), keyevent.flags(), keyevent.type(), |
53 xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type); | 54 xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type); |
54 } | 55 } |
55 | 56 |
56 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, | 57 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, |
57 int ui_flags, | 58 int ui_flags, |
58 ui::EventType ui_type, | 59 ui::EventType ui_type, |
59 KeyCode x_keycode, | 60 KeyCode x_keycode, |
60 unsigned int x_state, | 61 unsigned int x_state, |
61 int x_type) { | 62 int x_type) { |
62 return base::StringPrintf( | 63 return base::StringPrintf( |
63 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", | 64 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", |
64 ui_keycode, ui_flags, ui_type, x_keycode, x_state, x_type); | 65 ui_keycode, ui_flags, ui_type, x_keycode, x_state, x_type); |
65 } | 66 } |
66 | 67 |
67 } // namespace | 68 } // namespace |
68 | 69 |
69 class EventRewriterTest : public testing::Test { | 70 namespace chromeos { |
71 | |
72 class EventRewriterTest : public ash::test::AshTestBase { | |
70 public: | 73 public: |
71 EventRewriterTest() | 74 EventRewriterTest() |
72 : display_(gfx::GetXDisplay()), | 75 : display_(gfx::GetXDisplay()), |
73 keycode_a_(XKeysymToKeycode(display_, XK_a)), | 76 keycode_a_(XKeysymToKeycode(display_, XK_a)), |
74 keycode_alt_l_(XKeysymToKeycode(display_, XK_Alt_L)), | 77 keycode_alt_l_(XKeysymToKeycode(display_, XK_Alt_L)), |
75 keycode_alt_r_(XKeysymToKeycode(display_, XK_Alt_R)), | 78 keycode_alt_r_(XKeysymToKeycode(display_, XK_Alt_R)), |
76 keycode_b_(XKeysymToKeycode(display_, XK_B)), | 79 keycode_b_(XKeysymToKeycode(display_, XK_B)), |
77 keycode_caps_lock_(XKeysymToKeycode(display_, XK_Caps_Lock)), | 80 keycode_caps_lock_(XKeysymToKeycode(display_, XK_Caps_Lock)), |
78 keycode_control_l_(XKeysymToKeycode(display_, XK_Control_L)), | 81 keycode_control_l_(XKeysymToKeycode(display_, XK_Control_L)), |
79 keycode_control_r_(XKeysymToKeycode(display_, XK_Control_R)), | 82 keycode_control_r_(XKeysymToKeycode(display_, XK_Control_R)), |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
165 virtual ~EventRewriterTest() {} | 168 virtual ~EventRewriterTest() {} |
166 | 169 |
167 virtual void SetUp() { | 170 virtual void SetUp() { |
168 // Mocking user manager because the real one needs to be called on UI thread | 171 // Mocking user manager because the real one needs to be called on UI thread |
169 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) | 172 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) |
170 .WillRepeatedly(testing::Return(false)); | 173 .WillRepeatedly(testing::Return(false)); |
171 input_method_manager_mock_ = | 174 input_method_manager_mock_ = |
172 new chromeos::input_method::MockInputMethodManager; | 175 new chromeos::input_method::MockInputMethodManager; |
173 chromeos::input_method::InitializeForTesting( | 176 chromeos::input_method::InitializeForTesting( |
174 input_method_manager_mock_); // pass ownership | 177 input_method_manager_mock_); // pass ownership |
178 | |
179 AshTestBase::SetUp(); | |
175 } | 180 } |
176 | 181 |
177 virtual void TearDown() { | 182 virtual void TearDown() { |
183 AshTestBase::TearDown(); | |
178 // Shutdown() deletes the IME mock object. | 184 // Shutdown() deletes the IME mock object. |
179 chromeos::input_method::Shutdown(); | 185 chromeos::input_method::Shutdown(); |
180 } | 186 } |
181 | 187 |
182 protected: | 188 protected: |
183 void TestRewriteNumPadKeys(); | 189 void TestRewriteNumPadKeys(); |
184 void TestRewriteNumPadKeysOnAppleKeyboard(); | 190 void TestRewriteNumPadKeysOnAppleKeyboard(); |
185 | 191 |
186 void RewriteLocatedEvent(EventRewriter* rewriter, | 192 void RewriteLocatedEvent(EventRewriter* rewriter, |
Daniel Erat
2014/02/14 15:56:29
rename this to RewriteMouseEvent() and make it tak
sadrul
2014/02/14 17:23:14
Done.
| |
187 ui::LocatedEvent* event) { | 193 ui::LocatedEvent* event) { |
188 rewriter->RewriteLocatedEvent(event); | 194 XEvent* xevent = event->native_event(); |
195 rewriter->RewriteLocatedEvent(xevent); | |
196 *event = ui::MouseEvent(xevent); | |
189 } | 197 } |
190 | 198 |
191 Display* display_; | 199 Display* display_; |
192 const KeyCode keycode_a_; | 200 const KeyCode keycode_a_; |
193 const KeyCode keycode_alt_l_; | 201 const KeyCode keycode_alt_l_; |
194 const KeyCode keycode_alt_r_; | 202 const KeyCode keycode_alt_r_; |
195 const KeyCode keycode_b_; | 203 const KeyCode keycode_b_; |
196 const KeyCode keycode_caps_lock_; | 204 const KeyCode keycode_caps_lock_; |
197 const KeyCode keycode_control_l_; | 205 const KeyCode keycode_control_l_; |
198 const KeyCode keycode_control_r_; | 206 const KeyCode keycode_control_r_; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
271 const KeyCode keycode_0_; | 279 const KeyCode keycode_0_; |
272 const KeyCode keycode_minus_; | 280 const KeyCode keycode_minus_; |
273 const KeyCode keycode_equal_; | 281 const KeyCode keycode_equal_; |
274 const KeyCode keycode_period_; | 282 const KeyCode keycode_period_; |
275 const KeyCode keycode_insert_; | 283 const KeyCode keycode_insert_; |
276 chromeos::MockUserManager* mock_user_manager_; // Not owned. | 284 chromeos::MockUserManager* mock_user_manager_; // Not owned. |
277 chromeos::ScopedUserManagerEnabler user_manager_enabler_; | 285 chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
278 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; | 286 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; |
279 }; | 287 }; |
280 | 288 |
281 #else | |
282 class EventRewriterTest : public testing::Test { | |
283 public: | |
284 EventRewriterTest() {} | |
285 virtual ~EventRewriterTest() {} | |
286 }; | |
287 #endif | |
288 | |
289 TEST_F(EventRewriterTest, TestGetDeviceType) { | 289 TEST_F(EventRewriterTest, TestGetDeviceType) { |
290 // This is the typical string which an Apple keyboard sends. | 290 // This is the typical string which an Apple keyboard sends. |
291 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, | 291 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, |
292 EventRewriter::GetDeviceType("Apple Inc. Apple Keyboard")); | 292 EventRewriter::GetDeviceType("Apple Inc. Apple Keyboard")); |
293 | 293 |
294 // Other cases we accept. | 294 // Other cases we accept. |
295 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, | 295 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, |
296 EventRewriter::GetDeviceType("Apple Keyboard")); | 296 EventRewriter::GetDeviceType("Apple Keyboard")); |
297 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, | 297 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, |
298 EventRewriter::GetDeviceType("apple keyboard")); | 298 EventRewriter::GetDeviceType("apple keyboard")); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
332 EXPECT_EQ(1U, rewriter.device_id_to_type_for_testing().size()); | 332 EXPECT_EQ(1U, rewriter.device_id_to_type_for_testing().size()); |
333 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, | 333 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, |
334 rewriter.DeviceAddedForTesting(1, "Apple Keyboard")); | 334 rewriter.DeviceAddedForTesting(1, "Apple Keyboard")); |
335 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); | 335 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); |
336 // Try to reuse the first ID. | 336 // Try to reuse the first ID. |
337 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, | 337 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, |
338 rewriter.DeviceAddedForTesting(0, "Apple Keyboard")); | 338 rewriter.DeviceAddedForTesting(0, "Apple Keyboard")); |
339 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); | 339 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); |
340 } | 340 } |
341 | 341 |
342 #if defined(OS_CHROMEOS) | |
343 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { | 342 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { |
344 // First, test with a PC keyboard. | 343 // First, test with a PC keyboard. |
345 TestingPrefServiceSyncable prefs; | 344 TestingPrefServiceSyncable prefs; |
346 EventRewriter rewriter; | 345 EventRewriter rewriter; |
347 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 346 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
348 rewriter.set_last_device_id_for_testing(0); | 347 rewriter.set_last_device_id_for_testing(0); |
349 rewriter.set_pref_service_for_testing(&prefs); | 348 rewriter.set_pref_service_for_testing(&prefs); |
350 | 349 |
351 // XK_a, Alt modifier. | 350 // XK_a, Alt modifier. |
352 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, | 351 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
(...skipping 1865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2218 ui::VKEY_F9, keycode_f9_, 0, 0 }, | 2217 ui::VKEY_F9, keycode_f9_, 0, 0 }, |
2219 { ui::VKEY_F10, keycode_f10_, Mod4Mask, 0, | 2218 { ui::VKEY_F10, keycode_f10_, Mod4Mask, 0, |
2220 ui::VKEY_F10, keycode_f10_, 0, 0 }, | 2219 ui::VKEY_F10, keycode_f10_, 0, 0 }, |
2221 { ui::VKEY_F11, keycode_f11_, Mod4Mask, 0, | 2220 { ui::VKEY_F11, keycode_f11_, Mod4Mask, 0, |
2222 ui::VKEY_F11, keycode_f11_, 0, 0 }, | 2221 ui::VKEY_F11, keycode_f11_, 0, 0 }, |
2223 { ui::VKEY_F12, keycode_f12_, Mod4Mask, 0, | 2222 { ui::VKEY_F12, keycode_f12_, Mod4Mask, 0, |
2224 ui::VKEY_F12, keycode_f12_, 0, 0 }, | 2223 ui::VKEY_F12, keycode_f12_, 0, 0 }, |
2225 }; | 2224 }; |
2226 | 2225 |
2227 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 2226 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
2227 // XKeysymToKeycode returns zero for unknown keys. So ignore those. | |
2228 if (tests[i].output_native == 0) | |
2229 continue; | |
2228 EXPECT_EQ(GetExpectedResultAsString(tests[i].output, | 2230 EXPECT_EQ(GetExpectedResultAsString(tests[i].output, |
2229 tests[i].output_mods, | 2231 tests[i].output_mods, |
2230 ui::ET_KEY_PRESSED, | 2232 ui::ET_KEY_PRESSED, |
2231 tests[i].output_native, | 2233 tests[i].output_native, |
2232 tests[i].output_native_mods, | 2234 tests[i].output_native_mods, |
2233 KeyPress), | 2235 KeyPress), |
2234 GetRewrittenEventAsString(&rewriter, | 2236 GetRewrittenEventAsString(&rewriter, |
2235 tests[i].input, | 2237 tests[i].input, |
2236 tests[i].input_mods, | 2238 tests[i].input_mods, |
2237 ui::ET_KEY_PRESSED, | 2239 ui::ET_KEY_PRESSED, |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2299 rewriter.set_pref_service_for_testing(&prefs); | 2301 rewriter.set_pref_service_for_testing(&prefs); |
2300 | 2302 |
2301 // Send left control press. | 2303 // Send left control press. |
2302 std::string rewritten_event; | 2304 std::string rewritten_event; |
2303 { | 2305 { |
2304 ui::ScopedXI2Event xev; | 2306 ui::ScopedXI2Event xev; |
2305 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 2307 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
2306 XEvent* xevent = xev; | 2308 XEvent* xevent = xev; |
2307 xevent->xkey.keycode = keycode_control_l_; | 2309 xevent->xkey.keycode = keycode_control_l_; |
2308 xevent->xkey.send_event = True; // XSendEvent() always does this. | 2310 xevent->xkey.send_event = True; // XSendEvent() always does this. |
2311 rewriter.RewriteForTesting(xevent); | |
2309 ui::KeyEvent keyevent(xev, false /* is_char */); | 2312 ui::KeyEvent keyevent(xev, false /* is_char */); |
2310 rewriter.RewriteForTesting(&keyevent); | |
2311 rewritten_event = base::StringPrintf( | 2313 rewritten_event = base::StringPrintf( |
2312 "ui_keycode=%d ui_flags=%d ui_type=%d " | 2314 "ui_keycode=%d ui_flags=%d ui_type=%d " |
2313 "x_keycode=%u x_state=%u x_type=%d", | 2315 "x_keycode=%u x_state=%u x_type=%d", |
2314 keyevent.key_code(), keyevent.flags(), keyevent.type(), | 2316 keyevent.key_code(), keyevent.flags(), keyevent.type(), |
2315 xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type); | 2317 xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type); |
2316 } | 2318 } |
2317 | 2319 |
2318 // XK_Control_L (left Control key) should NOT be remapped to Alt if send_event | 2320 // XK_Control_L (left Control key) should NOT be remapped to Alt if send_event |
2319 // flag in the event is True. | 2321 // flag in the event is True. |
2320 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, | 2322 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
2321 ui::EF_CONTROL_DOWN, | 2323 ui::EF_CONTROL_DOWN, |
2322 ui::ET_KEY_PRESSED, | 2324 ui::ET_KEY_PRESSED, |
2323 keycode_control_l_, | 2325 keycode_control_l_, |
2324 0U, | 2326 0U, |
2325 KeyPress), | 2327 KeyPress), |
2326 rewritten_event); | 2328 rewritten_event); |
2327 } | 2329 } |
2328 | 2330 |
2329 // Tests of event rewriting that depend on the Ash window manager. | 2331 // Tests of event rewriting that depend on the Ash window manager. |
2330 class EventRewriterAshTest : public ash::test::AshTestBase { | 2332 class EventRewriterAshTest : public ash::test::AshTestBase { |
2331 public: | 2333 public: |
2332 EventRewriterAshTest() { | 2334 EventRewriterAshTest() { |
2333 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); | 2335 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); |
2334 rewriter_.set_pref_service_for_testing(&prefs_); | 2336 rewriter_.set_pref_service_for_testing(&prefs_); |
2335 } | 2337 } |
2336 virtual ~EventRewriterAshTest() {} | 2338 virtual ~EventRewriterAshTest() {} |
2337 | 2339 |
2338 bool RewriteFunctionKeys(ui::KeyEvent* event) { | 2340 bool RewriteFunctionKeys(XEvent* event) { |
2339 return rewriter_.RewriteFunctionKeys(event); | 2341 return rewriter_.RewriteFunctionKeys(event); |
2340 } | 2342 } |
2341 | 2343 |
2342 protected: | 2344 protected: |
2343 TestingPrefServiceSyncable prefs_; | 2345 TestingPrefServiceSyncable prefs_; |
2344 | 2346 |
2345 private: | 2347 private: |
2346 EventRewriter rewriter_; | 2348 EventRewriter rewriter_; |
2347 | 2349 |
2348 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); | 2350 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); |
2349 }; | 2351 }; |
2350 | 2352 |
2351 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { | 2353 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { |
2352 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); | 2354 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); |
2353 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); | 2355 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); |
2354 window_state->Activate(); | 2356 window_state->Activate(); |
2355 | 2357 |
2356 // Create a simulated keypress of F1 targetted at the window. | 2358 // Create a simulated keypress of F1 targetted at the window. |
2357 ui::ScopedXI2Event xev_f1; | 2359 ui::ScopedXI2Event xev_f1; |
2358 KeyCode keycode_f1 = XKeysymToKeycode(gfx::GetXDisplay(), XK_F1); | 2360 KeyCode keycode_f1 = XKeysymToKeycode(gfx::GetXDisplay(), XK_F1); |
2359 xev_f1.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0); | 2361 xev_f1.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0); |
2360 XEvent* xevent = xev_f1; | 2362 XEvent* xevent = xev_f1; |
2361 xevent->xkey.keycode = keycode_f1; | 2363 xevent->xkey.keycode = keycode_f1; |
2362 ui::KeyEvent press_f1(xev_f1, false); | |
2363 ui::Event::DispatcherApi dispatch_helper(&press_f1); | |
2364 dispatch_helper.set_target(window.get()); | |
2365 | 2364 |
2366 // Simulate an apps v2 window that has requested top row keys as function | 2365 // Simulate an apps v2 window that has requested top row keys as function |
2367 // keys. The event should not be rewritten. | 2366 // keys. The event should not be rewritten. |
2368 window_state->set_top_row_keys_are_function_keys(true); | 2367 window_state->set_top_row_keys_are_function_keys(true); |
2369 ASSERT_FALSE(RewriteFunctionKeys(&press_f1)); | 2368 ASSERT_FALSE(RewriteFunctionKeys(xevent)); |
2369 ui::KeyEvent press_f1(xev_f1, false); | |
2370 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); | 2370 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); |
2371 | 2371 |
2372 // The event should also not be rewritten if the send-function-keys pref is | 2372 // The event should also not be rewritten if the send-function-keys pref is |
2373 // additionally set, for both apps v2 and regular windows. | 2373 // additionally set, for both apps v2 and regular windows. |
2374 BooleanPrefMember send_function_keys_pref; | 2374 BooleanPrefMember send_function_keys_pref; |
2375 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, &prefs_); | 2375 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, &prefs_); |
2376 send_function_keys_pref.SetValue(true); | 2376 send_function_keys_pref.SetValue(true); |
2377 ASSERT_FALSE(RewriteFunctionKeys(&press_f1)); | 2377 ASSERT_FALSE(RewriteFunctionKeys(xevent)); |
2378 press_f1 = ui::KeyEvent(xev_f1, false); | |
2378 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); | 2379 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); |
2379 window_state->set_top_row_keys_are_function_keys(false); | 2380 window_state->set_top_row_keys_are_function_keys(false); |
2380 ASSERT_FALSE(RewriteFunctionKeys(&press_f1)); | 2381 ASSERT_FALSE(RewriteFunctionKeys(xevent)); |
2382 press_f1 = ui::KeyEvent(xev_f1, false); | |
2381 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); | 2383 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); |
2382 | 2384 |
2383 // If the pref isn't set when an event is sent to a regular window, F1 is | 2385 // If the pref isn't set when an event is sent to a regular window, F1 is |
2384 // rewritten to the back key. | 2386 // rewritten to the back key. |
2385 send_function_keys_pref.SetValue(false); | 2387 send_function_keys_pref.SetValue(false); |
2386 ASSERT_TRUE(RewriteFunctionKeys(&press_f1)); | 2388 ASSERT_TRUE(RewriteFunctionKeys(xevent)); |
2389 press_f1 = ui::KeyEvent(xev_f1, false); | |
2387 ASSERT_EQ(ui::VKEY_BROWSER_BACK, press_f1.key_code()); | 2390 ASSERT_EQ(ui::VKEY_BROWSER_BACK, press_f1.key_code()); |
2388 } | 2391 } |
2389 | 2392 |
2390 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { | 2393 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { |
2391 std::vector<unsigned int> device_list; | 2394 std::vector<unsigned int> device_list; |
2392 device_list.push_back(10); | 2395 device_list.push_back(10); |
2393 device_list.push_back(11); | 2396 device_list.push_back(11); |
2394 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); | 2397 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); |
2395 TestingPrefServiceSyncable prefs; | 2398 TestingPrefServiceSyncable prefs; |
2396 EventRewriter rewriter; | 2399 EventRewriter rewriter; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2452 } | 2455 } |
2453 { | 2456 { |
2454 ui::ScopedXI2Event xev; | 2457 ui::ScopedXI2Event xev; |
2455 xev.InitGenericButtonEvent(11, ui::ET_MOUSE_RELEASED, kLeftAndAltFlag); | 2458 xev.InitGenericButtonEvent(11, ui::ET_MOUSE_RELEASED, kLeftAndAltFlag); |
2456 ui::MouseEvent release(xev); | 2459 ui::MouseEvent release(xev); |
2457 RewriteLocatedEvent(&rewriter, &release); | 2460 RewriteLocatedEvent(&rewriter, &release); |
2458 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & release.flags()); | 2461 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & release.flags()); |
2459 } | 2462 } |
2460 } | 2463 } |
2461 | 2464 |
2462 #endif // OS_CHROMEOS | 2465 } // namespace chromeos |
OLD | NEW |