Commit ef120ea4 authored by dtapuska's avatar dtapuska Committed by Commit bot

Support DomCode on Android devices.

Pass the evdev scancode down from java so that it can be properly
presented to blink. The evdev code is necessary because the
android keycode already has the keyboard mapping applied. If the scancode
is 0 we fall back to mapping the DomCode based on the android keycode.

BUG=227231

Review URL: https://codereview.chromium.org/1310513010

Cr-Commit-Position: refs/heads/master@{#348721}
parent 16c4eef1
...@@ -50,6 +50,7 @@ NativeWebKeyboardEvent NativeWebKeyboardEventFromKeyEvent( ...@@ -50,6 +50,7 @@ NativeWebKeyboardEvent NativeWebKeyboardEventFromKeyEvent(
int modifiers, int modifiers,
long time_ms, long time_ms,
int key_code, int key_code,
int scan_code,
bool is_system_key, bool is_system_key,
int unicode_char) { int unicode_char) {
blink::WebInputEvent::Type type = blink::WebInputEvent::Undefined; blink::WebInputEvent::Type type = blink::WebInputEvent::Undefined;
...@@ -60,7 +61,7 @@ NativeWebKeyboardEvent NativeWebKeyboardEventFromKeyEvent( ...@@ -60,7 +61,7 @@ NativeWebKeyboardEvent NativeWebKeyboardEventFromKeyEvent(
else else
NOTREACHED() << "Invalid Android key event action: " << action; NOTREACHED() << "Invalid Android key event action: " << action;
return NativeWebKeyboardEvent(java_key_event, type, modifiers, return NativeWebKeyboardEvent(java_key_event, type, modifiers,
time_ms / 1000.0, key_code, unicode_char, is_system_key); time_ms / 1000.0, key_code, scan_code, unicode_char, is_system_key);
} }
} // anonymous namespace } // anonymous namespace
...@@ -130,7 +131,7 @@ bool ImeAdapterAndroid::SendSyntheticKeyEvent(JNIEnv*, ...@@ -130,7 +131,7 @@ bool ImeAdapterAndroid::SendSyntheticKeyEvent(JNIEnv*,
int modifiers, int modifiers,
int text) { int text) {
NativeWebKeyboardEvent event(static_cast<blink::WebInputEvent::Type>(type), NativeWebKeyboardEvent event(static_cast<blink::WebInputEvent::Type>(type),
modifiers, time_ms / 1000.0, key_code, modifiers, time_ms / 1000.0, key_code, 0,
text, false /* is_system_key */); text, false /* is_system_key */);
rwhva_->SendKeyEvent(event); rwhva_->SendKeyEvent(event);
return true; return true;
...@@ -140,10 +141,11 @@ bool ImeAdapterAndroid::SendKeyEvent(JNIEnv* env, jobject, ...@@ -140,10 +141,11 @@ bool ImeAdapterAndroid::SendKeyEvent(JNIEnv* env, jobject,
jobject original_key_event, jobject original_key_event,
int action, int modifiers, int action, int modifiers,
long time_ms, int key_code, long time_ms, int key_code,
bool is_system_key, int unicode_char) { int scan_code, bool is_system_key,
int unicode_char) {
NativeWebKeyboardEvent event = NativeWebKeyboardEventFromKeyEvent( NativeWebKeyboardEvent event = NativeWebKeyboardEventFromKeyEvent(
env, original_key_event, action, modifiers, env, original_key_event, action, modifiers,
time_ms, key_code, is_system_key, unicode_char); time_ms, key_code, scan_code, is_system_key, unicode_char);
bool key_down_text_insertion = bool key_down_text_insertion =
event.type == blink::WebInputEvent::RawKeyDown && event.text[0]; event.type == blink::WebInputEvent::RawKeyDown && event.text[0];
// If we are going to follow up with a synthetic Char event, then that's the // If we are going to follow up with a synthetic Char event, then that's the
...@@ -155,7 +157,8 @@ bool ImeAdapterAndroid::SendKeyEvent(JNIEnv* env, jobject, ...@@ -155,7 +157,8 @@ bool ImeAdapterAndroid::SendKeyEvent(JNIEnv* env, jobject,
// Send a Char event, but without an os_event since we don't want to // Send a Char event, but without an os_event since we don't want to
// roundtrip back to java such synthetic event. // roundtrip back to java such synthetic event.
NativeWebKeyboardEvent char_event(blink::WebInputEvent::Char, modifiers, NativeWebKeyboardEvent char_event(blink::WebInputEvent::Char, modifiers,
time_ms / 1000.0, key_code, unicode_char, time_ms / 1000.0, key_code, scan_code,
unicode_char,
is_system_key); is_system_key);
char_event.skip_in_browser = key_down_text_insertion; char_event.skip_in_browser = key_down_text_insertion;
rwhva_->SendKeyEvent(char_event); rwhva_->SendKeyEvent(char_event);
......
...@@ -34,7 +34,8 @@ class ImeAdapterAndroid { ...@@ -34,7 +34,8 @@ class ImeAdapterAndroid {
jobject original_key_event, jobject original_key_event,
int action, int meta_state, int action, int meta_state,
long event_time, int key_code, long event_time, int key_code,
bool is_system_key, int unicode_text); int scan_code, bool is_system_key,
int unicode_text);
// |event_type| is a value of WebInputEvent::Type. // |event_type| is a value of WebInputEvent::Type.
bool SendSyntheticKeyEvent(JNIEnv*, bool SendSyntheticKeyEvent(JNIEnv*,
jobject, jobject,
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#include "content/browser/renderer_host/input/motion_event_android.h" #include "content/browser/renderer_host/input/motion_event_android.h"
#include "content/browser/renderer_host/input/web_input_event_util.h" #include "content/browser/renderer_host/input/web_input_event_util.h"
#include "content/browser/renderer_host/input/web_input_event_util_posix.h" #include "content/browser/renderer_host/input/web_input_event_util_posix.h"
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/events/keycodes/keyboard_code_conversion_android.h" #include "ui/events/keycodes/keyboard_code_conversion_android.h"
#include "ui/events/keycodes/keyboard_codes_posix.h" #include "ui/events/keycodes/keyboard_codes_posix.h"
...@@ -25,11 +27,15 @@ WebKeyboardEvent WebKeyboardEventBuilder::Build(WebInputEvent::Type type, ...@@ -25,11 +27,15 @@ WebKeyboardEvent WebKeyboardEventBuilder::Build(WebInputEvent::Type type,
int modifiers, int modifiers,
double time_sec, double time_sec,
int keycode, int keycode,
int scancode,
int unicode_character, int unicode_character,
bool is_system_key) { bool is_system_key) {
DCHECK(WebInputEvent::isKeyboardEventType(type)); DCHECK(WebInputEvent::isKeyboardEventType(type));
WebKeyboardEvent result; WebKeyboardEvent result;
ui::DomCode dom_code = ui::DomCode::NONE;
if (scancode != 0)
dom_code = ui::KeycodeConverter::NativeKeycodeToDomCode(scancode);
result.type = type; result.type = type;
result.modifiers = modifiers; result.modifiers = modifiers;
result.timeStampSeconds = time_sec; result.timeStampSeconds = time_sec;
...@@ -38,6 +44,7 @@ WebKeyboardEvent WebKeyboardEventBuilder::Build(WebInputEvent::Type type, ...@@ -38,6 +44,7 @@ WebKeyboardEvent WebKeyboardEventBuilder::Build(WebInputEvent::Type type,
UpdateWindowsKeyCodeAndKeyIdentifier(&result, windows_key_code); UpdateWindowsKeyCodeAndKeyIdentifier(&result, windows_key_code);
result.modifiers |= GetLocationModifiersFromWindowsKeyCode(windows_key_code); result.modifiers |= GetLocationModifiersFromWindowsKeyCode(windows_key_code);
result.nativeKeyCode = keycode; result.nativeKeyCode = keycode;
result.domCode = static_cast<int>(dom_code);
result.unmodifiedText[0] = unicode_character; result.unmodifiedText[0] = unicode_character;
if (result.windowsKeyCode == ui::VKEY_RETURN) { if (result.windowsKeyCode == ui::VKEY_RETURN) {
// This is the same behavior as GTK: // This is the same behavior as GTK:
......
...@@ -40,6 +40,7 @@ class WebKeyboardEventBuilder { ...@@ -40,6 +40,7 @@ class WebKeyboardEventBuilder {
int modifiers, int modifiers,
double time_sec, double time_sec,
int keycode, int keycode,
int scancode,
int unicode_character, int unicode_character,
bool is_system_key); bool is_system_key);
}; };
......
...@@ -31,10 +31,10 @@ NativeWebKeyboardEvent::NativeWebKeyboardEvent() ...@@ -31,10 +31,10 @@ NativeWebKeyboardEvent::NativeWebKeyboardEvent()
NativeWebKeyboardEvent::NativeWebKeyboardEvent( NativeWebKeyboardEvent::NativeWebKeyboardEvent(
blink::WebInputEvent::Type type, blink::WebInputEvent::Type type,
int modifiers, double time_secs, int keycode, int unicode_character, int modifiers, double time_secs, int keycode, int scancode,
bool is_system_key) int unicode_character, bool is_system_key)
: WebKeyboardEvent(WebKeyboardEventBuilder::Build( : WebKeyboardEvent(WebKeyboardEventBuilder::Build(
type, modifiers, time_secs, keycode, unicode_character, type, modifiers, time_secs, keycode, scancode, unicode_character,
is_system_key)) { is_system_key)) {
os_event = NULL; os_event = NULL;
skip_in_browser = false; skip_in_browser = false;
...@@ -42,10 +42,10 @@ NativeWebKeyboardEvent::NativeWebKeyboardEvent( ...@@ -42,10 +42,10 @@ NativeWebKeyboardEvent::NativeWebKeyboardEvent(
NativeWebKeyboardEvent::NativeWebKeyboardEvent( NativeWebKeyboardEvent::NativeWebKeyboardEvent(
jobject android_key_event, blink::WebInputEvent::Type type, jobject android_key_event, blink::WebInputEvent::Type type,
int modifiers, double time_secs, int keycode, int unicode_character, int modifiers, double time_secs, int keycode, int scancode,
bool is_system_key) int unicode_character, bool is_system_key)
: WebKeyboardEvent(WebKeyboardEventBuilder::Build( : WebKeyboardEvent(WebKeyboardEventBuilder::Build(
type, modifiers, time_secs, keycode, unicode_character, type, modifiers, time_secs, keycode, scancode, unicode_character,
is_system_key)) { is_system_key)) {
os_event = NewGlobalRefForKeyEvent(android_key_event); os_event = NewGlobalRefForKeyEvent(android_key_event);
skip_in_browser = false; skip_in_browser = false;
......
...@@ -514,7 +514,7 @@ public class ImeAdapter { ...@@ -514,7 +514,7 @@ public class ImeAdapter {
mViewEmbedder.onImeEvent(); mViewEmbedder.onImeEvent();
return nativeSendKeyEvent(mNativeImeAdapterAndroid, event, event.getAction(), return nativeSendKeyEvent(mNativeImeAdapterAndroid, event, event.getAction(),
getModifiers(event.getMetaState()), event.getEventTime(), event.getKeyCode(), getModifiers(event.getMetaState()), event.getEventTime(), event.getKeyCode(),
/*isSystemKey=*/false, event.getUnicodeChar()); event.getScanCode(), /*isSystemKey=*/false, event.getUnicodeChar());
} }
boolean sendSyntheticKeyEvent(int eventType, long timestampMs, int keyCode, int modifiers, boolean sendSyntheticKeyEvent(int eventType, long timestampMs, int keyCode, int modifiers,
...@@ -611,8 +611,8 @@ public class ImeAdapter { ...@@ -611,8 +611,8 @@ public class ImeAdapter {
int eventType, long timestampMs, int keyCode, int modifiers, int unicodeChar); int eventType, long timestampMs, int keyCode, int modifiers, int unicodeChar);
private native boolean nativeSendKeyEvent(long nativeImeAdapterAndroid, KeyEvent event, private native boolean nativeSendKeyEvent(long nativeImeAdapterAndroid, KeyEvent event,
int action, int modifiers, long timestampMs, int keyCode, boolean isSystemKey, int action, int modifiers, long timestampMs, int keyCode, int scanCode,
int unicodeChar); boolean isSystemKey, int unicodeChar);
private static native void nativeAppendUnderlineSpan(long underlinePtr, int start, int end); private static native void nativeAppendUnderlineSpan(long underlinePtr, int start, int end);
......
...@@ -31,6 +31,7 @@ struct CONTENT_EXPORT NativeWebKeyboardEvent : ...@@ -31,6 +31,7 @@ struct CONTENT_EXPORT NativeWebKeyboardEvent :
int modifiers, int modifiers,
double time_secs, double time_secs,
int keycode, int keycode,
int scancode,
int unicode_character, int unicode_character,
bool is_system_key); bool is_system_key);
// Takes ownership of android_key_event. // Takes ownership of android_key_event.
...@@ -39,6 +40,7 @@ struct CONTENT_EXPORT NativeWebKeyboardEvent : ...@@ -39,6 +40,7 @@ struct CONTENT_EXPORT NativeWebKeyboardEvent :
int modifiers, int modifiers,
double time_secs, double time_secs,
int keycode, int keycode,
int scancode,
int unicode_character, int unicode_character,
bool is_system_key); bool is_system_key);
#else #else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment