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

Side by Side Diff: chrome/browser/chromeos/events/event_rewriter_unittest.cc

Issue 404203003: Distinguish between keystroke and character events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: IsCharFromNative() for Mac build Created 6 years, 5 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
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698