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);