Ignore:
Timestamp:
Jan 11, 2022, 8:08:49 PM (3 years ago)
Author:
Simon Fraser
Message:

Serialize CSS <number> values with rounding, limited decimal precision, and no exponents per-spec
LayoutTests/imported/w3c:

https://bugs.webkit.org/show_bug.cgi?id=218880

Reviewed by Darin Adler.

  • web-platform-tests/css/css-cascade/revert-val-006-expected.txt:
  • web-platform-tests/css/css-cascade/revert-val-007-expected.txt:
  • web-platform-tests/css/css-easing/cubic-bezier-timing-functions-output-expected.txt:
  • web-platform-tests/css/css-fonts/parsing/font-computed-expected.txt:
  • web-platform-tests/css/css-fonts/variations/at-font-face-descriptors-expected.txt:
  • web-platform-tests/css/css-masking/clip-path/interpolation-expected.txt:
  • web-platform-tests/css/css-shapes/basic-shape-interpolation-expected.txt:
  • web-platform-tests/css/css-transforms/2d-rotate-js-expected.txt:
  • web-platform-tests/css/css-transforms/animation/transform-interpolation-001-expected.txt:
  • web-platform-tests/css/css-transforms/animation/transform-interpolation-inline-value-expected.txt:
  • web-platform-tests/css/css-transforms/animation/transform-matrix-composition-expected.txt:
  • web-platform-tests/css/css-values/acos-asin-atan-atan2-serialize-expected.txt:
  • web-platform-tests/css/css-values/calc-numbers-expected.txt:
  • web-platform-tests/css/css-values/hypot-pow-sqrt-invalid-expected.txt:
  • web-platform-tests/css/css-values/minmax-angle-serialize-expected.txt:
  • web-platform-tests/css/css-values/minmax-number-computed-expected.txt:
  • web-platform-tests/css/css-values/minmax-number-serialize-expected.txt:
  • web-platform-tests/css/css-variables/variable-presentation-attribute-expected.txt:
  • web-platform-tests/css/cssom/getComputedStyle-line-height-expected.txt:
  • web-platform-tests/css/motion/animation/offset-rotate-interpolation-expected.txt:
  • web-platform-tests/html/rendering/dimension-attributes-expected.txt:
  • web-platform-tests/html/rendering/pixel-length-attributes-expected.txt:
  • web-platform-tests/web-animations/animation-model/animation-types/accumulation-per-property-001-expected.txt:
  • web-platform-tests/web-animations/animation-model/animation-types/accumulation-per-property-002-expected.txt:
  • web-platform-tests/web-animations/animation-model/animation-types/addition-per-property-001-expected.txt:
  • web-platform-tests/web-animations/animation-model/animation-types/addition-per-property-002-expected.txt:
  • web-platform-tests/web-animations/animation-model/animation-types/interpolation-per-property-001-expected.txt:
  • web-platform-tests/web-animations/animation-model/animation-types/interpolation-per-property-002-expected.txt:
  • web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-iteration-composite-operation-expected.txt:

Source/WebCore:

https://bugs.webkit.org/show_bug.cgi?id=218880

Reviewed by Darin Adler.

Serializes CSS numbers with up to a maximum of 6 decimal places, as required by CSSOM-1
https://www.w3.org/TR/cssom-1/#serialize-a-css-component-value

Introduces CSSUnitType::CSS_INTEGER to differentiate types that are explicitly integers, and uses the
new <number> serialization for CSS_NUMBER.

  • css/CSSComputedStyleDeclaration.cpp:

(WebCore::valueForGridPosition):
(WebCore::counterToCSSValue):
(WebCore::ComputedStyleExtractor::valueForPropertyInStyle):

  • css/CSSPrimitiveValue.cpp:

(WebCore::isValidCSSUnitTypeForDoubleConversion):
(WebCore::isStringType):
(WebCore::CSSPrimitiveValue::cleanup):
(WebCore::CSSPrimitiveValue::doubleValueInternal const):
(WebCore::CSSPrimitiveValue::formatNumberValue const):
(WebCore::CSSPrimitiveValue::formatIntegerValue const):
(WebCore::CSSPrimitiveValue::unitTypeString):
(WebCore::CSSPrimitiveValue::formatNumberForCustomCSSText const):
(WebCore::CSSPrimitiveValue::equals const):

  • css/CSSPrimitiveValue.h:
  • css/CSSPrimitiveValueMappings.h:

(WebCore::CSSPrimitiveValue::operator short const):
(WebCore::CSSPrimitiveValue::operator unsigned short const):
(WebCore::CSSPrimitiveValue::operator int const):
(WebCore::CSSPrimitiveValue::operator unsigned const):
(WebCore::CSSPrimitiveValue::operator float const):
(WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
(WebCore::CSSPrimitiveValue::operator LineClampValue const):
(WebCore::CSSPrimitiveValue::operator ColumnSpan const):

  • css/CSSUnits.cpp:

(WebCore::unitCategory):
(WebCore::operator<<):

  • css/CSSUnits.h:
  • css/DeprecatedCSSOMPrimitiveValue.cpp:

(WebCore::DeprecatedCSSOMPrimitiveValue::primitiveType const):

  • css/MediaQueryEvaluator.cpp:

(WebCore::doubleValue):
(WebCore::evaluateResolution):
(WebCore::devicePixelRatioEvaluate):
(WebCore::computeLength):

  • css/MediaQueryExpression.cpp:

(WebCore::featureWithValidPositiveLength):
(WebCore::featureWithPositiveInteger):
(WebCore::featureWithPositiveNumber):
(WebCore::featureWithZeroOrOne):
(WebCore::MediaQueryExpression::MediaQueryExpression):

  • css/StyleProperties.cpp:

(WebCore::StyleProperties::getPropertyValue const):

  • css/calc/CSSCalcCategoryMapping.cpp:

(WebCore::calcUnitCategory):
(WebCore::calculationCategoryForCombination):
(WebCore::hasDoubleValue):

  • css/calc/CSSCalcPrimitiveValueNode.cpp:

(WebCore::CSSCalcPrimitiveValueNode::isNumericValue const):

  • css/parser/CSSParserImpl.cpp:

(WebCore::CSSParserImpl::consumeFontPaletteValuesRule):

  • css/parser/CSSPropertyParser.cpp:

(WebCore::consumeCounter):
(WebCore::consumeCounterStyleRange):

  • css/parser/CSSPropertyParserHelpers.cpp:

(WebCore::CSSPropertyParserHelpers::CalcParser::consumeInteger):
(WebCore::CSSPropertyParserHelpers::consumeIntegerTypeCSSPrimitiveValueWithCalcWithKnownTokenTypeFunction):
(WebCore::CSSPropertyParserHelpers::consumeIntegerTypeCSSPrimitiveValueWithCalcWithKnownTokenTypeNumber):

  • style/StyleBuilderConverter.h:

(WebCore::Style::BuilderConverter::createGridPosition):

Source/WTF:

https://bugs.webkit.org/show_bug.cgi?id=218880

Reviewed by Darin Adler.

Add new numberToCSSString and FormattedCSSNumber that handle converting a double into the format required by
CSS (unlimited number of digits before the decimal place, up to 6 decimal places, no trailing zeros.

  • wtf/dtoa.cpp:

(WTF::truncateTrailingZeros):
(WTF::numberToFixedPrecisionString):
(WTF::numberToCSSString):

  • wtf/dtoa.h:
  • wtf/dtoa/double-conversion.cc:
  • wtf/dtoa/double-conversion.h:
  • wtf/text/StringConcatenateNumbers.h:

(WTF::FormattedCSSNumber::create):
(WTF::FormattedCSSNumber::length const):
(WTF::FormattedCSSNumber::buffer const):
(WTF::StringTypeAdapter<FormattedCSSNumber>::StringTypeAdapter):
(WTF::StringTypeAdapter<FormattedCSSNumber>::length const):
(WTF::StringTypeAdapter<FormattedCSSNumber>::is8Bit const):
(WTF::StringTypeAdapter<FormattedCSSNumber>::writeTo const):

LayoutTests:

https://bugs.webkit.org/show_bug.cgi?id=218880

Reviewed by Darin Adler.

  • css3/calc/font-size-fractional-expected.txt:
  • css3/calc/simplification-expected.txt:
  • css3/color-filters/color-filter-parsing.html:
  • css3/filters/backdrop/backdropfilter-property-computed-style-expected.txt:
  • css3/filters/backdrop/backdropfilter-property-computed-style.html:
  • css3/filters/filter-property-computed-style-expected.txt:
  • css3/filters/filter-property-computed-style.html:
  • css3/filters/unprefixed-expected.txt:
  • css3/filters/unprefixed.html:
  • css3/scroll-snap/scroll-snap-property-computed-style-expected.txt:
  • css3/scroll-snap/scroll-snap-property-computed-style.js:
  • fast/css/calc-parsing-expected.txt:
  • fast/css/calc-parsing-limits-expected.txt:
  • fast/css/calc-parsing-limits.html:
  • fast/css/calc-parsing.html:
  • fast/css/calc-with-angle-time-frequency-expected.txt:
  • fast/css/calc-with-angle-time-frequency.html:
  • fast/css/large-value-csstext-expected.txt:
  • fast/css/line-height-get-computed-style-expected.txt:
  • fast/css/line-height-get-computed-style.html:
  • fast/css/parsing-stroke-width-expected.txt:
  • fast/css/round-trip-values-expected.txt:
  • media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-volume-styles-expected.txt:
  • media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-volume-styles.html:
  • platform/ios-wk2/imported/w3c/web-platform-tests/html/rendering/pixel-length-attributes-expected.txt:
  • platform/ios/fast/forms/search/search-zoom-computed-style-height-expected.txt:
  • svg/css/parse-height-expected.txt:
  • svg/css/parse-height.html:
  • svg/css/parse-length-expected.txt:
  • svg/css/parse-length.html:
  • transitions/frames-timing-function-expected.txt:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp

    r287762 r287909  
    10701070    if (position.isSpan()) {
    10711071        list->append(cssValuePool.createIdentifierValue(CSSValueSpan));
    1072         list->append(cssValuePool.createValue(position.spanPosition(), CSSUnitType::CSS_NUMBER));
     1072        list->append(cssValuePool.createValue(position.spanPosition(), CSSUnitType::CSS_INTEGER));
    10731073    } else
    1074         list->append(cssValuePool.createValue(position.integerPosition(), CSSUnitType::CSS_NUMBER));
     1074        list->append(cssValuePool.createValue(position.integerPosition(), CSSUnitType::CSS_INTEGER));
    10751075
    10761076    if (!position.namedGridLine().isNull())
     
    19411941    for (auto& keyValue : *map) {
    19421942        list->append(cssValuePool.createCustomIdent(keyValue.key));
    1943         double number = (propertyID == CSSPropertyCounterIncrement ? keyValue.value.incrementValue : keyValue.value.resetValue).value_or(0);
    1944         list->append(cssValuePool.createValue(number, CSSUnitType::CSS_NUMBER));
     1943        int number = (propertyID == CSSPropertyCounterIncrement ? keyValue.value.incrementValue : keyValue.value.resetValue).value_or(0);
     1944        list->append(cssValuePool.createValue(number, CSSUnitType::CSS_INTEGER));
    19451945    }
    19461946    return list;
     
    29772977            return cssValuePool.createValue(style.boxFlex(), CSSUnitType::CSS_NUMBER);
    29782978        case CSSPropertyWebkitBoxFlexGroup:
    2979             return cssValuePool.createValue(style.boxFlexGroup(), CSSUnitType::CSS_NUMBER);
     2979            return cssValuePool.createValue(style.boxFlexGroup(), CSSUnitType::CSS_INTEGER);
    29802980        case CSSPropertyWebkitBoxLines:
    29812981            return cssValuePool.createValue(style.boxLines());
    29822982        case CSSPropertyWebkitBoxOrdinalGroup:
    2983             return cssValuePool.createValue(style.boxOrdinalGroup(), CSSUnitType::CSS_NUMBER);
     2983            return cssValuePool.createValue(style.boxOrdinalGroup(), CSSUnitType::CSS_INTEGER);
    29842984        case CSSPropertyWebkitBoxOrient:
    29852985            return cssValuePool.createValue(style.boxOrient());
     
    30983098            return getCSSPropertyValuesForShorthandProperties(placeSelfShorthand());
    30993099        case CSSPropertyOrder:
    3100             return cssValuePool.createValue(style.order(), CSSUnitType::CSS_NUMBER);
     3100            return cssValuePool.createValue(style.order(), CSSUnitType::CSS_INTEGER);
    31013101        case CSSPropertyFloat:
    31023102            if (style.display() != DisplayType::None && style.hasOutOfFlowPosition())
     
    32503250            if (style.lineClamp().isNone())
    32513251                return cssValuePool.createIdentifierValue(CSSValueNone);
    3252             return cssValuePool.createValue(style.lineClamp().value(), style.lineClamp().isPercentage() ? CSSUnitType::CSS_PERCENTAGE : CSSUnitType::CSS_NUMBER);
     3252            return cssValuePool.createValue(style.lineClamp().value(), style.lineClamp().isPercentage() ? CSSUnitType::CSS_PERCENTAGE : CSSUnitType::CSS_INTEGER);
    32533253        case CSSPropertyLineHeight:
    32543254            return lineHeightFromStyle(style);
     
    33363336            if (style.hasAutoOrphans())
    33373337                return cssValuePool.createIdentifierValue(CSSValueAuto);
    3338             return cssValuePool.createValue(style.orphans(), CSSUnitType::CSS_NUMBER);
     3338            return cssValuePool.createValue(style.orphans(), CSSUnitType::CSS_INTEGER);
    33393339        case CSSPropertyOutlineColor:
    33403340            return m_allowVisitedStyle ? cssValuePool.createColorValue(style.visitedDependentColor(CSSPropertyOutlineColor)) : currentColorOrValidColor(&style, style.outlineColor());
     
    35283528            if (style.hasAutoWidows())
    35293529                return cssValuePool.createIdentifierValue(CSSValueAuto);
    3530             return cssValuePool.createValue(style.widows(), CSSUnitType::CSS_NUMBER);
     3530            return cssValuePool.createValue(style.widows(), CSSUnitType::CSS_INTEGER);
    35313531        case CSSPropertyWidth:
    35323532            if (renderer && !renderer->isRenderOrLegacyRenderSVGModelObject()) {
     
    35703570            if (style.hasAutoSpecifiedZIndex())
    35713571                return cssValuePool.createIdentifierValue(CSSValueAuto);
    3572             return cssValuePool.createValue(style.specifiedZIndex(), CSSUnitType::CSS_NUMBER);
     3572            return cssValuePool.createValue(style.specifiedZIndex(), CSSUnitType::CSS_INTEGER);
    35733573        case CSSPropertyZoom:
    35743574            return cssValuePool.createValue(style.zoom(), CSSUnitType::CSS_NUMBER);
Note: See TracChangeset for help on using the changeset viewer.