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);
|
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:
|
||||||
|
@ -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.
|
||||||
|
Reference in New Issue
Block a user