Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 93f5831e authored by Grace Kloba's avatar Grace Kloba
Browse files

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
parent e0e6a9c0
Loading
Loading
Loading
Loading
+24 −10
Original line number Diff line number Diff line
@@ -375,6 +375,7 @@ public class WebView extends AbsoluteLayout
    private static final int PREVENT_DRAG_NO = 0;
    private static final int PREVENT_DRAG_MAYBE_YES = 1;
    private static final int PREVENT_DRAG_YES = 2;
    private static final int PREVENT_DRAG_CANCEL = 3;
    private int mPreventDrag = PREVENT_DRAG_NO;

    // by default mPreventLongPress is false. If it is true, long press event
@@ -4437,8 +4438,11 @@ public class WebView extends AbsoluteLayout
        }

        // pass the touch events from UI thread to WebCore thread
        if (mForwardTouchEvents && (action != MotionEvent.ACTION_MOVE
                || eventTime - mLastSentTouchTime > mCurrentTouchInterval)) {
        if (mForwardTouchEvents
                && (action != MotionEvent.ACTION_MOVE || eventTime
                        - mLastSentTouchTime > mCurrentTouchInterval)
                && (action == MotionEvent.ACTION_DOWN
                        || mPreventDrag != PREVENT_DRAG_CANCEL)) {
            WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData();
            ted.mAction = action;
            ted.mX = viewToContentX((int) x + mScrollX);
@@ -5719,12 +5723,17 @@ public class WebView extends AbsoluteLayout
                    break;
                }
                case SWITCH_TO_SHORTPRESS: {
                    // if mPreventDrag is not confirmed, treat it as no so that
                    // it won't block panning the page.
                    // if mPreventDrag is not confirmed, cancel it so that it
                    // won't block panning the page.
                    if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
                        mPreventDrag = PREVENT_DRAG_NO;
                        mPreventDrag = PREVENT_DRAG_CANCEL;
                        mPreventLongPress = 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) {
                        mTouchMode = mFullScreenHolder == null
@@ -5751,7 +5760,7 @@ public class WebView extends AbsoluteLayout
                        // don't set it.
                        ted.mMetaState = 0;
                        mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
                    } else if (mPreventDrag == PREVENT_DRAG_NO) {
                    } else if (mPreventDrag != PREVENT_DRAG_YES) {
                        mTouchMode = TOUCH_DONE_MODE;
                        if (mFullScreenHolder == null) {
                            performLongClick();
@@ -5762,13 +5771,18 @@ public class WebView extends AbsoluteLayout
                }
                case RELEASE_SINGLE_TAP: {
                    if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
                        // if mPreventDrag is not confirmed, treat it as
                        // no so that it won't block tap.
                        mPreventDrag = PREVENT_DRAG_NO;
                        // if mPreventDrag is not confirmed, cancel it so that
                        // it won't block panning the page.
                        mPreventDrag = PREVENT_DRAG_CANCEL;
                        mPreventLongPress = 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;
                        doShortPress();
                    }