summaryrefslogtreecommitdiff
path: root/chromium/content/browser/renderer_host/input/web_input_event_builders_android.cc
diff options
context:
space:
mode:
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.cc78
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;