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

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::computeLegibleScale()
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 const float defaultScaleWhenAlreadyLegible = minimumPageScaleFactor() * doub leTapZoomAlreadyLegibleRatio;
1134 float legibleScale = 1;
1135 if (page())
1136 legibleScale *= page()->settings().textAutosizingFontScaleFactor();
1137 if (legibleScale < defaultScaleWhenAlreadyLegible)
aelias_OOO_until_Jul13 2013/08/29 00:19:32 Delete these two lines.
1138 legibleScale = (pageScaleFactor() == minimumPageScaleFactor()) ? default ScaleWhenAlreadyLegible : minimumPageScaleFactor();
1139 return legibleScale;
1140 }
1141
1142 void WebViewImpl::computeScaleAndScrollForBlockRect(const WebRect& blockRect, fl oat padding, float& scale, WebPoint& scroll)
aelias_OOO_until_Jul13 2013/08/29 00:19:32 Come to think of it, the defaultScaleWhenAlreadyLe
1128 { 1143 {
1129 scale = pageScaleFactor(); 1144 scale = pageScaleFactor();
1130 scroll.x = scroll.y = 0; 1145 scroll.x = scroll.y = 0;
1131 1146
1132 WebRect rect = blockRect; 1147 WebRect rect = blockRect;
1133 1148
1134 bool scaleUnchanged = true;
1135 if (!rect.isEmpty()) { 1149 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; 1150 float defaultMargin = doubleTapZoomContentDefaultMargin;
1148 float minimumMargin = doubleTapZoomContentMinimumMargin; 1151 float minimumMargin = doubleTapZoomContentMinimumMargin;
1149 // We want the margins to have the same physical size, which means we 1152 // 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 1153 // 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 1154 // 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 1155 // 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 1156 // correct if we end up fully zooming to it, and won't matter if we
1154 // don't. 1157 // don't.
1155 rect = widenRectWithinPageBounds(rect, 1158 rect = widenRectWithinPageBounds(rect,
1156 static_cast<int>(defaultMargin * rect.width / m_size.width), 1159 static_cast<int>(defaultMargin * rect.width / m_size.width),
1157 static_cast<int>(minimumMargin * rect.width / m_size.width)); 1160 static_cast<int>(minimumMargin * rect.width / m_size.width));
1158 // Fit block to screen, respecting limits. 1161 // Fit block to screen, respecting limits.
1159 scale = static_cast<float>(m_size.width) / rect.width; 1162 scale = static_cast<float>(m_size.width) / rect.width;
1160 scale = min(scale, legibleScale); 1163 scale = min(scale, computeLegibleScale());
aelias_OOO_until_Jul13 2013/08/29 00:19:32 Immediately after this line add the lines: if (pa
1161 scale = clampPageScaleFactorToLimits(scale); 1164 scale = clampPageScaleFactorToLimits(scale);
1162
1163 scaleUnchanged = fabs(pageScaleFactor() - scale) < minScaleDifference;
1164 } 1165 }
1165 1166
1166 bool stillAtPreviousDoubleTapScale = (pageScaleFactor() == m_doubleTapZoomPa geScaleFactor
1167 && m_doubleTapZoomPageScaleFactor != minimumPageScaleFactor())
1168 || m_doubleTapZoomPending;
1169
1170 doubleTapShouldZoomOut = rect.isEmpty() || scaleUnchanged || stillAtPrevious DoubleTapScale;
aelias_OOO_until_Jul13 2013/08/29 00:19:32 Good idea, there was no reason to keep this in thi
1171
1172 // FIXME: If this is being called for auto zoom during find in page, 1167 // 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 1168 // 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 1169 // 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 1170 // 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) 1171 // double-tap zoom strategy (fitting the containing block to the screen)
1177 // though. 1172 // though.
1178 1173
1179 float screenWidth = m_size.width / scale; 1174 float screenWidth = m_size.width / scale;
1180 float screenHeight = m_size.height / scale; 1175 float screenHeight = m_size.height / scale;
1181 1176
1182 // Scroll to vertically align the block. 1177 // Scroll to vertically align the block.
1183 if (rect.height < screenHeight) { 1178 if (rect.height < screenHeight) {
1184 // Vertically center short blocks. 1179 // Vertically center short blocks.
1185 rect.y -= 0.5 * (screenHeight - rect.height); 1180 rect.y -= 0.5 * (screenHeight - rect.height);
1186 } else { 1181 } else {
1187 // Ensure position we're zooming to (+ padding) isn't off the bottom of 1182 // Ensure position we're zooming to (+ padding) isn't off the bottom of
1188 // the screen. 1183 // the screen.
1189 rect.y = max<float>(rect.y, blockRect.y + padding - screenHeight); 1184 rect.y = max<float>(rect.y, blockRect.y + padding - screenHeight);
1190 } // Otherwise top align the block. 1185 } // Otherwise top align the block.
1191 1186
1192 // Do the same thing for horizontal alignment. 1187 // Do the same thing for horizontal alignment.
1193 if (rect.width < screenWidth) 1188 if (rect.width < screenWidth)
1194 rect.x -= 0.5 * (screenWidth - rect.width); 1189 rect.x -= 0.5 * (screenWidth - rect.width);
1195 else 1190 else
1196 rect.x = max<float>(rect.x, blockRect.x + padding - screenWidth); 1191 rect.x = max<float>(rect.x, blockRect.x + padding - screenWidth);
1197 scroll.x = rect.x; 1192 scroll.x = rect.x;
1198 scroll.y = rect.y; 1193 scroll.y = rect.y;
1199 1194
1200 scale = clampPageScaleFactorToLimits(scale);
1201 scroll = mainFrameImpl()->frameView()->windowToContents(scroll); 1195 scroll = mainFrameImpl()->frameView()->windowToContents(scroll);
1202 scroll = clampOffsetAtScale(scroll, scale); 1196 scroll = clampOffsetAtScale(scroll, scale);
aelias_OOO_until_Jul13 2013/08/29 00:19:32 The amount of scaling must be finalized before thi
1203 } 1197 }
1204 1198
1205 static bool invokesHandCursor(Node* node, bool shiftKey, Frame* frame) 1199 static bool invokesHandCursor(Node* node, bool shiftKey, Frame* frame)
1206 { 1200 {
1207 if (!node || !node->renderer()) 1201 if (!node || !node->renderer())
1208 return false; 1202 return false;
1209 1203
1210 ECursor cursor = node->renderer()->style()->cursor(); 1204 ECursor cursor = node->renderer()->style()->cursor();
1211 return cursor == CURSOR_POINTER 1205 return cursor == CURSOR_POINTER
1212 || (cursor == CURSOR_AUTO && frame->eventHandler()->useHandCursor(node, node->isLink(), shiftKey)); 1206 || (cursor == CURSOR_AUTO && frame->eventHandler()->useHandCursor(node, node->isLink(), shiftKey));
(...skipping 48 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, scale, scr oll);
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
1275 if ((blockBounds.isEmpty() || scaleUnchanged) && fabs(scale - minimumPageSca leFactor()) < minScaleDifference) {
aelias_OOO_until_Jul13 2013/08/29 00:19:32 Delete this block.
1276 scale = computeLegibleScale();
1277 shouldZoomOut = false;
1278 }
1274 1279
1275 bool isAnimating; 1280 bool isAnimating;
1276 1281
1277 if (doubleTapShouldZoomOut) { 1282 if (shouldZoomOut) {
1278 scale = minimumPageScaleFactor(); 1283 scale = minimumPageScaleFactor();
1279 isAnimating = startPageScaleAnimation(mainFrameImpl()->frameView()->wind owToContents(point), true, scale, doubleTapZoomAnimationDurationInSeconds); 1284 isAnimating = startPageScaleAnimation(mainFrameImpl()->frameView()->wind owToContents(point), true, scale, doubleTapZoomAnimationDurationInSeconds);
1280 } else { 1285 } else {
1281 isAnimating = startPageScaleAnimation(scroll, false, scale, doubleTapZoo mAnimationDurationInSeconds); 1286 isAnimating = startPageScaleAnimation(scroll, false, scale, doubleTapZoo mAnimationDurationInSeconds);
1282 } 1287 }
1283 1288
1284 if (isAnimating) { 1289 if (isAnimating) {
1285 m_doubleTapZoomPageScaleFactor = scale; 1290 m_doubleTapZoomPageScaleFactor = scale;
1286 m_doubleTapZoomPending = true; 1291 m_doubleTapZoomPending = true;
1287 } 1292 }
1288 } 1293 }
1289 1294
1290 void WebViewImpl::zoomToFindInPageRect(const WebRect& rect) 1295 void WebViewImpl::zoomToFindInPageRect(const WebRect& rect)
1291 { 1296 {
1292 if (!mainFrameImpl()) 1297 if (!mainFrameImpl())
1293 return; 1298 return;
1294 1299
1295 WebRect blockBounds = computeBlockBounds(rect, true); 1300 WebRect blockBounds = computeBlockBounds(rect, true);
1296 1301
1297 if (blockBounds.isEmpty()) { 1302 if (blockBounds.isEmpty()) {
1298 // Keep current scale (no need to scroll as x,y will normally already 1303 // 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. 1304 // be visible). FIXME: Revisit this if it isn't always true.
1300 return; 1305 return;
1301 } 1306 }
1302 1307
1303 float scale; 1308 float scale;
1304 WebPoint scroll; 1309 WebPoint scroll;
1305 bool doubleTapShouldZoomOut;
1306 1310
1307 computeScaleAndScrollForBlockRect(blockBounds, nonUserInitiatedPointPadding, scale, scroll, doubleTapShouldZoomOut); 1311 computeScaleAndScrollForBlockRect(blockBounds, nonUserInitiatedPointPadding, scale, scroll);
1308 1312
1309 startPageScaleAnimation(scroll, false, scale, findInPageAnimationDurationInS econds); 1313 startPageScaleAnimation(scroll, false, scale, findInPageAnimationDurationInS econds);
1310 } 1314 }
1311 1315
1312 bool WebViewImpl::zoomToMultipleTargetsRect(const WebRect& rect) 1316 bool WebViewImpl::zoomToMultipleTargetsRect(const WebRect& rect)
1313 { 1317 {
1314 if (!mainFrameImpl()) 1318 if (!mainFrameImpl())
1315 return false; 1319 return false;
1316 1320
1317 float scale; 1321 float scale;
1318 WebPoint scroll; 1322 WebPoint scroll;
1319 bool doubleTapShouldZoomOut;
1320 1323
1321 computeScaleAndScrollForBlockRect(rect, nonUserInitiatedPointPadding, scale, scroll, doubleTapShouldZoomOut); 1324 computeScaleAndScrollForBlockRect(rect, nonUserInitiatedPointPadding, scale, scroll);
1322 1325
1323 if (scale <= pageScaleFactor()) 1326 if (scale <= pageScaleFactor())
1324 return false; 1327 return false;
1325 1328
1326 startPageScaleAnimation(scroll, false, scale, multipleTargetsZoomAnimationDu rationInSeconds); 1329 startPageScaleAnimation(scroll, false, scale, multipleTargetsZoomAnimationDu rationInSeconds);
1327 return true; 1330 return true;
1328 } 1331 }
1329 1332
1330 void WebViewImpl::numberOfWheelEventHandlersChanged(unsigned numberOfWheelHandle rs) 1333 void WebViewImpl::numberOfWheelEventHandlersChanged(unsigned numberOfWheelHandle rs)
1331 { 1334 {
(...skipping 2779 matching lines...) Expand 10 before | Expand all | Expand 10 after
4111 } 4114 }
4112 4115
4113 bool WebViewImpl::shouldDisableDesktopWorkarounds() 4116 bool WebViewImpl::shouldDisableDesktopWorkarounds()
4114 { 4117 {
4115 ViewportArguments arguments = mainFrameImpl()->frame()->document()->viewport Arguments(); 4118 ViewportArguments arguments = mainFrameImpl()->frame()->document()->viewport Arguments();
4116 return arguments.width == ViewportArguments::ValueDeviceWidth || !arguments. userZoom 4119 return arguments.width == ViewportArguments::ValueDeviceWidth || !arguments. userZoom
4117 || (arguments.minZoom == arguments.maxZoom && arguments.minZoom != Viewp ortArguments::ValueAuto); 4120 || (arguments.minZoom == arguments.maxZoom && arguments.minZoom != Viewp ortArguments::ValueAuto);
4118 } 4121 }
4119 4122
4120 } // namespace WebKit 4123 } // 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