Index: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
index 4aef4cf533e6dc8aca53d88dba46458b8d7be27f..e60ab8839bc330da3ff75c4dab94c8fca7408325 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
@@ -183,6 +183,23 @@ static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeInteger(CSSParserTokenRa |
return nullptr; |
} |
+static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeNumber(CSSParserTokenRange& range, ValueRange valueRange) |
+{ |
+ const CSSParserToken& token = range.peek(); |
+ if (token.type() == NumberToken) { |
+ if (valueRange == ValueRangeNonNegative && token.numericValue() < 0) |
+ return nullptr; |
+ return cssValuePool().createValue(range.consumeIncludingWhitespace().numericValue(), token.unitType()); |
+ } |
+ CalcParser calcParser(range, ValueRangeAll); |
+ if (const CSSCalcValue* calculation = calcParser.value()) { |
+ if (calculation->category() != CalcNumber || (valueRange == ValueRangeNonNegative && calculation->isNegative())) |
alancutter (OOO until 2018)
2015/10/02 01:54:10
I don't think calcs should be subject to parse tim
|
+ return nullptr; |
+ return calcParser.consumeValue(); |
+ } |
+ return nullptr; |
+} |
+ |
inline bool shouldAcceptUnitlessValues(double fValue, CSSParserMode cssParserMode, UnitlessQuirk unitless) |
{ |
// Quirks mode for certain properties and presentation attributes accept unit-less values for certain units. |
@@ -252,6 +269,27 @@ static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLengthOrPercent(CSSParse |
return nullptr; |
} |
+static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeNumberOrPercent(CSSParserTokenRange& range, ValueRange valueRange) |
+{ |
+ const CSSParserToken& token = range.peek(); |
+ if (token.type() == NumberToken) |
+ return consumeNumber(range, valueRange); |
+ if (token.type() == PercentageToken) { |
+ if (valueRange == ValueRangeNonNegative && token.numericValue() < 0) |
+ return nullptr; |
+ return cssValuePool().createValue(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType::Percentage); |
+ } |
+ CalcParser calcParser(range, valueRange); |
+ if (const CSSCalcValue* calculation = calcParser.value()) { |
+ if (!(calculation->category() == CalcNumber || calculation->category() == CalcPercent || calculation->category() == CalcPercentNumber)) |
+ return nullptr; |
+ if (valueRange == ValueRangeNonNegative && calculation->isNegative()) |
+ return nullptr; |
+ return calcParser.consumeValue(); |
+ } |
+ return nullptr; |
+} |
+ |
static inline bool isCSSWideKeyword(const CSSValueID& id) |
{ |
return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset || id == CSSValueDefault; |
@@ -545,6 +583,23 @@ static PassRefPtrWillBeRawPtr<CSSValue> consumeFontSize(CSSParserTokenRange& ran |
return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative, UnitlessQuirk::Allow); |
} |
+static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLineHeight(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
+{ |
+ if (range.peek().id() == CSSValueNormal) |
+ return consumeIdent(range); |
+ |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> parsedValue = consumeNumberOrPercent(range, ValueRangeNonNegative); |
+ if (!parsedValue) |
+ parsedValue = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); |
+ |
+ // The line-height property can accept both percents and numbers but additive opertaions are |
+ // not permitted on them in calc() expressions. |
+ if (parsedValue && parsedValue->isCalculatedPercentageWithNumber()) |
+ return nullptr; |
+ |
+ return parsedValue.release(); |
+} |
+ |
PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID propId) |
{ |
m_range.consumeWhitespace(); |
@@ -574,6 +629,8 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty |
return consumeTabSize(m_range, m_context.mode()); |
case CSSPropertyFontSize: |
return consumeFontSize(m_range, m_context.mode()); |
+ case CSSPropertyLineHeight: |
+ return consumeLineHeight(m_range, m_context.mode()); |
default: |
return nullptr; |
} |