Changeset 237835 in webkit


Ignore:
Timestamp:
Nov 5, 2018 4:11:15 PM (5 years ago)
Author:
mmaxfield@apple.com
Message:

Parsing support for text-underline-offset and text-decoration-thickness
https://bugs.webkit.org/show_bug.cgi?id=191242

Reviewed by Simon Fraser.

Source/WebCore:

Before we can implement the properties properly, we have to parse them.

https://github.com/w3c/csswg-drafts/issues/3118#issuecomment-432297480 describes the grammar:

text-underline-position: auto | [ [ under | from-font]
[ left | right ] ]

text-underline-offset: auto | <length>
text-decoration-thickness: auto | from-font | <length>

This patch also takes the opportunity to update the grammar of text-underline-position to match the spec,
and to add an alias to the unprefixed version.

We still don't support the left and right values on text-underline-position. We should add those eventually.

Tests: fast/css3-text/css3-text-decoration/text-decoration-thickness-parse.html

fast/css3-text/css3-text-decoration/text-underline-offset-parse.html

  • WebCore.xcodeproj/project.pbxproj:
  • css/CSSComputedStyleDeclaration.cpp:

(WebCore::textUnderlineOffsetToCSSValue):
(WebCore::textDecorationThicknessToCSSValue):
(WebCore::ComputedStyleExtractor::valueForPropertyinStyle):

  • css/CSSPrimitiveValueMappings.h:

(WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
(WebCore::CSSPrimitiveValue::operator TextUnderlinePosition const):
(WebCore::CSSPrimitiveValue::operator OptionSet<TextUnderlinePosition> const): Deleted.

  • css/CSSProperties.json:
  • css/CSSValueKeywords.in:
  • css/StyleBuilderConverter.h:

(WebCore::StyleBuilderConverter::convertTextUnderlinePosition):
(WebCore::StyleBuilderConverter::convertTextUnderlineOffset):
(WebCore::StyleBuilderConverter::convertTextDecorationThickness):

  • css/StyleResolver.cpp:

(WebCore::shouldApplyPropertyInParseOrder):

  • css/parser/CSSPropertyParser.cpp:

(WebCore::consumeTextUnderlineOffset):
(WebCore::consumeTextDecorationThickness):
(WebCore::CSSPropertyParser::parseSingleValue):

  • rendering/style/RenderStyle.h:

(WebCore::RenderStyle::textUnderlinePosition const):
(WebCore::RenderStyle::textUnderlineOffset const):
(WebCore::RenderStyle::textDecorationThickness const):
(WebCore::RenderStyle::setTextUnderlinePosition):
(WebCore::RenderStyle::setTextUnderlineOffset):
(WebCore::RenderStyle::setTextDecorationThickness):
(WebCore::RenderStyle::initialTextUnderlinePosition):
(WebCore::RenderStyle::initialTextUnderlineOffset):
(WebCore::RenderStyle::initialTextDecorationThickness):

  • rendering/style/RenderStyleConstants.h:
  • rendering/style/StyleRareInheritedData.cpp:

(WebCore::StyleRareInheritedData::StyleRareInheritedData):
(WebCore::StyleRareInheritedData::operator== const):

  • rendering/style/StyleRareInheritedData.h:
  • rendering/style/TextDecorationThickness.h: Added.

(WebCore::TextDecorationThickness::createWithAuto):
(WebCore::TextDecorationThickness::createFromFont):
(WebCore::TextDecorationThickness::createWithLength):
(WebCore::TextDecorationThickness::isAuto const):
(WebCore::TextDecorationThickness::isFromFont const):
(WebCore::TextDecorationThickness::isLength const):
(WebCore::TextDecorationThickness::setLengthValue):
(WebCore::TextDecorationThickness::lengthValue const):
(WebCore::TextDecorationThickness::operator== const):
(WebCore::TextDecorationThickness::operator!= const):
(WebCore::TextDecorationThickness::TextDecorationThickness):
(WebCore::operator<<):

  • rendering/style/TextUnderlineOffset.h: Added.

(WebCore::TextUnderlineOffset::createWithAuto):
(WebCore::TextUnderlineOffset::createWithLength):
(WebCore::TextUnderlineOffset::isAuto const):
(WebCore::TextUnderlineOffset::isLength const):
(WebCore::TextUnderlineOffset::setLengthValue):
(WebCore::TextUnderlineOffset::lengthValue const):
(WebCore::TextUnderlineOffset::lengthOr const):
(WebCore::TextUnderlineOffset::operator== const):
(WebCore::TextUnderlineOffset::operator!= const):
(WebCore::TextUnderlineOffset::TextUnderlineOffset):
(WebCore::operator<<):

  • style/InlineTextBoxStyle.cpp:

(WebCore::computeUnderlineOffset):

  • style/InlineTextBoxStyle.h:

LayoutTests:

  • fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position-expected.txt:
  • fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position.html: Update the

test for the new grammar of text-underline-position

  • fast/css3-text/css3-text-decoration/text-decoration-thickness-parse-expected.txt: Added.
  • fast/css3-text/css3-text-decoration/text-decoration-thickness-parse.html: Added.
  • fast/css3-text/css3-text-decoration/text-underline-offset-parse-expected.txt: Added.
  • fast/css3-text/css3-text-decoration/text-underline-offset-parse.html: Added.
Location:
trunk
Files:
6 added
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r237834 r237835  
     12018-11-05  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        Parsing support for text-underline-offset and text-decoration-thickness
     4        https://bugs.webkit.org/show_bug.cgi?id=191242
     5
     6        Reviewed by Simon Fraser.
     7
     8        * fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position-expected.txt:
     9        * fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position.html: Update the
     10        test for the new grammar of text-underline-position
     11        * fast/css3-text/css3-text-decoration/text-decoration-thickness-parse-expected.txt: Added.
     12        * fast/css3-text/css3-text-decoration/text-decoration-thickness-parse.html: Added.
     13        * fast/css3-text/css3-text-decoration/text-underline-offset-parse-expected.txt: Added.
     14        * fast/css3-text/css3-text-decoration/text-underline-offset-parse.html: Added.
     15
    1162018-11-05  Myles C. Maxfield  <mmaxfield@apple.com>
    217
  • trunk/LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position-expected.txt

    r150941 r237835  
    3232PASS computedStyle.getPropertyCSSValue('-webkit-text-underline-position').cssText is 'auto'
    3333
    34 Value 'alphabetic':
    35 PASS e.style.webkitTextUnderlinePosition is 'alphabetic'
    36 PASS e.style.getPropertyCSSValue('-webkit-text-underline-position').toString() is '[object CSSPrimitiveValue]'
    37 PASS e.style.getPropertyCSSValue('-webkit-text-underline-position').cssText is 'alphabetic'
    38 PASS computedStyle.webkitTextUnderlinePosition is 'alphabetic'
    39 PASS computedStyle.getPropertyCSSValue('-webkit-text-underline-position').toString() is '[object CSSPrimitiveValue]'
    40 PASS computedStyle.getPropertyCSSValue('-webkit-text-underline-position').cssText is 'alphabetic'
    41 
    4234Value 'under':
    4335PASS e.style.webkitTextUnderlinePosition is 'under'
  • trunk/LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position.html

    r217390 r237835  
    2626description("Test to make sure -webkit-text-underline-position property returns values properly.")
    2727
    28 // FIXME: This test tests property values 'auto', 'alphabetic' and 'under'. We don't fully match
     28// FIXME: This test tests property values 'auto' and 'under'. We don't fully match
    2929// the specification as we don't support [ left | right ] and this is left for another implementation
    3030// as the rendering will need to be added.
     
    5858testElementStyle("webkitTextUnderlinePosition", "-webkit-text-underline-position", "[object CSSPrimitiveValue]", "auto");
    5959testComputedStyle("webkitTextUnderlinePosition", "-webkit-text-underline-position", "[object CSSPrimitiveValue]", "auto");
    60 debug('');
    61 
    62 debug("Value 'alphabetic':");
    63 e.style.webkitTextUnderlinePosition = 'alphabetic';
    64 testElementStyle("webkitTextUnderlinePosition", "-webkit-text-underline-position", "[object CSSPrimitiveValue]", "alphabetic");
    65 testComputedStyle("webkitTextUnderlinePosition", "-webkit-text-underline-position", "[object CSSPrimitiveValue]", "alphabetic");
    6660debug('');
    6761
  • trunk/Source/WebCore/ChangeLog

    r237834 r237835  
     12018-11-05  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        Parsing support for text-underline-offset and text-decoration-thickness
     4        https://bugs.webkit.org/show_bug.cgi?id=191242
     5
     6        Reviewed by Simon Fraser.
     7
     8        Before we can implement the properties properly, we have to parse them.
     9
     10        https://github.com/w3c/csswg-drafts/issues/3118#issuecomment-432297480 describes the grammar:
     11        text-underline-position: auto | [ [ under | from-font] || [ left | right ] ]
     12        text-underline-offset: auto | <length>
     13        text-decoration-thickness: auto | from-font | <length>
     14
     15        This patch also takes the opportunity to update the grammar of text-underline-position to match the spec,
     16        and to add an alias to the unprefixed version.
     17
     18        We still don't support the left and right values on text-underline-position. We should add those eventually.
     19
     20        Tests: fast/css3-text/css3-text-decoration/text-decoration-thickness-parse.html
     21               fast/css3-text/css3-text-decoration/text-underline-offset-parse.html
     22
     23        * WebCore.xcodeproj/project.pbxproj:
     24        * css/CSSComputedStyleDeclaration.cpp:
     25        (WebCore::textUnderlineOffsetToCSSValue):
     26        (WebCore::textDecorationThicknessToCSSValue):
     27        (WebCore::ComputedStyleExtractor::valueForPropertyinStyle):
     28        * css/CSSPrimitiveValueMappings.h:
     29        (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
     30        (WebCore::CSSPrimitiveValue::operator TextUnderlinePosition const):
     31        (WebCore::CSSPrimitiveValue::operator OptionSet<TextUnderlinePosition> const): Deleted.
     32        * css/CSSProperties.json:
     33        * css/CSSValueKeywords.in:
     34        * css/StyleBuilderConverter.h:
     35        (WebCore::StyleBuilderConverter::convertTextUnderlinePosition):
     36        (WebCore::StyleBuilderConverter::convertTextUnderlineOffset):
     37        (WebCore::StyleBuilderConverter::convertTextDecorationThickness):
     38        * css/StyleResolver.cpp:
     39        (WebCore::shouldApplyPropertyInParseOrder):
     40        * css/parser/CSSPropertyParser.cpp:
     41        (WebCore::consumeTextUnderlineOffset):
     42        (WebCore::consumeTextDecorationThickness):
     43        (WebCore::CSSPropertyParser::parseSingleValue):
     44        * rendering/style/RenderStyle.h:
     45        (WebCore::RenderStyle::textUnderlinePosition const):
     46        (WebCore::RenderStyle::textUnderlineOffset const):
     47        (WebCore::RenderStyle::textDecorationThickness const):
     48        (WebCore::RenderStyle::setTextUnderlinePosition):
     49        (WebCore::RenderStyle::setTextUnderlineOffset):
     50        (WebCore::RenderStyle::setTextDecorationThickness):
     51        (WebCore::RenderStyle::initialTextUnderlinePosition):
     52        (WebCore::RenderStyle::initialTextUnderlineOffset):
     53        (WebCore::RenderStyle::initialTextDecorationThickness):
     54        * rendering/style/RenderStyleConstants.h:
     55        * rendering/style/StyleRareInheritedData.cpp:
     56        (WebCore::StyleRareInheritedData::StyleRareInheritedData):
     57        (WebCore::StyleRareInheritedData::operator== const):
     58        * rendering/style/StyleRareInheritedData.h:
     59        * rendering/style/TextDecorationThickness.h: Added.
     60        (WebCore::TextDecorationThickness::createWithAuto):
     61        (WebCore::TextDecorationThickness::createFromFont):
     62        (WebCore::TextDecorationThickness::createWithLength):
     63        (WebCore::TextDecorationThickness::isAuto const):
     64        (WebCore::TextDecorationThickness::isFromFont const):
     65        (WebCore::TextDecorationThickness::isLength const):
     66        (WebCore::TextDecorationThickness::setLengthValue):
     67        (WebCore::TextDecorationThickness::lengthValue const):
     68        (WebCore::TextDecorationThickness::operator== const):
     69        (WebCore::TextDecorationThickness::operator!= const):
     70        (WebCore::TextDecorationThickness::TextDecorationThickness):
     71        (WebCore::operator<<):
     72        * rendering/style/TextUnderlineOffset.h: Added.
     73        (WebCore::TextUnderlineOffset::createWithAuto):
     74        (WebCore::TextUnderlineOffset::createWithLength):
     75        (WebCore::TextUnderlineOffset::isAuto const):
     76        (WebCore::TextUnderlineOffset::isLength const):
     77        (WebCore::TextUnderlineOffset::setLengthValue):
     78        (WebCore::TextUnderlineOffset::lengthValue const):
     79        (WebCore::TextUnderlineOffset::lengthOr const):
     80        (WebCore::TextUnderlineOffset::operator== const):
     81        (WebCore::TextUnderlineOffset::operator!= const):
     82        (WebCore::TextUnderlineOffset::TextUnderlineOffset):
     83        (WebCore::operator<<):
     84        * style/InlineTextBoxStyle.cpp:
     85        (WebCore::computeUnderlineOffset):
     86        * style/InlineTextBoxStyle.h:
     87
    1882018-11-05  Myles C. Maxfield  <mmaxfield@apple.com>
    289
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r237816 r237835  
    632632                1C24EEA91C72A7B40080F8FC /* JSFontFaceSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C24EEA71C72A7B40080F8FC /* JSFontFaceSet.h */; };
    633633                1C6626111C6E7CA600AB527C /* FontFace.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C66260F1C6E7CA600AB527C /* FontFace.h */; };
     634                1C73A7132185757E004CCEA5 /* TextUnderlineOffset.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CB6B4FB217B83940093B9CD /* TextUnderlineOffset.h */; settings = {ATTRIBUTES = (Private, ); }; };
     635                1C73A71521857587004CCEA5 /* TextDecorationThickness.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CB6B4F8217B83930093B9CD /* TextDecorationThickness.h */; settings = {ATTRIBUTES = (Private, ); }; };
    634636                1C81B95A0E97330800266E07 /* InspectorController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C81B9560E97330800266E07 /* InspectorController.h */; settings = {ATTRIBUTES = (Private, ); }; };
    635637                1C81B95C0E97330800266E07 /* InspectorClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C81B9580E97330800266E07 /* InspectorClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    63876389                1CAF347F0A6C405200ABE06E /* WebScriptObject.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebScriptObject.mm; sourceTree = "<group>"; };
    63886390                1CAF34800A6C405200ABE06E /* WebScriptObjectPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebScriptObjectPrivate.h; sourceTree = "<group>"; };
     6391                1CB6B4F8217B83930093B9CD /* TextDecorationThickness.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TextDecorationThickness.h; sourceTree = "<group>"; };
     6392                1CB6B4FB217B83940093B9CD /* TextUnderlineOffset.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TextUnderlineOffset.h; sourceTree = "<group>"; };
    63896393                1CCDF5BB1990332400BCEBAD /* SVGToOTFFontConversion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGToOTFFontConversion.cpp; sourceTree = "<group>"; };
    63906394                1CCDF5BC1990332400BCEBAD /* SVGToOTFFontConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGToOTFFontConversion.h; sourceTree = "<group>"; };
     
    1557315577                                313591021E7DDC6000F30630 /* RTCIceTransportPolicy.h */,
    1557415578                                313591031E7DDC6000F30630 /* RTCIceTransportState.h */,
    15575                                 412BA5FE218C651800365474 /* RTCPMuxPolicy.h */,
    1557615579                                07221BAA17CF0AD400848E51 /* RTCPeerConnectionHandlerClient.h */,
    1557715580                                41A48A9D1E8312EB00D2AC2D /* RTCPeerConnectionState.h */,
     15581                                412BA5FE218C651800365474 /* RTCPMuxPolicy.h */,
    1557815582                                31EB54DD1E7DC74400C1623B /* RTCRtpTransceiverDirection.h */,
    1557915583                                313591041E7DDC6000F30630 /* RTCSdpType.h */,
     
    2461924623                                BC2274760E8366E200E7F975 /* SVGRenderStyleDefs.cpp */,
    2462024624                                BC2274770E8366E200E7F975 /* SVGRenderStyleDefs.h */,
     24625                                1CB6B4F8217B83930093B9CD /* TextDecorationThickness.h */,
    2462124626                                448B1B780F3A2F9B0047A9E2 /* TextSizeAdjustment.h */,
     24627                                1CB6B4FB217B83940093B9CD /* TextUnderlineOffset.h */,
    2462224628                                0F15ED591B7EC7C500EDDFEB /* WillChangeData.cpp */,
    2462324629                                0F15ED5A1B7EC7C500EDDFEB /* WillChangeData.h */,
     
    3128331289                                142B97CA13138943008BEF4B /* TextControlInnerElements.h in Headers */,
    3128431290                                582DE3251C30C85400BE02A8 /* TextDecorationPainter.h in Headers */,
     31291                                1C73A71521857587004CCEA5 /* TextDecorationThickness.h in Headers */,
    3128531292                                97BC84B412371180000C6161 /* TextDocument.h in Headers */,
    3128631293                                97BC84841236FD93000C6161 /* TextDocumentParser.h in Headers */,
     
    3131331320                                B1AD4E7413A12A4600846B27 /* TextTrackLoader.h in Headers */,
    3131431321                                CD8B5A49180E138B008B8E65 /* TextTrackMediaSource.h in Headers */,
     31322                                1C73A7132185757E004CCEA5 /* TextUnderlineOffset.h in Headers */,
    3131531323                                29FAF4B6195AB08900A522DC /* TextUndoInsertionMarkupMac.h in Headers */,
    3131631324                                498770F11242C535002226BA /* Texture.h in Headers */,
  • trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp

    r237697 r237835  
    216216    CSSPropertyWebkitTextDecorationColor,
    217217    CSSPropertyWebkitTextDecorationSkip,
    218     CSSPropertyWebkitTextUnderlinePosition,
     218    CSSPropertyTextUnderlinePosition,
    219219    CSSPropertyTextIndent,
    220220    CSSPropertyTextRendering,
     
    18031803}
    18041804
     1805static Ref<CSSValue> textUnderlineOffsetToCSSValue(const TextUnderlineOffset& textUnderlineOffset)
     1806{
     1807    if (textUnderlineOffset.isAuto())
     1808        return CSSValuePool::singleton().createIdentifierValue(CSSValueAuto);
     1809    ASSERT(textUnderlineOffset.isLength());
     1810    return CSSValuePool::singleton().createValue(textUnderlineOffset.lengthValue(), CSSPrimitiveValue::CSS_PX);
     1811}
     1812
     1813static Ref<CSSValue> textDecorationThicknessToCSSValue(const TextDecorationThickness& textDecorationThickness)
     1814{
     1815    if (textDecorationThickness.isAuto())
     1816        return CSSValuePool::singleton().createIdentifierValue(CSSValueAuto);
     1817    if (textDecorationThickness.isFromFont())
     1818        return CSSValuePool::singleton().createIdentifierValue(CSSValueFromFont);
     1819    ASSERT(textDecorationThickness.isLength());
     1820    return CSSValuePool::singleton().createValue(textDecorationThickness.lengthValue(), CSSPrimitiveValue::CSS_PX);
     1821}
     1822
    18051823static Ref<CSSValue> renderEmphasisPositionFlagsToCSSValue(OptionSet<TextEmphasisPosition> textEmphasisPosition)
    18061824{
     
    33323350        case CSSPropertyWebkitTextDecorationSkip:
    33333351            return renderTextDecorationSkipFlagsToCSSValue(style.textDecorationSkip());
    3334         case CSSPropertyWebkitTextUnderlinePosition:
     3352        case CSSPropertyTextUnderlinePosition:
    33353353            return cssValuePool.createValue(style.textUnderlinePosition());
     3354        case CSSPropertyTextUnderlineOffset:
     3355            return textUnderlineOffsetToCSSValue(style.textUnderlineOffset());
     3356        case CSSPropertyTextDecorationThickness:
     3357            return textDecorationThicknessToCSSValue(style.textDecorationThickness());
    33363358        case CSSPropertyWebkitTextDecorationsInEffect:
    33373359            return renderTextDecorationFlagsToCSSValue(style.textDecorationsInEffect());
  • trunk/Source/WebCore/css/CSSPrimitiveValueMappings.h

    r236615 r237835  
    26372637}
    26382638
    2639 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(OptionSet<TextUnderlinePosition> e)
    2640     : CSSValue(PrimitiveClass)
    2641 {
    2642     m_primitiveUnitType = CSS_VALUE_ID;
    2643     switch (static_cast<TextUnderlinePosition>(e.toRaw())) {
     2639template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextUnderlinePosition position)
     2640    : CSSValue(PrimitiveClass)
     2641{
     2642    m_primitiveUnitType = CSS_VALUE_ID;
     2643    switch (position) {
    26442644    case TextUnderlinePosition::Auto:
    26452645        m_value.valueID = CSSValueAuto;
    26462646        break;
    2647     case TextUnderlinePosition::Alphabetic:
    2648         m_value.valueID = CSSValueAlphabetic;
    2649         break;
    26502647    case TextUnderlinePosition::Under:
    26512648        m_value.valueID = CSSValueUnder;
    26522649        break;
     2650    case TextUnderlinePosition::FromFont:
     2651        m_value.valueID = CSSValueFromFont;
     2652        break;
    26532653    }
    26542654
     
    26562656}
    26572657
    2658 template<> inline CSSPrimitiveValue::operator OptionSet<TextUnderlinePosition>() const
     2658template<> inline CSSPrimitiveValue::operator TextUnderlinePosition() const
    26592659{
    26602660    ASSERT(isValueID());
     
    26632663    case CSSValueAuto:
    26642664        return TextUnderlinePosition::Auto;
    2665     case CSSValueAlphabetic:
    2666         return TextUnderlinePosition::Alphabetic;
    26672665    case CSSValueUnder:
    26682666        return TextUnderlinePosition::Under;
     2667    case CSSValueFromFont:
     2668        return TextUnderlinePosition::FromFont;
    26692669    default:
    26702670        break;
     
    26722672
    26732673    // FIXME: Implement support for 'under left' and 'under right' values.
    2674 
    26752674    ASSERT_NOT_REACHED();
    26762675    return TextUnderlinePosition::Auto;
  • trunk/Source/WebCore/css/CSSProperties.json

    r237266 r237835  
    59275927            }
    59285928        },
    5929         "-webkit-text-underline-position": {
    5930             "inherited": true,
    5931             "codegen-properties": {
    5932                 "converter": "TextUnderlinePosition"
    5933             },
     5929        "text-underline-position": {
     5930            "codegen-properties": {
     5931                "aliases": [
     5932                    "-webkit-text-underline-position"
     5933                ]
     5934            },
     5935            "inherited": true,
    59345936            "status": {
    59355937                "status": "experimental"
     
    59375939            "specification": {
    59385940                "category": "css-text-decor",
    5939                 "url": "https://www.w3.org/TR/css-text-decor-3/#text-underline-position"
     5941                "url": "https://www.w3.org/TR/css-text-decor-3/#text-underline-position-property"
     5942            }
     5943        },
     5944        "text-underline-offset": {
     5945            "inherited": true,
     5946            "codegen-properties": {
     5947                "converter": "TextUnderlineOffset"
     5948            },
     5949            "status": {
     5950                "status": "experimental"
     5951            },
     5952            "specification": {
     5953                "category": "css-text-decor",
     5954                "url": "https://www.w3.org/TR/css-text-decor-4/#underline-offset"
     5955            }
     5956        },
     5957        "text-decoration-thickness": {
     5958            "inherited": true,
     5959            "codegen-properties": {
     5960                "converter": "TextDecorationThickness"
     5961            },
     5962            "status": {
     5963                "status": "experimental"
     5964            },
     5965            "specification": {
     5966                "category": "css-text-decor",
     5967                "url": "https://www.w3.org/TR/css-text-decor-4/#text-decoration-thickness"
    59405968            }
    59415969        },
  • trunk/Source/WebCore/css/CSSValueKeywords.in

    r237266 r237835  
    14041404browser
    14051405#endif
     1406
     1407// text-decoration-thickness, text-underline-offset
     1408from-font
  • trunk/Source/WebCore/css/StyleBuilderConverter.h

    r237557 r237835  
    8888    static int convertMarqueeSpeed(StyleResolver&, const CSSValue&);
    8989    static Ref<QuotesData> convertQuotes(StyleResolver&, const CSSValue&);
    90     static OptionSet<TextUnderlinePosition> convertTextUnderlinePosition(StyleResolver&, const CSSValue&);
     90    static TextUnderlinePosition convertTextUnderlinePosition(StyleResolver&, const CSSValue&);
     91    static TextUnderlineOffset convertTextUnderlineOffset(StyleResolver&, const CSSValue&);
     92    static TextDecorationThickness convertTextDecorationThickness(StyleResolver&, const CSSValue&);
    9193    static RefPtr<StyleReflection> convertReflection(StyleResolver&, const CSSValue&);
    9294    static IntSize convertInitialLetter(StyleResolver&, const CSSValue&);
     
    638640}
    639641
    640 inline OptionSet<TextUnderlinePosition> StyleBuilderConverter::convertTextUnderlinePosition(StyleResolver&, const CSSValue& value)
    641 {
    642     // This is true if value is 'auto' or 'alphabetic'.
    643     if (is<CSSPrimitiveValue>(value))
    644         return downcast<CSSPrimitiveValue>(value);
    645 
    646     OptionSet<TextUnderlinePosition> combinedPosition;
    647     for (auto& currentValue : downcast<CSSValueList>(value))
    648         combinedPosition.add(downcast<CSSPrimitiveValue>(currentValue.get()));
    649     return combinedPosition;
     642inline TextUnderlinePosition StyleBuilderConverter::convertTextUnderlinePosition(StyleResolver&, const CSSValue& value)
     643{
     644    ASSERT(is<CSSPrimitiveValue>(value));
     645    return downcast<CSSPrimitiveValue>(value);
     646}
     647
     648inline TextUnderlineOffset StyleBuilderConverter::convertTextUnderlineOffset(StyleResolver& styleResolver, const CSSValue& value)
     649{
     650    ASSERT(is<CSSPrimitiveValue>(value));
     651    auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
     652    switch (primitiveValue.valueID()) {
     653    case CSSValueAuto:
     654        return TextUnderlineOffset::createWithAuto();
     655    default:
     656        ASSERT(primitiveValue.isLength());
     657        auto computedLength = convertComputedLength<float>(styleResolver, primitiveValue);
     658        return TextUnderlineOffset::createWithLength(computedLength);
     659    }
     660}
     661
     662inline TextDecorationThickness StyleBuilderConverter::convertTextDecorationThickness(StyleResolver& styleResolver, const CSSValue& value)
     663{
     664    ASSERT(is<CSSPrimitiveValue>(value));
     665    auto& primitiveValue = downcast<CSSPrimitiveValue>(value);
     666    switch (primitiveValue.valueID()) {
     667    case CSSValueAuto:
     668        return TextDecorationThickness::createWithAuto();
     669    case CSSValueFromFont:
     670        return TextDecorationThickness::createFromFont();
     671    default:
     672        ASSERT(primitiveValue.isLength());
     673        auto computedLength = convertComputedLength<float>(styleResolver, primitiveValue);
     674        return TextDecorationThickness::createWithLength(computedLength);
     675    }
    650676}
    651677
  • trunk/Source/WebCore/css/StyleResolver.cpp

    r237697 r237835  
    11761176    case CSSPropertyWebkitTextDecorationColor:
    11771177    case CSSPropertyWebkitTextDecorationSkip:
    1178     case CSSPropertyWebkitTextUnderlinePosition:
     1178    case CSSPropertyTextUnderlinePosition:
     1179    case CSSPropertyTextUnderlineOffset:
     1180    case CSSPropertyTextDecorationThickness:
    11791181    case CSSPropertyTextDecoration:
    11801182        return true;
  • trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp

    r237697 r237835  
    23362336        parsedValue2 = parsedValue1;
    23372337    return createPrimitiveValuePair(parsedValue1.releaseNonNull(), parsedValue2.releaseNonNull(), Pair::IdenticalValueEncoding::Coalesce);
     2338}
     2339
     2340static RefPtr<CSSValue> consumeTextUnderlineOffset(CSSParserTokenRange& range, CSSParserMode cssParserMode)
     2341{
     2342    if (auto value = consumeIdent<CSSValueAuto>(range))
     2343        return value;
     2344    return consumeLength(range, cssParserMode, ValueRangeAll);
     2345}
     2346
     2347static RefPtr<CSSValue> consumeTextDecorationThickness(CSSParserTokenRange& range, CSSParserMode cssParserMode)
     2348{
     2349    if (auto value = consumeIdent<CSSValueAuto, CSSValueFromFont>(range))
     2350        return value;
     2351    return consumeLength(range, cssParserMode, ValueRangeAll);
    23382352}
    23392353
     
    41664180    case CSSPropertyOrder:
    41674181        return consumeInteger(m_range);
    4168     case CSSPropertyWebkitTextUnderlinePosition:
    4169         // auto | alphabetic | [ under || [ left | right ] ], but we only support auto | alphabetic | under for now
    4170         return consumeIdent<CSSValueAuto, CSSValueUnder, CSSValueAlphabetic>(m_range);
     4182    case CSSPropertyTextUnderlinePosition:
     4183        // auto | [ [ under | from-font ] || [ left | right ] ], but we only support auto | under | from-font for now
     4184        return consumeIdent<CSSValueAuto, CSSValueUnder, CSSValueFromFont>(m_range);
     4185    case CSSPropertyTextUnderlineOffset:
     4186        return consumeTextUnderlineOffset(m_range, m_context.mode);
     4187    case CSSPropertyTextDecorationThickness:
     4188        return consumeTextDecorationThickness(m_range, m_context.mode);
    41714189    case CSSPropertyVerticalAlign:
    41724190        return consumeVerticalAlign(m_range, m_context.mode);
  • trunk/Source/WebCore/rendering/style/RenderStyle.h

    r237697 r237835  
    375375    TextDecorationStyle textDecorationStyle() const { return static_cast<TextDecorationStyle>(m_rareNonInheritedData->textDecorationStyle); }
    376376    OptionSet<TextDecorationSkip> textDecorationSkip() const { return OptionSet<TextDecorationSkip>::fromRaw(m_rareInheritedData->textDecorationSkip); }
    377     OptionSet<TextUnderlinePosition> textUnderlinePosition() const { return OptionSet<TextUnderlinePosition>::fromRaw(m_rareInheritedData->textUnderlinePosition); }
     377    TextUnderlinePosition textUnderlinePosition() const { return static_cast<TextUnderlinePosition>(m_rareInheritedData->textUnderlinePosition); }
     378    TextUnderlineOffset textUnderlineOffset() const { return m_rareInheritedData->textUnderlineOffset; }
     379    TextDecorationThickness textDecorationThickness() const { return m_rareInheritedData->textDecorationThickness; }
    378380
    379381#if ENABLE(CSS3_TEXT)
     
    922924    void setTextDecorationStyle(TextDecorationStyle v) { SET_VAR(m_rareNonInheritedData, textDecorationStyle, static_cast<unsigned>(v)); }
    923925    void setTextDecorationSkip(OptionSet<TextDecorationSkip> skip) { SET_VAR(m_rareInheritedData, textDecorationSkip, skip.toRaw()); }
    924     void setTextUnderlinePosition(OptionSet<TextUnderlinePosition> v) { SET_VAR(m_rareInheritedData, textUnderlinePosition, v.toRaw()); }
     926    void setTextUnderlinePosition(TextUnderlinePosition position) { SET_VAR(m_rareInheritedData, textUnderlinePosition, static_cast<unsigned>(position)); }
     927    void setTextUnderlineOffset(TextUnderlineOffset textUnderlineOffset) { SET_VAR(m_rareInheritedData, textUnderlineOffset, textUnderlineOffset); }
     928    void setTextDecorationThickness(TextDecorationThickness textDecorationThickness) { SET_VAR(m_rareInheritedData, textDecorationThickness, textDecorationThickness); }
    925929    void setDirection(TextDirection v) { m_inheritedFlags.direction = static_cast<unsigned>(v); }
    926930    void setHasExplicitlySetDirection(bool v) { m_nonInheritedFlags.hasExplicitlySetDirection = v; }
     
    14831487    static TextDecorationStyle initialTextDecorationStyle() { return TextDecorationStyle::Solid; }
    14841488    static OptionSet<TextDecorationSkip> initialTextDecorationSkip() { return TextDecorationSkip::Auto; }
    1485     static OptionSet<TextUnderlinePosition> initialTextUnderlinePosition() { return TextUnderlinePosition::Auto; }
     1489    static TextUnderlinePosition initialTextUnderlinePosition() { return TextUnderlinePosition::Auto; }
     1490    static TextUnderlineOffset initialTextUnderlineOffset() { return TextUnderlineOffset::createWithAuto(); }
     1491    static TextDecorationThickness initialTextDecorationThickness() { return TextDecorationThickness::createWithAuto(); }
    14861492    static float initialZoom() { return 1.0f; }
    14871493    static TextZoom initialTextZoom() { return TextZoom::Normal; }
  • trunk/Source/WebCore/rendering/style/RenderStyleConstants.h

    r236615 r237835  
    732732};
    733733
    734 // FIXME: There is no reason for the values in the enum to be powers of two.
    735734enum class TextUnderlinePosition : uint8_t {
    736735    // FIXME: Implement support for 'under left' and 'under right' values.
    737     Auto       = 1 << 0,
    738     Alphabetic = 1 << 1,
    739     Under      = 1 << 2
     736    Auto,
     737    Under,
     738    FromFont
    740739};
    741740
  • trunk/Source/WebCore/rendering/style/StyleRareInheritedData.cpp

    r237266 r237835  
    4646    Length lengths[2];
    4747    float secondFloat;
     48    TextUnderlineOffset offset;
     49    TextDecorationThickness thickness;
    4850    unsigned bitfields[4];
    4951    short pagedMediaShorts[2];
     
    7678    , indent(RenderStyle::initialTextIndent())
    7779    , effectiveZoom(RenderStyle::initialZoom())
     80    , textUnderlineOffset(RenderStyle::initialTextUnderlineOffset())
     81    , textDecorationThickness(RenderStyle::initialTextDecorationThickness())
    7882    , customProperties(StyleCustomPropertyData::create())
    7983    , widows(RenderStyle::initialWidows())
     
    117121#endif
    118122    , textDecorationSkip(RenderStyle::initialTextDecorationSkip().toRaw())
    119     , textUnderlinePosition(RenderStyle::initialTextUnderlinePosition().toRaw())
     123    , textUnderlinePosition(static_cast<unsigned>(RenderStyle::initialTextUnderlinePosition()))
    120124    , rubyPosition(static_cast<unsigned>(RenderStyle::initialRubyPosition()))
    121125    , textZoom(static_cast<unsigned>(RenderStyle::initialTextZoom()))
     
    169173    , indent(o.indent)
    170174    , effectiveZoom(o.effectiveZoom)
     175    , textUnderlineOffset(o.textUnderlineOffset)
     176    , textDecorationThickness(o.textDecorationThickness)
    171177    , customProperties(o.customProperties)
    172178    , widows(o.widows)
     
    274280        && indent == o.indent
    275281        && effectiveZoom == o.effectiveZoom
     282        && textUnderlineOffset == o.textUnderlineOffset
     283        && textDecorationThickness == o.textDecorationThickness
    276284        && widows == o.widows
    277285        && orphans == o.orphans
  • trunk/Source/WebCore/rendering/style/StyleRareInheritedData.h

    r237266 r237835  
    2929#include "Length.h"
    3030#include "StyleCustomPropertyData.h"
     31#include "TextDecorationThickness.h"
     32#include "TextUnderlineOffset.h"
    3133#include <wtf/RefCounted.h>
    3234#include <wtf/text/AtomicString.h>
     
    8082    Length indent;
    8183    float effectiveZoom;
     84
     85    TextUnderlineOffset textUnderlineOffset;
     86    TextDecorationThickness textDecorationThickness;
    8287   
    8388    Length wordSpacing;
     
    129134#endif
    130135    unsigned textDecorationSkip : 5; // TextDecorationSkip
    131     unsigned textUnderlinePosition : 3; // TextUnderlinePosition
     136    unsigned textUnderlinePosition : 2; // TextUnderlinePosition
    132137    unsigned rubyPosition : 2; // RubyPosition
    133138    unsigned textZoom: 1; // TextZoom
  • trunk/Source/WebCore/style/InlineTextBoxStyle.cpp

    r232229 r237835  
    3333namespace WebCore {
    3434   
    35 int computeUnderlineOffset(OptionSet<TextUnderlinePosition> underlinePosition, const FontMetrics& fontMetrics, const InlineTextBox* inlineTextBox, int textDecorationThickness)
     35int computeUnderlineOffset(TextUnderlinePosition underlinePosition, const FontMetrics& fontMetrics, const InlineTextBox* inlineTextBox, int textDecorationThickness)
    3636{
    3737    // This represents the gap between the baseline and the closest edge of the underline.
     
    5151    if (resolvedUnderlinePosition == TextUnderlinePosition::Auto) {
    5252        if (inlineTextBox)
    53             resolvedUnderlinePosition = inlineTextBox->root().baselineType() == IdeographicBaseline ? TextUnderlinePosition::Under : TextUnderlinePosition::Alphabetic;
     53            resolvedUnderlinePosition = inlineTextBox->root().baselineType() == IdeographicBaseline ? TextUnderlinePosition::Under : TextUnderlinePosition::Auto;
    5454        else
    55             resolvedUnderlinePosition = TextUnderlinePosition::Alphabetic;
     55            resolvedUnderlinePosition = TextUnderlinePosition::Auto;
    5656    }
    5757   
    58     switch (static_cast<TextUnderlinePosition>(resolvedUnderlinePosition.toRaw())) {
    59     case TextUnderlinePosition::Alphabetic:
     58    switch (resolvedUnderlinePosition) {
     59    case TextUnderlinePosition::Auto:
     60    case TextUnderlinePosition::FromFont:
    6061        return fontMetrics.ascent() + gap;
    6162    case TextUnderlinePosition::Under: {
     
    7778        return inlineTextBox->logicalHeight() + gap + std::max<float>(offset, 0);
    7879    }
    79     case TextUnderlinePosition::Auto:
    80         ASSERT_NOT_REACHED();
    8180    }
    8281
  • trunk/Source/WebCore/style/InlineTextBoxStyle.h

    r232229 r237835  
    4747GlyphOverflow visualOverflowForDecorations(const RenderStyle& lineStyle, const InlineTextBox*);
    4848void getWavyStrokeParameters(float fontSize, float& controlPointDistance, float& step);
    49 int computeUnderlineOffset(OptionSet<TextUnderlinePosition>, const FontMetrics&, const InlineTextBox*, int textDecorationThickness);
     49int computeUnderlineOffset(TextUnderlinePosition, const FontMetrics&, const InlineTextBox*, int textDecorationThickness);
    5050   
    5151} // namespace WebCore
Note: See TracChangeset for help on using the changeset viewer.