Changeset 209199 in webkit
- Timestamp:
- Dec 1, 2016 1:41:28 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r209197 r209199 1 2016-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 1 10 2016-12-01 Brady Eidson <beidson@apple.com> 2 11 -
trunk/LayoutTests/TestExpectations
r209128 r209199 1013 1013 # The following layout tests need to be changed when the new CSS Parser is turned on, since they 1014 1014 # incorrectly indicate failures on valid syntax. 1015 webkit.org/b/165195 css3/font-variant-parsing.html [ Pass Failure ] 1015 1016 webkit.org/b/165195 css3/supports-cssom.html [ Pass Failure ] 1016 1017 webkit.org/b/165195 fast/css/attr-parsing.html [ Pass Failure ] … … 1053 1054 webkit.org/b/165195 svg/dom/SVGPaint.html [ Pass Failure ] 1054 1055 1055 1056 1057 1058 1059 -
trunk/Source/WebCore/ChangeLog
r209198 r209199 1 2016-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 1 17 2016-12-01 Brian Burg <bburg@apple.com> 2 18 -
trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp
r209148 r209199 649 649 } 650 650 651 static 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 651 748 static RefPtr<CSSPrimitiveValue> consumeFontVariantCaps(CSSParserTokenRange& range) 652 749 { … … 654 751 CSSValuePetiteCaps, CSSValueAllPetiteCaps, 655 752 CSSValueUnicase, CSSValueTitlingCaps>(range); 753 } 754 755 static RefPtr<CSSPrimitiveValue> consumeFontVariantAlternates(CSSParserTokenRange& range) 756 { 757 return consumeIdent<CSSValueNormal, CSSValueHistoricalForms>(range); 758 } 759 760 static RefPtr<CSSPrimitiveValue> consumeFontVariantPosition(CSSParserTokenRange& range) 761 { 762 return consumeIdent<CSSValueNormal, CSSValueSub, CSSValueSuper>(range); 656 763 } 657 764 … … 748 855 { 749 856 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() implements758 // the old css3 draft:759 // http://www.w3.org/TR/2002/WD-css3-webfonts-20020802/#font-variant760 // '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;774 857 } 775 858 … … 3486 3569 case CSSPropertyFontVariantNumeric: 3487 3570 return consumeFontVariantNumeric(m_range); 3571 case CSSPropertyFontVariantEastAsian: 3572 return consumeFontVariantEastAsian(m_range); 3488 3573 case CSSPropertyFontFeatureSettings: 3489 3574 return consumeFontFeatureSettings(m_range); … … 4008 4093 break; 4009 4094 } 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; 4010 4113 case CSSPropertyFontVariant: 4011 parsedValue = consumeFontVariantList(m_range); 4012 break; 4114 return consumeFontVariantShorthand(false); 4013 4115 case CSSPropertyFontWeight: 4014 4116 parsedValue = consumeFontWeight(m_range); … … 4143 4245 addProperty(CSSPropertyFontVariantLigatures, CSSPropertyFontVariant, consumeIdent(m_range).releaseNonNull(), important); 4144 4246 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); 4145 4249 return m_range.atEnd(); 4146 4250 } 4147 4251 4148 4252 RefPtr<CSSPrimitiveValue> capsValue; 4253 RefPtr<CSSPrimitiveValue> alternatesValue; 4254 RefPtr<CSSPrimitiveValue> positionValue; 4255 4256 RefPtr<CSSValue> eastAsianValue; 4149 4257 FontVariantLigaturesParser ligaturesParser; 4150 4258 FontVariantNumericParser numericParser; … … 4160 4268 return false; 4161 4269 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); 4171 4278 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 4178 4297 } while (!m_range.atEnd()); 4179 4298 … … 4181 4300 addProperty(CSSPropertyFontVariantNumeric, CSSPropertyFontVariant, numericParser.finalizeValue().releaseNonNull(), important); 4182 4301 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 4183 4309 return true; 4184 4310 }
Note: See TracChangeset
for help on using the changeset viewer.