/* * Copyright (c) 2021, Luke Wilde * Copyright (c) 2022, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace Web::DOM { // FIXME: Just like HTMLCollection, LiveNodeList currently does no caching. class LiveNodeList : public NodeList { WEB_PLATFORM_OBJECT(LiveNodeList, NodeList); GC_DECLARE_ALLOCATOR(LiveNodeList); public: enum class Scope { Children, Descendants, }; [[nodiscard]] static GC::Ref create(JS::Realm&, Node const& root, Scope, ESCAPING Function filter); virtual ~LiveNodeList() override; virtual u32 length() const override; virtual Node const* item(u32 index) const override; protected: LiveNodeList(JS::Realm&, Node const& root, Scope, ESCAPING Function filter); Node* first_matching(Function const& filter) const; private: virtual void visit_edges(Cell::Visitor&) override; GC::RootVector collection() const; GC::Ref m_root; Function m_filter; Scope m_scope { Scope::Descendants }; }; }