⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 176545 in webkit


Ignore:
Timestamp:
Nov 25, 2014, 4:27:52 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

Add parsing for :dir()
https://bugs.webkit.org/show_bug.cgi?id=138932

Patch by Sukolsak Sakshuwong <Sukolsak Sakshuwong> on 2014-11-25
Reviewed by Benjamin Poulain.

Source/WebCore:

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):

LayoutTests:

  • 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:
Location:
trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r176543 r176545  
     12014-11-25  Sukolsak Sakshuwong  <sukolsak@gmail.com>
     2
     3        Add parsing for :dir()
     4        https://bugs.webkit.org/show_bug.cgi?id=138932
     5
     6        Reviewed by Benjamin Poulain.
     7
     8        * fast/css/css-selector-text-expected.txt:
     9        * fast/css/css-selector-text.html:
     10        * fast/css/css-set-selector-text-expected.txt:
     11        * fast/css/css-set-selector-text.html:
     12        * fast/selectors/invalid-functional-pseudo-class-expected.txt:
     13        * fast/selectors/invalid-functional-pseudo-class.html:
     14
    1152014-11-25  Alejandro G. Castro  <alex@igalia.com>
    216
  • trunk/LayoutTests/fast/css/css-selector-text-expected.txt

    r176535 r176545  
    331331PASS parseThenSerializeRule(':role(:role()) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
    332332PASS parseThenSerializeRule(':role(:role(a)) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     333
     334PASS parseThenSerializeRule(':dir(ltr) { }') is ':dir(ltr) { }'
     335PASS parseThenSerializeRule(':dir(rtl) { }') is ':dir(rtl) { }'
     336PASS parseThenSerializeRule(':dir(LTR) { }') is ':dir(LTR) { }'
     337PASS parseThenSerializeRule(':dir(aBcD) { }') is ':dir(aBcD) { }'
     338PASS parseThenSerializeRule(':dir( a    ) { }') is ':dir(a) { }'
     339
     340PASS parseThenSerializeRule(':dir() { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     341PASS parseThenSerializeRule(':dir(42) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     342PASS parseThenSerializeRule(':dir(a, b) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     343PASS parseThenSerializeRule(':dir(}) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     344PASS parseThenSerializeRule(':dir()) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     345PASS parseThenSerializeRule(':dir(dir()) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     346PASS parseThenSerializeRule(':dir(:dir()) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
     347PASS parseThenSerializeRule(':dir(:dir(ltr)) { }') threw exception TypeError: undefined is not an object (evaluating 'styleElement.sheet.cssRules[0].cssText').
    333348PASS successfullyParsed is true
    334349
  • trunk/LayoutTests/fast/css/css-selector-text.html

    r176535 r176545  
    417417shouldThrow("parseThenSerializeRule(':role(:role(a)) { }')");
    418418
     419debug('');
     420
     421testSelectorRoundTrip(":dir(ltr)");
     422testSelectorRoundTrip(":dir(rtl)");
     423testSelectorRoundTrip(":dir(LTR)");
     424testSelectorRoundTrip(":dir(aBcD)");
     425shouldBe("parseThenSerializeRule(':dir( a    ) { }')", "':dir(a) { }'");
     426
     427debug('');
     428
     429shouldThrow("parseThenSerializeRule(':dir() { }')");
     430shouldThrow("parseThenSerializeRule(':dir(42) { }')");
     431shouldThrow("parseThenSerializeRule(':dir(a, b) { }')");
     432shouldThrow("parseThenSerializeRule(':dir(}) { }')");
     433shouldThrow("parseThenSerializeRule(':dir()) { }')");
     434shouldThrow("parseThenSerializeRule(':dir(dir()) { }')");
     435shouldThrow("parseThenSerializeRule(':dir(:dir()) { }')");
     436shouldThrow("parseThenSerializeRule(':dir(:dir(ltr)) { }')");
     437
    419438</script>
    420439<script src="../../resources/js-test-post.js"></script>
  • trunk/LayoutTests/fast/css/css-set-selector-text-expected.txt

    r176241 r176545  
    5858PASS setThenReadSelectorText(':visited') is ':visited'
    5959
     60PASS setThenReadSelectorText(':dir(a)') is ':dir(a)'
    6061PASS setThenReadSelectorText(':lang(a)') is ':lang(a)'
    6162PASS setThenReadSelectorText(':not(a)') is ':not(a)'
  • trunk/LayoutTests/fast/css/css-set-selector-text.html

    r176241 r176545  
    9898debug('');
    9999
     100testSelectorRoundTrip(":dir(a)");
    100101testSelectorRoundTrip(":lang(a)");
    101102testSelectorRoundTrip(":not(a)");
  • trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class-expected.txt

    r176241 r176545  
    5858PASS document.styleSheets[1].cssRules.length is 0
    5959PASS document.styleSheets[1].cssRules.length is 0
     60PASS document.querySelectorAll(":dir\").length threw exception SyntaxError: Unexpected EOF.
     61PASS document.querySelectorAll(":dir\\").length threw exception Error: SyntaxError: DOM Exception 12.
     62PASS document.querySelectorAll(":dir\\\").length threw exception SyntaxError: Unexpected EOF.
     63PASS document.querySelectorAll(":dir\\\\").length threw exception Error: SyntaxError: DOM Exception 12.
     64PASS document.querySelectorAll(":dir\(").length threw exception Error: SyntaxError: DOM Exception 12.
     65PASS document.querySelectorAll(":dir\\(").length threw exception Error: SyntaxError: DOM Exception 12.
     66PASS document.querySelectorAll(":dir\\\(").length threw exception Error: SyntaxError: DOM Exception 12.
     67PASS document.querySelectorAll(":dir\\\\(").length threw exception Error: SyntaxError: DOM Exception 12.
     68PASS document.querySelectorAll(":dir\ .foo").length threw exception Error: SyntaxError: DOM Exception 12.
     69PASS document.querySelectorAll(":dir\\ .foo").length threw exception Error: SyntaxError: DOM Exception 12.
     70PASS document.querySelectorAll(":dir\\\ .foo").length threw exception Error: SyntaxError: DOM Exception 12.
     71PASS document.querySelectorAll(":dir\\\\ .foo").length threw exception Error: SyntaxError: DOM Exception 12.
     72PASS document.querySelectorAll(":dir\( .foo").length threw exception Error: SyntaxError: DOM Exception 12.
     73PASS document.querySelectorAll(":dir\\( .foo").length threw exception Error: SyntaxError: DOM Exception 12.
     74PASS document.querySelectorAll(":dir\\\( .foo").length threw exception Error: SyntaxError: DOM Exception 12.
     75PASS document.querySelectorAll(":dir\\\\( .foo").length threw exception Error: SyntaxError: DOM Exception 12.
     76PASS document.querySelectorAll(":dir\()").length threw exception Error: SyntaxError: DOM Exception 12.
     77PASS document.querySelectorAll(":dir\\()").length threw exception Error: SyntaxError: DOM Exception 12.
     78PASS document.querySelectorAll(":dir\\\()").length threw exception Error: SyntaxError: DOM Exception 12.
     79PASS document.querySelectorAll(":dir\\\\()").length threw exception Error: SyntaxError: DOM Exception 12.
     80PASS document.querySelectorAll(":dir\ .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
     81PASS document.querySelectorAll(":dir\\ .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
     82PASS document.querySelectorAll(":dir\\\ .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
     83PASS document.querySelectorAll(":dir\\\\ .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
     84PASS document.querySelectorAll(":dir\\( .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
     85PASS document.querySelectorAll(":dir\\\( .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
     86PASS document.querySelectorAll(":dir\\\\( .foo)").length threw exception Error: SyntaxError: DOM Exception 12.
     87PASS document.styleSheets[1].cssRules.length is 0
     88PASS document.styleSheets[1].cssRules.length is 0
     89PASS document.styleSheets[1].cssRules.length is 0
     90PASS document.styleSheets[1].cssRules.length is 0
     91PASS document.styleSheets[1].cssRules.length is 0
     92PASS document.styleSheets[1].cssRules.length is 0
     93PASS document.styleSheets[1].cssRules.length is 0
     94PASS document.styleSheets[1].cssRules.length is 0
     95PASS document.styleSheets[1].cssRules.length is 0
     96PASS document.styleSheets[1].cssRules.length is 0
     97PASS document.styleSheets[1].cssRules.length is 0
     98PASS document.styleSheets[1].cssRules.length is 0
     99PASS document.styleSheets[1].cssRules.length is 0
     100PASS document.styleSheets[1].cssRules.length is 0
     101PASS document.styleSheets[1].cssRules.length is 0
     102PASS document.styleSheets[1].cssRules.length is 0
     103PASS document.styleSheets[1].cssRules.length is 0
     104PASS document.styleSheets[1].cssRules.length is 0
     105PASS document.styleSheets[1].cssRules.length is 0
     106PASS document.styleSheets[1].cssRules.length is 0
     107PASS document.styleSheets[1].cssRules.length is 0
     108PASS document.styleSheets[1].cssRules.length is 0
     109PASS document.styleSheets[1].cssRules.length is 0
     110PASS document.styleSheets[1].cssRules.length is 0
     111PASS document.styleSheets[1].cssRules.length is 0
     112PASS document.styleSheets[1].cssRules.length is 0
     113PASS document.styleSheets[1].cssRules.length is 0
    60114PASS document.querySelectorAll(":lang\").length threw exception SyntaxError: Unexpected EOF.
    61115PASS document.querySelectorAll(":lang\\").length threw exception Error: SyntaxError: DOM Exception 12.
  • trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class.html

    r176241 r176545  
    6161var functionalPseudoClasses = [
    6262    "-webkit-any",
     63    "dir",
    6364    "lang",
    6465    "not",
  • trunk/Source/WebCore/ChangeLog

    r176544 r176545  
     12014-11-25  Sukolsak Sakshuwong  <sukolsak@gmail.com>
     2
     3        Add parsing for :dir()
     4        https://bugs.webkit.org/show_bug.cgi?id=138932
     5
     6        Reviewed by Benjamin Poulain.
     7
     8        Add support for parsing :dir() pseudo class. The implementation of selector
     9        matching will be in a follow-up patch.
     10
     11        * css/CSSGrammar.y.in:
     12        * css/CSSParser.cpp:
     13        (WebCore::CSSParser::detectFunctionTypeToken):
     14        * css/CSSSelector.cpp:
     15        (WebCore::appendPseudoClassFunctionTail):
     16        (WebCore::CSSSelector::selectorText):
     17        * css/CSSSelector.h:
     18        * css/SelectorChecker.cpp:
     19        (WebCore::SelectorChecker::checkOne):
     20        * css/SelectorPseudoClassAndCompatibilityElementMap.in:
     21        * cssjit/SelectorCompiler.cpp:
     22        (WebCore::SelectorCompiler::addPseudoClassType):
     23
    1242014-11-25  Anders Carlsson  <andersca@apple.com>
    225
  • trunk/Source/WebCore/css/CSSGrammar.y.in

    r176494 r176545  
    6464    case NTHCHILDSELECTORSEPARATOR:
    6565#if ENABLE_CSS_SELECTORS_LEVEL4
     66    case DIRFUNCTION:
    6667    case LANGFUNCTION:
    6768    case ROLEFUNCTION:
     
    233234
    234235#if ENABLE_CSS_SELECTORS_LEVEL4
     236%token <string> DIRFUNCTION
    235237%token <string> LANGFUNCTION
    236238%token <string> ROLEFUNCTION
     
    13771379
    13781380#if ENABLE_CSS_SELECTORS_LEVEL4
     1381    | ':' DIRFUNCTION maybe_space IDENT maybe_space ')' {
     1382        $$ = nullptr;
     1383        auto selector = std::make_unique<CSSParserSelector>();
     1384        selector->setMatch(CSSSelector::PseudoClass);
     1385        selector->setArgument($4);
     1386        selector->setPseudoClassValue($2);
     1387        if (selector->pseudoClassType() == CSSSelector::PseudoClassDir)
     1388            $$ = selector.release();
     1389    }
     1390
    13791391    | ':' LANGFUNCTION maybe_space comma_separated_identifiers maybe_space ')' {
    13801392        $$ = nullptr;
     
    18741886    '(' | FUNCTION | CALCFUNCTION | MATCHESFUNCTION | MAXFUNCTION | MINFUNCTION | ANYFUNCTION | NOTFUNCTION
    18751887#if ENABLE_CSS_SELECTORS_LEVEL4
    1876     | LANGFUNCTION | ROLEFUNCTION
     1888    | DIRFUNCTION | LANGFUNCTION | ROLEFUNCTION
    18771889#endif
    18781890#if ENABLE_VIDEO_TRACK
  • trunk/Source/WebCore/css/CSSParser.cpp

    r176494 r176545  
    1069310693        }
    1069410694#endif
     10695#if ENABLE(CSS_SELECTORS_LEVEL4)
     10696        if (isASCIIAlphaCaselessEqual(name[0], 'd') && isASCIIAlphaCaselessEqual(name[1], 'i') && isASCIIAlphaCaselessEqual(name[2], 'r')) {
     10697            m_token = DIRFUNCTION;
     10698            return true;
     10699        }
     10700#endif
    1069510701        return false;
    1069610702
  • trunk/Source/WebCore/css/CSSSelector.cpp

    r176535 r176545  
    320320{
    321321    switch (selector->pseudoClassType()) {
     322#if ENABLE(CSS_SELECTORS_LEVEL4)
     323    case CSSSelector::PseudoClassDir:
     324#endif
    322325    case CSSSelector::PseudoClassLang:
    323326    case CSSSelector::PseudoClassNthChild:
     
    442445                str.appendLiteral(":default");
    443446                break;
     447#if ENABLE(CSS_SELECTORS_LEVEL4)
     448            case CSSSelector::PseudoClassDir:
     449                str.appendLiteral(":dir(");
     450                appendPseudoClassFunctionTail(str, cs);
     451                break;
     452#endif
    444453            case CSSSelector::PseudoClassDisabled:
    445454                str.appendLiteral(":disabled");
  • trunk/Source/WebCore/css/CSSSelector.h

    r176529 r176545  
    159159#endif
    160160#if ENABLE(CSS_SELECTORS_LEVEL4)
     161            PseudoClassDir,
    161162            PseudoClassRole,
    162163#endif
  • trunk/Source/WebCore/css/SelectorChecker.cpp

    r176529 r176545  
    994994
    995995#if ENABLE(CSS_SELECTORS_LEVEL4)
     996        // FIXME: Implement :dir() selector.
     997        case CSSSelector::PseudoClassDir:
     998            return false;
     999
    9961000        // FIXME: Implement :role() selector.
    9971001        case CSSSelector::PseudoClassRole:
  • trunk/Source/WebCore/css/SelectorPseudoClassAndCompatibilityElementMap.in

    r176529 r176545  
    1515decrement
    1616default
     17#if ENABLE(CSS_SELECTORS_LEVEL4)
     18dir(
     19#endif
    1720disabled
    1821double-button
  • trunk/Source/WebCore/cssjit/SelectorCompiler.cpp

    r176529 r176545  
    566566    case CSSSelector::PseudoClassDrag:
    567567#if ENABLE(CSS_SELECTORS_LEVEL4)
     568    case CSSSelector::PseudoClassDir:
    568569    case CSSSelector::PseudoClassRole:
    569570#endif
Note: See TracChangeset for help on using the changeset viewer.