#pragma once
#include "CSSParserToken.h"
#include "CSSParserTokenRange.h"
#include <wtf/text/WTFString.h>
namespace WebCore {
class CSSParserTokenRange;
class CSSVariableData : public RefCounted<CSSVariableData> {
WTF_MAKE_NONCOPYABLE(CSSVariableData);
WTF_MAKE_FAST_ALLOCATED;
public:
static Ref<CSSVariableData> create(const CSSParserTokenRange& range, bool needsVariableResolution = true)
{
return adoptRef(*new CSSVariableData(range, needsVariableResolution));
}
static Ref<CSSVariableData> createResolved(const Vector<CSSParserToken>& resolvedTokens, const CSSVariableData& unresolvedData)
{
return adoptRef(*new CSSVariableData(resolvedTokens, unresolvedData.m_backingString));
}
CSSParserTokenRange tokenRange() { return m_tokens; }
const Vector<CSSParserToken>& tokens() const { return m_tokens; }
bool operator==(const CSSVariableData& other) const;
bool needsVariableResolution() const { return m_needsVariableResolution; }
bool checkVariablesForCycles(const AtomicString& name, CustomPropertyValueMap&, HashSet<AtomicString>& seenProperties, HashSet<AtomicString>& invalidProperties) const;
RefPtr<CSSVariableData> resolveVariableReferences(const CustomPropertyValueMap& customProperties) const;
bool resolveTokenRange(const CustomPropertyValueMap&, CSSParserTokenRange, Vector<CSSParserToken>&) const;
private:
CSSVariableData(const CSSParserTokenRange&, bool needsVariableResolution);
CSSVariableData(const Vector<CSSParserToken>& resolvedTokens, String backingString)
: m_backingString(backingString)
, m_tokens(resolvedTokens)
, m_needsVariableResolution(false)
{ }
void consumeAndUpdateTokens(const CSSParserTokenRange&);
template<typename CharacterType> void updateTokens(const CSSParserTokenRange&);
bool checkVariablesForCyclesWithRange(CSSParserTokenRange, CustomPropertyValueMap&, HashSet<AtomicString>& seenProperties, HashSet<AtomicString>& invalidProperties) const;
bool resolveVariableReference(const CustomPropertyValueMap&, CSSParserTokenRange, Vector<CSSParserToken>&) const;
bool resolveVariableFallback(const CustomPropertyValueMap&, CSSParserTokenRange, Vector<CSSParserToken>&) const;
String m_backingString;
Vector<CSSParserToken> m_tokens;
const bool m_needsVariableResolution;
};
}