StyleInvalidator.h [plain text]
#pragma once
#include "RuleFeature.h"
#include "RuleSet.h"
#include <wtf/Forward.h>
#include <wtf/HashMap.h>
namespace WebCore {
class Document;
class Element;
class MediaQueryEvaluator;
class Scope;
class SelectorFilter;
class ShadowRoot;
class StyleSheetContents;
namespace Style {
struct InvalidationRuleSet;
class Invalidator {
public:
Invalidator(const Vector<StyleSheetContents*>&, const MediaQueryEvaluator&);
Invalidator(const InvalidationRuleSetVector&);
~Invalidator();
bool dirtiesAllStyle() const { return m_dirtiesAllStyle; }
void invalidateStyle(Document&);
void invalidateStyle(Scope&);
void invalidateStyle(ShadowRoot&);
void invalidateStyle(Element&);
static void invalidateShadowParts(ShadowRoot&);
using MatchElementRuleSets = HashMap<MatchElement, InvalidationRuleSetVector, WTF::IntHash<MatchElement>, WTF::StrongEnumHashTraits<MatchElement>>;
static void addToMatchElementRuleSets(Invalidator::MatchElementRuleSets&, const InvalidationRuleSet&);
static void invalidateWithMatchElementRuleSets(Element&, const MatchElementRuleSets&);
static void invalidateAllStyle(Scope&);
static void invalidateHostAndSlottedStyleIfNeeded(ShadowRoot&);
private:
enum class CheckDescendants { Yes, No };
CheckDescendants invalidateIfNeeded(Element&, const SelectorFilter*);
void invalidateStyleForTree(Element&, SelectorFilter*);
void invalidateStyleForDescendants(Element&, SelectorFilter*);
void invalidateInShadowTreeIfNeeded(Element&);
void invalidateStyleWithMatchElement(Element&, MatchElement);
struct RuleInformation {
bool hasSlottedPseudoElementRules { false };
bool hasHostPseudoClassRules { false };
bool hasShadowPseudoElementRules { false };
bool hasPartPseudoElementRules { false };
};
RuleInformation collectRuleInformation();
RefPtr<RuleSet> m_ownedRuleSet;
const InvalidationRuleSetVector m_ruleSets;
RuleInformation m_ruleInformation;
bool m_dirtiesAllStyle { false };
bool m_didInvalidateHostChildren { false };
};
}
}