diff options
| author | 2012-05-24 15:30:40 -0700 | |
|---|---|---|
| committer | 2012-05-24 15:31:13 -0700 | |
| commit | c1e80a360a43ea52092dda79138c9d55a5588fc0 (patch) | |
| tree | 48ace569eef6549202e49d82fff71cc9256ca9ce | |
| parent | 7018a90c323a7f0deb37939d5505ff112ac637f5 (diff) | |
Support skipping a touch stream due to lack of handlers
Bug: 6317798
Change-Id: Ia1652e9030e877e270326e9e8a8b040810b89f09
| -rw-r--r-- | core/java/android/webkit/WebViewCore.java | 16 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewInputDispatcher.java | 12 |
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. |