#pragma once
#include "Node.h"
#include "StyleChange.h"
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
#include <wtf/ListHashSet.h>
namespace WebCore {
class ContainerNode;
class Document;
class Element;
class Node;
class RenderStyle;
class Text;
namespace Style {
struct ElementUpdate {
std::unique_ptr<RenderStyle> style;
Change change { NoChange };
bool recompositeLayer { false };
};
enum class DescendantsToResolve { None, ChildrenWithExplicitInherit, Children, All };
struct ElementUpdates {
ElementUpdate update;
DescendantsToResolve descendantsToResolve { DescendantsToResolve::None };
std::optional<ElementUpdate> beforePseudoElementUpdate;
std::optional<ElementUpdate> afterPseudoElementUpdate;
};
struct TextUpdate {
unsigned offset { 0 };
unsigned length { std::numeric_limits<unsigned>::max() };
std::optional<std::unique_ptr<RenderStyle>> inheritedDisplayContentsStyle;
};
class Update {
WTF_MAKE_FAST_ALLOCATED;
public:
Update(Document&);
const ListHashSet<ContainerNode*>& roots() const { return m_roots; }
const ElementUpdates* elementUpdates(const Element&) const;
ElementUpdates* elementUpdates(const Element&);
const TextUpdate* textUpdate(const Text&) const;
const RenderStyle* elementStyle(const Element&) const;
RenderStyle* elementStyle(const Element&);
const Document& document() const { return m_document; }
unsigned size() const { return m_elements.size() + m_texts.size(); }
void addElement(Element&, Element* parent, ElementUpdates&&);
void addText(Text&, Element* parent, TextUpdate&&);
void addText(Text&, TextUpdate&&);
private:
void addPossibleRoot(Element*);
Document& m_document;
ListHashSet<ContainerNode*> m_roots;
HashMap<const Element*, ElementUpdates> m_elements;
HashMap<const Text*, TextUpdate> m_texts;
};
}
}