CSS Exclusions polygon shape arguments should be comma separated
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Apr 2012 01:18:10 +0000 (01:18 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Apr 2012 01:18:10 +0000 (01:18 +0000)
https://bugs.webkit.org/show_bug.cgi?id=82368

Patch by Hans Muller <hmuller@adobe.com> on 2012-04-05
Reviewed by Ryosuke Niwa.

Source/WebCore:

Changed the CSS Parser to accept a conventional comma separated argument list for the
polygon exclusion shape. The syntax had used spaces to separate x,y coordinates, like:
polygon(10px,20px 30px,40px).  Now commas separate points: polygon(10px 20px, 30px 40px).
This change is per the draft exclusions spec, http://dev.w3.org/csswg/css3-exclusions.
Additional relevant information about CSS argument list syntax can be found
here: http://dev.w3.org/csswg/css3-values/#component-whitespace.

Factored comma recognition idiom in CSSParser.cpp into isComma() utility function.

The existing tests have been updated.

* css/CSSParser.cpp:
(WebCore::isComma)
(WebCore::CSSParser::parseFillPosition)
(WebCore::CSSParser::parseFillRepeat)
(WebCore::CSSParser::parseFillProperty)
(WebCore::CSSParser::parseCubicBezierTimingFunctionValue)
(WebCore::CSSParser::parseAnimationTimingFunction)
(WebCore::CSSParser::parseAnimationProperty)
(WebCore::CSSParser::parseExclusionShapePolygon)
(WebCore::CSSParser::parseDeprecatedGradient)
(WebCore::CSSParser::parseRadialGradient)
(WebCore::CSSParser::parseGradientColorStops)
(WebCore::CSSParser::parseImageSet)
(WebCore::filterInfoForName)
(WebCore::CSSParser::parseCustomFilter)
(WebCore::CSSParser::parseFontFeatureSettings)

* css/CSSWrapShapes.cpp:
(WebCore::CSSWrapShapePolygon::cssText):

LayoutTests:

Updated the tests to match the polygon syntax defined by the draft exclusions
spec - http://dev.w3.org/csswg/css3-exclusions.

* fast/exclusions/parsing-wrap-shape-inside-expected.txt:
* fast/exclusions/parsing-wrap-shape-outside-expected.txt:
* fast/exclusions/script-tests/parsing-wrap-shape-inside.js:
* fast/exclusions/script-tests/parsing-wrap-shape-outside.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@113400 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/exclusions/parsing-wrap-shape-inside-expected.txt
LayoutTests/fast/exclusions/parsing-wrap-shape-outside-expected.txt
LayoutTests/fast/exclusions/script-tests/parsing-wrap-shape-inside.js
LayoutTests/fast/exclusions/script-tests/parsing-wrap-shape-outside.js
Source/WebCore/ChangeLog
Source/WebCore/css/CSSParser.cpp
Source/WebCore/css/CSSWrapShapes.cpp

index 7b407a33baee962c0411d7d98c58d68c80839008..9e8daa62fba190e816a734c5da7d82e0d65e795c 100644 (file)
@@ -1,3 +1,18 @@
+2012-04-05  Hans Muller  <hmuller@adobe.com>
+
+        CSS Exclusions polygon shape arguments should be comma separated
+        https://bugs.webkit.org/show_bug.cgi?id=82368
+
+        Reviewed by Ryosuke Niwa.
+
+        Updated the tests to match the polygon syntax defined by the draft exclusions
+        spec - http://dev.w3.org/csswg/css3-exclusions.
+
+        * fast/exclusions/parsing-wrap-shape-inside-expected.txt:
+        * fast/exclusions/parsing-wrap-shape-outside-expected.txt:
+        * fast/exclusions/script-tests/parsing-wrap-shape-inside.js:
+        * fast/exclusions/script-tests/parsing-wrap-shape-outside.js:
+
 2012-04-05  Ami Fischman  <fischman@chromium.org>
 
         http/tests/media/media-can-load-when-hidden.html doesn't need to be an HTTP test, and is racy
index 720a2a478f6217fc2347351258447dba32d9405c..7c42ec53e3f929fe91edddaffe3c2d1c11077569 100644 (file)
@@ -15,12 +15,12 @@ PASS testCSSText("circle(10px, 20px, 30px)") is "circle(10px, 20px, 30px)"
 PASS testComputedStyle("circle(10px, 20px, 30px)") is "circle(10px, 20px, 30px)"
 PASS testCSSText("ellipse(10px, 20px, 30px, 40px)") is "ellipse(10px, 20px, 30px, 40px)"
 PASS testComputedStyle("ellipse(10px, 20px, 30px, 40px)") is "ellipse(10px, 20px, 30px, 40px)"
-PASS testCSSText("polygon(10px, 20px 30px, 40px 40px, 50px)") is "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)"
-PASS testComputedStyle("polygon(10px, 20px 30px, 40px 40px, 50px)") is "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)"
-PASS testCSSText("polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)") is "polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)"
-PASS testComputedStyle("polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)") is "polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)"
-PASS testCSSText("polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)") is "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)"
-PASS testComputedStyle("polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)") is "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)"
+PASS testCSSText("polygon(10px 20px, 30px 40px, 40px 50px)") is "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)"
+PASS testComputedStyle("polygon(10px 20px, 30px 40px, 40px 50px)") is "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)"
+PASS testCSSText("polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)") is "polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)"
+PASS testComputedStyle("polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)") is "polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)"
+PASS testCSSText("polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)") is "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)"
+PASS testComputedStyle("polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)") is "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)"
 PASS testNotInherited("auto", "rectangle(10px, 20px, 30px, 40px)") is "parent: auto, child: rectangle(10px, 20px, 30px, 40px)"
 PASS testNotInherited("rectangle(10px, 20px, 30px, 40px)", "initial") is "parent: rectangle(10px, 20px, 30px, 40px), child: auto"
 PASS testNotInherited("rectangle(10px, 20px, 30px, 40px)", "") is "parent: rectangle(10px, 20px, 30px, 40px), child: auto"
@@ -65,10 +65,10 @@ PASS testCSSText("ellipse(10px 20px 30px 40px)") is ""
 PASS testComputedStyle("ellipse(10px 20px 30px 40px)") is "auto"
 PASS testCSSText("polygon()") is ""
 PASS testComputedStyle("polygon()") is "auto"
-PASS testCSSText("polygon(evenodd 10px, 20px 30px, 40px 40px, 50px)") is ""
-PASS testComputedStyle("polygon(evenodd 10px, 20px 30px, 40px 40px, 50px)") is "auto"
-PASS testCSSText("polygon(nonzero 10px, 20px 30px, 40px 40px, 50px)") is ""
-PASS testComputedStyle("polygon(nonzero 10px, 20px 30px, 40px 40px, 50px)") is "auto"
+PASS testCSSText("polygon(evenodd 10px 20px, 30px 40px, 40px 50px)") is ""
+PASS testComputedStyle("polygon(evenodd 10px 20px, 30px 40px, 40px 50px)") is "auto"
+PASS testCSSText("polygon(nonzero 10px 20px, 30px 40px, 40px 50px)") is ""
+PASS testComputedStyle("polygon(nonzero 10px 20px, 30px 40px, 40px 50px)") is "auto"
 PASS testCSSText("polygon(nonzero)") is ""
 PASS testComputedStyle("polygon(nonzero)") is "auto"
 PASS testCSSText("polygon(evenodd)") is ""
index 76f51b7f95681fd8c1ee14a90e66e0f091cf5dc2..301a5d9690b4e31bf00e6892acf5de5eaa397bbc 100644 (file)
@@ -15,12 +15,12 @@ PASS testCSSText("circle(10px, 20px, 30px)") is "circle(10px, 20px, 30px)"
 PASS testComputedStyle("circle(10px, 20px, 30px)") is "circle(10px, 20px, 30px)"
 PASS testCSSText("ellipse(10px, 20px, 30px, 40px)") is "ellipse(10px, 20px, 30px, 40px)"
 PASS testComputedStyle("ellipse(10px, 20px, 30px, 40px)") is "ellipse(10px, 20px, 30px, 40px)"
-PASS testCSSText("polygon(10px, 20px 30px, 40px 40px, 50px)") is "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)"
-PASS testComputedStyle("polygon(10px, 20px 30px, 40px 40px, 50px)") is "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)"
-PASS testCSSText("polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)") is "polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)"
-PASS testComputedStyle("polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)") is "polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)"
-PASS testCSSText("polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)") is "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)"
-PASS testComputedStyle("polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)") is "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)"
+PASS testCSSText("polygon(10px 20px, 30px 40px, 40px 50px)") is "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)"
+PASS testComputedStyle("polygon(10px 20px, 30px 40px, 40px 50px)") is "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)"
+PASS testCSSText("polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)") is "polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)"
+PASS testComputedStyle("polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)") is "polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)"
+PASS testCSSText("polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)") is "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)"
+PASS testComputedStyle("polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)") is "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)"
 PASS testNotInherited("auto", "rectangle(10px, 20px, 30px, 40px)") is "parent: auto, child: rectangle(10px, 20px, 30px, 40px)"
 PASS testNotInherited("rectangle(10px, 20px, 30px, 40px)", "initial") is "parent: rectangle(10px, 20px, 30px, 40px), child: auto"
 PASS testNotInherited("rectangle(10px, 20px, 30px, 40px)", "") is "parent: rectangle(10px, 20px, 30px, 40px), child: auto"
@@ -65,10 +65,10 @@ PASS testCSSText("ellipse(10px 20px 30px 40px)") is ""
 PASS testComputedStyle("ellipse(10px 20px 30px 40px)") is "auto"
 PASS testCSSText("polygon()") is ""
 PASS testComputedStyle("polygon()") is "auto"
-PASS testCSSText("polygon(evenodd 10px, 20px 30px, 40px 40px, 50px)") is ""
-PASS testComputedStyle("polygon(evenodd 10px, 20px 30px, 40px 40px, 50px)") is "auto"
-PASS testCSSText("polygon(nonzero 10px, 20px 30px, 40px 40px, 50px)") is ""
-PASS testComputedStyle("polygon(nonzero 10px, 20px 30px, 40px 40px, 50px)") is "auto"
+PASS testCSSText("polygon(evenodd 10px 20px, 30px 40px, 40px 50px)") is ""
+PASS testComputedStyle("polygon(evenodd 10px 20px, 30px 40px, 40px 50px)") is "auto"
+PASS testCSSText("polygon(nonzero 10px 20px, 30px 40px, 40px 50px)") is ""
+PASS testComputedStyle("polygon(nonzero 10px 20px, 30px 40px, 40px 50px)") is "auto"
 PASS testCSSText("polygon(nonzero)") is ""
 PASS testComputedStyle("polygon(nonzero)") is "auto"
 PASS testCSSText("polygon(evenodd)") is ""
index 2e771f60185f0318f682740e8fe7eaa4a5258017..eb2a6dbcd618925eb8db8d7dc7aa09cac2121e60 100644 (file)
@@ -63,9 +63,9 @@ test("circle(10px, 20px, 30px)", "circle(10px, 20px, 30px)");
 
 test("ellipse(10px, 20px, 30px, 40px)", "ellipse(10px, 20px, 30px, 40px)");
 
-test("polygon(10px, 20px 30px, 40px 40px, 50px)", "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)");
-test("polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)", "polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)");
-test("polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)", "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)");
+test("polygon(10px 20px, 30px 40px, 40px 50px)", "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)");
+test("polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)", "polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)");
+test("polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)", "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)");
 
 shouldBeEqualToString('testNotInherited("auto", "rectangle(10px, 20px, 30px, 40px)")', "parent: auto, child: rectangle(10px, 20px, 30px, 40px)");
 shouldBeEqualToString('testNotInherited("rectangle(10px, 20px, 30px, 40px)", "initial")', "parent: rectangle(10px, 20px, 30px, 40px), child: auto");
@@ -99,8 +99,8 @@ negative_test("ellipse(10px, 20px, 30px)");
 negative_test("ellipse(10px 20px 30px 40px)");
 
 negative_test("polygon()");
-negative_test("polygon(evenodd 10px, 20px 30px, 40px 40px, 50px)");
-negative_test("polygon(nonzero 10px, 20px 30px, 40px 40px, 50px)");
+negative_test("polygon(evenodd 10px 20px, 30px 40px, 40px 50px)");
+negative_test("polygon(nonzero 10px 20px, 30px 40px, 40px 50px)");
 negative_test("polygon(nonzero)");
 negative_test("polygon(evenodd)");
 negative_test("polygon(10px)");
index 70a2812eb39bd9368aa775da8b10d6d70524e36d..398da320a9758f72760889b95f98e243638e20e5 100644 (file)
@@ -63,9 +63,9 @@ test("circle(10px, 20px, 30px)", "circle(10px, 20px, 30px)");
 
 test("ellipse(10px, 20px, 30px, 40px)", "ellipse(10px, 20px, 30px, 40px)");
 
-test("polygon(10px, 20px 30px, 40px 40px, 50px)", "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)");
-test("polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)", "polygon(evenodd, 10px, 20px 30px, 40px 40px, 50px)");
-test("polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)", "polygon(nonzero, 10px, 20px 30px, 40px 40px, 50px)");
+test("polygon(10px 20px, 30px 40px, 40px 50px)", "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)");
+test("polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)", "polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)");
+test("polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)", "polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)");
 
 shouldBeEqualToString('testNotInherited("auto", "rectangle(10px, 20px, 30px, 40px)")', "parent: auto, child: rectangle(10px, 20px, 30px, 40px)");
 shouldBeEqualToString('testNotInherited("rectangle(10px, 20px, 30px, 40px)", "initial")', "parent: rectangle(10px, 20px, 30px, 40px), child: auto");
@@ -99,8 +99,8 @@ negative_test("ellipse(10px, 20px, 30px)");
 negative_test("ellipse(10px 20px 30px 40px)");
 
 negative_test("polygon()");
-negative_test("polygon(evenodd 10px, 20px 30px, 40px 40px, 50px)");
-negative_test("polygon(nonzero 10px, 20px 30px, 40px 40px, 50px)");
+negative_test("polygon(evenodd 10px 20px, 30px 40px, 40px 50px)");
+negative_test("polygon(nonzero 10px 20px, 30px 40px, 40px 50px)");
 negative_test("polygon(nonzero)");
 negative_test("polygon(evenodd)");
 negative_test("polygon(10px)");
index 2cbfd492ea9c8d415671aaff9b78328c9b2d0085..db3b9f1faeceb4d060a450d24a403209c3e2921a 100644 (file)
@@ -1,3 +1,41 @@
+2012-04-05  Hans Muller  <hmuller@adobe.com>
+
+        CSS Exclusions polygon shape arguments should be comma separated
+        https://bugs.webkit.org/show_bug.cgi?id=82368
+
+        Reviewed by Ryosuke Niwa.
+
+        Changed the CSS Parser to accept a conventional comma separated argument list for the
+        polygon exclusion shape. The syntax had used spaces to separate x,y coordinates, like:
+        polygon(10px,20px 30px,40px).  Now commas separate points: polygon(10px 20px, 30px 40px).
+        This change is per the draft exclusions spec, http://dev.w3.org/csswg/css3-exclusions.
+        Additional relevant information about CSS argument list syntax can be found
+        here: http://dev.w3.org/csswg/css3-values/#component-whitespace.
+
+        Factored comma recognition idiom in CSSParser.cpp into isComma() utility function.
+
+        The existing tests have been updated.
+
+        * css/CSSParser.cpp:
+        (WebCore::isComma)
+        (WebCore::CSSParser::parseFillPosition)
+        (WebCore::CSSParser::parseFillRepeat)
+        (WebCore::CSSParser::parseFillProperty)
+        (WebCore::CSSParser::parseCubicBezierTimingFunctionValue)
+        (WebCore::CSSParser::parseAnimationTimingFunction)
+        (WebCore::CSSParser::parseAnimationProperty)
+        (WebCore::CSSParser::parseExclusionShapePolygon)
+        (WebCore::CSSParser::parseDeprecatedGradient)
+        (WebCore::CSSParser::parseRadialGradient)
+        (WebCore::CSSParser::parseGradientColorStops)
+        (WebCore::CSSParser::parseImageSet)
+        (WebCore::filterInfoForName)
+        (WebCore::CSSParser::parseCustomFilter)
+        (WebCore::CSSParser::parseFontFeatureSettings)
+
+        * css/CSSWrapShapes.cpp:
+        (WebCore::CSSWrapShapePolygon::cssText):
+
 2012-04-05  Joshua Bell  <jsbell@chromium.org>
 
         IndexedDB: Support string.length in keyPaths
index 405b0558103bc3341dc8ffab98fd4e0cac97e419..7ac39d625e94ac5433558dfa7507633db5d82609 100644 (file)
@@ -1307,6 +1307,12 @@ static int unitFromString(CSSParserValue* value)
     return 0;
 }
 
+static inline bool isComma(CSSParserValue* value)
+{ 
+    return value && value->unit == CSSParserValue::Operator && value->iValue == ','; 
+}
+
+
 void CSSParser::checkForOrphanedUnits()
 {
     if (inStrictMode() || inShorthand())
@@ -3262,7 +3268,7 @@ void CSSParser::parseFillPosition(CSSParserValueList* valueList, RefPtr<CSSValue
     value = valueList->next();
 
     // First check for the comma.  If so, we are finished parsing this value or value pair.
-    if (value && value->unit == CSSParserValue::Operator && value->iValue == ',')
+    if (isComma(value))
         value = 0;
 
     if (value) {
@@ -3317,7 +3323,7 @@ void CSSParser::parseFillRepeat(RefPtr<CSSValue>& value1, RefPtr<CSSValue>& valu
     value = m_valueList->next();
 
     // First check for the comma.  If so, we are finished parsing this value or value pair.
-    if (value && value->unit == CSSParserValue::Operator && value->iValue == ',')
+    if (isComma(value))
         value = 0;
 
     if (value)
@@ -3405,7 +3411,7 @@ bool CSSParser::parseFillProperty(CSSPropertyID propId, CSSPropertyID& propId1,
         RefPtr<CSSValue> currValue2;
 
         if (allowComma) {
-            if (val->unit != CSSParserValue::Operator || val->iValue != ',')
+            if (!isComma(val))
                 return false;
             m_valueList->next();
             allowComma = false;
@@ -3644,7 +3650,7 @@ bool CSSParser::parseCubicBezierTimingFunctionValue(CSSParserValueList*& args, d
     if (!v)
         // The last number in the function has no comma after it, so we're done.
         return true;
-    if (v->unit != CSSParserValue::Operator && v->iValue != ',')
+    if (!isComma(v))
         return false;
     v = args->next();
     return true;
@@ -3682,7 +3688,7 @@ PassRefPtr<CSSValue> CSSParser::parseAnimationTimingFunction()
 
         if (v) {
             // There is a comma so we need to parse the second value
-            if (v->unit != CSSParserValue::Operator && v->iValue != ',')
+            if (!isComma(v))
                 return 0;
             v = args->next();
             if (v->id != CSSValueStart && v->id != CSSValueEnd)
@@ -3728,7 +3734,7 @@ bool CSSParser::parseAnimationProperty(CSSPropertyID propId, RefPtr<CSSValue>& r
     while ((val = m_valueList->current())) {
         RefPtr<CSSValue> currValue;
         if (allowComma) {
-            if (val->unit != CSSParserValue::Operator || val->iValue != ',')
+            if (!isComma(val))
                 return false;
             m_valueList->next();
             allowComma = false;
@@ -4249,16 +4255,15 @@ PassRefPtr<CSSWrapShape> CSSParser::parseExclusionShapePolygon(CSSParserValueLis
     if (argument->id == CSSValueEvenodd || argument->id == CSSValueNonzero) {
         shape->setWindRule(argument->id == CSSValueEvenodd ? RULE_EVENODD : RULE_NONZERO);
 
-        CSSParserValue* comma = args->next();
-        if (!comma || comma->unit != CSSParserValue::Operator || comma->iValue != ',')
+        if (!isComma(args->next()))
             return 0;
 
         argument = args->next();
         size -= 2;
     }
 
-    // <length>, <length> ... <length>, <length> -> each pair has 3 elements
-    if (!size || (size % 3))
+    // <length> <length>, ... <length> <length> -> each pair has 3 elements except the last one
+    if (!size || (size % 3) - 2)
         return 0;
 
     CSSParserValue* argumentX = argument;
@@ -4266,10 +4271,6 @@ PassRefPtr<CSSWrapShape> CSSParser::parseExclusionShapePolygon(CSSParserValueLis
         if (!validUnit(argumentX, FLength))
             return 0;
 
-        CSSParserValue* comma = args->next();
-        if (!comma || comma->unit != CSSParserValue::Operator || comma->iValue != ',')
-            return 0;
-
         CSSParserValue* argumentY = args->next();
         if (!argumentY || !validUnit(argumentY, FLength))
             return 0;
@@ -4279,7 +4280,13 @@ PassRefPtr<CSSWrapShape> CSSParser::parseExclusionShapePolygon(CSSParserValueLis
 
         shape->appendPoint(xLength.release(), yLength.release());
 
-        argumentX = args->next();
+        CSSParserValue* commaOrNull = args->next();
+        if (!commaOrNull)
+            argumentX = 0;
+        else if (!isComma(commaOrNull)) 
+            return 0;
+        else 
+            argumentX = args->next();
     }
 
     return shape;
@@ -6266,7 +6273,7 @@ bool CSSParser::parseDeprecatedGradient(CSSParserValueList* valueList, RefPtr<CS
 
     // Comma.
     a = args->next();
-    if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
+    if (!isComma(a))
         return false;
 
     // Next comes the starting point for the gradient as an x y pair.  There is no
@@ -6291,7 +6298,7 @@ bool CSSParser::parseDeprecatedGradient(CSSParserValueList* valueList, RefPtr<CS
 
     // Comma after the first point.
     a = args->next();
-    if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
+    if (!isComma(a))
         return false;
 
     // For radial gradients only, we now expect a numeric radius.
@@ -6303,7 +6310,7 @@ bool CSSParser::parseDeprecatedGradient(CSSParserValueList* valueList, RefPtr<CS
 
         // Comma after the first radius.
         a = args->next();
-        if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
+        if (!isComma(a))
             return false;
     }
 
@@ -6330,7 +6337,7 @@ bool CSSParser::parseDeprecatedGradient(CSSParserValueList* valueList, RefPtr<CS
     if (gradientType == CSSRadialGradient) {
         // Comma after the second point.
         a = args->next();
-        if (!a || a->unit != CSSParserValue::Operator || a->iValue != ',')
+        if (!isComma(a))
             return false;
 
         a = args->next();
@@ -6343,7 +6350,7 @@ bool CSSParser::parseDeprecatedGradient(CSSParserValueList* valueList, RefPtr<CS
     a = args->next();
     while (a) {
         // Look for the comma before the next stop.
-        if (a->unit != CSSParserValue::Operator || a->iValue != ',')
+        if (!isComma(a))
             return false;
 
         // Now examine the stop itself.
@@ -6490,7 +6497,7 @@ bool CSSParser::parseRadialGradient(CSSParserValueList* valueList, RefPtr<CSSVal
 
     if (centerX || centerY) {
         // Comma
-        if (a->unit != CSSParserValue::Operator || a->iValue != ',')
+        if (!isComma(a))
             return false;
 
         a = args->next();
@@ -6591,7 +6598,7 @@ bool CSSParser::parseGradientColorStops(CSSParserValueList* valueList, CSSGradie
     while (a) {
         // Look for the comma before the next stop.
         if (expectComma) {
-            if (a->unit != CSSParserValue::Operator || a->iValue != ',')
+            if (!isComma(a))
                 return false;
 
             a = valueList->next();
@@ -6684,7 +6691,7 @@ bool CSSParser::parseCrossfade(CSSParserValueList* valueList, RefPtr<CSSValue>&
     a = args->next();
 
     // Skip a comma
-    if (a->unit != CSSParserValue::Operator || a->iValue != ',')
+    if (!isComma(a))
         return false;
     a = args->next();
 
@@ -6694,7 +6701,7 @@ bool CSSParser::parseCrossfade(CSSParserValueList* valueList, RefPtr<CSSValue>&
     a = args->next();
 
     // Skip a comma
-    if (a->unit != CSSParserValue::Operator || a->iValue != ',')
+    if (!isComma(a))
         return false;
     a = args->next();
 
@@ -6774,7 +6781,7 @@ PassRefPtr<CSSValue> CSSParser::parseImageSet(CSSParserValueList* valueList)
             break;
 
         // If there are more arguments, they should be after a comma.
-        if (arg->unit != CSSParserValue::Operator || arg->iValue != ',')
+        if (!isComma(arg))
             return 0;
 
         // Skip the comma and move on to the next argument.
@@ -6986,7 +6993,7 @@ static void filterInfoForName(const CSSParserString& name, WebKitCSSFilterValue:
 static bool acceptCommaOperator(CSSParserValueList* argsList)
 {
     if (CSSParserValue* arg = argsList->current()) {
-        if (arg->unit != CSSParserValue::Operator || arg->iValue != ',')
+        if (!isComma(arg))
             return false;
         argsList->next();
     }
@@ -7105,7 +7112,7 @@ PassRefPtr<WebKitCSSFilterValue> CSSParser::parseCustomFilter(CSSParserValue* va
         RefPtr<CSSValueList> paramValueList = CSSValueList::createSpaceSeparated();
         while ((arg = argsList->current())) {
             // If we hit a comma it means we finished this parameter's values.
-            if (arg->unit == CSSParserValue::Operator && arg->iValue == ',')
+            if (isComma(arg))
                 break;
             if (!validUnit(arg, FNumber, CSSStrictMode))
                 return 0;
@@ -7607,7 +7614,7 @@ bool CSSParser::parseFontFeatureSettings(bool important)
 
         // If the list isn't parsed fully, the current value should be comma.
         value = m_valueList->current();
-        if (value && !(value->unit == CSSParserValue::Operator && value->iValue == ','))
+        if (value && !isComma(value))
             return false;
     }
     if (settings->length()) {
index 06def3563e76cdffe322708386ed9b277aa221d7..49eb3b88c0d96e4f0c4f162c7cb9212142c9c1b1 100644 (file)
@@ -122,6 +122,7 @@ String CSSWrapShapePolygon::cssText() const
     DEFINE_STATIC_LOCAL(const String, polygonParenEvenOdd, ("polygon(evenodd, "));
     DEFINE_STATIC_LOCAL(const String, polygonParenNonZero, ("polygon(nonzero, "));
     DEFINE_STATIC_LOCAL(const String, comma, (", "));
+    DEFINE_STATIC_LOCAL(const String, space, (" "));
 
     StringBuilder result;
     result.reserveCapacity(32);
@@ -134,9 +135,9 @@ String CSSWrapShapePolygon::cssText() const
 
     for (unsigned i = 0; i < m_values.size(); i += 2) {
         if (i)
-            result.append(' ');
+            result.append(comma);
         result.append(m_values.at(i)->cssText());
-        result.append(comma);
+        result.append(space);
         result.append(m_values.at(i + 1)->cssText());
     }