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 {