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
+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
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) { }'
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').
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)");
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) { }')");
+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.
#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(", ");
}
}