diff --git a/Userland/Libraries/LibWeb/DOM/HTMLCollection.cpp b/Userland/Libraries/LibWeb/DOM/HTMLCollection.cpp
index 8728e9503fb..c639a72bcfd 100644
--- a/Userland/Libraries/LibWeb/DOM/HTMLCollection.cpp
+++ b/Userland/Libraries/LibWeb/DOM/HTMLCollection.cpp
@@ -50,26 +50,32 @@ void HTMLCollection::visit_edges(Cell::Visitor& visitor)
visitor.visit(element);
}
+void HTMLCollection::update_cache_if_needed() const
+{
+ // Nothing to do, the DOM hasn't updated since we last built the cache.
+ if (m_cached_dom_tree_version == root()->document().dom_tree_version())
+ return;
+
+ m_cached_elements.clear();
+ if (m_scope == Scope::Descendants) {
+ m_root->for_each_in_subtree_of_type([&](auto& element) {
+ if (m_filter(element))
+ m_cached_elements.append(element);
+ return IterationDecision::Continue;
+ });
+ } else {
+ m_root->for_each_child_of_type([&](auto& element) {
+ if (m_filter(element))
+ m_cached_elements.append(element);
+ return IterationDecision::Continue;
+ });
+ }
+ m_cached_dom_tree_version = root()->document().dom_tree_version();
+}
+
JS::MarkedVector> HTMLCollection::collect_matching_elements() const
{
- if (m_cached_dom_tree_version != root()->document().dom_tree_version()) {
- m_cached_elements.clear();
- if (m_scope == Scope::Descendants) {
- m_root->for_each_in_subtree_of_type([&](auto& element) {
- if (m_filter(element))
- m_cached_elements.append(element);
- return IterationDecision::Continue;
- });
- } else {
- m_root->for_each_child_of_type([&](auto& element) {
- if (m_filter(element))
- m_cached_elements.append(element);
- return IterationDecision::Continue;
- });
- }
- m_cached_dom_tree_version = root()->document().dom_tree_version();
- }
-
+ update_cache_if_needed();
JS::MarkedVector> elements(heap());
for (auto& element : m_cached_elements)
elements.append(element);
diff --git a/Userland/Libraries/LibWeb/DOM/HTMLCollection.h b/Userland/Libraries/LibWeb/DOM/HTMLCollection.h
index ad590cde4ae..f6b21295d41 100644
--- a/Userland/Libraries/LibWeb/DOM/HTMLCollection.h
+++ b/Userland/Libraries/LibWeb/DOM/HTMLCollection.h
@@ -56,6 +56,8 @@ protected:
private:
virtual void visit_edges(Cell::Visitor&) override;
+ void update_cache_if_needed() const;
+
mutable u64 m_cached_dom_tree_version { 0 };
mutable Vector> m_cached_elements;