/* * Copyright (c) 2021, Tim Flynn * Copyright (c) 2022, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Web::DOM { // https://dom.spec.whatwg.org/#interface-namednodemap class NamedNodeMap : public Bindings::LegacyPlatformObject { WEB_PLATFORM_OBJECT(NamedNodeMap, Bindings::LegacyPlatformObject); public: static JS::NonnullGCPtr create(Element&); ~NamedNodeMap() = default; virtual bool is_supported_property_index(u32 index) const override; virtual Vector supported_property_names() const override; virtual JS::Value item_value(size_t index) const override; virtual JS::Value named_item_value(FlyString const& name) const override; 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&); virtual void visit_edges(Cell::Visitor&) override; Element& associated_element() { return *m_element; } Element const& associated_element() const { return *m_element; } void remove_attribute_at_index(size_t attribute_index); JS::NonnullGCPtr m_element; Vector> m_attributes; }; } WRAPPER_HACK(NamedNodeMap, Web::DOM)