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

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: Add more 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
« no previous file with comments | « Source/core/css/parser/CSSParserValues.h ('k') | Source/core/css/parser/CSSPropertyParser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.setUnit(CSSPrimitiveValue::UnitType::URI); 62 value.setUnit(CSSPrimitiveValue::UnitType::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.m_unit = CSSParserValue::CalcFunction;
73 value.calcFunction = new CSSParserCalcFunction(range.consumeBloc k());
74 break;
75 }
76 range.consume();
77 value.m_unit = CSSParserValue::Function;
65 CSSParserFunction* function = new CSSParserFunction; 78 CSSParserFunction* function = new CSSParserFunction;
66 function->id = cssValueKeywordID(token.value()); 79 function->id = id;
67 CSSParserValueList* list = new CSSParserValueList; 80 CSSParserValueList* list = new CSSParserValueList;
68 function->args = adoptPtr(list); 81 function->args = adoptPtr(list);
69 82
70 value.id = CSSValueInvalid;
71 value.isInt = false;
72 value.m_unit = CSSParserValue::Function;
73 value.function = function; 83 value.function = function;
74 84
75 stack.last()->addValue(value); 85 stack.last()->addValue(value);
76 stack.append(list); 86 stack.append(list);
77 bracketCounts.append(0); 87 bracketCounts.append(0);
78 calcDepth += (function->id == CSSValueCalc || function->id == CSSVal ueWebkitCalc);
79 continue; 88 continue;
80 } 89 }
81 case LeftParenthesisToken: { 90 case LeftParenthesisToken: {
82 if (calcDepth == 0) { 91 CSSParserValueList* list = new CSSParserValueList;
83 CSSParserValueList* list = new CSSParserValueList; 92 value.setFromValueList(adoptPtr(list));
84 value.setFromValueList(adoptPtr(list)); 93 stack.last()->addValue(value);
85 stack.last()->addValue(value); 94 stack.append(list);
86 stack.append(list); 95 bracketCounts.append(0);
87 bracketCounts.append(0); 96 continue;
88 continue;
89 }
90 bracketCounts.last()++;
91 value.setFromOperator('(');
92 break;
93 } 97 }
94 case RightParenthesisToken: { 98 case RightParenthesisToken: {
95 if (bracketCounts.last() == 0) { 99 if (bracketCounts.last() == 0) {
96 stack.removeLast(); 100 stack.removeLast();
97 bracketCounts.removeLast(); 101 bracketCounts.removeLast();
98 if (bracketCounts.isEmpty()) { 102 if (bracketCounts.isEmpty()) {
99 destroyAndClear(); 103 destroyAndClear();
100 return; 104 return;
101 } 105 }
102 CSSParserValueList* currentList = stack.last();
103 CSSParserValue* current = currentList->valueAt(currentList->size ()-1);
104 if (current->m_unit == CSSParserValue::Function) {
105 CSSValueID id = current->function->id;
106 calcDepth -= (id == CSSValueCalc || id == CSSValueWebkitCalc );
107 }
108 continue; 106 continue;
109 } 107 }
110 ASSERT(calcDepth > 0);
111 bracketCounts.last()--; 108 bracketCounts.last()--;
112 value.setFromOperator(')'); 109 value.setFromOperator(')');
113 break; 110 break;
114 } 111 }
115 case IdentToken: { 112 case IdentToken: {
116 value.id = cssValueKeywordID(token.value()); 113 value.id = cssValueKeywordID(token.value());
117 value.isInt = false; 114 value.isInt = false;
118 value.m_unit = CSSParserValue::Identifier; 115 value.m_unit = CSSParserValue::Identifier;
119 value.string = token.value(); 116 value.string = token.value();
120 break; 117 break;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 value.m_unit = CSSParserValue::HexColor; 169 value.m_unit = CSSParserValue::HexColor;
173 else if (token.type() == StringToken) 170 else if (token.type() == StringToken)
174 value.setUnit(CSSPrimitiveValue::UnitType::String); 171 value.setUnit(CSSPrimitiveValue::UnitType::String);
175 else 172 else
176 value.setUnit(CSSPrimitiveValue::UnitType::URI); 173 value.setUnit(CSSPrimitiveValue::UnitType::URI);
177 value.string = token.value(); 174 value.string = token.value();
178 break; 175 break;
179 } 176 }
180 case DelimiterToken: 177 case DelimiterToken:
181 value.setFromOperator(token.delimiter()); 178 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; 179 break;
188 case CommaToken: 180 case CommaToken:
189 value.setFromOperator(','); 181 value.setFromOperator(',');
190 break; 182 break;
191 case LeftBracketToken: 183 case LeftBracketToken:
192 value.setFromOperator('['); 184 value.setFromOperator('[');
193 break; 185 break;
194 case RightBracketToken: 186 case RightBracketToken:
195 value.setFromOperator(']'); 187 value.setFromOperator(']');
196 break; 188 break;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 bracketCounts.removeLast(); 227 bracketCounts.removeLast();
236 } 228 }
237 } 229 }
238 230
239 static void destroy(Vector<CSSParserValue, 4>& values) 231 static void destroy(Vector<CSSParserValue, 4>& values)
240 { 232 {
241 size_t numValues = values.size(); 233 size_t numValues = values.size();
242 for (size_t i = 0; i < numValues; i++) { 234 for (size_t i = 0; i < numValues; i++) {
243 if (values[i].m_unit == CSSParserValue::Function) 235 if (values[i].m_unit == CSSParserValue::Function)
244 delete values[i].function; 236 delete values[i].function;
237 else if (values[i].m_unit == CSSParserValue::CalcFunction)
238 delete values[i].calcFunction;
245 else if (values[i].m_unit == CSSParserValue::ValueList 239 else if (values[i].m_unit == CSSParserValue::ValueList
246 || values[i].m_unit == CSSParserValue::DimensionList) 240 || values[i].m_unit == CSSParserValue::DimensionList)
247 delete values[i].valueList; 241 delete values[i].valueList;
248 } 242 }
249 } 243 }
250 244
251 void CSSParserValueList::destroyAndClear() 245 void CSSParserValueList::destroyAndClear()
252 { 246 {
253 destroy(m_values); 247 destroy(m_values);
254 clearAndLeakValues(); 248 clearAndLeakValues();
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 bool CSSParserSelector::hasHostPseudoSelector() const 345 bool CSSParserSelector::hasHostPseudoSelector() const
352 { 346 {
353 for (CSSParserSelector* selector = const_cast<CSSParserSelector*>(this); sel ector; selector = selector->tagHistory()) { 347 for (CSSParserSelector* selector = const_cast<CSSParserSelector*>(this); sel ector; selector = selector->tagHistory()) {
354 if (selector->pseudoType() == CSSSelector::PseudoHost || selector->pseud oType() == CSSSelector::PseudoHostContext) 348 if (selector->pseudoType() == CSSSelector::PseudoHost || selector->pseud oType() == CSSSelector::PseudoHostContext)
355 return true; 349 return true;
356 } 350 }
357 return false; 351 return false;
358 } 352 }
359 353
360 } // namespace blink 354 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/css/parser/CSSParserValues.h ('k') | Source/core/css/parser/CSSPropertyParser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698