diff --git a/docs/index.bs b/docs/index.bs
index b073ac13..24f4175f 100644
--- a/docs/index.bs
+++ b/docs/index.bs
@@ -3288,29 +3288,45 @@ spec: storage; urlPrefix: https://storage.spec.whatwg.org/
1. Set |routedResponse|'s [=service worker timing info=]'s [=service worker timing info/worker final router source=] be set to |result|'s [=race result/used route=].
1. Return |routedResponse|.
1. Assert: |source| is "{{RouterSourceEnum/fetch-event}}"
- 1. If |request| is a [=navigation request=], |registration|'s [=navigation preload enabled flag=] is set, |request|'s [=request/method=] is \`GET
\`, |registration|'s [=active worker=]'s [=set of event types to handle=] [=set/contains=] fetch
, and |registration|'s [=active worker=]'s [=all fetch listeners are empty flag=] is not set then:
-
- Note: If the above is true except |registration|'s [=active worker=]'s set of event types to handle **does not** contain fetch
, then the user agent may wish to show a console warning, as the developer's intent isn't clear.
-
- 1. Let |preloadRequest| be the result of [=request/cloning=] the request |request|.
- 1. Let |preloadRequestHeaders| be |preloadRequest|'s [=request/header list=].
- 1. Let |preloadResponseObject| be a new {{Response}} object associated with a new {{Headers}} object whose [=guard=] is "`immutable`".
- 1. [=header list/Append=] to |preloadRequestHeaders| a new [=header=] whose [=header/name=] is \`Service-Worker-Navigation-Preload
\` and [=header/value=] is |registration|'s [=navigation preload header value=].
- 1. Set |preloadRequest|'s [=service-workers mode=] to "`none`".
- 1. Let |preloadFetchController| be null.
- 1. Run the following substeps [=in parallel=], but [=abort when=] |fetchController|'s [=fetch controller/state=] is "terminated
" or "aborted
":
- 1. Set |preloadFetchController| to the result of [=Fetch|fetching=] |preloadRequest|.
-
- To [=fetch/processResponse=] for |navigationPreloadResponse|, run these substeps:
-
- 1. If |navigationPreloadResponse|'s [=response/type=] is "`error`", reject |preloadResponse| with a `TypeError` and terminate these substeps.
- 1. Associate |preloadResponseObject| with |navigationPreloadResponse|.
- 1. Resolve |preloadResponse| with |preloadResponseObject|.
- 1. [=If aborted=], then:
- 1. Let |deserializedError| be the result of [=deserialize a serialized abort reason=] given null and |workerRealm|.
- 1. [=fetch controller/Abort=] |preloadFetchController| with |deserializedError|.
+ 1. Let |responseForAutoPreload| be null.
+ 1. If |request| is a [=navigation request=], |request|'s [=request/method=] is \`GET
\`, |registration|'s [=active worker=]'s [=set of event types to handle=] [=set/contains=] fetch
, and |registration|'s [=active worker=]'s [=all fetch listeners are empty flag=] is not set then:
+ 1. If |registration|'s [=navigation preload enabled flag=] is set then:
+
+ Note: If the above is true except |registration|'s [=active worker=]'s set of event types to handle **does not** contain fetch
, then the user agent may wish to show a console warning, as the developer's intent isn't clear.
+
+ 1. Let |preloadRequest| be the result of [=request/cloning=] the request |request|.
+ 1. Let |preloadRequestHeaders| be |preloadRequest|'s [=request/header list=].
+ 1. Let |preloadResponseObject| be a new {{Response}} object associated with a new {{Headers}} object whose [=guard=] is "`immutable`".
+ 1. [=header list/Append=] to |preloadRequestHeaders| a new [=header=] whose [=header/name=] is \`Service-Worker-Navigation-Preload
\` and [=header/value=] is |registration|'s [=navigation preload header value=].
+ 1. Set |preloadRequest|'s [=service-workers mode=] to "`none`".
+ 1. Let |preloadFetchController| be null.
+ 1. Run the following substeps [=in parallel=], but [=abort when=] |fetchController|'s [=fetch controller/state=] is "terminated
" or "aborted
":
+ 1. Set |preloadFetchController| to the result of [=Fetch|fetching=] |preloadRequest|.
+
+ To [=fetch/processResponse=] for |navigationPreloadResponse|, run these substeps:
+
+ 1. If |navigationPreloadResponse|'s [=response/type=] is "`error`", reject |preloadResponse| with a `TypeError` and terminate these substeps.
+ 1. Associate |preloadResponseObject| with |navigationPreloadResponse|.
+ 1. Resolve |preloadResponse| with |preloadResponseObject|.
+ 1. [=If aborted=], then:
+ 1. Let |deserializedError| be the result of [=deserialize a serialized abort reason=] given null and |workerRealm|.
+ 1. [=fetch controller/Abort=] |preloadFetchController| with |deserializedError|.
+ 1. Else if |timingInfo|'s [=service worker timing info/worker matched router source=] is not "{{RouterSourceEnum/fetch-event}}", a user agent may run the following substeps:
+
+ Note: A user agent may speculatively dispatch a network request in parallel with creating a fetch event in order to minimize the bootstrap cost.
+
+ 1. Assert: |timingInfo|'s [=service worker timing info/worker matched router source=] is null.
+ 1. Let |autoPreloadFetchController| be null.
+ 1. Set |responseForAutoPreload| to be a [=race response=] whose [=race response/value=] is "pending
".
+ 1. Run the following substeps [=in parallel=], but [=abort when=] |fetchController|'s [=fetch controller/state=] is "terminated
" or "aborted
":
+ 1. Set |autoPreloadFetchController| to the result of calling [=fetch=] given |request|, with [=fetch/processResponse=] set to the following steps given a [=/response=] |autoPreloadRequestResponse|:
+ 1. Set |responseForAutoPreload|'s [=race response/value=] to |autoPreloadRequestResponse|.
+ 1. [=If aborted=] and |autoPreloadFetchController| is not null, then:
+ 1. [=fetch controller/Abort=] |autoPreloadFetchController|.
+ 1. Set |responseForAutoPreload| to a [=race response=] whose [=race response/value=] is null.
+ 1. Resolve |preloadResponse| with undefined.
1. Else, resolve |preloadResponse| with undefined.
- 1. Let |fetchResult| be the result of [=Create Fetch Event and Dispatch=] with |request|, |registration|, |useHighResPerformanceTimers|, |timingInfo|, |workerRealm|, |reservedClient|, |preloadResponse|, and null.
+ 1. Let |fetchResult| be the result of [=Create Fetch Event and Dispatch=] with |request|, |registration|, |useHighResPerformanceTimers|, |timingInfo|, |workerRealm|, |reservedClient|, |preloadResponse|, and |responseForAutoPreload|.
1. If |timingInfo|'s [=service worker timing info/worker final router source=] is not an empty string:
1. Assert |timingInfo|'s [=service worker timing info/worker final router source=] is {{RouterSourceEnum/"network"}}.
1. If |fetchResult| is null, then return |timingInfo|.