| OLD | NEW |
| 1 // Copyright 2014 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/chromeos/events/event_rewriter.h" | 5 #include "chrome/browser/chromeos/events/event_rewriter.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
| 10 #include "ash/sticky_keys/sticky_keys_controller.h" | 10 #include "ash/sticky_keys/sticky_keys_controller.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 | 57 |
| 58 std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) { | 58 std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) { |
| 59 return GetExpectedResultAsString( | 59 return GetExpectedResultAsString( |
| 60 keyevent.key_code(), keyevent.flags(), keyevent.type()); | 60 keyevent.key_code(), keyevent.flags(), keyevent.type()); |
| 61 } | 61 } |
| 62 | 62 |
| 63 std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter, | 63 std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter, |
| 64 ui::KeyboardCode ui_keycode, | 64 ui::KeyboardCode ui_keycode, |
| 65 int ui_flags, | 65 int ui_flags, |
| 66 ui::EventType ui_type) { | 66 ui::EventType ui_type) { |
| 67 const ui::KeyEvent event(ui_type, ui_keycode, ui_flags, false); | 67 const ui::KeyEvent event(ui_type, ui_keycode, ui_flags); |
| 68 scoped_ptr<ui::Event> new_event; | 68 scoped_ptr<ui::Event> new_event; |
| 69 rewriter->RewriteEvent(event, &new_event); | 69 rewriter->RewriteEvent(event, &new_event); |
| 70 if (new_event) | 70 if (new_event) |
| 71 return GetKeyEventAsString( | 71 return GetKeyEventAsString( |
| 72 static_cast<const ui::KeyEvent&>(*new_event.get())); | 72 static_cast<const ui::KeyEvent&>(*new_event.get())); |
| 73 return GetKeyEventAsString(event); | 73 return GetKeyEventAsString(event); |
| 74 } | 74 } |
| 75 | 75 |
| 76 // Table entry for simple single key event rewriting tests. | 76 // Table entry for simple single key event rewriting tests. |
| 77 struct KeyTestCase { | 77 struct KeyTestCase { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 92 int flags; | 92 int flags; |
| 93 } input, expected; | 93 } input, expected; |
| 94 }; | 94 }; |
| 95 | 95 |
| 96 #if defined(USE_X11) | 96 #if defined(USE_X11) |
| 97 // Check rewriting of an X11-based key event. | 97 // Check rewriting of an X11-based key event. |
| 98 void CheckX11KeyTestCase(const std::string& expected, | 98 void CheckX11KeyTestCase(const std::string& expected, |
| 99 chromeos::EventRewriter* rewriter, | 99 chromeos::EventRewriter* rewriter, |
| 100 const KeyTestCase& test, | 100 const KeyTestCase& test, |
| 101 XEvent* xevent) { | 101 XEvent* xevent) { |
| 102 ui::KeyEvent xkey_event(xevent, false); | 102 ui::KeyEvent xkey_event(xevent); |
| 103 if (test.test & KeyTestCase::NUMPAD) | 103 if (test.test & KeyTestCase::NUMPAD) |
| 104 xkey_event.set_flags(xkey_event.flags() | ui::EF_NUMPAD_KEY); | 104 xkey_event.set_flags(xkey_event.flags() | ui::EF_NUMPAD_KEY); |
| 105 // Verify that the X11-based key event is as expected. | 105 // Verify that the X11-based key event is as expected. |
| 106 EXPECT_EQ(GetExpectedResultAsString( | 106 EXPECT_EQ(GetExpectedResultAsString( |
| 107 test.input.key_code, test.input.flags, test.type), | 107 test.input.key_code, test.input.flags, test.type), |
| 108 GetKeyEventAsString(xkey_event)); | 108 GetKeyEventAsString(xkey_event)); |
| 109 // Rewrite the event and check the result. | 109 // Rewrite the event and check the result. |
| 110 scoped_ptr<ui::Event> new_event; | 110 scoped_ptr<ui::Event> new_event; |
| 111 rewriter->RewriteEvent(xkey_event, &new_event); | 111 rewriter->RewriteEvent(xkey_event, &new_event); |
| 112 ui::KeyEvent& rewritten_key_event = | 112 ui::KeyEvent& rewritten_key_event = |
| 113 new_event ? *static_cast<ui::KeyEvent*>(new_event.get()) : xkey_event; | 113 new_event ? *static_cast<ui::KeyEvent*>(new_event.get()) : xkey_event; |
| 114 EXPECT_EQ(expected, GetKeyEventAsString(rewritten_key_event)); | 114 EXPECT_EQ(expected, GetKeyEventAsString(rewritten_key_event)); |
| 115 if ((rewritten_key_event.key_code() != ui::VKEY_UNKNOWN) && | 115 if ((rewritten_key_event.key_code() != ui::VKEY_UNKNOWN) && |
| 116 (rewritten_key_event.native_event()->xkey.keycode != 0)) { | 116 (rewritten_key_event.native_event()->xkey.keycode != 0)) { |
| 117 // Build a new ui::KeyEvent from the rewritten native component, | 117 // Build a new ui::KeyEvent from the rewritten native component, |
| 118 // and check that it also matches the rewritten event. | 118 // and check that it also matches the rewritten event. |
| 119 EXPECT_TRUE(rewritten_key_event.native_event()); | 119 EXPECT_TRUE(rewritten_key_event.native_event()); |
| 120 ui::KeyEvent from_native_event(rewritten_key_event.native_event(), false); | 120 ui::KeyEvent from_native_event(rewritten_key_event.native_event()); |
| 121 EXPECT_EQ(expected, GetKeyEventAsString(from_native_event)); | 121 EXPECT_EQ(expected, GetKeyEventAsString(from_native_event)); |
| 122 } | 122 } |
| 123 } | 123 } |
| 124 #endif | 124 #endif |
| 125 | 125 |
| 126 // Tests a single stateless key rewrite operation. | 126 // Tests a single stateless key rewrite operation. |
| 127 // |i| is a an identifying number to locate failing tests in the tables. | 127 // |i| is a an identifying number to locate failing tests in the tables. |
| 128 void CheckKeyTestCase(chromeos::EventRewriter* rewriter, | 128 void CheckKeyTestCase(chromeos::EventRewriter* rewriter, |
| 129 const KeyTestCase& test) { | 129 const KeyTestCase& test) { |
| 130 std::string expected = | 130 std::string expected = |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 EXPECT_EQ( | 187 EXPECT_EQ( |
| 188 vkey_expected, | 188 vkey_expected, |
| 189 GetRewrittenEventAsString( | 189 GetRewrittenEventAsString( |
| 190 rewriter, test.input.key_code, test.input.flags, test.type)); | 190 rewriter, test.input.key_code, test.input.flags, test.type)); |
| 191 | 191 |
| 192 #if defined(USE_X11) | 192 #if defined(USE_X11) |
| 193 ui::ScopedXI2Event xev; | 193 ui::ScopedXI2Event xev; |
| 194 xev.InitKeyEvent(test.type, test.input.key_code, test.input.flags); | 194 xev.InitKeyEvent(test.type, test.input.key_code, test.input.flags); |
| 195 XEvent* xevent = xev; | 195 XEvent* xevent = xev; |
| 196 if (xevent->xkey.keycode) { | 196 if (xevent->xkey.keycode) { |
| 197 ui::KeyEvent xkey_event(xevent, false); | 197 ui::KeyEvent xkey_event(xevent); |
| 198 // Rewrite the event and check the result. | 198 // Rewrite the event and check the result. |
| 199 scoped_ptr<ui::Event> new_event; | 199 scoped_ptr<ui::Event> new_event; |
| 200 rewriter->RewriteEvent(xkey_event, &new_event); | 200 rewriter->RewriteEvent(xkey_event, &new_event); |
| 201 ui::KeyEvent& rewritten_key_event = | 201 ui::KeyEvent& rewritten_key_event = |
| 202 new_event ? *static_cast<ui::KeyEvent*>(new_event.get()) : xkey_event; | 202 new_event ? *static_cast<ui::KeyEvent*>(new_event.get()) : xkey_event; |
| 203 std::string native_expected = | 203 std::string native_expected = |
| 204 GetExpectedResultAsString( | 204 GetExpectedResultAsString( |
| 205 test.native_expected.key_code, | 205 test.native_expected.key_code, |
| 206 test.native_expected.flags, | 206 test.native_expected.flags, |
| 207 test.type); | 207 test.type); |
| (...skipping 1498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1706 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 1706 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
| 1707 control.SetValue(chromeos::input_method::kAltKey); | 1707 control.SetValue(chromeos::input_method::kAltKey); |
| 1708 | 1708 |
| 1709 EventRewriter rewriter(NULL); | 1709 EventRewriter rewriter(NULL); |
| 1710 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); | 1710 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); |
| 1711 rewriter.set_pref_service_for_testing(&prefs); | 1711 rewriter.set_pref_service_for_testing(&prefs); |
| 1712 | 1712 |
| 1713 // Send left control press. | 1713 // Send left control press. |
| 1714 { | 1714 { |
| 1715 ui::KeyEvent keyevent( | 1715 ui::KeyEvent keyevent( |
| 1716 ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::EF_FINAL, false); | 1716 ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::EF_FINAL); |
| 1717 scoped_ptr<ui::Event> new_event; | 1717 scoped_ptr<ui::Event> new_event; |
| 1718 // Control should NOT be remapped to Alt if EF_FINAL is set. | 1718 // Control should NOT be remapped to Alt if EF_FINAL is set. |
| 1719 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, | 1719 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, |
| 1720 rewriter.RewriteEvent(keyevent, &new_event)); | 1720 rewriter.RewriteEvent(keyevent, &new_event)); |
| 1721 EXPECT_FALSE(new_event); | 1721 EXPECT_FALSE(new_event); |
| 1722 } | 1722 } |
| 1723 #if defined(USE_X11) | 1723 #if defined(USE_X11) |
| 1724 // Send left control press, using XI2 native events. | 1724 // Send left control press, using XI2 native events. |
| 1725 { | 1725 { |
| 1726 ui::ScopedXI2Event xev; | 1726 ui::ScopedXI2Event xev; |
| 1727 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 1727 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
| 1728 XEvent* xevent = xev; | 1728 XEvent* xevent = xev; |
| 1729 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L); | 1729 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L); |
| 1730 xevent->xkey.send_event = True; // XSendEvent() always does this. | 1730 xevent->xkey.send_event = True; // XSendEvent() always does this. |
| 1731 ui::KeyEvent keyevent(xev, false /* is_char */); | 1731 ui::KeyEvent keyevent(xev); |
| 1732 scoped_ptr<ui::Event> new_event; | 1732 scoped_ptr<ui::Event> new_event; |
| 1733 // Control should NOT be remapped to Alt if send_event | 1733 // Control should NOT be remapped to Alt if send_event |
| 1734 // flag in the event is True. | 1734 // flag in the event is True. |
| 1735 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, | 1735 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, |
| 1736 rewriter.RewriteEvent(keyevent, &new_event)); | 1736 rewriter.RewriteEvent(keyevent, &new_event)); |
| 1737 EXPECT_FALSE(new_event); | 1737 EXPECT_FALSE(new_event); |
| 1738 } | 1738 } |
| 1739 #endif | 1739 #endif |
| 1740 } | 1740 } |
| 1741 | 1741 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1825 bool RewriteFunctionKeys(const ui::Event& event, | 1825 bool RewriteFunctionKeys(const ui::Event& event, |
| 1826 scoped_ptr<ui::Event>* rewritten_event) { | 1826 scoped_ptr<ui::Event>* rewritten_event) { |
| 1827 return rewriter_->RewriteEvent(event, rewritten_event); | 1827 return rewriter_->RewriteEvent(event, rewritten_event); |
| 1828 } | 1828 } |
| 1829 | 1829 |
| 1830 ui::EventDispatchDetails Send(ui::Event* event) { | 1830 ui::EventDispatchDetails Send(ui::Event* event) { |
| 1831 return source_.Send(event); | 1831 return source_.Send(event); |
| 1832 } | 1832 } |
| 1833 | 1833 |
| 1834 void SendKeyEvent(ui::EventType type, ui::KeyboardCode key_code) { | 1834 void SendKeyEvent(ui::EventType type, ui::KeyboardCode key_code) { |
| 1835 ui::KeyEvent press(type, key_code, ui::EF_NONE, false); | 1835 ui::KeyEvent press(type, key_code, ui::EF_NONE); |
| 1836 ui::EventDispatchDetails details = Send(&press); | 1836 ui::EventDispatchDetails details = Send(&press); |
| 1837 CHECK(!details.dispatcher_destroyed); | 1837 CHECK(!details.dispatcher_destroyed); |
| 1838 } | 1838 } |
| 1839 | 1839 |
| 1840 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code) { | 1840 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code) { |
| 1841 SendKeyEvent(ui::ET_KEY_PRESSED, key_code); | 1841 SendKeyEvent(ui::ET_KEY_PRESSED, key_code); |
| 1842 SendKeyEvent(ui::ET_KEY_RELEASED, key_code); | 1842 SendKeyEvent(ui::ET_KEY_RELEASED, key_code); |
| 1843 } | 1843 } |
| 1844 | 1844 |
| 1845 protected: | 1845 protected: |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1884 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); | 1884 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); |
| 1885 }; | 1885 }; |
| 1886 | 1886 |
| 1887 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { | 1887 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { |
| 1888 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); | 1888 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); |
| 1889 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); | 1889 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); |
| 1890 window_state->Activate(); | 1890 window_state->Activate(); |
| 1891 ScopedVector<ui::Event> events; | 1891 ScopedVector<ui::Event> events; |
| 1892 | 1892 |
| 1893 // Create a simulated keypress of F1 targetted at the window. | 1893 // Create a simulated keypress of F1 targetted at the window. |
| 1894 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0, false); | 1894 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, ui::EF_NONE); |
| 1895 | 1895 |
| 1896 // Simulate an apps v2 window that has requested top row keys as function | 1896 // Simulate an apps v2 window that has requested top row keys as function |
| 1897 // keys. The event should not be rewritten. | 1897 // keys. The event should not be rewritten. |
| 1898 window_state->set_top_row_keys_are_function_keys(true); | 1898 window_state->set_top_row_keys_are_function_keys(true); |
| 1899 ui::EventDispatchDetails details = Send(&press_f1); | 1899 ui::EventDispatchDetails details = Send(&press_f1); |
| 1900 ASSERT_FALSE(details.dispatcher_destroyed); | 1900 ASSERT_FALSE(details.dispatcher_destroyed); |
| 1901 PopEvents(&events); | 1901 PopEvents(&events); |
| 1902 EXPECT_EQ(1u, events.size()); | 1902 EXPECT_EQ(1u, events.size()); |
| 1903 EXPECT_EQ( | 1903 EXPECT_EQ( |
| 1904 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED), | 1904 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED), |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2190 | 2190 |
| 2191 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | 2191 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
| 2192 PopEvents(&events); | 2192 PopEvents(&events); |
| 2193 EXPECT_EQ(1u, events.size()); | 2193 EXPECT_EQ(1u, events.size()); |
| 2194 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); | 2194 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); |
| 2195 EXPECT_EQ(ui::VKEY_CONTROL, | 2195 EXPECT_EQ(ui::VKEY_CONTROL, |
| 2196 static_cast<ui::KeyEvent*>(events[0])->key_code()); | 2196 static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| 2197 | 2197 |
| 2198 // Test key press event is correctly modified and modifier release | 2198 // Test key press event is correctly modified and modifier release |
| 2199 // event is sent. | 2199 // event is sent. |
| 2200 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::EF_NONE, false); | 2200 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::EF_NONE); |
| 2201 ui::EventDispatchDetails details = Send(&press); | 2201 ui::EventDispatchDetails details = Send(&press); |
| 2202 PopEvents(&events); | 2202 PopEvents(&events); |
| 2203 EXPECT_EQ(2u, events.size()); | 2203 EXPECT_EQ(2u, events.size()); |
| 2204 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); | 2204 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); |
| 2205 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); | 2205 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| 2206 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 2206 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 2207 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | 2207 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 2208 EXPECT_EQ(ui::VKEY_CONTROL, | 2208 EXPECT_EQ(ui::VKEY_CONTROL, |
| 2209 static_cast<ui::KeyEvent*>(events[1])->key_code()); | 2209 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 2210 | 2210 |
| 2211 // Test key release event is not modified. | 2211 // Test key release event is not modified. |
| 2212 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::EF_NONE, false); | 2212 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::EF_NONE); |
| 2213 details = Send(&release); | 2213 details = Send(&release); |
| 2214 ASSERT_FALSE(details.dispatcher_destroyed); | 2214 ASSERT_FALSE(details.dispatcher_destroyed); |
| 2215 PopEvents(&events); | 2215 PopEvents(&events); |
| 2216 EXPECT_EQ(1u, events.size()); | 2216 EXPECT_EQ(1u, events.size()); |
| 2217 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); | 2217 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); |
| 2218 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); | 2218 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| 2219 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); | 2219 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 2220 } | 2220 } |
| 2221 | 2221 |
| 2222 TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) { | 2222 TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) { |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2470 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); | 2470 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); |
| 2471 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); | 2471 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); |
| 2472 | 2472 |
| 2473 // Turn off AltGr and Mod3. | 2473 // Turn off AltGr and Mod3. |
| 2474 sticky_keys_controller_->SetModifiersEnabled(false, false); | 2474 sticky_keys_controller_->SetModifiersEnabled(false, false); |
| 2475 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); | 2475 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); |
| 2476 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); | 2476 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); |
| 2477 } | 2477 } |
| 2478 | 2478 |
| 2479 } // namespace chromeos | 2479 } // namespace chromeos |
| OLD | NEW |