diff --git a/components/script/dom/abortsignal.rs b/components/script/dom/abortsignal.rs index 2b3021869ed..9f84eeed110 100644 --- a/components/script/dom/abortsignal.rs +++ b/components/script/dom/abortsignal.rs @@ -178,6 +178,31 @@ impl AbortSignalMethods for AbortSignal { self.aborted() } + /// + fn Abort( + cx: SafeJSContext, + global: &GlobalScope, + reason: HandleValue, + can_gc: CanGc, + ) -> DomRoot { + // Let signal be a new AbortSignal object. + let signal = AbortSignal::new_with_proto(global, None, can_gc); + + let abort_reason = reason.get(); + // Set signal’s abort reason to reason if it is given; + if !abort_reason.is_undefined() { + signal.abort_reason.set(abort_reason); + } else { + // otherwise to a new "AbortError" DOMException. + rooted!(in(*cx) let mut rooted_error = UndefinedValue()); + Error::Abort.to_jsval(cx, global, rooted_error.handle_mut(), can_gc); + signal.abort_reason.set(rooted_error.get()) + } + + // Return signal. + signal + } + /// fn Reason(&self, _cx: SafeJSContext, mut rval: MutableHandleValue) { // The reason getter steps are to return this’s abort reason. diff --git a/components/script_bindings/codegen/Bindings.conf b/components/script_bindings/codegen/Bindings.conf index a394e1712cb..b9f9bee5251 100644 --- a/components/script_bindings/codegen/Bindings.conf +++ b/components/script_bindings/codegen/Bindings.conf @@ -19,6 +19,10 @@ DOMInterfaces = { 'inRealms': ['Abort'], }, +'AbortSignal': { + 'canGc':['Abort'], +}, + 'AbstractRange': { 'weakReferenceable': True, }, diff --git a/components/script_bindings/webidls/AbortSignal.webidl b/components/script_bindings/webidls/AbortSignal.webidl index 1ec9fbcd3a4..ca1a64fee6d 100644 --- a/components/script_bindings/webidls/AbortSignal.webidl +++ b/components/script_bindings/webidls/AbortSignal.webidl @@ -6,6 +6,7 @@ [Exposed=*, Pref="dom_abort_controller_enabled"] interface AbortSignal : EventTarget { + [NewObject] static AbortSignal abort(optional any reason); readonly attribute boolean aborted; readonly attribute any reason; undefined throwIfAborted(); diff --git a/tests/wpt/meta/dom/abort/AbortSignal.any.js.ini b/tests/wpt/meta/dom/abort/AbortSignal.any.js.ini index d65938d6f45..474bf21084b 100644 --- a/tests/wpt/meta/dom/abort/AbortSignal.any.js.ini +++ b/tests/wpt/meta/dom/abort/AbortSignal.any.js.ini @@ -1,10 +1,4 @@ [AbortSignal.any.html] - [the AbortSignal.abort() static returns an already aborted signal] - expected: FAIL - - [signal returned by AbortSignal.abort() should not fire abort event] - expected: FAIL - [AbortSignal.timeout() returns a non-aborted signal] expected: FAIL @@ -16,12 +10,6 @@ [AbortSignal.any.worker.html] - [the AbortSignal.abort() static returns an already aborted signal] - expected: FAIL - - [signal returned by AbortSignal.abort() should not fire abort event] - expected: FAIL - [AbortSignal.timeout() returns a non-aborted signal] expected: FAIL @@ -42,7 +30,7 @@ expected: ERROR [AbortSignal.https.any.shadowrealm-in-audioworklet.html] - expected: ERROR + expected: TIMEOUT [AbortSignal.any.shadowrealm-in-dedicatedworker.html] expected: ERROR diff --git a/tests/wpt/meta/dom/abort/event.any.js.ini b/tests/wpt/meta/dom/abort/event.any.js.ini index 1a3d8ebec7d..d1ed136b2b8 100644 --- a/tests/wpt/meta/dom/abort/event.any.js.ini +++ b/tests/wpt/meta/dom/abort/event.any.js.ini @@ -1,36 +1,18 @@ [event.any.html] - [static aborting signal should have right properties] - expected: FAIL - - [static aborting signal with reason should set signal.reason] - expected: FAIL - [throwIfAborted() should throw abort.reason if signal aborted] expected: FAIL [throwIfAborted() should throw primitive abort.reason if signal aborted] expected: FAIL - [AbortSignal.reason returns the same DOMException] - expected: FAIL - [event.any.worker.html] - [static aborting signal should have right properties] - expected: FAIL - - [static aborting signal with reason should set signal.reason] - expected: FAIL - [throwIfAborted() should throw abort.reason if signal aborted] expected: FAIL [throwIfAborted() should throw primitive abort.reason if signal aborted] expected: FAIL - [AbortSignal.reason returns the same DOMException] - expected: FAIL - [event.any.shadowrealm.html] expected: TIMEOUT @@ -42,7 +24,7 @@ expected: ERROR [event.https.any.shadowrealm-in-audioworklet.html] - expected: ERROR + expected: TIMEOUT [event.https.any.shadowrealm-in-serviceworker.html] expected: ERROR diff --git a/tests/wpt/meta/dom/abort/reason-constructor.html.ini b/tests/wpt/meta/dom/abort/reason-constructor.html.ini deleted file mode 100644 index 87492136260..00000000000 --- a/tests/wpt/meta/dom/abort/reason-constructor.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[reason-constructor.html] - [AbortSignal.reason.constructor should be from iframe] - expected: FAIL