Chromium Code Reviews| 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..3b35654a40800127067a4a6c0e024c002554bc10 100644 |
| --- a/Source/core/css/parser/CSSParserValues.cpp |
| +++ b/Source/core/css/parser/CSSParserValues.cpp |
| @@ -40,15 +40,17 @@ CSSParserValueList::CSSParserValueList(CSSParserTokenRange range, bool& usesRemU |
| Vector<int> bracketCounts; |
| stack.append(this); |
| bracketCounts.append(0); |
| - unsigned calcDepth = 0; |
| while (!range.atEnd()) { |
| ASSERT(stack.size() == bracketCounts.size()); |
| ASSERT(!stack.isEmpty()); |
| - const CSSParserToken& token = range.consume(); |
| + const CSSParserToken& token = range.peek(); |
| + if (token.type() != FunctionToken) |
| + range.consume(); |
| CSSParserValue value; |
| switch (token.type()) { |
| case FunctionToken: { |
| if (token.valueEqualsIgnoringCase("url")) { |
| + range.consume(); |
| const CSSParserToken& next = range.consumeIncludingWhitespace(); |
| if (next.type() == BadStringToken || range.consume().type() != RightParenthesisToken) { |
| destroyAndClear(); |
| @@ -62,34 +64,37 @@ 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; |
| + // FIXME: calc expression could contain REM units |
|
Timothy Loh
2015/07/29 03:52:04
We.. probably shouldn't intentionally add regressi
rwlbuis
2015/07/29 21:33:26
Good point :) I am picking up the rem patch again.
|
| + value.calcFunction = new CSSParserCalcFunction(range.consumeBlock()); |
| + break; |
| + } |
| + range.consume(); |
| + 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: { |
| - if (calcDepth == 0) { |
| - CSSParserValueList* list = new CSSParserValueList; |
| - value.setFromValueList(adoptPtr(list)); |
| - stack.last()->addValue(value); |
| - stack.append(list); |
| - bracketCounts.append(0); |
| - continue; |
| - } |
| - bracketCounts.last()++; |
| - value.setFromOperator('('); |
| - break; |
| + CSSParserValueList* list = new CSSParserValueList; |
| + value.setFromValueList(adoptPtr(list)); |
| + stack.last()->addValue(value); |
| + stack.append(list); |
| + bracketCounts.append(0); |
| + continue; |
| } |
| case RightParenthesisToken: { |
| if (bracketCounts.last() == 0) { |
| @@ -99,15 +104,8 @@ CSSParserValueList::CSSParserValueList(CSSParserTokenRange range, bool& usesRemU |
| destroyAndClear(); |
| return; |
| } |
| - CSSParserValueList* currentList = stack.last(); |
| - CSSParserValue* current = currentList->valueAt(currentList->size()-1); |
| - if (current->unit == CSSParserValue::Function) { |
| - CSSValueID id = current->function->id; |
| - calcDepth -= (id == CSSValueCalc || id == CSSValueWebkitCalc); |
| - } |
| continue; |
| } |
| - ASSERT(calcDepth > 0); |
| bracketCounts.last()--; |
| value.setFromOperator(')'); |
| break; |
| @@ -179,11 +177,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(','); |
| @@ -242,6 +235,8 @@ static void destroy(Vector<CSSParserValue, 4>& values) |
| for (size_t i = 0; i < numValues; i++) { |
| if (values[i].unit == CSSParserValue::Function) |
| delete values[i].function; |
| + else if (values[i].unit == CSSParserValue::CalcFunction) |
| + delete values[i].calcFunction; |
| else if (values[i].unit == CSSParserValue::ValueList |
| || values[i].unit == CSSParserValue::DimensionList) |
| delete values[i].valueList; |