diff options
Diffstat (limited to 'Source/WebCore/css/CSSSelector.cpp')
-rw-r--r-- | Source/WebCore/css/CSSSelector.cpp | 69 |
1 files changed, 54 insertions, 15 deletions
diff --git a/Source/WebCore/css/CSSSelector.cpp b/Source/WebCore/css/CSSSelector.cpp index c804697..a87d4f3 100644 --- a/Source/WebCore/css/CSSSelector.cpp +++ b/Source/WebCore/css/CSSSelector.cpp @@ -27,6 +27,7 @@ #include "CSSSelector.h" #include "CSSOMUtils.h" +#include "CSSSelectorList.h" #include "HTMLNames.h" #include <wtf/Assertions.h> #include <wtf/HashMap.h> @@ -78,9 +79,12 @@ inline unsigned CSSSelector::specificityForOneSelector() const case Contain: case Begin: case End: - if (pseudoType() == PseudoNot && simpleSelector()) - s += simpleSelector()->specificityForOneSelector(); - else + // FIXME: PsuedoAny should base the specificity on the sub-selectors. + // See http://lists.w3.org/Archives/Public/www-style/2010Sep/0530.html + if (pseudoType() == PseudoNot) { + ASSERT(selectorList()); + s += selectorList()->first()->specificityForOneSelector(); + } else s += 0x100; case None: break; @@ -211,6 +215,7 @@ PseudoId CSSSelector::pseudoId(PseudoType type) case PseudoNthLastOfType: case PseudoLink: case PseudoVisited: + case PseudoAny: case PseudoAnyLink: case PseudoAutofill: case PseudoHover: @@ -265,6 +270,7 @@ static HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoTypeMap( { DEFINE_STATIC_LOCAL(AtomicString, active, ("active")); DEFINE_STATIC_LOCAL(AtomicString, after, ("after")); + DEFINE_STATIC_LOCAL(AtomicString, any, ("-webkit-any(")); DEFINE_STATIC_LOCAL(AtomicString, anyLink, ("-webkit-any-link")); DEFINE_STATIC_LOCAL(AtomicString, autofill, ("-webkit-autofill")); DEFINE_STATIC_LOCAL(AtomicString, before, ("before")); @@ -364,6 +370,7 @@ static HashMap<AtomicStringImpl*, CSSSelector::PseudoType>* nameToPseudoTypeMap( nameToPseudoType->set(active.impl(), CSSSelector::PseudoActive); nameToPseudoType->set(after.impl(), CSSSelector::PseudoAfter); nameToPseudoType->set(anyLink.impl(), CSSSelector::PseudoAnyLink); + nameToPseudoType->set(any.impl(), CSSSelector::PseudoAny); nameToPseudoType->set(autofill.impl(), CSSSelector::PseudoAutofill); nameToPseudoType->set(before.impl(), CSSSelector::PseudoBefore); nameToPseudoType->set(checked.impl(), CSSSelector::PseudoChecked); @@ -527,6 +534,7 @@ void CSSSelector::extractPseudoType() const case PseudoNthLastOfType: case PseudoLink: case PseudoVisited: + case PseudoAny: case PseudoAnyLink: case PseudoAutofill: case PseudoHover: @@ -638,17 +646,33 @@ String CSSSelector::selectorText() const } else if (cs->m_match == CSSSelector::PseudoClass || cs->m_match == CSSSelector::PagePseudoClass) { str += ":"; str += cs->value(); - if (cs->pseudoType() == PseudoNot) { - if (CSSSelector* subSel = cs->simpleSelector()) - str += subSel->selectorText(); + + switch (cs->pseudoType()) { + case PseudoNot: + ASSERT(cs->selectorList()); + str += cs->selectorList()->first()->selectorText(); str += ")"; - } else if (cs->pseudoType() == PseudoLang - || cs->pseudoType() == PseudoNthChild - || cs->pseudoType() == PseudoNthLastChild - || cs->pseudoType() == PseudoNthOfType - || cs->pseudoType() == PseudoNthLastOfType) { + break; + case PseudoLang: + case PseudoNthChild: + case PseudoNthLastChild: + case PseudoNthOfType: + case PseudoNthLastOfType: str += cs->argument(); str += ")"; + break; + case PseudoAny: { + CSSSelector* firstSubSelector = cs->selectorList()->first(); + for (CSSSelector* subSelector = firstSubSelector; subSelector; subSelector = CSSSelectorList::next(subSelector)) { + if (subSelector != firstSubSelector) + str += ","; + str += subSelector->selectorText(); + } + str += ")"; + break; + } + default: + break; } } else if (cs->m_match == CSSSelector::PseudoElement) { str += "::"; @@ -736,11 +760,11 @@ void CSSSelector::setArgument(const AtomicString& value) createRareData(); m_data.m_rareData->m_argument = value; } - -void CSSSelector::setSimpleSelector(PassOwnPtr<CSSSelector> value) + +void CSSSelector::setSelectorList(PassOwnPtr<CSSSelectorList> selectorList) { createRareData(); - m_data.m_rareData->m_simpleSelector = value; + m_data.m_rareData->m_selectorList = selectorList; } bool CSSSelector::parseNth() @@ -761,7 +785,7 @@ bool CSSSelector::matchNth(int count) bool CSSSelector::isSimple() const { - if (simpleSelector() || tagHistory() || matchesPseudoElement()) + if (selectorList() || tagHistory() || matchesPseudoElement()) return false; int numConditions = 0; @@ -784,6 +808,21 @@ bool CSSSelector::isSimple() const return numConditions <= 1; } +CSSSelector::RareData::RareData(PassRefPtr<AtomicStringImpl> value) + : m_value(value.leakRef()) + , m_a(0) + , m_b(0) + , m_attribute(anyQName()) + , m_argument(nullAtom) +{ +} + +CSSSelector::RareData::~RareData() +{ + if (m_value) + m_value->deref(); +} + // a helper function for parsing nth-arguments bool CSSSelector::RareData::parseNth() { |