From 73ef5d4e2bcbf28ccb84580439f2f79d5cea1ec7 Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Fri, 6 Aug 2010 11:50:49 -0400 Subject: DO NOT MERGE. CHERRY-PICKED GERRIT CHANGE 60365. Support complex characters in plugins. Complex characters like chinese are sent via the onKeyMultiple() callback. The WebView passes these characters to Webkit so that non-text inputs (e.g. plugins) can process them. Change-Id: I49575bb8a583f9f3580f5734ad87cc7c00b2bda9 http://b/2900114 --- core/java/android/webkit/WebView.java | 13 +++++++++++++ core/java/android/webkit/WebViewCore.java | 13 ++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 0deb45aff8cd..087d4c3faa0c 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -3911,6 +3911,19 @@ public class WebView extends AbsoluteLayout // affect long press with the trackball/touch. private boolean mGotCenterDown = false; + @Override + public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { + // send complex characters to webkit for use by JS and plugins + if (keyCode == KeyEvent.KEYCODE_UNKNOWN && event.getCharacters() != null) { + // pass the key to DOM + mWebViewCore.sendMessage(EventHub.KEY_DOWN, event); + mWebViewCore.sendMessage(EventHub.KEY_UP, event); + // return true as DOM handles the key + return true; + } + return false; + } + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (DebugFlags.WEB_VIEW) { diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 4118119e074e..bf4d95bbf4dc 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -1568,9 +1568,16 @@ final class WebViewCore { + evt); } int keyCode = evt.getKeyCode(); - if (!nativeKey(keyCode, evt.getUnicodeChar(), - evt.getRepeatCount(), evt.isShiftPressed(), evt.isAltPressed(), - evt.isSymPressed(), + int unicodeChar = evt.getUnicodeChar(); + + if (keyCode == KeyEvent.KEYCODE_UNKNOWN && evt.getCharacters() != null + && evt.getCharacters().length() > 0) { + // we should only receive individual complex characters + unicodeChar = evt.getCharacters().codePointAt(0); + } + + if (!nativeKey(keyCode, unicodeChar, evt.getRepeatCount(), evt.isShiftPressed(), + evt.isAltPressed(), evt.isSymPressed(), isDown) && keyCode != KeyEvent.KEYCODE_ENTER) { if (keyCode >= KeyEvent.KEYCODE_DPAD_UP && keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT) { -- cgit v1.2.3-59-g8ed1b