Slottable.h 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/String.h>
  8. #include <AK/Variant.h>
  9. #include <LibJS/Heap/Cell.h>
  10. #include <LibJS/Heap/GCPtr.h>
  11. #include <LibWeb/Forward.h>
  12. namespace Web::DOM {
  13. // https://dom.spec.whatwg.org/#concept-slotable
  14. using Slottable = Variant<JS::NonnullGCPtr<Element>, JS::NonnullGCPtr<Text>>;
  15. // https://dom.spec.whatwg.org/#mixin-slotable
  16. class SlottableMixin {
  17. public:
  18. virtual ~SlottableMixin();
  19. String const& slottable_name() const { return m_name; } // Not called `name` to distinguish from `Element::name`.
  20. void set_slottable_name(String name) { m_name = move(name); }
  21. JS::GCPtr<HTML::HTMLSlotElement> assigned_slot();
  22. JS::GCPtr<HTML::HTMLSlotElement> assigned_slot_internal() const { return m_assigned_slot; }
  23. void set_assigned_slot(JS::GCPtr<HTML::HTMLSlotElement> assigned_slot) { m_assigned_slot = assigned_slot; }
  24. JS::GCPtr<HTML::HTMLSlotElement> manual_slot_assignment() { return m_manual_slot_assignment; }
  25. void set_manual_slot_assignment(JS::GCPtr<HTML::HTMLSlotElement> manual_slot_assignment) { m_manual_slot_assignment = manual_slot_assignment; }
  26. protected:
  27. void visit_edges(JS::Cell::Visitor&);
  28. private:
  29. // https://dom.spec.whatwg.org/#slotable-name
  30. String m_name;
  31. // https://dom.spec.whatwg.org/#slotable-assigned-slot
  32. JS::GCPtr<HTML::HTMLSlotElement> m_assigned_slot;
  33. // https://dom.spec.whatwg.org/#slottable-manual-slot-assignment
  34. JS::GCPtr<HTML::HTMLSlotElement> m_manual_slot_assignment;
  35. };
  36. enum class OpenFlag {
  37. Set,
  38. Unset,
  39. };
  40. JS::GCPtr<HTML::HTMLSlotElement> assigned_slot_for_node(JS::NonnullGCPtr<Node>);
  41. bool is_an_assigned_slottable(JS::NonnullGCPtr<Node>);
  42. JS::GCPtr<HTML::HTMLSlotElement> find_a_slot(Slottable const&, OpenFlag = OpenFlag::Unset);
  43. Vector<Slottable> find_slottables(JS::NonnullGCPtr<HTML::HTMLSlotElement>);
  44. void assign_slottables(JS::NonnullGCPtr<HTML::HTMLSlotElement>);
  45. void assign_slottables_for_a_tree(JS::NonnullGCPtr<Node>);
  46. void assign_a_slot(Slottable const&);
  47. void signal_a_slot_change(JS::NonnullGCPtr<HTML::HTMLSlotElement>);
  48. }