DO NOT MERGE

If mPreventDrag is cancelled due to time out, remove
the pending TOUCH_EVENTS and then send an ACTION_CANCEL
and skip the rest of touch events.

This should address the drag problem Flash plugin has.

Fix http://b/issue?id=245053
This commit is contained in:
Grace Kloba
2010-02-23 15:25:31 -08:00
parent 4ed2b1c34b
commit a406fb9080

View File

@@ -372,6 +372,7 @@ public class WebView extends AbsoluteLayout
private static final int PREVENT_DRAG_NO = 0; private static final int PREVENT_DRAG_NO = 0;
private static final int PREVENT_DRAG_MAYBE_YES = 1; private static final int PREVENT_DRAG_MAYBE_YES = 1;
private static final int PREVENT_DRAG_YES = 2; private static final int PREVENT_DRAG_YES = 2;
private static final int PREVENT_DRAG_CANCEL = 3;
private int mPreventDrag = PREVENT_DRAG_NO; private int mPreventDrag = PREVENT_DRAG_NO;
// by default mPreventLongPress is false. If it is true, long press event // by default mPreventLongPress is false. If it is true, long press event
@@ -4138,8 +4139,11 @@ public class WebView extends AbsoluteLayout
} }
// pass the touch events from UI thread to WebCore thread // pass the touch events from UI thread to WebCore thread
if (mForwardTouchEvents && (action != MotionEvent.ACTION_MOVE if (mForwardTouchEvents
|| eventTime - mLastSentTouchTime > TOUCH_SENT_INTERVAL)) { && (action != MotionEvent.ACTION_MOVE || eventTime
- mLastSentTouchTime > TOUCH_SENT_INTERVAL)
&& (action == MotionEvent.ACTION_DOWN
|| mPreventDrag != PREVENT_DRAG_CANCEL)) {
WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData(); WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData();
ted.mAction = action; ted.mAction = action;
ted.mX = viewToContentX((int) x + mScrollX); ted.mX = viewToContentX((int) x + mScrollX);
@@ -5407,12 +5411,17 @@ public class WebView extends AbsoluteLayout
break; break;
} }
case SWITCH_TO_SHORTPRESS: { case SWITCH_TO_SHORTPRESS: {
// if mPreventDrag is not confirmed, treat it as no so that // if mPreventDrag is not confirmed, cancel it so that it
// it won't block panning the page. // won't block panning the page.
if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) { if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
mPreventDrag = PREVENT_DRAG_NO; mPreventDrag = PREVENT_DRAG_CANCEL;
mPreventLongPress = false; mPreventLongPress = false;
mPreventDoubleTap = false; mPreventDoubleTap = false;
// remove the pending TOUCH_EVENT and send a cancel
mWebViewCore.removeMessages(EventHub.TOUCH_EVENT);
WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData();
ted.mAction = MotionEvent.ACTION_CANCEL;
mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
} }
if (mTouchMode == TOUCH_INIT_MODE) { if (mTouchMode == TOUCH_INIT_MODE) {
mTouchMode = mFullScreenHolder == null mTouchMode = mFullScreenHolder == null
@@ -5434,7 +5443,7 @@ public class WebView extends AbsoluteLayout
ted.mY = viewToContentY((int) mLastTouchY + mScrollY); ted.mY = viewToContentY((int) mLastTouchY + mScrollY);
ted.mEventTime = SystemClock.uptimeMillis(); ted.mEventTime = SystemClock.uptimeMillis();
mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
} else if (mPreventDrag == PREVENT_DRAG_NO) { } else if (mPreventDrag != PREVENT_DRAG_YES) {
mTouchMode = TOUCH_DONE_MODE; mTouchMode = TOUCH_DONE_MODE;
if (mFullScreenHolder == null) { if (mFullScreenHolder == null) {
performLongClick(); performLongClick();
@@ -5445,13 +5454,18 @@ public class WebView extends AbsoluteLayout
} }
case RELEASE_SINGLE_TAP: { case RELEASE_SINGLE_TAP: {
if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) { if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
// if mPreventDrag is not confirmed, treat it as // if mPreventDrag is not confirmed, cancel it so that
// no so that it won't block tap. // it won't block panning the page.
mPreventDrag = PREVENT_DRAG_NO; mPreventDrag = PREVENT_DRAG_CANCEL;
mPreventLongPress = false; mPreventLongPress = false;
mPreventDoubleTap = false; mPreventDoubleTap = false;
// remove the pending TOUCH_EVENT and send a cancel
mWebViewCore.removeMessages(EventHub.TOUCH_EVENT);
WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData();
ted.mAction = MotionEvent.ACTION_CANCEL;
mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
} }
if (mPreventDrag == PREVENT_DRAG_NO) { if (mPreventDrag != PREVENT_DRAG_YES) {
mTouchMode = TOUCH_DONE_MODE; mTouchMode = TOUCH_DONE_MODE;
doShortPress(); doShortPress();
} }