Bug 1367028 part 2 - Simplify serialization of computed value of rect values in border-image props when possible. r?dholbert
MozReview-Commit-ID: s6TP7oB9l3
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -4445,68 +4445,74 @@ nsComputedDOMStyle::DoGetBorderImageSour
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
const nsStyleImage& image = border->mBorderImageSource;
SetValueToStyleImage(image, val);
return val.forget();
}
+void
+nsComputedDOMStyle::AppendFourSideCoordValues(nsDOMCSSValueList* aList,
+ const nsStyleSides& aValues)
+{
+ const nsStyleCoord& top = aValues.Get(eSideTop);
+ const nsStyleCoord& right = aValues.Get(eSideRight);
+ const nsStyleCoord& bottom = aValues.Get(eSideBottom);
+ const nsStyleCoord& left = aValues.Get(eSideLeft);
+
+ auto appendValue = [this, aList](const nsStyleCoord& value) {
+ RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
+ SetValueToCoord(val, value, true);
+ aList->AppendCSSValue(val.forget());
+ };
+ appendValue(top);
+ if (top != right || top != bottom || top != left) {
+ appendValue(right);
+ if (top != bottom || right != left) {
+ appendValue(bottom);
+ if (right != left) {
+ appendValue(left);
+ }
+ }
+ }
+}
+
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetBorderImageSlice()
{
+ const nsStyleBorder* border = StyleBorder();
RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
-
- const nsStyleBorder* border = StyleBorder();
- // Four slice numbers.
- NS_FOR_CSS_SIDES (side) {
- RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
- SetValueToCoord(val, border->mBorderImageSlice.Get(side), true, nullptr);
- valueList->AppendCSSValue(val.forget());
- }
+ AppendFourSideCoordValues(valueList, border->mBorderImageSlice);
// Fill keyword.
if (NS_STYLE_BORDER_IMAGE_SLICE_FILL == border->mBorderImageFill) {
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
val->SetIdent(eCSSKeyword_fill);
valueList->AppendCSSValue(val.forget());
}
return valueList.forget();
}
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetBorderImageWidth()
{
const nsStyleBorder* border = StyleBorder();
RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
- NS_FOR_CSS_SIDES (side) {
- RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
- SetValueToCoord(val, border->mBorderImageWidth.Get(side),
- true, nullptr);
- valueList->AppendCSSValue(val.forget());
- }
-
+ AppendFourSideCoordValues(valueList, border->mBorderImageWidth);
return valueList.forget();
}
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetBorderImageOutset()
{
+ const nsStyleBorder* border = StyleBorder();
RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
-
- const nsStyleBorder* border = StyleBorder();
- // four slice numbers
- NS_FOR_CSS_SIDES (side) {
- RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
- SetValueToCoord(val, border->mBorderImageOutset.Get(side),
- true, nullptr);
- valueList->AppendCSSValue(val.forget());
- }
-
+ AppendFourSideCoordValues(valueList, border->mBorderImageOutset);
return valueList.forget();
}
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetBorderImageRepeat()
{
RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
--- a/layout/style/nsComputedDOMStyle.h
+++ b/layout/style/nsComputedDOMStyle.h
@@ -665,16 +665,22 @@ private:
* the resulting nscoord. If it's some other unit or a percentge base can't
* be determined, returns aDefaultValue.
*/
nscoord StyleCoordToNSCoord(const nsStyleCoord& aCoord,
PercentageBaseGetter aPercentageBaseGetter,
nscoord aDefaultValue,
bool aClampNegativeCalc);
+ /**
+ * Append coord values from four sides. It omits values when possible.
+ */
+ void AppendFourSideCoordValues(nsDOMCSSValueList* aList,
+ const nsStyleSides& aValues);
+
bool GetCBContentWidth(nscoord& aWidth);
bool GetCBContentHeight(nscoord& aWidth);
bool GetScrollFrameContentWidth(nscoord& aWidth);
bool GetScrollFrameContentHeight(nscoord& aHeight);
bool GetFrameBoundsWidthForTransform(nscoord &aWidth);
bool GetFrameBoundsHeightForTransform(nscoord &aHeight);
bool GetFrameBorderRectWidth(nscoord& aWidth);
bool GetFrameBorderRectHeight(nscoord& aHeight);
--- a/testing/web-platform/tests/web-animations/animation-model/animation-types/property-list.js
+++ b/testing/web-platform/tests/web-animations/animation-model/animation-types/property-list.js
@@ -185,43 +185,43 @@ var gCSSProperties = {
'border-inline-start-width': {
// https://drafts.csswg.org/css-logical-props/#propdef-border-inline-start-width
types: [
]
},
'border-image-outset': {
// https://drafts.csswg.org/css-backgrounds-3/#border-image-outset
types: [
- { type: 'discrete', options: [ [ '1 1 1 1', '5 5 5 5' ] ] }
+ { type: 'discrete', options: [ [ '1 2 3 4', '5 6 7 8' ] ] }
]
},
'border-image-repeat': {
// https://drafts.csswg.org/css-backgrounds-3/#border-image-repeat
types: [
{ type: 'discrete', options: [ [ 'stretch stretch', 'repeat repeat' ] ] }
]
},
'border-image-slice': {
// https://drafts.csswg.org/css-backgrounds-3/#border-image-slice
types: [
- { type: 'discrete', options: [ [ '1 1 1 1', '5 5 5 5' ] ] }
+ { type: 'discrete', options: [ [ '1 2 3 4', '5 6 7 8' ] ] }
]
},
'border-image-source': {
// https://drafts.csswg.org/css-backgrounds-3/#border-image-source
types: [
{ type: 'discrete',
options: [ [ 'url("http://localhost/test-1")',
'url("http://localhost/test-2")' ] ] }
]
},
'border-image-width': {
// https://drafts.csswg.org/css-backgrounds-3/#border-image-width
types: [
- { type: 'discrete', options: [ [ '1 1 1 1', '5 5 5 5' ] ] }
+ { type: 'discrete', options: [ [ '1 2 3 4', '5 6 7 8' ] ] }
]
},
'border-left-color': {
// https://drafts.csswg.org/css-backgrounds-3/#border-left-color
types: [ 'color' ]
},
'border-left-style': {
// https://drafts.csswg.org/css-backgrounds-3/#border-left-style