| Index: third_party/WebKit/Source/web/WebViewImpl.cpp
|
| diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp
|
| index 3422f11af0f4d3c0f441cb0314a142b345b403bd..ba95ffb7624822434a7bf84c68d9d7eec87d71da 100644
|
| --- a/third_party/WebKit/Source/web/WebViewImpl.cpp
|
| +++ b/third_party/WebKit/Source/web/WebViewImpl.cpp
|
| @@ -976,7 +976,7 @@ bool WebViewImpl::endActiveFlingAnimation()
|
| return false;
|
| }
|
|
|
| -bool WebViewImpl::startPageScaleAnimation(const IntPoint& targetPosition, bool useAnchor, float newScale, double durationInSeconds)
|
| +void WebViewImpl::startPageScaleAnimation(const IntPoint& targetPosition, bool useAnchor, float newScale, double durationInSeconds)
|
| {
|
| VisualViewport& visualViewport = page()->frameHost().visualViewport();
|
| WebPoint clampedPoint = targetPosition;
|
| @@ -988,23 +988,18 @@ bool WebViewImpl::startPageScaleAnimation(const IntPoint& targetPosition, bool u
|
| FrameView* view = mainFrameImpl()->frameView();
|
| if (view && view->getScrollableArea())
|
| view->getScrollableArea()->setScrollPosition(DoublePoint(clampedPoint.x, clampedPoint.y), ProgrammaticScroll);
|
| -
|
| - return false;
|
| }
|
| }
|
| if (useAnchor && newScale == pageScaleFactor())
|
| - return false;
|
| + return;
|
|
|
| if (m_enableFakePageScaleAnimationForTesting) {
|
| m_fakePageScaleAnimationTargetPosition = targetPosition;
|
| m_fakePageScaleAnimationUseAnchor = useAnchor;
|
| m_fakePageScaleAnimationPageScaleFactor = newScale;
|
| - } else {
|
| - if (!m_layerTreeView)
|
| - return false;
|
| + } else if (m_layerTreeView) {
|
| m_layerTreeView->startPageScaleAnimation(targetPosition, useAnchor, newScale, durationInSeconds);
|
| }
|
| - return true;
|
| }
|
|
|
| void WebViewImpl::enableFakePageScaleAnimationForTesting(bool enable)
|
| @@ -1449,17 +1444,15 @@ void WebViewImpl::animateDoubleTapZoom(const IntPoint& pointInRootFrame)
|
| bool scaleUnchanged = fabs(pageScaleFactor() - scale) < minScaleDifference;
|
| bool shouldZoomOut = blockBounds.isEmpty() || scaleUnchanged || stillAtPreviousDoubleTapScale;
|
|
|
| - bool isAnimating;
|
| -
|
| if (shouldZoomOut) {
|
| scale = minimumPageScaleFactor();
|
| IntPoint targetPosition = mainFrameImpl()->frameView()->rootFrameToContents(pointInRootFrame);
|
| - isAnimating = startPageScaleAnimation(targetPosition, true, scale, doubleTapZoomAnimationDurationInSeconds);
|
| + startPageScaleAnimation(targetPosition, true, scale, doubleTapZoomAnimationDurationInSeconds);
|
| } else {
|
| - isAnimating = startPageScaleAnimation(scroll, false, scale, doubleTapZoomAnimationDurationInSeconds);
|
| + startPageScaleAnimation(scroll, false, scale, doubleTapZoomAnimationDurationInSeconds);
|
| }
|
|
|
| - if (isAnimating) {
|
| + if (m_layerTreeView->hasPendingPageScaleAnimation()) {
|
| m_doubleTapZoomPageScaleFactor = scale;
|
| m_doubleTapZoomPending = true;
|
| }
|
| @@ -2938,7 +2931,23 @@ void WebViewImpl::clearFocusedElement()
|
| localFrame->selection().clear();
|
| }
|
|
|
| -bool WebViewImpl::scrollFocusedNodeIntoRect(const WebRect& rectInViewport)
|
| +// TODO(dglazkov): Remove and replace with Node:hasEditableStyle.
|
| +// http://crbug.com/612560
|
| +static bool isElementEditable(const Element* element)
|
| +{
|
| + if (element->isContentEditable())
|
| + return true;
|
| +
|
| + if (element->isTextFormControl()) {
|
| + const HTMLTextFormControlElement* input = toHTMLTextFormControlElement(element);
|
| + if (!input->isDisabledOrReadOnly())
|
| + return true;
|
| + }
|
| +
|
| + return equalIgnoringCase(element->getAttribute(HTMLNames::roleAttr), "textbox");
|
| +}
|
| +
|
| +bool WebViewImpl::scrollFocusedEditableElementIntoRect(const WebRect& rectInViewport)
|
| {
|
| LocalFrame* frame = page()->mainFrame() && page()->mainFrame()->isLocalFrame()
|
| ? page()->deprecatedLocalMainFrame() : nullptr;
|
| @@ -2946,6 +2955,9 @@ bool WebViewImpl::scrollFocusedNodeIntoRect(const WebRect& rectInViewport)
|
| if (!frame || !frame->view() || !element)
|
| return false;
|
|
|
| + if (!isElementEditable(element))
|
| + return false;
|
| +
|
| element->document().updateLayoutIgnorePendingStylesheets();
|
|
|
| bool zoomInToLegibleScale = m_webSettings->autoZoomFocusedNodeToLegibleScale()
|
| @@ -2965,9 +2977,9 @@ bool WebViewImpl::scrollFocusedNodeIntoRect(const WebRect& rectInViewport)
|
| bool needAnimation;
|
| computeScaleAndScrollForFocusedNode(element, zoomInToLegibleScale, scale, scroll, needAnimation);
|
| if (needAnimation)
|
| - return startPageScaleAnimation(scroll, false, scale, scrollAndScaleAnimationDurationInSeconds);
|
| + startPageScaleAnimation(scroll, false, scale, scrollAndScaleAnimationDurationInSeconds);
|
|
|
| - return false;
|
| + return true;
|
| }
|
|
|
| void WebViewImpl::smoothScroll(int targetX, int targetY, long durationMs)
|
|
|