diff options
5 files changed, 46 insertions, 9 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 5f5df56..adae0cb 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -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; diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 3a3e445..361ec56 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -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; } diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/CallbackProxy.java b/tests/DumpRenderTree/src/com/android/dumprendertree/CallbackProxy.java index 50451e7..ce1bf8d 100644 --- a/tests/DumpRenderTree/src/com/android/dumprendertree/CallbackProxy.java +++ b/tests/DumpRenderTree/src/com/android/dumprendertree/CallbackProxy.java @@ -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() { diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java index 2667520..02a7046 100644 --- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java +++ b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java @@ -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; diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/WebViewEventSender.java b/tests/DumpRenderTree/src/com/android/dumprendertree/WebViewEventSender.java index 996eaba..0c2347d 100644 --- a/tests/DumpRenderTree/src/com/android/dumprendertree/WebViewEventSender.java +++ b/tests/DumpRenderTree/src/com/android/dumprendertree/WebViewEventSender.java @@ -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; } |