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 class CalcParseScope { | 129 // TODO(rwlbuis): consider pulling in the parsing logic from CSSCalculationValue .cpp. |
130 class CalcParser { | |
130 STACK_ALLOCATED(); | 131 STACK_ALLOCATED(); |
131 | 132 |
132 public: | 133 public: |
133 explicit CalcParseScope(CSSParserTokenRange& range, ValueRange valueRange = ValueRangeAll) | 134 explicit CalcParser(CSSParserTokenRange& range, ValueRange valueRange = Valu eRangeAll) |
134 : m_sourceRange(range) | 135 : m_sourceRange(range) |
135 , m_range(range) | 136 , m_range(range) |
136 { | 137 { |
137 const CSSParserToken& token = range.peek(); | 138 const CSSParserToken& token = range.peek(); |
138 if (token.functionId() == CSSValueCalc || token.functionId() == CSSValue WebkitCalc) | 139 if (token.functionId() == CSSValueCalc || token.functionId() == CSSValue WebkitCalc) |
139 m_calcValue = CSSCalcValue::create(consumeFunction(m_range), valueRa nge); | 140 m_calcValue = CSSCalcValue::create(consumeFunction(m_range), valueRa nge); |
140 } | 141 } |
141 | 142 |
142 const CSSCalcValue* value() const { return m_calcValue.get(); } | 143 const CSSCalcValue* value() const { return m_calcValue.get(); } |
alancutter (OOO until 2018)
2015/09/30 23:55:37
I wonder if peekValue() would be a more consistent
| |
143 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> releaseValue() | 144 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeValue() |
144 { | 145 { |
146 if (!m_calcValue) | |
147 return nullptr; | |
145 m_sourceRange = m_range; | 148 m_sourceRange = m_range; |
146 return CSSPrimitiveValue::create(m_calcValue.release()); | 149 return CSSPrimitiveValue::create(m_calcValue.release()); |
147 } | 150 } |
148 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> releaseNumber() | 151 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeNumber() |
149 { | 152 { |
153 if (!m_calcValue) | |
154 return nullptr; | |
150 m_sourceRange = m_range; | 155 m_sourceRange = m_range; |
151 CSSPrimitiveValue::UnitType unitType = m_calcValue->isInt() ? CSSPrimiti veValue::UnitType::Integer : CSSPrimitiveValue::UnitType::Number; | 156 CSSPrimitiveValue::UnitType unitType = m_calcValue->isInt() ? CSSPrimiti veValue::UnitType::Integer : CSSPrimitiveValue::UnitType::Number; |
152 return cssValuePool().createValue(m_calcValue->doubleValue(), unitType); | 157 return cssValuePool().createValue(m_calcValue->doubleValue(), unitType); |
153 } | 158 } |
154 | 159 |
155 private: | 160 private: |
156 CSSParserTokenRange& m_sourceRange; | 161 CSSParserTokenRange& m_sourceRange; |
157 CSSParserTokenRange m_range; | 162 CSSParserTokenRange m_range; |
158 RefPtrWillBeMember<CSSCalcValue> m_calcValue; | 163 RefPtrWillBeMember<CSSCalcValue> m_calcValue; |
159 }; | 164 }; |
160 | 165 |
161 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeInteger(CSSParserTokenRa nge& range, CSSParserMode cssParserMode, double minimumValue = std::numeric_limi ts<int>::min()) | 166 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeInteger(CSSParserTokenRa nge& range, CSSParserMode cssParserMode, double minimumValue = std::numeric_limi ts<int>::min()) |
162 { | 167 { |
163 const CSSParserToken& token = range.peek(); | 168 const CSSParserToken& token = range.peek(); |
164 if (token.type() == NumberToken) { | 169 if (token.type() == NumberToken) { |
165 if (token.numericValueType() == NumberValueType || token.numericValue() < minimumValue) | 170 if (token.numericValueType() == NumberValueType || token.numericValue() < minimumValue) |
166 return nullptr; | 171 return nullptr; |
167 return cssValuePool().createValue(range.consumeIncludingWhitespace().num ericValue(), token.unitType()); | 172 return cssValuePool().createValue(range.consumeIncludingWhitespace().num ericValue(), token.unitType()); |
168 } | 173 } |
169 CalcParseScope calcScope(range); | 174 CalcParser calcParser(range); |
170 if (const CSSCalcValue* calculation = calcScope.value()) { | 175 if (const CSSCalcValue* calculation = calcParser.value()) { |
171 if (calculation->category() != CalcNumber || !calculation->isInt()) | 176 if (calculation->category() != CalcNumber || !calculation->isInt()) |
172 return nullptr; | 177 return nullptr; |
173 double value = calculation->doubleValue(); | 178 double value = calculation->doubleValue(); |
174 if (value < minimumValue) | 179 if (value < minimumValue) |
175 return nullptr; | 180 return nullptr; |
176 return calcScope.releaseNumber(); | 181 return calcParser.consumeNumber(); |
177 } | 182 } |
178 return nullptr; | 183 return nullptr; |
179 } | 184 } |
180 | 185 |
181 inline bool shouldAcceptUnitlessValues(double fValue, CSSParserMode cssParserMod e, UnitlessQuirk unitless) | 186 inline bool shouldAcceptUnitlessValues(double fValue, CSSParserMode cssParserMod e, UnitlessQuirk unitless) |
182 { | 187 { |
183 // Quirks mode for certain properties and presentation attributes accept uni t-less values for certain units. | 188 // Quirks mode for certain properties and presentation attributes accept uni t-less values for certain units. |
184 return !fValue // 0 can always be unitless. | 189 return !fValue // 0 can always be unitless. |
185 || isUnitLessLengthParsingEnabledForMode(cssParserMode) // HTML and SVG attribute values can always be unitless. | 190 || isUnitLessLengthParsingEnabledForMode(cssParserMode) // HTML and SVG attribute values can always be unitless. |
186 || (cssParserMode == HTMLQuirksMode && (unitless == UnitlessQuirk::Allow )); | 191 || (cssParserMode == HTMLQuirksMode && (unitless == UnitlessQuirk::Allow )); |
(...skipping 29 matching lines...) Expand all Loading... | |
216 if (valueRange == ValueRangeNonNegative && token.numericValue() < 0) | 221 if (valueRange == ValueRangeNonNegative && token.numericValue() < 0) |
217 return nullptr; | 222 return nullptr; |
218 return cssValuePool().createValue(range.consumeIncludingWhitespace().num ericValue(), token.unitType()); | 223 return cssValuePool().createValue(range.consumeIncludingWhitespace().num ericValue(), token.unitType()); |
219 } | 224 } |
220 if (token.type() == NumberToken) { | 225 if (token.type() == NumberToken) { |
221 if (!shouldAcceptUnitlessValues(token.numericValue(), cssParserMode, uni tless) | 226 if (!shouldAcceptUnitlessValues(token.numericValue(), cssParserMode, uni tless) |
222 || (valueRange == ValueRangeNonNegative && token.numericValue() < 0) ) | 227 || (valueRange == ValueRangeNonNegative && token.numericValue() < 0) ) |
223 return nullptr; | 228 return nullptr; |
224 return cssValuePool().createValue(range.consumeIncludingWhitespace().num ericValue(), CSSPrimitiveValue::UnitType::Pixels); | 229 return cssValuePool().createValue(range.consumeIncludingWhitespace().num ericValue(), CSSPrimitiveValue::UnitType::Pixels); |
225 } | 230 } |
226 CalcParseScope calcScope(range, valueRange); | 231 CalcParser calcParser(range, valueRange); |
227 if (const CSSCalcValue* calculation = calcScope.value()) { | 232 if (const CSSCalcValue* calculation = calcParser.value()) { |
228 if (calculation->category() != CalcLength) | 233 if (calculation->category() != CalcLength) |
229 return nullptr; | 234 return nullptr; |
230 return calcScope.releaseValue(); | 235 return calcParser.consumeValue(); |
231 } | 236 } |
alancutter (OOO until 2018)
2015/09/30 23:55:37
if (calcParser.value() && calcParser.value()->cate
| |
232 return nullptr; | 237 return nullptr; |
233 } | 238 } |
239 | |
240 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLengthOrPercent(CSSParse rTokenRange& range, CSSParserMode cssParserMode, ValueRange valueRange, Unitless Quirk unitless = UnitlessQuirk::Forbid) | |
241 { | |
242 const CSSParserToken& token = range.peek(); | |
243 if (token.type() == DimensionToken || token.type() == NumberToken) | |
244 return consumeLength(range, cssParserMode, valueRange, unitless); | |
245 if (token.type() == PercentageToken) { | |
246 if (valueRange == ValueRangeNonNegative && token.numericValue() < 0) | |
247 return nullptr; | |
248 return cssValuePool().createValue(range.consumeIncludingWhitespace().num ericValue(), CSSPrimitiveValue::UnitType::Percentage); | |
249 } | |
250 CalcParser calcParser(range, valueRange); | |
251 if (const CSSCalcValue* calculation = calcParser.value()) { | |
252 if (!(calculation->category() == CalcLength || calculation->category() = = CalcPercent || calculation->category() == CalcPercentLength)) | |
253 return nullptr; | |
254 return calcParser.consumeValue(); | |
alancutter (OOO until 2018)
2015/09/30 23:55:37
The negated expression is a bit weird, perhaps unn
| |
255 } | |
256 return nullptr; | |
257 } | |
234 | 258 |
235 static inline bool isCSSWideKeyword(const CSSValueID& id) | 259 static inline bool isCSSWideKeyword(const CSSValueID& id) |
236 { | 260 { |
237 return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset || id == CSSValueDefault; | 261 return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset || id == CSSValueDefault; |
238 } | 262 } |
239 | 263 |
240 // Methods for consuming non-shorthand properties starts here. | 264 // Methods for consuming non-shorthand properties starts here. |
241 static PassRefPtrWillBeRawPtr<CSSValue> consumeWillChange(CSSParserTokenRange& r ange) | 265 static PassRefPtrWillBeRawPtr<CSSValue> consumeWillChange(CSSParserTokenRange& r ange) |
242 { | 266 { |
243 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated (); | 267 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated (); |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
511 } | 535 } |
512 | 536 |
513 static PassRefPtrWillBeRawPtr<CSSValue> consumeTabSize(CSSParserTokenRange& rang e, CSSParserMode cssParserMode) | 537 static PassRefPtrWillBeRawPtr<CSSValue> consumeTabSize(CSSParserTokenRange& rang e, CSSParserMode cssParserMode) |
514 { | 538 { |
515 RefPtrWillBeRawPtr<CSSPrimitiveValue> parsedValue = consumeInteger(range, cs sParserMode, 0); | 539 RefPtrWillBeRawPtr<CSSPrimitiveValue> parsedValue = consumeInteger(range, cs sParserMode, 0); |
516 if (parsedValue) | 540 if (parsedValue) |
517 return parsedValue; | 541 return parsedValue; |
518 return consumeLength(range, cssParserMode, ValueRangeNonNegative); | 542 return consumeLength(range, cssParserMode, ValueRangeNonNegative); |
519 } | 543 } |
520 | 544 |
545 static PassRefPtrWillBeRawPtr<CSSValue> consumeFontSize(CSSParserTokenRange& ran ge, CSSParserMode cssParserMode) | |
546 { | |
547 if (range.peek().id() >= CSSValueXxSmall && range.peek().id() <= CSSValueLar ger) | |
548 return consumeIdent(range); | |
549 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative, U nitlessQuirk::Allow); | |
550 } | |
551 | |
521 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty ID propId) | 552 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty ID propId) |
522 { | 553 { |
523 m_range.consumeWhitespace(); | 554 m_range.consumeWhitespace(); |
524 switch (propId) { | 555 switch (propId) { |
525 case CSSPropertyWillChange: | 556 case CSSPropertyWillChange: |
526 return consumeWillChange(m_range); | 557 return consumeWillChange(m_range); |
527 case CSSPropertyPage: | 558 case CSSPropertyPage: |
528 return consumePage(m_range); | 559 return consumePage(m_range); |
529 case CSSPropertyQuotes: | 560 case CSSPropertyQuotes: |
530 return consumeQuotes(m_range); | 561 return consumeQuotes(m_range); |
531 case CSSPropertyWebkitHighlight: | 562 case CSSPropertyWebkitHighlight: |
532 return consumeWebkitHighlight(m_range); | 563 return consumeWebkitHighlight(m_range); |
533 case CSSPropertyFontVariantLigatures: | 564 case CSSPropertyFontVariantLigatures: |
534 return consumeFontVariantLigatures(m_range); | 565 return consumeFontVariantLigatures(m_range); |
535 case CSSPropertyWebkitFontFeatureSettings: | 566 case CSSPropertyWebkitFontFeatureSettings: |
536 return consumeFontFeatureSettings(m_range); | 567 return consumeFontFeatureSettings(m_range); |
537 case CSSPropertyFontVariant: | 568 case CSSPropertyFontVariant: |
538 return consumeFontVariant(); | 569 return consumeFontVariant(); |
539 case CSSPropertyFontFamily: | 570 case CSSPropertyFontFamily: |
540 return consumeFontFamily(m_range); | 571 return consumeFontFamily(m_range); |
541 case CSSPropertyFontWeight: | 572 case CSSPropertyFontWeight: |
542 return consumeFontWeight(m_range); | 573 return consumeFontWeight(m_range); |
543 case CSSPropertyLetterSpacing: | 574 case CSSPropertyLetterSpacing: |
544 case CSSPropertyWordSpacing: | 575 case CSSPropertyWordSpacing: |
545 return consumeSpacing(m_range, m_context.mode()); | 576 return consumeSpacing(m_range, m_context.mode()); |
546 case CSSPropertyTabSize: | 577 case CSSPropertyTabSize: |
547 return consumeTabSize(m_range, m_context.mode()); | 578 return consumeTabSize(m_range, m_context.mode()); |
579 case CSSPropertyFontSize: | |
580 return consumeFontSize(m_range, m_context.mode()); | |
548 default: | 581 default: |
549 return nullptr; | 582 return nullptr; |
550 } | 583 } |
551 } | 584 } |
552 | 585 |
553 static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceUnicodeRange(CSSParse rTokenRange& range) | 586 static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceUnicodeRange(CSSParse rTokenRange& range) |
554 { | 587 { |
555 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated (); | 588 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated (); |
556 | 589 |
557 do { | 590 do { |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
710 addProperty(CSSPropertyOverflowX, overflowXValue.release(), important); | 743 addProperty(CSSPropertyOverflowX, overflowXValue.release(), important); |
711 addProperty(CSSPropertyOverflowY, overflowYValue.release(), important); | 744 addProperty(CSSPropertyOverflowY, overflowYValue.release(), important); |
712 return true; | 745 return true; |
713 } | 746 } |
714 default: | 747 default: |
715 return false; | 748 return false; |
716 } | 749 } |
717 } | 750 } |
718 | 751 |
719 } // namespace blink | 752 } // namespace blink |
OLD | NEW |