summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ash/accelerators/accelerator_table.cc8
-rw-r--r--chrome/browser/ui/views/accelerator_table.cc2
-rw-r--r--content/browser/renderer_host/web_input_event_aura_unittest.cc37
-rw-r--r--content/browser/renderer_host/web_input_event_aurax11.cc30
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