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);
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 actionIndex, int metaState);
@ -968,6 +968,9 @@ public final class WebViewCore {
static final int ACTION_LONGPRESS = 0x100;
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 {
int mAction;
int[] mIds; // Ids of the touch points
@ -1784,7 +1787,8 @@ public final class WebViewCore {
}
@Override
public boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags) {
public boolean dispatchWebKitEvent(WebViewInputDispatcher dispatcher,
MotionEvent event, int eventType, int flags) {
if (mNativeClass == 0) {
return false;
}
@ -1811,10 +1815,16 @@ public final class WebViewCore {
xArray[i] = (int) event.getX(i);
yArray[i] = (int) event.getY(i);
}
return nativeHandleTouchEvent(mNativeClass,
int touchFlags = nativeHandleTouchEvent(mNativeClass,
event.getActionMasked(),
idArray, xArray, yArray, count,
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:

View File

@ -686,7 +686,7 @@ final class WebViewInputDispatcher {
+ ", eventType=" + eventType + ", flags=" + flags);
}
boolean preventDefault = mWebKitCallbacks.dispatchWebKitEvent(
event, eventType, flags);
this, event, eventType, flags);
if (DEBUG) {
Log.d(TAG, "dispatchWebKitEvent: preventDefault=" + preventDefault);
}
@ -710,6 +710,12 @@ final class WebViewInputDispatcher {
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.
private void handleWebKitTimeout() {
synchronized (mLock) {
@ -1081,12 +1087,14 @@ final class WebViewInputDispatcher {
/**
* Dispatches an event to web kit.
* @param dispatcher The WebViewInputDispatcher sending the event
* @param event The event.
* @param eventType The event type.
* @param flags The event's dispatch flags.
* @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.