Bug 526402: Stop accepting unitless 0 for angles, times, and frequencies. r=zwol

This commit is contained in:
L. David Baron 2009-11-04 18:36:18 -08:00
Родитель b6aed71369
Коммит 43155b03e4
5 изменённых файлов: 35 добавлений и 38 удалений

Просмотреть файл

@ -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" },
], ],