Index: Source/web/tests/WebFrameTest.cpp |
diff --git a/Source/web/tests/WebFrameTest.cpp b/Source/web/tests/WebFrameTest.cpp |
index a9e9a3c76aba8cc68ca45eeeb93d0c77bb501ba7..f7cadc04343ecbd92f9c27232e26bf0e65ee4df9 100644 |
--- a/Source/web/tests/WebFrameTest.cpp |
+++ b/Source/web/tests/WebFrameTest.cpp |
@@ -96,6 +96,8 @@ using WebKit::FrameTestHelpers::runPendingTasks; |
namespace { |
+const int touchPointPadding = 32; |
+ |
#define EXPECT_EQ_RECT(a, b) \ |
EXPECT_EQ(a.x(), b.x()); \ |
EXPECT_EQ(a.y(), b.y()); \ |
@@ -1170,55 +1172,71 @@ TEST_F(WebFrameTest, DivAutoZoomParamsTest) |
WebRect wideDiv(200, 100, 400, 150); |
WebRect tallDiv(200, 300, 400, 800); |
- WebRect doubleTapPointWide(wideDiv.x + 50, wideDiv.y + 50, 0, 0); |
- WebRect doubleTapPointTall(tallDiv.x + 50, tallDiv.y + 50, 0, 0); |
+ WebRect doubleTapPointWide(wideDiv.x + 50, wideDiv.y + 50, touchPointPadding, touchPointPadding); |
+ WebRect doubleTapPointTall(tallDiv.x + 50, tallDiv.y + 50, touchPointPadding, touchPointPadding); |
+ WebRect wideBlockBounds; |
+ WebRect tallBlockBounds; |
float scale; |
WebPoint scroll; |
- bool isAnchor; |
+ bool doubleTapShouldZoomOut; |
WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(m_webView); |
// Test double-tap zooming into wide div. |
- webViewImpl->computeScaleAndScrollForHitRect(doubleTapPointWide, WebViewImpl::DoubleTap, scale, scroll, isAnchor); |
+ wideBlockBounds = webViewImpl->computeBlockBounds(doubleTapPointWide, false); |
+ webViewImpl->computeScaleAndScrollForBlockRect(wideBlockBounds, touchPointPadding, scale, scroll, doubleTapShouldZoomOut); |
// The div should horizontally fill the screen (modulo margins), and |
// vertically centered (modulo integer rounding). |
EXPECT_NEAR(viewportWidth / (float) wideDiv.width, scale, 0.1); |
EXPECT_NEAR(wideDiv.x, scroll.x, 20); |
EXPECT_EQ(0, scroll.y); |
- EXPECT_FALSE(isAnchor); |
+ EXPECT_FALSE(doubleTapShouldZoomOut); |
setScaleAndScrollAndLayout(webViewImpl, scroll, scale); |
// Test zoom out back to minimum scale. |
- webViewImpl->computeScaleAndScrollForHitRect(doubleTapPointWide, WebViewImpl::DoubleTap, scale, scroll, isAnchor); |
- EXPECT_FLOAT_EQ(webViewImpl->minimumPageScaleFactor(), scale); |
- EXPECT_TRUE(isAnchor); |
+ wideBlockBounds = webViewImpl->computeBlockBounds(doubleTapPointWide, false); |
+ webViewImpl->computeScaleAndScrollForBlockRect(wideBlockBounds, touchPointPadding, scale, scroll, doubleTapShouldZoomOut); |
+ EXPECT_TRUE(doubleTapShouldZoomOut); |
+ scale = webViewImpl->minimumPageScaleFactor(); |
setScaleAndScrollAndLayout(webViewImpl, WebPoint(0, 0), scale); |
// Test double-tap zooming into tall div. |
- webViewImpl->computeScaleAndScrollForHitRect(doubleTapPointTall, WebViewImpl::DoubleTap, scale, scroll, isAnchor); |
+ tallBlockBounds = webViewImpl->computeBlockBounds(doubleTapPointTall, false); |
+ webViewImpl->computeScaleAndScrollForBlockRect(tallBlockBounds, touchPointPadding, scale, scroll, doubleTapShouldZoomOut); |
// The div should start at the top left of the viewport. |
EXPECT_NEAR(viewportWidth / (float) tallDiv.width, scale, 0.1); |
EXPECT_NEAR(tallDiv.x, scroll.x, 20); |
EXPECT_NEAR(tallDiv.y, scroll.y, 20); |
- EXPECT_FALSE(isAnchor); |
+ EXPECT_FALSE(doubleTapShouldZoomOut); |
// Test for Non-doubletap scaling |
// Test zooming into div. |
- webViewImpl->computeScaleAndScrollForHitRect(WebRect(250, 250, 10, 10), WebViewImpl::FindInPage, scale, scroll, isAnchor); |
+ webViewImpl->computeScaleAndScrollForBlockRect(webViewImpl->computeBlockBounds(WebRect(250, 250, 10, 10), true), 0, scale, scroll, doubleTapShouldZoomOut); |
EXPECT_NEAR(viewportWidth / (float) wideDiv.width, scale, 0.1); |
} |
-void simulateDoubleTap(WebViewImpl* webViewImpl, WebPoint& point, float& scale) |
+void simulatePageScale(WebViewImpl* webViewImpl, float& scale) |
{ |
- webViewImpl->animateZoomAroundPoint(point, WebViewImpl::DoubleTap); |
- EXPECT_TRUE(webViewImpl->fakeDoubleTapAnimationPendingForTesting()); |
- WebCore::IntSize scrollDelta = webViewImpl->fakeDoubleTapTargetPositionForTesting() - webViewImpl->mainFrameImpl()->frameView()->scrollPosition(); |
- float scaleDelta = webViewImpl->fakeDoubleTapPageScaleFactorForTesting() / webViewImpl->pageScaleFactor(); |
+ WebCore::IntSize scrollDelta = webViewImpl->fakePageScaleAnimationTargetPositionForTesting() - webViewImpl->mainFrameImpl()->frameView()->scrollPosition(); |
+ float scaleDelta = webViewImpl->fakePageScaleAnimationPageScaleForTesting() / webViewImpl->pageScaleFactor(); |
webViewImpl->applyScrollAndScale(scrollDelta, scaleDelta); |
scale = webViewImpl->pageScaleFactor(); |
} |
+void simulateMultiTargetZoom(WebViewImpl* webViewImpl, const WebRect& rect, float& scale) |
+{ |
+ if (webViewImpl->zoomToMultipleTargetsRect(rect)) |
+ simulatePageScale(webViewImpl, scale); |
+} |
+ |
+void simulateDoubleTap(WebViewImpl* webViewImpl, WebPoint& point, float& scale) |
+{ |
+ webViewImpl->animateDoubleTapZoom(point); |
+ EXPECT_TRUE(webViewImpl->fakeDoubleTapAnimationPendingForTesting()); |
+ simulatePageScale(webViewImpl, scale); |
+} |
+ |
TEST_F(WebFrameTest, DivAutoZoomMultipleDivsTest) |
{ |
registerMockedHttpURLLoad("get_multiple_divs_for_auto_zoom_test.html"); |
@@ -1236,7 +1254,7 @@ TEST_F(WebFrameTest, DivAutoZoomMultipleDivsTest) |
m_webView->layout(); |
WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(m_webView); |
- webViewImpl->enableFakeDoubleTapAnimationForTesting(true); |
+ webViewImpl->enableFakePageScaleAnimationForTesting(true); |
WebRect topDiv(200, 100, 200, 150); |
WebRect bottomDiv(200, 300, 200, 150); |
@@ -1263,7 +1281,7 @@ TEST_F(WebFrameTest, DivAutoZoomMultipleDivsTest) |
// If we didn't yet get an auto-zoom update and a second double-tap arrives, should go back to minimum scale. |
webViewImpl->applyScrollAndScale(WebSize(), 1.1f); |
- webViewImpl->animateZoomAroundPoint(topPoint, WebViewImpl::DoubleTap); |
+ webViewImpl->animateDoubleTapZoom(topPoint); |
EXPECT_TRUE(webViewImpl->fakeDoubleTapAnimationPendingForTesting()); |
simulateDoubleTap(webViewImpl, bottomPoint, scale); |
EXPECT_FLOAT_EQ(webViewImpl->minimumPageScaleFactor(), scale); |
@@ -1283,7 +1301,7 @@ TEST_F(WebFrameTest, DivAutoZoomScaleBoundsTest) |
m_webView->layout(); |
WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(m_webView); |
- webViewImpl->enableFakeDoubleTapAnimationForTesting(true); |
+ webViewImpl->enableFakePageScaleAnimationForTesting(true); |
WebRect div(200, 100, 200, 150); |
WebPoint doubleTapPoint(div.x + 50, div.y + 50); |
@@ -1345,7 +1363,7 @@ TEST_F(WebFrameTest, DivAutoZoomScaleFontScaleFactorTest) |
m_webView->layout(); |
WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(m_webView); |
- webViewImpl->enableFakeDoubleTapAnimationForTesting(true); |
+ webViewImpl->enableFakePageScaleAnimationForTesting(true); |
webViewImpl->page()->settings()->setTextAutosizingFontScaleFactor(textAutosizingFontScaleFactor); |
WebRect div(200, 100, 200, 150); |
@@ -1409,6 +1427,42 @@ TEST_F(WebFrameTest, DivAutoZoomScaleFontScaleFactorTest) |
EXPECT_FLOAT_EQ(legibleScale, scale); |
} |
+TEST_F(WebFrameTest, DivMultipleTargetZoomMultipleDivsTest) |
+{ |
+ registerMockedHttpURLLoad("get_multiple_divs_for_auto_zoom_test.html"); |
+ |
+ const float deviceScaleFactor = 2.0f; |
+ int viewportWidth = 640 / deviceScaleFactor; |
+ int viewportHeight = 1280 / deviceScaleFactor; |
+ float doubleTapZoomAlreadyLegibleRatio = 1.2f; |
+ m_webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "get_multiple_divs_for_auto_zoom_test.html"); |
+ m_webView->enableFixedLayoutMode(true); |
+ m_webView->resize(WebSize(viewportWidth, viewportHeight)); |
+ m_webView->setPageScaleFactorLimits(0.5f, 4); |
+ m_webView->setDeviceScaleFactor(deviceScaleFactor); |
+ m_webView->setPageScaleFactor(0.5f, WebPoint(0, 0)); |
+ m_webView->layout(); |
+ |
+ WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(m_webView); |
+ webViewImpl->enableFakePageScaleAnimationForTesting(true); |
+ |
+ WebRect viewportRect(0, 0, viewportWidth, viewportHeight); |
+ WebRect topDiv(200, 100, 200, 150); |
+ WebRect bottomDiv(200, 300, 200, 150); |
+ float scale; |
+ setScaleAndScrollAndLayout(webViewImpl, WebPoint(0, 0), (webViewImpl->minimumPageScaleFactor()) * (1 + doubleTapZoomAlreadyLegibleRatio) / 2); |
+ |
+ simulateMultiTargetZoom(webViewImpl, topDiv, scale); |
+ EXPECT_FLOAT_EQ(1, scale); |
+ simulateMultiTargetZoom(webViewImpl, bottomDiv, scale); |
+ EXPECT_FLOAT_EQ(1, scale); |
+ simulateMultiTargetZoom(webViewImpl, viewportRect, scale); |
+ EXPECT_FLOAT_EQ(1, scale); |
+ webViewImpl->setPageScaleFactor(webViewImpl->minimumPageScaleFactor(), WebPoint(0, 0)); |
+ simulateMultiTargetZoom(webViewImpl, topDiv, scale); |
+ EXPECT_FLOAT_EQ(1, scale); |
+} |
+ |
TEST_F(WebFrameTest, DivScrollIntoEditableTest) |
{ |
registerMockedHttpURLLoad("get_scale_for_zoom_into_editable_test.html"); |
@@ -1427,7 +1481,7 @@ TEST_F(WebFrameTest, DivScrollIntoEditableTest) |
m_webView->settings()->setAutoZoomFocusedNodeToLegibleScale(true); |
WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(m_webView); |
- webViewImpl->enableFakeDoubleTapAnimationForTesting(true); |
+ webViewImpl->enableFakePageScaleAnimationForTesting(true); |
WebRect editBoxWithText(200, 200, 250, 20); |
WebRect editBoxWithNoText(200, 250, 250, 20); |