
This introduces 3 classes: NodeList, StaticNodeList and LiveNodeList. NodeList is the base of the static and live versions. Static is a snapshot whereas live acts on the underlying data and thus inhibits the same issues we have currently with HTMLCollection. They were split into separate classes to not have them weirdly mis-mashed together. The create functions for static and live both return a NNRP to the base class. This is to prevent having to do awkward casting at creation and/or return, as the bindings expect to see the base NodeList only.
54 lines
1.5 KiB
C++
54 lines
1.5 KiB
C++
/*
|
||
* Copyright (c) 2021, Luke Wilde <lukew@serenityos.org>
|
||
*
|
||
* SPDX-License-Identifier: BSD-2-Clause
|
||
*/
|
||
|
||
#include <LibWeb/DOM/LiveNodeList.h>
|
||
#include <LibWeb/DOM/Node.h>
|
||
|
||
namespace Web::DOM {
|
||
|
||
LiveNodeList::LiveNodeList(Node& root, Function<bool(Node const&)> filter)
|
||
: m_root(root)
|
||
, m_filter(move(filter))
|
||
{
|
||
}
|
||
|
||
NonnullRefPtrVector<Node> LiveNodeList::collection() const
|
||
{
|
||
NonnullRefPtrVector<Node> nodes;
|
||
m_root->for_each_in_inclusive_subtree_of_type<Node>([&](auto& node) {
|
||
if (m_filter(node))
|
||
nodes.append(node);
|
||
|
||
return IterationDecision::Continue;
|
||
});
|
||
return nodes;
|
||
}
|
||
|
||
// https://dom.spec.whatwg.org/#dom-nodelist-length
|
||
u32 LiveNodeList::length() const
|
||
{
|
||
return collection().size();
|
||
}
|
||
|
||
// https://dom.spec.whatwg.org/#dom-nodelist-item
|
||
Node const* LiveNodeList::item(u32 index) const
|
||
{
|
||
// The item(index) method must return the indexth node in the collection. If there is no indexth node in the collection, then the method must return null.
|
||
auto nodes = collection();
|
||
if (index >= nodes.size())
|
||
return nullptr;
|
||
return &nodes[index];
|
||
}
|
||
|
||
// https://dom.spec.whatwg.org/#ref-for-dfn-supported-property-indices
|
||
bool LiveNodeList::is_supported_property_index(u32 index) const
|
||
{
|
||
// The object’s supported property indices are the numbers in the range zero to one less than the number of nodes represented by the collection.
|
||
// If there are no such elements, then there are no supported property indices.
|
||
return index < length();
|
||
}
|
||
|
||
}
|