--- a/layout/style/StyleAnimationValue.cpp
+++ b/layout/style/StyleAnimationValue.cpp
@@ -2145,20 +2145,26 @@ AddCSSValuePairList(nsCSSPropertyID aPro
if (aList1 || aList2) {
return nullptr; // We can't interpolate lists of different lengths
}
return result;
}
+enum class Restrictions {
+ Enable,
+ Disable
+};
+
static already_AddRefed<nsCSSValue::Array>
AddShapeFunction(nsCSSPropertyID aProperty,
double aCoeff1, const nsCSSValue::Array* aArray1,
- double aCoeff2, const nsCSSValue::Array* aArray2)
+ double aCoeff2, const nsCSSValue::Array* aArray2,
+ Restrictions aRestriction = Restrictions::Enable)
{
MOZ_ASSERT(aArray1 && aArray1->Count() == 2, "expected shape function");
MOZ_ASSERT(aArray2 && aArray2->Count() == 2, "expected shape function");
MOZ_ASSERT(aArray1->Item(0).GetUnit() == eCSSUnit_Function,
"expected function");
MOZ_ASSERT(aArray2->Item(0).GetUnit() == eCSSUnit_Function,
"expected function");
MOZ_ASSERT(aArray1->Item(1).GetUnit() == eCSSUnit_Enumerated,
@@ -2180,29 +2186,33 @@ AddShapeFunction(nsCSSPropertyID aProper
RefPtr<nsCSSValue::Array> result = nsCSSValue::Array::Create(2);
nsCSSValue::Array* resultFuncArgs =
result->Item(0).InitFunction(shapeFuncName,
ShapeArgumentCount(shapeFuncName));
switch (shapeFuncName) {
case eCSSKeyword_ellipse:
// Add ellipses' |ry| values (but fail if we encounter an enum):
- if (!AddCSSValuePixelPercentCalc(CSS_PROPERTY_VALUE_NONNEGATIVE,
+ if (!AddCSSValuePixelPercentCalc(aRestriction == Restrictions::Enable
+ ? CSS_PROPERTY_VALUE_NONNEGATIVE
+ : 0,
GetCommonUnit(aProperty,
func1->Item(2).GetUnit(),
func2->Item(2).GetUnit()),
aCoeff1, func1->Item(2),
aCoeff2, func2->Item(2),
resultFuncArgs->Item(2))) {
return nullptr;
}
MOZ_FALLTHROUGH; // to handle rx and center point
case eCSSKeyword_circle: {
// Add circles' |r| (or ellipses' |rx|) values:
- if (!AddCSSValuePixelPercentCalc(CSS_PROPERTY_VALUE_NONNEGATIVE,
+ if (!AddCSSValuePixelPercentCalc(aRestriction == Restrictions::Enable
+ ? CSS_PROPERTY_VALUE_NONNEGATIVE
+ : 0,
GetCommonUnit(aProperty,
func1->Item(1).GetUnit(),
func2->Item(1).GetUnit()),
aCoeff1, func1->Item(1),
aCoeff2, func2->Item(1),
resultFuncArgs->Item(1))) {
return nullptr;
}
@@ -2232,17 +2242,19 @@ AddShapeFunction(nsCSSPropertyID aProper
break;
}
case eCSSKeyword_inset: {
MOZ_ASSERT(func1->Count() == 6 && func2->Count() == 6,
"Update for CSSParserImpl::ParseInsetFunction changes");
// Items 1-4 are respectively the top, right, bottom and left offsets
// from the reference box.
for (size_t i = 1; i <= 4; ++i) {
- if (!AddCSSValuePixelPercentCalc(CSS_PROPERTY_VALUE_NONNEGATIVE,
+ if (!AddCSSValuePixelPercentCalc(aRestriction == Restrictions::Enable
+ ? CSS_PROPERTY_VALUE_NONNEGATIVE
+ : 0,
GetCommonUnit(aProperty,
func1->Item(i).GetUnit(),
func2->Item(i).GetUnit()),
aCoeff1, func1->Item(i),
aCoeff2, func2->Item(i),
resultFuncArgs->Item(i))) {
return nullptr;
}
@@ -2255,17 +2267,19 @@ AddShapeFunction(nsCSSPropertyID aProper
const nsCSSValue::Array* radii1 = func1->Item(5).GetArrayValue();
const nsCSSValue::Array* radii2 = func2->Item(5).GetArrayValue();
MOZ_ASSERT(radii1->Count() == 4 && radii2->Count() == 4);
nsCSSValue::Array* resultRadii = nsCSSValue::Array::Create(4);
resultFuncArgs->Item(5).SetArrayValue(resultRadii, eCSSUnit_Array);
// We use an arbitrary border-radius property here to get the appropriate
// restrictions for radii since this is a <border-radius> value.
uint32_t restrictions =
- nsCSSProps::ValueRestrictions(eCSSProperty_border_top_left_radius);
+ aRestriction == Restrictions::Enable
+ ? nsCSSProps::ValueRestrictions(eCSSProperty_border_top_left_radius)
+ : 0;
for (size_t i = 0; i < 4; ++i) {
const nsCSSValuePair& pair1 = radii1->Item(i).GetPairValue();
const nsCSSValuePair& pair2 = radii2->Item(i).GetPairValue();
const Maybe<nsCSSValuePair> pairResult =
AddCSSValuePair(aProperty, restrictions,
aCoeff1, &pair1,
aCoeff2, &pair2);
if (!pairResult) {