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

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

Issue 1369353002: Move font-size property handling into CSSPropertyParser (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use CalcParser 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698