#ifndef CSSRuleList_h
#define CSSRuleList_h
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
#include <wtf/Vector.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
class CSSRule;
class CSSStyleSheet;
class CSSRuleList {
WTF_MAKE_NONCOPYABLE(CSSRuleList); WTF_MAKE_FAST_ALLOCATED;
public:
virtual ~CSSRuleList();
virtual void ref() = 0;
virtual void deref() = 0;
virtual unsigned length() const = 0;
virtual CSSRule* item(unsigned index) const = 0;
virtual CSSStyleSheet* styleSheet() const = 0;
protected:
CSSRuleList();
};
class StaticCSSRuleList final : public CSSRuleList {
public:
static Ref<StaticCSSRuleList> create() { return adoptRef(*new StaticCSSRuleList); }
virtual void ref() override { ++m_refCount; }
virtual void deref() override;
Vector<RefPtr<CSSRule>>& rules() { return m_rules; }
virtual CSSStyleSheet* styleSheet() const override { return nullptr; }
private:
StaticCSSRuleList();
~StaticCSSRuleList();
virtual unsigned length() const override { return m_rules.size(); }
virtual CSSRule* item(unsigned index) const override { return index < m_rules.size() ? m_rules[index].get() : nullptr; }
Vector<RefPtr<CSSRule>> m_rules;
unsigned m_refCount;
};
template <class Rule>
class LiveCSSRuleList final : public CSSRuleList {
public:
LiveCSSRuleList(Rule* rule) : m_rule(rule) { }
virtual void ref() override { m_rule->ref(); }
virtual void deref() override { m_rule->deref(); }
private:
virtual unsigned length() const override { return m_rule->length(); }
virtual CSSRule* item(unsigned index) const override { return m_rule->item(index); }
virtual CSSStyleSheet* styleSheet() const override { return m_rule->parentStyleSheet(); }
Rule* m_rule;
};
}
#endif // CSSRuleList_h