Chromium Code Reviews| Index: Source/core/css/parser/CSSPropertyParser.cpp |
| diff --git a/Source/core/css/parser/CSSPropertyParser.cpp b/Source/core/css/parser/CSSPropertyParser.cpp |
| index 98e638f9ab8ea36b52381bdd2c08714ac522a16f..0c63885c07de60b99c4e50d7a27858aab7b108b0 100644 |
| --- a/Source/core/css/parser/CSSPropertyParser.cpp |
| +++ b/Source/core/css/parser/CSSPropertyParser.cpp |
| @@ -7871,50 +7871,49 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parsePaintOrder() const |
| CSSParserValue* value = m_valueList->current(); |
| ASSERT(value); |
| - RefPtrWillBeRawPtr<CSSValueList> parsedValues = CSSValueList::createSpaceSeparated(); |
| - |
| - // The default paint-order is: Fill, Stroke, Markers. |
| - bool seenFill = false, seenStroke = false, seenMarkers = false; |
| - |
| - for (; value; value = m_valueList->next()) { |
| - switch (value->id) { |
| - case CSSValueNormal: |
| - // normal inside [fill || stroke || markers] not valid |
| + Vector<CSSValueID> paintTypeList; |
|
fs
2015/07/30 14:39:37
Giving this inline-capacity (3) seems reasonable.
Shanmuga Pandi
2015/07/31 08:44:50
Done.
|
| + RefPtrWillBeRawPtr<CSSPrimitiveValue> fill; |
|
fs
2015/07/30 14:39:37
IIRC, when these are RawPtr, they won't initialize
Shanmuga Pandi
2015/07/31 08:44:50
Done.
|
| + RefPtrWillBeRawPtr<CSSPrimitiveValue> stroke; |
| + RefPtrWillBeRawPtr<CSSPrimitiveValue> markers; |
| + while (value) { |
| + if (value->id == CSSValueFill && !fill) |
| + fill = CSSPrimitiveValue::createIdentifier(value->id); |
| + else if (value->id == CSSValueStroke && !stroke) |
| + stroke = CSSPrimitiveValue::createIdentifier(value->id); |
| + else if (value->id == CSSValueMarkers && !markers) |
| + markers = CSSPrimitiveValue::createIdentifier(value->id); |
| + else |
| return nullptr; |
| - case CSSValueFill: |
| - if (seenFill) |
| - return nullptr; |
| - |
| - seenFill = true; |
| - break; |
| - case CSSValueStroke: |
| - if (seenStroke) |
| - return nullptr; |
| - |
| - seenStroke = true; |
| - break; |
| - case CSSValueMarkers: |
| - if (seenMarkers) |
| - return nullptr; |
| + paintTypeList.append(value->id); |
| + value = m_valueList->next(); |
| + } |
| - seenMarkers = true; |
| - break; |
| - default: |
| - return nullptr; |
| + // After parsing we serialize the paint-order list. Since it is not possible to |
| + // pop a last list items from CSSValueList without bigger cost, we create the |
| + // list after parsing. |
| + CSSValueID firstPaintOrderType = paintTypeList.at(0); |
| + RefPtrWillBeRawPtr<CSSValueList> paintOrderList = CSSValueList::createSpaceSeparated(); |
| + switch (firstPaintOrderType) { |
| + case CSSValueFill: |
| + case CSSValueStroke: |
| + paintOrderList->append(firstPaintOrderType == CSSValueFill ? fill.release() : stroke.release()); |
| + if (paintTypeList.size() > 1) { |
| + if (paintTypeList.at(1) == CSSValueMarkers) |
| + paintOrderList->append(markers.release()); |
| } |
| - |
| - parsedValues->append(CSSPrimitiveValue::createIdentifier(value->id)); |
| + break; |
| + case CSSValueMarkers: |
| + paintOrderList->append(markers.release()); |
| + if (paintTypeList.size() > 1) { |
| + if (paintTypeList.at(1) == CSSValueStroke) |
| + paintOrderList->append(stroke.release()); |
| + } |
| + break; |
| + default: |
| + ASSERT_NOT_REACHED(); |
| } |
| - // fill out the rest of the paint order |
| - if (!seenFill) |
| - parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueFill)); |
| - if (!seenStroke) |
| - parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueStroke)); |
| - if (!seenMarkers) |
| - parsedValues->append(CSSPrimitiveValue::createIdentifier(CSSValueMarkers)); |
| - |
| - return parsedValues.release(); |
| + return paintOrderList.release(); |
| } |
| class TransformOperationInfo { |