From 07e3bb729db93a2ef2e3532cf5b480d059107c19 Mon Sep 17 00:00:00 2001 From: Luke Wilde Date: Wed, 26 Oct 2022 18:09:24 +0100 Subject: [PATCH] LibWeb: Convert DOM::AbortSignal to use JS::SafeFunction This protects the captured GC pointers automatically instead of manually. --- Userland/Libraries/LibWeb/DOM/AbortSignal.cpp | 2 +- Userland/Libraries/LibWeb/DOM/AbortSignal.h | 4 ++-- Userland/Libraries/LibWeb/DOM/EventTarget.cpp | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibWeb/DOM/AbortSignal.cpp b/Userland/Libraries/LibWeb/DOM/AbortSignal.cpp index bdee043078..f05a6d2f46 100644 --- a/Userland/Libraries/LibWeb/DOM/AbortSignal.cpp +++ b/Userland/Libraries/LibWeb/DOM/AbortSignal.cpp @@ -24,7 +24,7 @@ AbortSignal::AbortSignal(JS::Realm& realm) } // https://dom.spec.whatwg.org/#abortsignal-add -void AbortSignal::add_abort_algorithm(Function abort_algorithm) +void AbortSignal::add_abort_algorithm(JS::SafeFunction abort_algorithm) { // 1. If signal is aborted, then return. if (aborted()) diff --git a/Userland/Libraries/LibWeb/DOM/AbortSignal.h b/Userland/Libraries/LibWeb/DOM/AbortSignal.h index dab9d78321..7437e21add 100644 --- a/Userland/Libraries/LibWeb/DOM/AbortSignal.h +++ b/Userland/Libraries/LibWeb/DOM/AbortSignal.h @@ -22,7 +22,7 @@ public: virtual ~AbortSignal() override = default; - void add_abort_algorithm(Function); + void add_abort_algorithm(JS::SafeFunction); // https://dom.spec.whatwg.org/#dom-abortsignal-aborted // An AbortSignal object is aborted when its abort reason is not undefined. @@ -49,7 +49,7 @@ private: // https://dom.spec.whatwg.org/#abortsignal-abort-algorithms // FIXME: This should be a set. - Vector> m_abort_algorithms; + Vector> m_abort_algorithms; }; } diff --git a/Userland/Libraries/LibWeb/DOM/EventTarget.cpp b/Userland/Libraries/LibWeb/DOM/EventTarget.cpp index f3b35d8a33..8a90e5e7f4 100644 --- a/Userland/Libraries/LibWeb/DOM/EventTarget.cpp +++ b/Userland/Libraries/LibWeb/DOM/EventTarget.cpp @@ -170,9 +170,10 @@ void EventTarget::add_an_event_listener(DOMEventListener& listener) // 5. If listener’s signal is not null, then add the following abort steps to it: if (listener.signal) { - listener.signal->add_abort_algorithm([strong_event_target = JS::make_handle(*this), listener = JS::make_handle(&listener)]() mutable { + // NOTE: `this` and `listener` are protected by AbortSignal using JS::SafeFunction. + listener.signal->add_abort_algorithm([this, &listener]() mutable { // 1. Remove an event listener with eventTarget and listener. - strong_event_target->remove_an_event_listener(*listener); + remove_an_event_listener(listener); }); } }