Changeset 207790 in webkit


Ignore:
Timestamp:
Oct 24, 2016 5:11:38 PM (8 years ago)
Author:
Ryan Haddad
Message:

Unreviewed, rolling out r207783.

This change appears to have caused fast/selectors/invalid-
functional-pseudo-class.html to crash on iOS and macOS

Reverted changeset:

"[CSS Parser] Fix :lang argument parsing"
https://bugs.webkit.org/show_bug.cgi?id=163913
http://trac.webkit.org/changeset/207783

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r207788 r207790  
     12016-10-24  Ryan Haddad  <ryanhaddad@apple.com>
     2
     3        Unreviewed, rolling out r207783.
     4
     5        This change appears to have caused fast/selectors/invalid-
     6        functional-pseudo-class.html to crash on iOS and macOS
     7
     8        Reverted changeset:
     9
     10        "[CSS Parser] Fix :lang argument parsing"
     11        https://bugs.webkit.org/show_bug.cgi?id=163913
     12        http://trac.webkit.org/changeset/207783
     13
    1142016-10-24  Brady Eidson  <beidson@apple.com>
    215
  • trunk/Source/WebCore/css/SelectorPseudoClassAndCompatibilityElementMap.in

    r207783 r207790  
    11-khtml-drag
    2 -webkit-any
    32-webkit-any(
    43-webkit-any-link, PseudoClassAnyLinkDeprecated, PseudoElementUnknown
     
    1514default
    1615#if ENABLE(CSS_SELECTORS_LEVEL4)
    17 dir
    1816dir(
    1917#endif
     
    3634indeterminate
    3735invalid
    38 lang
    3936lang(
    4037last-child
    4138last-of-type
    4239link
    43 matches
    4440matches(
    4541no-button
    46 not
    4742not(
    48 nth-child
    4943nth-child(
    50 nth-last-child
    5144nth-last-child(
    52 nth-last-of-type
    5345nth-last-of-type(
    54 nth-of-type
    5546nth-of-type(
    5647only-child
     
    6354required
    6455#if ENABLE(CSS_SELECTORS_LEVEL4)
    65 role
    6656role(
    6757#endif
  • trunk/Source/WebCore/css/parser/CSSParserValues.cpp

    r207783 r207790  
    411411    m_selector->setLangArgumentList(WTFMove(argumentList));
    412412}
    413 
    414 void CSSParserSelector::setLangArgumentList(std::unique_ptr<Vector<AtomicString>> argumentList)
    415 {
    416     ASSERT_WITH_MESSAGE(!argumentList->isEmpty(), "No CSS Selector takes an empty argument list.");
    417     m_selector->setLangArgumentList(WTFMove(argumentList));
    418 }
    419 
     413   
    420414void CSSParserSelector::setSelectorList(std::unique_ptr<CSSSelectorList> selectorList)
    421415{
  • trunk/Source/WebCore/css/parser/CSSParserValues.h

    r207783 r207790  
    236236    void adoptSelectorVector(Vector<std::unique_ptr<CSSParserSelector>>& selectorVector);
    237237    void setLangArgumentList(const Vector<CSSParserString>& stringVector);
    238     void setLangArgumentList(std::unique_ptr<Vector<AtomicString>>);
    239238    void setSelectorList(std::unique_ptr<CSSSelectorList>);
    240239
  • trunk/Source/WebCore/css/parser/CSSSelectorParser.cpp

    r207783 r207790  
    101101}
    102102
    103 static void consumeLangArgumentList(std::unique_ptr<Vector<AtomicString>>& argumentList, CSSParserTokenRange& range)
    104 {
    105     const CSSParserToken& ident = range.consumeIncludingWhitespace();
    106     if (ident.type() != IdentToken)
    107         return;
    108     argumentList->append(ident.value().toAtomicString());
    109     while (!range.atEnd() && range.peek().type() == CommaToken) {
    110         range.consumeIncludingWhitespace();
    111         const CSSParserToken& ident = range.consumeIncludingWhitespace();
    112         if (ident.type() != IdentToken) {
    113             argumentList->clear();
    114             return;
    115         }
    116         argumentList->append(ident.value().toAtomicString());
    117     }
    118 }
    119    
    120103namespace {
    121104
     
    487470        return nullptr;
    488471
    489     if (selector->match() == CSSSelector::PseudoClass) {
    490         switch (selector->pseudoClassType()) {
    491         case CSSSelector::PseudoClassNot: {
    492             std::unique_ptr<CSSParserSelector> innerSelector = consumeCompoundSelector(block);
    493             block.consumeWhitespace();
    494             if (!innerSelector || !block.atEnd())
    495                 return nullptr;
    496             Vector<std::unique_ptr<CSSParserSelector>> selectorVector;
    497             selectorVector.append(WTFMove(innerSelector));
    498             selector->adoptSelectorVector(selectorVector);
    499             return selector;
    500         }
    501         case CSSSelector::PseudoClassNthChild:
    502         case CSSSelector::PseudoClassNthLastChild:
    503         case CSSSelector::PseudoClassNthOfType:
    504         case CSSSelector::PseudoClassNthLastOfType: {
    505             std::pair<int, int> ab;
    506             if (!consumeANPlusB(block, ab))
    507                 return nullptr;
    508             block.consumeWhitespace();
    509             if (!block.atEnd())
    510                 return nullptr;
    511             selector->setArgument(AtomicString::number(ab.first * ab.second));
    512             return selector;
    513         }
    514         case CSSSelector::PseudoClassLang: {
    515             // FIXME: CSS Selectors Level 4 allows :lang(*-foo)
    516             auto argumentList = std::make_unique<Vector<AtomicString>>();
    517             consumeLangArgumentList(argumentList, block);
    518             if (argumentList->isEmpty())
    519                 return nullptr;
    520             selector->setLangArgumentList(WTFMove(argumentList));
    521             return selector;
    522         }
    523         // FIXME-NEWPARSER: Support :host-context
    524         case CSSSelector::PseudoClassAny:
    525         case CSSSelector::PseudoClassHost: {
    526             DisallowPseudoElementsScope scope(this);
    527             std::unique_ptr<CSSSelectorList> selectorList = std::unique_ptr<CSSSelectorList>(new CSSSelectorList());
    528             *selectorList = consumeCompoundSelectorList(block);
    529             if (!selectorList->isValid() || !block.atEnd())
    530                 return nullptr;
    531             selector->setSelectorList(WTFMove(selectorList));
    532             return selector;
    533         }
    534         default:
    535             break;
    536         }
    537     }
    538    
    539     if (selector->match() == CSSSelector::PseudoElement) {
    540         switch (selector->pseudoElementType()) {
    541         case CSSSelector::PseudoElementCue: {
    542             DisallowPseudoElementsScope scope(this);
    543             std::unique_ptr<CSSSelectorList> selectorList = std::unique_ptr<CSSSelectorList>(new CSSSelectorList());
    544             *selectorList = consumeCompoundSelectorList(block);
    545             if (!selectorList->isValid() || !block.atEnd())
    546                 return nullptr;
    547             selector->setSelectorList(WTFMove(selectorList));
    548             return selector;
    549         }
    550         case CSSSelector::PseudoElementSlotted: {
    551             DisallowPseudoElementsScope scope(this);
    552 
    553             std::unique_ptr<CSSParserSelector> innerSelector = consumeCompoundSelector(block);
    554             block.consumeWhitespace();
    555             if (!innerSelector || !block.atEnd())
    556                 return nullptr;
    557             Vector<std::unique_ptr<CSSParserSelector>> selectorVector;
    558             selectorVector.append(WTFMove(innerSelector));
    559             selector->adoptSelectorVector(selectorVector);
    560             return selector;
    561         }
    562         default:
    563             break;
    564         }
     472    switch (selector->pseudoClassType()) {
     473    case CSSSelector::PseudoClassNot: {
     474        std::unique_ptr<CSSParserSelector> innerSelector = consumeCompoundSelector(block);
     475        block.consumeWhitespace();
     476        if (!innerSelector || !block.atEnd())
     477            return nullptr;
     478        Vector<std::unique_ptr<CSSParserSelector>> selectorVector;
     479        selectorVector.append(WTFMove(innerSelector));
     480        selector->adoptSelectorVector(selectorVector);
     481        return selector;
     482    }
     483    case CSSSelector::PseudoClassNthChild:
     484    case CSSSelector::PseudoClassNthLastChild:
     485    case CSSSelector::PseudoClassNthOfType:
     486    case CSSSelector::PseudoClassNthLastOfType: {
     487        std::pair<int, int> ab;
     488        if (!consumeANPlusB(block, ab))
     489            return nullptr;
     490        block.consumeWhitespace();
     491        if (!block.atEnd())
     492            return nullptr;
     493        selector->setArgument(AtomicString::number(ab.first * ab.second));
     494        return selector;
     495    }
     496    case CSSSelector::PseudoClassLang: {
     497        // FIXME: CSS Selectors Level 4 allows :lang(*-foo)
     498        const CSSParserToken& ident = block.consumeIncludingWhitespace();
     499        if (ident.type() != IdentToken || !block.atEnd())
     500            return nullptr;
     501        selector->setArgument(ident.value().toAtomicString());
     502        return selector;
     503    }
     504    // FIXME-NEWPARSER: Support :host-context
     505    case CSSSelector::PseudoClassAny:
     506    case CSSSelector::PseudoClassHost: {
     507        DisallowPseudoElementsScope scope(this);
     508        std::unique_ptr<CSSSelectorList> selectorList = std::unique_ptr<CSSSelectorList>(new CSSSelectorList());
     509        *selectorList = consumeCompoundSelectorList(block);
     510        if (!selectorList->isValid() || !block.atEnd())
     511            return nullptr;
     512        selector->setSelectorList(WTFMove(selectorList));
     513        return selector;
     514    }
     515    default:
     516        break;
     517    }
     518
     519    switch (selector->pseudoElementType()) {
     520    case CSSSelector::PseudoElementCue: {
     521        DisallowPseudoElementsScope scope(this);
     522        std::unique_ptr<CSSSelectorList> selectorList = std::unique_ptr<CSSSelectorList>(new CSSSelectorList());
     523        *selectorList = consumeCompoundSelectorList(block);
     524        if (!selectorList->isValid() || !block.atEnd())
     525            return nullptr;
     526        selector->setSelectorList(WTFMove(selectorList));
     527        return selector;
     528    }
     529    case CSSSelector::PseudoElementSlotted: {
     530        DisallowPseudoElementsScope scope(this);
     531
     532        std::unique_ptr<CSSParserSelector> innerSelector = consumeCompoundSelector(block);
     533        block.consumeWhitespace();
     534        if (!innerSelector || !block.atEnd())
     535            return nullptr;
     536        Vector<std::unique_ptr<CSSParserSelector>> selectorVector;
     537        selectorVector.append(WTFMove(innerSelector));
     538        selector->adoptSelectorVector(selectorVector);
     539        return selector;
     540    }
     541    default:
     542        break;
    565543    }
    566544
Note: See TracChangeset for help on using the changeset viewer.