/src/serenity/Userland/Libraries/LibWeb/DOM/Attr.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> |
3 | | * |
4 | | * SPDX-License-Identifier: BSD-2-Clause |
5 | | */ |
6 | | |
7 | | #pragma once |
8 | | |
9 | | #include <AK/WeakPtr.h> |
10 | | #include <LibWeb/DOM/Node.h> |
11 | | #include <LibWeb/DOM/QualifiedName.h> |
12 | | |
13 | | namespace Web::DOM { |
14 | | |
15 | | // https://dom.spec.whatwg.org/#attr |
16 | | class Attr final : public Node { |
17 | | WEB_PLATFORM_OBJECT(Attr, Node); |
18 | | JS_DECLARE_ALLOCATOR(Attr); |
19 | | |
20 | | public: |
21 | | [[nodiscard]] static JS::NonnullGCPtr<Attr> create(Document&, QualifiedName, String value = {}, Element* = nullptr); |
22 | | [[nodiscard]] static JS::NonnullGCPtr<Attr> create(Document&, FlyString local_name, String value = {}, Element* = nullptr); |
23 | | JS::NonnullGCPtr<Attr> clone(Document&); |
24 | | |
25 | 0 | virtual ~Attr() override = default; |
26 | | |
27 | 0 | virtual FlyString node_name() const override { return name(); } |
28 | | |
29 | 0 | Optional<FlyString> const& namespace_uri() const { return m_qualified_name.namespace_(); } |
30 | 0 | Optional<FlyString> const& prefix() const { return m_qualified_name.prefix(); } |
31 | 0 | FlyString const& local_name() const { return m_qualified_name.local_name(); } |
32 | 0 | FlyString const& name() const { return m_qualified_name.as_string(); } |
33 | 0 | FlyString const& lowercase_name() const { return m_lowercase_name; } |
34 | | |
35 | 0 | String const& value() const { return m_value; } |
36 | | void set_value(String value); |
37 | | void change_attribute(String value); |
38 | | |
39 | | Element* owner_element(); |
40 | | Element const* owner_element() const; |
41 | | void set_owner_element(Element* owner_element); |
42 | | |
43 | | // Always returns true: https://dom.spec.whatwg.org/#dom-attr-specified |
44 | 0 | constexpr bool specified() const { return true; } |
45 | | |
46 | | void handle_attribute_changes(Element&, Optional<String> const& old_value, Optional<String> const& new_value); |
47 | | |
48 | | private: |
49 | | Attr(Document&, QualifiedName, String value, Element*); |
50 | | |
51 | | virtual void initialize(JS::Realm&) override; |
52 | | virtual void visit_edges(Cell::Visitor&) override; |
53 | | |
54 | | QualifiedName m_qualified_name; |
55 | | FlyString m_lowercase_name; |
56 | | String m_value; |
57 | | JS::GCPtr<Element> m_owner_element; |
58 | | }; |
59 | | |
60 | | template<> |
61 | 0 | inline bool Node::fast_is<Attr>() const { return is_attribute(); } |
62 | | |
63 | | } |