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

Commit 8a032a3b authored by Ben Murdoch's avatar Ben Murdoch
Browse files

Pass key modifier state to webcore for touch events and update DRT so it can simulate them.

Change-Id: Ic5aa8cb0376f6a3eecaa6340d57f28fa97f016bd
parent c0784c74
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -4436,6 +4436,7 @@ public class WebView extends AbsoluteLayout
            ted.mX = viewToContentX((int) x + mScrollX);
            ted.mY = viewToContentY((int) y + mScrollY);
            ted.mEventTime = eventTime;
            ted.mMetaState = ev.getMetaState();
            mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
            mLastSentTouchTime = eventTime;
        }
@@ -4699,6 +4700,7 @@ public class WebView extends AbsoluteLayout
                            ted.mX = viewToContentX((int) x + mScrollX);
                            ted.mY = viewToContentY((int) y + mScrollY);
                            ted.mEventTime = eventTime;
                            ted.mMetaState = ev.getMetaState();
                            mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
                        } else if (mFullScreenHolder == null) {
                            doDoubleTap();
@@ -5735,6 +5737,11 @@ public class WebView extends AbsoluteLayout
                        ted.mX = viewToContentX((int) mLastTouchX + mScrollX);
                        ted.mY = viewToContentY((int) mLastTouchY + mScrollY);
                        ted.mEventTime = SystemClock.uptimeMillis();
                        // metaState for long press is tricky. Should it be the state
                        // when the press started or when the press was released? Or
                        // some intermediary key state? For simplicity for now, we
                        // don't set it.
                        ted.mMetaState = 0;
                        mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
                    } else if (mPreventDrag == PREVENT_DRAG_NO) {
                        mTouchMode = TOUCH_DONE_MODE;
+3 −2
Original line number Diff line number Diff line
@@ -515,7 +515,7 @@ final class WebViewCore {
    private native void nativeTouchUp(int touchGeneration,
            int framePtr, int nodePtr, int x, int y);

    private native int nativeHandleTouchEvent(int action, int x, int y, long time);
    private native int nativeHandleTouchEvent(int action, int x, int y, long time, int metaState);

    private native void nativeUpdateFrameCache();

@@ -735,6 +735,7 @@ final class WebViewCore {
        int mX;
        int mY;
        long mEventTime;
        int mMetaState;
    }

    static class GeolocationPermissionsData {
@@ -1198,7 +1199,7 @@ final class WebViewCore {
                                    mWebView.mPrivateHandler,
                                    WebView.PREVENT_TOUCH_ID, ted.mAction,
                                    nativeHandleTouchEvent(ted.mAction, ted.mX,
                                    ted.mY, ted.mEventTime)).sendToTarget();
                                    ted.mY, ted.mEventTime, ted.mMetaState)).sendToTarget();
                            break;
                        }

+12 −1
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ public class CallbackProxy extends Handler implements EventSender, LayoutTestCon
    private static final int EVENT_RELEASE_TOUCH_POINT = 16;
    private static final int EVENT_CLEAR_TOUCH_POINTS = 17;
    private static final int EVENT_CANCEL_TOUCH_POINT = 18;
    private static final int EVENT_SET_TOUCH_MODIFIER = 19;
    
    private static final int LAYOUT_CLEAR_LIST = 20;
    private static final int LAYOUT_DISPLAY = 21;
@@ -145,6 +146,13 @@ public class CallbackProxy extends Handler implements EventSender, LayoutTestCon
            mEventSender.updateTouchPoint(id, x, y);
            break;

        case EVENT_SET_TOUCH_MODIFIER:
            Bundle modifierArgs = (Bundle) msg.obj;
            String modifier = modifierArgs.getString("modifier");
            boolean enabled = modifierArgs.getBoolean("enabled");
            mEventSender.setTouchModifier(modifier, enabled);
            break;

        case EVENT_RELEASE_TOUCH_POINT:
            mEventSender.releaseTouchPoint(msg.arg1);
            break;
@@ -320,7 +328,10 @@ public class CallbackProxy extends Handler implements EventSender, LayoutTestCon
    }

    public void setTouchModifier(String modifier, boolean enabled) {
        // TODO(benm): Android doesn't support key modifiers on touch events yet.
        Bundle map = new Bundle();
        map.putString("modifier", modifier);
        map.putBoolean("enabled", enabled);
        obtainMessage(EVENT_SET_TOUCH_MODIFIER, map).sendToTarget();
    }

    public void touchMove() {
+1 −0
Original line number Diff line number Diff line
@@ -716,6 +716,7 @@ public class TestShellActivity extends Activity implements LayoutTestController
        mCanOpenWindows = false;
        mEventSender.resetMouse();
        mEventSender.clearTouchPoints();
        mEventSender.clearTouchMetaState();
        mPageFinished = false;
        mOneHundredPercentComplete = false;
        mDumpWebKitData = false;
+23 −6
Original line number Diff line number Diff line
@@ -207,7 +207,7 @@ public class WebViewEventSender implements EventSender {

        tp.setDownTime(SystemClock.uptimeMillis());
        MotionEvent event = MotionEvent.obtain(tp.downTime(), tp.downTime(),
                MotionEvent.ACTION_DOWN, tp.getX(), tp.getY(), 0);
                MotionEvent.ACTION_DOWN, tp.getX(), tp.getY(), mTouchMetaState);
        mWebView.onTouchEvent(event);
    }

@@ -223,7 +223,7 @@ public class WebViewEventSender implements EventSender {
        }

        MotionEvent event = MotionEvent.obtain(tp.downTime(), SystemClock.uptimeMillis(),
                MotionEvent.ACTION_MOVE, tp.getX(), tp.getY(), 0);
                MotionEvent.ACTION_MOVE, tp.getX(), tp.getY(), mTouchMetaState);
        mWebView.onTouchEvent(event);

        tp.setMoved(false);
@@ -237,7 +237,7 @@ public class WebViewEventSender implements EventSender {
        }

        MotionEvent event = MotionEvent.obtain(tp.downTime(), SystemClock.uptimeMillis(),
                MotionEvent.ACTION_UP, tp.getX(), tp.getY(), 0);
                MotionEvent.ACTION_UP, tp.getX(), tp.getY(), mTouchMetaState);
        mWebView.onTouchEvent(event);

        if (tp.isReleased()) {
@@ -253,7 +253,7 @@ public class WebViewEventSender implements EventSender {

        if (tp.cancelled()) {
            MotionEvent event = MotionEvent.obtain(tp.downTime(), SystemClock.uptimeMillis(),
                    MotionEvent.ACTION_CANCEL, tp.getX(), tp.getY(), 0);
                    MotionEvent.ACTION_CANCEL, tp.getX(), tp.getY(), mTouchMetaState);
            mWebView.onTouchEvent(event);
        }
    }
@@ -285,8 +285,20 @@ public class WebViewEventSender implements EventSender {
    }

    public void setTouchModifier(String modifier, boolean enabled) {
        // TODO(benm): This needs implementing when Android supports sending key modifiers
        // in touch events.
        int mask = 0;
        if ("alt".equals(modifier.toLowerCase())) {
            mask = KeyEvent.META_ALT_ON;
        } else if ("shift".equals(modifier.toLowerCase())) {
            mask = KeyEvent.META_SHIFT_ON;
        } else if ("ctrl".equals(modifier.toLowerCase())) {
            mask = KeyEvent.META_SYM_ON;
        }

        if (enabled) {
            mTouchMetaState |= mask;
        } else {
            mTouchMetaState &= ~mask;
        }
    }

    public void releaseTouchPoint(int id) {
@@ -302,6 +314,10 @@ public class WebViewEventSender implements EventSender {
        mTouchPoints.clear();
    }

    public void clearTouchMetaState() {
        mTouchMetaState = 0;
    }

    private int contentsToWindowX(int x) {
        return (int) (x * mWebView.getScale()) - mWebView.getScrollX();
    }
@@ -352,4 +368,5 @@ public class WebViewEventSender implements EventSender {
    };

    private Vector<TouchPoint> mTouchPoints;
    private int mTouchMetaState;
}