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;