Index: Source/WebKit/chromium/src/WebViewImpl.cpp |
=================================================================== |
--- Source/WebKit/chromium/src/WebViewImpl.cpp (revision 143777) |
+++ Source/WebKit/chromium/src/WebViewImpl.cpp (working copy) |
@@ -400,8 +400,11 @@ |
, m_ignoreViewportTagMaximumScale(false) |
, m_pageScaleFactorIsSet(false) |
, m_savedPageScaleFactor(0) |
- , m_doubleTapZoomInEffect(false) |
- , m_shouldUseDoubleTapTimeZero(false) |
+ , m_doubleTapZoomPageScaleFactor(0) |
+ , m_doubleTapZoomPending(false) |
+ , m_enableFakeDoubleTapAnimationForTesting(false) |
+ , m_fakeDoubleTapPageScaleFactor(0) |
+ , m_fakeDoubleTapUseAnchor(false) |
, m_contextMenuAllowed(false) |
, m_doingDragAndDrop(false) |
, m_ignoreInputEvents(false) |
@@ -857,20 +860,35 @@ |
scheduleAnimation(); |
} |
-void WebViewImpl::startPageScaleAnimation(const IntPoint& targetPosition, bool useAnchor, float newScale, double durationInSeconds) |
+bool WebViewImpl::startPageScaleAnimation(const IntPoint& targetPosition, bool useAnchor, float newScale, double durationInSeconds) |
{ |
WebPoint clampedPoint = targetPosition; |
- if (!useAnchor) |
+ if (!useAnchor) { |
clampedPoint = clampOffsetAtScale(targetPosition, newScale); |
- if ((!durationInSeconds && !useAnchor) || m_shouldUseDoubleTapTimeZero) { |
- setPageScaleFactor(newScale, clampedPoint); |
- return; |
+ if (!durationInSeconds) { |
+ setPageScaleFactor(newScale, clampedPoint); |
+ return false; |
+ } |
} |
- if (!m_layerTreeView) |
- return; |
+ if (useAnchor && newScale == pageScaleFactor()) |
+ return false; |
- m_layerTreeView->startPageScaleAnimation(targetPosition, useAnchor, newScale, durationInSeconds); |
+ if (m_enableFakeDoubleTapAnimationForTesting) { |
+ m_fakeDoubleTapTargetPosition = targetPosition; |
+ m_fakeDoubleTapUseAnchor = useAnchor; |
+ m_fakeDoubleTapPageScaleFactor = newScale; |
+ } else { |
+ if (!m_layerTreeView) |
+ return false; |
+ m_layerTreeView->startPageScaleAnimation(targetPosition, useAnchor, newScale, durationInSeconds); |
+ } |
+ return true; |
} |
+ |
+void WebViewImpl::enableFakeDoubleTapAnimationForTesting(bool enable) |
+{ |
+ m_enableFakeDoubleTapAnimationForTesting = enable; |
+} |
#endif |
WebViewBenchmarkSupport* WebViewImpl::benchmarkSupport() |
@@ -1154,11 +1172,6 @@ |
return WebRect(newX, source.y, newWidth, source.height); |
} |
-void WebViewImpl::shouldUseAnimateDoubleTapTimeZeroForTesting(bool setToZero) |
-{ |
- m_shouldUseDoubleTapTimeZero = setToZero; |
-} |
- |
void WebViewImpl::computeScaleAndScrollForHitRect(const WebRect& hitRect, AutoZoomType zoomType, float& scale, WebPoint& scroll, bool& isAnchor) |
{ |
scale = pageScaleFactor(); |
@@ -1216,17 +1229,15 @@ |
scaleUnchanged = fabs(pageScaleFactor() - scale) < minScaleDifference; |
} |
- if (zoomType == DoubleTap && (rect.isEmpty() || scaleUnchanged || m_doubleTapZoomInEffect)) { |
+ bool stillAtPreviousDoubleTapScale = (pageScaleFactor() == m_doubleTapZoomPageScaleFactor |
+ && m_doubleTapZoomPageScaleFactor != m_minimumPageScaleFactor) |
+ || m_doubleTapZoomPending; |
+ if (zoomType == DoubleTap && (rect.isEmpty() || scaleUnchanged || stillAtPreviousDoubleTapScale)) { |
// Zoom out to minimum scale. |
scale = m_minimumPageScaleFactor; |
scroll = WebPoint(hitRect.x, hitRect.y); |
isAnchor = true; |
- m_doubleTapZoomInEffect = false; |
} else { |
- if (zoomType == DoubleTap && scale != m_minimumPageScaleFactor) |
- m_doubleTapZoomInEffect = true; |
- else |
- m_doubleTapZoomInEffect = false; |
// FIXME: If this is being called for auto zoom during find in page, |
// then if the user manually zooms in it'd be nice to preserve the |
// relative increase in zoom they caused (if they zoom out then it's ok |
@@ -1345,8 +1356,13 @@ |
computeScaleAndScrollForHitRect(WebRect(webPoint.x, webPoint.y, 0, 0), zoomType, scale, scroll, isAnchor); |
bool isDoubleTap = (zoomType == DoubleTap); |
- double durationInSeconds = (isDoubleTap && !m_shouldUseDoubleTapTimeZero) ? doubleTapZoomAnimationDurationInSeconds : 0; |
- startPageScaleAnimation(scroll, isAnchor, scale, durationInSeconds); |
+ double durationInSeconds = isDoubleTap ? doubleTapZoomAnimationDurationInSeconds : 0; |
+ bool isAnimating = startPageScaleAnimation(scroll, isAnchor, scale, durationInSeconds); |
+ |
+ if (isDoubleTap && isAnimating) { |
+ m_doubleTapZoomPageScaleFactor = scale; |
+ m_doubleTapZoomPending = true; |
+ } |
#endif |
} |
@@ -3766,10 +3782,8 @@ |
m_newNavigationLoader = 0; |
#endif |
m_observedNewNavigation = false; |
- if (*isNewNavigation && !isNavigationWithinPage) { |
+ if (*isNewNavigation && !isNavigationWithinPage) |
m_pageScaleFactorIsSet = false; |
- m_doubleTapZoomInEffect = false; |
- } |
// Make sure link highlight from previous page is cleared. |
m_linkHighlight.clear(); |
@@ -4216,7 +4230,7 @@ |
} |
setPageScaleFactor(pageScaleFactor() * pageScaleDelta, scrollPoint); |
- m_doubleTapZoomInEffect = false; |
+ m_doubleTapZoomPending = false; |
} |
} |