| 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(); } |
| 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 (calcParser.value() && calcParser.value()->category() == CalcLength) |
| 228 if (calculation->category() != CalcLength) | 233 return calcParser.consumeValue(); |
| 234 return nullptr; |
| 235 } |
| 236 |
| 237 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLengthOrPercent(CSSParse
rTokenRange& range, CSSParserMode cssParserMode, ValueRange valueRange, Unitless
Quirk unitless = UnitlessQuirk::Forbid) |
| 238 { |
| 239 const CSSParserToken& token = range.peek(); |
| 240 if (token.type() == DimensionToken || token.type() == NumberToken) |
| 241 return consumeLength(range, cssParserMode, valueRange, unitless); |
| 242 if (token.type() == PercentageToken) { |
| 243 if (valueRange == ValueRangeNonNegative && token.numericValue() < 0) |
| 229 return nullptr; | 244 return nullptr; |
| 230 return calcScope.releaseValue(); | 245 return cssValuePool().createValue(range.consumeIncludingWhitespace().num
ericValue(), CSSPrimitiveValue::UnitType::Percentage); |
| 246 } |
| 247 CalcParser calcParser(range, valueRange); |
| 248 if (const CSSCalcValue* calculation = calcParser.value()) { |
| 249 if (calculation->category() == CalcLength || calculation->category() ==
CalcPercent || calculation->category() == CalcPercentLength) |
| 250 return calcParser.consumeValue(); |
| 231 } | 251 } |
| 232 return nullptr; | 252 return nullptr; |
| 233 } | 253 } |
| 234 | 254 |
| 235 static inline bool isCSSWideKeyword(const CSSValueID& id) | 255 static inline bool isCSSWideKeyword(const CSSValueID& id) |
| 236 { | 256 { |
| 237 return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset
|| id == CSSValueDefault; | 257 return id == CSSValueInitial || id == CSSValueInherit || id == CSSValueUnset
|| id == CSSValueDefault; |
| 238 } | 258 } |
| 239 | 259 |
| 240 // Methods for consuming non-shorthand properties starts here. | 260 // Methods for consuming non-shorthand properties starts here. |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 } | 531 } |
| 512 | 532 |
| 513 static PassRefPtrWillBeRawPtr<CSSValue> consumeTabSize(CSSParserTokenRange& rang
e, CSSParserMode cssParserMode) | 533 static PassRefPtrWillBeRawPtr<CSSValue> consumeTabSize(CSSParserTokenRange& rang
e, CSSParserMode cssParserMode) |
| 514 { | 534 { |
| 515 RefPtrWillBeRawPtr<CSSPrimitiveValue> parsedValue = consumeInteger(range, cs
sParserMode, 0); | 535 RefPtrWillBeRawPtr<CSSPrimitiveValue> parsedValue = consumeInteger(range, cs
sParserMode, 0); |
| 516 if (parsedValue) | 536 if (parsedValue) |
| 517 return parsedValue; | 537 return parsedValue; |
| 518 return consumeLength(range, cssParserMode, ValueRangeNonNegative); | 538 return consumeLength(range, cssParserMode, ValueRangeNonNegative); |
| 519 } | 539 } |
| 520 | 540 |
| 541 static PassRefPtrWillBeRawPtr<CSSValue> consumeFontSize(CSSParserTokenRange& ran
ge, CSSParserMode cssParserMode) |
| 542 { |
| 543 if (range.peek().id() >= CSSValueXxSmall && range.peek().id() <= CSSValueLar
ger) |
| 544 return consumeIdent(range); |
| 545 return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative, U
nitlessQuirk::Allow); |
| 546 } |
| 547 |
| 521 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty
ID propId) | 548 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty
ID propId) |
| 522 { | 549 { |
| 523 m_range.consumeWhitespace(); | 550 m_range.consumeWhitespace(); |
| 524 switch (propId) { | 551 switch (propId) { |
| 525 case CSSPropertyWillChange: | 552 case CSSPropertyWillChange: |
| 526 return consumeWillChange(m_range); | 553 return consumeWillChange(m_range); |
| 527 case CSSPropertyPage: | 554 case CSSPropertyPage: |
| 528 return consumePage(m_range); | 555 return consumePage(m_range); |
| 529 case CSSPropertyQuotes: | 556 case CSSPropertyQuotes: |
| 530 return consumeQuotes(m_range); | 557 return consumeQuotes(m_range); |
| 531 case CSSPropertyWebkitHighlight: | 558 case CSSPropertyWebkitHighlight: |
| 532 return consumeWebkitHighlight(m_range); | 559 return consumeWebkitHighlight(m_range); |
| 533 case CSSPropertyFontVariantLigatures: | 560 case CSSPropertyFontVariantLigatures: |
| 534 return consumeFontVariantLigatures(m_range); | 561 return consumeFontVariantLigatures(m_range); |
| 535 case CSSPropertyWebkitFontFeatureSettings: | 562 case CSSPropertyWebkitFontFeatureSettings: |
| 536 return consumeFontFeatureSettings(m_range); | 563 return consumeFontFeatureSettings(m_range); |
| 537 case CSSPropertyFontVariant: | 564 case CSSPropertyFontVariant: |
| 538 return consumeFontVariant(); | 565 return consumeFontVariant(); |
| 539 case CSSPropertyFontFamily: | 566 case CSSPropertyFontFamily: |
| 540 return consumeFontFamily(m_range); | 567 return consumeFontFamily(m_range); |
| 541 case CSSPropertyFontWeight: | 568 case CSSPropertyFontWeight: |
| 542 return consumeFontWeight(m_range); | 569 return consumeFontWeight(m_range); |
| 543 case CSSPropertyLetterSpacing: | 570 case CSSPropertyLetterSpacing: |
| 544 case CSSPropertyWordSpacing: | 571 case CSSPropertyWordSpacing: |
| 545 return consumeSpacing(m_range, m_context.mode()); | 572 return consumeSpacing(m_range, m_context.mode()); |
| 546 case CSSPropertyTabSize: | 573 case CSSPropertyTabSize: |
| 547 return consumeTabSize(m_range, m_context.mode()); | 574 return consumeTabSize(m_range, m_context.mode()); |
| 575 case CSSPropertyFontSize: |
| 576 return consumeFontSize(m_range, m_context.mode()); |
| 548 default: | 577 default: |
| 549 return nullptr; | 578 return nullptr; |
| 550 } | 579 } |
| 551 } | 580 } |
| 552 | 581 |
| 553 static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceUnicodeRange(CSSParse
rTokenRange& range) | 582 static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceUnicodeRange(CSSParse
rTokenRange& range) |
| 554 { | 583 { |
| 555 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated
(); | 584 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated
(); |
| 556 | 585 |
| 557 do { | 586 do { |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 addProperty(CSSPropertyOverflowX, overflowXValue.release(), important); | 739 addProperty(CSSPropertyOverflowX, overflowXValue.release(), important); |
| 711 addProperty(CSSPropertyOverflowY, overflowYValue.release(), important); | 740 addProperty(CSSPropertyOverflowY, overflowYValue.release(), important); |
| 712 return true; | 741 return true; |
| 713 } | 742 } |
| 714 default: | 743 default: |
| 715 return false; | 744 return false; |
| 716 } | 745 } |
| 717 } | 746 } |
| 718 | 747 |
| 719 } // namespace blink | 748 } // namespace blink |
| OLD | NEW |