| 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..3359feff92d6d7317b7a982de0d2c38c99f1b4c3 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, 3> paintTypeList;
 | 
| +    RefPtrWillBeRawPtr<CSSPrimitiveValue> fill = nullptr;
 | 
| +    RefPtrWillBeRawPtr<CSSPrimitiveValue> stroke = nullptr;
 | 
| +    RefPtrWillBeRawPtr<CSSPrimitiveValue> markers = nullptr;
 | 
| +    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 {
 | 
| 
 |