Chromium Code Reviews| Index: Source/core/css/parser/CSSPropertyParser.cpp |
| diff --git a/Source/core/css/parser/CSSPropertyParser.cpp b/Source/core/css/parser/CSSPropertyParser.cpp |
| index 2344e5bd7981234feaa353bd3d811bc36d9c2bb2..05fb1ac9e844343bf24f963ba17fd8900899288e 100644 |
| --- a/Source/core/css/parser/CSSPropertyParser.cpp |
| +++ b/Source/core/css/parser/CSSPropertyParser.cpp |
| @@ -91,6 +91,71 @@ static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeString(CSSParserTokenRan |
| return cssValuePool().createValue(range.consumeIncludingWhitespace().value(), CSSPrimitiveValue::UnitType::String); |
| } |
| +static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeNumericValue(CSSParserTokenRange& range, CSSPropertyParser::Units unitflags, CSSParserMode cssParserMode) |
| +{ |
| + CSSParserToken numericToken = range.peek(); |
|
Timothy Loh
2015/09/22 13:54:25
const CSSParserToken& :-)
I really ought to make
|
| + if (unitflags & CSSPropertyParser::FNonNeg && numericToken.numericValue() < 0) |
|
Timothy Loh
2015/09/22 13:54:25
numericValue() isn't set up to work for non-numeri
|
| + return nullptr; |
| + bool validNumber = false; |
| + switch (numericToken.unitType()) { |
| + case CSSPrimitiveValue::UnitType::Number: |
|
Timothy Loh
2015/09/22 13:54:25
IMO we should do this as:
if (token.type() == Num
|
| + if (unitflags & CSSPropertyParser::FNumber) { |
| + validNumber = true; |
| + } else if (shouldAcceptUnitLessValues(numericToken.numericValue(), unitflags, cssParserMode)) { |
| + numericToken.setUnitType((unitflags & CSSPropertyParser::FLength) ? CSSPrimitiveValue::UnitType::Pixels : CSSPrimitiveValue::UnitType::Degrees); |
| + validNumber = true; |
| + } else if ((unitflags & CSSPropertyParser::FInteger) && numericToken.numericValueType() == IntegerValueType) { |
| + validNumber = true; |
| + } else if ((unitflags & CSSPropertyParser::FPositiveInteger) && numericToken.numericValueType() == IntegerValueType && numericToken.numericValue() > 0) { |
| + validNumber = true; |
| + } |
| + break; |
| + case CSSPrimitiveValue::UnitType::Percentage: |
| + validNumber = unitflags & CSSPropertyParser::FPercent; |
| + break; |
| + case CSSPrimitiveValue::UnitType::QuirkyEms: |
| + if (cssParserMode != UASheetMode) |
| + return nullptr; |
| + /* fallthrough intentional */ |
| + case CSSPrimitiveValue::UnitType::Ems: |
| + case CSSPrimitiveValue::UnitType::Rems: |
| + case CSSPrimitiveValue::UnitType::Chs: |
| + case CSSPrimitiveValue::UnitType::Exs: |
| + case CSSPrimitiveValue::UnitType::Pixels: |
| + case CSSPrimitiveValue::UnitType::Centimeters: |
| + case CSSPrimitiveValue::UnitType::Millimeters: |
| + case CSSPrimitiveValue::UnitType::Inches: |
| + case CSSPrimitiveValue::UnitType::Points: |
| + case CSSPrimitiveValue::UnitType::Picas: |
| + case CSSPrimitiveValue::UnitType::ViewportWidth: |
| + case CSSPrimitiveValue::UnitType::ViewportHeight: |
| + case CSSPrimitiveValue::UnitType::ViewportMin: |
| + case CSSPrimitiveValue::UnitType::ViewportMax: |
| + validNumber = unitflags & CSSPropertyParser::FLength; |
| + break; |
| + case CSSPrimitiveValue::UnitType::Milliseconds: |
| + case CSSPrimitiveValue::UnitType::Seconds: |
| + validNumber = unitflags & CSSPropertyParser::FTime; |
| + break; |
| + case CSSPrimitiveValue::UnitType::Degrees: |
| + case CSSPrimitiveValue::UnitType::Radians: |
| + case CSSPrimitiveValue::UnitType::Gradians: |
| + case CSSPrimitiveValue::UnitType::Turns: |
| + validNumber = unitflags & CSSPropertyParser::FAngle; |
| + break; |
| + case CSSPrimitiveValue::UnitType::DotsPerPixel: |
| + case CSSPrimitiveValue::UnitType::DotsPerInch: |
| + case CSSPrimitiveValue::UnitType::DotsPerCentimeter: |
| + validNumber = unitflags & CSSPropertyParser::FResolution; |
|
Timothy Loh
2015/09/22 13:54:25
No point adding this if we don't have any properti
|
| + break; |
| + default: |
| + return nullptr; |
| + } |
| + if (validNumber) |
| + return cssValuePool().createValue(range.consumeIncludingWhitespace().numericValue(), numericToken.unitType()); |
| + return nullptr; |
| +} |
| + |
| // Methods for consuming non-shorthand properties starts here. |
| static PassRefPtrWillBeRawPtr<CSSValue> consumeWillChange(CSSParserTokenRange& range) |
| { |
| @@ -218,6 +283,13 @@ static PassRefPtrWillBeRawPtr<CSSValue> consumeFontVariantLigatures(CSSParserTok |
| return ligatureValues.release(); |
| } |
| +PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::consumeSpacing(CSSParserTokenRange& range) |
| +{ |
| + if (range.peek().id() == CSSValueNormal) |
| + return consumeIdent(range); |
| + return consumeNumericValue(range, FLength | FUnitlessQuirk, m_context.mode()); |
| +} |
| + |
| PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID propId) |
| { |
| m_range.consumeWhitespace(); |
| @@ -232,6 +304,9 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty |
| return consumeWebkitHighlight(m_range); |
| case CSSPropertyFontVariantLigatures: |
| return consumeFontVariantLigatures(m_range); |
| + case CSSPropertyLetterSpacing: |
| + case CSSPropertyWordSpacing: |
| + return consumeSpacing(m_range); |
| default: |
| return nullptr; |
| } |