Skip to content

Commit c1e80a3

Browse files
committed
Support skipping a touch stream due to lack of handlers
Bug: 6317798 Change-Id: Ia1652e9030e877e270326e9e8a8b040810b89f09
1 parent 7018a90 commit c1e80a3

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
@@ -660,7 +660,7 @@ private native String nativeRetrieveImageSource(int nativeClass,
660660
int x, int y);
661661
private native boolean nativeMouseClick(int nativeClass);
662662

663-
private native boolean nativeHandleTouchEvent(int nativeClass, int action,
663+
private native int nativeHandleTouchEvent(int nativeClass, int action,
664664
int[] idArray, int[] xArray, int[] yArray, int count,
665665
int actionIndex, int metaState);
666666

@@ -959,6 +959,9 @@ static class TextFieldInitData {
959959
static final int ACTION_LONGPRESS = 0x100;
960960
static final int ACTION_DOUBLETAP = 0x200;
961961

962+
private static final int TOUCH_FLAG_HIT_HANDLER = 0x1;
963+
private static final int TOUCH_FLAG_PREVENT_DEFAULT = 0x2;
964+
962965
static class TouchEventData {
963966
int mAction;
964967
int[] mIds; // Ids of the touch points
@@ -1775,7 +1778,8 @@ public Looper getWebKitLooper() {
17751778
}
17761779

17771780
@Override
1778-
public boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags) {
1781+
public boolean dispatchWebKitEvent(WebViewInputDispatcher dispatcher,
1782+
MotionEvent event, int eventType, int flags) {
17791783
if (mNativeClass == 0) {
17801784
return false;
17811785
}
@@ -1802,10 +1806,16 @@ public boolean dispatchWebKitEvent(MotionEvent event, int eventType, int flags)
18021806
xArray[i] = (int) event.getX(i);
18031807
yArray[i] = (int) event.getY(i);
18041808
}
1805-
return nativeHandleTouchEvent(mNativeClass,
1809+
int touchFlags = nativeHandleTouchEvent(mNativeClass,
18061810
event.getActionMasked(),
18071811
idArray, xArray, yArray, count,
18081812
event.getActionIndex(), event.getMetaState());
1813+
if (touchFlags == 0
1814+
&& event.getActionMasked() != MotionEvent.ACTION_CANCEL
1815+
&& (flags & WebViewInputDispatcher.FLAG_PRIVATE) == 0) {
1816+
dispatcher.skipWebkitForRemainingTouchStream();
1817+
}
1818+
return (touchFlags & TOUCH_FLAG_PREVENT_DEFAULT) > 0;
18091819
}
18101820

18111821
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)