Skip to content

Commit f738810

Browse files
jreckAndroid (Google) Code Review
authored andcommitted
Merge "Support skipping a touch stream due to lack of handlers" into jb-dev
2 parents 73bde11 + c1e80a3 commit f738810

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

core/java/android/webkit/WebViewCore.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,7 @@ private native String nativeRetrieveImageSource(int nativeClass,
669669
int x, int y);
670670
private native boolean nativeMouseClick(int nativeClass);
671671

672-
private native boolean nativeHandleTouchEvent(int nativeClass, int action,
672+
private native int nativeHandleTouchEvent(int nativeClass, int action,
673673
int[] idArray, int[] xArray, int[] yArray, int count,
674674
int actionIndex, int metaState);
675675

@@ -968,6 +968,9 @@ static class TextFieldInitData {
968968
static final int ACTION_LONGPRESS = 0x100;
969969
static final int ACTION_DOUBLETAP = 0x200;
970970

971+
private static final int TOUCH_FLAG_HIT_HANDLER = 0x1;
972+
private static final int TOUCH_FLAG_PREVENT_DEFAULT = 0x2;
973+
971974
static class TouchEventData {
972975
int mAction;
973976
int[] mIds; // Ids of the touch points
@@ -1784,7 +1787,8 @@ public Looper getWebKitLooper() {
17841787
}
17851788

17861789
@Override
1787-
public boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags) {
1790+
public boolean dispatchWebKitEvent(WebViewInputDispatcher dispatcher,
1791+
MotionEvent event, int eventType, int flags) {
17881792
if (mNativeClass == 0) {
17891793
return false;
17901794
}
@@ -1811,10 +1815,16 @@ public boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags)
18111815
xArray[i] = (int) event.getX(i);
18121816
yArray[i] = (int) event.getY(i);
18131817
}
1814-
return nativeHandleTouchEvent(mNativeClass,
1818+
int touchFlags = nativeHandleTouchEvent(mNativeClass,
18151819
event.getActionMasked(),
18161820
idArray, xArray, yArray, count,
18171821
event.getActionIndex(), event.getMetaState());
1822+
if (touchFlags == 0
1823+
&& event.getActionMasked() != MotionEvent.ACTION_CANCEL
1824+
&& (flags & WebViewInputDispatcher.FLAG_PRIVATE) == 0) {
1825+
dispatcher.skipWebkitForRemainingTouchStream();
1826+
}
1827+
return (touchFlags & TOUCH_FLAG_PREVENT_DEFAULT) > 0;
18181828
}
18191829

18201830
default:

core/java/android/webkit/WebViewInputDispatcher.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ private boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags)
686686
+ ", eventType=" + eventType + ", flags=" + flags);
687687
}
688688
boolean preventDefault = mWebKitCallbacks.dispatchWebKitEvent(
689-
event, eventType, flags);
689+
this, event, eventType, flags);
690690
if (DEBUG) {
691691
Log.d(TAG, "dispatchWebKitEvent: preventDefault=" + preventDefault);
692692
}
@@ -710,6 +710,12 @@ && isMoveEventLocked(d.mNext)) {
710710
mWebKitDispatchEventQueue.mHead = d;
711711
}
712712

713+
// Called by WebKit when it doesn't care about the rest of the touch stream
714+
public void skipWebkitForRemainingTouchStream() {
715+
// Just treat this like a timeout
716+
handleWebKitTimeout();
717+
}
718+
713719
// Runs on UI thread in response to the web kit thread appearing to be unresponsive.
714720
private void handleWebKitTimeout() {
715721
synchronized (mLock) {
@@ -1081,12 +1087,14 @@ public static interface WebKitCallbacks {
10811087

10821088
/**
10831089
* Dispatches an event to web kit.
1090+
* @param dispatcher The WebViewInputDispatcher sending the event
10841091
* @param event The event.
10851092
* @param eventType The event type.
10861093
* @param flags The event's dispatch flags.
10871094
* @return True if web kit wants to prevent default event handling.
10881095
*/
1089-
public boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags);
1096+
public boolean dispatchWebKitEvent(WebViewInputDispatcher dispatcher,
1097+
MotionEvent event, int eventType, int flags);
10901098
}
10911099

10921100
// Runs on UI thread.

0 commit comments

Comments
 (0)