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 b2e902e7239d310179ec59b96d239d7d4bb115ba..6ca22bca6a57d001061fb51cb99bb9db7024c6d1 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
@@ -6,6 +6,7 @@ |
#include "core/StylePropertyShorthand.h" |
#include "core/css/CSSBasicShapeValues.h" |
+#include "core/css/CSSBorderImage.h" |
#include "core/css/CSSCalculationValue.h" |
#include "core/css/CSSContentDistributionValue.h" |
#include "core/css/CSSCounterValue.h" |
@@ -3006,16 +3007,16 @@ static PassRefPtrWillBeRawPtr<CSSBasicShapePolygonValue> consumeBasicShapePolygo |
return shape.release(); |
} |
-static void completeBorderRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4]) |
+static void complete4Sides(RefPtrWillBeRawPtr<CSSPrimitiveValue> side[4]) |
{ |
- if (radii[3]) |
+ if (side[3]) |
return; |
- if (!radii[2]) { |
- if (!radii[1]) |
- radii[1] = radii[0]; |
- radii[2] = radii[0]; |
+ if (!side[2]) { |
+ if (!side[1]) |
+ side[1] = side[0]; |
+ side[2] = side[0]; |
} |
- radii[3] = radii[1]; |
+ side[3] = side[1]; |
} |
static bool consumeRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalRadii[4], RefPtrWillBeRawPtr<CSSPrimitiveValue> verticalRadii[4], CSSParserTokenRange& range, CSSParserMode cssParserMode, bool useLegacyParsing) |
@@ -3039,7 +3040,7 @@ static bool consumeRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalRadii[4 |
verticalRadii[0] = horizontalRadii[1]; |
horizontalRadii[1] = nullptr; |
} else { |
- completeBorderRadii(horizontalRadii); |
+ complete4Sides(horizontalRadii); |
for (unsigned i = 0; i < 4; ++i) |
verticalRadii[i] = horizontalRadii[i]; |
return true; |
@@ -3056,8 +3057,8 @@ static bool consumeRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalRadii[4 |
if (!verticalRadii[0] || !range.atEnd()) |
return false; |
} |
- completeBorderRadii(horizontalRadii); |
- completeBorderRadii(verticalRadii); |
+ complete4Sides(horizontalRadii); |
+ complete4Sides(verticalRadii); |
return true; |
} |
@@ -3188,6 +3189,99 @@ static PassRefPtrWillBeRawPtr<CSSValue> consumeContentDistributionOverflowPositi |
return CSSContentDistributionValue::create(distribution, position, overflow); |
} |
+static RefPtrWillBeRawPtr<CSSPrimitiveValue> consumeBorderImageRepeatKeyword(CSSParserTokenRange& range) |
+{ |
+ return consumeIdent<CSSValueStretch, CSSValueRepeat, CSSValueSpace, CSSValueRound>(range); |
+} |
+ |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeBorderImageRepeat(CSSParserTokenRange& range) |
+{ |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontal = consumeBorderImageRepeatKeyword(range); |
+ if (!horizontal) |
+ return nullptr; |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> vertical = consumeBorderImageRepeatKeyword(range); |
+ if (!vertical) |
+ vertical = horizontal; |
+ return CSSValuePair::create(horizontal.release(), vertical.release(), CSSValuePair::DropIdenticalValues); |
+} |
+ |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeBorderImageSlice(CSSPropertyID property, CSSParserTokenRange& range, CSSParserMode cssParserMode) |
+{ |
+ bool fill = consumeIdent<CSSValueFill>(range); |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> slices[4]; |
+#if ENABLE(OILPAN) |
+ // Unconditionally zero initialize the arrays of raw pointers. |
+ memset(slices, 0, 4 * sizeof(slices[0])); |
+#endif |
+ for (size_t index = 0; index < 4; ++index) { |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> value = consumePercent(range, ValueRangeNonNegative); |
+ if (!value) |
+ value = consumeNumber(range, ValueRangeNonNegative); |
+ if (!value) |
+ break; |
+ slices[index] = value; |
+ } |
+ if (!slices[0]) |
+ return nullptr; |
+ if (consumeIdent<CSSValueFill>(range)) { |
+ if (fill) |
+ return nullptr; |
+ fill = true; |
+ } |
+ complete4Sides(slices); |
+ // FIXME: For backwards compatibility, -webkit-border-image, -webkit-mask-box-image and -webkit-box-reflect have to do a fill by default. |
+ // FIXME: What do we do with -webkit-box-reflect and -webkit-mask-box-image? Probably just have to leave them filling... |
+ if (property == CSSPropertyWebkitBorderImage || property == CSSPropertyWebkitMaskBoxImage || property == CSSPropertyWebkitBoxReflect) |
+ fill = true; |
+ return CSSBorderImageSliceValue::create(CSSQuadValue::create(slices[0].release(), slices[1].release(), slices[2].release(), slices[3].release(), CSSQuadValue::SerializeAsQuad), fill); |
+} |
+ |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeBorderImageOutset(CSSParserTokenRange& range) |
+{ |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> outsets[4]; |
+#if ENABLE(OILPAN) |
+ // Unconditionally zero initialize the arrays of raw pointers. |
+ memset(outsets, 0, 4 * sizeof(outsets[0])); |
+#endif |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> value = nullptr; |
+ for (size_t index = 0; index < 4; ++index) { |
+ value = consumeNumber(range, ValueRangeNonNegative); |
+ if (!value) |
+ value = consumeLength(range, HTMLStandardMode, ValueRangeNonNegative); |
+ if (!value) |
+ break; |
+ outsets[index] = value; |
+ } |
+ if (!outsets[0]) |
+ return nullptr; |
+ complete4Sides(outsets); |
+ return CSSQuadValue::create(outsets[0].release(), outsets[1].release(), outsets[2].release(), outsets[3].release(), CSSQuadValue::SerializeAsQuad); |
+} |
+ |
+static PassRefPtrWillBeRawPtr<CSSValue> consumeBorderImageWidth(CSSParserTokenRange& range) |
+{ |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> widths[4]; |
+#if ENABLE(OILPAN) |
+ // Unconditionally zero initialize the arrays of raw pointers. |
+ memset(widths, 0, 4 * sizeof(widths[0])); |
+#endif |
+ RefPtrWillBeRawPtr<CSSPrimitiveValue> value = nullptr; |
+ for (size_t index = 0; index < 4; ++index) { |
+ value = consumeNumber(range, ValueRangeNonNegative); |
+ if (!value) |
+ value = consumeLengthOrPercent(range, HTMLStandardMode, ValueRangeNonNegative, UnitlessQuirk::Forbid); |
+ if (!value) |
+ value = consumeIdent<CSSValueAuto>(range); |
+ if (!value) |
+ break; |
+ widths[index] = value; |
+ } |
+ if (!widths[0]) |
+ return nullptr; |
+ complete4Sides(widths); |
+ return CSSQuadValue::create(widths[0].release(), widths[1].release(), widths[2].release(), widths[3].release(), CSSQuadValue::SerializeAsQuad); |
+} |
+ |
PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID unresolvedProperty) |
{ |
CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); |
@@ -3492,6 +3586,18 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty |
case CSSPropertyAlignContent: |
ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); |
return consumeContentDistributionOverflowPosition(m_range); |
+ case CSSPropertyBorderImageRepeat: |
+ case CSSPropertyWebkitMaskBoxImageRepeat: |
+ return consumeBorderImageRepeat(m_range); |
+ case CSSPropertyBorderImageSlice: |
+ case CSSPropertyWebkitMaskBoxImageSlice: |
+ return consumeBorderImageSlice(property, m_range, m_context.mode()); |
+ case CSSPropertyBorderImageOutset: |
+ case CSSPropertyWebkitMaskBoxImageOutset: |
+ return consumeBorderImageOutset(m_range); |
+ case CSSPropertyBorderImageWidth: |
+ case CSSPropertyWebkitMaskBoxImageWidth: |
+ return consumeBorderImageWidth(m_range); |
default: |
CSSParserValueList valueList(m_range); |
if (valueList.size()) { |