Title: [143735] trunk/Source/WebKit/chromium
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");
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to