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

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

Issue 913313002: Use isComma more in CSSPropertyParser (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Handle stroke-dasharray trailing comma Created 5 years, 10 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 | « LayoutTests/svg/custom/invalid-dasharray.svg ('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 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 328
329 inline PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::createCSSImageValueWi thReferrer(const String& rawValue, const KURL& url) 329 inline PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::createCSSImageValueWi thReferrer(const String& rawValue, const KURL& url)
330 { 330 {
331 RefPtrWillBeRawPtr<CSSValue> imageValue = CSSImageValue::create(rawValue, ur l); 331 RefPtrWillBeRawPtr<CSSValue> imageValue = CSSImageValue::create(rawValue, ur l);
332 toCSSImageValue(imageValue.get())->setReferrer(m_context.referrer()); 332 toCSSImageValue(imageValue.get())->setReferrer(m_context.referrer());
333 return imageValue; 333 return imageValue;
334 } 334 }
335 335
336 static inline bool isComma(CSSParserValue* value) 336 static inline bool isComma(CSSParserValue* value)
337 { 337 {
338 return value && value->unit == CSSParserValue::Operator && value->iValue == ','; 338 ASSERT(value);
339 return value->unit == CSSParserValue::Operator && value->iValue == ',';
339 } 340 }
340 341
341 static bool consumeComma(CSSParserValueList* valueList) 342 static bool consumeComma(CSSParserValueList* valueList)
342 { 343 {
343 if (!isComma(valueList->current())) 344 CSSParserValue* value = valueList->current();
345 if (!value || !isComma(value))
344 return false; 346 return false;
345 valueList->next(); 347 valueList->next();
346 return true; 348 return true;
347 } 349 }
348 350
349 static inline bool isForwardSlashOperator(CSSParserValue* value) 351 static inline bool isForwardSlashOperator(CSSParserValue* value)
350 { 352 {
351 ASSERT(value); 353 ASSERT(value);
352 return value->unit == CSSParserValue::Operator && value->iValue == '/'; 354 return value->unit == CSSParserValue::Operator && value->iValue == '/';
353 } 355 }
(...skipping 1244 matching lines...) Expand 10 before | Expand all | Expand 10 after
1598 #endif 1600 #endif
1599 RefPtrWillBeRawPtr<CSSValue> clipValue = nullptr; 1601 RefPtrWillBeRawPtr<CSSValue> clipValue = nullptr;
1600 RefPtrWillBeRawPtr<CSSValue> positionYValue = nullptr; 1602 RefPtrWillBeRawPtr<CSSValue> positionYValue = nullptr;
1601 RefPtrWillBeRawPtr<CSSValue> repeatYValue = nullptr; 1603 RefPtrWillBeRawPtr<CSSValue> repeatYValue = nullptr;
1602 bool foundClip = false; 1604 bool foundClip = false;
1603 int i; 1605 int i;
1604 bool foundPositionCSSProperty = false; 1606 bool foundPositionCSSProperty = false;
1605 1607
1606 while (m_valueList->current()) { 1608 while (m_valueList->current()) {
1607 CSSParserValue* val = m_valueList->current(); 1609 CSSParserValue* val = m_valueList->current();
1608 if (val->unit == CSSParserValue::Operator && val->iValue == ',') { 1610 if (isComma(val)) {
1609 // We hit the end. Fill in all remaining values with the initial va lue. 1611 // We hit the end. Fill in all remaining values with the initial va lue.
1610 m_valueList->next(); 1612 m_valueList->next();
1611 for (i = 0; i < numProperties; ++i) { 1613 for (i = 0; i < numProperties; ++i) {
1612 if (properties[i] == CSSPropertyBackgroundColor && parsedPropert y[i]) 1614 if (properties[i] == CSSPropertyBackgroundColor && parsedPropert y[i])
1613 // Color is not allowed except as the last item in a list fo r backgrounds. 1615 // Color is not allowed except as the last item in a list fo r backgrounds.
1614 // Reject the entire property. 1616 // Reject the entire property.
1615 return false; 1617 return false;
1616 1618
1617 if (!parsedProperty[i] && properties[i] != CSSPropertyBackground Color) { 1619 if (!parsedProperty[i] && properties[i] != CSSPropertyBackground Color) {
1618 addFillValue(values[i], cssValuePool().createImplicitInitial Value()); 1620 addFillValue(values[i], cssValuePool().createImplicitInitial Value());
(...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after
2526 inline bool CSSPropertyParser::isPotentialPositionValue(CSSParserValue* value) 2528 inline bool CSSPropertyParser::isPotentialPositionValue(CSSParserValue* value)
2527 { 2529 {
2528 return isFillPositionKeyword(value->id) || validUnit(value, FPercent | FLeng th, ReleaseParsedCalcValue); 2530 return isFillPositionKeyword(value->id) || validUnit(value, FPercent | FLeng th, ReleaseParsedCalcValue);
2529 } 2531 }
2530 2532
2531 void CSSPropertyParser::parseFillPosition(CSSParserValueList* valueList, RefPtrW illBeRawPtr<CSSValue>& value1, RefPtrWillBeRawPtr<CSSValue>& value2, Units unitl ess) 2533 void CSSPropertyParser::parseFillPosition(CSSParserValueList* valueList, RefPtrW illBeRawPtr<CSSValue>& value1, RefPtrWillBeRawPtr<CSSValue>& value2, Units unitl ess)
2532 { 2534 {
2533 unsigned numberOfValues = 0; 2535 unsigned numberOfValues = 0;
2534 for (unsigned i = valueList->currentIndex(); i < valueList->size(); ++i, ++n umberOfValues) { 2536 for (unsigned i = valueList->currentIndex(); i < valueList->size(); ++i, ++n umberOfValues) {
2535 CSSParserValue* current = valueList->valueAt(i); 2537 CSSParserValue* current = valueList->valueAt(i);
2536 if (isComma(current) || !current || isForwardSlashOperator(current) || ! isPotentialPositionValue(current)) 2538 if (!current || isComma(current) || isForwardSlashOperator(current) || ! isPotentialPositionValue(current))
2537 break; 2539 break;
2538 } 2540 }
2539 2541
2540 if (numberOfValues > 4) 2542 if (numberOfValues > 4)
2541 return; 2543 return;
2542 2544
2543 // If we are parsing two values, we can safely call the CSS 2.1 parsing func tion and return. 2545 // If we are parsing two values, we can safely call the CSS 2.1 parsing func tion and return.
2544 if (numberOfValues <= 2) { 2546 if (numberOfValues <= 2) {
2545 parse2ValuesFillPosition(valueList, value1, value2, unitless); 2547 parse2ValuesFillPosition(valueList, value1, value2, unitless);
2546 return; 2548 return;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2600 value1 = parseFillPositionComponent(valueList, cumulativeFlags, value1Flag, ResolveValuesAsPercent, unitless); 2602 value1 = parseFillPositionComponent(valueList, cumulativeFlags, value1Flag, ResolveValuesAsPercent, unitless);
2601 if (!value1) 2603 if (!value1)
2602 return; 2604 return;
2603 2605
2604 // It only takes one value for background-position to be correctly parsed if it was specified in a shorthand (since we 2606 // It only takes one value for background-position to be correctly parsed if it was specified in a shorthand (since we
2605 // can assume that any other values belong to the rest of the shorthand). I f we're not parsing a shorthand, though, the 2607 // can assume that any other values belong to the rest of the shorthand). I f we're not parsing a shorthand, though, the
2606 // value was explicitly specified for our property. 2608 // value was explicitly specified for our property.
2607 CSSParserValue* value = valueList->next(); 2609 CSSParserValue* value = valueList->next();
2608 2610
2609 // First check for the comma. If so, we are finished parsing this value or value pair. 2611 // First check for the comma. If so, we are finished parsing this value or value pair.
2610 if (isComma(value)) 2612 if (value && isComma(value))
2611 value = 0; 2613 value = 0;
2612 2614
2613 if (value) { 2615 if (value) {
2614 value2 = parseFillPositionComponent(valueList, cumulativeFlags, value2Fl ag, ResolveValuesAsPercent, unitless); 2616 value2 = parseFillPositionComponent(valueList, cumulativeFlags, value2Fl ag, ResolveValuesAsPercent, unitless);
2615 if (value2) 2617 if (value2)
2616 valueList->next(); 2618 valueList->next();
2617 else { 2619 else {
2618 if (!inShorthand()) { 2620 if (!inShorthand()) {
2619 value1.clear(); 2621 value1.clear();
2620 return; 2622 return;
(...skipping 1983 matching lines...) Expand 10 before | Expand all | Expand 10 after
4604 PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parseFontFamily() 4606 PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parseFontFamily()
4605 { 4607 {
4606 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated() ; 4608 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated() ;
4607 CSSParserValue* value = m_valueList->current(); 4609 CSSParserValue* value = m_valueList->current();
4608 4610
4609 FontFamilyValueBuilder familyBuilder(list.get()); 4611 FontFamilyValueBuilder familyBuilder(list.get());
4610 bool inFamily = false; 4612 bool inFamily = false;
4611 4613
4612 while (value) { 4614 while (value) {
4613 CSSParserValue* nextValue = m_valueList->next(); 4615 CSSParserValue* nextValue = m_valueList->next();
4614 bool nextValBreaksFont = !nextValue || 4616 bool nextValBreaksFont = !nextValue || isComma(nextValue);
4615 (nextValue->unit == CSSParserValue::Operator && nextValue->iValue == ',');
4616 bool nextValIsFontName = nextValue && 4617 bool nextValIsFontName = nextValue &&
4617 ((nextValue->id >= CSSValueSerif && nextValue->id <= CSSValueWebkitB ody) || 4618 ((nextValue->id >= CSSValueSerif && nextValue->id <= CSSValueWebkitB ody) ||
4618 (nextValue->unit == CSSPrimitiveValue::CSS_STRING || nextValue->unit == CSSPrimitiveValue::CSS_IDENT)); 4619 (nextValue->unit == CSSPrimitiveValue::CSS_STRING || nextValue->unit == CSSPrimitiveValue::CSS_IDENT));
4619 4620
4620 if (isCSSWideKeyword(*value) && !inFamily) { 4621 if (isCSSWideKeyword(*value) && !inFamily) {
4621 if (nextValBreaksFont) 4622 if (nextValBreaksFont)
4622 value = m_valueList->next(); 4623 value = m_valueList->next();
4623 else if (nextValIsFontName) 4624 else if (nextValIsFontName)
4624 value = nextValue; 4625 value = nextValue;
4625 continue; 4626 continue;
(...skipping 3536 matching lines...) Expand 10 before | Expand all | Expand 10 after
8162 bool validPrimitive = true; 8163 bool validPrimitive = true;
8163 while (value) { 8164 while (value) {
8164 validPrimitive = validUnit(value, FLength | FPercent | FNonNeg, SVGAttri buteMode); 8165 validPrimitive = validUnit(value, FLength | FPercent | FNonNeg, SVGAttri buteMode);
8165 if (!validPrimitive) 8166 if (!validPrimitive)
8166 break; 8167 break;
8167 if (value->id) 8168 if (value->id)
8168 ret->append(CSSPrimitiveValue::createIdentifier(value->id)); 8169 ret->append(CSSPrimitiveValue::createIdentifier(value->id));
8169 else if (value->unit >= CSSPrimitiveValue::CSS_NUMBER && value->unit <= CSSPrimitiveValue::CSS_KHZ) 8170 else if (value->unit >= CSSPrimitiveValue::CSS_NUMBER && value->unit <= CSSPrimitiveValue::CSS_KHZ)
8170 ret->append(CSSPrimitiveValue::create(value->fValue, (CSSPrimitiveVa lue::UnitType) value->unit)); 8171 ret->append(CSSPrimitiveValue::create(value->fValue, (CSSPrimitiveVa lue::UnitType) value->unit));
8171 value = m_valueList->next(); 8172 value = m_valueList->next();
8172 if (value && value->unit == CSSParserValue::Operator && value->iValue == ',') 8173 bool commaConsumed = consumeComma(m_valueList);
8173 value = m_valueList->next(); 8174 value = m_valueList->current();
8175 if (commaConsumed && !value)
8176 return nullptr;
8174 } 8177 }
8175 if (!validPrimitive) 8178 if (!validPrimitive)
8176 return nullptr; 8179 return nullptr;
8177 return ret.release(); 8180 return ret.release();
8178 } 8181 }
8179 8182
8180 // normal | [ fill || stroke || markers ] 8183 // normal | [ fill || stroke || markers ]
8181 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parsePaintOrder() const 8184 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parsePaintOrder() const
8182 { 8185 {
8183 if (m_valueList->size() > 3) 8186 if (m_valueList->size() > 3)
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
8403 } else if (!validUnit(a, unit, HTMLStandardMode)) { 8406 } else if (!validUnit(a, unit, HTMLStandardMode)) {
8404 return nullptr; 8407 return nullptr;
8405 } 8408 }
8406 8409
8407 // Add the value to the current transform operation. 8410 // Add the value to the current transform operation.
8408 transformValue->append(createPrimitiveNumericValue(a)); 8411 transformValue->append(createPrimitiveNumericValue(a));
8409 8412
8410 a = args->next(); 8413 a = args->next();
8411 if (!a) 8414 if (!a)
8412 break; 8415 break;
8413 if (a->unit != CSSParserValue::Operator || a->iValue != ',') 8416 if (!isComma(a))
8414 return nullptr; 8417 return nullptr;
8415 a = args->next(); 8418 a = args->next();
8416 8419
8417 argNumber++; 8420 argNumber++;
8418 } 8421 }
8419 8422
8420 return transformValue.release(); 8423 return transformValue.release();
8421 } 8424 }
8422 8425
8423 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseMotionPath() 8426 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseMotionPath()
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
8468 } 8471 }
8469 } 8472 }
8470 8473
8471 if (!list->length()) 8474 if (!list->length())
8472 return nullptr; 8475 return nullptr;
8473 8476
8474 return list.release(); 8477 return list.release();
8475 } 8478 }
8476 8479
8477 } // namespace blink 8480 } // namespace blink
OLDNEW
« no previous file with comments | « LayoutTests/svg/custom/invalid-dasharray.svg ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698