am 2737dfe0: am 5ec35c17: Merge "Fix bug 4082512 IAE "pointerIndex out of range" while zooming over flashplayer in browser" into honeycomb-mr1

* commit '2737dfe0a50379ae2524e95065b1b0afe222c83f':
  Fix bug 4082512 IAE "pointerIndex out of range" while zooming over flashplayer in browser
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index aa778fd..aaf4a25 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -5954,10 +5954,9 @@
         mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
         cancelLongPress();
         mPrivateHandler.removeMessages(SWITCH_TO_LONGPRESS);
-        mPreventDefault = PREVENT_DEFAULT_IGNORE;
     }
 
-    private void handleMultiTouchInWebView(MotionEvent ev) {
+    void handleMultiTouchInWebView(MotionEvent ev) {
         if (DebugFlags.WEB_VIEW) {
             Log.v(LOGTAG, "multi-touch: " + ev + " at " + ev.getEventTime()
                 + " mTouchMode=" + mTouchMode
@@ -5975,24 +5974,26 @@
         float x = ev.getX();
         float y = ev.getY();
 
-        detector.onTouchEvent(ev);
+        if (mPreventDefault != PREVENT_DEFAULT_YES) {
+            detector.onTouchEvent(ev);
 
-        if (detector.isInProgress()) {
-            if (DebugFlags.WEB_VIEW) {
-                Log.v(LOGTAG, "detector is in progress");
-            }
-            mLastTouchTime = ev.getEventTime();
-            x = detector.getFocusX();
-            y = detector.getFocusY();
+            if (detector.isInProgress()) {
+                if (DebugFlags.WEB_VIEW) {
+                    Log.v(LOGTAG, "detector is in progress");
+                }
+                mLastTouchTime = ev.getEventTime();
+                x = detector.getFocusX();
+                y = detector.getFocusY();
 
-            cancelLongPress();
-            mPrivateHandler.removeMessages(SWITCH_TO_LONGPRESS);
-            if (!mZoomManager.supportsPanDuringZoom()) {
-                return;
-            }
-            mTouchMode = TOUCH_DRAG_MODE;
-            if (mVelocityTracker == null) {
-                mVelocityTracker = VelocityTracker.obtain();
+                cancelLongPress();
+                mPrivateHandler.removeMessages(SWITCH_TO_LONGPRESS);
+                if (!mZoomManager.supportsPanDuringZoom()) {
+                    return;
+                }
+                mTouchMode = TOUCH_DRAG_MODE;
+                if (mVelocityTracker == null) {
+                    mVelocityTracker = VelocityTracker.obtain();
+                }
             }
         }
 
@@ -7291,12 +7292,14 @@
         }
 
         private void dropStaleGestures(MotionEvent ev, long sequence) {
-            if (ev != null && ev.getAction() == MotionEvent.ACTION_DOWN &&
-                    mTouchEventQueue != null) {
+            if (mTouchEventQueue == null) return;
+
+            MotionEvent nextQueueEvent = mTouchEventQueue.mTed != null ?
+                    mTouchEventQueue.mTed.mMotionEvent : mTouchEventQueue.mEvent;
+
+            if (ev != null && ev.getAction() == MotionEvent.ACTION_DOWN && nextQueueEvent != null) {
                 long eventTime = ev.getEventTime();
-                long nextQueueTime = mTouchEventQueue.mTed != null ?
-                        mTouchEventQueue.mTed.mMotionEvent.getEventTime() :
-                        mTouchEventQueue.mEvent.getEventTime();
+                long nextQueueTime = nextQueueEvent.getEventTime();
                 if (eventTime > nextQueueTime + QUEUED_GESTURE_TIMEOUT) {
                     Log.w(LOGTAG, "Got ACTION_DOWN but still waiting on stale event. " +
                             "Ignoring previous queued events.");
@@ -7339,7 +7342,7 @@
                 handleMultiTouchInWebView(ev);
             } else {
                 final ScaleGestureDetector detector = mZoomManager.getMultiTouchGestureDetector();
-                if (detector != null) {
+                if (detector != null && mPreventDefault != PREVENT_DEFAULT_YES) {
                     // ScaleGestureDetector needs a consistent event stream to operate properly.
                     // It won't take any action with fewer than two pointers, but it needs to
                     // update internal bookkeeping state.
@@ -7372,10 +7375,7 @@
                 }
             } else {
                 if (ted.mPoints.length > 1) {  // multi-touch
-                    if (ted.mAction == MotionEvent.ACTION_POINTER_UP &&
-                            ted.mMotionEvent.getPointerCount() == 2) {
-                    }
-                    if (!ted.mNativeResult) {
+                    if (!ted.mNativeResult && mPreventDefault != PREVENT_DEFAULT_YES) {
                         mPreventDefault = PREVENT_DEFAULT_NO;
                         handleMultiTouchInWebView(ted.mMotionEvent);
                     } else {