- Revision
- 143735
- Author
- mnaga...@chromium.org
- Date
- 2013-02-22 08:46:55 -0800 (Fri, 22 Feb 2013)
Log Message
[Chromium] Add support for emulating legacy Android WebView 'setInitialScale' method
https://bugs.webkit.org/show_bug.cgi?id=109946
Adding a WebView method for permanently setting initial page scale.
This override has higher priority than any calculated page scale
and viewport meta tag value.
Also, this patch eliminates a dubious "fixed layout enabled, viewport disabled" mode
previously used by Android WebView.
Reviewed by Adam Barth.
* public/WebView.h:
(WebView):
* src/ChromeClientImpl.cpp:
(WebKit::ChromeClientImpl::dispatchViewportPropertiesDidChange):
* src/WebViewImpl.cpp:
(WebKit::WebViewImpl::WebViewImpl):
(WebKit::WebViewImpl::setInitialPageScaleOverride):
(WebKit):
(WebKit::WebViewImpl::computePageScaleFactorLimits):
* src/WebViewImpl.h:
* tests/WebFrameTest.cpp:
Modified Paths
Diff
Modified: trunk/Source/WebKit/chromium/ChangeLog (143734 => 143735)
--- trunk/Source/WebKit/chromium/ChangeLog 2013-02-22 16:41:20 UTC (rev 143734)
+++ trunk/Source/WebKit/chromium/ChangeLog 2013-02-22 16:46:55 UTC (rev 143735)
@@ -1,3 +1,29 @@
+2013-02-22 Mikhail Naganov <mnaga...@chromium.org>
+
+ [Chromium] Add support for emulating legacy Android WebView 'setInitialScale' method
+ https://bugs.webkit.org/show_bug.cgi?id=109946
+
+ Adding a WebView method for permanently setting initial page scale.
+ This override has higher priority than any calculated page scale
+ and viewport meta tag value.
+
+ Also, this patch eliminates a dubious "fixed layout enabled, viewport disabled" mode
+ previously used by Android WebView.
+
+ Reviewed by Adam Barth.
+
+ * public/WebView.h:
+ (WebView):
+ * src/ChromeClientImpl.cpp:
+ (WebKit::ChromeClientImpl::dispatchViewportPropertiesDidChange):
+ * src/WebViewImpl.cpp:
+ (WebKit::WebViewImpl::WebViewImpl):
+ (WebKit::WebViewImpl::setInitialPageScaleOverride):
+ (WebKit):
+ (WebKit::WebViewImpl::computePageScaleFactorLimits):
+ * src/WebViewImpl.h:
+ * tests/WebFrameTest.cpp:
+
2013-02-22 Mark Pilgrim <pilg...@chromium.org>
[Chromium] WebKit::initialize should take a Platform* now that WebKitPlatformSupport is empty
Modified: trunk/Source/WebKit/chromium/public/WebView.h (143734 => 143735)
--- trunk/Source/WebKit/chromium/public/WebView.h 2013-02-22 16:41:20 UTC (rev 143734)
+++ trunk/Source/WebKit/chromium/public/WebView.h 2013-02-22 16:46:55 UTC (rev 143735)
@@ -229,6 +229,10 @@
WEBKIT_EXPORT static double zoomLevelToZoomFactor(double zoomLevel);
WEBKIT_EXPORT static double zoomFactorToZoomLevel(double factor);
+ // Sets the initial page scale to the given factor. This scale setting overrides
+ // page scale set in the page's viewport meta tag.
+ virtual void setInitialPageScaleOverride(float) = 0;
+
// Gets the scale factor of the page, where 1.0 is the normal size, > 1.0
// is scaled up, < 1.0 is scaled down.
virtual float pageScaleFactor() const = 0;
Modified: trunk/Source/WebKit/chromium/src/ChromeClientImpl.cpp (143734 => 143735)
--- trunk/Source/WebKit/chromium/src/ChromeClientImpl.cpp 2013-02-22 16:41:20 UTC (rev 143734)
+++ trunk/Source/WebKit/chromium/src/ChromeClientImpl.cpp 2013-02-22 16:46:55 UTC (rev 143735)
@@ -639,7 +639,7 @@
void ChromeClientImpl::dispatchViewportPropertiesDidChange(const ViewportArguments& arguments) const
{
#if ENABLE(VIEWPORT)
- if (!m_webView->isFixedLayoutModeEnabled() || !m_webView->client() || !m_webView->page())
+ if (!m_webView->settings()->viewportEnabled() || !m_webView->isFixedLayoutModeEnabled() || !m_webView->client() || !m_webView->page())
return;
IntSize viewportSize = m_webView->dipSize();
@@ -649,15 +649,7 @@
if (!viewportSize.width() || !viewportSize.height())
return;
- ViewportAttributes computed;
- if (m_webView->settings()->viewportEnabled()) {
- computed = arguments.resolve(viewportSize, viewportSize, m_webView->page()->settings()->layoutFallbackWidth());
- } else {
- // If viewport tag is disabled but fixed layout is still enabled, (for
- // example, on Android WebView with UseWideViewport false), compute
- // based on the default viewport arguments.
- computed = ViewportArguments().resolve(viewportSize, viewportSize, viewportSize.width());
- }
+ ViewportAttributes computed = arguments.resolve(viewportSize, viewportSize, m_webView->page()->settings()->layoutFallbackWidth());
restrictScaleFactorToInitialScaleIfNotUserScalable(computed);
if (m_webView->ignoreViewportTagMaximumScale()) {
Modified: trunk/Source/WebKit/chromium/src/WebViewImpl.cpp (143734 => 143735)
--- trunk/Source/WebKit/chromium/src/WebViewImpl.cpp 2013-02-22 16:41:20 UTC (rev 143734)
+++ trunk/Source/WebKit/chromium/src/WebViewImpl.cpp 2013-02-22 16:46:55 UTC (rev 143735)
@@ -395,6 +395,7 @@
, m_pageDefinedMaximumPageScaleFactor(-1)
, m_minimumPageScaleFactor(minPageScaleFactor)
, m_maximumPageScaleFactor(maxPageScaleFactor)
+ , m_initialPageScaleFactorOverride(-1)
, m_initialPageScaleFactor(-1)
, m_ignoreViewportTagMaximumScale(false)
, m_pageScaleFactorIsSet(false)
@@ -2960,6 +2961,15 @@
return log(factor) / log(textSizeMultiplierRatio);
}
+void WebViewImpl::setInitialPageScaleOverride(float initialPageScaleFactorOverride)
+{
+ if (m_initialPageScaleFactorOverride == initialPageScaleFactorOverride)
+ return;
+ m_initialPageScaleFactorOverride = initialPageScaleFactorOverride;
+ m_pageScaleFactorIsSet = false;
+ computePageScaleFactorLimits();
+}
+
float WebViewImpl::pageScaleFactor() const
{
if (!page())
@@ -3161,16 +3171,18 @@
void WebViewImpl::computePageScaleFactorLimits()
{
- if (m_pageDefinedMinimumPageScaleFactor == -1 || m_pageDefinedMaximumPageScaleFactor == -1)
- return;
-
if (!mainFrame() || !page() || !page()->mainFrame() || !page()->mainFrame()->view())
return;
FrameView* view = page()->mainFrame()->view();
- m_minimumPageScaleFactor = min(max(m_pageDefinedMinimumPageScaleFactor, minPageScaleFactor), maxPageScaleFactor);
- m_maximumPageScaleFactor = max(min(m_pageDefinedMaximumPageScaleFactor, maxPageScaleFactor), minPageScaleFactor);
+ if (m_pageDefinedMinimumPageScaleFactor == -1 || m_pageDefinedMaximumPageScaleFactor == -1) {
+ m_minimumPageScaleFactor = minPageScaleFactor;
+ m_maximumPageScaleFactor = maxPageScaleFactor;
+ } else {
+ m_minimumPageScaleFactor = min(max(m_pageDefinedMinimumPageScaleFactor, minPageScaleFactor), maxPageScaleFactor);
+ m_maximumPageScaleFactor = max(min(m_pageDefinedMaximumPageScaleFactor, maxPageScaleFactor), minPageScaleFactor);
+ }
if (settings()->viewportEnabled()) {
if (!contentsSize().width() || !m_size.width)
@@ -3187,9 +3199,14 @@
ASSERT(m_minimumPageScaleFactor <= m_maximumPageScaleFactor);
// Initialize and/or clamp the page scale factor if needed.
+ float initialPageScaleFactor = m_initialPageScaleFactor;
+ if (!settings()->viewportEnabled())
+ initialPageScaleFactor = 1;
+ if (m_initialPageScaleFactorOverride != -1)
+ initialPageScaleFactor = m_initialPageScaleFactorOverride;
float newPageScaleFactor = pageScaleFactor();
- if (!m_pageScaleFactorIsSet && m_initialPageScaleFactor != -1) {
- newPageScaleFactor = m_initialPageScaleFactor;
+ if (!m_pageScaleFactorIsSet && initialPageScaleFactor != -1) {
+ newPageScaleFactor = initialPageScaleFactor;
m_pageScaleFactorIsSet = true;
}
newPageScaleFactor = clampPageScaleFactorToLimits(newPageScaleFactor);
Modified: trunk/Source/WebKit/chromium/src/WebViewImpl.h (143734 => 143735)
--- trunk/Source/WebKit/chromium/src/WebViewImpl.h 2013-02-22 16:41:20 UTC (rev 143734)
+++ trunk/Source/WebKit/chromium/src/WebViewImpl.h 2013-02-22 16:46:55 UTC (rev 143735)
@@ -222,6 +222,7 @@
virtual double setZoomLevel(bool textOnly, double zoomLevel);
virtual void zoomLimitsChanged(double minimumZoomLevel,
double maximumZoomLevel);
+ virtual void setInitialPageScaleOverride(float);
virtual float pageScaleFactor() const;
virtual bool isPageScaleFactorSet() const;
virtual void setPageScaleFactorPreservingScrollOffset(float);
@@ -758,6 +759,7 @@
float m_pageDefinedMaximumPageScaleFactor;
float m_minimumPageScaleFactor;
float m_maximumPageScaleFactor;
+ float m_initialPageScaleFactorOverride;
float m_initialPageScaleFactor;
bool m_ignoreViewportTagMaximumScale;
bool m_pageScaleFactorIsSet;
Modified: trunk/Source/WebKit/chromium/tests/WebFrameTest.cpp (143734 => 143735)
--- trunk/Source/WebKit/chromium/tests/WebFrameTest.cpp 2013-02-22 16:41:20 UTC (rev 143734)
+++ trunk/Source/WebKit/chromium/tests/WebFrameTest.cpp 2013-02-22 16:46:55 UTC (rev 143735)
@@ -394,6 +394,84 @@
EXPECT_EQ(2.0f, m_webView->pageScaleFactor());
}
+TEST_F(WebFrameTest, setInitialPageScaleFactorPermanently)
+{
+ registerMockedHttpURLLoad("fixed_layout.html");
+
+ FixedLayoutTestWebViewClient client;
+ client.m_screenInfo.deviceScaleFactor = 1;
+ float enforcedPageScalePactor = 2.0f;
+
+ m_webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "fixed_layout.html", true, 0, &client);
+ m_webView->settings()->setApplyDeviceScaleFactorInCompositor(true);
+ m_webView->settings()->setApplyPageScaleFactorInCompositor(true);
+ m_webView->setInitialPageScaleOverride(enforcedPageScalePactor);
+
+ EXPECT_EQ(enforcedPageScalePactor, m_webView->pageScaleFactor());
+
+ int viewportWidth = 640;
+ int viewportHeight = 480;
+ m_webView->enableFixedLayoutMode(true);
+ m_webView->settings()->setViewportEnabled(true);
+ m_webView->resize(WebSize(viewportWidth, viewportHeight));
+ m_webView->layout();
+
+ EXPECT_EQ(enforcedPageScalePactor, m_webView->pageScaleFactor());
+
+ m_webView->enableFixedLayoutMode(false);
+ m_webView->settings()->setViewportEnabled(false);
+ m_webView->layout();
+
+ EXPECT_EQ(enforcedPageScalePactor, m_webView->pageScaleFactor());
+
+ m_webView->setInitialPageScaleOverride(-1);
+ m_webView->layout();
+ EXPECT_EQ(1.0f, m_webView->pageScaleFactor());
+}
+
+TEST_F(WebFrameTest, PermanentInitialPageScaleFactorOverridesInitializeAtMinimumScale)
+{
+ registerMockedHttpURLLoad("viewport-auto-initial-scale.html");
+
+ FixedLayoutTestWebViewClient client;
+ client.m_screenInfo.deviceScaleFactor = 1;
+ int viewportWidth = 640;
+ int viewportHeight = 480;
+ float enforcedPageScalePactor = 0.5f;
+
+ m_webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "viewport-auto-initial-scale.html", true, 0, &client);
+ m_webView->settings()->setApplyDeviceScaleFactorInCompositor(true);
+ m_webView->settings()->setApplyPageScaleFactorInCompositor(true);
+ m_webView->enableFixedLayoutMode(true);
+ m_webView->settings()->setViewportEnabled(true);
+ m_webView->settings()->setInitializeAtMinimumPageScale(false);
+ m_webView->setInitialPageScaleOverride(enforcedPageScalePactor);
+ m_webView->resize(WebSize(viewportWidth, viewportHeight));
+
+ EXPECT_EQ(enforcedPageScalePactor, m_webView->pageScaleFactor());
+}
+
+TEST_F(WebFrameTest, PermanentInitialPageScaleFactorOverridesPageViewportInitialScale)
+{
+ registerMockedHttpURLLoad("viewport-2x-initial-scale.html");
+
+ FixedLayoutTestWebViewClient client;
+ client.m_screenInfo.deviceScaleFactor = 1;
+ int viewportWidth = 640;
+ int viewportHeight = 480;
+ float enforcedPageScalePactor = 0.5f;
+
+ m_webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "viewport-2x-initial-scale.html", true, 0, &client);
+ m_webView->settings()->setApplyDeviceScaleFactorInCompositor(true);
+ m_webView->settings()->setApplyPageScaleFactorInCompositor(true);
+ m_webView->enableFixedLayoutMode(true);
+ m_webView->settings()->setViewportEnabled(true);
+ m_webView->setInitialPageScaleOverride(enforcedPageScalePactor);
+ m_webView->resize(WebSize(viewportWidth, viewportHeight));
+
+ EXPECT_EQ(enforcedPageScalePactor, m_webView->pageScaleFactor());
+}
+
TEST_F(WebFrameTest, ScaleFactorShouldNotOscillate)
{
registerMockedHttpURLLoad("scale_oscillate.html");