diff --git a/Libraries/LibWeb/DOM/AbortSignal.cpp b/Libraries/LibWeb/DOM/AbortSignal.cpp index 633663c0da0..60c24678d20 100644 --- a/Libraries/LibWeb/DOM/AbortSignal.cpp +++ b/Libraries/LibWeb/DOM/AbortSignal.cpp @@ -35,14 +35,22 @@ void AbortSignal::initialize(JS::Realm& realm) } // https://dom.spec.whatwg.org/#abortsignal-add -void AbortSignal::add_abort_algorithm(Function abort_algorithm) +Optional AbortSignal::add_abort_algorithm(Function abort_algorithm) { // 1. If signal is aborted, then return. if (aborted()) - return; + return {}; // 2. Append algorithm to signal’s abort algorithms. - m_abort_algorithms.append(GC::create_function(vm().heap(), move(abort_algorithm))); + m_abort_algorithms.set(++m_next_abort_algorithm_id, GC::create_function(vm().heap(), move(abort_algorithm))); + return m_next_abort_algorithm_id; +} + +// https://dom.spec.whatwg.org/#abortsignal-remove +void AbortSignal::remove_abort_algorithm(AbortAlgorithmID id) +{ + // To remove an algorithm algorithm from an AbortSignal signal, remove algorithm from signal’s abort algorithms. + m_abort_algorithms.remove(id); } // https://dom.spec.whatwg.org/#abortsignal-signal-abort @@ -76,8 +84,8 @@ void AbortSignal::signal_abort(JS::Value reason) // https://dom.spec.whatwg.org/#run-the-abort-steps auto run_the_abort_steps = [](auto& signal) { // 1. For each algorithm in signal’s abort algorithms: run algorithm. - for (auto& algorithm : signal.m_abort_algorithms) - algorithm->function()(); + for (auto const& algorithm : signal.m_abort_algorithms) + algorithm.value->function()(); // 2. Empty signal’s abort algorithms. signal.m_abort_algorithms.clear(); diff --git a/Libraries/LibWeb/DOM/AbortSignal.h b/Libraries/LibWeb/DOM/AbortSignal.h index ac5f518218c..26a654b3476 100644 --- a/Libraries/LibWeb/DOM/AbortSignal.h +++ b/Libraries/LibWeb/DOM/AbortSignal.h @@ -7,6 +7,7 @@ #pragma once +#include #include #include #include @@ -26,7 +27,9 @@ public: virtual ~AbortSignal() override = default; - void add_abort_algorithm(ESCAPING Function); + using AbortAlgorithmID = u64; + Optional add_abort_algorithm(Function); + void remove_abort_algorithm(AbortAlgorithmID); // https://dom.spec.whatwg.org/#dom-abortsignal-aborted // An AbortSignal object is aborted when its abort reason is not undefined. @@ -68,8 +71,8 @@ private: JS::Value m_abort_reason { JS::js_undefined() }; // https://dom.spec.whatwg.org/#abortsignal-abort-algorithms - // FIXME: This should be a set. - Vector>> m_abort_algorithms; + OrderedHashMap>> m_abort_algorithms; + AbortAlgorithmID m_next_abort_algorithm_id { 0 }; // https://dom.spec.whatwg.org/#abortsignal-source-signals // An AbortSignal object has associated source signals (a weak set of AbortSignal objects that the object is dependent on for its aborted state), which is initially empty. diff --git a/Libraries/LibWeb/DOM/EventTarget.cpp b/Libraries/LibWeb/DOM/EventTarget.cpp index 25ae41e08b6..740f4cbd9df 100644 --- a/Libraries/LibWeb/DOM/EventTarget.cpp +++ b/Libraries/LibWeb/DOM/EventTarget.cpp @@ -231,7 +231,7 @@ void EventTarget::add_an_event_listener(DOMEventListener& listener) // 6. If listener’s signal is not null, then add the following abort steps to it: if (listener.signal) { // NOTE: `this` and `listener` are protected by AbortSignal using GC::HeapFunction. - listener.signal->add_abort_algorithm([this, &listener] { + (void)listener.signal->add_abort_algorithm([this, &listener] { // 1. Remove an event listener with eventTarget and listener. remove_an_event_listener(listener); }); diff --git a/Libraries/LibWeb/Fetch/FetchMethod.cpp b/Libraries/LibWeb/Fetch/FetchMethod.cpp index 64531614ee3..9f83cb3696a 100644 --- a/Libraries/LibWeb/Fetch/FetchMethod.cpp +++ b/Libraries/LibWeb/Fetch/FetchMethod.cpp @@ -130,7 +130,7 @@ GC::Ref fetch(JS::VM& vm, RequestInfo const& input, RequestInit })))); // 11. Add the following abort steps to requestObject’s signal: - request_object->signal()->add_abort_algorithm([locally_aborted, request, controller_holder, promise_capability, request_object, response_object, &relevant_realm] { + (void)request_object->signal()->add_abort_algorithm([locally_aborted, request, controller_holder, promise_capability, request_object, response_object, &relevant_realm] { dbgln_if(WEB_FETCH_DEBUG, "Fetch: Request object signal's abort algorithm called"); // 1. Set locallyAborted to true. diff --git a/Libraries/LibWeb/HTML/CloseWatcher.cpp b/Libraries/LibWeb/HTML/CloseWatcher.cpp index 86edb65bbda..8643e8abead 100644 --- a/Libraries/LibWeb/HTML/CloseWatcher.cpp +++ b/Libraries/LibWeb/HTML/CloseWatcher.cpp @@ -65,7 +65,7 @@ WebIDL::ExceptionOr> CloseWatcher::construct_impl(JS::Real } // 3.2 Add the following steps to options["signal"]: - signal->add_abort_algorithm([close_watcher] { + (void)signal->add_abort_algorithm([close_watcher] { // 3.2.1 Destroy closeWatcher. close_watcher->destroy(); });