Index: content/browser/renderer_host/web_input_event_aurax11.cc |
diff --git a/content/browser/renderer_host/web_input_event_aurax11.cc b/content/browser/renderer_host/web_input_event_aurax11.cc |
index 2c9df58eb2bf9aab1fbd1f94aa7d71d23fa89e10..766b1b3b5cdfbc737e42124d4033c243edd4cfc1 100644 |
--- a/content/browser/renderer_host/web_input_event_aurax11.cc |
+++ b/content/browser/renderer_host/web_input_event_aurax11.cc |
@@ -57,6 +57,32 @@ namespace { |
// This matches Firefox behavior. |
const int kPixelsPerTick = 53; |
+// Normalizes event.flags() to make it Windows/Mac compatible. Since the way |
+// of setting modifier mask on X is very different than Windows/Mac as shown |
+// in http://crbug.com/127142#c8, the normalization is necessary. |
+int NormalizeEventFlags(const aura::KeyEvent& event) { |
+ int mask = 0; |
+ switch (event.key_code()) { |
+ case ui::VKEY_CONTROL: |
+ mask = ui::EF_CONTROL_DOWN; |
+ break; |
+ case ui::VKEY_SHIFT: |
+ mask = ui::EF_SHIFT_DOWN; |
+ break; |
+ case ui::VKEY_MENU: |
+ mask = ui::EF_ALT_DOWN; |
+ break; |
+ case ui::VKEY_CAPITAL: |
+ mask = ui::EF_CAPS_LOCK_DOWN; |
+ break; |
+ default: |
+ return event.flags(); |
+ } |
+ if (event.type() == ui::ET_KEY_PRESSED) |
+ return event.flags() | mask; |
+ return event.flags() & ~mask; |
+} |
+ |
int EventFlagsToWebEventModifiers(int flags) { |
int modifiers = 0; |
if (flags & ui::EF_SHIFT_DOWN) |
@@ -77,28 +103,6 @@ int EventFlagsToWebEventModifiers(int flags) { |
return modifiers; |
} |
-int XStateToWebEventModifiers(unsigned int state) { |
- int modifiers = 0; |
- if (state & ShiftMask) |
- modifiers |= WebKit::WebInputEvent::ShiftKey; |
- if (state & ControlMask) |
- modifiers |= WebKit::WebInputEvent::ControlKey; |
- if (state & Mod1Mask) |
- modifiers |= WebKit::WebInputEvent::AltKey; |
- // TODO(beng): MetaKey/META_MASK |
- if (state & Button1Mask) |
- modifiers |= WebKit::WebInputEvent::LeftButtonDown; |
- if (state & Button2Mask) |
- modifiers |= WebKit::WebInputEvent::MiddleButtonDown; |
- if (state & Button3Mask) |
- modifiers |= WebKit::WebInputEvent::RightButtonDown; |
- if (state & LockMask) |
- modifiers |= WebKit::WebInputEvent::CapsLockOn; |
- if (state & Mod2Mask) |
- modifiers |= WebKit::WebInputEvent::NumLockOn; |
- return modifiers; |
-} |
- |
int XKeyEventToWindowsKeyCode(XKeyEvent* event) { |
return ui::KeyboardCodeFromXKeyEvent((XEvent*)event); |
} |
@@ -283,7 +287,8 @@ WebKit::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent( |
XKeyEvent* native_key_event = &native_event->xkey; |
webkit_event.timeStampSeconds = event->time_stamp().InSecondsF(); |
- webkit_event.modifiers = XStateToWebEventModifiers(native_key_event->state); |
+ webkit_event.modifiers = |
+ EventFlagsToWebEventModifiers(NormalizeEventFlags(*event)); |
switch (native_event->type) { |
case KeyPress: |