/* * 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 #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 WebIDL::ExceptionOr> 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(DeprecatedFlyString 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(StringView qualified_name) const; Attr const* get_named_item_ns(StringView namespace_, StringView local_name) const; WebIDL::ExceptionOr> set_named_item(Attr& attribute); WebIDL::ExceptionOr> set_named_item_ns(Attr& attribute); WebIDL::ExceptionOr remove_named_item(StringView qualified_name); WebIDL::ExceptionOr remove_named_item_ns(StringView namespace_, StringView local_name); // Methods defined by the spec for internal use: Attr* get_attribute(StringView qualified_name, size_t* item_index = nullptr); Attr* get_attribute_ns(StringView namespace_, StringView local_name, size_t* item_index = nullptr); Attr const* get_attribute(StringView qualified_name, size_t* item_index = nullptr) const; Attr const* get_attribute_ns(StringView namespace_, StringView local_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 const* remove_attribute(StringView qualified_name); Attr const* remove_attribute_ns(StringView namespace_, StringView local_name); private: explicit NamedNodeMap(Element&); virtual JS::ThrowCompletionOr initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; // ^Bindings::LegacyPlatformObject virtual bool supports_indexed_properties() const override { return true; } virtual bool supports_named_properties() const override { return true; } virtual bool has_indexed_property_setter() const override { return false; } virtual bool has_named_property_setter() const override { return false; } virtual bool has_named_property_deleter() const override { return false; } virtual bool has_legacy_override_built_ins_interface_extended_attribute() const override { return false; } virtual bool has_legacy_unenumerable_named_properties_interface_extended_attribute() const override { return true; } virtual bool has_global_interface_extended_attribute() const override { return false; } virtual bool indexed_property_setter_has_identifier() const override { return false; } virtual bool named_property_setter_has_identifier() const override { return false; } virtual bool named_property_deleter_has_identifier() const override { return false; } 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; }; }