Changeset 29976 in webkit


Ignore:
Timestamp:
Feb 4, 2008 2:12:16 PM (16 years ago)
Author:
hyatt@apple.com
Message:

Fix for bug 16751, misparsing of html*.test in CSS.

Reviewed by darin

Added fast/css/simple-selector-chain-parsing.html

  • css/CSSGrammar.y:
Location:
trunk/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r29975 r29976  
     12008-02-04  David Hyatt  <hyatt@apple.com>
     2
     3        Fix for bug 16751, misparsing of html*.test in CSS.
     4
     5        Reviewed by darin
     6
     7        Added fast/css/simple-selector-chain-parsing.html
     8
     9        * css/CSSGrammar.y:
     10
    1112008-02-04  Darin Adler  <darin@apple.com>
    212
  • trunk/WebCore/css/CSSGrammar.y

    r29933 r29976  
    263263%type <selector> selector
    264264%type <selector> selector_list
     265%type <selector> selector_with_trailing_whitespace
    265266%type <selector> class
    266267%type <selector> attrib
     
    576577  | '~' maybe_space { $$ = CSSSelector::IndirectAdjacent; }
    577578  | '>' maybe_space { $$ = CSSSelector::Child; }
    578   | /* empty */ { $$ = CSSSelector::Descendant; }
    579579  ;
    580580
     
    607607   ;
    608608
     609selector_with_trailing_whitespace:
     610    selector WHITESPACE {
     611        $$ = $1;
     612    }
     613    ;
     614
    609615selector:
    610616    simple_selector {
    611617        $$ = $1;
     618    }
     619    | selector_with_trailing_whitespace
     620    {
     621        $$ = $1;
     622    }
     623    | selector_with_trailing_whitespace simple_selector
     624    {
     625        $$ = $2;
     626        if (!$1)
     627            $$ = 0;
     628        else if ($$) {
     629            CSSParser* p = static_cast<CSSParser*>(parser);
     630            CSSSelector* end = $$;
     631            while (end->m_tagHistory)
     632                end = end->m_tagHistory;
     633            end->m_relation = CSSSelector::Descendant;
     634            end->m_tagHistory = p->sinkFloatingSelector($1);
     635            if (Document* doc = p->document())
     636                doc->setUsesDescendantRules(true);
     637        }
    612638    }
    613639    | selector combinator simple_selector {
     
    622648            end->m_relation = $2;
    623649            end->m_tagHistory = p->sinkFloatingSelector($1);
    624             if ($2 == CSSSelector::Descendant || $2 == CSSSelector::Child) {
     650            if ($2 == CSSSelector::Child) {
    625651                if (Document* doc = p->document())
    626652                    doc->setUsesDescendantRules(true);
     
    641667    | IDENT '|' { $$ = $1; }
    642668;
    643 
     669   
    644670simple_selector:
    645     element_name maybe_space {
     671    element_name {
    646672        CSSParser* p = static_cast<CSSParser*>(parser);
    647673        $$ = p->createFloatingSelector();
    648674        $$->m_tag = QualifiedName(nullAtom, atomicString($1), p->defaultNamespace);
    649675    }
    650     | element_name specifier_list maybe_space {
     676    | element_name specifier_list {
    651677        $$ = $2;
    652678        if ($$) {
     
    655681        }
    656682    }
    657     | specifier_list maybe_space {
     683    | specifier_list {
    658684        $$ = $1;
    659685        CSSParser* p = static_cast<CSSParser*>(parser);
     
    661687            $$->m_tag = QualifiedName(nullAtom, starAtom, p->defaultNamespace);
    662688    }
    663     | namespace_selector element_name maybe_space {
     689    | namespace_selector element_name {
    664690        AtomicString namespacePrefix = atomicString($1);
    665691        CSSParser* p = static_cast<CSSParser*>(parser);
     
    672698            $$->m_tag = QualifiedName(nullAtom, atomicString($2), p->defaultNamespace);
    673699    }
    674     | namespace_selector element_name specifier_list maybe_space {
     700    | namespace_selector element_name specifier_list {
    675701        $$ = $3;
    676702        if ($$) {
     
    685711        }
    686712    }
    687     | namespace_selector specifier_list maybe_space {
     713    | namespace_selector specifier_list {
    688714        $$ = $2;
    689715        if ($$) {
     
    857883        else if (type == CSSSelector::PseudoEmpty ||
    858884                 type == CSSSelector::PseudoFirstChild ||
    859                  type == CSSSelector::PseudoFirstOfType ||
    860                  type == CSSSelector::PseudoLastChild ||
    861                  type == CSSSelector::PseudoLastOfType) {
     885                 type == CSSSelector::PseudoFirstOfType) {
    862886            CSSParser* p = static_cast<CSSParser*>(parser);
    863887            Document* doc = p->document();
     
    895919    }
    896920    // used by :not
    897     | ':' NOTFUNCTION maybe_space simple_selector ')' {
     921    | ':' NOTFUNCTION maybe_space simple_selector maybe_space ')' {
    898922        if (!$4)
    899923            $$ = 0;
Note: See TracChangeset for help on using the changeset viewer.