diff options
4 files changed, 76 insertions, 1 deletions
diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc index 409fde5..3c40f73 100644 --- a/ash/accelerators/accelerator_table.cc +++ b/ash/accelerators/accelerator_table.cc @@ -10,8 +10,16 @@ namespace ash { const AcceleratorData kAcceleratorData[] = { + // We have to define 3 entries for Shift+Alt. VKEY_[LR]MENU might be sent to + // the accelerator controller when RenderWidgetHostViewAura is focused, and + // VKEY_MENU might be when it's not (e.g. when NativeWidgetAura is focused). + { false, ui::VKEY_LMENU, ui::EF_SHIFT_DOWN, NEXT_IME }, { false, ui::VKEY_MENU, ui::EF_SHIFT_DOWN, NEXT_IME }, + { false, ui::VKEY_RMENU, ui::EF_SHIFT_DOWN, NEXT_IME }, + // The same is true for Alt+Shift. + { false, ui::VKEY_LSHIFT, ui::EF_ALT_DOWN, NEXT_IME }, { false, ui::VKEY_SHIFT, ui::EF_ALT_DOWN, NEXT_IME }, + { false, ui::VKEY_RSHIFT, ui::EF_ALT_DOWN, NEXT_IME }, #if defined(OS_CHROMEOS) // When X11 is in use, a modifier-only accelerator like Shift+Alt could be // sent to the accelerator controller in unnormalized form (e.g. when diff --git a/chrome/browser/ui/views/accelerator_table.cc b/chrome/browser/ui/views/accelerator_table.cc index c7c2421..b474f83 100644 --- a/chrome/browser/ui/views/accelerator_table.cc +++ b/chrome/browser/ui/views/accelerator_table.cc @@ -121,7 +121,9 @@ const AcceleratorMapping kAcceleratorMap[] = { { ui::VKEY_F3, ui::EF_NONE, IDC_FIND_NEXT }, { ui::VKEY_F3, ui::EF_SHIFT_DOWN, IDC_FIND_PREVIOUS }, { ui::VKEY_F10, ui::EF_NONE, IDC_FOCUS_MENU_BAR }, + { ui::VKEY_LMENU, ui::EF_NONE, IDC_FOCUS_MENU_BAR }, { ui::VKEY_MENU, ui::EF_NONE, IDC_FOCUS_MENU_BAR }, + { ui::VKEY_RMENU, ui::EF_NONE, IDC_FOCUS_MENU_BAR }, { ui::VKEY_F6, ui::EF_NONE, IDC_FOCUS_NEXT_PANE }, { ui::VKEY_F6, ui::EF_SHIFT_DOWN, IDC_FOCUS_PREVIOUS_PANE }, // On Windows, all VKEY_BROWSER_* keys except VKEY_BROWSER_SEARCH are handled diff --git a/content/browser/renderer_host/web_input_event_aura_unittest.cc b/content/browser/renderer_host/web_input_event_aura_unittest.cc index 19c7700..bed4577 100644 --- a/content/browser/renderer_host/web_input_event_aura_unittest.cc +++ b/content/browser/renderer_host/web_input_event_aura_unittest.cc @@ -9,6 +9,7 @@ #include "ui/aura/event.h" #if defined(USE_X11) +#include <X11/keysym.h> #include <X11/Xlib.h> #include "ui/base/x/x11_util.h" #endif @@ -45,4 +46,40 @@ TEST(WebInputEventAuraTest, TestMakeWebKeyboardEvent) { #endif } +// Checks that MakeWebKeyboardEvent returns a correct windowsKeyCode. +TEST(WebInputEventAuraTest, TestMakeWebKeyboardEventWindowsKeyCode) { +#if defined(USE_X11) + XEvent xev; + { + // Press left Ctrl. + ui::InitXKeyEventForTesting(ui::ET_KEY_PRESSED, + ui::VKEY_CONTROL, + 0, // X does not set ControlMask for KeyPress. + &xev); + xev.xkey.keycode = XKeysymToKeycode(ui::GetXDisplay(), XK_Control_L); + aura::KeyEvent event(&xev, false /* is_char */); + WebKit::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(&event); + // ui::VKEY_LCONTROL, instead of ui::VKEY_CONTROL, should be filled. + EXPECT_EQ(ui::VKEY_LCONTROL, webkit_event.windowsKeyCode); + } + { + // Press right Ctrl. + ui::InitXKeyEventForTesting(ui::ET_KEY_PRESSED, + ui::VKEY_CONTROL, + 0, // X does not set ControlMask for KeyPress. + &xev); + xev.xkey.keycode = XKeysymToKeycode(ui::GetXDisplay(), XK_Control_R); + aura::KeyEvent event(&xev, false /* is_char */); + WebKit::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(&event); + // ui::VKEY_RCONTROL, instead of ui::VKEY_CONTROL, should be filled. + EXPECT_EQ(ui::VKEY_RCONTROL, webkit_event.windowsKeyCode); + } +#elif defined(OS_WIN) + // TODO(yusukes): Add tests for win_aura once keyboardEvent() in + // WebKit/Source/WebKit/chromium/src/win/WebInputEventFactory.cpp is modified + // to return VKEY_[LR]XXX instead of VKEY_XXX. + // https://bugs.webkit.org/show_bug.cgi?id=86694 +#endif +} + } // namespace content diff --git a/content/browser/renderer_host/web_input_event_aurax11.cc b/content/browser/renderer_host/web_input_event_aurax11.cc index 766b1b3..9eab75a 100644 --- a/content/browser/renderer_host/web_input_event_aurax11.cc +++ b/content/browser/renderer_host/web_input_event_aurax11.cc @@ -38,7 +38,9 @@ #include "content/browser/renderer_host/web_input_event_aura.h" #include <cstdlib> +#include <X11/keysym.h> #include <X11/Xlib.h> +#include <X11/Xutil.h> #include "base/event_types.h" #include "base/logging.h" @@ -104,7 +106,33 @@ int EventFlagsToWebEventModifiers(int flags) { } int XKeyEventToWindowsKeyCode(XKeyEvent* event) { - return ui::KeyboardCodeFromXKeyEvent((XEvent*)event); + int windows_key_code = + ui::KeyboardCodeFromXKeyEvent(reinterpret_cast<XEvent*>(event)); + if (windows_key_code == ui::VKEY_SHIFT || + windows_key_code == ui::VKEY_CONTROL || + windows_key_code == ui::VKEY_MENU) { + // To support DOM3 'location' attribute, we need to lookup an X KeySym and + // set ui::VKEY_[LR]XXX instead of ui::VKEY_XXX. + KeySym keysym = XK_VoidSymbol; + XLookupString(event, NULL, 0, &keysym, NULL); + switch (keysym) { + case XK_Shift_L: + return ui::VKEY_LSHIFT; + case XK_Shift_R: + return ui::VKEY_RSHIFT; + case XK_Control_L: + return ui::VKEY_LCONTROL; + case XK_Control_R: + return ui::VKEY_RCONTROL; + case XK_Meta_L: + case XK_Alt_L: + return ui::VKEY_LMENU; + case XK_Meta_R: + case XK_Alt_R: + return ui::VKEY_RMENU; + } + } + return windows_key_code; } // From |