Index: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
index 816d91fc0e161728344bbba6368399dea1f37fc3..203b3d8f7912ad55f078dfc1f5f1cc565d46b310 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
@@ -2923,6 +2923,17 @@ static PassRefPtrWillBeRawPtr<CSSValue> consumeScrollSnapPoints(CSSParserTokenRa |
return nullptr; |
} |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeBorderRadiusCorner(CSSParserTokenRange& range, CSSParserMode cssParserMode) |
+{ |
+ RefPtrWillBeRawPtr<CSSValue> parsedValue1 = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); |
+ if (!parsedValue1) |
+ return nullptr; |
+ RefPtrWillBeRawPtr<CSSValue> parsedValue2 = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); |
+ if (!parsedValue2) |
+ parsedValue2 = parsedValue1; |
+ return CSSValuePair::create(parsedValue1.release(), parsedValue2.release(), CSSValuePair::DropIdenticalValues); |
+} |
+ |
PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID unresolvedProperty) |
{ |
CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); |
@@ -3175,6 +3186,11 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty |
case CSSPropertyScrollSnapPointsX: |
case CSSPropertyScrollSnapPointsY: |
return consumeScrollSnapPoints(m_range, m_context.mode()); |
+ case CSSPropertyBorderTopRightRadius: |
+ case CSSPropertyBorderTopLeftRadius: |
+ case CSSPropertyBorderBottomLeftRadius: |
+ case CSSPropertyBorderBottomRightRadius: |
+ return consumeBorderRadiusCorner(m_range, m_context.mode()); |
default: |
return nullptr; |
} |
@@ -3656,6 +3672,49 @@ bool CSSPropertyParser::consume4Values(const StylePropertyShorthand& shorthand, |
return m_range.atEnd(); |
} |
+static bool consumeRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalRadii[4], RefPtrWillBeRawPtr<CSSPrimitiveValue> verticalRadii[4], CSSParserTokenRange& range, CSSParserMode cssParserMode, bool useLegacyParsing) |
+{ |
+#if ENABLE(OILPAN) |
+ // Unconditionally zero initialize the arrays of raw pointers. |
+ memset(horizontalRadii, 0, 4 * sizeof(horizontalRadii[0])); |
+ memset(verticalRadii, 0, 4 * sizeof(verticalRadii[0])); |
+#endif |
+ unsigned i = 0; |
+ for (; i < 4 && !range.atEnd() && range.peek().type() != DelimiterToken; ++i) { |
+ horizontalRadii[i] = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); |
+ if (!horizontalRadii[i]) |
+ return false; |
+ } |
+ if (!horizontalRadii[0]) |
+ return false; |
+ if (range.atEnd()) { |
+ // Legacy syntax: -webkit-border-radius: l1 l2; is equivalent to border-radius: l1 / l2; |
+ if (useLegacyParsing && i == 2) { |
+ verticalRadii[0] = horizontalRadii[1]; |
+ horizontalRadii[1] = nullptr; |
+ } else { |
+ completeBorderRadii(horizontalRadii); |
+ for (unsigned i = 0; i < 4; ++i) |
+ verticalRadii[i] = horizontalRadii[i]; |
+ return true; |
+ } |
+ } else { |
+ if (range.peek().type() != DelimiterToken || range.peek().delimiter() != '/') |
+ return false; |
+ range.consumeIncludingWhitespace(); |
+ for (i = 0; i < 4 && !range.atEnd(); ++i) { |
+ verticalRadii[i] = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); |
+ if (!verticalRadii[i]) |
+ return false; |
+ } |
+ if (!verticalRadii[0] || !range.atEnd()) |
+ return false; |
+ } |
+ completeBorderRadii(horizontalRadii); |
+ completeBorderRadii(verticalRadii); |
+ return true; |
+} |
+ |
bool CSSPropertyParser::parseShorthand(CSSPropertyID unresolvedProperty, bool important) |
{ |
CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); |
@@ -3770,6 +3829,17 @@ bool CSSPropertyParser::parseShorthand(CSSPropertyID unresolvedProperty, bool im |
return consumeShorthandGreedily(webkitColumnRuleShorthand(), important); |
case CSSPropertyListStyle: |
return consumeShorthandGreedily(listStyleShorthand(), important); |
+ case CSSPropertyBorderRadius: { |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalRadii[4]; |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> verticalRadii[4]; |
+ if (!consumeRadii(horizontalRadii, verticalRadii, m_range, m_context.mode(), unresolvedProperty == CSSPropertyAliasWebkitBorderRadius)) |
+ return false; |
+ addProperty(CSSPropertyBorderTopLeftRadius, CSSValuePair::create(horizontalRadii[0].release(), verticalRadii[0].release(), CSSValuePair::DropIdenticalValues), important); |
+ addProperty(CSSPropertyBorderTopRightRadius, CSSValuePair::create(horizontalRadii[1].release(), verticalRadii[1].release(), CSSValuePair::DropIdenticalValues), important); |
+ addProperty(CSSPropertyBorderBottomRightRadius, CSSValuePair::create(horizontalRadii[2].release(), verticalRadii[2].release(), CSSValuePair::DropIdenticalValues), important); |
+ addProperty(CSSPropertyBorderBottomLeftRadius, CSSValuePair::create(horizontalRadii[3].release(), verticalRadii[3].release(), CSSValuePair::DropIdenticalValues), important); |
+ return true; |
+ } |
default: |
m_currentShorthand = oldShorthand; |
return false; |