/* * Copyright (c) 2023, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace Web::DOM { // https://dom.spec.whatwg.org/#concept-slotable using Slottable = Variant, GC::Ref>; // https://dom.spec.whatwg.org/#mixin-slotable class SlottableMixin { public: virtual ~SlottableMixin(); String const& slottable_name() const { return m_name; } // Not called `name` to distinguish from `Element::name`. void set_slottable_name(String name) { m_name = move(name); } GC::Ptr assigned_slot(); GC::Ptr assigned_slot_internal() const { return m_assigned_slot; } void set_assigned_slot(GC::Ptr assigned_slot) { m_assigned_slot = assigned_slot; } GC::Ptr manual_slot_assignment() { return m_manual_slot_assignment; } void set_manual_slot_assignment(GC::Ptr manual_slot_assignment) { m_manual_slot_assignment = manual_slot_assignment; } protected: void visit_edges(JS::Cell::Visitor&); private: // https://dom.spec.whatwg.org/#slotable-name String m_name; // https://dom.spec.whatwg.org/#slotable-assigned-slot GC::Ptr m_assigned_slot; // https://dom.spec.whatwg.org/#slottable-manual-slot-assignment GC::Ptr m_manual_slot_assignment; }; enum class OpenFlag { Set, Unset, }; GC::Ptr assigned_slot_for_node(GC::Ref); bool is_an_assigned_slottable(GC::Ref); GC::Ptr find_a_slot(Slottable const&, OpenFlag = OpenFlag::Unset); Vector find_slottables(GC::Ref); void assign_slottables(GC::Ref); void assign_slottables_for_a_tree(GC::Ref); void assign_a_slot(Slottable const&); void signal_a_slot_change(GC::Ref); }