| 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 {
|
|
|