15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/web_input_event_aura.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/keysym.h> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h> 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/events/test/events_test_utils_x11.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_types.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that MakeWebKeyboardEvent makes a DOM3 spec compliant key event. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crbug.com/127142 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(WebInputEventAuraTest, TestMakeWebKeyboardEvent) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ui::ScopedXI2Event xev; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Press Ctrl. 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent event(xev); 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(&event); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // However, modifier bit for Control in |webkit_event| should be set. 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(webkit_event.modifiers, blink::WebInputEvent::ControlKey); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release Ctrl. 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xev.InitKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, ControlMask); 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent event(xev); 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(&event); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // However, modifier bit for Control in |webkit_event| shouldn't be set. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(webkit_event.modifiers, 0); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that MakeWebKeyboardEvent returns a correct windowsKeyCode. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(WebInputEventAuraTest, TestMakeWebKeyboardEventWindowsKeyCode) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ui::ScopedXI2Event xev; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Press left Ctrl. 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) XEvent* xevent = xev; 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L); 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent event(xev); 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(&event); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ui::VKEY_LCONTROL, instead of ui::VKEY_CONTROL, should be filled. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::VKEY_LCONTROL, webkit_event.windowsKeyCode); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Press right Ctrl. 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) XEvent* xevent = xev; 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_R); 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent event(xev); 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(&event); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ui::VKEY_RCONTROL, instead of ui::VKEY_CONTROL, should be filled. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::VKEY_RCONTROL, webkit_event.windowsKeyCode); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yusukes): Add tests for win_aura once keyboardEvent() in 70fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch // third_party/WebKit/Source/web/win/WebInputEventFactory.cpp is modified 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to return VKEY_[LR]XXX instead of VKEY_XXX. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // https://bugs.webkit.org/show_bug.cgi?id=86694 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Checks that MakeWebKeyboardEvent fills a correct keypard modifier. 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(WebInputEventAuraTest, TestMakeWebKeyboardEventKeyPadKeyCode) { 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_X11) 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct TestCase { 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::KeyboardCode ui_keycode; // The virtual key code. 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32 x_keycode; // The platform key code. 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool expected_result; // true if the event has "isKeyPad" modifier. 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } kTesCases[] = { 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_0, XK_0, false}, 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_1, XK_1, false}, 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_2, XK_2, false}, 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_3, XK_3, false}, 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_4, XK_4, false}, 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_5, XK_5, false}, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_6, XK_6, false}, 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_7, XK_7, false}, 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_8, XK_8, false}, 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_9, XK_9, false}, 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_NUMPAD0, XK_KP_0, true}, 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_NUMPAD1, XK_KP_1, true}, 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_NUMPAD2, XK_KP_2, true}, 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_NUMPAD3, XK_KP_3, true}, 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_NUMPAD4, XK_KP_4, true}, 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_NUMPAD5, XK_KP_5, true}, 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_NUMPAD6, XK_KP_6, true}, 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_NUMPAD7, XK_KP_7, true}, 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_NUMPAD8, XK_KP_8, true}, 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_NUMPAD9, XK_KP_9, true}, 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_MULTIPLY, XK_KP_Multiply, true}, 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_SUBTRACT, XK_KP_Subtract, true}, 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_ADD, XK_KP_Add, true}, 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_DIVIDE, XK_KP_Divide, true}, 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_DECIMAL, XK_KP_Decimal, true}, 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_DELETE, XK_KP_Delete, true}, 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_INSERT, XK_KP_Insert, true}, 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_END, XK_KP_End, true}, 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_DOWN, XK_KP_Down, true}, 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_NEXT, XK_KP_Page_Down, true}, 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_LEFT, XK_KP_Left, true}, 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_CLEAR, XK_KP_Begin, true}, 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_RIGHT, XK_KP_Right, true}, 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_HOME, XK_KP_Home, true}, 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_UP, XK_KP_Up, true}, 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {ui::VKEY_PRIOR, XK_KP_Page_Up, true}, 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ScopedXI2Event xev; 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < arraysize(kTesCases); ++i) { 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TestCase& test_case = kTesCases[i]; 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xev.InitKeyEvent(ui::ET_KEY_PRESSED, test_case.ui_keycode, 0); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XEvent* xevent = xev; 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_case.x_keycode); 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::KeyEvent event(xev); 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(&event); 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(test_case.expected_result, 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (webkit_event.modifiers & blink::WebInputEvent::IsKeyPad) != 0) 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << "Failed in " << i << "th test case: " 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << "{ui_keycode:" << test_case.ui_keycode 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << ", x_keycode:" << test_case.x_keycode 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << "}, expect: " << test_case.expected_result; 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 144