/* * Copyright (c) 2021, Tim Flynn * Copyright (c) 2022, Andreas Kling * Copyright (c) 2022, Alexander Narsudinov * Copyright (c) 2023, Luke Wilde * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace Web::DOM { // https://dom.spec.whatwg.org/#interface-namednodemap class NamedNodeMap : public Bindings::PlatformObject { WEB_PLATFORM_OBJECT(NamedNodeMap, Bindings::PlatformObject); JS_DECLARE_ALLOCATOR(NamedNodeMap); public: [[nodiscard]] 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 WebIDL::ExceptionOr item_value(size_t index) const override; virtual WebIDL::ExceptionOr 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: Attr const* item(u32 index) const; Attr const* get_named_item(FlyString const& qualified_name) const; Attr const* get_named_item_ns(Optional const& namespace_, FlyString const& local_name) const; WebIDL::ExceptionOr> set_named_item(Attr& attribute); WebIDL::ExceptionOr> set_named_item_ns(Attr& attribute); WebIDL::ExceptionOr remove_named_item(FlyString const& qualified_name); WebIDL::ExceptionOr remove_named_item_ns(Optional const& namespace_, FlyString const& local_name); // Methods defined by the spec for internal use: Attr* get_attribute(FlyString const& qualified_name, size_t* item_index = nullptr); Attr const* get_attribute(FlyString const& qualified_name, size_t* item_index = nullptr) const; WebIDL::ExceptionOr> set_attribute(Attr& attribute); void replace_attribute(Attr& old_attribute, Attr& new_attribute, size_t old_attribute_index); void append_attribute(Attr& attribute); Attr* get_attribute_ns(Optional const& namespace_, FlyString const& local_name, size_t* item_index = nullptr); Attr const* get_attribute_ns(Optional const& namespace_, FlyString const& local_name, size_t* item_index = nullptr) const; Attr const* remove_attribute(FlyString const& qualified_name); Attr const* remove_attribute_ns(Optional const& namespace_, FlyString const& local_name); Attr const* get_attribute_with_lowercase_qualified_name(FlyString const&) const; WebIDL::ExceptionOr> remove_attribute_node(JS::NonnullGCPtr); private: explicit NamedNodeMap(Element&); virtual void initialize(JS::Realm&) override; 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; }; }