From 5b3040964b94d04c6a7285664f4331326e271734 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Fri, 25 Mar 2011 13:58:19 -0700 Subject: [PATCH] Fix bug 4170809 - Pages with flash lose touch events Fix WebView touch cancel behavior when we time out waiting for a response from webkit. Change-Id: I0aeeea64b156e204dbe2dda913a42df28704ed16 --- core/java/android/webkit/WebView.java | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 96623b0b5a81d..a3ced9e1f2c13 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -6056,7 +6056,6 @@ public class WebView extends AbsoluteLayout if (shouldForwardTouchEvent()) { if (removeEvents) { mWebViewCore.removeMessages(EventHub.TOUCH_EVENT); - mTouchEventQueue.ignoreCurrentlyMissingEvents(); } TouchEventData ted = new TouchEventData(); ted.mIds = new int[1]; @@ -6073,6 +6072,12 @@ public class WebView extends AbsoluteLayout ted.mSequence = mTouchEventQueue.nextTouchSequence(); mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); mPreventDefault = PREVENT_DEFAULT_IGNORE; + + if (removeEvents) { + // Mark this after sending the message above; we should + // be willing to ignore the cancel event that we just sent. + mTouchEventQueue.ignoreCurrentlyMissingEvents(); + } } } @@ -7266,17 +7271,18 @@ public class WebView extends AbsoluteLayout * been queued will also be processed in their proper order. * * @param ted Touch data to be processed in order. + * @return true if the event was processed before returning, false if it was just enqueued. */ - public void enqueueTouchEvent(TouchEventData ted) { + public boolean enqueueTouchEvent(TouchEventData ted) { if (ted.mSequence < mLastHandledTouchSequence) { // Stale event and we already moved on; drop it. (Should not be common.) Log.w(LOGTAG, "Stale touch event " + MotionEvent.actionToString(ted.mAction) + " received from webcore; ignoring"); - return; + return false; } if (dropStaleGestures(ted.mMotionEvent, ted.mSequence)) { - return; + return false; } if (mLastHandledTouchSequence + 1 == ted.mSequence) { @@ -7298,6 +7304,7 @@ public class WebView extends AbsoluteLayout QueuedTouch qd = obtainQueuedTouch().set(ted); mTouchEventQueue = mTouchEventQueue == null ? qd : mTouchEventQueue.add(qd); } + return true; } /** @@ -7851,11 +7858,11 @@ public class WebView extends AbsoluteLayout } TouchEventData ted = (TouchEventData) msg.obj; - // WebCore is responding to us; remove pending timeout. - // It will be re-posted when needed. - removeMessages(PREVENT_DEFAULT_TIMEOUT); - - mTouchEventQueue.enqueueTouchEvent(ted); + if (mTouchEventQueue.enqueueTouchEvent(ted)) { + // WebCore is responding to us; remove pending timeout. + // It will be re-posted when needed. + removeMessages(PREVENT_DEFAULT_TIMEOUT); + } break; case REQUEST_KEYBOARD: