LibWeb: Make Agent's MutationObserver list weak

Before this change, Agent held on to all of the live MutationObserver
objects via GC::Root. This prevented them from ever getting
garbage-collected.

Instead of roots, we now use a simple IntrusiveList and remove them
from it in the finalizer for MutationObserver.

This fixes a massive GC leak on Speedometer.
This commit is contained in:
Andreas Kling 2025-02-07 11:22:11 +01:00 committed by Andreas Kling
commit 53c9c6f3ee
Notes: github-actions[bot] 2025-02-07 15:54:21 +00:00
4 changed files with 14 additions and 6 deletions

View file

@ -35,9 +35,11 @@ MutationObserver::MutationObserver(JS::Realm& realm, GC::Ptr<WebIDL::CallbackTyp
MutationObserver::~MutationObserver()
{
HTML::relevant_agent(*this).mutation_observers.remove_all_matching([this](auto& observer) {
return observer.ptr() == this;
});
}
void MutationObserver::finalize()
{
HTML::relevant_agent(*this).mutation_observers.remove(*this);
}
void MutationObserver::initialize(JS::Realm& realm)