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

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

Issue 23461009: Scale to legibleScale if double tap would barely zoom in from zoomed out state. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 3 months 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 | « Source/web/WebViewImpl.h ('k') | 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 1106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1117 1117
1118 const int newWidth = source.width + leftMargin + rightMargin; 1118 const int newWidth = source.width + leftMargin + rightMargin;
1119 const int newX = source.x - leftMargin; 1119 const int newX = source.x - leftMargin;
1120 1120
1121 ASSERT(newWidth >= 0); 1121 ASSERT(newWidth >= 0);
1122 ASSERT(scrollOffset.width() + newX + newWidth <= maxSize.width); 1122 ASSERT(scrollOffset.width() + newX + newWidth <= maxSize.width);
1123 1123
1124 return WebRect(newX, source.y, newWidth, source.height); 1124 return WebRect(newX, source.y, newWidth, source.height);
1125 } 1125 }
1126 1126
1127 void WebViewImpl::computeScaleAndScrollForBlockRect(const WebRect& blockRect, fl oat padding, float& scale, WebPoint& scroll, bool& doubleTapShouldZoomOut) 1127 float WebViewImpl::legibleScale() const
1128 {
1129 // Pages should be as legible as on desktop when at dpi scale, so no
1130 // need to zoom in further when automatically determining zoom level
1131 // (after double tap, find in page, etc), though the user should still
1132 // be allowed to manually pinch zoom in further if they desire.
1133 float legibleScale = 1;
1134 if (page() && page()->settings().textAutosizingEnabled())
1135 legibleScale *= page()->settings().textAutosizingFontScaleFactor();
1136 return legibleScale;
1137 }
1138
1139 void WebViewImpl::computeScaleAndScrollForBlockRect(const WebRect& blockRect, fl oat padding, float defaultScaleWhenAlreadyLegible, float& scale, WebPoint& scrol l)
1128 { 1140 {
1129 scale = pageScaleFactor(); 1141 scale = pageScaleFactor();
1130 scroll.x = scroll.y = 0; 1142 scroll.x = scroll.y = 0;
1131 1143
1132 WebRect rect = blockRect; 1144 WebRect rect = blockRect;
1133 1145
1134 bool scaleUnchanged = true;
1135 if (!rect.isEmpty()) { 1146 if (!rect.isEmpty()) {
1136 // Pages should be as legible as on desktop when at dpi scale, so no
1137 // need to zoom in further when automatically determining zoom level
1138 // (after double tap, find in page, etc), though the user should still
1139 // be allowed to manually pinch zoom in further if they desire.
1140 const float defaultScaleWhenAlreadyLegible = minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio;
1141 float legibleScale = 1;
1142 if (page())
1143 legibleScale *= page()->settings().textAutosizingFontScaleFactor();
1144 if (legibleScale < defaultScaleWhenAlreadyLegible)
1145 legibleScale = (scale == minimumPageScaleFactor()) ? defaultScaleWhe nAlreadyLegible : minimumPageScaleFactor();
1146
1147 float defaultMargin = doubleTapZoomContentDefaultMargin; 1147 float defaultMargin = doubleTapZoomContentDefaultMargin;
1148 float minimumMargin = doubleTapZoomContentMinimumMargin; 1148 float minimumMargin = doubleTapZoomContentMinimumMargin;
1149 // We want the margins to have the same physical size, which means we 1149 // We want the margins to have the same physical size, which means we
1150 // need to express them in post-scale size. To do that we'd need to know 1150 // need to express them in post-scale size. To do that we'd need to know
1151 // the scale we're scaling to, but that depends on the margins. Instead 1151 // the scale we're scaling to, but that depends on the margins. Instead
1152 // we express them as a fraction of the target rectangle: this will be 1152 // we express them as a fraction of the target rectangle: this will be
1153 // correct if we end up fully zooming to it, and won't matter if we 1153 // correct if we end up fully zooming to it, and won't matter if we
1154 // don't. 1154 // don't.
1155 rect = widenRectWithinPageBounds(rect, 1155 rect = widenRectWithinPageBounds(rect,
1156 static_cast<int>(defaultMargin * rect.width / m_size.width), 1156 static_cast<int>(defaultMargin * rect.width / m_size.width),
1157 static_cast<int>(minimumMargin * rect.width / m_size.width)); 1157 static_cast<int>(minimumMargin * rect.width / m_size.width));
1158 // Fit block to screen, respecting limits. 1158 // Fit block to screen, respecting limits.
1159 scale = static_cast<float>(m_size.width) / rect.width; 1159 scale = static_cast<float>(m_size.width) / rect.width;
1160 scale = min(scale, legibleScale); 1160 scale = min(scale, legibleScale());
1161 if (pageScaleFactor() < defaultScaleWhenAlreadyLegible)
1162 scale = max(scale, defaultScaleWhenAlreadyLegible);
1161 scale = clampPageScaleFactorToLimits(scale); 1163 scale = clampPageScaleFactorToLimits(scale);
1162
1163 scaleUnchanged = fabs(pageScaleFactor() - scale) < minScaleDifference;
1164 } 1164 }
1165 1165
1166 bool stillAtPreviousDoubleTapScale = (pageScaleFactor() == m_doubleTapZoomPa geScaleFactor
1167 && m_doubleTapZoomPageScaleFactor != minimumPageScaleFactor())
1168 || m_doubleTapZoomPending;
1169
1170 doubleTapShouldZoomOut = rect.isEmpty() || scaleUnchanged || stillAtPrevious DoubleTapScale;
1171
1172 // FIXME: If this is being called for auto zoom during find in page, 1166 // FIXME: If this is being called for auto zoom during find in page,
1173 // then if the user manually zooms in it'd be nice to preserve the 1167 // then if the user manually zooms in it'd be nice to preserve the
1174 // relative increase in zoom they caused (if they zoom out then it's ok 1168 // relative increase in zoom they caused (if they zoom out then it's ok
1175 // to zoom them back in again). This isn't compatible with our current 1169 // to zoom them back in again). This isn't compatible with our current
1176 // double-tap zoom strategy (fitting the containing block to the screen) 1170 // double-tap zoom strategy (fitting the containing block to the screen)
1177 // though. 1171 // though.
1178 1172
1179 float screenWidth = m_size.width / scale; 1173 float screenWidth = m_size.width / scale;
1180 float screenHeight = m_size.height / scale; 1174 float screenHeight = m_size.height / scale;
1181 1175
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1261 void WebViewImpl::animateDoubleTapZoom(const IntPoint& point) 1255 void WebViewImpl::animateDoubleTapZoom(const IntPoint& point)
1262 { 1256 {
1263 if (!mainFrameImpl()) 1257 if (!mainFrameImpl())
1264 return; 1258 return;
1265 1259
1266 WebRect rect(point.x(), point.y(), touchPointPadding, touchPointPadding); 1260 WebRect rect(point.x(), point.y(), touchPointPadding, touchPointPadding);
1267 WebRect blockBounds = computeBlockBounds(rect, false); 1261 WebRect blockBounds = computeBlockBounds(rect, false);
1268 1262
1269 float scale; 1263 float scale;
1270 WebPoint scroll; 1264 WebPoint scroll;
1271 bool doubleTapShouldZoomOut;
1272 1265
1273 computeScaleAndScrollForBlockRect(blockBounds, touchPointPadding, scale, scr oll, doubleTapShouldZoomOut); 1266 computeScaleAndScrollForBlockRect(blockBounds, touchPointPadding, minimumPag eScaleFactor() * doubleTapZoomAlreadyLegibleRatio, scale, scroll);
1267
1268 bool stillAtPreviousDoubleTapScale = (pageScaleFactor() == m_doubleTapZoomPa geScaleFactor
1269 && m_doubleTapZoomPageScaleFactor != minimumPageScaleFactor())
1270 || m_doubleTapZoomPending;
1271
1272 bool scaleUnchanged = fabs(pageScaleFactor() - scale) < minScaleDifference;
1273 bool shouldZoomOut = blockBounds.isEmpty() || scaleUnchanged || stillAtPrevi ousDoubleTapScale;
1274 1274
1275 bool isAnimating; 1275 bool isAnimating;
1276 1276
1277 if (doubleTapShouldZoomOut) { 1277 if (shouldZoomOut) {
1278 scale = minimumPageScaleFactor(); 1278 scale = minimumPageScaleFactor();
1279 isAnimating = startPageScaleAnimation(mainFrameImpl()->frameView()->wind owToContents(point), true, scale, doubleTapZoomAnimationDurationInSeconds); 1279 isAnimating = startPageScaleAnimation(mainFrameImpl()->frameView()->wind owToContents(point), true, scale, doubleTapZoomAnimationDurationInSeconds);
1280 } else { 1280 } else {
1281 isAnimating = startPageScaleAnimation(scroll, false, scale, doubleTapZoo mAnimationDurationInSeconds); 1281 isAnimating = startPageScaleAnimation(scroll, false, scale, doubleTapZoo mAnimationDurationInSeconds);
1282 } 1282 }
1283 1283
1284 if (isAnimating) { 1284 if (isAnimating) {
1285 m_doubleTapZoomPageScaleFactor = scale; 1285 m_doubleTapZoomPageScaleFactor = scale;
1286 m_doubleTapZoomPending = true; 1286 m_doubleTapZoomPending = true;
1287 } 1287 }
1288 } 1288 }
1289 1289
1290 void WebViewImpl::zoomToFindInPageRect(const WebRect& rect) 1290 void WebViewImpl::zoomToFindInPageRect(const WebRect& rect)
1291 { 1291 {
1292 if (!mainFrameImpl()) 1292 if (!mainFrameImpl())
1293 return; 1293 return;
1294 1294
1295 WebRect blockBounds = computeBlockBounds(rect, true); 1295 WebRect blockBounds = computeBlockBounds(rect, true);
1296 1296
1297 if (blockBounds.isEmpty()) { 1297 if (blockBounds.isEmpty()) {
1298 // Keep current scale (no need to scroll as x,y will normally already 1298 // Keep current scale (no need to scroll as x,y will normally already
1299 // be visible). FIXME: Revisit this if it isn't always true. 1299 // be visible). FIXME: Revisit this if it isn't always true.
1300 return; 1300 return;
1301 } 1301 }
1302 1302
1303 float scale; 1303 float scale;
1304 WebPoint scroll; 1304 WebPoint scroll;
1305 bool doubleTapShouldZoomOut;
1306 1305
1307 computeScaleAndScrollForBlockRect(blockBounds, nonUserInitiatedPointPadding, scale, scroll, doubleTapShouldZoomOut); 1306 computeScaleAndScrollForBlockRect(blockBounds, nonUserInitiatedPointPadding, minimumPageScaleFactor(), scale, scroll);
1308 1307
1309 startPageScaleAnimation(scroll, false, scale, findInPageAnimationDurationInS econds); 1308 startPageScaleAnimation(scroll, false, scale, findInPageAnimationDurationInS econds);
1310 } 1309 }
1311 1310
1312 bool WebViewImpl::zoomToMultipleTargetsRect(const WebRect& rect) 1311 bool WebViewImpl::zoomToMultipleTargetsRect(const WebRect& rect)
1313 { 1312 {
1314 if (!mainFrameImpl()) 1313 if (!mainFrameImpl())
1315 return false; 1314 return false;
1316 1315
1317 float scale; 1316 float scale;
1318 WebPoint scroll; 1317 WebPoint scroll;
1319 bool doubleTapShouldZoomOut;
1320 1318
1321 computeScaleAndScrollForBlockRect(rect, nonUserInitiatedPointPadding, scale, scroll, doubleTapShouldZoomOut); 1319 computeScaleAndScrollForBlockRect(rect, nonUserInitiatedPointPadding, minimu mPageScaleFactor(), scale, scroll);
1322 1320
1323 if (scale <= pageScaleFactor()) 1321 if (scale <= pageScaleFactor())
1324 return false; 1322 return false;
1325 1323
1326 startPageScaleAnimation(scroll, false, scale, multipleTargetsZoomAnimationDu rationInSeconds); 1324 startPageScaleAnimation(scroll, false, scale, multipleTargetsZoomAnimationDu rationInSeconds);
1327 return true; 1325 return true;
1328 } 1326 }
1329 1327
1330 void WebViewImpl::numberOfWheelEventHandlersChanged(unsigned numberOfWheelHandle rs) 1328 void WebViewImpl::numberOfWheelEventHandlersChanged(unsigned numberOfWheelHandle rs)
1331 { 1329 {
(...skipping 2779 matching lines...) Expand 10 before | Expand all | Expand 10 after
4111 } 4109 }
4112 4110
4113 bool WebViewImpl::shouldDisableDesktopWorkarounds() 4111 bool WebViewImpl::shouldDisableDesktopWorkarounds()
4114 { 4112 {
4115 ViewportArguments arguments = mainFrameImpl()->frame()->document()->viewport Arguments(); 4113 ViewportArguments arguments = mainFrameImpl()->frame()->document()->viewport Arguments();
4116 return arguments.width == ViewportArguments::ValueDeviceWidth || !arguments. userZoom 4114 return arguments.width == ViewportArguments::ValueDeviceWidth || !arguments. userZoom
4117 || (arguments.minZoom == arguments.maxZoom && arguments.minZoom != Viewp ortArguments::ValueAuto); 4115 || (arguments.minZoom == arguments.maxZoom && arguments.minZoom != Viewp ortArguments::ValueAuto);
4118 } 4116 }
4119 4117
4120 } // namespace WebKit 4118 } // namespace WebKit
OLDNEW
« no previous file with comments | « Source/web/WebViewImpl.h ('k') | Source/web/tests/WebFrameTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698