Fix the parsing and re-serialization of :lang pseudo class selector when it has multi...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Nov 2014 05:26:27 +0000 (05:26 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Nov 2014 05:26:27 +0000 (05:26 +0000)
https://bugs.webkit.org/show_bug.cgi?id=139013

Patch by Dhi Aurrahman <diorahman@rockybars.com> on 2014-11-24
Reviewed by Benjamin Poulain.

Source/WebCore:

Fix the parsing and re-serialization of :lang pseudo class selector when
it has multiple arguments with same value e.g. :lang(en, en, en). Previously,
given :lang(en, en, en) selector, it was parsed and reserialized
as :lang(enenen) instead of :lang(en, en, en)

Related test on parsing and re-serialization of css selectors is updated.

* css/CSSSelector.cpp:
(WebCore::appendArgumentList):

LayoutTests:

Updated tests to verify the parsing and serialization of :lang pseudo class
selector when it has multiple arguments with same value.

* fast/css/css-selector-text-expected.txt: Updated to cover fix.
* fast/css/css-selector-text.html: Updated to cover fix.

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

LayoutTests/ChangeLog
LayoutTests/fast/css/css-selector-text-expected.txt
LayoutTests/fast/css/css-selector-text.html
Source/WebCore/ChangeLog
Source/WebCore/css/CSSSelector.cpp

index 5d0563e..c0c2308 100644 (file)
@@ -1,3 +1,16 @@
+2014-11-24  Dhi Aurrahman  <diorahman@rockybars.com>
+
+        Fix the parsing and re-serialization of :lang pseudo class selector when it has multiple arguments with same value
+        https://bugs.webkit.org/show_bug.cgi?id=139013
+
+        Reviewed by Benjamin Poulain.
+
+        Updated tests to verify the parsing and serialization of :lang pseudo class
+        selector when it has multiple arguments with same value.
+
+        * fast/css/css-selector-text-expected.txt: Updated to cover fix.
+        * fast/css/css-selector-text.html: Updated to cover fix.
+
 2014-11-24  Antti Koivisto  <antti@apple.com>
 
         Avoid String concatenation with line break iterator
index 1e3ebd7..c36d962 100644 (file)
@@ -55,6 +55,13 @@ PASS parseThenSerializeRule(':lang(de-DE, de-DE-1996, de-Latn-DE, de-Latf-DE, de
 PASS parseThenSerializeRule(':lang(de-CH, it-CH, fr-CH, rm-CH) { }') is ':lang(de-CH, it-CH, fr-CH, rm-CH) { }'
 PASS parseThenSerializeRule(':lang(de-DE, de-DE-1996, de-Latn-DE, de-Latf-DE, de-Latn-DE-1996, de-CH, it-CH, fr-CH, rm-CH) { }') is ':lang(de-DE, de-DE-1996, de-Latn-DE, de-Latf-DE, de-Latn-DE-1996, de-CH, it-CH, fr-CH, rm-CH) { }'
 
+PASS parseThenSerializeRule(':lang(a, a, a) { }') is ':lang(a, a, a) { }'
+PASS parseThenSerializeRule(':lang(en, en, en) { }') is ':lang(en, en, en) { }'
+PASS parseThenSerializeRule(':lang(en-us, en-us, en-us) { }') is ':lang(en-us, en-us, en-us) { }'
+PASS parseThenSerializeRule(':lang(de-DE-1996, de-DE-1996, de-DE-1996) { }') is ':lang(de-DE-1996, de-DE-1996, de-DE-1996) { }'
+PASS parseThenSerializeRule(':lang(de-Latn-DE-1996, de-Latn-DE-1996, de-Latn-DE-1996) { }') is ':lang(de-Latn-DE-1996, de-Latn-DE-1996, de-Latn-DE-1996) { }'
+PASS parseThenSerializeRule(':lang(java, java, java) { }') is ':lang(java, java, java) { }'
+
 PASS parseThenSerializeRule(':not(a) { }') is ':not(a) { }'
 PASS parseThenSerializeRule(':-webkit-any(a,b,p) { }') is ':-webkit-any(a,b,p) { }'
 
@@ -275,6 +282,18 @@ PASS parseThenSerializeRule(':lang(a,b    ,c) { }') is ':lang(a, b, c) { }'
 PASS parseThenSerializeRule(':lang(a,b,    c) { }') is ':lang(a, b, c) { }'
 PASS parseThenSerializeRule(':lang(a,b,    c    ) { }') is ':lang(a, b, c) { }'
 
+PASS parseThenSerializeRule(':lang(en, en, en) { }') is ':lang(en, en, en) { }'
+PASS parseThenSerializeRule(':lang(en,en,en) { }') is ':lang(en, en, en) { }'
+PASS parseThenSerializeRule(':lang(en,en,    en) { }') is ':lang(en, en, en) { }'
+PASS parseThenSerializeRule(':lang(en,    en,en) { }') is ':lang(en, en, en) { }'
+PASS parseThenSerializeRule(':lang(en,    en,en    ) { }') is ':lang(en, en, en) { }'
+PASS parseThenSerializeRule(':lang(    en,    en,en    ) { }') is ':lang(en, en, en) { }'
+PASS parseThenSerializeRule(':lang(en,   en,   en) { }') is ':lang(en, en, en) { }'
+PASS parseThenSerializeRule(':lang(    en,    en,    en) { }') is ':lang(en, en, en) { }'
+PASS parseThenSerializeRule(':lang(    en,    en,    en    ) { }') is ':lang(en, en, en) { }'
+PASS parseThenSerializeRule(':lang(    en    ,    en    ,   en    ) { }') is ':lang(en, en, en) { }'
+PASS parseThenSerializeRule(':lang(    en,en,en    ) { }') is ':lang(en, en, en) { }'
+
 PASS parseThenSerializeRule(':lang() { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
 PASS parseThenSerializeRule(':lang(12, b, c) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
 PASS parseThenSerializeRule(':lang(a, 12, c) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
index aa921f4..785963b 100644 (file)
@@ -88,6 +88,15 @@ testSelectorRoundTrip(":lang(de-DE, de-DE-1996, de-Latn-DE, de-Latf-DE, de-Latn-
 testSelectorRoundTrip(":lang(de-CH, it-CH, fr-CH, rm-CH)");
 testSelectorRoundTrip(":lang(de-DE, de-DE-1996, de-Latn-DE, de-Latf-DE, de-Latn-DE-1996, de-CH, it-CH, fr-CH, rm-CH)");
 
+debug('')
+
+testSelectorRoundTrip(":lang(a, a, a)");
+testSelectorRoundTrip(":lang(en, en, en)");
+testSelectorRoundTrip(":lang(en-us, en-us, en-us)");
+testSelectorRoundTrip(":lang(de-DE-1996, de-DE-1996, de-DE-1996)");
+testSelectorRoundTrip(":lang(de-Latn-DE-1996, de-Latn-DE-1996, de-Latn-DE-1996)");
+testSelectorRoundTrip(":lang(java, java, java)");
+
 debug('');
 
 testSelectorRoundTrip(":not(a)");
@@ -352,6 +361,20 @@ shouldBe("parseThenSerializeRule(':lang(a,b,    c    ) { }')", "':lang(a, b, c)
 
 debug('');
 
+shouldBe("parseThenSerializeRule(':lang(en, en, en) { }')", "':lang(en, en, en) { }'");
+shouldBe("parseThenSerializeRule(':lang(en,en,en) { }')", "':lang(en, en, en) { }'");
+shouldBe("parseThenSerializeRule(':lang(en,en,    en) { }')", "':lang(en, en, en) { }'");
+shouldBe("parseThenSerializeRule(':lang(en,    en,en) { }')", "':lang(en, en, en) { }'");
+shouldBe("parseThenSerializeRule(':lang(en,    en,en    ) { }')", "':lang(en, en, en) { }'");
+shouldBe("parseThenSerializeRule(':lang(    en,    en,en    ) { }')", "':lang(en, en, en) { }'");
+shouldBe("parseThenSerializeRule(':lang(en,   en,   en) { }')", "':lang(en, en, en) { }'");
+shouldBe("parseThenSerializeRule(':lang(    en,    en,    en) { }')", "':lang(en, en, en) { }'");
+shouldBe("parseThenSerializeRule(':lang(    en,    en,    en    ) { }')", "':lang(en, en, en) { }'");
+shouldBe("parseThenSerializeRule(':lang(    en    ,    en    ,   en    ) { }')", "':lang(en, en, en) { }'");
+shouldBe("parseThenSerializeRule(':lang(    en,en,en    ) { }')", "':lang(en, en, en) { }'");
+
+debug('');
+
 shouldThrow("parseThenSerializeRule(':lang() { }')");
 shouldThrow("parseThenSerializeRule(':lang(12, b, c) { }')");
 shouldThrow("parseThenSerializeRule(':lang(a, 12, c) { }')");
index 894c9fb..64a31e0 100644 (file)
@@ -1,3 +1,20 @@
+2014-11-24  Dhi Aurrahman  <diorahman@rockybars.com>
+
+        Fix the parsing and re-serialization of :lang pseudo class selector when it has multiple arguments with same value
+        https://bugs.webkit.org/show_bug.cgi?id=139013
+
+        Reviewed by Benjamin Poulain.
+
+        Fix the parsing and re-serialization of :lang pseudo class selector when 
+        it has multiple arguments with same value e.g. :lang(en, en, en). Previously, 
+        given :lang(en, en, en) selector, it was parsed and reserialized 
+        as :lang(enenen) instead of :lang(en, en, en)
+
+        Related test on parsing and re-serialization of css selectors is updated.
+
+        * css/CSSSelector.cpp:
+        (WebCore::appendArgumentList):
+
 2014-11-24  Zalan Bujtas  <zalan@apple.com>
 
         Fix r176527. Iterate through the text renderers.
index 0121eff..b4cda72 100644 (file)
@@ -339,10 +339,10 @@ static void appendPseudoClassFunctionTail(StringBuilder& str, const CSSSelector*
 #if ENABLE(CSS_SELECTORS_LEVEL4)
 static void appendArgumentList(StringBuilder& str, const Vector<AtomicString>& argumentList)
 {
-    const AtomicString& lastArgument = argumentList.last();
-    for (const AtomicString argument : argumentList) {
-        str.append(argument);
-        if (argument != lastArgument)
+    unsigned argumentListSize = argumentList.size();
+    for (unsigned i = 0; i < argumentListSize; ++i) {
+        str.append(argumentList[i]);
+        if (i != argumentListSize - 1)
             str.appendLiteral(", ");
     }
 }