| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/renderer_host/web_input_event_aura.h" | 5 #include "content/browser/renderer_host/web_input_event_aura.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 #include "ui/events/event.h" | 9 #include "ui/events/event.h" |
| 10 #include "ui/events/event_utils.h" | 10 #include "ui/events/event_utils.h" |
| 11 #include "ui/events/keycodes/dom3/dom_code.h" | 11 #include "ui/events/keycodes/dom3/dom_code.h" |
| 12 #include "ui/events/keycodes/dom3/dom_key.h" | 12 #include "ui/events/keycodes/dom3/dom_key.h" |
| 13 #include "ui/events/keycodes/dom4/keycode_converter.h" | 13 #include "ui/events/keycodes/dom4/keycode_converter.h" |
| 14 | 14 |
| 15 #if defined(USE_X11) | 15 #if defined(USE_X11) |
| 16 #include <X11/keysym.h> | 16 #include <X11/keysym.h> |
| 17 #include <X11/Xlib.h> | 17 #include <X11/Xlib.h> |
| 18 #include "ui/events/test/events_test_utils_x11.h" | 18 #include "ui/events/test/events_test_utils_x11.h" |
| 19 #include "ui/gfx/x/x11_types.h" | 19 #include "ui/gfx/x/x11_types.h" |
| 20 #endif | 20 #endif |
| 21 | 21 |
| 22 namespace content { | 22 namespace content { |
| 23 | 23 |
| 24 // Checks that MakeWebKeyboardEvent makes a DOM3 spec compliant key event. | 24 // Checks that MakeWebKeyboardEvent makes a DOM3 spec compliant key event. |
| 25 // crbug.com/127142 | 25 // crbug.com/127142 |
| 26 TEST(WebInputEventAuraTest, TestMakeWebKeyboardEvent) { | 26 TEST(WebInputEventAuraTest, TestMakeWebKeyboardEvent) { |
| 27 { | |
| 28 // Press Ctrl. | |
| 29 ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, | |
| 30 ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN); | |
| 31 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | |
| 32 // However, modifier bit for Control in |webkit_event| should be set. | |
| 33 EXPECT_EQ(blink::WebInputEvent::ControlKey | blink::WebInputEvent::IsLeft, | |
| 34 webkit_event.modifiers); | |
| 35 } | |
| 36 { | |
| 37 // Release Ctrl. | |
| 38 ui::KeyEvent event(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, | |
| 39 ui::DomCode::CONTROL_LEFT, ui::EF_NONE); | |
| 40 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | |
| 41 // However, modifier bit for Control in |webkit_event| shouldn't be set. | |
| 42 EXPECT_EQ(blink::WebInputEvent::IsLeft, webkit_event.modifiers); | |
| 43 } | |
| 44 #if defined(USE_X11) | 27 #if defined(USE_X11) |
| 45 const int kLocationModifiers = | |
| 46 blink::WebInputEvent::IsLeft | blink::WebInputEvent::IsRight; | |
| 47 ui::ScopedXI2Event xev; | 28 ui::ScopedXI2Event xev; |
| 48 { | 29 { |
| 49 // Press Ctrl. | 30 // Press Ctrl. |
| 50 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 31 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
| 51 ui::KeyEvent event(xev); | 32 ui::KeyEvent event(xev); |
| 52 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | 33 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); |
| 53 // However, modifier bit for Control in |webkit_event| should be set. | 34 // However, modifier bit for Control in |webkit_event| should be set. |
| 54 EXPECT_EQ(blink::WebInputEvent::ControlKey, | 35 EXPECT_EQ(webkit_event.modifiers, blink::WebInputEvent::ControlKey); |
| 55 webkit_event.modifiers & ~kLocationModifiers); | |
| 56 } | 36 } |
| 57 { | 37 { |
| 58 // Release Ctrl. | 38 // Release Ctrl. |
| 59 xev.InitKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, ControlMask); | 39 xev.InitKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, ControlMask); |
| 60 ui::KeyEvent event(xev); | 40 ui::KeyEvent event(xev); |
| 61 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | 41 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); |
| 62 // However, modifier bit for Control in |webkit_event| shouldn't be set. | 42 // However, modifier bit for Control in |webkit_event| shouldn't be set. |
| 63 EXPECT_EQ(0, webkit_event.modifiers & ~kLocationModifiers); | 43 EXPECT_EQ(webkit_event.modifiers, 0); |
| 64 } | 44 } |
| 65 #endif | 45 #endif |
| 66 } | 46 } |
| 67 | 47 |
| 68 // Checks that MakeWebKeyboardEvent returns a correct windowsKeyCode. | 48 // Checks that MakeWebKeyboardEvent returns a correct windowsKeyCode. |
| 69 #if defined(OS_CHROMEOS) || defined(THREAD_SANITIZER) | 49 #if defined(OS_CHROMEOS) || defined(THREAD_SANITIZER) |
| 70 // Fails on Chrome OS and under ThreadSanitizer on Linux, see | 50 // Fails on Chrome OS and under ThreadSanitizer on Linux, see |
| 71 // https://crbug.com/449103. | 51 // https://crbug.com/449103. |
| 72 #define MAYBE_TestMakeWebKeyboardEventWindowsKeyCode \ | 52 #define MAYBE_TestMakeWebKeyboardEventWindowsKeyCode \ |
| 73 DISABLED_TestMakeWebKeyboardEventWindowsKeyCode | 53 DISABLED_TestMakeWebKeyboardEventWindowsKeyCode |
| 74 #else | 54 #else |
| 75 #define MAYBE_TestMakeWebKeyboardEventWindowsKeyCode \ | 55 #define MAYBE_TestMakeWebKeyboardEventWindowsKeyCode \ |
| 76 TestMakeWebKeyboardEventWindowsKeyCode | 56 TestMakeWebKeyboardEventWindowsKeyCode |
| 77 #endif | 57 #endif |
| 78 TEST(WebInputEventAuraTest, MAYBE_TestMakeWebKeyboardEventWindowsKeyCode) { | 58 TEST(WebInputEventAuraTest, MAYBE_TestMakeWebKeyboardEventWindowsKeyCode) { |
| 79 #if defined(USE_X11) | 59 #if defined(USE_X11) |
| 80 ui::ScopedXI2Event xev; | 60 ui::ScopedXI2Event xev; |
| 81 { | 61 { |
| 82 // Press left Ctrl. | 62 // Press left Ctrl. |
| 83 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 63 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
| 84 XEvent* xevent = xev; | 64 XEvent* xevent = xev; |
| 85 xevent->xkey.keycode = | 65 xevent->xkey.keycode = ui::KeycodeConverter::DomCodeToNativeKeycode( |
| 86 ui::KeycodeConverter::DomCodeToNativeKeycode(ui::DomCode::CONTROL_LEFT); | 66 ui::DomCode::CONTROL_LEFT); |
| 87 ui::KeyEvent event(xev); | 67 ui::KeyEvent event(xev); |
| 88 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | 68 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); |
| 89 // ui::VKEY_LCONTROL, instead of ui::VKEY_CONTROL, should be filled. | 69 // ui::VKEY_LCONTROL, instead of ui::VKEY_CONTROL, should be filled. |
| 90 EXPECT_EQ(ui::VKEY_LCONTROL, webkit_event.windowsKeyCode); | 70 EXPECT_EQ(ui::VKEY_LCONTROL, webkit_event.windowsKeyCode); |
| 91 } | 71 } |
| 92 { | 72 { |
| 93 // Press right Ctrl. | 73 // Press right Ctrl. |
| 94 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 74 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
| 95 XEvent* xevent = xev; | 75 XEvent* xevent = xev; |
| 96 xevent->xkey.keycode = ui::KeycodeConverter::DomCodeToNativeKeycode( | 76 xevent->xkey.keycode = ui::KeycodeConverter::DomCodeToNativeKeycode( |
| (...skipping 22 matching lines...) Expand all Loading... |
| 119 // Press right Ctrl. | 99 // Press right Ctrl. |
| 120 ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, | 100 ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, |
| 121 ui::DomCode::CONTROL_RIGHT, ui::EF_CONTROL_DOWN, | 101 ui::DomCode::CONTROL_RIGHT, ui::EF_CONTROL_DOWN, |
| 122 ui::DomKey::CONTROL, 0, ui::EventTimeForNow()); | 102 ui::DomKey::CONTROL, 0, ui::EventTimeForNow()); |
| 123 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | 103 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); |
| 124 // ui::VKEY_RCONTROL, instead of ui::VKEY_CONTROL, should be filled. | 104 // ui::VKEY_RCONTROL, instead of ui::VKEY_CONTROL, should be filled. |
| 125 EXPECT_EQ(ui::VKEY_RCONTROL, webkit_event.windowsKeyCode); | 105 EXPECT_EQ(ui::VKEY_RCONTROL, webkit_event.windowsKeyCode); |
| 126 } | 106 } |
| 127 } | 107 } |
| 128 | 108 |
| 129 // Checks that MakeWebKeyboardEvent fills a correct keypad modifier. | 109 // Checks that MakeWebKeyboardEvent fills a correct keypard modifier. |
| 130 TEST(WebInputEventAuraTest, TestMakeWebKeyboardEventKeyPadKeyCode) { | 110 TEST(WebInputEventAuraTest, TestMakeWebKeyboardEventKeyPadKeyCode) { |
| 131 #if defined(USE_X11) | 111 #if defined(USE_X11) |
| 132 #define XK(x) XK_##x | |
| 133 #else | |
| 134 #define XK(x) 0 | |
| 135 #endif | |
| 136 struct TestCase { | 112 struct TestCase { |
| 137 ui::DomCode dom_code; // The physical key (location). | |
| 138 ui::KeyboardCode ui_keycode; // The virtual key code. | 113 ui::KeyboardCode ui_keycode; // The virtual key code. |
| 139 uint32 x_keysym; // The X11 keysym. | 114 uint32 x_keycode; // The platform key code. |
| 140 bool expected_result; // true if the event has "isKeyPad" modifier. | 115 bool expected_result; // true if the event has "isKeyPad" modifier. |
| 141 } kTesCases[] = { | 116 } kTesCases[] = { |
| 142 {ui::DomCode::DIGIT0, ui::VKEY_0, XK(0), false}, | 117 {ui::VKEY_0, XK_0, false}, |
| 143 {ui::DomCode::DIGIT1, ui::VKEY_1, XK(1), false}, | 118 {ui::VKEY_1, XK_1, false}, |
| 144 {ui::DomCode::DIGIT2, ui::VKEY_2, XK(2), false}, | 119 {ui::VKEY_2, XK_2, false}, |
| 145 {ui::DomCode::DIGIT3, ui::VKEY_3, XK(3), false}, | 120 {ui::VKEY_3, XK_3, false}, |
| 146 {ui::DomCode::DIGIT4, ui::VKEY_4, XK(4), false}, | 121 {ui::VKEY_4, XK_4, false}, |
| 147 {ui::DomCode::DIGIT5, ui::VKEY_5, XK(5), false}, | 122 {ui::VKEY_5, XK_5, false}, |
| 148 {ui::DomCode::DIGIT6, ui::VKEY_6, XK(6), false}, | 123 {ui::VKEY_6, XK_6, false}, |
| 149 {ui::DomCode::DIGIT7, ui::VKEY_7, XK(7), false}, | 124 {ui::VKEY_7, XK_7, false}, |
| 150 {ui::DomCode::DIGIT8, ui::VKEY_8, XK(8), false}, | 125 {ui::VKEY_8, XK_8, false}, |
| 151 {ui::DomCode::DIGIT9, ui::VKEY_9, XK(9), false}, | 126 {ui::VKEY_9, XK_9, false}, |
| 152 | 127 |
| 153 {ui::DomCode::NUMPAD0, ui::VKEY_NUMPAD0, XK(KP_0), true}, | 128 {ui::VKEY_NUMPAD0, XK_KP_0, true}, |
| 154 {ui::DomCode::NUMPAD1, ui::VKEY_NUMPAD1, XK(KP_1), true}, | 129 {ui::VKEY_NUMPAD1, XK_KP_1, true}, |
| 155 {ui::DomCode::NUMPAD2, ui::VKEY_NUMPAD2, XK(KP_2), true}, | 130 {ui::VKEY_NUMPAD2, XK_KP_2, true}, |
| 156 {ui::DomCode::NUMPAD3, ui::VKEY_NUMPAD3, XK(KP_3), true}, | 131 {ui::VKEY_NUMPAD3, XK_KP_3, true}, |
| 157 {ui::DomCode::NUMPAD4, ui::VKEY_NUMPAD4, XK(KP_4), true}, | 132 {ui::VKEY_NUMPAD4, XK_KP_4, true}, |
| 158 {ui::DomCode::NUMPAD5, ui::VKEY_NUMPAD5, XK(KP_5), true}, | 133 {ui::VKEY_NUMPAD5, XK_KP_5, true}, |
| 159 {ui::DomCode::NUMPAD6, ui::VKEY_NUMPAD6, XK(KP_6), true}, | 134 {ui::VKEY_NUMPAD6, XK_KP_6, true}, |
| 160 {ui::DomCode::NUMPAD7, ui::VKEY_NUMPAD7, XK(KP_7), true}, | 135 {ui::VKEY_NUMPAD7, XK_KP_7, true}, |
| 161 {ui::DomCode::NUMPAD8, ui::VKEY_NUMPAD8, XK(KP_8), true}, | 136 {ui::VKEY_NUMPAD8, XK_KP_8, true}, |
| 162 {ui::DomCode::NUMPAD9, ui::VKEY_NUMPAD9, XK(KP_9), true}, | 137 {ui::VKEY_NUMPAD9, XK_KP_9, true}, |
| 163 | 138 |
| 164 {ui::DomCode::NUMPAD_MULTIPLY, ui::VKEY_MULTIPLY, XK(KP_Multiply), true}, | 139 {ui::VKEY_MULTIPLY, XK_KP_Multiply, true}, |
| 165 {ui::DomCode::NUMPAD_SUBTRACT, ui::VKEY_SUBTRACT, XK(KP_Subtract), true}, | 140 {ui::VKEY_SUBTRACT, XK_KP_Subtract, true}, |
| 166 {ui::DomCode::NUMPAD_ADD, ui::VKEY_ADD, XK(KP_Add), true}, | 141 {ui::VKEY_ADD, XK_KP_Add, true}, |
| 167 {ui::DomCode::NUMPAD_DIVIDE, ui::VKEY_DIVIDE, XK(KP_Divide), true}, | 142 {ui::VKEY_DIVIDE, XK_KP_Divide, true}, |
| 168 {ui::DomCode::NUMPAD_DECIMAL, ui::VKEY_DECIMAL, XK(KP_Decimal), true}, | 143 {ui::VKEY_DECIMAL, XK_KP_Decimal, true}, |
| 169 {ui::DomCode::NUMPAD_DECIMAL, ui::VKEY_DELETE, XK(KP_Delete), true}, | 144 {ui::VKEY_DELETE, XK_KP_Delete, true}, |
| 170 {ui::DomCode::NUMPAD0, ui::VKEY_INSERT, XK(KP_Insert), true}, | 145 {ui::VKEY_INSERT, XK_KP_Insert, true}, |
| 171 {ui::DomCode::NUMPAD1, ui::VKEY_END, XK(KP_End), true}, | 146 {ui::VKEY_END, XK_KP_End, true}, |
| 172 {ui::DomCode::NUMPAD2, ui::VKEY_DOWN, XK(KP_Down), true}, | 147 {ui::VKEY_DOWN, XK_KP_Down, true}, |
| 173 {ui::DomCode::NUMPAD3, ui::VKEY_NEXT, XK(KP_Page_Down), true}, | 148 {ui::VKEY_NEXT, XK_KP_Page_Down, true}, |
| 174 {ui::DomCode::NUMPAD4, ui::VKEY_LEFT, XK(KP_Left), true}, | 149 {ui::VKEY_LEFT, XK_KP_Left, true}, |
| 175 {ui::DomCode::NUMPAD5, ui::VKEY_CLEAR, XK(KP_Begin), true}, | 150 {ui::VKEY_CLEAR, XK_KP_Begin, true}, |
| 176 {ui::DomCode::NUMPAD6, ui::VKEY_RIGHT, XK(KP_Right), true}, | 151 {ui::VKEY_RIGHT, XK_KP_Right, true}, |
| 177 {ui::DomCode::NUMPAD7, ui::VKEY_HOME, XK(KP_Home), true}, | 152 {ui::VKEY_HOME, XK_KP_Home, true}, |
| 178 {ui::DomCode::NUMPAD8, ui::VKEY_UP, XK(KP_Up), true}, | 153 {ui::VKEY_UP, XK_KP_Up, true}, |
| 179 {ui::DomCode::NUMPAD9, ui::VKEY_PRIOR, XK(KP_Page_Up), true}, | 154 {ui::VKEY_PRIOR, XK_KP_Page_Up, true}, |
| 180 }; | 155 }; |
| 181 for (const auto& test_case : kTesCases) { | |
| 182 ui::KeyEvent event(ui::ET_KEY_PRESSED, test_case.ui_keycode, | |
| 183 test_case.dom_code, ui::EF_NONE); | |
| 184 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | |
| 185 EXPECT_EQ(test_case.expected_result, | |
| 186 (webkit_event.modifiers & blink::WebInputEvent::IsKeyPad) != 0) | |
| 187 << "Failed in " | |
| 188 << "{dom_code:" | |
| 189 << ui::KeycodeConverter::DomCodeToCodeString(test_case.dom_code) | |
| 190 << ", ui_keycode:" << test_case.ui_keycode | |
| 191 << "}, expect: " << test_case.expected_result; | |
| 192 } | |
| 193 #if defined(USE_X11) | |
| 194 ui::ScopedXI2Event xev; | 156 ui::ScopedXI2Event xev; |
| 195 for (size_t i = 0; i < arraysize(kTesCases); ++i) { | 157 for (size_t i = 0; i < arraysize(kTesCases); ++i) { |
| 196 const TestCase& test_case = kTesCases[i]; | 158 const TestCase& test_case = kTesCases[i]; |
| 197 | 159 |
| 198 xev.InitKeyEvent(ui::ET_KEY_PRESSED, test_case.ui_keycode, ui::EF_NONE); | 160 xev.InitKeyEvent(ui::ET_KEY_PRESSED, test_case.ui_keycode, 0); |
| 199 XEvent* xevent = xev; | 161 XEvent* xevent = xev; |
| 200 xevent->xkey.keycode = | 162 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), |
| 201 XKeysymToKeycode(gfx::GetXDisplay(), test_case.x_keysym); | 163 test_case.x_keycode); |
| 202 ui::KeyEvent event(xev); | 164 ui::KeyEvent event(xev); |
| 203 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); | 165 blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event); |
| 204 EXPECT_EQ(test_case.expected_result, | 166 EXPECT_EQ(test_case.expected_result, |
| 205 (webkit_event.modifiers & blink::WebInputEvent::IsKeyPad) != 0) | 167 (webkit_event.modifiers & blink::WebInputEvent::IsKeyPad) != 0) |
| 206 << "Failed in " << i << "th test case: " | 168 << "Failed in " << i << "th test case: " |
| 207 << "{dom_code:" | 169 << "{ui_keycode:" << test_case.ui_keycode |
| 208 << ui::KeycodeConverter::DomCodeToCodeString(test_case.dom_code) | 170 << ", x_keycode:" << test_case.x_keycode |
| 209 << ", ui_keycode:" << test_case.ui_keycode | |
| 210 << ", x_keysym:" << test_case.x_keysym | |
| 211 << "}, expect: " << test_case.expected_result; | 171 << "}, expect: " << test_case.expected_result; |
| 212 } | 172 } |
| 213 #endif | 173 #endif |
| 214 } | 174 } |
| 215 | 175 |
| 216 } // namespace content | 176 } // namespace content |
| OLD | NEW |