Bläddra i källkod

LibWeb: Add the ability for an AbortSignal to follow another

Following another abort signal basically means to make an abort signal
abort when another abort signal is aborted, unless the following signal
is already aborted.
Luke Wilde 2 år sedan
förälder
incheckning
dce6327ae7

+ 23 - 0
Userland/Libraries/LibWeb/DOM/AbortSignal.cpp

@@ -84,4 +84,27 @@ void AbortSignal::visit_edges(JS::Cell::Visitor& visitor)
     visitor.visit(m_abort_reason);
 }
 
+// https://dom.spec.whatwg.org/#abortsignal-follow
+void AbortSignal::follow(JS::NonnullGCPtr<AbortSignal> parent_signal)
+{
+    // A followingSignal (an AbortSignal) is made to follow a parentSignal (an AbortSignal) by running these steps:
+
+    // 1. If followingSignal is aborted, then return.
+    if (aborted())
+        return;
+
+    // 2. If parentSignal is aborted, then signal abort on followingSignal with parentSignal’s abort reason.
+    if (parent_signal->aborted()) {
+        signal_abort(parent_signal->reason());
+        return;
+    }
+
+    // 3. Otherwise, add the following abort steps to parentSignal:
+    // NOTE: `this` and `parent_signal` are protected by AbortSignal using JS::SafeFunction.
+    parent_signal->add_abort_algorithm([this, parent_signal]() mutable {
+        // 1. Signal abort on followingSignal with parentSignal’s abort reason.
+        signal_abort(parent_signal->reason());
+    });
+}
+
 }

+ 2 - 0
Userland/Libraries/LibWeb/DOM/AbortSignal.h

@@ -38,6 +38,8 @@ public:
 
     JS::ThrowCompletionOr<void> throw_if_aborted() const;
 
+    void follow(JS::NonnullGCPtr<AbortSignal> parent_signal);
+
 private:
     explicit AbortSignal(JS::Realm&);