Title: [147529] trunk/Source
Revision
147529
Author
mnaga...@chromium.org
Date
2013-04-03 02:19:11 -0700 (Wed, 03 Apr 2013)

Log Message

[Chromium] Implement target-densityDpi viewport property emulation
https://bugs.webkit.org/show_bug.cgi?id=110835

The value is only used in the Chromium port, when the corresponding
setting is enabled.

This is needed for supporting existing WebView-based applications
that rely on this property.

Reviewed by Adam Barth.

Source/WebCore:

* dom/ViewportArguments.cpp:
(WebCore::findTargetDensityDPIValue):
(WebCore):
(WebCore::setViewportFeature):
* dom/ViewportArguments.h:
(WebCore::ViewportArguments::ViewportArguments):
(ViewportArguments):
(WebCore::ViewportArguments::operator==):

Source/WebKit/chromium:

* public/WebSettings.h:
(WebSettings):
* src/ChromeClientImpl.cpp:
(WebKit):
(WebKit::calculateTargetDensityDPIFactor):
(WebKit::ChromeClientImpl::dispatchViewportPropertiesDidChange):
* src/WebSettingsImpl.cpp:
(WebKit::WebSettingsImpl::WebSettingsImpl):
(WebKit::WebSettingsImpl::setSupportDeprecatedTargetDensityDPI):
(WebKit):
* src/WebSettingsImpl.h:
(WebSettingsImpl):
(WebKit::WebSettingsImpl::supportDeprecatedTargetDensityDPI):
* tests/WebFrameTest.cpp:
* tests/data/viewport-target-densitydpi-high.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (147528 => 147529)


--- trunk/Source/WebCore/ChangeLog	2013-04-03 08:56:14 UTC (rev 147528)
+++ trunk/Source/WebCore/ChangeLog	2013-04-03 09:19:11 UTC (rev 147529)
@@ -1,3 +1,25 @@
+2013-04-03  Mikhail Naganov  <mnaga...@chromium.org>
+
+        [Chromium] Implement target-densityDpi viewport property emulation
+        https://bugs.webkit.org/show_bug.cgi?id=110835
+
+        The value is only used in the Chromium port, when the corresponding
+        setting is enabled.
+
+        This is needed for supporting existing WebView-based applications
+        that rely on this property.
+
+        Reviewed by Adam Barth.
+
+        * dom/ViewportArguments.cpp:
+        (WebCore::findTargetDensityDPIValue):
+        (WebCore):
+        (WebCore::setViewportFeature):
+        * dom/ViewportArguments.h:
+        (WebCore::ViewportArguments::ViewportArguments):
+        (ViewportArguments):
+        (WebCore::ViewportArguments::operator==):
+
 2013-04-03  Mike West  <mk...@chromium.org>
 
         Extract URL that doesn't inherit a parent's SecurityOrigin out into a constant.

Modified: trunk/Source/WebCore/dom/ViewportArguments.cpp (147528 => 147529)


--- trunk/Source/WebCore/dom/ViewportArguments.cpp	2013-04-03 08:56:14 UTC (rev 147528)
+++ trunk/Source/WebCore/dom/ViewportArguments.cpp	2013-04-03 09:19:11 UTC (rev 147529)
@@ -382,6 +382,25 @@
     return 1;
 }
 
+static float findTargetDensityDPIValue(const String& keyString, const String& valueString, Document* document)
+{
+    if (equalIgnoringCase(valueString, "device-dpi"))
+        return ViewportArguments::ValueDeviceDPI;
+    if (equalIgnoringCase(valueString, "low-dpi"))
+        return ViewportArguments::ValueLowDPI;
+    if (equalIgnoringCase(valueString, "medium-dpi"))
+        return ViewportArguments::ValueMediumDPI;
+    if (equalIgnoringCase(valueString, "high-dpi"))
+        return ViewportArguments::ValueHighDPI;
+
+    bool ok;
+    float value = numericPrefix(keyString, valueString, document, &ok);
+    if (!ok || value < 70 || value > 400)
+        return ViewportArguments::ValueAuto;
+
+    return value;
+}
+
 void setViewportFeature(const String& keyString, const String& valueString, Document* document, void* data)
 {
     ViewportArguments* arguments = static_cast<ViewportArguments*>(data);
@@ -398,9 +417,10 @@
         arguments->maxZoom = findScaleValue(keyString, valueString, document);
     else if (keyString == "user-scalable")
         arguments->userZoom = findUserScalableValue(keyString, valueString, document);
-    else if (keyString == "target-densitydpi")
+    else if (keyString == "target-densitydpi") {
+        arguments->deprecatedTargetDensityDPI = findTargetDensityDPIValue(keyString, valueString, document);
         reportViewportWarning(document, TargetDensityDpiUnsupported, String(), String());
-    else
+    } else
         reportViewportWarning(document, UnrecognizedViewportArgumentKeyError, keyString, String());
 }
 

Modified: trunk/Source/WebCore/dom/ViewportArguments.h (147528 => 147529)


--- trunk/Source/WebCore/dom/ViewportArguments.h	2013-04-03 08:56:14 UTC (rev 147528)
+++ trunk/Source/WebCore/dom/ViewportArguments.h	2013-04-03 09:19:11 UTC (rev 147529)
@@ -73,7 +73,11 @@
         ValueDeviceWidth = -2,
         ValueDeviceHeight = -3,
         ValuePortrait = -4,
-        ValueLandscape = -5
+        ValueLandscape = -5,
+        ValueDeviceDPI = -6,
+        ValueLowDPI = -7,
+        ValueMediumDPI = -8,
+        ValueHighDPI = -9
     };
 
     ViewportArguments(Type type = Implicit)
@@ -89,6 +93,7 @@
         , maxZoom(ValueAuto)
         , userZoom(ValueAuto)
         , orientation(ValueAuto)
+        , deprecatedTargetDensityDPI(ValueAuto)
     {
     }
 
@@ -106,6 +111,7 @@
     float maxZoom;
     float userZoom;
     float orientation;
+    float deprecatedTargetDensityDPI; // Only used for Android WebView
 
     bool operator==(const ViewportArguments& other) const
     {
@@ -121,7 +127,8 @@
             && minZoom == other.minZoom
             && maxZoom == other.maxZoom
             && userZoom == other.userZoom
-            && orientation == other.orientation;
+            && orientation == other.orientation
+            && deprecatedTargetDensityDPI == other.deprecatedTargetDensityDPI;
     }
 
     bool operator!=(const ViewportArguments& other) const

Modified: trunk/Source/WebKit/chromium/ChangeLog (147528 => 147529)


--- trunk/Source/WebKit/chromium/ChangeLog	2013-04-03 08:56:14 UTC (rev 147528)
+++ trunk/Source/WebKit/chromium/ChangeLog	2013-04-03 09:19:11 UTC (rev 147529)
@@ -1,3 +1,32 @@
+2013-04-03  Mikhail Naganov  <mnaga...@chromium.org>
+
+        [Chromium] Implement target-densityDpi viewport property emulation
+        https://bugs.webkit.org/show_bug.cgi?id=110835
+
+        The value is only used in the Chromium port, when the corresponding
+        setting is enabled.
+
+        This is needed for supporting existing WebView-based applications
+        that rely on this property.
+
+        Reviewed by Adam Barth.
+
+        * public/WebSettings.h:
+        (WebSettings):
+        * src/ChromeClientImpl.cpp:
+        (WebKit):
+        (WebKit::calculateTargetDensityDPIFactor):
+        (WebKit::ChromeClientImpl::dispatchViewportPropertiesDidChange):
+        * src/WebSettingsImpl.cpp:
+        (WebKit::WebSettingsImpl::WebSettingsImpl):
+        (WebKit::WebSettingsImpl::setSupportDeprecatedTargetDensityDPI):
+        (WebKit):
+        * src/WebSettingsImpl.h:
+        (WebSettingsImpl):
+        (WebKit::WebSettingsImpl::supportDeprecatedTargetDensityDPI):
+        * tests/WebFrameTest.cpp:
+        * tests/data/viewport-target-densitydpi-high.html: Added.
+
 2013-04-02  James Craig  <ja...@cookiecrook.com>
 
         AXRoleDescripton for DL is "list"; should be "description list"

Modified: trunk/Source/WebKit/chromium/public/WebSettings.h (147528 => 147529)


--- trunk/Source/WebKit/chromium/public/WebSettings.h	2013-04-03 08:56:14 UTC (rev 147528)
+++ trunk/Source/WebKit/chromium/public/WebSettings.h	2013-04-03 09:19:11 UTC (rev 147529)
@@ -153,6 +153,7 @@
     virtual void setShrinksStandaloneImagesToFit(bool) = 0;
     virtual void setSmartInsertDeleteEnabled(bool) = 0;
     virtual void setStandardFontFamily(const WebString&, UScriptCode = USCRIPT_COMMON) = 0;
+    virtual void setSupportDeprecatedTargetDensityDPI(bool) = 0;
     virtual void setSupportsMultipleWindows(bool) = 0;
     virtual void setSyncXHRInDocumentsEnabled(bool) = 0;
     virtual void setTextAreasAreResizable(bool) = 0;

Modified: trunk/Source/WebKit/chromium/src/ChromeClientImpl.cpp (147528 => 147529)


--- trunk/Source/WebKit/chromium/src/ChromeClientImpl.cpp	2013-04-03 08:56:14 UTC (rev 147528)
+++ trunk/Source/WebKit/chromium/src/ChromeClientImpl.cpp	2013-04-03 09:19:11 UTC (rev 147529)
@@ -624,6 +624,21 @@
         tooltipText, textDirection);
 }
 
+
+static float calculateTargetDensityDPIFactor(const ViewportArguments& arguments, float deviceScaleFactor)
+{
+    float targetDPI = -1.0f;
+    if (arguments.deprecatedTargetDensityDPI == ViewportArguments::ValueLowDPI)
+        targetDPI = 120.0f;
+    else if (arguments.deprecatedTargetDensityDPI == ViewportArguments::ValueMediumDPI)
+        targetDPI = 160.0f;
+    else if (arguments.deprecatedTargetDensityDPI == ViewportArguments::ValueHighDPI)
+        targetDPI = 240.0f;
+    else if (arguments.deprecatedTargetDensityDPI != ViewportArguments::ValueAuto && arguments.deprecatedTargetDensityDPI != ViewportArguments::ValueDeviceDPI)
+        targetDPI = arguments.deprecatedTargetDensityDPI;
+    return targetDPI > 0 ? (deviceScaleFactor * 120.0f) / targetDPI : 1.0f;
+}
+
 void ChromeClientImpl::dispatchViewportPropertiesDidChange(const ViewportArguments& arguments) const
 {
 #if ENABLE(VIEWPORT)
@@ -647,6 +662,14 @@
     if (arguments.zoom == ViewportArguments::ValueAuto && !m_webView->settingsImpl()->initializeAtMinimumPageScale())
         computed.initialScale = 1.0f;
 
+    if (m_webView->settingsImpl()->supportDeprecatedTargetDensityDPI()) {
+        float targetDensityDPIFactor = calculateTargetDensityDPIFactor(arguments, deviceScaleFactor);
+        computed.initialScale *= targetDensityDPIFactor;
+        computed.minimumScale *= targetDensityDPIFactor;
+        computed.maximumScale *= targetDensityDPIFactor;
+        computed.layoutSize.scale(1.0f / targetDensityDPIFactor);
+    }
+
     m_webView->setInitialPageScaleFactor(computed.initialScale);
     m_webView->setFixedLayoutSize(flooredIntSize(computed.layoutSize));
     m_webView->setDeviceScaleFactor(deviceScaleFactor);

Modified: trunk/Source/WebKit/chromium/src/WebSettingsImpl.cpp (147528 => 147529)


--- trunk/Source/WebKit/chromium/src/WebSettingsImpl.cpp	2013-04-03 08:56:14 UTC (rev 147528)
+++ trunk/Source/WebKit/chromium/src/WebSettingsImpl.cpp	2013-04-03 09:19:11 UTC (rev 147529)
@@ -57,6 +57,7 @@
     , m_autoZoomFocusedNodeToLegibleScale(false)
     , m_deferredImageDecodingEnabled(false)
     , m_doubleTapToZoomEnabled(false)
+    , m_supportDeprecatedTargetDensityDPI(false)
 {
     ASSERT(settings);
 }
@@ -194,6 +195,11 @@
     m_settings->setJavaScriptCanOpenWindowsAutomatically(canOpenWindows);
 }
 
+void WebSettingsImpl::setSupportDeprecatedTargetDensityDPI(bool supportDeprecatedTargetDensityDPI)
+{
+    m_supportDeprecatedTargetDensityDPI = supportDeprecatedTargetDensityDPI;
+}
+
 void WebSettingsImpl::setSupportsMultipleWindows(bool supportsMultipleWindows)
 {
     m_settings->setSupportsMultipleWindows(supportsMultipleWindows);

Modified: trunk/Source/WebKit/chromium/src/WebSettingsImpl.h (147528 => 147529)


--- trunk/Source/WebKit/chromium/src/WebSettingsImpl.h	2013-04-03 08:56:14 UTC (rev 147528)
+++ trunk/Source/WebKit/chromium/src/WebSettingsImpl.h	2013-04-03 09:19:11 UTC (rev 147529)
@@ -149,6 +149,7 @@
     virtual void setShrinksStandaloneImagesToFit(bool);
     virtual void setSmartInsertDeleteEnabled(bool);
     virtual void setStandardFontFamily(const WebString&, UScriptCode = USCRIPT_COMMON);
+    virtual void setSupportDeprecatedTargetDensityDPI(bool);
     virtual void setSupportsMultipleWindows(bool);
     virtual void setSyncXHRInDocumentsEnabled(bool);
     virtual void setTextAreasAreResizable(bool);
@@ -180,6 +181,7 @@
     bool gestureTapHighlightEnabled() const { return m_gestureTapHighlightEnabled; }
     bool doubleTapToZoomEnabled() const { return m_doubleTapToZoomEnabled; }
     bool perTilePaintingEnabled() const { return m_perTilePaintingEnabled; }
+    bool supportDeprecatedTargetDensityDPI() const { return m_supportDeprecatedTargetDensityDPI; }
 
 private:
     WebCore::Settings* m_settings;
@@ -193,6 +195,7 @@
     bool m_deferredImageDecodingEnabled;
     bool m_doubleTapToZoomEnabled;
     bool m_perTilePaintingEnabled;
+    bool m_supportDeprecatedTargetDensityDPI;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/chromium/tests/WebFrameTest.cpp (147528 => 147529)


--- trunk/Source/WebKit/chromium/tests/WebFrameTest.cpp	2013-04-03 08:56:14 UTC (rev 147528)
+++ trunk/Source/WebKit/chromium/tests/WebFrameTest.cpp	2013-04-03 09:19:11 UTC (rev 147529)
@@ -573,6 +573,29 @@
     EXPECT_EQ(980, webViewImpl->page()->mainFrame()->contentRenderer()->unscaledDocumentRect().width());
     EXPECT_EQ(980, webViewImpl->mainFrameImpl()->frameView()->contentsSize().width());
 }
+
+TEST_F(WebFrameTest, targetDensityDpiHigh)
+{
+    registerMockedHttpURLLoad("viewport-target-densitydpi-high.html");
+
+    FixedLayoutTestWebViewClient client;
+    client.m_screenInfo.deviceScaleFactor = 4.0f / 3.0f;
+    int viewportWidth = 640;
+    int viewportHeight = 480;
+
+    m_webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "viewport-target-densitydpi-high.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()->setSupportDeprecatedTargetDensityDPI(true);
+    m_webView->resize(WebSize(viewportWidth, viewportHeight));
+
+    // high-dpi = 240, device-dpi = 160
+    EXPECT_EQ(viewportWidth * (240.0f / 160.0f), m_webView->fixedLayoutSize().width);
+    EXPECT_EQ(viewportHeight * (240.0f / 160.0f), m_webView->fixedLayoutSize().height);
+    EXPECT_EQ(160.0f / 240.0f, m_webView->pageScaleFactor());
+}
 #endif
 
 TEST_F(WebFrameTest, pageScaleFactorScalesPaintClip)

Added: trunk/Source/WebKit/chromium/tests/data/viewport-target-densitydpi-high.html (0 => 147529)


--- trunk/Source/WebKit/chromium/tests/data/viewport-target-densitydpi-high.html	                        (rev 0)
+++ trunk/Source/WebKit/chromium/tests/data/viewport-target-densitydpi-high.html	2013-04-03 09:19:11 UTC (rev 147529)
@@ -0,0 +1,8 @@
+<html>
+  <head>
+    <meta name='viewport' content='width=device-width,target-densityDpi=high-dpi' />
+  </head>
+  <body>
+    A page with a viewport.
+  </body>
+</html>
Property changes on: trunk/Source/WebKit/chromium/tests/data/viewport-target-densitydpi-high.html
___________________________________________________________________

Added: svn:mime-type

Added: svn:eol-style

_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to