瀏覽代碼

LibWeb: Implement AbortSignal.throwIfAborted

See: https://github.com/whatwg/dom/commit/cfe2f1e
Luke Wilde 3 年之前
父節點
當前提交
1a5bf15b4d

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

@@ -73,6 +73,22 @@ HTML::EventHandler AbortSignal::onabort()
     return event_handler_attribute(HTML::EventNames::abort);
 }
 
+// https://dom.spec.whatwg.org/#dom-abortsignal-throwifaborted
+JS::ThrowCompletionOr<void> AbortSignal::throw_if_aborted() const
+{
+    auto& global_object = wrapper()->global_object();
+    auto& vm = global_object.vm();
+
+    // The throwIfAborted() method steps are to throw this’s abort reason, if this is aborted.
+    if (!aborted())
+        return {};
+
+    // FIXME: Remove this once VM::exception() has been removed.
+    vm.throw_exception(global_object, m_abort_reason);
+
+    return JS::throw_completion(m_abort_reason);
+}
+
 void AbortSignal::visit_edges(JS::Cell::Visitor& visitor)
 {
     visitor.visit(m_abort_reason);

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

@@ -53,6 +53,8 @@ public:
     // https://dom.spec.whatwg.org/#dom-abortsignal-reason
     JS::Value reason() const { return m_abort_reason; }
 
+    JS::ThrowCompletionOr<void> throw_if_aborted() const;
+
     void visit_edges(JS::Cell::Visitor&);
 
     // ^EventTarget

+ 1 - 0
Userland/Libraries/LibWeb/DOM/AbortSignal.idl

@@ -4,6 +4,7 @@ interface AbortSignal : EventTarget {
 
     readonly attribute boolean aborted;
     readonly attribute any reason;
+    undefined throwIfAborted();
 
     attribute EventHandler onabort;
 };