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

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: round II Created 5 years, 2 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> consumeInteger(CSSParserTokenRa nge& range, CSSParserMode cssParserMode, double minimumValue = std::numeric_limi ts<int>::min())
130 {
131 const CSSParserToken& token = range.peek();
132 if (token.type() == NumberToken) {
133 if (token.numericValueType() == NumberValueType || token.numericValue() < static_cast<double>(minimumValue))
134 return nullptr;
135 return cssValuePool().createValue(range.consumeIncludingWhitespace().num ericValue(), token.unitType());
136 }
137 if (token.functionId() == CSSValueCalc || token.functionId() == CSSValueWebk itCalc) {
138 RefPtrWillBeRawPtr<CSSCalcValue> calculation = CSSCalcValue::create(rang e, ValueRangeAll);
139 if (!calculation || calculation->category() != CalcNumber || !calculatio n->isInt())
140 return nullptr;
141 double value = calculation->doubleValue();
142 if (value < minimumValue)
143 return nullptr;
144 // TODO: Always resolve calc() to a UnitType::Number if there are no non -numbers specified in the unitflags.
alancutter (OOO until 2018) 2015/09/27 23:13:38 No more unitflags, this can be resolved now. (:
145 return CSSPrimitiveValue::create(calculation.release());
146 }
147 return nullptr;
148 }
149
150 inline bool shouldAcceptUnitLessValues(double fValue, CSSParserMode cssParserMod e)
151 {
152 // Quirks mode for certain properties and presentation attributes accept uni t-less values for certain units.
153 return !fValue // 0 can always be unitless.
154 || isUnitLessLengthParsingEnabledForMode(cssParserMode) // HTML and SVG attribute values can always be unitless.
155 || cssParserMode == HTMLQuirksMode;
156 }
157
158 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLength(CSSParserTokenRan ge& range, CSSParserMode cssParserMode, ValueRange valueRange, UnitlessQuirk uni tless = UnitlessQuirk::Forbid)
159 {
160 const CSSParserToken& token = range.peek();
161 if (token.type() == DimensionToken) {
162 bool validNumber = false;
163 switch (token.unitType()) {
164 case CSSPrimitiveValue::UnitType::QuirkyEms:
165 if (cssParserMode != UASheetMode)
166 return nullptr;
167 /* fallthrough intentional */
168 case CSSPrimitiveValue::UnitType::Ems:
169 case CSSPrimitiveValue::UnitType::Rems:
170 case CSSPrimitiveValue::UnitType::Chs:
171 case CSSPrimitiveValue::UnitType::Exs:
172 case CSSPrimitiveValue::UnitType::Pixels:
173 case CSSPrimitiveValue::UnitType::Centimeters:
174 case CSSPrimitiveValue::UnitType::Millimeters:
175 case CSSPrimitiveValue::UnitType::Inches:
176 case CSSPrimitiveValue::UnitType::Points:
177 case CSSPrimitiveValue::UnitType::Picas:
178 case CSSPrimitiveValue::UnitType::ViewportWidth:
179 case CSSPrimitiveValue::UnitType::ViewportHeight:
180 case CSSPrimitiveValue::UnitType::ViewportMin:
181 case CSSPrimitiveValue::UnitType::ViewportMax:
182 validNumber = true;
183 break;
184 default:
185 break;
186 }
187 if (!validNumber || (valueRange == ValueRangeNonNegative && token.numeri cValue() < 0))
188 return nullptr;
189 return cssValuePool().createValue(range.consumeIncludingWhitespace().num ericValue(), token.unitType());
190 }
191 if (token.type() == NumberToken) {
192 if (unitless == UnitlessQuirk::Forbid || !shouldAcceptUnitLessValues(tok en.numericValue(), cssParserMode)
193 || (valueRange == ValueRangeNonNegative && token.numericValue() < 0) )
194 return nullptr;
195 return cssValuePool().createValue(range.consumeIncludingWhitespace().num ericValue(), CSSPrimitiveValue::UnitType::Pixels);
196 }
197 if (token.functionId() == CSSValueCalc || token.functionId() == CSSValueWebk itCalc) {
198 RefPtrWillBeRawPtr<CSSCalcValue> calculation = CSSCalcValue::create(rang e, valueRange);
199 if (!calculation || calculation->category() != CalcLength)
200 return nullptr;
201 return CSSPrimitiveValue::create(calculation.release());
202 }
203 return nullptr;
204 }
205
129 static inline bool isCSSWideKeyword(const CSSValueID& id) 206 static inline bool isCSSWideKeyword(const CSSValueID& id)
130 { 207 {
131 return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset || id == CSSValueDefault; 208 return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset || id == CSSValueDefault;
132 } 209 }
133 210
134 // Methods for consuming non-shorthand properties starts here. 211 // Methods for consuming non-shorthand properties starts here.
135 static PassRefPtrWillBeRawPtr<CSSValue> consumeWillChange(CSSParserTokenRange& r ange) 212 static PassRefPtrWillBeRawPtr<CSSValue> consumeWillChange(CSSParserTokenRange& r ange)
136 { 213 {
137 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated (); 214 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated ();
138 if (range.peek().id() == CSSValueAuto) { 215 if (range.peek().id() == CSSValueAuto) {
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 list->append(parsedValue); 466 list->append(parsedValue);
390 } else if ((parsedValue = consumeFamilyName(range))) { 467 } else if ((parsedValue = consumeFamilyName(range))) {
391 list->append(parsedValue); 468 list->append(parsedValue);
392 } else { 469 } else {
393 return nullptr; 470 return nullptr;
394 } 471 }
395 } while (consumeCommaIncludingWhitespace(range)); 472 } while (consumeCommaIncludingWhitespace(range));
396 return list.release(); 473 return list.release();
397 } 474 }
398 475
476 static PassRefPtrWillBeRawPtr<CSSValue> consumeSpacing(CSSParserTokenRange& rang e, CSSParserMode cssParserMode)
477 {
478 if (range.peek().id() == CSSValueNormal)
479 return consumeIdent(range);
480 // TODO(timloh): Don't allow unitless values, and allow <percentage>s in wor d-spacing.
481 return consumeLength(range, cssParserMode, ValueRangeAll, UnitlessQuirk::All ow);
482 }
483
484 static PassRefPtrWillBeRawPtr<CSSValue> consumeTabSize(CSSParserTokenRange& rang e, CSSParserMode cssParserMode)
485 {
486 RefPtrWillBeRawPtr<CSSPrimitiveValue> parsedValue = nullptr;
487 if ((parsedValue = consumeInteger(range, cssParserMode, 0)))
alancutter (OOO until 2018) 2015/09/27 23:13:38 May as well do the assignment in the declaration,
488 return parsedValue;
489 return consumeLength(range, cssParserMode, ValueRangeNonNegative);
490 }
491
399 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty ID propId) 492 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty ID propId)
400 { 493 {
401 m_range.consumeWhitespace(); 494 m_range.consumeWhitespace();
402 switch (propId) { 495 switch (propId) {
403 case CSSPropertyWillChange: 496 case CSSPropertyWillChange:
404 return consumeWillChange(m_range); 497 return consumeWillChange(m_range);
405 case CSSPropertyPage: 498 case CSSPropertyPage:
406 return consumePage(m_range); 499 return consumePage(m_range);
407 case CSSPropertyQuotes: 500 case CSSPropertyQuotes:
408 return consumeQuotes(m_range); 501 return consumeQuotes(m_range);
409 case CSSPropertyWebkitHighlight: 502 case CSSPropertyWebkitHighlight:
410 return consumeWebkitHighlight(m_range); 503 return consumeWebkitHighlight(m_range);
411 case CSSPropertyFontVariantLigatures: 504 case CSSPropertyFontVariantLigatures:
412 return consumeFontVariantLigatures(m_range); 505 return consumeFontVariantLigatures(m_range);
413 case CSSPropertyWebkitFontFeatureSettings: 506 case CSSPropertyWebkitFontFeatureSettings:
414 return consumeFontFeatureSettings(m_range); 507 return consumeFontFeatureSettings(m_range);
415 case CSSPropertyFontVariant: 508 case CSSPropertyFontVariant:
416 return consumeFontVariant(); 509 return consumeFontVariant();
417 case CSSPropertyFontFamily: 510 case CSSPropertyFontFamily:
418 return consumeFontFamily(m_range); 511 return consumeFontFamily(m_range);
419 case CSSPropertyFontWeight: 512 case CSSPropertyFontWeight:
420 return consumeFontWeight(m_range); 513 return consumeFontWeight(m_range);
514 case CSSPropertyLetterSpacing:
515 case CSSPropertyWordSpacing:
516 return consumeSpacing(m_range, m_context.mode());
517 case CSSPropertyTabSize:
518 return consumeTabSize(m_range, m_context.mode());
421 default: 519 default:
422 return nullptr; 520 return nullptr;
423 } 521 }
424 } 522 }
425 523
426 static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceUnicodeRange(CSSParse rTokenRange& range) 524 static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceUnicodeRange(CSSParse rTokenRange& range)
427 { 525 {
428 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated (); 526 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated ();
429 527
430 do { 528 do {
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 addProperty(CSSPropertyOverflowX, overflowXValue.release(), important); 681 addProperty(CSSPropertyOverflowX, overflowXValue.release(), important);
584 addProperty(CSSPropertyOverflowY, overflowYValue.release(), important); 682 addProperty(CSSPropertyOverflowY, overflowYValue.release(), important);
585 return true; 683 return true;
586 } 684 }
587 default: 685 default:
588 return false; 686 return false;
589 } 687 }
590 } 688 }
591 689
592 } // namespace blink 690 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698