| 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;
|
| }
|
| }
|
|
|
|
|