You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ServiceWorkerAutoPreload is defined as an optional browser optimization so that the browser minimizes the cost of the bootstrap by dispatching the navigational network request before starting the service worker. The dispatched network request is consumed by fetch(e.request) in the fetch handler after the bootstrap, or consumed by the client as a fallback request if the fetch handler doesn't call respondWith().
The developer can disable this optimization by opting out via setting the router rule provided by the static routing API. Specifically, the router source "network" works as an opt-out signal.
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=].
3291
3291
1. Return |routedResponse|.
3292
3292
1. Assert: |source| is "{{RouterSourceEnum/fetch-event}}"
3293
-
1. If |request| is a [=navigation request=], |registration|'s [=navigation preload enabled flag=] is set, |request|'s [=request/method=] is \`<code>GET</code>\`, |registration|'s [=active worker=]'s [=set of event types to handle=][=set/contains=]<code>fetch</code>, and |registration|'s [=active worker=]'s [=all fetch listeners are empty flag=] is not set then:
3294
-
3295
-
Note: If the above is true except |registration|'s [=active worker=]'s <a>set of event types to handle</a> **does not** contain <code>fetch</code>, then the user agent may wish to show a console warning, as the developer's intent isn't clear.
3296
-
3297
-
1. Let |preloadRequest| be the result of [=request/cloning=] the request |request|.
3298
-
1. Let |preloadRequestHeaders| be |preloadRequest|'s [=request/header list=].
3299
-
1. Let |preloadResponseObject| be a new {{Response}} object associated with a new {{Headers}} object whose [=guard=] is "`immutable`".
3300
-
1. [=header list/Append=] to |preloadRequestHeaders| a new [=header=] whose [=header/name=] is \`<code>Service-Worker-Navigation-Preload</code>\` and [=header/value=] is |registration|'s [=navigation preload header value=].
3301
-
1. Set |preloadRequest|'s [=service-workers mode=] to "`none`".
3302
-
1. Let |preloadFetchController| be null.
3303
-
1. Run the following substeps [=in parallel=], but [=abort when=] |fetchController|'s [=fetch controller/state=] is "<code>terminated</code>" or "<code>aborted</code>":
3304
-
1. Set |preloadFetchController| to the result of [=Fetch|fetching=] |preloadRequest|.
3305
-
3306
-
To [=fetch/processResponse=] for |navigationPreloadResponse|, run these substeps:
3307
-
3308
-
1. If |navigationPreloadResponse|'s [=response/type=] is "`error`", reject |preloadResponse| with a `TypeError` and terminate these substeps.
3309
-
1. Associate |preloadResponseObject| with |navigationPreloadResponse|.
3310
-
1. Resolve |preloadResponse| with |preloadResponseObject|.
3311
-
1. [=If aborted=], then:
3312
-
1. Let |deserializedError| be the result of [=deserialize a serialized abort reason=] given null and |workerRealm|.
3313
-
1. [=fetch controller/Abort=] |preloadFetchController| with |deserializedError|.
3293
+
1. Let |responseForAutoPreload| be null.
3294
+
1. If |request| is a [=navigation request=], |request|'s [=request/method=] is \`<code>GET</code>\`, |registration|'s [=active worker=]'s [=set of event types to handle=] [=set/contains=] <code>fetch</code>, and |registration|'s [=active worker=]'s [=all fetch listeners are empty flag=] is not set then:
3295
+
1. If |registration|'s [=navigation preload enabled flag=] is set then:
3296
+
3297
+
Note: If the above is true except |registration|'s [=active worker=]'s <a>set of event types to handle</a> **does not** contain <code>fetch</code>, then the user agent may wish to show a console warning, as the developer's intent isn't clear.
3298
+
3299
+
1. Let |preloadRequest| be the result of [=request/cloning=] the request |request|.
3300
+
1. Let |preloadRequestHeaders| be |preloadRequest|'s [=request/header list=].
3301
+
1. Let |preloadResponseObject| be a new {{Response}} object associated with a new {{Headers}} object whose [=guard=] is "`immutable`".
3302
+
1. [=header list/Append=] to |preloadRequestHeaders| a new [=header=] whose [=header/name=] is \`<code>Service-Worker-Navigation-Preload</code>\` and [=header/value=] is |registration|'s [=navigation preload header value=].
3303
+
1. Set |preloadRequest|'s [=service-workers mode=] to "`none`".
3304
+
1. Let |preloadFetchController| be null.
3305
+
1. Run the following substeps [=in parallel=], but [=abort when=] |fetchController|'s [=fetch controller/state=] is "<code>terminated</code>" or "<code>aborted</code>":
3306
+
1. Set |preloadFetchController| to the result of [=Fetch|fetching=] |preloadRequest|.
3307
+
3308
+
To [=fetch/processResponse=] for |navigationPreloadResponse|, run these substeps:
3309
+
3310
+
1. If |navigationPreloadResponse|'s [=response/type=] is "`error`", reject |preloadResponse| with a `TypeError` and terminate these substeps.
3311
+
1. Associate |preloadResponseObject| with |navigationPreloadResponse|.
3312
+
1. Resolve |preloadResponse| with |preloadResponseObject|.
3313
+
1. [=If aborted=], then:
3314
+
1. Let |deserializedError| be the result of [=deserialize a serialized abort reason=] given null and |workerRealm|.
3315
+
1. [=fetch controller/Abort=] |preloadFetchController| with |deserializedError|.
3316
+
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:
3317
+
3318
+
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. Set |responseForAutoPreload| to be a [=race response=] whose [=race response/value=] is "<code>pending</code>".
3323
+
1. Run the following substeps [=in parallel=], but [=abort when=] |fetchController|'s [=fetch controller/state=] is "<code>terminated</code>" or "<code>aborted</code>":
3324
+
1. Set |autoPreloadFetchController| to the result of calling [=fetch=] given |request|, with [=fetch/processResponse=] set to the following steps given a [=/response=] |autoPreloadRequestResponse|:
3325
+
1. Set |responseForAutoPreload|'s [=race response/value=] to |autoPreloadRequestResponse|.
3326
+
1. [=If aborted=] and |autoPreloadFetchController| is not null, then:
1. Set |responseForAutoPreload| to a [=race response=] whose [=race response/value=] is null.
3329
+
1. Resolve |preloadResponse| with undefined.
3314
3330
1. Else, resolve |preloadResponse| with undefined.
3315
-
1. Let |fetchResult| be the result of [=Create Fetch Event and Dispatch=] with |request|, |registration|, |useHighResPerformanceTimers|, |timingInfo|, |workerRealm|, |reservedClient|, |preloadResponse|, and null.
3331
+
1. Let |fetchResult| be the result of [=Create Fetch Event and Dispatch=] with |request|, |registration|, |useHighResPerformanceTimers|, |timingInfo|, |workerRealm|, |reservedClient|, |preloadResponse|, and |responseForAutoPreload|.
3316
3332
1. If |timingInfo|'s [=service worker timing info/worker final router source=] is not an empty string:
3317
3333
1. Assert |timingInfo|'s [=service worker timing info/worker final router source=] is {{RouterSourceEnum/"network"}}.
3318
3334
1. If |fetchResult| is null, then return |timingInfo|.
0 commit comments