/* * Copyright (c) 2021, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include namespace Web::DOM { // https://dom.spec.whatwg.org/#interface-namednodemap class NamedNodeMap final : public RefCountForwarder , public Bindings::Wrappable { public: using WrapperType = Bindings::NamedNodeMapWrapper; static NonnullRefPtr create(Element& associated_element); ~NamedNodeMap() = default; bool is_supported_property_index(u32 index) const; Vector supported_property_names() const; size_t length() const { return m_attributes.size(); } bool is_empty() const { return m_attributes.is_empty(); } // Methods defined by the spec for JavaScript: Attribute const* item(u32 index) const; Attribute const* get_named_item(StringView qualified_name) const; ExceptionOr set_named_item(Attribute& attribute); ExceptionOr remove_named_item(StringView qualified_name); // Methods defined by the spec for internal use: Attribute* get_attribute(StringView qualified_name, size_t* item_index = nullptr); Attribute const* get_attribute(StringView qualified_name, size_t* item_index = nullptr) const; ExceptionOr set_attribute(Attribute& attribute); void replace_attribute(Attribute& old_attribute, Attribute& new_attribute, size_t old_attribute_index); void append_attribute(Attribute& attribute); Attribute const* remove_attribute(StringView qualified_name); private: explicit NamedNodeMap(Element& associated_element); Element& associated_element() { return ref_count_target(); } Element const& associated_element() const { return ref_count_target(); } NonnullRefPtrVector m_attributes; }; } namespace Web::Bindings { NamedNodeMapWrapper* wrap(JS::GlobalObject&, DOM::NamedNodeMap&); }