TEST_F(WebFrameTest, ReloadWithOverrideURLPreservesState) { const std::string firstURL = "find.html"; const std::string secondURL = "form.html"; const std::string thirdURL = "history.html"; const float pageScaleFactor = 1.1684f; const int pageWidth = 640; const int pageHeight = 480; registerMockedHttpURLLoad(firstURL); registerMockedHttpURLLoad(secondURL); registerMockedHttpURLLoad(thirdURL); WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(FrameTestHelpers::createWebViewAndLoad(m_baseURL + firstURL, true)); webViewImpl->resize(WebSize(pageWidth, pageHeight)); webViewImpl->mainFrame()->setScrollOffset(WebSize(pageWidth / 4, pageHeight / 4)); webViewImpl->setPageScaleFactorPreservingScrollOffset(pageScaleFactor); WebSize previousOffset = webViewImpl->mainFrame()->scrollOffset(); float previousScale = webViewImpl->pageScaleFactor(); // Reload the page using the cache. webViewImpl->mainFrame()->reloadWithOverrideURL(toKURL(m_baseURL + secondURL), false); webkit_support::ServeAsynchronousMockedRequests(); ASSERT_EQ(previousOffset, webViewImpl->mainFrame()->scrollOffset()); ASSERT_EQ(previousScale, webViewImpl->pageScaleFactor()); // Reload the page while ignoring the cache. webViewImpl->mainFrame()->reloadWithOverrideURL(toKURL(m_baseURL + thirdURL), true); webkit_support::ServeAsynchronousMockedRequests(); ASSERT_EQ(previousOffset, webViewImpl->mainFrame()->scrollOffset()); ASSERT_EQ(previousScale, webViewImpl->pageScaleFactor()); }
TEST_F(ProgrammaticScrollTest, RestoreScrollPositionAndViewStateWithoutScale) { registerMockedHttpURLLoad("long_scroll.html"); FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "long_scroll.html", true, 0, 0); webView->resize(WebSize(1000, 1000)); webView->updateAllLifecyclePhases(); WebViewImpl* webViewImpl = toWebViewImpl(webView); FrameLoader& loader = webViewImpl->mainFrameImpl()->frame()->loader(); loader.setLoadType(FrameLoadTypeBackForward); webViewImpl->setPageScaleFactor(3.0f); webViewImpl->mainFrame()->setScrollOffset(WebSize(0, 500)); loader.documentLoader()->initialScrollState().wasScrolledByUser = false; loader.currentItem()->setPageScaleFactor(0); loader.currentItem()->setScrollPoint(WebPoint(0, 400)); // FrameLoader::restoreScrollPositionAndViewState flows differently if scale is zero. loader.restoreScrollPositionAndViewState(); // Expect that only the scroll position was restored. EXPECT_EQ(3.0f, webViewImpl->pageScaleFactor()); EXPECT_EQ(400, webViewImpl->mainFrameImpl()->scrollOffset().height); }
TEST_F(ProgrammaticScrollTest, RestoreScrollPositionAndViewStateWithScale) { registerMockedHttpURLLoad("long_scroll.html"); FrameTestHelpers::WebViewHelper webViewHelper; WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "long_scroll.html", true, 0, 0); webView->resize(WebSize(1000, 1000)); webView->updateAllLifecyclePhases(); WebViewImpl* webViewImpl = toWebViewImpl(webView); FrameLoader& loader = webViewImpl->mainFrameImpl()->frame()->loader(); loader.setLoadType(FrameLoadTypeBackForward); webViewImpl->setPageScaleFactor(3.0f); webViewImpl->mainFrame()->setScrollOffset(WebSize(0, 500)); loader.documentLoader()->initialScrollState().wasScrolledByUser = false; loader.currentItem()->setPageScaleFactor(2); loader.currentItem()->setScrollPoint(WebPoint(0, 200)); // Flip back the wasScrolledByUser flag which was set to true by setPageScaleFactor // because otherwise FrameLoader::restoreScrollPositionAndViewState does nothing. loader.documentLoader()->initialScrollState().wasScrolledByUser = false; loader.restoreScrollPositionAndViewState(); // Expect that both scroll and scale were restored. EXPECT_EQ(2.0f, webViewImpl->pageScaleFactor()); EXPECT_EQ(200, webViewImpl->mainFrameImpl()->scrollOffset().height); }
TEST_F(WebFrameTest, FixedLayoutInitializeAtMinimumPageScale) { registerMockedHttpURLLoad("fixed_layout.html"); FixedLayoutTestWebViewClient client; client.m_screenInfo.horizontalDPI = 160; int viewportWidth = 640; int viewportHeight = 480; client.m_windowRect = WebRect(0, 0, viewportWidth, viewportHeight); // Make sure we initialize to minimum scale, even if the window size // only becomes available after the load begins. WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(FrameTestHelpers::createWebViewAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client)); webViewImpl->enableFixedLayoutMode(true); webViewImpl->settings()->setViewportEnabled(true); webViewImpl->resize(WebSize(viewportWidth, viewportHeight)); int defaultFixedLayoutWidth = 980; float minimumPageScaleFactor = viewportWidth / (float) defaultFixedLayoutWidth; EXPECT_EQ(minimumPageScaleFactor, webViewImpl->pageScaleFactor()); // Assume the user has pinch zoomed to page scale factor 2. float userPinchPageScaleFactor = 2; webViewImpl->setPageScaleFactorPreservingScrollOffset(userPinchPageScaleFactor); webViewImpl->mainFrameImpl()->frameView()->layout(); // Make sure we don't reset to initial scale if the page continues to load. bool isNewNavigation; webViewImpl->didCommitLoad(&isNewNavigation, false); webViewImpl->didChangeContentsSize(); EXPECT_EQ(userPinchPageScaleFactor, webViewImpl->pageScaleFactor()); // Make sure we don't reset to initial scale if the viewport size changes. webViewImpl->resize(WebSize(viewportWidth, viewportHeight + 100)); EXPECT_EQ(userPinchPageScaleFactor, webViewImpl->pageScaleFactor()); }
TEST_F(WebFrameTest, DivAutoZoomParamsTest) { registerMockedHttpURLLoad("get_scale_for_auto_zoom_into_div_test.html"); WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(FrameTestHelpers::createWebViewAndLoad(m_baseURL + "get_scale_for_auto_zoom_into_div_test.html", true)); int pageWidth = 640; int pageHeight = 480; int divPosX = 200; int divPosY = 200; int divWidth = 200; int divHeight = 150; WebRect doubleTapPoint(250, 250, 0, 0); webViewImpl->resize(WebSize(pageWidth, pageHeight)); float scale; WebPoint scroll; // Test for Doubletap scaling // Tests for zooming in and out without clamping. // Set device scale and scale limits so we dont get clamped. webViewImpl->setDeviceScaleFactor(4); webViewImpl->setPageScaleFactorLimits(0, 4 / webViewImpl->deviceScaleFactor()); // Test zooming into div. webViewImpl->computeScaleAndScrollForHitRect(doubleTapPoint, WebViewImpl::DoubleTap, scale, scroll); float scaledDivWidth = divWidth * scale; float scaledDivHeight = divHeight * scale; int hScroll = ((divPosX * scale) - ((pageWidth - scaledDivWidth) / 2)) / scale; int vScroll = ((divPosY * scale) - ((pageHeight - scaledDivHeight) / 2)) / scale; EXPECT_NEAR(pageWidth / divWidth, scale, 0.1); EXPECT_EQ(hScroll, scroll.x); EXPECT_EQ(vScroll, scroll.y); // Test zoom out to overview scale. webViewImpl->applyScrollAndScale(WebSize(scroll.x, scroll.y), scale / webViewImpl->pageScaleFactor()); webViewImpl->computeScaleAndScrollForHitRect(doubleTapPoint, WebViewImpl::DoubleTap, scale, scroll); EXPECT_FLOAT_EQ(1, scale); EXPECT_EQ(WebPoint(0, 0), scroll); // Tests for clamped scaling. // Test clamp to device scale: webViewImpl->applyScrollAndScale(WebSize(scroll.x, scroll.y), scale / webViewImpl->pageScaleFactor()); webViewImpl->setDeviceScaleFactor(2.5); webViewImpl->computeScaleAndScrollForHitRect(doubleTapPoint, WebViewImpl::DoubleTap, scale, scroll); EXPECT_FLOAT_EQ(2.5, scale); // Test clamp to minimum scale: webViewImpl->applyScrollAndScale(WebSize(scroll.x, scroll.y), scale / webViewImpl->pageScaleFactor()); webViewImpl->setPageScaleFactorLimits(1.5 / webViewImpl->deviceScaleFactor(), 4 / webViewImpl->deviceScaleFactor()); webViewImpl->computeScaleAndScrollForHitRect(doubleTapPoint, WebViewImpl::DoubleTap, scale, scroll); EXPECT_FLOAT_EQ(1.5, scale); EXPECT_EQ(WebPoint(0, 0), scroll); // Test clamp to maximum scale: webViewImpl->applyScrollAndScale(WebSize(scroll.x, scroll.y), scale / webViewImpl->pageScaleFactor()); webViewImpl->setDeviceScaleFactor(4); webViewImpl->setPageScaleFactorLimits(0, 3 / webViewImpl->deviceScaleFactor()); webViewImpl->computeScaleAndScrollForHitRect(doubleTapPoint, WebViewImpl::DoubleTap, scale, scroll); EXPECT_FLOAT_EQ(3, scale); // Test for Non-doubletap scaling webViewImpl->setPageScaleFactor(1, WebPoint(0, 0)); webViewImpl->setDeviceScaleFactor(4); webViewImpl->setPageScaleFactorLimits(0, 4 / webViewImpl->deviceScaleFactor()); // Test zooming into div. webViewImpl->computeScaleAndScrollForHitRect(WebRect(250, 250, 10, 10), WebViewImpl::FindInPage, scale, scroll); EXPECT_NEAR(pageWidth / divWidth, scale, 0.1); // Drop any pending fake mouse events from zooming before leaving the test. webViewImpl->page()->mainFrame()->eventHandler()->clear(); }