Merge "Support skipping a touch stream due to lack of handlers" into jb-dev
This commit is contained in:
@ -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:
|
||||
|
@ -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.
|
||||
|
Reference in New Issue
Block a user