OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |