Changeset 209199 in webkit


Ignore:
Timestamp:
Dec 1, 2016 1:41:28 PM (7 years ago)
Author:
hyatt@apple.com
Message:

[CSS Parser] Fix font-variant parsing
https://bugs.webkit.org/show_bug.cgi?id=165266

Reviewed by Dean Jackson.

Source/WebCore:

  • css/parser/CSSPropertyParser.cpp:

(WebCore::consumeFontVariantEastAsian):
(WebCore::consumeFontVariantAlternates):
(WebCore::consumeFontVariantPosition):
(WebCore::CSSPropertyParser::parseSingleValue):
(WebCore::CSSPropertyParser::parseFontFaceDescriptor):
(WebCore::CSSPropertyParser::consumeFontVariantShorthand):
(WebCore::consumeFontVariantList): Deleted.

LayoutTests:

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r209197 r209199  
     12016-12-01  Dave Hyatt  <hyatt@apple.com>
     2
     3        [CSS Parser] Fix font-variant parsing
     4        https://bugs.webkit.org/show_bug.cgi?id=165266
     5
     6        Reviewed by Dean Jackson.
     7
     8        * TestExpectations:
     9
    1102016-12-01  Brady Eidson  <beidson@apple.com>
    211
  • trunk/LayoutTests/TestExpectations

    r209128 r209199  
    10131013# The following layout tests need to be changed when the new CSS Parser is turned on, since they
    10141014# incorrectly indicate failures on valid syntax.
     1015webkit.org/b/165195 css3/font-variant-parsing.html [ Pass Failure ]
    10151016webkit.org/b/165195 css3/supports-cssom.html [ Pass Failure ]
    10161017webkit.org/b/165195 fast/css/attr-parsing.html [ Pass Failure ]
     
    10531054webkit.org/b/165195 svg/dom/SVGPaint.html [ Pass Failure ]
    10541055
    1055 
    1056 
    1057 
    1058 
    1059 
  • trunk/Source/WebCore/ChangeLog

    r209198 r209199  
     12016-12-01  Dave Hyatt  <hyatt@apple.com>
     2
     3        [CSS Parser] Fix font-variant parsing
     4        https://bugs.webkit.org/show_bug.cgi?id=165266
     5
     6        Reviewed by Dean Jackson.
     7
     8        * css/parser/CSSPropertyParser.cpp:
     9        (WebCore::consumeFontVariantEastAsian):
     10        (WebCore::consumeFontVariantAlternates):
     11        (WebCore::consumeFontVariantPosition):
     12        (WebCore::CSSPropertyParser::parseSingleValue):
     13        (WebCore::CSSPropertyParser::parseFontFaceDescriptor):
     14        (WebCore::CSSPropertyParser::consumeFontVariantShorthand):
     15        (WebCore::consumeFontVariantList): Deleted.
     16
    1172016-12-01  Brian Burg  <bburg@apple.com>
    218
  • trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp

    r209148 r209199  
    649649}
    650650
     651static RefPtr<CSSValue> consumeFontVariantEastAsian(CSSParserTokenRange& range)
     652{
     653    if (range.peek().id() == CSSValueNormal)
     654        return consumeIdent(range);
     655   
     656    RefPtr<CSSValueList> values = CSSValueList::createSpaceSeparated();
     657    FontVariantEastAsianVariant variant = FontVariantEastAsianVariant::Normal;
     658    FontVariantEastAsianWidth width = FontVariantEastAsianWidth::Normal;
     659    FontVariantEastAsianRuby ruby = FontVariantEastAsianRuby::Normal;
     660   
     661    while (!range.atEnd()) {
     662        if (range.peek().type() != IdentToken)
     663            return nullptr;
     664       
     665        auto id = range.peek().id();
     666        range.consumeIncludingWhitespace();
     667
     668        switch (id) {
     669        case CSSValueJis78:
     670            variant = FontVariantEastAsianVariant::Jis78;
     671            break;
     672        case CSSValueJis83:
     673            variant = FontVariantEastAsianVariant::Jis83;
     674            break;
     675        case CSSValueJis90:
     676            variant = FontVariantEastAsianVariant::Jis90;
     677            break;
     678        case CSSValueJis04:
     679            variant = FontVariantEastAsianVariant::Jis04;
     680            break;
     681        case CSSValueSimplified:
     682            variant = FontVariantEastAsianVariant::Simplified;
     683            break;
     684        case CSSValueTraditional:
     685            variant = FontVariantEastAsianVariant::Traditional;
     686            break;
     687        case CSSValueFullWidth:
     688            width = FontVariantEastAsianWidth::Full;
     689            break;
     690        case CSSValueProportionalWidth:
     691            width = FontVariantEastAsianWidth::Proportional;
     692            break;
     693        case CSSValueRuby:
     694            ruby = FontVariantEastAsianRuby::Yes;
     695            break;
     696        default:
     697            return nullptr;
     698        }
     699    }
     700       
     701    switch (variant) {
     702    case FontVariantEastAsianVariant::Normal:
     703        break;
     704    case FontVariantEastAsianVariant::Jis78:
     705        values->append(CSSValuePool::singleton().createIdentifierValue(CSSValueJis78));
     706        break;
     707    case FontVariantEastAsianVariant::Jis83:
     708        values->append(CSSValuePool::singleton().createIdentifierValue(CSSValueJis83));
     709        break;
     710    case FontVariantEastAsianVariant::Jis90:
     711        values->append(CSSValuePool::singleton().createIdentifierValue(CSSValueJis90));
     712        break;
     713    case FontVariantEastAsianVariant::Jis04:
     714        values->append(CSSValuePool::singleton().createIdentifierValue(CSSValueJis04));
     715        break;
     716    case FontVariantEastAsianVariant::Simplified:
     717        values->append(CSSValuePool::singleton().createIdentifierValue(CSSValueSimplified));
     718        break;
     719    case FontVariantEastAsianVariant::Traditional:
     720        values->append(CSSValuePool::singleton().createIdentifierValue(CSSValueTraditional));
     721        break;
     722    }
     723       
     724    switch (width) {
     725    case FontVariantEastAsianWidth::Normal:
     726        break;
     727    case FontVariantEastAsianWidth::Full:
     728        values->append(CSSValuePool::singleton().createIdentifierValue(CSSValueFullWidth));
     729        break;
     730    case FontVariantEastAsianWidth::Proportional:
     731        values->append(CSSValuePool::singleton().createIdentifierValue(CSSValueProportionalWidth));
     732        break;
     733    }
     734       
     735    switch (ruby) {
     736    case FontVariantEastAsianRuby::Normal:
     737        break;
     738    case FontVariantEastAsianRuby::Yes:
     739        values->append(CSSValuePool::singleton().createIdentifierValue(CSSValueRuby));
     740    }
     741
     742    if (!values->length())
     743        return nullptr;
     744
     745    return values;
     746}
     747   
    651748static RefPtr<CSSPrimitiveValue> consumeFontVariantCaps(CSSParserTokenRange& range)
    652749{
     
    654751        CSSValuePetiteCaps, CSSValueAllPetiteCaps,
    655752        CSSValueUnicase, CSSValueTitlingCaps>(range);
     753}
     754
     755static RefPtr<CSSPrimitiveValue> consumeFontVariantAlternates(CSSParserTokenRange& range)
     756{
     757    return consumeIdent<CSSValueNormal, CSSValueHistoricalForms>(range);
     758}
     759
     760static RefPtr<CSSPrimitiveValue> consumeFontVariantPosition(CSSParserTokenRange& range)
     761{
     762    return consumeIdent<CSSValueNormal, CSSValueSub, CSSValueSuper>(range);
    656763}
    657764
     
    748855{
    749856    return consumeIdent<CSSValueNormal, CSSValueSmallCaps>(range);
    750 }
    751 
    752 static RefPtr<CSSValue> consumeFontVariantList(CSSParserTokenRange& range)
    753 {
    754     RefPtr<CSSValueList> values = CSSValueList::createCommaSeparated();
    755     do {
    756         if (range.peek().id() == CSSValueAll) {
    757             // FIXME: CSSPropertyParser::parseFontVariant() implements
    758             // the old css3 draft:
    759             // http://www.w3.org/TR/2002/WD-css3-webfonts-20020802/#font-variant
    760             // 'all' is only allowed in @font-face and with no other values.
    761             if (values->length())
    762                 return nullptr;
    763             return consumeIdent(range);
    764         }
    765         RefPtr<CSSPrimitiveValue> fontVariant = consumeFontVariantCSS21(range);
    766         if (fontVariant)
    767             values->append(fontVariant.releaseNonNull());
    768     } while (consumeCommaIncludingWhitespace(range));
    769 
    770     if (values->length())
    771         return values;
    772 
    773     return nullptr;
    774857}
    775858
     
    34863569    case CSSPropertyFontVariantNumeric:
    34873570        return consumeFontVariantNumeric(m_range);
     3571    case CSSPropertyFontVariantEastAsian:
     3572        return consumeFontVariantEastAsian(m_range);
    34883573    case CSSPropertyFontFeatureSettings:
    34893574        return consumeFontFeatureSettings(m_range);
     
    40084093        break;
    40094094    }
     4095    case CSSPropertyFontVariantCaps:
     4096        parsedValue = consumeFontVariantCaps(m_range);
     4097        break;
     4098    case CSSPropertyFontVariantLigatures:
     4099        parsedValue = consumeFontVariantLigatures(m_range);
     4100        break;
     4101    case CSSPropertyFontVariantNumeric:
     4102        parsedValue = consumeFontVariantNumeric(m_range);
     4103        break;
     4104    case CSSPropertyFontVariantEastAsian:
     4105        parsedValue = consumeFontVariantEastAsian(m_range);
     4106        break;
     4107    case CSSPropertyFontVariantAlternates:
     4108        parsedValue = consumeFontVariantAlternates(m_range);
     4109        break;
     4110    case CSSPropertyFontVariantPosition:
     4111        parsedValue = consumeFontVariantPosition(m_range);
     4112        break;
    40104113    case CSSPropertyFontVariant:
    4011         parsedValue = consumeFontVariantList(m_range);
    4012         break;
     4114        return consumeFontVariantShorthand(false);
    40134115    case CSSPropertyFontWeight:
    40144116        parsedValue = consumeFontWeight(m_range);
     
    41434245        addProperty(CSSPropertyFontVariantLigatures, CSSPropertyFontVariant, consumeIdent(m_range).releaseNonNull(), important);
    41444246        addProperty(CSSPropertyFontVariantCaps, CSSPropertyFontVariant, CSSValuePool::singleton().createIdentifierValue(CSSValueNormal), important);
     4247        addProperty(CSSPropertyFontVariantEastAsian, CSSPropertyFontVariant, CSSValuePool::singleton().createIdentifierValue(CSSValueNormal), important);
     4248        addProperty(CSSPropertyFontVariantPosition, CSSPropertyFontVariant, CSSValuePool::singleton().createIdentifierValue(CSSValueNormal), important);
    41454249        return m_range.atEnd();
    41464250    }
    41474251
    41484252    RefPtr<CSSPrimitiveValue> capsValue;
     4253    RefPtr<CSSPrimitiveValue> alternatesValue;
     4254    RefPtr<CSSPrimitiveValue> positionValue;
     4255
     4256    RefPtr<CSSValue> eastAsianValue;
    41494257    FontVariantLigaturesParser ligaturesParser;
    41504258    FontVariantNumericParser numericParser;
     
    41604268            return false;
    41614269
    4162         CSSValueID id = m_range.peek().id();
    4163         switch (id) {
    4164         case CSSValueSmallCaps:
    4165         case CSSValueAllSmallCaps:
    4166         case CSSValuePetiteCaps:
    4167         case CSSValueAllPetiteCaps:
    4168         case CSSValueUnicase:
    4169         case CSSValueTitlingCaps:
    4170             // Only one caps value permitted in font-variant grammar.
     4270        if (!eastAsianValue) {
     4271            eastAsianValue = consumeFontVariantEastAsian(m_range);
     4272            if (eastAsianValue)
     4273                continue;
     4274        }
     4275       
     4276        if (!capsValue) {
     4277            capsValue = consumeFontVariantCaps(m_range);
    41714278            if (capsValue)
    4172                 return false;
    4173             capsValue = consumeIdent(m_range);
    4174             break;
    4175         default:
    4176             return false;
    4177         }
     4279                continue;
     4280        }
     4281       
     4282        if (!alternatesValue) {
     4283            alternatesValue = consumeFontVariantAlternates(m_range);
     4284            if (alternatesValue)
     4285                continue;
     4286        }
     4287       
     4288        if (!positionValue) {
     4289            positionValue = consumeFontVariantPosition(m_range);
     4290            if (positionValue)
     4291                continue;
     4292        }
     4293       
     4294        // Saw some value that didn't match anything else.
     4295        return false;
     4296
    41784297    } while (!m_range.atEnd());
    41794298
     
    41814300    addProperty(CSSPropertyFontVariantNumeric, CSSPropertyFontVariant, numericParser.finalizeValue().releaseNonNull(), important);
    41824301    addProperty(CSSPropertyFontVariantCaps, CSSPropertyFontVariant, capsValue ? capsValue.releaseNonNull() : CSSValuePool::singleton().createIdentifierValue(CSSValueNormal), important);
     4302    addProperty(CSSPropertyFontVariantAlternates, CSSPropertyFontVariant, alternatesValue ? alternatesValue.releaseNonNull() : CSSValuePool::singleton().createIdentifierValue(CSSValueNormal), important);
     4303    addProperty(CSSPropertyFontVariantPosition, CSSPropertyFontVariant, positionValue ? positionValue.releaseNonNull() : CSSValuePool::singleton().createIdentifierValue(CSSValueNormal), important);
     4304   
     4305    if (!eastAsianValue)
     4306        eastAsianValue = CSSValuePool::singleton().createIdentifierValue(CSSValueNormal);
     4307    addProperty(CSSPropertyFontVariantEastAsian, CSSPropertyFontVariant, eastAsianValue.releaseNonNull(), important);
     4308   
    41834309    return true;
    41844310}
Note: See TracChangeset for help on using the changeset viewer.