/* * Copyright (c) 2025, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace Web::DOM { // Either an Element or a PseudoElement class AbstractElement { public: AbstractElement(GC::Ref, Optional = {}); Element& element() { return m_element; } Element const& element() const { return m_element; } Optional pseudo_element() const { return m_pseudo_element; } GC::Ptr layout_node(); GC::Ptr layout_node() const { return const_cast(this)->layout_node(); } GC::Ptr parent_element() const; Optional previous_in_tree_order() { return walk_layout_tree(WalkMethod::Previous); } Optional previous_sibling_in_tree_order() { return walk_layout_tree(WalkMethod::PreviousSibling); } bool is_before(AbstractElement const&) const; GC::Ptr computed_properties() const; bool has_non_empty_counters_set() const; Optional counters_set() const; CSS::CountersSet& ensure_counters_set(); void set_counters_set(OwnPtr&&); void visit(GC::Cell::Visitor& visitor) const; String debug_description() const; bool operator==(AbstractElement const&) const = default; private: enum class WalkMethod : u8 { Previous, PreviousSibling, }; Optional walk_layout_tree(WalkMethod); GC::Ref m_element; Optional m_pseudo_element; }; }