Changeset 220725 in webkit


Ignore:
Timestamp:
Aug 14, 2017 5:03:56 PM (7 years ago)
Author:
mmaxfield@apple.com
Message:

Parse font-display
https://bugs.webkit.org/show_bug.cgi?id=175382

Reviewed by Simon Fraser.

Source/WebCore:

The syntax is very simple: font-display: auto | block | swap | fallback | optional.
So, parsing support is quite straightfoward.

Test: fast/text/font-display/parse.html

  • css/CSSComputedStyleDeclaration.cpp:

(WebCore::ComputedStyleExtractor::propertyValue):

  • css/CSSFontFace.cpp:

(WebCore::CSSFontFace::setLoadingBehavior):

  • css/CSSFontFace.h:
  • css/CSSFontSelector.cpp:

(WebCore::CSSFontSelector::addFontFaceRule):

  • css/CSSPrimitiveValueMappings.h:

(WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
(WebCore::CSSPrimitiveValue::operator FontLoadingBehavior const):

  • css/CSSProperties.json:
  • css/CSSProperty.cpp:

(WebCore::CSSProperty::isDescriptorOnly):

  • css/CSSValueKeywords.in:
  • css/parser/CSSPropertyParser.cpp:

(WebCore::consumeFontFaceFontDisplay):
(WebCore::CSSPropertyParser::parseFontFaceDescriptor):

  • rendering/style/RenderStyleConstants.h:

LayoutTests:

  • fast/text/font-display/parse-expected.txt: Added.
  • fast/text/font-display/parse.html: Added.
Location:
trunk
Files:
3 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r220718 r220725  
     12017-08-14  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        Parse font-display
     4        https://bugs.webkit.org/show_bug.cgi?id=175382
     5
     6        Reviewed by Simon Fraser.
     7
     8        * fast/text/font-display/parse-expected.txt: Added.
     9        * fast/text/font-display/parse.html: Added.
     10
    1112017-08-14  Andy Estes  <aestes@apple.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r220723 r220725  
     12017-08-14  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        Parse font-display
     4        https://bugs.webkit.org/show_bug.cgi?id=175382
     5
     6        Reviewed by Simon Fraser.
     7
     8        The syntax is very simple: font-display: auto | block | swap | fallback | optional.
     9        So, parsing support is quite straightfoward.
     10
     11        Test: fast/text/font-display/parse.html
     12
     13        * css/CSSComputedStyleDeclaration.cpp:
     14        (WebCore::ComputedStyleExtractor::propertyValue):
     15        * css/CSSFontFace.cpp:
     16        (WebCore::CSSFontFace::setLoadingBehavior):
     17        * css/CSSFontFace.h:
     18        * css/CSSFontSelector.cpp:
     19        (WebCore::CSSFontSelector::addFontFaceRule):
     20        * css/CSSPrimitiveValueMappings.h:
     21        (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
     22        (WebCore::CSSPrimitiveValue::operator FontLoadingBehavior const):
     23        * css/CSSProperties.json:
     24        * css/CSSProperty.cpp:
     25        (WebCore::CSSProperty::isDescriptorOnly):
     26        * css/CSSValueKeywords.in:
     27        * css/parser/CSSPropertyParser.cpp:
     28        (WebCore::consumeFontFaceFontDisplay):
     29        (WebCore::CSSPropertyParser::parseFontFaceDescriptor):
     30        * rendering/style/RenderStyleConstants.h:
     31
    1322017-08-14  Jer Noble  <jer.noble@apple.com>
    233
  • trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp

    r220706 r220725  
    40194019        case CSSPropertySrc:
    40204020        case CSSPropertyUnicodeRange:
     4021        case CSSPropertyFontDisplay:
    40214022            break;
    40224023
  • trunk/Source/WebCore/css/CSSFontFace.cpp

    r218890 r220725  
    150150{
    151151    auto range = calculateWeightRange(weight);
     152    if (m_fontSelectionCapabilities.weight == range)
     153        return;
     154
    152155    setWeight(range);
    153156
     
    185188{
    186189    auto range = calculateStretchRange(style);
     190    if (m_fontSelectionCapabilities.width == range)
     191        return;
     192
    187193    setStretch(range);
    188194
     
    230236{
    231237    auto range = calculateItalicRange(style);
     238    if (m_fontSelectionCapabilities.slope == range)
     239        return;
     240
    232241    setStyle(range);
    233242
     
    245254        return false;
    246255
    247     m_ranges.clear();
     256    Vector<UnicodeRange> ranges;
    248257    auto& list = downcast<CSSValueList>(unicodeRange);
    249258    for (auto& rangeValue : list) {
    250259        auto& range = downcast<CSSUnicodeRangeValue>(rangeValue.get());
    251         m_ranges.append({ range.from(), range.to() });
    252     }
     260        ranges.append({ range.from(), range.to() });
     261    }
     262
     263    if (ranges.size() == m_ranges.size()) {
     264        bool same = true;
     265        for (size_t i = 0; i < ranges.size(); ++i) {
     266            if (ranges[i] != m_ranges[i]) {
     267                same = false;
     268                break;
     269            }
     270        }
     271        if (same)
     272            return true;
     273    }
     274
     275    m_ranges = WTFMove(ranges);
    253276
    254277    if (m_cssConnection)
     
    265288{
    266289    auto ligatures = extractFontVariantLigatures(variantLigatures);
     290
     291    if (m_variantSettings.commonLigatures == ligatures.commonLigatures
     292        && m_variantSettings.discretionaryLigatures == ligatures.discretionaryLigatures
     293        && m_variantSettings.historicalLigatures == ligatures.historicalLigatures
     294        && m_variantSettings.contextualAlternates == ligatures.contextualAlternates)
     295        return true;
    267296
    268297    m_variantSettings.commonLigatures = ligatures.commonLigatures;
     
    286315        return false;
    287316
    288     m_variantSettings.position = downcast<CSSPrimitiveValue>(variantPosition);
     317    FontVariantPosition position = downcast<CSSPrimitiveValue>(variantPosition);
     318
     319    if (m_variantSettings.position == position)
     320        return true;
     321
     322    m_variantSettings.position = position;
    289323
    290324    if (m_cssConnection)
     
    303337        return false;
    304338
    305     m_variantSettings.caps = downcast<CSSPrimitiveValue>(variantCaps);
     339    FontVariantCaps caps = downcast<CSSPrimitiveValue>(variantCaps);
     340
     341    if (m_variantSettings.caps == caps)
     342        return true;
     343
     344    m_variantSettings.caps = caps;
    306345
    307346    if (m_cssConnection)
     
    318357{
    319358    auto numeric = extractFontVariantNumeric(variantNumeric);
     359
     360    if (m_variantSettings.numericFigure == numeric.figure
     361        && m_variantSettings.numericSpacing == numeric.spacing
     362        && m_variantSettings.numericFraction == numeric.fraction
     363        && m_variantSettings.numericOrdinal == numeric.ordinal
     364        && m_variantSettings.numericSlashedZero == numeric.slashedZero)
     365        return true;
    320366
    321367    m_variantSettings.numericFigure = numeric.figure;
     
    340386        return false;
    341387
    342     m_variantSettings.alternates = downcast<CSSPrimitiveValue>(variantAlternates);
     388    FontVariantAlternates alternates = downcast<CSSPrimitiveValue>(variantAlternates);
     389
     390    if (m_variantSettings.alternates == alternates)
     391        return true;
     392
     393    m_variantSettings.alternates = alternates;
    343394
    344395    if (m_cssConnection)
     
    355406{
    356407    auto eastAsian = extractFontVariantEastAsian(variantEastAsian);
     408
     409    if (m_variantSettings.eastAsianVariant == eastAsian.variant
     410        && m_variantSettings.eastAsianWidth == eastAsian.width
     411        && m_variantSettings.eastAsianRuby == eastAsian.ruby)
     412        return true;
    357413
    358414    m_variantSettings.eastAsianVariant = eastAsian.variant;
     
    392448    if (m_cssConnection)
    393449        m_cssConnection->mutableProperties().setProperty(CSSPropertyFontFeatureSettings, &featureSettings);
     450
     451    iterateClients(m_clients, [&](Client& client) {
     452        client.fontPropertyChanged(*this);
     453    });
     454}
     455
     456void CSSFontFace::setLoadingBehavior(CSSValue& loadingBehaviorValue)
     457{
     458    auto loadingBehavior = static_cast<FontLoadingBehavior>(downcast<CSSPrimitiveValue>(loadingBehaviorValue).valueID());
     459
     460    if (m_loadingBehavior == loadingBehavior)
     461        return;
     462
     463    m_loadingBehavior = loadingBehavior;
     464
     465    if (m_cssConnection)
     466        m_cssConnection->mutableProperties().setProperty(CSSPropertyFontDisplay, &loadingBehaviorValue);
    394467
    395468    iterateClients(m_clients, [&](Client& client) {
  • trunk/Source/WebCore/css/CSSFontFace.h

    r218588 r220725  
    7777    bool setVariantEastAsian(CSSValue&);
    7878    void setFeatureSettings(CSSValue&);
     79    void setLoadingBehavior(CSSValue&);
    7980
    8081    enum class Status;
     
    138139        UChar32 from;
    139140        UChar32 to;
     141        bool operator==(const UnicodeRange& other) const { return from == other.from && to == other.to; }
     142        bool operator!=(const UnicodeRange& other) const { return !(*this == other); }
    140143    };
    141144
     
    180183    WeakPtr<FontFace> m_wrapper;
    181184    FontSelectionSpecifiedCapabilities m_fontSelectionCapabilities;
     185    FontLoadingBehavior m_loadingBehavior { FontLoadingBehavior::Auto };
    182186    Status m_status { Status::Pending };
    183187    bool m_isLocalFallback { false };
  • trunk/Source/WebCore/css/CSSFontSelector.cpp

    r219145 r220725  
    158158    RefPtr<CSSValue> variantAlternates = style.getPropertyCSSValue(CSSPropertyFontVariantAlternates);
    159159    RefPtr<CSSValue> variantEastAsian = style.getPropertyCSSValue(CSSPropertyFontVariantEastAsian);
     160    RefPtr<CSSValue> loadingBehavior = style.getPropertyCSSValue(CSSPropertyFontDisplay);
    160161    if (!is<CSSValueList>(fontFamily.get()) || !is<CSSValueList>(src.get()) || (unicodeRange && !is<CSSValueList>(*unicodeRange)))
    161162        return;
     
    198199    if (featureSettings)
    199200        fontFace->setFeatureSettings(*featureSettings);
     201    if (loadingBehavior)
     202        fontFace->setLoadingBehavior(*loadingBehavior);
    200203
    201204    CSSFontFace::appendSources(fontFace, srcList, m_document, isInitiatingElementInUserAgentShadowTree);
  • trunk/Source/WebCore/css/CSSPrimitiveValueMappings.h

    r218588 r220725  
    56985698}
    56995699
    5700 }
     5700template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontLoadingBehavior behavior)
     5701    : CSSValue(PrimitiveClass)
     5702{
     5703    m_primitiveUnitType = CSS_VALUE_ID;
     5704    switch (behavior) {
     5705    case FontLoadingBehavior::Auto:
     5706        m_value.valueID = CSSValueAuto;
     5707        break;
     5708    case FontLoadingBehavior::Block:
     5709        m_value.valueID = CSSValueBlock;
     5710        break;
     5711    case FontLoadingBehavior::Swap:
     5712        m_value.valueID = CSSValueSwap;
     5713        break;
     5714    case FontLoadingBehavior::Fallback:
     5715        m_value.valueID = CSSValueFallback;
     5716        break;
     5717    case FontLoadingBehavior::Optional:
     5718        m_value.valueID = CSSValueOptional;
     5719        break;
     5720    default:
     5721        ASSERT_NOT_REACHED();
     5722        break;
     5723    }
     5724}
     5725
     5726template<> inline CSSPrimitiveValue::operator FontLoadingBehavior() const
     5727{
     5728    ASSERT(isValueID());
     5729    switch (m_value.valueID) {
     5730    case CSSValueAuto:
     5731        return FontLoadingBehavior::Auto;
     5732    case CSSValueBlock:
     5733        return FontLoadingBehavior::Block;
     5734    case CSSValueSwap:
     5735        return FontLoadingBehavior::Swap;
     5736    case CSSValueFallback:
     5737        return FontLoadingBehavior::Fallback;
     5738    case CSSValueOptional:
     5739        return FontLoadingBehavior::Optional;
     5740    default:
     5741        break;
     5742    }
     5743    ASSERT_NOT_REACHED();
     5744    return FontLoadingBehavior::Auto;
     5745}
     5746
     5747/*
     5748enum class FontLoadingBehavior {
     5749    Auto, Block, Swap, Fallback, Optional
     5750};
     5751*/
     5752
     5753}
  • trunk/Source/WebCore/css/CSSProperties.json

    r220706 r220725  
    408408            },
    409409            "specification": {
    410                 "category": "css-fonts",
    411                 "url": "https://drafts.csswg.org/css-fonts-4/#low-level-font-variation-settings-control-the-font-variation-settings-property"
     410                "category": "css-fonts-4",
     411                "url": "https://drafts.csswg.org/css-fonts-4/#font-variation-settings-def"
    412412            }
    413413        },
     
    568568            },
    569569            "specification": {
    570                 "category": "css-fonts",
    571                 "url": "https://drafts.csswg.org/css-fonts-4/#optical-sizing-control-the-font-optical-sizing-property"
     570                "category": "css-fonts-4",
     571                "url": "https://drafts.csswg.org/css-fonts-4/#font-optical-sizing-def"
    572572            }
    573573        },
     
    35523552            }
    35533553        },
     3554        "font-display": {
     3555            "codegen-properties": {
     3556                "skip-builder": true
     3557            },
     3558            "specification": {
     3559                "category": "css-fonts-4",
     3560                "url": "https://drafts.csswg.org/css-fonts-4/#font-display-desc"
     3561            },
     3562            "values": [
     3563                "auto",
     3564                "block",
     3565                "swap",
     3566                "fallback",
     3567                "optional"
     3568            ]
     3569        },
    35543570        "vector-effect": {
    35553571            "values": [
     
    67536769            "url": "https://www.w3.org/TR/css-fonts-3/"
    67546770        },
     6771        "css-fonts-4": {
     6772            "shortname": "CSS Fonts Level 4",
     6773            "longname": "CSS Fonts Module Level 4",
     6774            "url": "https://drafts.csswg.org/css-fonts-4"
     6775        },
    67556776        "css-grid": {
    67566777            "shortname": "CSS Grid Layout",
  • trunk/Source/WebCore/css/CSSProperty.cpp

    r219595 r220725  
    165165    case CSSPropertySrc:
    166166    case CSSPropertyUnicodeRange:
     167    case CSSPropertyFontDisplay:
    167168        return true;
    168169    default:
  • trunk/Source/WebCore/css/CSSValueKeywords.in

    r217937 r220725  
    13481348auto-fill
    13491349auto-fit
     1350
     1351// font-display
     1352// auto
     1353// block
     1354swap
     1355fallback
     1356optional
  • trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp

    r220706 r220725  
    43054305}
    43064306
     4307static RefPtr<CSSPrimitiveValue> consumeFontFaceFontDisplay(CSSParserTokenRange& range)
     4308{
     4309    return consumeIdent<CSSValueAuto, CSSValueBlock, CSSValueSwap, CSSValueFallback, CSSValueOptional>(range);
     4310}
     4311
    43074312static RefPtr<CSSValue> consumeFontFaceSrcURI(CSSParserTokenRange& range, const CSSParserContext& context)
    43084313{
     
    43774382    case CSSPropertyUnicodeRange:
    43784383        parsedValue = consumeFontFaceUnicodeRange(m_range);
     4384        break;
     4385    case CSSPropertyFontDisplay:
     4386        parsedValue = consumeFontFaceFontDisplay(m_range);
    43794387        break;
    43804388    case CSSPropertyFontWeight:
  • trunk/Source/WebCore/rendering/style/RenderStyleConstants.h

    r220503 r220725  
    754754};
    755755
     756enum class FontLoadingBehavior {
     757    Auto, Block, Swap, Fallback, Optional
     758};
     759
    756760extern const float defaultMiterLimit;
    757761
Note: See TracChangeset for help on using the changeset viewer.