ladybird/Userland/Libraries/LibWeb/DOM/NamedNodeMap.h
Timothy Flynn b67f6daf05 LibWeb: Weakly store NamedNodeMap's & Attribute's associated Element
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.
2021-10-18 09:58:52 +02:00

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&);
}