зеркало из https://github.com/mozilla/gecko-dev.git
Bug 526402: Stop accepting unitless 0 for angles, times, and frequencies. r=zwol
This commit is contained in:
Родитель
b6aed71369
Коммит
43155b03e4
|
@ -112,6 +112,8 @@
|
||||||
#define VARIANT_CUBIC_BEZIER 0x400000 // CSS transition timing function
|
#define VARIANT_CUBIC_BEZIER 0x400000 // CSS transition timing function
|
||||||
#define VARIANT_ALL 0x800000 //
|
#define VARIANT_ALL 0x800000 //
|
||||||
#define VARIANT_IMAGE_RECT 0x01000000 // eCSSUnit_Function
|
#define VARIANT_IMAGE_RECT 0x01000000 // eCSSUnit_Function
|
||||||
|
// This is an extra bit that says that a VARIANT_ANGLE allows unitless zero:
|
||||||
|
#define VARIANT_ZERO_ANGLE 0x02000000 // unitless zero for angles
|
||||||
|
|
||||||
// Common combinations of variants
|
// Common combinations of variants
|
||||||
#define VARIANT_AL (VARIANT_AUTO | VARIANT_LENGTH)
|
#define VARIANT_AL (VARIANT_AUTO | VARIANT_LENGTH)
|
||||||
|
@ -147,6 +149,7 @@
|
||||||
#define VARIANT_HOS (VARIANT_INHERIT | VARIANT_NONE | VARIANT_STRING)
|
#define VARIANT_HOS (VARIANT_INHERIT | VARIANT_NONE | VARIANT_STRING)
|
||||||
#define VARIANT_TIMING_FUNCTION (VARIANT_KEYWORD | VARIANT_CUBIC_BEZIER)
|
#define VARIANT_TIMING_FUNCTION (VARIANT_KEYWORD | VARIANT_CUBIC_BEZIER)
|
||||||
#define VARIANT_UK (VARIANT_URL | VARIANT_KEYWORD)
|
#define VARIANT_UK (VARIANT_URL | VARIANT_KEYWORD)
|
||||||
|
#define VARIANT_ANGLE_OR_ZERO (VARIANT_ANGLE | VARIANT_ZERO_ANGLE)
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -1806,12 +1809,12 @@ CSSParserImpl::ParseMediaQueryExpression(nsMediaQuery* aQuery)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case nsMediaFeature::eResolution:
|
case nsMediaFeature::eResolution:
|
||||||
rv = GetToken(PR_TRUE) && mToken.IsDimension() &&
|
rv = GetToken(PR_TRUE) && mToken.mType == eCSSToken_Dimension &&
|
||||||
mToken.mIntegerValid && mToken.mNumber > 0.0f;
|
mToken.mIntegerValid && mToken.mNumber > 0.0f;
|
||||||
if (rv) {
|
if (rv) {
|
||||||
// No worries about whether unitless zero is allowed, since the
|
// No worries about whether unitless zero is allowed, since the
|
||||||
// value must be positive (and we checked that above).
|
// value must be positive (and we checked that above).
|
||||||
NS_ASSERTION(!mToken.mIdent.IsEmpty(), "IsDimension lied");
|
NS_ASSERTION(!mToken.mIdent.IsEmpty(), "unit lied");
|
||||||
if (mToken.mIdent.LowerCaseEqualsLiteral("dpi")) {
|
if (mToken.mIdent.LowerCaseEqualsLiteral("dpi")) {
|
||||||
expr->mValue.SetFloatValue(mToken.mNumber, eCSSUnit_Inch);
|
expr->mValue.SetFloatValue(mToken.mNumber, eCSSUnit_Inch);
|
||||||
} else if (mToken.mIdent.LowerCaseEqualsLiteral("dpcm")) {
|
} else if (mToken.mIdent.LowerCaseEqualsLiteral("dpcm")) {
|
||||||
|
@ -4294,17 +4297,11 @@ CSSParserImpl::TranslateDimension(nsCSSValue& aValue,
|
||||||
type = VARIANT_LENGTH;
|
type = VARIANT_LENGTH;
|
||||||
}
|
}
|
||||||
else if ((VARIANT_ANGLE & aVariantMask) != 0) {
|
else if ((VARIANT_ANGLE & aVariantMask) != 0) {
|
||||||
|
NS_ASSERTION(aVariantMask & VARIANT_ZERO_ANGLE,
|
||||||
|
"must have allowed zero angle");
|
||||||
units = eCSSUnit_Degree;
|
units = eCSSUnit_Degree;
|
||||||
type = VARIANT_ANGLE;
|
type = VARIANT_ANGLE;
|
||||||
}
|
}
|
||||||
else if ((VARIANT_FREQUENCY & aVariantMask) != 0) {
|
|
||||||
units = eCSSUnit_Hertz;
|
|
||||||
type = VARIANT_FREQUENCY;
|
|
||||||
}
|
|
||||||
else if ((VARIANT_TIME & aVariantMask) != 0) {
|
|
||||||
units = eCSSUnit_Seconds;
|
|
||||||
type = VARIANT_TIME;
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
NS_ERROR("Variant mask does not include dimension; why were we called?");
|
NS_ERROR("Variant mask does not include dimension; why were we called?");
|
||||||
return PR_FALSE;
|
return PR_FALSE;
|
||||||
|
@ -4466,8 +4463,12 @@ CSSParserImpl::ParseVariant(nsCSSValue& aValue,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (((aVariantMask & (VARIANT_LENGTH | VARIANT_ANGLE | VARIANT_FREQUENCY | VARIANT_TIME)) != 0) &&
|
if (((aVariantMask & (VARIANT_LENGTH | VARIANT_ANGLE |
|
||||||
tk->IsDimension()) {
|
VARIANT_FREQUENCY | VARIANT_TIME)) != 0 &&
|
||||||
|
eCSSToken_Dimension == tk->mType) ||
|
||||||
|
((aVariantMask & (VARIANT_LENGTH | VARIANT_ZERO_ANGLE)) != 0 &&
|
||||||
|
eCSSToken_Number == tk->mType &&
|
||||||
|
tk->mNumber == 0.0f)) {
|
||||||
if (TranslateDimension(aValue, aVariantMask, tk->mNumber, tk->mIdent)) {
|
if (TranslateDimension(aValue, aVariantMask, tk->mNumber, tk->mIdent)) {
|
||||||
return PR_TRUE;
|
return PR_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -6475,7 +6476,8 @@ CSSParserImpl::ParseBackgroundItem(CSSParserImpl::BackgroundItem& aItem,
|
||||||
eCSSProperty_background_image)) {
|
eCSSProperty_background_image)) {
|
||||||
return PR_FALSE;
|
return PR_FALSE;
|
||||||
}
|
}
|
||||||
} else if (mToken.IsDimension() || tt == eCSSToken_Percentage) {
|
} else if (tt == eCSSToken_Dimension || tt == eCSSToken_Number ||
|
||||||
|
tt == eCSSToken_Percentage) {
|
||||||
if (havePosition)
|
if (havePosition)
|
||||||
return PR_FALSE;
|
return PR_FALSE;
|
||||||
havePosition = PR_TRUE;
|
havePosition = PR_TRUE;
|
||||||
|
@ -7631,8 +7633,8 @@ static PRBool GetFunctionParseInformation(nsCSSKeyword aToken,
|
||||||
static const PRInt32 kVariantMasks[eNumVariantMasks][kMaxElemsPerFunction] = {
|
static const PRInt32 kVariantMasks[eNumVariantMasks][kMaxElemsPerFunction] = {
|
||||||
{VARIANT_LENGTH | VARIANT_PERCENT},
|
{VARIANT_LENGTH | VARIANT_PERCENT},
|
||||||
{VARIANT_LENGTH | VARIANT_PERCENT, VARIANT_LENGTH | VARIANT_PERCENT},
|
{VARIANT_LENGTH | VARIANT_PERCENT, VARIANT_LENGTH | VARIANT_PERCENT},
|
||||||
{VARIANT_ANGLE},
|
{VARIANT_ANGLE_OR_ZERO},
|
||||||
{VARIANT_ANGLE, VARIANT_ANGLE},
|
{VARIANT_ANGLE_OR_ZERO, VARIANT_ANGLE_OR_ZERO},
|
||||||
{VARIANT_NUMBER},
|
{VARIANT_NUMBER},
|
||||||
{VARIANT_NUMBER, VARIANT_NUMBER},
|
{VARIANT_NUMBER, VARIANT_NUMBER},
|
||||||
{VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER,
|
{VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER,
|
||||||
|
|
|
@ -120,11 +120,6 @@ struct nsCSSToken {
|
||||||
|
|
||||||
nsCSSToken();
|
nsCSSToken();
|
||||||
|
|
||||||
PRBool IsDimension() {
|
|
||||||
return PRBool((eCSSToken_Dimension == mType) ||
|
|
||||||
((eCSSToken_Number == mType) && (mNumber == 0.0f)));
|
|
||||||
}
|
|
||||||
|
|
||||||
PRBool IsSymbol(PRUnichar aSymbol) {
|
PRBool IsSymbol(PRUnichar aSymbol) {
|
||||||
return PRBool((eCSSToken_Symbol == mType) && (mSymbol == aSymbol));
|
return PRBool((eCSSToken_Symbol == mType) && (mSymbol == aSymbol));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1745,27 +1745,27 @@ var gCSSProperties = {
|
||||||
backend_only: true,
|
backend_only: true,
|
||||||
type: CSS_TYPE_TRUE_SHORTHAND,
|
type: CSS_TYPE_TRUE_SHORTHAND,
|
||||||
subproperties: [ "pause-before", "pause-after" ],
|
subproperties: [ "pause-before", "pause-after" ],
|
||||||
initial_values: [ "0", "0s", "0ms", "0 0", "0s 0ms", "0ms 0" ],
|
initial_values: [ "0s", "0ms", "0s 0ms" ],
|
||||||
other_values: [ "1s", "200ms", "-2s", "50%", "-10%", "10% 200ms", "-3s -5%" ],
|
other_values: [ "1s", "200ms", "-2s", "50%", "-10%", "10% 200ms", "-3s -5%" ],
|
||||||
invalid_values: [ "0px" ]
|
invalid_values: [ "0", "0px", "0 0", "0ms 0" ]
|
||||||
},
|
},
|
||||||
"pause-after": {
|
"pause-after": {
|
||||||
domProp: "pauseAfter",
|
domProp: "pauseAfter",
|
||||||
inherited: false,
|
inherited: false,
|
||||||
backend_only: true,
|
backend_only: true,
|
||||||
type: CSS_TYPE_LONGHAND,
|
type: CSS_TYPE_LONGHAND,
|
||||||
initial_values: [ "0", "0s", "0ms" ],
|
initial_values: [ "0s", "0ms" ],
|
||||||
other_values: [ "1s", "200ms", "-2s", "50%", "-10%" ],
|
other_values: [ "1s", "200ms", "-2s", "50%", "-10%" ],
|
||||||
invalid_values: [ "0px" ]
|
invalid_values: [ "0", "0px" ]
|
||||||
},
|
},
|
||||||
"pause-before": {
|
"pause-before": {
|
||||||
domProp: "pauseBefore",
|
domProp: "pauseBefore",
|
||||||
inherited: false,
|
inherited: false,
|
||||||
backend_only: true,
|
backend_only: true,
|
||||||
type: CSS_TYPE_LONGHAND,
|
type: CSS_TYPE_LONGHAND,
|
||||||
initial_values: [ "0", "0s", "0ms" ],
|
initial_values: [ "0s", "0ms" ],
|
||||||
other_values: [ "1s", "200ms", "-2s", "50%", "-10%" ],
|
other_values: [ "1s", "200ms", "-2s", "50%", "-10%" ],
|
||||||
invalid_values: [ "0px" ]
|
invalid_values: [ "0", "0px" ]
|
||||||
},
|
},
|
||||||
"pitch": {
|
"pitch": {
|
||||||
domProp: "pitch",
|
domProp: "pitch",
|
||||||
|
@ -1972,17 +1972,17 @@ var gCSSProperties = {
|
||||||
domProp: "MozTransitionDelay",
|
domProp: "MozTransitionDelay",
|
||||||
inherited: false,
|
inherited: false,
|
||||||
type: CSS_TYPE_LONGHAND,
|
type: CSS_TYPE_LONGHAND,
|
||||||
initial_values: [ "0", "0s", "0ms" ],
|
initial_values: [ "0s", "0ms" ],
|
||||||
other_values: [ "1s", "250ms", "-100ms", "-1s", "1s, 250ms, 2.3s"],
|
other_values: [ "1s", "250ms", "-100ms", "-1s", "1s, 250ms, 2.3s"],
|
||||||
invalid_values: []
|
invalid_values: [ "0", "0px" ]
|
||||||
},
|
},
|
||||||
"-moz-transition-duration": {
|
"-moz-transition-duration": {
|
||||||
domProp: "MozTransitionDuration",
|
domProp: "MozTransitionDuration",
|
||||||
inherited: false,
|
inherited: false,
|
||||||
type: CSS_TYPE_LONGHAND,
|
type: CSS_TYPE_LONGHAND,
|
||||||
initial_values: [ "0", "0s", "0ms" ],
|
initial_values: [ "0s", "0ms" ],
|
||||||
other_values: [ "1s", "250ms", "-1ms", "-2s", "1s, 250ms, 2.3s"],
|
other_values: [ "1s", "250ms", "-1ms", "-2s", "1s, 250ms, 2.3s"],
|
||||||
invalid_values: []
|
invalid_values: [ "0", "0px" ]
|
||||||
},
|
},
|
||||||
"-moz-transition-property": {
|
"-moz-transition-property": {
|
||||||
domProp: "MozTransitionProperty",
|
domProp: "MozTransitionProperty",
|
||||||
|
|
|
@ -148,17 +148,17 @@ e.setAttribute("style", "-moz-background-clip: border, border, border; -moz-back
|
||||||
is(e.style.background, "", "should not have background shorthand (-moz-background-size too long)");
|
is(e.style.background, "", "should not have background shorthand (-moz-background-size too long)");
|
||||||
|
|
||||||
// Check that we only serialize transition when the lists are the same length.
|
// Check that we only serialize transition when the lists are the same length.
|
||||||
e.setAttribute("style", "-moz-transition-property: color, width; -moz-transition-duration: 1s, 200ms; -moz-transition-timing-function: ease-in, linear; -moz-transition-delay: 0, 1s");
|
e.setAttribute("style", "-moz-transition-property: color, width; -moz-transition-duration: 1s, 200ms; -moz-transition-timing-function: ease-in, linear; -moz-transition-delay: 0s, 1s");
|
||||||
isnot(e.style.MozTransition, "", "should have -moz-transition shorthand (lists same length)");
|
isnot(e.style.MozTransition, "", "should have -moz-transition shorthand (lists same length)");
|
||||||
e.setAttribute("style", "-moz-transition-property: color, width, left; -moz-transition-duration: 1s, 200ms; -moz-transition-timing-function: ease-in, linear; -moz-transition-delay: 0, 1s");
|
e.setAttribute("style", "-moz-transition-property: color, width, left; -moz-transition-duration: 1s, 200ms; -moz-transition-timing-function: ease-in, linear; -moz-transition-delay: 0s, 1s");
|
||||||
is(e.style.MozTransition, "", "should not have -moz-transition shorthand (lists different lengths)");
|
is(e.style.MozTransition, "", "should not have -moz-transition shorthand (lists different lengths)");
|
||||||
e.setAttribute("style", "-moz-transition-property: all; -moz-transition-duration: 1s, 200ms; -moz-transition-timing-function: ease-in, linear; -moz-transition-delay: 0, 1s");
|
e.setAttribute("style", "-moz-transition-property: all; -moz-transition-duration: 1s, 200ms; -moz-transition-timing-function: ease-in, linear; -moz-transition-delay: 0s, 1s");
|
||||||
is(e.style.MozTransition, "", "should not have -moz-transition shorthand (lists different lengths)");
|
is(e.style.MozTransition, "", "should not have -moz-transition shorthand (lists different lengths)");
|
||||||
e.setAttribute("style", "-moz-transition-property: color, width; -moz-transition-duration: 1s, 200ms, 300ms; -moz-transition-timing-function: ease-in, linear; -moz-transition-delay: 0, 1s");
|
e.setAttribute("style", "-moz-transition-property: color, width; -moz-transition-duration: 1s, 200ms, 300ms; -moz-transition-timing-function: ease-in, linear; -moz-transition-delay: 0s, 1s");
|
||||||
is(e.style.MozTransition, "", "should not have -moz-transition shorthand (lists different lengths)");
|
is(e.style.MozTransition, "", "should not have -moz-transition shorthand (lists different lengths)");
|
||||||
e.setAttribute("style", "-moz-transition-property: color, width; -moz-transition-duration: 1s, 200ms; -moz-transition-timing-function: ease-in, linear, ease-out; -moz-transition-delay: 0, 1s");
|
e.setAttribute("style", "-moz-transition-property: color, width; -moz-transition-duration: 1s, 200ms; -moz-transition-timing-function: ease-in, linear, ease-out; -moz-transition-delay: 0s, 1s");
|
||||||
is(e.style.MozTransition, "", "should not have -moz-transition shorthand (lists different lengths)");
|
is(e.style.MozTransition, "", "should not have -moz-transition shorthand (lists different lengths)");
|
||||||
e.setAttribute("style", "-moz-transition-property: color, width; -moz-transition-duration: 1s, 200ms; -moz-transition-timing-function: ease-in, linear; -moz-transition-delay: 0, 1s, 0");
|
e.setAttribute("style", "-moz-transition-property: color, width; -moz-transition-duration: 1s, 200ms; -moz-transition-timing-function: ease-in, linear; -moz-transition-delay: 0s, 1s, 0s");
|
||||||
is(e.style.MozTransition, "", "should not have -moz-transition shorthand (lists different lengths)");
|
is(e.style.MozTransition, "", "should not have -moz-transition shorthand (lists different lengths)");
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ var values = {
|
||||||
[
|
[
|
||||||
{ lone: true, specified: "-moz-initial" },
|
{ lone: true, specified: "-moz-initial" },
|
||||||
{ lone: false, specified: "2s" },
|
{ lone: false, specified: "2s" },
|
||||||
{ lone: false, specified: "0" },
|
{ lone: false, specified: "0s" },
|
||||||
{ lone: false, specified: "430ms" },
|
{ lone: false, specified: "430ms" },
|
||||||
{ lone: false, specified: "-1s" },
|
{ lone: false, specified: "-1s" },
|
||||||
],
|
],
|
||||||
|
@ -70,7 +70,7 @@ var values = {
|
||||||
[
|
[
|
||||||
{ lone: true, specified: "-moz-initial" },
|
{ lone: true, specified: "-moz-initial" },
|
||||||
{ lone: false, specified: "2s" },
|
{ lone: false, specified: "2s" },
|
||||||
{ lone: false, specified: "0" },
|
{ lone: false, specified: "0s" },
|
||||||
{ lone: false, specified: "430ms" },
|
{ lone: false, specified: "430ms" },
|
||||||
{ lone: false, specified: "-1s" },
|
{ lone: false, specified: "-1s" },
|
||||||
],
|
],
|
||||||
|
|
Загрузка…
Ссылка в новой задаче