Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(196)

Side by Side Diff: Source/web/WebViewImpl.cpp

Issue 196133011: Refine autozoom scaling constants and logic (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | Source/web/tests/WebFrameTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 188
189 static const double multipleTargetsZoomAnimationDurationInSeconds = 0.25; 189 static const double multipleTargetsZoomAnimationDurationInSeconds = 0.25;
190 static const double findInPageAnimationDurationInSeconds = 0; 190 static const double findInPageAnimationDurationInSeconds = 0;
191 191
192 // Constants for viewport anchoring on resize. 192 // Constants for viewport anchoring on resize.
193 static const float viewportAnchorXCoord = 0.5f; 193 static const float viewportAnchorXCoord = 0.5f;
194 static const float viewportAnchorYCoord = 0; 194 static const float viewportAnchorYCoord = 0;
195 195
196 // Constants for zooming in on a focused text field. 196 // Constants for zooming in on a focused text field.
197 static const double scrollAndScaleAnimationDurationInSeconds = 0.2; 197 static const double scrollAndScaleAnimationDurationInSeconds = 0.2;
198 static const int minReadableCaretHeight = 18; 198 static const int minReadableCaretHeight = 16;
199 static const float minScaleChangeToTriggerZoom = 1.05f; 199 static const int minReadableCaretHeightForTextArea = 13;
200 static const float minScaleChangeToTriggerZoom = 1.5f;
200 static const float leftBoxRatio = 0.3f; 201 static const float leftBoxRatio = 0.3f;
201 static const int caretPadding = 10; 202 static const int caretPadding = 10;
202 203
203 namespace blink { 204 namespace blink {
204 205
205 // Change the text zoom level by kTextSizeMultiplierRatio each time the user 206 // Change the text zoom level by kTextSizeMultiplierRatio each time the user
206 // zooms text in or out (ie., change by 20%). The min and max values limit 207 // zooms text in or out (ie., change by 20%). The min and max values limit
207 // text zoom to half and 3x the original text size. These three values match 208 // text zoom to half and 3x the original text size. These three values match
208 // those in Apple's port in WebKit/WebKit/WebView/WebView.mm 209 // those in Apple's port in WebKit/WebKit/WebView/WebView.mm
209 const double WebView::textSizeMultiplierRatio = 1.2; 210 const double WebView::textSizeMultiplierRatio = 1.2;
(...skipping 2640 matching lines...) Expand 10 before | Expand all | Expand 10 after
2850 focusedNode->document().updateLayoutIgnorePendingStylesheets(); 2851 focusedNode->document().updateLayoutIgnorePendingStylesheets();
2851 2852
2852 // 'caret' is rect encompassing the blinking cursor. 2853 // 'caret' is rect encompassing the blinking cursor.
2853 IntRect textboxRect = focusedNode->document().view()->contentsToWindow(pixel SnappedIntRect(focusedNode->Node::boundingBox())); 2854 IntRect textboxRect = focusedNode->document().view()->contentsToWindow(pixel SnappedIntRect(focusedNode->Node::boundingBox()));
2854 WebRect caret, unusedEnd; 2855 WebRect caret, unusedEnd;
2855 selectionBounds(caret, unusedEnd); 2856 selectionBounds(caret, unusedEnd);
2856 IntRect unscaledCaret = caret; 2857 IntRect unscaledCaret = caret;
2857 unscaledCaret.scale(1 / pageScaleFactor()); 2858 unscaledCaret.scale(1 / pageScaleFactor());
2858 caret = unscaledCaret; 2859 caret = unscaledCaret;
2859 2860
2860 // Pick a scale which is reasonably readable. This is the scale at which 2861 if (shouldDisableDesktopWorkarounds()) {
2861 // the caret height will become minReadableCaretHeight (adjusted for dpi 2862 newScale = pageScaleFactor();
2862 // and font scale factor). 2863 } else {
2863 newScale = clampPageScaleFactorToLimits(legibleScale() * minReadableCaretHei ght / caret.height); 2864 // Pick a scale which is reasonably readable. This is the scale at which
2864 newScale = std::max(newScale, pageScaleFactor()); 2865 // the caret height will become minReadableCaretHeightForNode (adjusted
2866 // for dpi and font scale factor).
2867 const int minReadableCaretHeightForNode = textboxRect.height() >= 2 * ca ret.height ? minReadableCaretHeightForTextArea : minReadableCaretHeight;
2868 newScale = clampPageScaleFactorToLimits(legibleScale() * minReadableCare tHeightForNode / caret.height);
2869 newScale = std::max(newScale, pageScaleFactor());
2870 }
2865 const float deltaScale = newScale / pageScaleFactor(); 2871 const float deltaScale = newScale / pageScaleFactor();
2866 2872
2873 needAnimation = false;
2874 // If we are at less than the target zoom level, zoom in.
2875 if (deltaScale > minScaleChangeToTriggerZoom)
2876 needAnimation = true;
2877 else
2878 newScale = pageScaleFactor();
2879
2867 // Convert the rects to absolute space in the new scale. 2880 // Convert the rects to absolute space in the new scale.
2868 IntRect textboxRectInDocumentCoordinates = textboxRect; 2881 IntRect textboxRectInDocumentCoordinates = textboxRect;
2869 textboxRectInDocumentCoordinates.move(mainFrame()->scrollOffset()); 2882 textboxRectInDocumentCoordinates.move(mainFrame()->scrollOffset());
2870 IntRect caretInDocumentCoordinates = caret; 2883 IntRect caretInDocumentCoordinates = caret;
2871 caretInDocumentCoordinates.move(mainFrame()->scrollOffset()); 2884 caretInDocumentCoordinates.move(mainFrame()->scrollOffset());
2872 2885
2873 int viewWidth = m_size.width / newScale; 2886 int viewWidth = m_size.width / newScale;
2874 int viewHeight = m_size.height / newScale; 2887 int viewHeight = m_size.height / newScale;
2875 2888
2889 // If the caret is offscreen, then animate.
2890 IntRect sizeRect(0, 0, viewWidth, viewHeight);
2891 sizeRect.scale(newScale / pageScaleFactor());
2892 if (!sizeRect.contains(caret))
2893 needAnimation = true;
2894
2895 // If the box is partially offscreen and it's possible to bring it fully
2896 // onscreen, then animate.
2897 if (sizeRect.contains(textboxRectInDocumentCoordinates.width(), textboxRectI nDocumentCoordinates.height()) && !sizeRect.contains(textboxRect))
2898 needAnimation = true;
2899
2900 if (!needAnimation)
2901 return;
2902
2876 if (textboxRectInDocumentCoordinates.width() <= viewWidth) { 2903 if (textboxRectInDocumentCoordinates.width() <= viewWidth) {
2877 // Field is narrower than screen. Try to leave padding on left so field' s 2904 // Field is narrower than screen. Try to leave padding on left so field' s
2878 // label is visible, but it's more important to ensure entire field is 2905 // label is visible, but it's more important to ensure entire field is
2879 // onscreen. 2906 // onscreen.
2880 int idealLeftPadding = viewWidth * leftBoxRatio; 2907 int idealLeftPadding = viewWidth * leftBoxRatio;
2881 int maxLeftPaddingKeepingBoxOnscreen = viewWidth - textboxRectInDocument Coordinates.width(); 2908 int maxLeftPaddingKeepingBoxOnscreen = viewWidth - textboxRectInDocument Coordinates.width();
2882 newScroll.setX(textboxRectInDocumentCoordinates.x() - std::min<int>(idea lLeftPadding, maxLeftPaddingKeepingBoxOnscreen)); 2909 newScroll.setX(textboxRectInDocumentCoordinates.x() - std::min<int>(idea lLeftPadding, maxLeftPaddingKeepingBoxOnscreen));
2883 } else { 2910 } else {
2884 // Field is wider than screen. Try to left-align field, unless caret wou ld 2911 // Field is wider than screen. Try to left-align field, unless caret wou ld
2885 // be offscreen, in which case right-align the caret. 2912 // be offscreen, in which case right-align the caret.
2886 newScroll.setX(std::max<int>(textboxRectInDocumentCoordinates.x(), caret InDocumentCoordinates.x() + caretInDocumentCoordinates.width() + caretPadding - viewWidth)); 2913 newScroll.setX(std::max<int>(textboxRectInDocumentCoordinates.x(), caret InDocumentCoordinates.x() + caretInDocumentCoordinates.width() + caretPadding - viewWidth));
2887 } 2914 }
2888 if (textboxRectInDocumentCoordinates.height() <= viewHeight) { 2915 if (textboxRectInDocumentCoordinates.height() <= viewHeight) {
2889 // Field is shorter than screen. Vertically center it. 2916 // Field is shorter than screen. Vertically center it.
2890 newScroll.setY(textboxRectInDocumentCoordinates.y() - (viewHeight - text boxRectInDocumentCoordinates.height()) / 2); 2917 newScroll.setY(textboxRectInDocumentCoordinates.y() - (viewHeight - text boxRectInDocumentCoordinates.height()) / 2);
2891 } else { 2918 } else {
2892 // Field is taller than screen. Try to top align field, unless caret wou ld 2919 // Field is taller than screen. Try to top align field, unless caret wou ld
2893 // be offscreen, in which case bottom-align the caret. 2920 // be offscreen, in which case bottom-align the caret.
2894 newScroll.setY(std::max<int>(textboxRectInDocumentCoordinates.y(), caret InDocumentCoordinates.y() + caretInDocumentCoordinates.height() + caretPadding - viewHeight)); 2921 newScroll.setY(std::max<int>(textboxRectInDocumentCoordinates.y(), caret InDocumentCoordinates.y() + caretInDocumentCoordinates.height() + caretPadding - viewHeight));
2895 } 2922 }
2896
2897 needAnimation = false;
2898 // If we are at less than the target zoom level, zoom in.
2899 if (deltaScale > minScaleChangeToTriggerZoom)
2900 needAnimation = true;
2901 // If the caret is offscreen, then animate.
2902 IntRect sizeRect(0, 0, viewWidth, viewHeight);
2903 sizeRect.scale(newScale / pageScaleFactor());
2904 if (!sizeRect.contains(caret))
2905 needAnimation = true;
2906 // If the box is partially offscreen and it's possible to bring it fully
2907 // onscreen, then animate.
2908 if (sizeRect.contains(textboxRectInDocumentCoordinates.width(), textboxRectI nDocumentCoordinates.height()) && !sizeRect.contains(textboxRect))
2909 needAnimation = true;
2910 } 2923 }
2911 2924
2912 void WebViewImpl::advanceFocus(bool reverse) 2925 void WebViewImpl::advanceFocus(bool reverse)
2913 { 2926 {
2914 page()->focusController().advanceFocus(reverse ? FocusTypeBackward : FocusTy peForward); 2927 page()->focusController().advanceFocus(reverse ? FocusTypeBackward : FocusTy peForward);
2915 } 2928 }
2916 2929
2917 double WebViewImpl::zoomLevel() 2930 double WebViewImpl::zoomLevel()
2918 { 2931 {
2919 return m_zoomLevel; 2932 return m_zoomLevel;
(...skipping 1605 matching lines...) Expand 10 before | Expand all | Expand 10 after
4525 return mainFrameImpl()->frameView()->layoutSize().width() == m_size.width 4538 return mainFrameImpl()->frameView()->layoutSize().width() == m_size.width
4526 || (constraints.minimumScale == constraints.maximumScale && constraints. minimumScale != -1); 4539 || (constraints.minimumScale == constraints.maximumScale && constraints. minimumScale != -1);
4527 } 4540 }
4528 4541
4529 void WebViewImpl::forceNextWebGLContextCreationToFail() 4542 void WebViewImpl::forceNextWebGLContextCreationToFail()
4530 { 4543 {
4531 WebGLRenderingContext::forceNextWebGLContextCreationToFail(); 4544 WebGLRenderingContext::forceNextWebGLContextCreationToFail();
4532 } 4545 }
4533 4546
4534 } // namespace blink 4547 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | Source/web/tests/WebFrameTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698