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

Side by Side 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: Address review comments and add subtests Created 5 years, 4 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
4 * 4 *
5 * This library is free software; you can redistribute it and/or 5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public 6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either 7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version. 8 * version 2 of the License, or (at your option) any later version.
9 * 9 *
10 * This library is distributed in the hope that it will be useful, 10 * This library is distributed in the hope that it will be useful,
(...skipping 22 matching lines...) Expand all
33 using namespace WTF; 33 using namespace WTF;
34 34
35 CSSParserValueList::CSSParserValueList(CSSParserTokenRange range, bool& usesRemU nits) 35 CSSParserValueList::CSSParserValueList(CSSParserTokenRange range, bool& usesRemU nits)
36 : m_current(0) 36 : m_current(0)
37 { 37 {
38 usesRemUnits = false; 38 usesRemUnits = false;
39 Vector<CSSParserValueList*> stack; 39 Vector<CSSParserValueList*> stack;
40 Vector<int> bracketCounts; 40 Vector<int> bracketCounts;
41 stack.append(this); 41 stack.append(this);
42 bracketCounts.append(0); 42 bracketCounts.append(0);
43 unsigned calcDepth = 0;
44 while (!range.atEnd()) { 43 while (!range.atEnd()) {
45 ASSERT(stack.size() == bracketCounts.size()); 44 ASSERT(stack.size() == bracketCounts.size());
46 ASSERT(!stack.isEmpty()); 45 ASSERT(!stack.isEmpty());
47 const CSSParserToken& token = range.consume(); 46 const CSSParserToken& token = range.peek();
47 if (token.type() != FunctionToken)
48 range.consume();
48 CSSParserValue value; 49 CSSParserValue value;
49 switch (token.type()) { 50 switch (token.type()) {
50 case FunctionToken: { 51 case FunctionToken: {
51 if (token.valueEqualsIgnoringCase("url")) { 52 if (token.valueEqualsIgnoringCase("url")) {
53 range.consume();
52 const CSSParserToken& next = range.consumeIncludingWhitespace(); 54 const CSSParserToken& next = range.consumeIncludingWhitespace();
53 if (next.type() == BadStringToken || range.consume().type() != R ightParenthesisToken) { 55 if (next.type() == BadStringToken || range.consume().type() != R ightParenthesisToken) {
54 destroyAndClear(); 56 destroyAndClear();
55 return; 57 return;
56 } 58 }
57 ASSERT(next.type() == StringToken); 59 ASSERT(next.type() == StringToken);
58 value.id = CSSValueInvalid; 60 value.id = CSSValueInvalid;
59 value.isInt = false; 61 value.isInt = false;
60 value.unit = CSSPrimitiveValue::CSS_URI; 62 value.unit = CSSPrimitiveValue::CSS_URI;
61 value.string = next.value(); 63 value.string = next.value();
62 break; 64 break;
63 } 65 }
64 66
67 value.id = CSSValueInvalid;
68 value.isInt = false;
69
70 CSSValueID id = cssValueKeywordID(token.value());
71 if (id == CSSValueCalc || id == CSSValueWebkitCalc) {
72 value.unit = CSSParserValue::CalcFunction;
73 // 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.
74 value.calcFunction = new CSSParserCalcFunction(range.consumeBloc k());
75 break;
76 }
77 range.consume();
78 value.unit = CSSParserValue::Function;
65 CSSParserFunction* function = new CSSParserFunction; 79 CSSParserFunction* function = new CSSParserFunction;
66 function->id = cssValueKeywordID(token.value()); 80 function->id = id;
67 CSSParserValueList* list = new CSSParserValueList; 81 CSSParserValueList* list = new CSSParserValueList;
68 function->args = adoptPtr(list); 82 function->args = adoptPtr(list);
69 83
70 value.id = CSSValueInvalid;
71 value.isInt = false;
72 value.unit = CSSParserValue::Function;
73 value.function = function; 84 value.function = function;
74 85
75 stack.last()->addValue(value); 86 stack.last()->addValue(value);
76 stack.append(list); 87 stack.append(list);
77 bracketCounts.append(0); 88 bracketCounts.append(0);
78 calcDepth += (function->id == CSSValueCalc || function->id == CSSVal ueWebkitCalc);
79 continue; 89 continue;
80 } 90 }
81 case LeftParenthesisToken: { 91 case LeftParenthesisToken: {
82 if (calcDepth == 0) { 92 CSSParserValueList* list = new CSSParserValueList;
83 CSSParserValueList* list = new CSSParserValueList; 93 value.setFromValueList(adoptPtr(list));
84 value.setFromValueList(adoptPtr(list)); 94 stack.last()->addValue(value);
85 stack.last()->addValue(value); 95 stack.append(list);
86 stack.append(list); 96 bracketCounts.append(0);
87 bracketCounts.append(0); 97 continue;
88 continue;
89 }
90 bracketCounts.last()++;
91 value.setFromOperator('(');
92 break;
93 } 98 }
94 case RightParenthesisToken: { 99 case RightParenthesisToken: {
95 if (bracketCounts.last() == 0) { 100 if (bracketCounts.last() == 0) {
96 stack.removeLast(); 101 stack.removeLast();
97 bracketCounts.removeLast(); 102 bracketCounts.removeLast();
98 if (bracketCounts.isEmpty()) { 103 if (bracketCounts.isEmpty()) {
99 destroyAndClear(); 104 destroyAndClear();
100 return; 105 return;
101 } 106 }
102 CSSParserValueList* currentList = stack.last();
103 CSSParserValue* current = currentList->valueAt(currentList->size ()-1);
104 if (current->unit == CSSParserValue::Function) {
105 CSSValueID id = current->function->id;
106 calcDepth -= (id == CSSValueCalc || id == CSSValueWebkitCalc );
107 }
108 continue; 107 continue;
109 } 108 }
110 ASSERT(calcDepth > 0);
111 bracketCounts.last()--; 109 bracketCounts.last()--;
112 value.setFromOperator(')'); 110 value.setFromOperator(')');
113 break; 111 break;
114 } 112 }
115 case IdentToken: { 113 case IdentToken: {
116 value.id = cssValueKeywordID(token.value()); 114 value.id = cssValueKeywordID(token.value());
117 value.isInt = false; 115 value.isInt = false;
118 value.unit = CSSPrimitiveValue::CSS_IDENT; 116 value.unit = CSSPrimitiveValue::CSS_IDENT;
119 value.string = token.value(); 117 value.string = token.value();
120 break; 118 break;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 value.unit = CSSParserValue::HexColor; 170 value.unit = CSSParserValue::HexColor;
173 else if (token.type() == StringToken) 171 else if (token.type() == StringToken)
174 value.unit = CSSPrimitiveValue::CSS_STRING; 172 value.unit = CSSPrimitiveValue::CSS_STRING;
175 else 173 else
176 value.unit = CSSPrimitiveValue::CSS_URI; 174 value.unit = CSSPrimitiveValue::CSS_URI;
177 value.string = token.value(); 175 value.string = token.value();
178 break; 176 break;
179 } 177 }
180 case DelimiterToken: 178 case DelimiterToken:
181 value.setFromOperator(token.delimiter()); 179 value.setFromOperator(token.delimiter());
182 if (calcDepth && token.delimiter() == '+' && (&token - 1)->type() != WhitespaceToken) {
183 // calc(1px+ 2px) is invalid
184 destroyAndClear();
185 return;
186 }
187 break; 180 break;
188 case CommaToken: 181 case CommaToken:
189 value.setFromOperator(','); 182 value.setFromOperator(',');
190 break; 183 break;
191 case LeftBracketToken: 184 case LeftBracketToken:
192 value.setFromOperator('['); 185 value.setFromOperator('[');
193 break; 186 break;
194 case RightBracketToken: 187 case RightBracketToken:
195 value.setFromOperator(']'); 188 value.setFromOperator(']');
196 break; 189 break;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 bracketCounts.removeLast(); 228 bracketCounts.removeLast();
236 } 229 }
237 } 230 }
238 231
239 static void destroy(Vector<CSSParserValue, 4>& values) 232 static void destroy(Vector<CSSParserValue, 4>& values)
240 { 233 {
241 size_t numValues = values.size(); 234 size_t numValues = values.size();
242 for (size_t i = 0; i < numValues; i++) { 235 for (size_t i = 0; i < numValues; i++) {
243 if (values[i].unit == CSSParserValue::Function) 236 if (values[i].unit == CSSParserValue::Function)
244 delete values[i].function; 237 delete values[i].function;
238 else if (values[i].unit == CSSParserValue::CalcFunction)
239 delete values[i].calcFunction;
245 else if (values[i].unit == CSSParserValue::ValueList 240 else if (values[i].unit == CSSParserValue::ValueList
246 || values[i].unit == CSSParserValue::DimensionList) 241 || values[i].unit == CSSParserValue::DimensionList)
247 delete values[i].valueList; 242 delete values[i].valueList;
248 } 243 }
249 } 244 }
250 245
251 void CSSParserValueList::destroyAndClear() 246 void CSSParserValueList::destroyAndClear()
252 { 247 {
253 destroy(m_values); 248 destroy(m_values);
254 clearAndLeakValues(); 249 clearAndLeakValues();
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 bool CSSParserSelector::hasHostPseudoSelector() const 346 bool CSSParserSelector::hasHostPseudoSelector() const
352 { 347 {
353 for (CSSParserSelector* selector = const_cast<CSSParserSelector*>(this); sel ector; selector = selector->tagHistory()) { 348 for (CSSParserSelector* selector = const_cast<CSSParserSelector*>(this); sel ector; selector = selector->tagHistory()) {
354 if (selector->pseudoType() == CSSSelector::PseudoHost || selector->pseud oType() == CSSSelector::PseudoHostContext) 349 if (selector->pseudoType() == CSSSelector::PseudoHost || selector->pseud oType() == CSSSelector::PseudoHostContext)
355 return true; 350 return true;
356 } 351 }
357 return false; 352 return false;
358 } 353 }
359 354
360 } // namespace blink 355 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698