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

Side by Side Diff: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp

Issue 1348363004: Add consumeInteger/consumeLength (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Retry Created 5 years, 3 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 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/css/parser/CSSPropertyParser.h" 6 #include "core/css/parser/CSSPropertyParser.h"
7 7
8 #include "core/StylePropertyShorthand.h" 8 #include "core/StylePropertyShorthand.h"
9 #include "core/css/CSSCalculationValue.h" 9 #include "core/css/CSSCalculationValue.h"
10 #include "core/css/CSSFontFaceSrcValue.h" 10 #include "core/css/CSSFontFaceSrcValue.h"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 119
120 static CSSParserTokenRange consumeFunction(CSSParserTokenRange& range) 120 static CSSParserTokenRange consumeFunction(CSSParserTokenRange& range)
121 { 121 {
122 ASSERT(range.peek().type() == FunctionToken); 122 ASSERT(range.peek().type() == FunctionToken);
123 CSSParserTokenRange contents = range.consumeBlock(); 123 CSSParserTokenRange contents = range.consumeBlock();
124 range.consumeWhitespace(); 124 range.consumeWhitespace();
125 contents.consumeWhitespace(); 125 contents.consumeWhitespace();
126 return contents; 126 return contents;
127 } 127 }
128 128
129 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeCalcExpression(const CSS ParserTokenRange& range, CSSPropertyParser::Units unitflags)
130 {
131 bool mustBeNonNegative = unitflags & (CSSPropertyParser::FNonNeg | CSSProper tyParser::FPositiveInteger);
132 RefPtrWillBeRawPtr<CSSCalcValue> calculation = CSSCalcValue::create(range, m ustBeNonNegative ? ValueRangeNonNegative : ValueRangeAll);
133 if (!calculation)
134 return nullptr;
135 bool b = false;
136 switch (calculation->category()) {
137 case CalcLength:
138 b = (unitflags & CSSPropertyParser::FLength);
139 break;
140 case CalcNumber:
141 b = (unitflags & CSSPropertyParser::FNumber);
142 if (!b && (unitflags & (CSSPropertyParser::FInteger | CSSPropertyParser: :FPositiveInteger)) && calculation->isInt())
143 b = true;
144 if (b && mustBeNonNegative && calculation->isNegative())
145 b = false;
146 // Always resolve calc() to a UnitType::Number in the CSSParserValue if there are no non-numbers specified in the unitflags.
147 if (b && !(unitflags & ~(CSSPropertyParser::FInteger | CSSPropertyParser ::FNumber | CSSPropertyParser::FPositiveInteger | CSSPropertyParser::FNonNeg))) {
148 double number = calculation->doubleValue();
149 if ((unitflags & CSSPropertyParser::FPositiveInteger) && number <= 0 )
150 return nullptr;
151 return cssValuePool().createValue(number, calculation->isInt() ? CSS PrimitiveValue::UnitType::Integer : CSSPrimitiveValue::UnitType::Number);
152 }
153 break;
154 case CalcPercent:
155 b = (unitflags & CSSPropertyParser::FPercent);
156 if (b && mustBeNonNegative && calculation->isNegative())
157 b = false;
158 break;
159 case CalcPercentLength:
160 b = (unitflags & CSSPropertyParser::FPercent) && (unitflags & CSSPropert yParser::FLength);
161 break;
162 case CalcPercentNumber:
163 b = (unitflags & CSSPropertyParser::FPercent) && (unitflags & CSSPropert yParser::FNumber);
164 break;
165 case CalcAngle:
166 b = (unitflags & CSSPropertyParser::FAngle);
167 break;
168 case CalcTime:
169 b = (unitflags & CSSPropertyParser::FTime);
170 break;
171 case CalcFrequency:
172 b = (unitflags & CSSPropertyParser::FFrequency);
173 break;
174 case CalcOther:
175 break;
176 }
177 if (!b)
178 return nullptr;
179 return CSSPrimitiveValue::create(calculation.release());
180 }
181
182 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeNumericValue(CSSParserTo kenRange& range, CSSPropertyParser::Units unitflags, CSSParserMode cssParserMode )
alancutter (OOO until 2018) 2015/09/25 04:13:06 After discussing with timloh we decided that split
183 {
184 const CSSParserToken& token = range.peek();
185 if (token.functionId() == CSSValueCalc || token.functionId() == CSSValueWebk itCalc) {
186 CSSParserTokenRange args = consumeFunction(range);
Timothy Loh 2015/09/25 04:44:33 BTW this will advance the token stream for invalid
187 return consumeCalcExpression(args, unitflags);
188 }
189 bool validNumber = false;
190 CSSPrimitiveValue::UnitType unitType = token.unitType();
191 if (token.type() == NumberToken) {
192 if (unitflags & CSSPropertyParser::FNumber) {
193 validNumber = true;
194 } else if (shouldAcceptUnitLessValues(token.numericValue(), unitflags, c ssParserMode)) {
195 unitType = (unitflags & CSSPropertyParser::FLength) ? CSSPrimitiveVa lue::UnitType::Pixels : CSSPrimitiveValue::UnitType::Degrees;
196 validNumber = true;
197 } else if ((unitflags & CSSPropertyParser::FInteger) && token.numericVal ueType() == IntegerValueType) {
198 validNumber = true;
199 } else if ((unitflags & CSSPropertyParser::FPositiveInteger) && token.nu mericValueType() == IntegerValueType && token.numericValue() > 0) {
200 validNumber = true;
201 }
202 } else if (token.type() == PercentageToken) {
203 validNumber = unitflags & CSSPropertyParser::FPercent;
204 } else { // DimensionToken
205 switch (token.unitType()) {
206 case CSSPrimitiveValue::UnitType::QuirkyEms:
207 if (cssParserMode != UASheetMode)
208 return nullptr;
209 /* fallthrough intentional */
210 case CSSPrimitiveValue::UnitType::Ems:
211 case CSSPrimitiveValue::UnitType::Rems:
212 case CSSPrimitiveValue::UnitType::Chs:
213 case CSSPrimitiveValue::UnitType::Exs:
214 case CSSPrimitiveValue::UnitType::Pixels:
215 case CSSPrimitiveValue::UnitType::Centimeters:
216 case CSSPrimitiveValue::UnitType::Millimeters:
217 case CSSPrimitiveValue::UnitType::Inches:
218 case CSSPrimitiveValue::UnitType::Points:
219 case CSSPrimitiveValue::UnitType::Picas:
220 case CSSPrimitiveValue::UnitType::ViewportWidth:
221 case CSSPrimitiveValue::UnitType::ViewportHeight:
222 case CSSPrimitiveValue::UnitType::ViewportMin:
223 case CSSPrimitiveValue::UnitType::ViewportMax:
224 validNumber = unitflags & CSSPropertyParser::FLength;
225 break;
226 case CSSPrimitiveValue::UnitType::Milliseconds:
227 case CSSPrimitiveValue::UnitType::Seconds:
228 validNumber = unitflags & CSSPropertyParser::FTime;
229 break;
230 case CSSPrimitiveValue::UnitType::Degrees:
231 case CSSPrimitiveValue::UnitType::Radians:
232 case CSSPrimitiveValue::UnitType::Gradians:
233 case CSSPrimitiveValue::UnitType::Turns:
234 validNumber = unitflags & CSSPropertyParser::FAngle;
235 break;
236 default:
237 break;
238 }
239 }
240 if (validNumber) {
241 if (unitflags & CSSPropertyParser::FNonNeg && token.numericValue() < 0)
242 return nullptr;
243 return cssValuePool().createValue(range.consumeIncludingWhitespace().num ericValue(), unitType);
244 }
245 return nullptr;
246 }
247
129 static inline bool isCSSWideKeyword(const CSSValueID& id) 248 static inline bool isCSSWideKeyword(const CSSValueID& id)
130 { 249 {
131 return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset || id == CSSValueDefault; 250 return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset || id == CSSValueDefault;
132 } 251 }
133 252
134 // Methods for consuming non-shorthand properties starts here. 253 // Methods for consuming non-shorthand properties starts here.
135 static PassRefPtrWillBeRawPtr<CSSValue> consumeWillChange(CSSParserTokenRange& r ange) 254 static PassRefPtrWillBeRawPtr<CSSValue> consumeWillChange(CSSParserTokenRange& r ange)
136 { 255 {
137 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated (); 256 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated ();
138 if (range.peek().id() == CSSValueAuto) { 257 if (range.peek().id() == CSSValueAuto) {
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 list->append(parsedValue); 508 list->append(parsedValue);
390 } else if ((parsedValue = consumeFamilyName(range))) { 509 } else if ((parsedValue = consumeFamilyName(range))) {
391 list->append(parsedValue); 510 list->append(parsedValue);
392 } else { 511 } else {
393 return nullptr; 512 return nullptr;
394 } 513 }
395 } while (consumeCommaIncludingWhitespace(range)); 514 } while (consumeCommaIncludingWhitespace(range));
396 return list.release(); 515 return list.release();
397 } 516 }
398 517
518 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::consumeSpacing()
519 {
520 if (m_range.peek().id() == CSSValueNormal)
521 return consumeIdent(m_range);
522 return consumeNumericValue(m_range, FLength | FUnitlessQuirk, m_context.mode ());
Timothy Loh 2015/09/25 04:44:33 // TODO(rwlbuis): Don't allow unitless values, and
523 }
524
525 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::consumeTabSize()
526 {
527 return consumeNumericValue(m_range, FInteger | FLength | FNonNeg, m_context. mode());
528 }
529
399 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty ID propId) 530 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty ID propId)
400 { 531 {
401 m_range.consumeWhitespace(); 532 m_range.consumeWhitespace();
402 switch (propId) { 533 switch (propId) {
403 case CSSPropertyWillChange: 534 case CSSPropertyWillChange:
404 return consumeWillChange(m_range); 535 return consumeWillChange(m_range);
405 case CSSPropertyPage: 536 case CSSPropertyPage:
406 return consumePage(m_range); 537 return consumePage(m_range);
407 case CSSPropertyQuotes: 538 case CSSPropertyQuotes:
408 return consumeQuotes(m_range); 539 return consumeQuotes(m_range);
409 case CSSPropertyWebkitHighlight: 540 case CSSPropertyWebkitHighlight:
410 return consumeWebkitHighlight(m_range); 541 return consumeWebkitHighlight(m_range);
411 case CSSPropertyFontVariantLigatures: 542 case CSSPropertyFontVariantLigatures:
412 return consumeFontVariantLigatures(m_range); 543 return consumeFontVariantLigatures(m_range);
413 case CSSPropertyWebkitFontFeatureSettings: 544 case CSSPropertyWebkitFontFeatureSettings:
414 return consumeFontFeatureSettings(m_range); 545 return consumeFontFeatureSettings(m_range);
415 case CSSPropertyFontVariant: 546 case CSSPropertyFontVariant:
416 return consumeFontVariant(); 547 return consumeFontVariant();
417 case CSSPropertyFontFamily: 548 case CSSPropertyFontFamily:
418 return consumeFontFamily(m_range); 549 return consumeFontFamily(m_range);
419 case CSSPropertyFontWeight: 550 case CSSPropertyFontWeight:
420 return consumeFontWeight(m_range); 551 return consumeFontWeight(m_range);
552 case CSSPropertyLetterSpacing:
553 case CSSPropertyWordSpacing:
554 return consumeSpacing();
555 case CSSPropertyTabSize:
556 return consumeTabSize();
421 default: 557 default:
422 return nullptr; 558 return nullptr;
423 } 559 }
424 } 560 }
425 561
426 static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceUnicodeRange(CSSParse rTokenRange& range) 562 static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceUnicodeRange(CSSParse rTokenRange& range)
427 { 563 {
428 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated (); 564 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated ();
429 565
430 do { 566 do {
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 addProperty(CSSPropertyOverflowX, overflowXValue.release(), important); 719 addProperty(CSSPropertyOverflowX, overflowXValue.release(), important);
584 addProperty(CSSPropertyOverflowY, overflowYValue.release(), important); 720 addProperty(CSSPropertyOverflowY, overflowYValue.release(), important);
585 return true; 721 return true;
586 } 722 }
587 default: 723 default:
588 return false; 724 return false;
589 } 725 }
590 } 726 }
591 727
592 } // namespace blink 728 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698