CSSSelectorParser.h [plain text]
#pragma once
#include "CSSParserSelector.h"
#include "CSSParserTokenRange.h"
#include <memory>
namespace WebCore {
struct CSSParserContext;
class CSSSelectorList;
class StyleSheetContents;
class CSSSelectorParser {
public:
static CSSSelectorList parseSelector(CSSParserTokenRange, const CSSParserContext&, StyleSheetContents*);
static bool consumeANPlusB(CSSParserTokenRange&, std::pair<int, int>&);
private:
CSSSelectorParser(const CSSParserContext&, StyleSheetContents*);
CSSSelectorList consumeComplexSelectorList(CSSParserTokenRange&);
CSSSelectorList consumeCompoundSelectorList(CSSParserTokenRange&);
std::unique_ptr<CSSParserSelector> consumeComplexSelector(CSSParserTokenRange&);
std::unique_ptr<CSSParserSelector> consumeCompoundSelector(CSSParserTokenRange&);
std::unique_ptr<CSSParserSelector> consumeSimpleSelector(CSSParserTokenRange&);
bool consumeName(CSSParserTokenRange&, AtomicString& name, AtomicString& namespacePrefix);
std::unique_ptr<CSSParserSelector> consumeId(CSSParserTokenRange&);
std::unique_ptr<CSSParserSelector> consumeClass(CSSParserTokenRange&);
std::unique_ptr<CSSParserSelector> consumePseudo(CSSParserTokenRange&);
std::unique_ptr<CSSParserSelector> consumeAttribute(CSSParserTokenRange&);
CSSSelector::RelationType consumeCombinator(CSSParserTokenRange&);
CSSSelector::Match consumeAttributeMatch(CSSParserTokenRange&);
CSSSelector::AttributeMatchType consumeAttributeFlags(CSSParserTokenRange&);
const AtomicString& defaultNamespace() const;
const AtomicString& determineNamespace(const AtomicString& prefix);
void prependTypeSelectorIfNeeded(const AtomicString& namespacePrefix, const AtomicString& elementName, CSSParserSelector*);
static std::unique_ptr<CSSParserSelector> addSimpleSelectorToCompound(std::unique_ptr<CSSParserSelector> compoundSelector, std::unique_ptr<CSSParserSelector> simpleSelector);
static std::unique_ptr<CSSParserSelector> splitCompoundAtImplicitShadowCrossingCombinator(std::unique_ptr<CSSParserSelector> compoundSelector, const CSSParserContext&);
const CSSParserContext& m_context;
RefPtr<StyleSheetContents> m_styleSheet;
bool m_failedParsing = false;
bool m_disallowPseudoElements = false;
class DisallowPseudoElementsScope {
WTF_MAKE_NONCOPYABLE(DisallowPseudoElementsScope);
public:
DisallowPseudoElementsScope(CSSSelectorParser* parser)
: m_parser(parser), m_wasDisallowed(m_parser->m_disallowPseudoElements)
{
m_parser->m_disallowPseudoElements = true;
}
~DisallowPseudoElementsScope()
{
m_parser->m_disallowPseudoElements = m_wasDisallowed;
}
private:
CSSSelectorParser* m_parser;
bool m_wasDisallowed;
};
};
}