Merge "Fix bug 4083825 - Gesture zoom locked along content edges under some circumstances" into honeycomb-mr1
diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java
index 1d77388..72052a6 100644
--- a/core/java/android/webkit/ZoomManager.java
+++ b/core/java/android/webkit/ZoomManager.java
@@ -777,12 +777,15 @@
     }
 
     private class ScaleDetectorListener implements ScaleGestureDetector.OnScaleGestureListener {
+        private float mAccumulatedSpan;
+
         public boolean onScaleBegin(ScaleGestureDetector detector) {
             mInitialZoomOverview = false;
             dismissZoomPicker();
             mFocusMovementQueue.clear();
             mWebView.mViewManager.startZoom();
             mWebView.onPinchToZoomAnimationStart();
+            mAccumulatedSpan = 0;
             return true;
         }
 
@@ -797,8 +800,15 @@
                     FloatMath.sqrt((mFocusX - prevFocusX) * (mFocusX - prevFocusX)
                                    + (mFocusY - prevFocusY) * (mFocusY - prevFocusY));
             mFocusMovementQueue.add(focusDelta);
-            float deltaSpan = Math.abs(detector.getCurrentSpan() - detector.getPreviousSpan());
-            return mFocusMovementQueue.getSum() > deltaSpan;
+            float deltaSpan = detector.getCurrentSpan() - detector.getPreviousSpan() +
+                    mAccumulatedSpan;
+            final boolean result = mFocusMovementQueue.getSum() > Math.abs(deltaSpan);
+            if (result) {
+                mAccumulatedSpan += deltaSpan;
+            } else {
+                mAccumulatedSpan = 0;
+            }
+            return result;
         }
 
         public boolean handleScale(ScaleGestureDetector detector) {