Serenity Operating System
1/*
2 * Copyright (c) 2020-2022, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <LibWeb/DOM/Element.h>
10#include <LibWeb/Forward.h>
11
12namespace Web::HTML {
13
14class ListOfActiveFormattingElements {
15public:
16 ListOfActiveFormattingElements() = default;
17 ~ListOfActiveFormattingElements();
18
19 struct Entry {
20 bool is_marker() const { return !element; }
21
22 JS::GCPtr<DOM::Element> element;
23 };
24
25 bool is_empty() const { return m_entries.is_empty(); }
26 bool contains(const DOM::Element&) const;
27
28 void add(DOM::Element& element);
29 void add_marker();
30 void insert_at(size_t index, DOM::Element& element);
31
32 void replace(DOM::Element& to_remove, DOM::Element& to_add);
33
34 void remove(DOM::Element&);
35
36 Vector<Entry> const& entries() const { return m_entries; }
37 Vector<Entry>& entries() { return m_entries; }
38
39 DOM::Element* last_element_with_tag_name_before_marker(DeprecatedFlyString const& tag_name);
40
41 void clear_up_to_the_last_marker();
42
43 Optional<size_t> find_index(DOM::Element const&) const;
44
45 void visit_edges(JS::Cell::Visitor&);
46
47private:
48 Vector<Entry> m_entries;
49};
50
51}