From 15629e8925e91ed9dd768d74d964bcda26c20de1 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Wed, 27 Sep 2023 14:58:14 +0200 Subject: [PATCH] LibWeb: Do not use JS::Handle for mutation observers Using JS::Handle in WebEngineCustomData means that mutation observers will live as long as VM while actually they should be deallocated as soon as they are no longer used in a script that created them. --- Userland/Libraries/LibWeb/Bindings/MainThreadVM.h | 2 +- Userland/Libraries/LibWeb/DOM/MutationObserver.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibWeb/Bindings/MainThreadVM.h b/Userland/Libraries/LibWeb/Bindings/MainThreadVM.h index e3605f8f907..fb5d4cd877e 100644 --- a/Userland/Libraries/LibWeb/Bindings/MainThreadVM.h +++ b/Userland/Libraries/LibWeb/Bindings/MainThreadVM.h @@ -49,7 +49,7 @@ struct WebEngineCustomData final : public JS::VM::CustomData { // https://dom.spec.whatwg.org/#mutation-observer-list // FIXME: This should be a set. - Vector> mutation_observers; + Vector> mutation_observers; JS::Handle internal_realm; diff --git a/Userland/Libraries/LibWeb/DOM/MutationObserver.cpp b/Userland/Libraries/LibWeb/DOM/MutationObserver.cpp index 8c42f3fb2d1..77818ddd419 100644 --- a/Userland/Libraries/LibWeb/DOM/MutationObserver.cpp +++ b/Userland/Libraries/LibWeb/DOM/MutationObserver.cpp @@ -29,7 +29,13 @@ MutationObserver::MutationObserver(JS::Realm& realm, JS::GCPtrmutation_observers.append(*this); } -MutationObserver::~MutationObserver() = default; +MutationObserver::~MutationObserver() +{ + auto* agent_custom_data = verify_cast(vm().custom_data()); + agent_custom_data->mutation_observers.remove_all_matching([this](auto& observer) { + return observer.ptr() == this; + }); +} void MutationObserver::initialize(JS::Realm& realm) {