
This is similar to how Gecko avoids a reference cycle, where both the NamedNodeMap and Attribute would otherwise store a strong reference to their associated Element. Gecko manually clears stored raw references when an Element is destroyed, whereas we use weak references to do so automatically. Attribute's ownerElement getter and setter are moved out of line to avoid an #include cycle between Element and Attribute.
64 lines
2 KiB
C++
64 lines
2 KiB
C++
/*
|
|
* Copyright (c) 2021, Tim Flynn <trflynn89@pm.me>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/NonnullRefPtrVector.h>
|
|
#include <AK/RefCounted.h>
|
|
#include <AK/String.h>
|
|
#include <AK/StringView.h>
|
|
#include <AK/WeakPtr.h>
|
|
#include <LibWeb/Bindings/Wrappable.h>
|
|
#include <LibWeb/DOM/ExceptionOr.h>
|
|
#include <LibWeb/Forward.h>
|
|
|
|
namespace Web::DOM {
|
|
|
|
// https://dom.spec.whatwg.org/#interface-namednodemap
|
|
class NamedNodeMap final
|
|
: public RefCounted<NamedNodeMap>
|
|
, public Bindings::Wrappable {
|
|
|
|
public:
|
|
using WrapperType = Bindings::NamedNodeMapWrapper;
|
|
|
|
static NonnullRefPtr<NamedNodeMap> create(Element const& associated_element);
|
|
~NamedNodeMap() = default;
|
|
|
|
bool is_supported_property_index(u32 index) const;
|
|
Vector<String> 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<Attribute const*> set_named_item(Attribute& attribute);
|
|
ExceptionOr<Attribute const*> 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<Attribute const*> 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 const& associated_element);
|
|
|
|
WeakPtr<Element> m_associated_element;
|
|
NonnullRefPtrVector<Attribute> m_attributes;
|
|
};
|
|
|
|
}
|
|
|
|
namespace Web::Bindings {
|
|
|
|
NamedNodeMapWrapper* wrap(JS::GlobalObject&, DOM::NamedNodeMap&);
|
|
|
|
}
|