Diff
Modified: trunk/LayoutTests/ChangeLog (176544 => 176545)
--- trunk/LayoutTests/ChangeLog 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/LayoutTests/ChangeLog 2014-11-26 00:27:52 UTC (rev 176545)
@@ -1,3 +1,17 @@
+2014-11-25 Sukolsak Sakshuwong <[email protected]>
+
+ Add parsing for :dir()
+ https://bugs.webkit.org/show_bug.cgi?id=138932
+
+ Reviewed by Benjamin Poulain.
+
+ * fast/css/css-selector-text-expected.txt:
+ * fast/css/css-selector-text.html:
+ * fast/css/css-set-selector-text-expected.txt:
+ * fast/css/css-set-selector-text.html:
+ * fast/selectors/invalid-functional-pseudo-class-expected.txt:
+ * fast/selectors/invalid-functional-pseudo-class.html:
+
2014-11-25 Alejandro G. Castro <[email protected]>
Unreviewed, upload two missing test files in the commit r174677.
Modified: trunk/LayoutTests/fast/css/css-selector-text-expected.txt (176544 => 176545)
--- trunk/LayoutTests/fast/css/css-selector-text-expected.txt 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/LayoutTests/fast/css/css-selector-text-expected.txt 2014-11-26 00:27:52 UTC (rev 176545)
@@ -330,6 +330,21 @@
PASS parseThenSerializeRule(':role(role()) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
PASS parseThenSerializeRule(':role(:role()) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
PASS parseThenSerializeRule(':role(:role(a)) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
+
+PASS parseThenSerializeRule(':dir(ltr) { }') is ':dir(ltr) { }'
+PASS parseThenSerializeRule(':dir(rtl) { }') is ':dir(rtl) { }'
+PASS parseThenSerializeRule(':dir(LTR) { }') is ':dir(LTR) { }'
+PASS parseThenSerializeRule(':dir(aBcD) { }') is ':dir(aBcD) { }'
+PASS parseThenSerializeRule(':dir( a ) { }') is ':dir(a) { }'
+
+PASS parseThenSerializeRule(':dir() { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
+PASS parseThenSerializeRule(':dir(42) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
+PASS parseThenSerializeRule(':dir(a, b) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
+PASS parseThenSerializeRule(':dir(}) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
+PASS parseThenSerializeRule(':dir()) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
+PASS parseThenSerializeRule(':dir(dir()) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
+PASS parseThenSerializeRule(':dir(:dir()) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
+PASS parseThenSerializeRule(':dir(:dir(ltr)) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
PASS successfullyParsed is true
TEST COMPLETE
Modified: trunk/LayoutTests/fast/css/css-selector-text.html (176544 => 176545)
--- trunk/LayoutTests/fast/css/css-selector-text.html 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/LayoutTests/fast/css/css-selector-text.html 2014-11-26 00:27:52 UTC (rev 176545)
@@ -416,6 +416,25 @@
shouldThrow("parseThenSerializeRule(':role(:role()) { }')");
shouldThrow("parseThenSerializeRule(':role(:role(a)) { }')");
+debug('');
+
+testSelectorRoundTrip(":dir(ltr)");
+testSelectorRoundTrip(":dir(rtl)");
+testSelectorRoundTrip(":dir(LTR)");
+testSelectorRoundTrip(":dir(aBcD)");
+shouldBe("parseThenSerializeRule(':dir( a ) { }')", "':dir(a) { }'");
+
+debug('');
+
+shouldThrow("parseThenSerializeRule(':dir() { }')");
+shouldThrow("parseThenSerializeRule(':dir(42) { }')");
+shouldThrow("parseThenSerializeRule(':dir(a, b) { }')");
+shouldThrow("parseThenSerializeRule(':dir(}) { }')");
+shouldThrow("parseThenSerializeRule(':dir()) { }')");
+shouldThrow("parseThenSerializeRule(':dir(dir()) { }')");
+shouldThrow("parseThenSerializeRule(':dir(:dir()) { }')");
+shouldThrow("parseThenSerializeRule(':dir(:dir(ltr)) { }')");
+
</script>
<script src=""
</body>
Modified: trunk/LayoutTests/fast/css/css-set-selector-text-expected.txt (176544 => 176545)
--- trunk/LayoutTests/fast/css/css-set-selector-text-expected.txt 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/LayoutTests/fast/css/css-set-selector-text-expected.txt 2014-11-26 00:27:52 UTC (rev 176545)
@@ -57,6 +57,7 @@
PASS setThenReadSelectorText(':target') is ':target'
PASS setThenReadSelectorText(':visited') is ':visited'
+PASS setThenReadSelectorText(':dir(a)') is ':dir(a)'
PASS setThenReadSelectorText(':lang(a)') is ':lang(a)'
PASS setThenReadSelectorText(':not(a)') is ':not(a)'
PASS setThenReadSelectorText(':role(a)') is ':role(a)'
Modified: trunk/LayoutTests/fast/css/css-set-selector-text.html (176544 => 176545)
--- trunk/LayoutTests/fast/css/css-set-selector-text.html 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/LayoutTests/fast/css/css-set-selector-text.html 2014-11-26 00:27:52 UTC (rev 176545)
@@ -97,6 +97,7 @@
debug('');
+testSelectorRoundTrip(":dir(a)");
testSelectorRoundTrip(":lang(a)");
testSelectorRoundTrip(":not(a)");
testSelectorRoundTrip(":role(a)");
Modified: trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class-expected.txt (176544 => 176545)
--- trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class-expected.txt 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class-expected.txt 2014-11-26 00:27:52 UTC (rev 176545)
@@ -57,6 +57,60 @@
PASS document.styleSheets[1].cssRules.length is 0
PASS document.styleSheets[1].cssRules.length is 0
PASS document.styleSheets[1].cssRules.length is 0
+PASS document.querySelectorAll(":dir\").length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(":dir\\").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\").length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(":dir\\\\").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\(").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\(").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\(").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\\(").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\ .foo").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\ .foo").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\ .foo").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\\ .foo").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\( .foo").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\( .foo").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\( .foo").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\\( .foo").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\()").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\()").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\()").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\\()").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\ .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\ .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\ .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\\ .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\( .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\( .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(":dir\\\\( .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
PASS document.querySelectorAll(":lang\").length threw exception SyntaxError: Unexpected EOF.
PASS document.querySelectorAll(":lang\\").length threw exception Error: SyntaxError: DOM Exception 12.
PASS document.querySelectorAll(":lang\\\").length threw exception SyntaxError: Unexpected EOF.
Modified: trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class.html (176544 => 176545)
--- trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class.html 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class.html 2014-11-26 00:27:52 UTC (rev 176545)
@@ -60,6 +60,7 @@
var functionalPseudoClasses = [
"-webkit-any",
+ "dir",
"lang",
"not",
"nth-child",
Modified: trunk/Source/WebCore/ChangeLog (176544 => 176545)
--- trunk/Source/WebCore/ChangeLog 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/Source/WebCore/ChangeLog 2014-11-26 00:27:52 UTC (rev 176545)
@@ -1,3 +1,26 @@
+2014-11-25 Sukolsak Sakshuwong <[email protected]>
+
+ Add parsing for :dir()
+ https://bugs.webkit.org/show_bug.cgi?id=138932
+
+ Reviewed by Benjamin Poulain.
+
+ Add support for parsing :dir() pseudo class. The implementation of selector
+ matching will be in a follow-up patch.
+
+ * css/CSSGrammar.y.in:
+ * css/CSSParser.cpp:
+ (WebCore::CSSParser::detectFunctionTypeToken):
+ * css/CSSSelector.cpp:
+ (WebCore::appendPseudoClassFunctionTail):
+ (WebCore::CSSSelector::selectorText):
+ * css/CSSSelector.h:
+ * css/SelectorChecker.cpp:
+ (WebCore::SelectorChecker::checkOne):
+ * css/SelectorPseudoClassAndCompatibilityElementMap.in:
+ * cssjit/SelectorCompiler.cpp:
+ (WebCore::SelectorCompiler::addPseudoClassType):
+
2014-11-25 Anders Carlsson <[email protected]>
Remove user content handling from PageGroup
Modified: trunk/Source/WebCore/css/CSSGrammar.y.in (176544 => 176545)
--- trunk/Source/WebCore/css/CSSGrammar.y.in 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/Source/WebCore/css/CSSGrammar.y.in 2014-11-26 00:27:52 UTC (rev 176545)
@@ -63,6 +63,7 @@
case NTHCHILDFUNCTIONS:
case NTHCHILDSELECTORSEPARATOR:
#if ENABLE_CSS_SELECTORS_LEVEL4
+ case DIRFUNCTION:
case LANGFUNCTION:
case ROLEFUNCTION:
#endif
@@ -232,6 +233,7 @@
%token <string> NTHCHILDFUNCTIONS
#if ENABLE_CSS_SELECTORS_LEVEL4
+%token <string> DIRFUNCTION
%token <string> LANGFUNCTION
%token <string> ROLEFUNCTION
#endif
@@ -1376,6 +1378,16 @@
}
#if ENABLE_CSS_SELECTORS_LEVEL4
+ | ':' DIRFUNCTION maybe_space IDENT maybe_space ')' {
+ $$ = nullptr;
+ auto selector = std::make_unique<CSSParserSelector>();
+ selector->setMatch(CSSSelector::PseudoClass);
+ selector->setArgument($4);
+ selector->setPseudoClassValue($2);
+ if (selector->pseudoClassType() == CSSSelector::PseudoClassDir)
+ $$ = selector.release();
+ }
+
| ':' LANGFUNCTION maybe_space comma_separated_identifiers maybe_space ')' {
$$ = nullptr;
if ($4) {
@@ -1873,7 +1885,7 @@
opening_parenthesis:
'(' | FUNCTION | CALCFUNCTION | MATCHESFUNCTION | MAXFUNCTION | MINFUNCTION | ANYFUNCTION | NOTFUNCTION
#if ENABLE_CSS_SELECTORS_LEVEL4
- | LANGFUNCTION | ROLEFUNCTION
+ | DIRFUNCTION | LANGFUNCTION | ROLEFUNCTION
#endif
#if ENABLE_VIDEO_TRACK
| CUEFUNCTION
Modified: trunk/Source/WebCore/css/CSSParser.cpp (176544 => 176545)
--- trunk/Source/WebCore/css/CSSParser.cpp 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/Source/WebCore/css/CSSParser.cpp 2014-11-26 00:27:52 UTC (rev 176545)
@@ -10692,6 +10692,12 @@
return true;
}
#endif
+#if ENABLE(CSS_SELECTORS_LEVEL4)
+ if (isASCIIAlphaCaselessEqual(name[0], 'd') && isASCIIAlphaCaselessEqual(name[1], 'i') && isASCIIAlphaCaselessEqual(name[2], 'r')) {
+ m_token = DIRFUNCTION;
+ return true;
+ }
+#endif
return false;
case 4:
Modified: trunk/Source/WebCore/css/CSSSelector.cpp (176544 => 176545)
--- trunk/Source/WebCore/css/CSSSelector.cpp 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/Source/WebCore/css/CSSSelector.cpp 2014-11-26 00:27:52 UTC (rev 176545)
@@ -319,6 +319,9 @@
static void appendPseudoClassFunctionTail(StringBuilder& str, const CSSSelector* selector)
{
switch (selector->pseudoClassType()) {
+#if ENABLE(CSS_SELECTORS_LEVEL4)
+ case CSSSelector::PseudoClassDir:
+#endif
case CSSSelector::PseudoClassLang:
case CSSSelector::PseudoClassNthChild:
case CSSSelector::PseudoClassNthLastChild:
@@ -441,6 +444,12 @@
case CSSSelector::PseudoClassDefault:
str.appendLiteral(":default");
break;
+#if ENABLE(CSS_SELECTORS_LEVEL4)
+ case CSSSelector::PseudoClassDir:
+ str.appendLiteral(":dir(");
+ appendPseudoClassFunctionTail(str, cs);
+ break;
+#endif
case CSSSelector::PseudoClassDisabled:
str.appendLiteral(":disabled");
break;
Modified: trunk/Source/WebCore/css/CSSSelector.h (176544 => 176545)
--- trunk/Source/WebCore/css/CSSSelector.h 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/Source/WebCore/css/CSSSelector.h 2014-11-26 00:27:52 UTC (rev 176545)
@@ -158,6 +158,7 @@
PseudoClassPast,
#endif
#if ENABLE(CSS_SELECTORS_LEVEL4)
+ PseudoClassDir,
PseudoClassRole,
#endif
};
Modified: trunk/Source/WebCore/css/SelectorChecker.cpp (176544 => 176545)
--- trunk/Source/WebCore/css/SelectorChecker.cpp 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/Source/WebCore/css/SelectorChecker.cpp 2014-11-26 00:27:52 UTC (rev 176545)
@@ -993,6 +993,10 @@
return false;
#if ENABLE(CSS_SELECTORS_LEVEL4)
+ // FIXME: Implement :dir() selector.
+ case CSSSelector::PseudoClassDir:
+ return false;
+
// FIXME: Implement :role() selector.
case CSSSelector::PseudoClassRole:
return false;
Modified: trunk/Source/WebCore/css/SelectorPseudoClassAndCompatibilityElementMap.in (176544 => 176545)
--- trunk/Source/WebCore/css/SelectorPseudoClassAndCompatibilityElementMap.in 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/Source/WebCore/css/SelectorPseudoClassAndCompatibilityElementMap.in 2014-11-26 00:27:52 UTC (rev 176545)
@@ -14,6 +14,9 @@
corner-present
decrement
default
+#if ENABLE(CSS_SELECTORS_LEVEL4)
+dir(
+#endif
disabled
double-button
empty
Modified: trunk/Source/WebCore/cssjit/SelectorCompiler.cpp (176544 => 176545)
--- trunk/Source/WebCore/cssjit/SelectorCompiler.cpp 2014-11-25 19:50:45 UTC (rev 176544)
+++ trunk/Source/WebCore/cssjit/SelectorCompiler.cpp 2014-11-26 00:27:52 UTC (rev 176545)
@@ -565,6 +565,7 @@
case CSSSelector::PseudoClassNthLastOfType:
case CSSSelector::PseudoClassDrag:
#if ENABLE(CSS_SELECTORS_LEVEL4)
+ case CSSSelector::PseudoClassDir:
case CSSSelector::PseudoClassRole:
#endif
return FunctionType::CannotCompile;