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

Unified Diff: Source/WebKit/chromium/tests/WebFrameTest.cpp

Issue 13704012: Improve mobile device rotation behavior. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: Source/WebKit/chromium/tests/WebFrameTest.cpp
diff --git a/Source/WebKit/chromium/tests/WebFrameTest.cpp b/Source/WebKit/chromium/tests/WebFrameTest.cpp
index d75bebc7d2075d71193097f00221c001beb0d53c..74fb471dc3f52488446bc825175836e78b5ca25c 100644
--- a/Source/WebKit/chromium/tests/WebFrameTest.cpp
+++ b/Source/WebKit/chromium/tests/WebFrameTest.cpp
@@ -37,6 +37,7 @@
#include "Frame.h"
#include "FrameTestHelpers.h"
#include "FrameView.h"
+#include "HitTestResult.h"
#include "PlatformContextSkia.h"
#include "Range.h"
#include "RenderView.h"
@@ -655,6 +656,144 @@ TEST_F(WebFrameTest, targetDensityDpiDevice)
}
}
+static WebCore::FloatSize computeRelativeOffset(const WebCore::IntPoint& absoluteOffset, const WebCore::LayoutRect& rect)
+{
+ WebCore::FloatSize relativeOffset = WebCore::FloatPoint(absoluteOffset) - rect.location();
+ relativeOffset.scale(1.f / rect.width(), 1.f / rect.height());
+ return relativeOffset;
+}
+
+TEST_F(WebFrameTest, ResizeYieldsCorrectScrollAndScaleForFixedLayout)
+{
+ registerMockedHttpURLLoad("resize_scroll_fixed_layout.html");
+
+ const WebSize viewportSize = WebSize(320, 240);
+
+ // With a fixed layout, pageScaleFactor scales by the relative change in viewport width.
+
+ m_webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "resize_scroll_fixed_layout.html", true);
+ m_webView->settings()->setViewportEnabled(true);
+ m_webView->enableFixedLayoutMode(true);
+ WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(m_webView);
+
+ // Resize at origin
+ float pageScaleFactor = 2.0f;
+ webViewImpl->resize(WebSize(viewportSize.width, viewportSize.height));
+ m_webView->setPageScaleFactor(pageScaleFactor, WebPoint());
+ webViewImpl->resize(WebSize(viewportSize.height, viewportSize.width));
+ EXPECT_EQ(pageScaleFactor * viewportSize.height / viewportSize.width, webViewImpl->pageScaleFactor());
+ EXPECT_EQ(WebSize(), webViewImpl->mainFrame()->scrollOffset());
+
+ // Rotation via resize
+ const WebSize scrollOffset = WebSize(200, 400);
+ pageScaleFactor = webViewImpl->pageScaleFactor();
+ webViewImpl->resize(WebSize(viewportSize.width, viewportSize.height));
+ EXPECT_EQ(pageScaleFactor * viewportSize.width / viewportSize.height, webViewImpl->pageScaleFactor());
+ webViewImpl->mainFrame()->setScrollOffset(scrollOffset);
+
+ WebCore::IntPoint anchorPoint = WebCore::IntPoint(scrollOffset) + WebCore::IntPoint(viewportSize.width / 2, 0);
+ RefPtr<WebCore::Node> anchorNode
+ = webViewImpl->mainFrameImpl()->frame()->eventHandler()->hitTestResultAtPoint(anchorPoint).innerNode();
+ ASSERT(anchorNode);
+
+ pageScaleFactor = webViewImpl->pageScaleFactor();
+ const WebCore::FloatSize preResizeRelativeOffset
+ = computeRelativeOffset(anchorPoint, anchorNode->boundingBox());
+ webViewImpl->resize(WebSize(viewportSize.height, viewportSize.width));
+ WebCore::IntPoint newAnchorPoint = WebCore::IntPoint(webViewImpl->mainFrame()->scrollOffset()) + WebCore::IntPoint(viewportSize.height / 2, 0);
+ const WebCore::FloatSize postResizeRelativeOffset
+ = computeRelativeOffset(newAnchorPoint, anchorNode->boundingBox());
+ EXPECT_NEAR(preResizeRelativeOffset.width(), postResizeRelativeOffset.width(), 0.1f);
+ EXPECT_EQ(pageScaleFactor * viewportSize.height / viewportSize.width, webViewImpl->pageScaleFactor());
+}
+
+TEST_F(WebFrameTest, ResizeYieldsCorrectScrollAndScaleForFixedWidth)
+{
+ registerMockedHttpURLLoad("resize_scroll_fixed_width.html");
+
+ const WebSize viewportSize = WebSize(320, 240);
+
+ // With a fixed width, pageScaleFactor scales by the relative change in viewport width.
+
+ m_webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "resize_scroll_fixed_width.html", true);
+ m_webView->settings()->setViewportEnabled(true);
+ WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(m_webView);
+
+ // Resize at origin
+ float pageScaleFactor = 2.0f;
+ webViewImpl->resize(WebSize(viewportSize.width, viewportSize.height));
+ m_webView->setPageScaleFactor(pageScaleFactor, WebPoint());
+ webViewImpl->resize(WebSize(viewportSize.height, viewportSize.width));
+ EXPECT_EQ(pageScaleFactor * viewportSize.height / viewportSize.width, webViewImpl->pageScaleFactor());
+ EXPECT_EQ(WebSize(), webViewImpl->mainFrame()->scrollOffset());
+
+ // Rotation via resize
+ const WebSize scrollOffset = WebSize(200, 400);
+ pageScaleFactor = webViewImpl->pageScaleFactor();
+ webViewImpl->resize(WebSize(viewportSize.width, viewportSize.height));
+ EXPECT_EQ(pageScaleFactor * viewportSize.width / viewportSize.height, webViewImpl->pageScaleFactor());
+ webViewImpl->mainFrame()->setScrollOffset(scrollOffset);
+
+ WebCore::IntPoint anchorPoint = WebCore::IntPoint(scrollOffset) + WebCore::IntPoint(viewportSize.width / 2, 0);
+ RefPtr<WebCore::Node> anchorNode
+ = webViewImpl->mainFrameImpl()->frame()->eventHandler()->hitTestResultAtPoint(anchorPoint).innerNode();
+ ASSERT(anchorNode);
+
+ pageScaleFactor = webViewImpl->pageScaleFactor();
+ const WebCore::FloatSize preResizeRelativeOffset
+ = computeRelativeOffset(anchorPoint, anchorNode->boundingBox());
+ webViewImpl->resize(WebSize(viewportSize.height, viewportSize.width));
+ WebCore::IntPoint newAnchorPoint = WebCore::IntPoint(webViewImpl->mainFrame()->scrollOffset()) + WebCore::IntPoint(viewportSize.height / 2, 0);
+ const WebCore::FloatSize postResizeRelativeOffset
+ = computeRelativeOffset(newAnchorPoint, anchorNode->boundingBox());
+ EXPECT_NEAR(preResizeRelativeOffset.width(), postResizeRelativeOffset.width(), 0.1f);
+ EXPECT_EQ(pageScaleFactor * viewportSize.height / viewportSize.width, webViewImpl->pageScaleFactor());
+}
+
+TEST_F(WebFrameTest, ResizeYieldsCorrectScrollAndScaleForWidthEqualsDeviceWidth)
+{
+ registerMockedHttpURLLoad("resize_scroll_mobile.html");
+
+ // With width=device-width, pageScaleFactor is preserved across resizes as
+ // long as the content adjusts according to the device-width.
+
+ const WebSize viewportSize = WebSize(240, 320);
+
+ m_webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "resize_scroll_mobile.html", true);
+ m_webView->settings()->setViewportEnabled(true);
+ m_webView->resize(WebSize(viewportSize.width, viewportSize.height));
+ WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(m_webView);
+
+ // Resize at origin
+ const float pageScaleFactor = 1;
+ m_webView->setPageScaleFactor(pageScaleFactor, WebPoint());
+ webViewImpl->resize(WebSize(viewportSize.width, viewportSize.height));
+ EXPECT_EQ(pageScaleFactor, webViewImpl->pageScaleFactor());
+ webViewImpl->resize(WebSize(viewportSize.height, viewportSize.width));
+ EXPECT_NEAR(pageScaleFactor, webViewImpl->pageScaleFactor(), 0.05f);
+ EXPECT_EQ(WebSize(), webViewImpl->mainFrame()->scrollOffset());
+
+ // Rotation via resize
+ const WebSize scrollOffset = WebSize(0, 200);
+ webViewImpl->resize(WebSize(viewportSize.width, viewportSize.height));
+ EXPECT_NEAR(pageScaleFactor, webViewImpl->pageScaleFactor(), 0.05f);
+ webViewImpl->mainFrame()->setScrollOffset(scrollOffset);
+
+ WebCore::IntPoint anchorPoint = WebCore::IntPoint(scrollOffset) + WebCore::IntPoint(viewportSize.width / 2, 0);
+ RefPtr<WebCore::Node> anchorNode
+ = webViewImpl->mainFrameImpl()->frame()->eventHandler()->hitTestResultAtPoint(anchorPoint).innerNode();
+ ASSERT(anchorNode);
+
+ const WebCore::FloatSize preResizeRelativeOffset
+ = computeRelativeOffset(anchorPoint, anchorNode->boundingBox());
+ webViewImpl->resize(WebSize(viewportSize.height, viewportSize.width));
+ WebCore::IntPoint newAnchorPoint = WebCore::IntPoint(webViewImpl->mainFrame()->scrollOffset()) + WebCore::IntPoint(viewportSize.height / 2, 0);
+ const WebCore::FloatSize postResizeRelativeOffset
+ = computeRelativeOffset(newAnchorPoint, anchorNode->boundingBox());
+ EXPECT_NEAR(preResizeRelativeOffset.width(), postResizeRelativeOffset.width(), 0.1f);
+ EXPECT_NEAR(pageScaleFactor, webViewImpl->pageScaleFactor(), 0.05f);
+}
+
TEST_F(WebFrameTest, pageScaleFactorScalesPaintClip)
{
registerMockedHttpURLLoad("fixed_layout.html");

Powered by Google App Engine
This is Rietveld 408576698