Chromium Code Reviews| 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; |
| } |