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:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user