summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author John Reck <jreck@google.com> 2012-05-24 15:30:40 -0700
committer John Reck <jreck@google.com> 2012-05-24 15:31:13 -0700
commitc1e80a360a43ea52092dda79138c9d55a5588fc0 (patch)
tree48ace569eef6549202e49d82fff71cc9256ca9ce
parent7018a90c323a7f0deb37939d5505ff112ac637f5 (diff)
Support skipping a touch stream due to lack of handlers
Bug: 6317798 Change-Id: Ia1652e9030e877e270326e9e8a8b040810b89f09
-rw-r--r--core/java/android/webkit/WebViewCore.java16
-rw-r--r--core/java/android/webkit/WebViewInputDispatcher.java12
2 files changed, 23 insertions, 5 deletions
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index af7914e3f29a..1fb96c24c22d 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -660,7 +660,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);
@@ -959,6 +959,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
@@ -1775,7 +1778,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;
}
@@ -1802,10 +1806,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:
diff --git a/core/java/android/webkit/WebViewInputDispatcher.java b/core/java/android/webkit/WebViewInputDispatcher.java
index feff16ec0443..d8065e951681 100644
--- a/core/java/android/webkit/WebViewInputDispatcher.java
+++ b/core/java/android/webkit/WebViewInputDispatcher.java
@@ -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.