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