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 |