Changeset 153067 in webkit


Ignore:
Timestamp:
Jul 23, 2013 4:42:16 PM (11 years ago)
Author:
rniwa@webkit.org
Message:

The computed values of fix length padding should be subpixel precision like margin
https://bugs.webkit.org/show_bug.cgi?id=118936

Reviewed by Simon Fraser.

Source/WebCore:

The bug was caused by ComputedStyleExtractor::propertyValue always returning the used value
for padding. Fixed the bug by returning the computed value when they're of fixed length.

This aligns the behaviors of getComputedStyle(~).padding~ with getComputedStyle(~).margin~,
which had been fixed in r102149. While the current CSSOM specification says getComputedStyle
should return the used values for margins when display property is set to anything but none,
new behavior matches that of Chrome, Firefox, and Internet Explorer.

Also extracted zoomAdjustedPaddingOrMarginPixelValue to reduce the code duplication.

Test: fast/css/getComputedStyle/getComputedStyle-padding-margin-subpixel-length.html

  • css/CSSComputedStyleDeclaration.cpp:

(WebCore::zoomAdjustedPaddingOrMarginPixelValue): Extracted.
(WebCore::ComputedStyleExtractor::propertyValue):

LayoutTests:

Add a regression test for obtaining the computed values of floating point padding and margin.
They shouldn't be rounded to whole pixels.

  • fast/css/getComputedStyle/getComputedStyle-padding-margin-subpixel-length-expected.txt: Added.
  • fast/css/getComputedStyle/getComputedStyle-padding-margin-subpixel-length.html: Added.
  • fast/shapes/shape-inside/shape-inside-shape-logical-top-expected.html: Use a different technique to detect

the subpixel layout since paddings

Location:
trunk
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r153063 r153067  
     12013-07-22  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        The computed values of fix length padding should be subpixel precision like margin
     4        https://bugs.webkit.org/show_bug.cgi?id=118936
     5
     6        Reviewed by Simon Fraser.
     7
     8        Add a regression test for obtaining the computed values of floating point padding and margin.
     9        They shouldn't be rounded to whole pixels.
     10
     11        * fast/css/getComputedStyle/getComputedStyle-padding-margin-subpixel-length-expected.txt: Added.
     12        * fast/css/getComputedStyle/getComputedStyle-padding-margin-subpixel-length.html: Added.
     13        * fast/shapes/shape-inside/shape-inside-shape-logical-top-expected.html: Use a different technique to detect
     14        the subpixel layout since paddings
     15
    1162013-07-23  Bem Jones-Bey  <bjonesbe@adobe.com>
    217
  • trunk/LayoutTests/fast/shapes/shape-inside/shape-inside-shape-logical-top-expected.html

    r152800 r153067  
    1717        border: 2px solid blue;
    1818    }
     19    #elementWith105pxHeight {
     20        position: absolute;
     21        left: 0;
     22        top: 0;
     23        height: 10.5px;
     24    }
    1925</style>
    2026<script>
     
    2228    // If subpixel layout is not enabled, fix shape-inside's padding-top value.
    2329    var shapeInsideElt = document.getElementById("shape-inside");
    24     if (window.getComputedStyle(shapeInsideElt).paddingTop == "20px")
     30    if (getComputedStyle(document.getElementById('elementWith105pxHeight')).height == "10px")
    2531        shapeInsideElt.style.paddingTop = "21px"
    2632}
     
    2935<body onload="init()">
    3036    <div id="shape-inside">
     37        <span id="elementWith105pxHeight"></span>
    3138        <div id="border"></div>
    3239        This text should be contained by the blue square.
  • trunk/Source/WebCore/ChangeLog

    r153064 r153067  
     12013-07-19  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        The computed values of fix length padding should be subpixel precision like margin
     4        https://bugs.webkit.org/show_bug.cgi?id=118936
     5
     6        Reviewed by Simon Fraser.
     7
     8        The bug was caused by ComputedStyleExtractor::propertyValue always returning the used value
     9        for padding. Fixed the bug by returning the computed value when they're of fixed length.
     10
     11        This aligns the behaviors of getComputedStyle(~).padding~ with getComputedStyle(~).margin~,
     12        which had been fixed in r102149. While the current CSSOM specification says getComputedStyle
     13        should return the used values for margins when display property is set to anything but none,
     14        new behavior matches that of Chrome, Firefox, and Internet Explorer.
     15
     16        Also extracted zoomAdjustedPaddingOrMarginPixelValue to reduce the code duplication.
     17
     18        Test: fast/css/getComputedStyle/getComputedStyle-padding-margin-subpixel-length.html
     19
     20        * css/CSSComputedStyleDeclaration.cpp:
     21        (WebCore::zoomAdjustedPaddingOrMarginPixelValue): Extracted.
     22        (WebCore::ComputedStyleExtractor::propertyValue):
     23
    1242013-07-23  Alex Christensen  <achristensen@apple.com>
    225
  • trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp

    r152938 r153067  
    15971597}
    15981598
     1599typedef Length (RenderStyle::*RenderStyleLengthGetter)() const;
     1600typedef LayoutUnit (RenderBoxModelObject::*RenderBoxComputedCSSValueGetter)() const;
     1601
     1602template<RenderStyleLengthGetter lengthGetter, RenderBoxComputedCSSValueGetter computedCSSValueGetter>
     1603inline PassRefPtr<CSSValue> zoomAdjustedPaddingOrMarginPixelValue(RenderStyle* style, RenderObject* renderer)
     1604{
     1605    Length unzoomedLength = (style->*lengthGetter)();
     1606    if (unzoomedLength.isFixed() || !renderer || !renderer->isBox())
     1607        return zoomAdjustedPixelValueForLength(unzoomedLength, style);
     1608    return zoomAdjustedPixelValue((toRenderBox(renderer)->*computedCSSValueGetter)(), style);
     1609}
     1610
    15991611PassRefPtr<CSSValue> ComputedStyleExtractor::propertyValue(CSSPropertyID propertyID, EUpdateLayout updateLayout) const
    16001612{
     
    20732085                return cssValuePool().createIdentifierValue(CSSValueAuto);
    20742086            return cssValuePool().createValue(style->locale(), CSSPrimitiveValue::CSS_STRING);
    2075         case CSSPropertyMarginTop: {
    2076             Length marginTop = style->marginTop();
    2077             if (marginTop.isFixed() || !renderer || !renderer->isBox())
    2078                 return zoomAdjustedPixelValueForLength(marginTop, style.get());
    2079             return zoomAdjustedPixelValue(toRenderBox(renderer)->marginTop(), style.get());
    2080         }
     2087        case CSSPropertyMarginTop:
     2088            return zoomAdjustedPaddingOrMarginPixelValue<&RenderStyle::marginTop, &RenderBoxModelObject::marginTop>(style.get(), renderer);
    20812089        case CSSPropertyMarginRight: {
    20822090            Length marginRight = style->marginRight();
     
    20932101            return zoomAdjustedPixelValue(value, style.get());
    20942102        }
    2095         case CSSPropertyMarginBottom: {
    2096             Length marginBottom = style->marginBottom();
    2097             if (marginBottom.isFixed() || !renderer || !renderer->isBox())
    2098                 return zoomAdjustedPixelValueForLength(marginBottom, style.get());
    2099             return zoomAdjustedPixelValue(toRenderBox(renderer)->marginBottom(), style.get());
    2100         }
    2101         case CSSPropertyMarginLeft: {
    2102             Length marginLeft = style->marginLeft();
    2103             if (marginLeft.isFixed() || !renderer || !renderer->isBox())
    2104                 return zoomAdjustedPixelValueForLength(marginLeft, style.get());
    2105             return zoomAdjustedPixelValue(toRenderBox(renderer)->marginLeft(), style.get());
    2106         }
     2103        case CSSPropertyMarginBottom:
     2104            return zoomAdjustedPaddingOrMarginPixelValue<&RenderStyle::marginBottom, &RenderBoxModelObject::marginBottom>(style.get(), renderer);
     2105        case CSSPropertyMarginLeft:
     2106            return zoomAdjustedPaddingOrMarginPixelValue<&RenderStyle::marginLeft, &RenderBoxModelObject::marginLeft>(style.get(), renderer);
    21072107        case CSSPropertyWebkitMarqueeDirection:
    21082108            return cssValuePool().createValue(style->marqueeDirection());
     
    21642164            return cssValuePool().createValue(style->overflowY());
    21652165        case CSSPropertyPaddingTop:
    2166             if (renderer && renderer->isBox())
    2167                 return zoomAdjustedPixelValue(toRenderBox(renderer)->computedCSSPaddingTop(), style.get());
    2168             return zoomAdjustedPixelValueForLength(style->paddingTop(), style.get());
     2166            return zoomAdjustedPaddingOrMarginPixelValue<&RenderStyle::paddingTop, &RenderBoxModelObject::computedCSSPaddingTop>(style.get(), renderer);
    21692167        case CSSPropertyPaddingRight:
    2170             if (renderer && renderer->isBox())
    2171                 return zoomAdjustedPixelValue(toRenderBox(renderer)->computedCSSPaddingRight(), style.get());
    2172             return zoomAdjustedPixelValueForLength(style->paddingRight(), style.get());
     2168            return zoomAdjustedPaddingOrMarginPixelValue<&RenderStyle::paddingRight, &RenderBoxModelObject::computedCSSPaddingRight>(style.get(), renderer);
    21732169        case CSSPropertyPaddingBottom:
    2174             if (renderer && renderer->isBox())
    2175                 return zoomAdjustedPixelValue(toRenderBox(renderer)->computedCSSPaddingBottom(), style.get());
    2176             return zoomAdjustedPixelValueForLength(style->paddingBottom(), style.get());
     2170            return zoomAdjustedPaddingOrMarginPixelValue<&RenderStyle::paddingBottom, &RenderBoxModelObject::computedCSSPaddingBottom>(style.get(), renderer);
    21772171        case CSSPropertyPaddingLeft:
    2178             if (renderer && renderer->isBox())
    2179                 return zoomAdjustedPixelValue(toRenderBox(renderer)->computedCSSPaddingLeft(), style.get());
    2180             return zoomAdjustedPixelValueForLength(style->paddingLeft(), style.get());
     2172            return zoomAdjustedPaddingOrMarginPixelValue<&RenderStyle::paddingLeft, &RenderBoxModelObject::computedCSSPaddingLeft>(style.get(), renderer);
    21812173        case CSSPropertyPageBreakAfter:
    21822174            return cssValuePool().createValue(style->pageBreakAfter());
Note: See TracChangeset for help on using the changeset viewer.