diff --git a/Tests/LibWeb/Text/expected/abortsignal-abort.txt b/Tests/LibWeb/Text/expected/abortsignal-abort.txt
new file mode 100644
index 0000000000..9005fe02e2
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/abortsignal-abort.txt
@@ -0,0 +1,4 @@
+Aborted: true
+Reason: "[object DOMException]"
+Aborted: true
+Reason: "This is a test"
diff --git a/Tests/LibWeb/Text/input/abortsignal-abort.html b/Tests/LibWeb/Text/input/abortsignal-abort.html
new file mode 100644
index 0000000000..4f7b088e4d
--- /dev/null
+++ b/Tests/LibWeb/Text/input/abortsignal-abort.html
@@ -0,0 +1,19 @@
+
+
diff --git a/Userland/Libraries/LibWeb/DOM/AbortSignal.cpp b/Userland/Libraries/LibWeb/DOM/AbortSignal.cpp
index 1b23ffc3cd..5c6d7c946c 100644
--- a/Userland/Libraries/LibWeb/DOM/AbortSignal.cpp
+++ b/Userland/Libraries/LibWeb/DOM/AbortSignal.cpp
@@ -116,4 +116,20 @@ void AbortSignal::follow(JS::NonnullGCPtr parent_signal)
});
}
+// https://dom.spec.whatwg.org/#dom-abortsignal-abort
+WebIDL::ExceptionOr> AbortSignal::abort(JS::VM& vm, JS::Value reason)
+{
+ // 1. Let signal be a new AbortSignal object.
+ auto signal = TRY(construct_impl(*vm.current_realm()));
+
+ // 2. Set signal’s abort reason to reason if it is given; otherwise to a new "AbortError" DOMException.
+ if (reason.is_undefined())
+ reason = WebIDL::AbortError::create(*vm.current_realm(), "Aborted without reason"_fly_string).ptr();
+
+ signal->set_reason(reason);
+
+ // 3. Return signal.
+ return signal;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/DOM/AbortSignal.h b/Userland/Libraries/LibWeb/DOM/AbortSignal.h
index 4abdb94a57..12cd8e2122 100644
--- a/Userland/Libraries/LibWeb/DOM/AbortSignal.h
+++ b/Userland/Libraries/LibWeb/DOM/AbortSignal.h
@@ -37,11 +37,14 @@ public:
// https://dom.spec.whatwg.org/#dom-abortsignal-reason
JS::Value reason() const { return m_abort_reason; }
+ void set_reason(JS::Value reason) { m_abort_reason = reason; }
JS::ThrowCompletionOr throw_if_aborted() const;
void follow(JS::NonnullGCPtr parent_signal);
+ static WebIDL::ExceptionOr> abort(JS::VM&, JS::Value reason);
+
private:
explicit AbortSignal(JS::Realm&);
diff --git a/Userland/Libraries/LibWeb/DOM/AbortSignal.idl b/Userland/Libraries/LibWeb/DOM/AbortSignal.idl
index b7e2d02ea5..3a344c6351 100644
--- a/Userland/Libraries/LibWeb/DOM/AbortSignal.idl
+++ b/Userland/Libraries/LibWeb/DOM/AbortSignal.idl
@@ -4,7 +4,7 @@
// https://dom.spec.whatwg.org/#interface-AbortSignal
[Exposed=(Window,Worker), CustomVisit]
interface AbortSignal : EventTarget {
- // FIXME: [NewObject] static AbortSignal abort(optional any reason);
+ [NewObject] static AbortSignal abort(optional any reason);
// FIXME: [Exposed=(Window,Worker), NewObject] static AbortSignal timeout([EnforceRange] unsigned long long milliseconds);
// FIXME: [NewObject] static AbortSignal _any(sequence signals);