Changeset 147529 in webkit


Ignore:
Timestamp:
Apr 3, 2013 2:19:11 AM (11 years ago)
Author:
mnaganov@chromium.org
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.
Location:
trunk/Source
Files:
1 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r147526 r147529  
     12013-04-03  Mikhail Naganov  <mnaganov@chromium.org>
     2
     3        [Chromium] Implement target-densityDpi viewport property emulation
     4        https://bugs.webkit.org/show_bug.cgi?id=110835
     5
     6        The value is only used in the Chromium port, when the corresponding
     7        setting is enabled.
     8
     9        This is needed for supporting existing WebView-based applications
     10        that rely on this property.
     11
     12        Reviewed by Adam Barth.
     13
     14        * dom/ViewportArguments.cpp:
     15        (WebCore::findTargetDensityDPIValue):
     16        (WebCore):
     17        (WebCore::setViewportFeature):
     18        * dom/ViewportArguments.h:
     19        (WebCore::ViewportArguments::ViewportArguments):
     20        (ViewportArguments):
     21        (WebCore::ViewportArguments::operator==):
     22
    1232013-04-03  Mike West  <mkwst@chromium.org>
    224
  • trunk/Source/WebCore/dom/ViewportArguments.cpp

    r144949 r147529  
    383383}
    384384
     385static float findTargetDensityDPIValue(const String& keyString, const String& valueString, Document* document)
     386{
     387    if (equalIgnoringCase(valueString, "device-dpi"))
     388        return ViewportArguments::ValueDeviceDPI;
     389    if (equalIgnoringCase(valueString, "low-dpi"))
     390        return ViewportArguments::ValueLowDPI;
     391    if (equalIgnoringCase(valueString, "medium-dpi"))
     392        return ViewportArguments::ValueMediumDPI;
     393    if (equalIgnoringCase(valueString, "high-dpi"))
     394        return ViewportArguments::ValueHighDPI;
     395
     396    bool ok;
     397    float value = numericPrefix(keyString, valueString, document, &ok);
     398    if (!ok || value < 70 || value > 400)
     399        return ViewportArguments::ValueAuto;
     400
     401    return value;
     402}
     403
    385404void setViewportFeature(const String& keyString, const String& valueString, Document* document, void* data)
    386405{
     
    399418    else if (keyString == "user-scalable")
    400419        arguments->userZoom = findUserScalableValue(keyString, valueString, document);
    401     else if (keyString == "target-densitydpi")
     420    else if (keyString == "target-densitydpi") {
     421        arguments->deprecatedTargetDensityDPI = findTargetDensityDPIValue(keyString, valueString, document);
    402422        reportViewportWarning(document, TargetDensityDpiUnsupported, String(), String());
    403     else
     423    } else
    404424        reportViewportWarning(document, UnrecognizedViewportArgumentKeyError, keyString, String());
    405425}
  • trunk/Source/WebCore/dom/ViewportArguments.h

    r139275 r147529  
    7474        ValueDeviceHeight = -3,
    7575        ValuePortrait = -4,
    76         ValueLandscape = -5
     76        ValueLandscape = -5,
     77        ValueDeviceDPI = -6,
     78        ValueLowDPI = -7,
     79        ValueMediumDPI = -8,
     80        ValueHighDPI = -9
    7781    };
    7882
     
    9094        , userZoom(ValueAuto)
    9195        , orientation(ValueAuto)
     96        , deprecatedTargetDensityDPI(ValueAuto)
    9297    {
    9398    }
     
    107112    float userZoom;
    108113    float orientation;
     114    float deprecatedTargetDensityDPI; // Only used for Android WebView
    109115
    110116    bool operator==(const ViewportArguments& other) const
     
    122128            && maxZoom == other.maxZoom
    123129            && userZoom == other.userZoom
    124             && orientation == other.orientation;
     130            && orientation == other.orientation
     131            && deprecatedTargetDensityDPI == other.deprecatedTargetDensityDPI;
    125132    }
    126133
  • trunk/Source/WebKit/chromium/ChangeLog

    r147520 r147529  
     12013-04-03  Mikhail Naganov  <mnaganov@chromium.org>
     2
     3        [Chromium] Implement target-densityDpi viewport property emulation
     4        https://bugs.webkit.org/show_bug.cgi?id=110835
     5
     6        The value is only used in the Chromium port, when the corresponding
     7        setting is enabled.
     8
     9        This is needed for supporting existing WebView-based applications
     10        that rely on this property.
     11
     12        Reviewed by Adam Barth.
     13
     14        * public/WebSettings.h:
     15        (WebSettings):
     16        * src/ChromeClientImpl.cpp:
     17        (WebKit):
     18        (WebKit::calculateTargetDensityDPIFactor):
     19        (WebKit::ChromeClientImpl::dispatchViewportPropertiesDidChange):
     20        * src/WebSettingsImpl.cpp:
     21        (WebKit::WebSettingsImpl::WebSettingsImpl):
     22        (WebKit::WebSettingsImpl::setSupportDeprecatedTargetDensityDPI):
     23        (WebKit):
     24        * src/WebSettingsImpl.h:
     25        (WebSettingsImpl):
     26        (WebKit::WebSettingsImpl::supportDeprecatedTargetDensityDPI):
     27        * tests/WebFrameTest.cpp:
     28        * tests/data/viewport-target-densitydpi-high.html: Added.
     29
    1302013-04-02  James Craig  <james@cookiecrook.com>
    231
  • trunk/Source/WebKit/chromium/public/WebSettings.h

    r146917 r147529  
    154154    virtual void setSmartInsertDeleteEnabled(bool) = 0;
    155155    virtual void setStandardFontFamily(const WebString&, UScriptCode = USCRIPT_COMMON) = 0;
     156    virtual void setSupportDeprecatedTargetDensityDPI(bool) = 0;
    156157    virtual void setSupportsMultipleWindows(bool) = 0;
    157158    virtual void setSyncXHRInDocumentsEnabled(bool) = 0;
  • trunk/Source/WebKit/chromium/src/ChromeClientImpl.cpp

    r147357 r147529  
    625625}
    626626
     627
     628static float calculateTargetDensityDPIFactor(const ViewportArguments& arguments, float deviceScaleFactor)
     629{
     630    float targetDPI = -1.0f;
     631    if (arguments.deprecatedTargetDensityDPI == ViewportArguments::ValueLowDPI)
     632        targetDPI = 120.0f;
     633    else if (arguments.deprecatedTargetDensityDPI == ViewportArguments::ValueMediumDPI)
     634        targetDPI = 160.0f;
     635    else if (arguments.deprecatedTargetDensityDPI == ViewportArguments::ValueHighDPI)
     636        targetDPI = 240.0f;
     637    else if (arguments.deprecatedTargetDensityDPI != ViewportArguments::ValueAuto && arguments.deprecatedTargetDensityDPI != ViewportArguments::ValueDeviceDPI)
     638        targetDPI = arguments.deprecatedTargetDensityDPI;
     639    return targetDPI > 0 ? (deviceScaleFactor * 120.0f) / targetDPI : 1.0f;
     640}
     641
    627642void ChromeClientImpl::dispatchViewportPropertiesDidChange(const ViewportArguments& arguments) const
    628643{
     
    647662    if (arguments.zoom == ViewportArguments::ValueAuto && !m_webView->settingsImpl()->initializeAtMinimumPageScale())
    648663        computed.initialScale = 1.0f;
     664
     665    if (m_webView->settingsImpl()->supportDeprecatedTargetDensityDPI()) {
     666        float targetDensityDPIFactor = calculateTargetDensityDPIFactor(arguments, deviceScaleFactor);
     667        computed.initialScale *= targetDensityDPIFactor;
     668        computed.minimumScale *= targetDensityDPIFactor;
     669        computed.maximumScale *= targetDensityDPIFactor;
     670        computed.layoutSize.scale(1.0f / targetDensityDPIFactor);
     671    }
    649672
    650673    m_webView->setInitialPageScaleFactor(computed.initialScale);
  • trunk/Source/WebKit/chromium/src/WebSettingsImpl.cpp

    r146924 r147529  
    5858    , m_deferredImageDecodingEnabled(false)
    5959    , m_doubleTapToZoomEnabled(false)
     60    , m_supportDeprecatedTargetDensityDPI(false)
    6061{
    6162    ASSERT(settings);
     
    195196}
    196197
     198void WebSettingsImpl::setSupportDeprecatedTargetDensityDPI(bool supportDeprecatedTargetDensityDPI)
     199{
     200    m_supportDeprecatedTargetDensityDPI = supportDeprecatedTargetDensityDPI;
     201}
     202
    197203void WebSettingsImpl::setSupportsMultipleWindows(bool supportsMultipleWindows)
    198204{
  • trunk/Source/WebKit/chromium/src/WebSettingsImpl.h

    r146917 r147529  
    150150    virtual void setSmartInsertDeleteEnabled(bool);
    151151    virtual void setStandardFontFamily(const WebString&, UScriptCode = USCRIPT_COMMON);
     152    virtual void setSupportDeprecatedTargetDensityDPI(bool);
    152153    virtual void setSupportsMultipleWindows(bool);
    153154    virtual void setSyncXHRInDocumentsEnabled(bool);
     
    181182    bool doubleTapToZoomEnabled() const { return m_doubleTapToZoomEnabled; }
    182183    bool perTilePaintingEnabled() const { return m_perTilePaintingEnabled; }
     184    bool supportDeprecatedTargetDensityDPI() const { return m_supportDeprecatedTargetDensityDPI; }
    183185
    184186private:
     
    194196    bool m_doubleTapToZoomEnabled;
    195197    bool m_perTilePaintingEnabled;
     198    bool m_supportDeprecatedTargetDensityDPI;
    196199};
    197200
  • trunk/Source/WebKit/chromium/tests/WebFrameTest.cpp

    r147357 r147529  
    574574    EXPECT_EQ(980, webViewImpl->mainFrameImpl()->frameView()->contentsSize().width());
    575575}
     576
     577TEST_F(WebFrameTest, targetDensityDpiHigh)
     578{
     579    registerMockedHttpURLLoad("viewport-target-densitydpi-high.html");
     580
     581    FixedLayoutTestWebViewClient client;
     582    client.m_screenInfo.deviceScaleFactor = 4.0f / 3.0f;
     583    int viewportWidth = 640;
     584    int viewportHeight = 480;
     585
     586    m_webView = FrameTestHelpers::createWebViewAndLoad(m_baseURL + "viewport-target-densitydpi-high.html", true, 0, &client);
     587    m_webView->settings()->setApplyDeviceScaleFactorInCompositor(true);
     588    m_webView->settings()->setApplyPageScaleFactorInCompositor(true);
     589    m_webView->enableFixedLayoutMode(true);
     590    m_webView->settings()->setViewportEnabled(true);
     591    m_webView->settings()->setSupportDeprecatedTargetDensityDPI(true);
     592    m_webView->resize(WebSize(viewportWidth, viewportHeight));
     593
     594    // high-dpi = 240, device-dpi = 160
     595    EXPECT_EQ(viewportWidth * (240.0f / 160.0f), m_webView->fixedLayoutSize().width);
     596    EXPECT_EQ(viewportHeight * (240.0f / 160.0f), m_webView->fixedLayoutSize().height);
     597    EXPECT_EQ(160.0f / 240.0f, m_webView->pageScaleFactor());
     598}
    576599#endif
    577600
Note: See TracChangeset for help on using the changeset viewer.