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

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

Issue 1319343004: Add property parser code path based on CSSParserTokenRange (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix tests Created 5 years, 3 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 | « Source/core/css/parser/CSSPropertyParser.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 3 * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> 5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com>
6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. 8 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
9 * Copyright (C) 2012 Intel Corporation. All rights reserved. 9 * Copyright (C) 2012 Intel Corporation. All rights reserved.
10 * 10 *
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 if (a.length() != length) 72 if (a.length() != length)
73 return false; 73 return false;
74 74
75 return a.is8Bit() ? WTF::equalIgnoringCase(b, a.characters8(), length) : WTF ::equalIgnoringCase(b, a.characters16(), length); 75 return a.is8Bit() ? WTF::equalIgnoringCase(b, a.characters8(), length) : WTF ::equalIgnoringCase(b, a.characters16(), length);
76 } 76 }
77 77
78 CSSPropertyParser::CSSPropertyParser(CSSParserValueList* valueList, 78 CSSPropertyParser::CSSPropertyParser(CSSParserValueList* valueList,
79 const CSSParserContext& context, WillBeHeapVector<CSSProperty, 256>& parsedP roperties, 79 const CSSParserContext& context, WillBeHeapVector<CSSProperty, 256>& parsedP roperties,
80 StyleRule::Type ruleType) 80 StyleRule::Type ruleType)
81 : m_valueList(valueList) 81 : m_valueList(valueList)
82 , m_range(nullptr)
82 , m_context(context) 83 , m_context(context)
83 , m_parsedProperties(parsedProperties) 84 , m_parsedProperties(parsedProperties)
84 , m_ruleType(ruleType) 85 , m_ruleType(ruleType)
85 , m_inParseShorthand(0) 86 , m_inParseShorthand(0)
86 , m_currentShorthand(CSSPropertyInvalid) 87 , m_currentShorthand(CSSPropertyInvalid)
87 , m_implicitShorthand(false) 88 , m_implicitShorthand(false)
88 { 89 {
89 } 90 }
90 91
91 bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import ant, 92 bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import ant,
92 CSSParserValueList* valueList, const CSSParserContext& context, 93 CSSParserValueList* valueList, CSSParserTokenRange* range, const CSSParserCo ntext& context,
Timothy Loh 2015/09/03 02:05:53 Having the token range as a pointer is odd, I'd ju
rwlbuis 2015/09/03 22:27:54 Done.
93 WillBeHeapVector<CSSProperty, 256>& parsedProperties, StyleRule::Type ruleTy pe) 94 WillBeHeapVector<CSSProperty, 256>& parsedProperties, StyleRule::Type ruleTy pe)
94 { 95 {
95 int parsedPropertiesSize = parsedProperties.size(); 96 int parsedPropertiesSize = parsedProperties.size();
96 97
97 CSSPropertyParser parser(valueList, context, parsedProperties, ruleType); 98 CSSPropertyParser parser(valueList, context, parsedProperties, ruleType);
99 parser.m_range = range;
98 CSSPropertyID resolvedProperty = resolveCSSPropertyID(unresolvedProperty); 100 CSSPropertyID resolvedProperty = resolveCSSPropertyID(unresolvedProperty);
99 bool parseSuccess; 101 bool parseSuccess;
100 102
101 if (ruleType == StyleRule::Viewport) { 103 if (ruleType == StyleRule::Viewport) {
102 parseSuccess = (RuntimeEnabledFeatures::cssViewportEnabled() || isUAShee tBehavior(context.mode())) 104 parseSuccess = (RuntimeEnabledFeatures::cssViewportEnabled() || isUAShee tBehavior(context.mode()))
103 && parser.parseViewportProperty(resolvedProperty, important); 105 && parser.parseViewportProperty(resolvedProperty, important);
104 } else if (ruleType == StyleRule::FontFace) { 106 } else if (ruleType == StyleRule::FontFace) {
105 parseSuccess = parser.parseFontFaceDescriptor(resolvedProperty); 107 parseSuccess = parser.parseFontFaceDescriptor(resolvedProperty);
106 } else { 108 } else {
107 parseSuccess = parser.parseValue(unresolvedProperty, important); 109 parseSuccess = parser.parseValue(unresolvedProperty, important);
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 331
330 static bool consumeComma(CSSParserValueList* valueList) 332 static bool consumeComma(CSSParserValueList* valueList)
331 { 333 {
332 CSSParserValue* value = valueList->current(); 334 CSSParserValue* value = valueList->current();
333 if (!value || !isComma(value)) 335 if (!value || !isComma(value))
334 return false; 336 return false;
335 valueList->next(); 337 valueList->next();
336 return true; 338 return true;
337 } 339 }
338 340
341 static bool consumeCommaIncludingWhitespace(CSSParserTokenRange& valueList)
342 {
343 CSSParserToken value = valueList.peek();
344 if (value.type() != CommaToken)
345 return false;
346 valueList.consumeIncludingWhitespace();
347 return true;
348 }
349
339 static inline bool isForwardSlashOperator(CSSParserValue* value) 350 static inline bool isForwardSlashOperator(CSSParserValue* value)
340 { 351 {
341 ASSERT(value); 352 ASSERT(value);
342 return value->m_unit == CSSParserValue::Operator && value->iValue == '/'; 353 return value->m_unit == CSSParserValue::Operator && value->iValue == '/';
343 } 354 }
344 355
345 static bool isGeneratedImageValue(CSSParserValue* val) 356 static bool isGeneratedImageValue(CSSParserValue* val)
346 { 357 {
347 if (val->m_unit != CSSParserValue::Function) 358 if (val->m_unit != CSSParserValue::Function)
348 return false; 359 return false;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 return; 436 return;
426 } 437 }
427 438
428 RefPtrWillBeRawPtr<CSSValue> value = prpValue; 439 RefPtrWillBeRawPtr<CSSValue> value = prpValue;
429 ShorthandScope scope(this, propId); 440 ShorthandScope scope(this, propId);
430 const CSSPropertyID* longhands = shorthand.properties(); 441 const CSSPropertyID* longhands = shorthand.properties();
431 for (unsigned i = 0; i < shorthandLength; ++i) 442 for (unsigned i = 0; i < shorthandLength; ++i)
432 addProperty(longhands[i], value, important); 443 addProperty(longhands[i], value, important);
433 } 444 }
434 445
446 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty ID propId)
447 {
448 m_range->consumeWhitespace();
449 switch (propId) {
450 case CSSPropertyWillChange:
451 return parseWillChange();
452 default:
453 ASSERT_NOT_REACHED();
454 }
455 return nullptr;
456 }
457
435 bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import ant) 458 bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import ant)
436 { 459 {
437 CSSPropertyID propId = resolveCSSPropertyID(unresolvedProperty); 460 CSSPropertyID propId = resolveCSSPropertyID(unresolvedProperty);
438 461
439 CSSParserValue* value = m_valueList->current(); 462 CSSParserValue* value = m_valueList->current();
440 463
441 // Note: m_parsedCalculation is used to pass the calc value to validUnit and then cleared at the end of this function. 464 // Note: m_parsedCalculation is used to pass the calc value to validUnit and then cleared at the end of this function.
442 // FIXME: This is to avoid having to pass parsedCalc to all validUnit caller s. 465 // FIXME: This is to avoid having to pass parsedCalc to all validUnit caller s.
443 ASSERT(!m_parsedCalculation); 466 ASSERT(!m_parsedCalculation);
444 467
(...skipping 18 matching lines...) Expand all
463 486
464 if (CSSParserFastPaths::isKeywordPropertyID(propId)) { 487 if (CSSParserFastPaths::isKeywordPropertyID(propId)) {
465 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(propId, id)) 488 if (!CSSParserFastPaths::isValidKeywordPropertyAndValue(propId, id))
466 return false; 489 return false;
467 if (m_valueList->next() && !inShorthand()) 490 if (m_valueList->next() && !inShorthand())
468 return false; 491 return false;
469 addProperty(propId, cssValuePool().createIdentifierValue(id), important) ; 492 addProperty(propId, cssValuePool().createIdentifierValue(id), important) ;
470 return true; 493 return true;
471 } 494 }
472 495
496 RefPtrWillBeRawPtr<CSSValue> parsedValue = nullptr;
497 if (propId == CSSPropertyWillChange) {
498 parsedValue = parseSingleValue(propId);
499 if (!parsedValue || !m_range->atEnd())
500 return false;
501 addProperty(propId, parsedValue.release(), important);
502 return true;
503 }
504
473 bool validPrimitive = false; 505 bool validPrimitive = false;
474 Units unitless = FUnknown; 506 Units unitless = FUnknown;
475 RefPtrWillBeRawPtr<CSSValue> parsedValue = nullptr;
476 507
477 switch (propId) { 508 switch (propId) {
478 case CSSPropertySize: // <length>{1,2} | auto | [ <page-size> || [ portrait | landscape] ] 509 case CSSPropertySize: // <length>{1,2} | auto | [ <page-size> || [ portrait | landscape] ]
479 parsedValue = parseSize(); 510 parsedValue = parseSize();
480 break; 511 break;
481 case CSSPropertyQuotes: // [<string> <string>]+ | none 512 case CSSPropertyQuotes: // [<string> <string>]+ | none
482 if (id == CSSValueNone) 513 if (id == CSSValueNone)
483 validPrimitive = true; 514 validPrimitive = true;
484 else 515 else
485 parsedValue = parseQuotes(); 516 parsedValue = parseQuotes();
(...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after
1310 validPrimitive = true; 1341 validPrimitive = true;
1311 else 1342 else
1312 validPrimitive = validUnit(value, FLength | FNonNeg); 1343 validPrimitive = validUnit(value, FLength | FNonNeg);
1313 break; 1344 break;
1314 case CSSPropertyWebkitColumnSpan: // none | all | 1 (will be dropped in the unprefixed property) 1345 case CSSPropertyWebkitColumnSpan: // none | all | 1 (will be dropped in the unprefixed property)
1315 validPrimitive = id == CSSValueAll || id == CSSValueNone || (value->unit () == CSSPrimitiveValue::UnitType::Number && value->fValue == 1); 1346 validPrimitive = id == CSSValueAll || id == CSSValueNone || (value->unit () == CSSPrimitiveValue::UnitType::Number && value->fValue == 1);
1316 break; 1347 break;
1317 case CSSPropertyWebkitColumnWidth: // auto | <length> 1348 case CSSPropertyWebkitColumnWidth: // auto | <length>
1318 parsedValue = parseColumnWidth(); 1349 parsedValue = parseColumnWidth();
1319 break; 1350 break;
1320 case CSSPropertyWillChange:
1321 parsedValue = parseWillChange();
1322 break;
1323 // End of CSS3 properties 1351 // End of CSS3 properties
1324 1352
1325 // Apple specific properties. These will never be standardized and are pure ly to 1353 // Apple specific properties. These will never be standardized and are pure ly to
1326 // support custom WebKit-based Apple applications. 1354 // support custom WebKit-based Apple applications.
1327 case CSSPropertyWebkitLineClamp: 1355 case CSSPropertyWebkitLineClamp:
1328 // When specifying number of lines, don't allow 0 as a valid value 1356 // When specifying number of lines, don't allow 0 as a valid value
1329 // When specifying either type of unit, require non-negative integers 1357 // When specifying either type of unit, require non-negative integers
1330 validPrimitive = (!id && !isCalculation(value) && validUnit(value, FInte ger | FPercent | FNonNeg) && (value->unit() == CSSPrimitiveValue::UnitType::Perc entage || value->fValue)); 1358 validPrimitive = (!id && !isCalculation(value) && validUnit(value, FInte ger | FPercent | FNonNeg) && (value->unit() == CSSPrimitiveValue::UnitType::Perc entage || value->fValue));
1331 break; 1359 break;
1332 1360
(...skipping 5499 matching lines...) Expand 10 before | Expand all | Expand 10 after
6832 if (!consumeComma(functionArgs)) 6860 if (!consumeComma(functionArgs))
6833 return nullptr; 6861 return nullptr;
6834 } 6862 }
6835 6863
6836 return imageSet.release(); 6864 return imageSet.release();
6837 } 6865 }
6838 6866
6839 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseWillChange() 6867 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseWillChange()
6840 { 6868 {
6841 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated (); 6869 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated ();
6842 if (m_valueList->current()->id == CSSValueAuto) { 6870 CSSParserToken currentToken = m_range->consumeIncludingWhitespace();
6871 if (currentToken.id() == CSSValueAuto) {
6843 // FIXME: This will be read back as an empty string instead of auto 6872 // FIXME: This will be read back as an empty string instead of auto
6844 return values.release(); 6873 return values.release();
6845 } 6874 }
6846 6875
6847 // Every comma-separated list of identifiers is a valid will-change value, 6876 // Every comma-separated list of identifiers is a valid will-change value,
Timothy Loh 2015/09/03 02:05:53 Heh, the function doesn't actually do this...
Timothy Loh 2015/09/03 02:06:58 That said, let's try and keep behaviour changes se
rwlbuis 2015/09/03 22:27:54 I agree. Sadly I don't think this is the only case
6848 // unless the list includes an explicitly disallowed identifier. 6877 // unless the list includes an explicitly disallowed identifier.
6849 while (true) { 6878 while (true) {
6850 CSSParserValue* currentValue = m_valueList->current(); 6879 if (currentToken.type() != IdentToken)
6851 if (!currentValue || currentValue->m_unit != CSSParserValue::Identifier)
6852 return nullptr; 6880 return nullptr;
6853 6881
6854 CSSPropertyID unresolvedProperty = unresolvedCSSPropertyID(currentValue- >string); 6882 CSSPropertyID unresolvedProperty = unresolvedCSSPropertyID(currentToken. value());
6855 if (unresolvedProperty) { 6883 if (unresolvedProperty) {
6856 ASSERT(CSSPropertyMetadata::isEnabledProperty(unresolvedProperty)); 6884 ASSERT(CSSPropertyMetadata::isEnabledProperty(unresolvedProperty));
6857 // Now "all" is used by both CSSValue and CSSPropertyValue. 6885 // Now "all" is used by both CSSValue and CSSPropertyValue.
6858 // Need to return nullptr when currentValue is CSSPropertyAll. 6886 // Need to return nullptr when currentValue is CSSPropertyAll.
6859 if (unresolvedProperty == CSSPropertyWillChange || unresolvedPropert y == CSSPropertyAll) 6887 if (unresolvedProperty == CSSPropertyWillChange || unresolvedPropert y == CSSPropertyAll)
6860 return nullptr; 6888 return nullptr;
6861 values->append(cssValuePool().createIdentifierValue(unresolvedProper ty)); 6889 values->append(cssValuePool().createIdentifierValue(unresolvedProper ty));
6862 } else { 6890 } else {
6863 switch (currentValue->id) { 6891 switch (currentToken.id()) {
6864 case CSSValueNone: 6892 case CSSValueNone:
6865 case CSSValueAll: 6893 case CSSValueAll:
6866 case CSSValueAuto: 6894 case CSSValueAuto:
6867 case CSSValueDefault: 6895 case CSSValueDefault:
6868 case CSSValueInitial: 6896 case CSSValueInitial:
6869 case CSSValueInherit: 6897 case CSSValueInherit:
6870 return nullptr; 6898 return nullptr;
6871 case CSSValueContents: 6899 case CSSValueContents:
6872 case CSSValueScrollPosition: 6900 case CSSValueScrollPosition:
6873 values->append(cssValuePool().createIdentifierValue(currentValue ->id)); 6901 values->append(cssValuePool().createIdentifierValue(currentToken .id()));
Timothy Loh 2015/09/03 02:05:53 Maybe we should have something like: static consu
rwlbuis 2015/09/03 22:27:54 Sounds good, I did that. A bit sad that we need co
Timothy Loh 2015/09/04 01:24:40 Yeah, although I think it's more indicative that t
6874 break; 6902 break;
6875 default: 6903 default:
6876 break; 6904 break;
6877 } 6905 }
6878 } 6906 }
6879 6907
6880 if (!m_valueList->next()) 6908 if (m_range->atEnd())
6881 break; 6909 break;
6882 if (!consumeComma(m_valueList)) 6910 if (!consumeCommaIncludingWhitespace(*m_range))
6883 return nullptr; 6911 return nullptr;
6912 currentToken = m_range->consumeIncludingWhitespace();
6884 } 6913 }
6885 6914
6886 return values.release(); 6915 return values.release();
6887 } 6916 }
6888 6917
6889 PassRefPtrWillBeRawPtr<CSSFunctionValue> CSSPropertyParser::parseBuiltinFilterAr guments(CSSParserValueList* args, CSSValueID filterType) 6918 PassRefPtrWillBeRawPtr<CSSFunctionValue> CSSPropertyParser::parseBuiltinFilterAr guments(CSSParserValueList* args, CSSValueID filterType)
6890 { 6919 {
6891 RefPtrWillBeRawPtr<CSSFunctionValue> filterValue = CSSFunctionValue::create( filterType); 6920 RefPtrWillBeRawPtr<CSSFunctionValue> filterValue = CSSFunctionValue::create( filterType);
6892 ASSERT(args); 6921 ASSERT(args);
6893 6922
(...skipping 1198 matching lines...) Expand 10 before | Expand all | Expand 10 after
8092 } 8121 }
8093 } 8122 }
8094 8123
8095 if (!list->length()) 8124 if (!list->length())
8096 return nullptr; 8125 return nullptr;
8097 8126
8098 return list.release(); 8127 return list.release();
8099 } 8128 }
8100 8129
8101 } // namespace blink 8130 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/css/parser/CSSPropertyParser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698