| Index: Source/web/WebViewImpl.cpp
|
| diff --git a/Source/web/WebViewImpl.cpp b/Source/web/WebViewImpl.cpp
|
| index f102142cb35dd03333fc261cc34421622ec83a47..12e302b8b53867edea66e1acfffc8f5c8f56f128 100644
|
| --- a/Source/web/WebViewImpl.cpp
|
| +++ b/Source/web/WebViewImpl.cpp
|
| @@ -195,8 +195,9 @@ static const float viewportAnchorYCoord = 0;
|
|
|
| // Constants for zooming in on a focused text field.
|
| static const double scrollAndScaleAnimationDurationInSeconds = 0.2;
|
| -static const int minReadableCaretHeight = 18;
|
| -static const float minScaleChangeToTriggerZoom = 1.05f;
|
| +static const int minReadableCaretHeight = 16;
|
| +static const int minReadableCaretHeightForTextArea = 13;
|
| +static const float minScaleChangeToTriggerZoom = 1.5f;
|
| static const float leftBoxRatio = 0.3f;
|
| static const int caretPadding = 10;
|
|
|
| @@ -2857,13 +2858,25 @@ void WebViewImpl::computeScaleAndScrollForFocusedNode(Node* focusedNode, float&
|
| unscaledCaret.scale(1 / pageScaleFactor());
|
| caret = unscaledCaret;
|
|
|
| - // Pick a scale which is reasonably readable. This is the scale at which
|
| - // the caret height will become minReadableCaretHeight (adjusted for dpi
|
| - // and font scale factor).
|
| - newScale = clampPageScaleFactorToLimits(legibleScale() * minReadableCaretHeight / caret.height);
|
| - newScale = std::max(newScale, pageScaleFactor());
|
| + if (shouldDisableDesktopWorkarounds()) {
|
| + newScale = pageScaleFactor();
|
| + } else {
|
| + // Pick a scale which is reasonably readable. This is the scale at which
|
| + // the caret height will become minReadableCaretHeightForNode (adjusted
|
| + // for dpi and font scale factor).
|
| + const int minReadableCaretHeightForNode = textboxRect.height() >= 2 * caret.height ? minReadableCaretHeightForTextArea : minReadableCaretHeight;
|
| + newScale = clampPageScaleFactorToLimits(legibleScale() * minReadableCaretHeightForNode / caret.height);
|
| + newScale = std::max(newScale, pageScaleFactor());
|
| + }
|
| const float deltaScale = newScale / pageScaleFactor();
|
|
|
| + needAnimation = false;
|
| + // If we are at less than the target zoom level, zoom in.
|
| + if (deltaScale > minScaleChangeToTriggerZoom)
|
| + needAnimation = true;
|
| + else
|
| + newScale = pageScaleFactor();
|
| +
|
| // Convert the rects to absolute space in the new scale.
|
| IntRect textboxRectInDocumentCoordinates = textboxRect;
|
| textboxRectInDocumentCoordinates.move(mainFrame()->scrollOffset());
|
| @@ -2873,6 +2886,20 @@ void WebViewImpl::computeScaleAndScrollForFocusedNode(Node* focusedNode, float&
|
| int viewWidth = m_size.width / newScale;
|
| int viewHeight = m_size.height / newScale;
|
|
|
| + // If the caret is offscreen, then animate.
|
| + IntRect sizeRect(0, 0, viewWidth, viewHeight);
|
| + sizeRect.scale(newScale / pageScaleFactor());
|
| + if (!sizeRect.contains(caret))
|
| + needAnimation = true;
|
| +
|
| + // If the box is partially offscreen and it's possible to bring it fully
|
| + // onscreen, then animate.
|
| + if (sizeRect.contains(textboxRectInDocumentCoordinates.width(), textboxRectInDocumentCoordinates.height()) && !sizeRect.contains(textboxRect))
|
| + needAnimation = true;
|
| +
|
| + if (!needAnimation)
|
| + return;
|
| +
|
| if (textboxRectInDocumentCoordinates.width() <= viewWidth) {
|
| // Field is narrower than screen. Try to leave padding on left so field's
|
| // label is visible, but it's more important to ensure entire field is
|
| @@ -2893,20 +2920,6 @@ void WebViewImpl::computeScaleAndScrollForFocusedNode(Node* focusedNode, float&
|
| // be offscreen, in which case bottom-align the caret.
|
| newScroll.setY(std::max<int>(textboxRectInDocumentCoordinates.y(), caretInDocumentCoordinates.y() + caretInDocumentCoordinates.height() + caretPadding - viewHeight));
|
| }
|
| -
|
| - needAnimation = false;
|
| - // If we are at less than the target zoom level, zoom in.
|
| - if (deltaScale > minScaleChangeToTriggerZoom)
|
| - needAnimation = true;
|
| - // If the caret is offscreen, then animate.
|
| - IntRect sizeRect(0, 0, viewWidth, viewHeight);
|
| - sizeRect.scale(newScale / pageScaleFactor());
|
| - if (!sizeRect.contains(caret))
|
| - needAnimation = true;
|
| - // If the box is partially offscreen and it's possible to bring it fully
|
| - // onscreen, then animate.
|
| - if (sizeRect.contains(textboxRectInDocumentCoordinates.width(), textboxRectInDocumentCoordinates.height()) && !sizeRect.contains(textboxRect))
|
| - needAnimation = true;
|
| }
|
|
|
| void WebViewImpl::advanceFocus(bool reverse)
|
|
|