Merge "Support skipping a touch stream due to lack of handlers" into jb-dev

This commit is contained in:
John Reck
2012-05-24 18:11:36 -07:00
committed by Android (Google) Code Review
2 changed files with 23 additions and 5 deletions

View File

@ -669,7 +669,7 @@ public final class WebViewCore {
int x, int y); int x, int y);
private native boolean nativeMouseClick(int nativeClass); private native boolean nativeMouseClick(int nativeClass);
private native boolean nativeHandleTouchEvent(int nativeClass, int action, private native int nativeHandleTouchEvent(int nativeClass, int action,
int[] idArray, int[] xArray, int[] yArray, int count, int[] idArray, int[] xArray, int[] yArray, int count,
int actionIndex, int metaState); int actionIndex, int metaState);
@ -968,6 +968,9 @@ public final class WebViewCore {
static final int ACTION_LONGPRESS = 0x100; static final int ACTION_LONGPRESS = 0x100;
static final int ACTION_DOUBLETAP = 0x200; static final int ACTION_DOUBLETAP = 0x200;
private static final int TOUCH_FLAG_HIT_HANDLER = 0x1;
private static final int TOUCH_FLAG_PREVENT_DEFAULT = 0x2;
static class TouchEventData { static class TouchEventData {
int mAction; int mAction;
int[] mIds; // Ids of the touch points int[] mIds; // Ids of the touch points
@ -1784,7 +1787,8 @@ public final class WebViewCore {
} }
@Override @Override
public boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags) { public boolean dispatchWebKitEvent(WebViewInputDispatcher dispatcher,
MotionEvent event, int eventType, int flags) {
if (mNativeClass == 0) { if (mNativeClass == 0) {
return false; return false;
} }
@ -1811,10 +1815,16 @@ public final class WebViewCore {
xArray[i] = (int) event.getX(i); xArray[i] = (int) event.getX(i);
yArray[i] = (int) event.getY(i); yArray[i] = (int) event.getY(i);
} }
return nativeHandleTouchEvent(mNativeClass, int touchFlags = nativeHandleTouchEvent(mNativeClass,
event.getActionMasked(), event.getActionMasked(),
idArray, xArray, yArray, count, idArray, xArray, yArray, count,
event.getActionIndex(), event.getMetaState()); event.getActionIndex(), event.getMetaState());
if (touchFlags == 0
&& event.getActionMasked() != MotionEvent.ACTION_CANCEL
&& (flags & WebViewInputDispatcher.FLAG_PRIVATE) == 0) {
dispatcher.skipWebkitForRemainingTouchStream();
}
return (touchFlags & TOUCH_FLAG_PREVENT_DEFAULT) > 0;
} }
default: default:

View File

@ -686,7 +686,7 @@ final class WebViewInputDispatcher {
+ ", eventType=" + eventType + ", flags=" + flags); + ", eventType=" + eventType + ", flags=" + flags);
} }
boolean preventDefault = mWebKitCallbacks.dispatchWebKitEvent( boolean preventDefault = mWebKitCallbacks.dispatchWebKitEvent(
event, eventType, flags); this, event, eventType, flags);
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "dispatchWebKitEvent: preventDefault=" + preventDefault); Log.d(TAG, "dispatchWebKitEvent: preventDefault=" + preventDefault);
} }
@ -710,6 +710,12 @@ final class WebViewInputDispatcher {
mWebKitDispatchEventQueue.mHead = d; mWebKitDispatchEventQueue.mHead = d;
} }
// Called by WebKit when it doesn't care about the rest of the touch stream
public void skipWebkitForRemainingTouchStream() {
// Just treat this like a timeout
handleWebKitTimeout();
}
// Runs on UI thread in response to the web kit thread appearing to be unresponsive. // Runs on UI thread in response to the web kit thread appearing to be unresponsive.
private void handleWebKitTimeout() { private void handleWebKitTimeout() {
synchronized (mLock) { synchronized (mLock) {
@ -1081,12 +1087,14 @@ final class WebViewInputDispatcher {
/** /**
* Dispatches an event to web kit. * Dispatches an event to web kit.
* @param dispatcher The WebViewInputDispatcher sending the event
* @param event The event. * @param event The event.
* @param eventType The event type. * @param eventType The event type.
* @param flags The event's dispatch flags. * @param flags The event's dispatch flags.
* @return True if web kit wants to prevent default event handling. * @return True if web kit wants to prevent default event handling.
*/ */
public boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags); public boolean dispatchWebKitEvent(WebViewInputDispatcher dispatcher,
MotionEvent event, int eventType, int flags);
} }
// Runs on UI thread. // Runs on UI thread.