| Index: Source/core/css/parser/CSSParserValues.cpp
|
| diff --git a/Source/core/css/parser/CSSParserValues.cpp b/Source/core/css/parser/CSSParserValues.cpp
|
| index 039e70bc66c8316a9d6b117e5f21abdc72476df7..093be6b0087f2a72119d706ccfd346a965b5545f 100644
|
| --- a/Source/core/css/parser/CSSParserValues.cpp
|
| +++ b/Source/core/css/parser/CSSParserValues.cpp
|
| @@ -32,6 +32,28 @@ namespace blink {
|
|
|
| using namespace WTF;
|
|
|
| +void consumeUntilBlockEnd(CSSParserTokenRange& range, Vector<CSSParserToken> &args, bool& usesRemUnits)
|
| +{
|
| + unsigned nestingLevel = 1;
|
| + do {
|
| + const CSSParserToken& token = range.consume();
|
| + if (token.blockType() == CSSParserToken::BlockStart)
|
| + nestingLevel++;
|
| + else if (token.blockType() == CSSParserToken::BlockEnd)
|
| + nestingLevel--;
|
| + if (nestingLevel) {
|
| + args.append(token);
|
| + if (token.unitType() == CSSPrimitiveValue::CSS_REMS)
|
| + usesRemUnits = true;
|
| + }
|
| + } while (nestingLevel && !range.atEnd());
|
| +
|
| + while (nestingLevel-- > 1) {
|
| + static CSSParserToken rightBracket(DelimiterToken, ')');
|
| + args.append(rightBracket);
|
| + }
|
| +}
|
| +
|
| CSSParserValueList::CSSParserValueList(CSSParserTokenRange range, bool& usesRemUnits)
|
| : m_current(0)
|
| {
|
| @@ -62,20 +84,29 @@ CSSParserValueList::CSSParserValueList(CSSParserTokenRange range, bool& usesRemU
|
| break;
|
| }
|
|
|
| + value.id = CSSValueInvalid;
|
| + value.isInt = false;
|
| +
|
| + CSSValueID id = cssValueKeywordID(token.value());
|
| + if (id == CSSValueCalc || id == CSSValueWebkitCalc) {
|
| + value.unit = CSSParserValue::CalcFunction;
|
| + value.calcFunction = new CSSParserCalcFunction;
|
| + consumeUntilBlockEnd(range, value.calcFunction->args, usesRemUnits);
|
| +
|
| + calcDepth++;
|
| + break;
|
| + }
|
| + value.unit = CSSParserValue::Function;
|
| CSSParserFunction* function = new CSSParserFunction;
|
| - function->id = cssValueKeywordID(token.value());
|
| + function->id = id;
|
| CSSParserValueList* list = new CSSParserValueList;
|
| function->args = adoptPtr(list);
|
|
|
| - value.id = CSSValueInvalid;
|
| - value.isInt = false;
|
| - value.unit = CSSParserValue::Function;
|
| value.function = function;
|
|
|
| stack.last()->addValue(value);
|
| stack.append(list);
|
| bracketCounts.append(0);
|
| - calcDepth += (function->id == CSSValueCalc || function->id == CSSValueWebkitCalc);
|
| continue;
|
| }
|
| case LeftParenthesisToken: {
|
| @@ -101,7 +132,7 @@ CSSParserValueList::CSSParserValueList(CSSParserTokenRange range, bool& usesRemU
|
| }
|
| CSSParserValueList* currentList = stack.last();
|
| CSSParserValue* current = currentList->valueAt(currentList->size()-1);
|
| - if (current->unit == CSSParserValue::Function) {
|
| + if (current->unit == CSSParserValue::CalcFunction) {
|
| CSSValueID id = current->function->id;
|
| calcDepth -= (id == CSSValueCalc || id == CSSValueWebkitCalc);
|
| }
|
| @@ -179,11 +210,6 @@ CSSParserValueList::CSSParserValueList(CSSParserTokenRange range, bool& usesRemU
|
| }
|
| case DelimiterToken:
|
| value.setFromOperator(token.delimiter());
|
| - if (calcDepth && token.delimiter() == '+' && (&token - 1)->type() != WhitespaceToken) {
|
| - // calc(1px+ 2px) is invalid
|
| - destroyAndClear();
|
| - return;
|
| - }
|
| break;
|
| case CommaToken:
|
| value.setFromOperator(',');
|
|
|