Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 215b72cb authored by Cary Clark's avatar Cary Clark
Browse files

route arrow keys to plugin

see companion change in external/webkit
parent ef6da8fe
Loading
Loading
Loading
Loading
+32 −11
Original line number Diff line number Diff line
@@ -458,7 +458,7 @@ public class WebView extends AbsoluteLayout
    static final int WEBCORE_INITIALIZED_MSG_ID         = 16;
    static final int UPDATE_TEXTFIELD_TEXT_MSG_ID       = 17;
    static final int DID_FIRST_LAYOUT_MSG_ID            = 18;

    static final int MOVE_OUT_OF_PLUGIN                 = 19;
    static final int UPDATE_CLIPBOARD                   = 22;
    static final int LONG_PRESS_CENTER                  = 23;
    static final int PREVENT_TOUCH_ID                   = 24;
@@ -485,7 +485,7 @@ public class WebView extends AbsoluteLayout
        "WEBCORE_INITIALIZED_MSG_ID", //     = 16;
        "UPDATE_TEXTFIELD_TEXT_MSG_ID", //   = 17;
        "DID_FIRST_LAYOUT_MSG_ID", //        = 18;
        "19",
        "MOVE_OUT_OF_PLUGIN", //             = 19;
        "20",
        "21", //                             = 21;
        "UPDATE_CLIPBOARD", //               = 22;
@@ -3165,7 +3165,7 @@ public class WebView extends AbsoluteLayout
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (DebugFlags.WEB_VIEW) {
            Log.v(LOGTAG, "keyDown at " + System.currentTimeMillis()
                    + ", " + event);
                    + ", " + event + ", unicode=" + event.getUnicodeChar());
        }

        if (mNativeClass == 0) {
@@ -3211,7 +3211,7 @@ public class WebView extends AbsoluteLayout
                && keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT) {
            // always handle the navigation keys in the UI thread
            switchOutDrawHistory();
            if (navHandledKey(keyCode, 1, false, event.getEventTime())) {
            if (navHandledKey(keyCode, 1, false, event.getEventTime(), false)) {
                playSoundEffect(keyCodeToSoundsEffect(keyCode));
                return true;
            }
@@ -3271,7 +3271,10 @@ public class WebView extends AbsoluteLayout
            }
        }

        if (nativeCursorWantsKeyEvents() && !nativeCursorMatchesFocus()) {
        if (nativeCursorIsPlugin()) {
            nativeUpdatePluginReceivesEvents();
            invalidate();
        } else if (nativeCursorWantsKeyEvents() && !nativeCursorMatchesFocus()) {
            // This message will put the node in focus, for the DOM's notion
            // of focus
            mWebViewCore.sendMessage(EventHub.CLICK);
@@ -3300,7 +3303,7 @@ public class WebView extends AbsoluteLayout
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (DebugFlags.WEB_VIEW) {
            Log.v(LOGTAG, "keyUp at " + System.currentTimeMillis()
                    + ", " + event);
                    + ", " + event + ", unicode=" + event.getUnicodeChar());
        }

        if (mNativeClass == 0) {
@@ -4198,7 +4201,7 @@ public class WebView extends AbsoluteLayout
                        + " mTrackballRemainsX=" + mTrackballRemainsX
                        + " mTrackballRemainsY=" + mTrackballRemainsY);
            }
            if (navHandledKey(selectKeyCode, count, false, time)) {
            if (navHandledKey(selectKeyCode, count, false, time, false)) {
                playSoundEffect(keyCodeToSoundsEffect(selectKeyCode));
            }
            mTrackballRemainsX = mTrackballRemainsY = 0;
@@ -4480,7 +4483,7 @@ public class WebView extends AbsoluteLayout
                        return result;
                }
                if (mNativeClass != 0 && !nativeHasCursorNode()) {
                    navHandledKey(fakeKeyDirection, 1, true, 0);
                    navHandledKey(fakeKeyDirection, 1, true, 0, true);
                }
            }
        }
@@ -4677,6 +4680,7 @@ public class WebView extends AbsoluteLayout
                        break;
                    }
                    nativeSetFollowedLink(true);
                    nativeUpdatePluginReceivesEvents();
                    WebViewCore.CursorData data = cursorData();
                    mWebViewCore.sendMessage(EventHub.SET_MOVE_MOUSE, data);
                    playSoundEffect(SoundEffectConstants.CLICK);
@@ -4830,6 +4834,11 @@ public class WebView extends AbsoluteLayout
                    }
                    setNewZoomScale(scale, false);
                    break;
                case MOVE_OUT_OF_PLUGIN:
                    if (nativePluginEatsNavKey()) {
                        navHandledKey(msg.arg1, 1, false, 0, true);
                    }
                    break;
                case UPDATE_TEXT_ENTRY_MSG_ID:
                    // this is sent after finishing resize in WebViewCore. Make
                    // sure the text edit box is still on the  screen.
@@ -5215,11 +5224,21 @@ public class WebView extends AbsoluteLayout
    }

    // return true if the key was handled
    private boolean navHandledKey(int keyCode, int count, boolean noScroll
            , long time) {
    private boolean navHandledKey(int keyCode, int count, boolean noScroll,
            long time, boolean ignorePlugin) {
        if (mNativeClass == 0) {
            return false;
        }
        if (ignorePlugin == false && nativePluginEatsNavKey()) {
            KeyEvent event = new KeyEvent(time, time, KeyEvent.ACTION_DOWN
                , keyCode, count, (mShiftIsPressed ? KeyEvent.META_SHIFT_ON : 0)
                | (false ? KeyEvent.META_ALT_ON : 0) // FIXME
                | (false ? KeyEvent.META_SYM_ON : 0) // FIXME
                , 0, 0, 0);
            mWebViewCore.sendMessage(EventHub.KEY_DOWN, event);
            mWebViewCore.sendMessage(EventHub.KEY_UP, event);
            return true;
        }
        mLastCursorTime = time;
        mLastCursorBounds = nativeGetCursorRingBounds();
        boolean keyHandled
@@ -5302,6 +5321,7 @@ public class WebView extends AbsoluteLayout
    /* package */ native boolean nativeCursorMatchesFocus();
    private native boolean  nativeCursorIntersects(Rect visibleRect);
    private native boolean  nativeCursorIsAnchor();
    private native boolean  nativeCursorIsPlugin();
    private native boolean  nativeCursorIsTextInput();
    private native Point    nativeCursorPosition();
    private native String   nativeCursorText();
@@ -5345,6 +5365,7 @@ public class WebView extends AbsoluteLayout
    private native int      nativeMoveGeneration();
    private native void     nativeMoveSelection(int x, int y,
            boolean extendSelection);
    private native boolean  nativePluginEatsNavKey();
    // Like many other of our native methods, you must make sure that
    // mNativeClass is not null before calling this method.
    private native void     nativeRecordButtons(boolean focused,
@@ -5358,5 +5379,5 @@ public class WebView extends AbsoluteLayout
    // we always want to pass in our generation number.
    private native void     nativeUpdateCachedTextfield(String updatedText,
            int generation);

    private native void     nativeUpdatePluginReceivesEvents();
}
+14 −1
Original line number Diff line number Diff line
@@ -346,7 +346,8 @@ final class WebViewCore {
    private native void nativeSplitContent();

    private native boolean nativeKey(int keyCode, int unichar,
            int repeatCount, boolean isShift, boolean isAlt, boolean isDown);
            int repeatCount, boolean isShift, boolean isAlt, boolean isSym,
            boolean isDown);

    private native void nativeClick(int framePtr, int nodePtr);

@@ -1260,7 +1261,19 @@ final class WebViewCore {
        int keyCode = evt.getKeyCode();
        if (!nativeKey(keyCode, evt.getUnicodeChar(),
                evt.getRepeatCount(), evt.isShiftPressed(), evt.isAltPressed(),
                evt.isSymPressed(),
                isDown) && keyCode != KeyEvent.KEYCODE_ENTER) {
            if (keyCode >= KeyEvent.KEYCODE_DPAD_UP
                    && keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT) {
                if (DebugFlags.WEB_VIEW_CORE) {
                    Log.v(LOGTAG, "key: arrow unused by plugin: " + keyCode);
                }
                if (mWebView != null && evt.isDown()) {
                    Message.obtain(mWebView.mPrivateHandler,
                            WebView.MOVE_OUT_OF_PLUGIN, keyCode).sendToTarget();
                }
                return;
            }
            // bubble up the event handling
            // but do not bubble up the ENTER key, which would open the search
            // bar without any text.