Pass key modifier state to webcore for touch events and update DRT so it can simulate them.
Change-Id: Ic5aa8cb0376f6a3eecaa6340d57f28fa97f016bd
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user