#ifndef CSSSelector_H
#define CSSSelector_H
#include "QualifiedName.h"
namespace WebCore {
class CSSSelector
{
public:
CSSSelector()
: tagHistory(0)
, simpleSelector(0)
, nextSelector(0)
, argument(nullAtom)
, attr(anyQName())
, tag(anyQName())
, m_relation(Descendant)
, match(None)
, pseudoId(0)
, _pseudoType(PseudoNotParsed)
{}
CSSSelector(const QualifiedName& qName)
: tagHistory(0)
, simpleSelector(0)
, nextSelector(0)
, argument(nullAtom)
, attr(anyQName())
, tag(qName)
, m_relation(Descendant)
, match(None)
, pseudoId(0)
, _pseudoType(PseudoNotParsed)
{}
~CSSSelector() {
delete tagHistory;
delete simpleSelector;
delete nextSelector;
}
void append(CSSSelector* n) {
CSSSelector* end = this;
while (end->nextSelector)
end = end->nextSelector;
end->nextSelector = n;
}
CSSSelector* next() { return nextSelector; }
void print();
String selectorText() const;
bool operator ==(const CSSSelector&);
unsigned specificity();
enum Match {
None = 0,
Id,
Class,
Exact,
Set,
List,
Hyphen,
PseudoClass,
PseudoElement,
Contain, Begin, End };
enum Relation {
Descendant = 0,
Child,
DirectAdjacent,
IndirectAdjacent,
SubSelector
};
enum PseudoType {
PseudoNotParsed = 0,
PseudoUnknown,
PseudoEmpty,
PseudoFirstChild,
PseudoFirstOfType,
PseudoLastChild,
PseudoLastOfType,
PseudoOnlyChild,
PseudoOnlyOfType,
PseudoFirstLine,
PseudoFirstLetter,
PseudoLink,
PseudoVisited,
PseudoAnyLink,
PseudoAutofill,
PseudoHover,
PseudoDrag,
PseudoFocus,
PseudoActive,
PseudoChecked,
PseudoEnabled,
PseudoDisabled,
PseudoIndeterminate,
PseudoTarget,
PseudoBefore,
PseudoAfter,
PseudoLang,
PseudoNot,
PseudoRoot,
PseudoSelection,
PseudoFileUploadButton,
PseudoSliderThumb,
PseudoSearchCancelButton,
PseudoSearchDecoration,
PseudoSearchResultsDecoration,
PseudoSearchResultsButton
};
PseudoType pseudoType() const
{
if (_pseudoType == PseudoNotParsed)
extractPseudoType();
return static_cast<PseudoType>(_pseudoType);
}
bool hasTag() const { return tag != anyQName(); }
bool hasAttribute() const { return attr != anyQName(); }
mutable AtomicString value;
CSSSelector* tagHistory;
CSSSelector* simpleSelector; CSSSelector* nextSelector; AtomicString argument;
QualifiedName attr;
QualifiedName tag;
Relation relation() const { return static_cast<Relation>(m_relation); }
unsigned m_relation : 3; mutable unsigned match : 4; unsigned pseudoId : 3;
mutable unsigned _pseudoType : 5;
private:
void extractPseudoType() const;
};
}
#endif