Index: Source/core/css/SVGCSSParser.cpp |
diff --git a/Source/core/css/SVGCSSParser.cpp b/Source/core/css/SVGCSSParser.cpp |
index 6595cf7f546424d268f55aa9d7836eec5fd0d62b..ba70fcb51b420ae01875035317eb1ffea26cb4ce 100644 |
--- a/Source/core/css/SVGCSSParser.cpp |
+++ b/Source/core/css/SVGCSSParser.cpp |
@@ -24,6 +24,7 @@ |
#include "CSSPropertyNames.h" |
#include "CSSValueKeywords.h" |
+#include "RuntimeEnabledFeatures.h" |
#include "core/css/CSSParser.h" |
#include "core/css/CSSValueList.h" |
#include "core/rendering/RenderTheme.h" |
@@ -225,6 +226,16 @@ bool CSSParser::parseSVGValue(CSSPropertyID propId, bool important) |
break; |
+ case CSSPropertyPaintOrder: |
+ if (!RuntimeEnabledFeatures::svgPaintOrderEnabled()) |
+ return false; |
+ |
+ if (m_valueList->size() == 1 && id == CSSValueNormal) |
+ valid_primitive = true; |
+ else if ((parsedValue = parsePaintOrder())) |
+ m_valueList->next(); |
+ break; |
+ |
case CSSPropertyVectorEffect: // none | non-scaling-stroke | inherit |
if (id == CSSValueNone || id == CSSValueNonScalingStroke) |
valid_primitive = true; |
@@ -355,4 +366,62 @@ PassRefPtr<CSSValue> CSSParser::parseSVGColor() |
return SVGColor::createFromColor(Color(c)); |
} |
+// normal | [ fill || stroke || markers ] |
+PassRefPtr<CSSValue> CSSParser::parsePaintOrder() const |
+{ |
+ if (m_valueList->size() > 3) |
+ return 0; |
+ |
+ CSSParserValue* value = m_valueList->current(); |
+ if (!value) |
+ return 0; |
+ |
+ RefPtr<CSSValueList> parsedValues = CSSValueList::createSpaceSeparated(); |
+ |
+ // The default paint-order is: Fill, Stroke, Markers. |
+ bool seenFill = false, |
+ seenStroke = false, |
+ seenMarkers = false; |
+ |
+ do { |
+ switch (value->id) { |
+ case CSSValueNormal: |
+ // normal inside [fill || stroke || markers] not valid |
+ return 0; |
+ case CSSValueFill: |
+ if (seenFill) |
+ return 0; |
+ |
+ seenFill = true; |
+ break; |
+ case CSSValueStroke: |
+ if (seenStroke) |
+ return 0; |
+ |
+ seenStroke = true; |
+ break; |
+ case CSSValueMarkers: |
+ if (seenMarkers) |
+ return 0; |
+ |
+ seenMarkers = true; |
+ break; |
+ default: |
+ return 0; |
+ } |
+ |
+ parsedValues->append(CSSPrimitiveValue::createIdentifier(value->id)); |
+ } while ((value = m_valueList->next())); |
+ |
+ // 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(); |
+} |
+ |
} |