| Index: Source/core/css/CSSGrammar.y
|
| diff --git a/Source/core/css/CSSGrammar.y b/Source/core/css/CSSGrammar.y
|
| index f010bee340e5be7c509cd90cc4f399575a24ea26..1982307f815c234f11ba39227f90385f37089cb0 100644
|
| --- a/Source/core/css/CSSGrammar.y
|
| +++ b/Source/core/css/CSSGrammar.y
|
| @@ -114,6 +114,7 @@ static inline bool isCSSTokenAString(int yytype)
|
| case FUNCTION:
|
| case ANYFUNCTION:
|
| case HOSTFUNCTION:
|
| + case ANCESTORFUNCTION:
|
| case NOTFUNCTION:
|
| case CALCFUNCTION:
|
| case MINFUNCTION:
|
| @@ -269,6 +270,7 @@ inline static CSSParserValue makeIdentValue(CSSParserString string)
|
| %token <string> VARFUNCTION
|
| %token <string> VAR_DEFINITION
|
| %token <string> HOSTFUNCTION
|
| +%token <string> ANCESTORFUNCTION
|
|
|
| %token <string> UNICODERANGE
|
|
|
| @@ -1542,6 +1544,29 @@ pseudo:
|
| | ':' HOSTFUNCTION selector_recovery closing_parenthesis {
|
| YYERROR;
|
| }
|
| + | ':' ANCESTORFUNCTION maybe_space simple_selector_list maybe_space closing_parenthesis {
|
| + $$ = parser->createFloatingSelector();
|
| + $$->setMatch(CSSSelector::PseudoClass);
|
| + $$->adoptSelectorVector(*parser->sinkFloatingSelectorVector($4));
|
| + parser->tokenToLowerCase($2);
|
| + $$->setValue($2);
|
| + CSSSelector::PseudoType type = $$->pseudoType();
|
| + if (type != CSSSelector::PseudoAncestor)
|
| + YYERROR;
|
| + }
|
| + // used by :ancestor()
|
| + | ':' ANCESTORFUNCTION maybe_space closing_parenthesis {
|
| + $$ = parser->createFloatingSelector();
|
| + $$->setMatch(CSSSelector::PseudoClass);
|
| + parser->tokenToLowerCase($2);
|
| + $$->setValue($2.atomicSubstring(0, $2.length() - 1));
|
| + CSSSelector::PseudoType type = $$->pseudoType();
|
| + if (type != CSSSelector::PseudoAncestor)
|
| + YYERROR;
|
| + }
|
| + | ':' ANCESTORFUNCTION selector_recovery closing_parenthesis {
|
| + YYERROR;
|
| + }
|
| ;
|
|
|
| selector_recovery:
|
|
|