Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(677)

Unified Diff: Source/core/css/parser/CSSParserValues.cpp

Issue 1239983004: Make CSSCalcValue work with CSSParserTokenRange (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix autoclose problem Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(',');

Powered by Google App Engine
This is Rietveld 408576698