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

@ -675,7 +675,7 @@ void queue_mutation_observer_microtask(DOM::Document const& document)
// 2. Let notifySet be a clone of the surrounding agents mutation observers.
GC::RootVector<DOM::MutationObserver*> notify_set(heap);
for (auto& observer : surrounding_agent.mutation_observers)
notify_set.append(observer);
notify_set.append(&observer);
// FIXME: 3. Let signalSet be a clone of the surrounding agents signal slots.