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; |
} |