Skip to content

Commit c9039b9

Browse files
authored
Add abort reason support
This is a follow-up to whatwg/dom#1027 ensuring that the fetch algorithm forwards the abort reason appropriately. Tests: web-platform-tests/wpt#35374.
1 parent 30d462d commit c9039b9

File tree

1 file changed

+71
-20
lines changed

1 file changed

+71
-20
lines changed

fetch.bs

+71-20
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ urlPrefix:https://w3c.github.io/hr-time/#;spec:hr-time
3333
url:dfn-coarsened-shared-current-time;text:coarsened shared current time
3434
url:dfn-unsafe-shared-current-time;text:unsafe shared current time
3535
type:typedef;url:dom-domhighrestimestamp;text:DOMHighResTimeStamp
36+
37+
urlPrefix:https://tc39.es/ecma262/#;type:dfn;spec:ecma-262
38+
url:realm;text:realm
39+
url:sec-list-and-record-specification-type;text:Record
3640
</pre>
3741

3842
<pre class=link-defaults>
@@ -231,6 +235,9 @@ lt="authentication entry">authentication entries</a> (for HTTP authentication).
231235

232236
<dt><dfn for="fetch controller">report timing steps</dfn> (default null)
233237
<dd>Null or an algorithm accepting a <a for=/>global object</a>.
238+
239+
<dt><dfn for="fetch controller">serialized abort reason</dfn> (default null)
240+
<dd>Null or a <a>Record</a> (result of [$StructuredSerialize$]).
234241
</dl>
235242

236243
<p>To <dfn export for="fetch controller" id="finalize-and-report-timing">report timing</dfn> for a
@@ -254,8 +261,37 @@ given a <a>fetch controller</a> <var>controller</var>:
254261
</ol>
255262
256263
<p>To <dfn export for="fetch controller">abort</dfn> a <a for=/>fetch controller</a>
257-
<var>controller</var>, set <var>controller</var>'s <a for="fetch controller">state</a> to
258-
"<code>aborted</code>".
264+
<var>controller</var> with an optional <var>error</var>:
265+
266+
<ol>
267+
<li><p>Set <var>controller</var>'s <a for="fetch controller">state</a> to "<code>aborted</code>".
268+
269+
<li><p>Let <var>fallbackError</var> be an "{{AbortError}}" {{DOMException}}.
270+
271+
<li><p>Set <var>error</var> to <var>fallbackError</var> if it is not given.
272+
273+
<li><p>Let <var>serializedError</var> be [$StructuredSerialize$](<var>error</var>).
274+
If that threw an exception, catch it, and let <var>serializedError</var> be
275+
[$StructuredSerialize$](<var>fallbackError</var>).
276+
277+
<li><p>Set <var>controller</var>'s <a for="fetch controller">serialized abort reason</a> to
278+
<var>serializedError</var>.
279+
</ol>
280+
281+
<p>To <dfn>deserialize a serialized abort reason</dfn>, given null or a <a>Record</a>
282+
<var>abortReason</var> and a <a>realm</a> <var>realm</var>:
283+
284+
<ol>
285+
<li><p>Let <var>fallbackError</var> be an "{{AbortError}}" {{DOMException}}.
286+
287+
<li><p>Let <var>deserializedError</var> be <var>fallbackError</var>.
288+
289+
<li><p>If <var>abortReason</var> is non-null, then set <var>deserializedError</var> to
290+
[$StructuredDeserialize$](<var>abortReason</var>, <var>realm</var>). If that threw an exception or
291+
returned undefined, then set <var>deserializedError</var> to <var>fallbackError</var>.
292+
293+
<li><p>Return <var>deserializedError</var>.
294+
</ol>
259295

260296
<p>To <dfn export for="fetch controller">terminate</dfn> a <a for=/>fetch controller</a>
261297
<var>controller</var>, set <var>controller</var>'s <a for="fetch controller">state</a> to
@@ -5673,7 +5709,8 @@ optional boolean <var>forceNewConnection</var> (default false), run these steps:
56735709
ongoing fetch if it is <a lt=suspend for=fetch>suspended</a>.
56745710

56755711
<li><p>Let <var>cancelAlgorithm</var> be an algorithm that <a for="fetch controller">aborts</a>
5676-
<var>fetchParams</var>'s <a for="fetch params">controller</a>.
5712+
<var>fetchParams</var>'s <a for="fetch params">controller</a> with <var>reason</var>, given
5713+
<var>reason</var>.
56775714

56785715
<li><p>Let <var>highWaterMark</var> be a non-negative, non-NaN number, chosen by the user agent.
56795716

@@ -5793,9 +5830,13 @@ optional boolean <var>forceNewConnection</var> (default false), run these steps:
57935830
<ol>
57945831
<li><p>Set <var>response</var>'s <a for=response>aborted flag</a>.
57955832

5796-
<li><p>If <var>stream</var> is <a for=ReadableStream>readable</a>,
5797-
<a for=ReadableStream>error</a> <var>stream</var> with an
5798-
"<code><a exception>AbortError</a></code>" {{DOMException}}.
5833+
<li><p>If <var>stream</var> is <a for=ReadableStream>readable</a>, then
5834+
<a for=ReadableStream>error</a> <var>stream</var> with the result of
5835+
<a>deserialize a serialized abort reason</a> given <var>fetchParams</var>'s
5836+
<a for="fetch params">controller</a>'s <a for="fetch controller">serialized abort reason</a>
5837+
and an <a>implementation-defined</a> <a>realm</a>.
5838+
<!-- XXX: At some point we really need to sort out how JavaScript streams interact with the
5839+
network layer a bit better. -->
57995840
</ol>
58005841

58015842
<li><p>Otherwise, if <var>stream</var> is <a for=ReadableStream>readable</a>,
@@ -7004,8 +7045,8 @@ object), initially null.
70047045
<hr>
70057046

70067047
<p>To <dfn export for=Request lt=create|creating>create</dfn> a {{Request}} object, given a
7007-
<a for=/>request</a> <var>request</var>, <a for=/>headers guard</a> <var>guard</var>, and Realm
7008-
<var>realm</var>, run these steps:
7048+
<a for=/>request</a> <var>request</var>, <a for=/>headers guard</a> <var>guard</var>, and
7049+
<a>realm</a> <var>realm</var>, run these steps:
70097050

70107051
<ol>
70117052
<li><p>Let <var>requestObject</var> be a <a for=/>new</a> {{Request}} object with <var>realm</var>.
@@ -7563,8 +7604,8 @@ enum ResponseType { "basic", "cors", "default", "error", "opaque", "opaqueredire
75637604
<hr>
75647605

75657606
<p>To <dfn export for=Response lt=create|creating>create</dfn> a {{Response}} object, given a
7566-
<a for=/>response</a> <var>response</var>, <a for=/>headers guard</a> <var>guard</var>, and Realm
7567-
<var>realm</var>, run these steps:
7607+
<a for=/>response</a> <var>response</var>, <a for=/>headers guard</a> <var>guard</var>, and
7608+
<a>realm</a> <var>realm</var>, run these steps:
75687609

75697610
<ol>
75707611
<li><p>Let <var>responseObject</var> be a <a for=/>new</a> {{Response}} object with
@@ -7771,7 +7812,8 @@ method steps are:
77717812
then:
77727813

77737814
<ol>
7774-
<li><p><a>Abort fetch</a> with <var>p</var>, <var>request</var>, and null.
7815+
<li><p><a>Abort the <code>fetch()</code> call</a> with <var>p</var>, <var>request</var>, null, and
7816+
<var>requestObject</var>'s <a for=Request>signal</a>'s <a for=AbortSignal>abort reason</a>.
77757817

77767818
<li><p>Return <var>p</var>.
77777819
</ol>
@@ -7801,10 +7843,12 @@ method steps are:
78017843
<ol>
78027844
<li><p>Set <var>locallyAborted</var> to true.
78037845

7804-
<li><p><a>Abort fetch</a> with <var>p</var>, <var>request</var>, and <var>responseObject</var>.
7846+
<li><p><a>Abort the <code>fetch()</code> call</a> with <var>p</var>, <var>request</var>, <var>responseObject</var>,
7847+
and <var>requestObject</var>'s <a for=Request>signal</a>'s <a for=AbortSignal>abort reason</a>.
78057848

78067849
<li><p>If <var>controller</var> is not null, then <a for="fetch controller">abort</a>
7807-
<var>controller</var>.
7850+
<var>controller</var> with <var>requestObject</var>'s <a for=Request>signal</a>'s
7851+
<a for=AbortSignal>abort reason</a>.
78087852
</ol>
78097853

78107854
<li>
@@ -7815,9 +7859,17 @@ method steps are:
78157859
<ol>
78167860
<li><p>If <var>locallyAborted</var> is true, terminate these substeps.
78177861

7818-
<li><p>If <var>response</var>'s <a for=response>aborted flag</a> is set, then <a>abort fetch</a>
7819-
with <var>p</var>, <var>request</var>, and <var>responseObject</var>, and terminate these
7820-
substeps.
7862+
<li>
7863+
<p>If <var>response</var>'s <a for=response>aborted flag</a> is set, then:
7864+
7865+
<ol>
7866+
<li><p>Let <var>deserializedError</var> be the result of
7867+
<a>deserialize a serialized abort reason</a> given <var>controller</var>'s
7868+
<a for="fetch controller">serialized abort reason</a> and <var>relevantRealm</var>.
7869+
7870+
<li><p><a>Abort the <code>fetch()</code> call</a> with <var>p</var>, <var>request</var>,
7871+
<var>responseObject</var>, and <var>deserializedError</var>.
7872+
</ol>
78217873

78227874
<li><p>If <var>response</var> is a <a>network error</a>, then <a for=/>reject</a> <var>p</var>
78237875
with a {{TypeError}} and terminate these substeps.
@@ -7831,12 +7883,10 @@ method steps are:
78317883
<li><p>Return <var>p</var>.
78327884
</ol>
78337885

7834-
<p>To <dfn>abort fetch</dfn> with a <var>promise</var>, <var>request</var>, and
7835-
<var>responseObject</var>, run these steps:
7886+
<p>To <dfn lt="Abort the fetch() call" export id=abort-fetch>abort a <code>fetch()</code> call</dfn> with a
7887+
<var>promise</var>, <var>request</var>, <var>responseObject</var>, and an <var>error</var>, run these steps:
78367888

78377889
<ol>
7838-
<li><p>Let <var>error</var> be an "<code><a exception>AbortError</a></code>" {{DOMException}}.
7839-
78407890
<li>
78417891
<p><a for=/>Reject</a> <var>promise</var> with <var>error</var>.
78427892

@@ -8443,6 +8493,7 @@ Moritz Kneilmann,
84438493
Ms2ger,
84448494
Nico Schlömer,
84458495
Nicolás Peña Moreno,
8496+
Nidhi Jaju,
84468497
Nikhil Marathe,
84478498
Nikki Bee,
84488499
Nikunj Mehta,

0 commit comments

Comments
 (0)