From f88364d08c8bdbaddd38bee7d421a761ec6fce5e Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Wed, 11 Aug 2010 12:32:52 -0700 Subject: [PATCH] Fix places where we should skip to a closing parenthesis during errors parsing functions. (Bug 575672) r=bzbarsky a2.0=blocking2.0+ --- layout/style/nsCSSParser.cpp | 21 ++- layout/style/test/Makefile.in | 1 + layout/style/test/property_database.js | 5 +- .../style/test/test_unclosed_parentheses.html | 158 ++++++++++++++++++ 4 files changed, 180 insertions(+), 5 deletions(-) create mode 100644 layout/style/test/test_unclosed_parentheses.html diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index c523e51d0c98..86a2cef607ef 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -1309,6 +1309,7 @@ CSSParserImpl::GetURLInParens(nsString& aURL) NS_ASSERTION(!mHavePushBack, "mustn't have pushback at this point"); do { if (! mScanner.NextURL(mToken)) { + // EOF return PR_FALSE; } } while (eCSSToken_WhiteSpace == mToken.mType); @@ -3615,7 +3616,8 @@ CSSParserImpl::ParseColor(nsCSSValue& aValue) aValue.SetColorValue(NS_RGB(r,g,b)); return PR_TRUE; } - return PR_FALSE; // already pushed back + SkipUntil(')'); + return PR_FALSE; } else if (mToken.mIdent.LowerCaseEqualsLiteral("-moz-rgba") || mToken.mIdent.LowerCaseEqualsLiteral("rgba")) { @@ -3629,7 +3631,8 @@ CSSParserImpl::ParseColor(nsCSSValue& aValue) aValue.SetColorValue(NS_RGBA(r, g, b, a)); return PR_TRUE; } - return PR_FALSE; // already pushed back + SkipUntil(')'); + return PR_FALSE; } else if (mToken.mIdent.LowerCaseEqualsLiteral("hsl")) { // hsl ( hue , saturation , lightness ) @@ -3638,6 +3641,7 @@ CSSParserImpl::ParseColor(nsCSSValue& aValue) aValue.SetColorValue(rgba); return PR_TRUE; } + SkipUntil(')'); return PR_FALSE; } else if (mToken.mIdent.LowerCaseEqualsLiteral("-moz-hsla") || @@ -3652,6 +3656,7 @@ CSSParserImpl::ParseColor(nsCSSValue& aValue) NS_GET_B(rgba), a)); return PR_TRUE; } + SkipUntil(')'); return PR_FALSE; } break; @@ -4474,12 +4479,20 @@ CSSParserImpl::ParseVariant(nsCSSValue& aValue, if (((aVariantMask & VARIANT_ATTR) != 0) && (eCSSToken_Function == tk->mType) && tk->mIdent.LowerCaseEqualsLiteral("attr")) { - return ParseAttr(aValue); + if (!ParseAttr(aValue)) { + SkipUntil(')'); + return PR_FALSE; + } + return PR_TRUE; } if (((aVariantMask & VARIANT_CUBIC_BEZIER) != 0) && (eCSSToken_Function == tk->mType)) { if (tk->mIdent.LowerCaseEqualsLiteral("cubic-bezier")) { - return ParseTransitionTimingFunctionValues(aValue); + if (!ParseTransitionTimingFunctionValues(aValue)) { + SkipUntil(')'); + return PR_FALSE; + } + return PR_TRUE; } } if ((aVariantMask & VARIANT_CALC) && diff --git a/layout/style/test/Makefile.in b/layout/style/test/Makefile.in index 473cf3667f17..ff57722c8abd 100644 --- a/layout/style/test/Makefile.in +++ b/layout/style/test/Makefile.in @@ -175,6 +175,7 @@ _TEST_FILES = test_acid3_test46.html \ test_transitions_per_property.html \ test_transitions_dynamic_changes.html \ test_transitions_bug537151.html \ + test_unclosed_parentheses.html \ test_units_angle.html \ test_units_frequency.html \ test_units_length.html \ diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js index 01dae2aae8ba..959d1c3b89ff 100644 --- a/layout/style/test/property_database.js +++ b/layout/style/test/property_database.js @@ -1031,7 +1031,10 @@ var gCSSProperties = { "-moz-repeating-radial-gradient(top left 99deg, cover, red, blue)", "-moz-repeating-radial-gradient(15% 20% -1.2345rad, circle, red, blue)", "-moz-repeating-radial-gradient(45px 399grad, ellipse closest-corner, red, blue)", - "-moz-repeating-radial-gradient(45px 399grad, farthest-side circle, red, blue)" + "-moz-repeating-radial-gradient(45px 399grad, farthest-side circle, red, blue)", + "-moz-image-rect(url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), 2, 10, 10, 2)", + "-moz-image-rect(url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), 10%, 50%, 30%, 0%)", + "-moz-image-rect(url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), 10, 50%, 30%, 0)", ], invalid_values: [ /* Old syntax */ diff --git a/layout/style/test/test_unclosed_parentheses.html b/layout/style/test/test_unclosed_parentheses.html new file mode 100644 index 000000000000..891d99f23ad5 --- /dev/null +++ b/layout/style/test/test_unclosed_parentheses.html @@ -0,0 +1,158 @@ + + + + + Test for Bug 575672 + + + + + + + +Mozilla Bug 575672 +

+ +
+
+
+ +