diff options
Diffstat (limited to 'chromium/content/browser/renderer_host/input/web_input_event_builders_android.cc')
-rw-r--r-- | chromium/content/browser/renderer_host/input/web_input_event_builders_android.cc | 78 |
1 files changed, 62 insertions, 16 deletions
diff --git a/chromium/content/browser/renderer_host/input/web_input_event_builders_android.cc b/chromium/content/browser/renderer_host/input/web_input_event_builders_android.cc index 3fb06bb9082..c0ffc1b0683 100644 --- a/chromium/content/browser/renderer_host/input/web_input_event_builders_android.cc +++ b/chromium/content/browser/renderer_host/input/web_input_event_builders_android.cc @@ -4,8 +4,11 @@ #include "content/browser/renderer_host/input/web_input_event_builders_android.h" +#include <android/input.h> + #include "base/logging.h" #include "content/browser/renderer_host/input/web_input_event_util.h" +#include "ui/events/android/key_event_utils.h" #include "ui/events/android/motion_event_android.h" #include "ui/events/keycodes/dom/dom_code.h" #include "ui/events/keycodes/dom/keycode_converter.h" @@ -18,6 +21,7 @@ using blink::WebKeyboardEvent; using blink::WebGestureEvent; using blink::WebMouseEvent; using blink::WebMouseWheelEvent; +using blink::WebPointerProperties; using blink::WebTouchEvent; using blink::WebTouchPoint; @@ -25,7 +29,41 @@ namespace content { namespace { -ui::DomKey GetDomKeyFromEvent(int keycode, int unicode_character) { +int WebInputEventToAndroidModifier(int web_modifier) { + int android_modifier = 0; + // Currently only Shift, CapsLock are used, add other modifiers if required. + if (web_modifier & WebInputEvent::ShiftKey) + android_modifier |= AMETA_SHIFT_ON; + if (web_modifier & WebInputEvent::CapsLockOn) + android_modifier |= AMETA_CAPS_LOCK_ON; + return android_modifier; +} + +ui::DomKey GetDomKeyFromEvent( + JNIEnv* env, + const base::android::JavaRef<jobject>& android_key_event, + int keycode, + int modifiers, + int unicode_character) { + // Synthetic key event, not enough information to get DomKey. + if (android_key_event.is_null() && !unicode_character) + return ui::DomKey::UNIDENTIFIED; + + if (!unicode_character && env) { + // According to spec |kAllowedModifiers| should be Shift and AltGr, however + // Android doesn't have AltGr key and ImeAdapter::getModifiers won't pass it + // either. + // According to discussion we want to honor CapsLock and possibly NumLock as + // well. https://github.com/w3c/uievents/issues/70 + const int kAllowedModifiers = + WebInputEvent::ShiftKey | WebInputEvent::CapsLockOn; + int fallback_modifiers = + WebInputEventToAndroidModifier(modifiers & kAllowedModifiers); + + unicode_character = ui::events::android::GetKeyEventUnicodeChar( + env, android_key_event, fallback_modifiers); + } + ui::DomKey key = ui::GetDomKeyFromAndroidEvent(keycode, unicode_character); if (key != ui::DomKey::NONE) return key; @@ -34,13 +72,16 @@ ui::DomKey GetDomKeyFromEvent(int keycode, int unicode_character) { } // namespace -WebKeyboardEvent WebKeyboardEventBuilder::Build(WebInputEvent::Type type, - int modifiers, - double time_sec, - int keycode, - int scancode, - int unicode_character, - bool is_system_key) { +WebKeyboardEvent WebKeyboardEventBuilder::Build( + JNIEnv* env, + const base::android::JavaRef<jobject>& android_key_event, + WebInputEvent::Type type, + int modifiers, + double time_sec, + int keycode, + int scancode, + int unicode_character, + bool is_system_key) { DCHECK(WebInputEvent::isKeyboardEventType(type)); WebKeyboardEvent result; @@ -55,7 +96,8 @@ WebKeyboardEvent WebKeyboardEventBuilder::Build(WebInputEvent::Type type, result.modifiers |= DomCodeToWebInputEventModifiers(dom_code); result.nativeKeyCode = keycode; result.domCode = static_cast<int>(dom_code); - result.domKey = GetDomKeyFromEvent(keycode, unicode_character); + result.domKey = GetDomKeyFromEvent(env, android_key_event, keycode, modifiers, + unicode_character); result.unmodifiedText[0] = unicode_character; if (result.windowsKeyCode == ui::VKEY_RETURN) { // This is the same behavior as GTK: @@ -70,17 +112,21 @@ WebKeyboardEvent WebKeyboardEventBuilder::Build(WebInputEvent::Type type, return result; } -WebMouseEvent WebMouseEventBuilder::Build(blink::WebInputEvent::Type type, - WebMouseEvent::Button button, - double time_sec, - int window_x, - int window_y, - int modifiers, - int click_count) { +WebMouseEvent WebMouseEventBuilder::Build( + WebInputEvent::Type type, + WebMouseEvent::Button button, + double time_sec, + int window_x, + int window_y, + int modifiers, + int click_count, + WebPointerProperties::PointerType pointer_type) { + DCHECK(WebInputEvent::isMouseEventType(type)); WebMouseEvent result; result.type = type; + result.pointerType = pointer_type; result.x = window_x; result.y = window_y; result.windowX = window_x; |