diff --git a/docs/index.bs b/docs/index.bs
index 0b5dd618..8119cd0c 100644
--- a/docs/index.bs
+++ b/docs/index.bs
@@ -165,7 +165,9 @@ spec: webappsec-referrer-policy; urlPrefix: https://w3c.github.io/webappsec-refe
A [=/service worker=] has an associated skip waiting flag. Unless stated otherwise it is unset.
- A [=/service worker=] has an associated imported scripts updated flag. It is initially unset.
+ A [=/service worker=] has an associated classic scripts imported flag. It is initially unset.
+
+ A [=/service worker=] has an associated include updated resources flag. It is initially unset.
A [=/service worker=] has an associated set of event types to handle (a [=ordered set|set=]) whose [=list/item=] is an event listener's event type. It is initially an empty set.
@@ -2027,22 +2029,28 @@ spec: webappsec-referrer-policy; urlPrefix: https://w3c.github.io/webappsec-refe
When the importScripts(|urls|)
method is called on a {{ServiceWorkerGlobalScope}} object, the user agent *must* import scripts into worker global scope, given this {{ServiceWorkerGlobalScope}} object and |urls|, and with the following steps to [=fetching scripts/perform the fetch=] given the [=/request=] |request|:
1. Let |serviceWorker| be |request|'s [=request/client=]'s [=environment settings object/global object=]'s [=ServiceWorkerGlobalScope/service worker=].
- 1. If |serviceWorker|'s imported scripts updated flag is unset, then:
- 1. Let |registration| be |serviceWorker|'s [=containing service worker registration=].
- 1. Set |request|'s [=service-workers mode=] to "`none`".
- 1. Set |request|'s [=request/cache mode=] to "no-cache
" if any of the following are true:
- * |registration|'s [=service worker registration/update via cache mode=] is "`none`".
- * The [=current global object=]'s [=force bypass cache for importscripts flag=] is set.
- * |registration|'s [=last update check time=] is not null and the time difference in seconds calculated by the current time minus |registration|’s [=last update check time=] is greater than 86400.
- 1. Let |response| be the result of fetching |request|.
- 1. If |response|’s cache state is not "local
", set |registration|’s [=service worker registration/last update check time=] to the current time.
- 1. [=Extract a MIME type=] from the |response|'s [=unsafe response=]'s [=response/header list=]. If this MIME type (ignoring parameters) is not a [=JavaScript MIME type=], return a [=network error=].
- 1. If |response|'s unsafe response's [=response/type=] is not "error
", and |response|'s [=response/status=] is an ok status, then:
- 1. [=map/Set=] script resource map[|request|'s [=request/url=]] to |response|.
- 1. Return |response|.
- 1. Else:
- 1. If script resource map[|url|] [=map/exists=], return script resource map[|url|].
- 1. Else, return a network error.
+ 1. If |serviceWorker|'s [=service worker/script resource map=][|request|'s [=request/url=]] [=map/exists=], return [=service worker/script resource map=][|request|'s [=request/url=]].
+ 1. If |serviceWorker|'s [=state=] is *installed*, *activating*, *activated*, or *redundant*, return a [=network error=].
+ 1. Let |registration| be |serviceWorker|'s [=containing service worker registration=].
+ 1. Set |request|'s [=service-workers mode=] to "`none`".
+ 1. Set |request|'s [=request/cache mode=] to "no-cache
" if any of the following are true:
+ * |registration|'s [=service worker registration/update via cache mode=] is "`none`".
+ * The [=current global object=]'s [=force bypass cache for importscripts flag=] is set.
+ * |registration|'s [=last update check time=] is not null and the time difference in seconds calculated by the current time minus |registration|’s [=last update check time=] is greater than 86400.
+ 1. Let |response| be the result of fetching |request|.
+ 1. If |response|’s cache state is not "local
", set |registration|’s [=service worker registration/last update check time=] to the current time.
+ 1. [=Extract a MIME type=] from the |response|'s [=unsafe response=]'s [=response/header list=]. If this MIME type (ignoring parameters) is not a [=JavaScript MIME type=], return a [=network error=].
+ 1. If |response|'s unsafe response's [=response/type=] is not "error
", and |response|'s [=response/status=] is an ok status, then:
+ 1. Let |newestWorker| be the result of running [=Get Newest Worker=] with |registration|.
+ 1. Let |resource| be null.
+ 1. If |newestWorker| is not null, set |resource| to |newestWorker|'s [=service worker/script resource map=][|request|'s [=request/url=]], or null if it does not [=map/exist=].
+ 1. Set |serviceWorker|'s [=service worker/include updated resources flag=] if any of the following are true:
+ * |newestWorker| is null.
+ * |resource| is null.
+ * |resource|'s [=response/body=] is not byte-for-byte identical with |response|'s [=response/body=].
+ 1. [=map/Set=] [=service worker/script resource map=][|request|'s [=request/url=]] to |response|.
+ 1. Set |serviceWorker|'s [=classic scripts imported flag=].
+ 1. Return |response|.
@@ -2069,7 +2077,7 @@ spec: webappsec-referrer-policy; urlPrefix: https://w3c.github.io/webappsec-refe
Privacy
- [=/Service workers=] introduce new persistent storage features including scope to registration map (for [=/service worker registrations=] and their [=/service workers=]), [=request response list=] and name to cache map (for caches), and script resource map (for script resources). In order to protect users from any potential unsanctioned tracking threat, these persistent storages *should* be cleared when users intend to clear them and *should* maintain and interoperate with existing user controls e.g. purging all existing persistent storages.
+ [=/Service workers=] introduce new persistent storage features including scope to registration map (for [=/service worker registrations=] and their [=/service workers=]), [=request response list=] and name to cache map (for caches), and [=service worker/script resource map=] (for script resources). In order to protect users from any potential unsanctioned tracking threat, these persistent storages *should* be cleared when users intend to clear them and *should* maintain and interoperate with existing user controls e.g. purging all existing persistent storages.
@@ -2147,8 +2155,12 @@ spec: webappsec-referrer-policy; urlPrefix: https://w3c.github.io/webappsec-refe
A job has a worker type ("classic
" or "module
").
+ A [=job=] has a script resource map which is an ordered map where the keys are [=/URLs=] and the values are [=/responses=].
+
A job has an update via cache mode, which is "`imports`", "`all`", or "`none`".
+ A [=job=] has a potentially include updated resources flag. It is initially unset.
+
A job has a client (a [=/service worker client=]). It is initially null.
A job has a referrer (a [=/URL=] or null).
@@ -2418,6 +2430,11 @@ spec: webappsec-referrer-policy; urlPrefix: https://w3c.github.io/webappsec-refe
1. Else:
1. Invoke [=Reject Job Promise=] with |job| and "{{SecurityError}}" {{DOMException}}.
1. Asynchronously complete these steps with a network error.
+ 1. Set |job|'s [=job/potentially include updated resources flag=] if any of the following are true:
+ * |newestWorker| is null.
+ * |newestWorker|'s [=classic scripts imported flag=] is set.
+ * |newestWorker|'s [=service worker/script resource map=][|request|'s [=request/url=]]'s [=response/body=] is not byte-for-byte identical with |response|'s [=response/body=].
+ 1. Set |job|'s [=job/script resource map=][|request|'s [=request/url=]] to |response|.
1. If |response|'s cache state is not "local
", set |registration|'s last update check time to the current time.
Issue: The response's cache state concept had been removed from fetch. The fetch issue #376 tracks the request to restore the concept or add some similar way to check this state.
@@ -2434,20 +2451,23 @@ spec: webappsec-referrer-policy; urlPrefix: https://w3c.github.io/webappsec-refe
1. Invoke Finish Job with |job| and abort these steps.
Else, continue the rest of these steps after the algorithm's asynchronous completion, with |script| being the asynchronous completion value.
-
- 1. If |newestWorker| is not null, |newestWorker|'s [=service worker/script url=] [=url/equals=] |job|'s [=job/script url=], and |script|'s [=source text=] is a byte-for-byte match with |newestWorker|'s [=script resource=]'s [=source text=], if |script| is a [=classic script=], and |script|'s [=module script/module record=]'s \[[ECMAScriptCode]] is a byte-for-byte match with |newestWorker|'s [=script resource=]'s [=module script/module record=]'s \[[ECMAScriptCode]] otherwise, then:
+ 1. If |job|'s [=job/potentially include updated resources flag=] is unset, then:
1. Invoke [=Resolve Job Promise=] with |job| and |registration|.
+ 1. Invoke [=Finish Job=] with |job| and abort these steps.
+ 1. Let |worker| be a new [=/service worker=].
+ 1. Set |worker|'s [=service worker/script url=] to |job|'s [=job/script url=], |worker|'s script resource to |script|, and |worker|'s [=service worker/type=] to |job|'s worker type.
+ 1. [=map/For each=] |url| → |response| of |job|'s [=job/script resource map=]:
+ 1. Set |worker|'s [=service worker/script resource map=][|url|] to |response|.
+ 1. Set |worker|'s script resource's HTTPS state to |httpsState|.
+ 1. Set |worker|'s script resource's [=script resource/referrer policy=] to |referrerPolicy|.
+ 1. Invoke Run Service Worker algorithm given |worker|, and with the *force bypass cache for importscripts flag* set if |job|'s [=job/force bypass cache flag=] is set.
+ 1. If an uncaught runtime script error occurs during the above step, then:
+ 1. Invoke [=Reject Job Promise=] with |job| and `TypeError`.
+ 1. If |newestWorker| is null, invoke Clear Registration algorithm passing |registration| as its argument.
1. Invoke Finish Job with |job| and abort these steps.
- 1. Else:
- 1. Let |worker| be a new [=/service worker=].
- 1. Set |worker|'s [=service worker/script url=] to |job|'s [=job/script url=], |worker|'s script resource to |script|, and |worker|'s [=service worker/type=] to |job|'s worker type.
- 1. Set |worker|'s script resource's HTTPS state to |httpsState|.
- 1. Set |worker|'s script resource's [=script resource/referrer policy=] to |referrerPolicy|.
- 1. Invoke Run Service Worker algorithm given |worker|, and with the *force bypass cache for importscripts flag* set if |job|'s [=job/force bypass cache flag=] is set.
- 1. If an uncaught runtime script error occurs during the above step, then:
- 1. Invoke [=Reject Job Promise=] with |job| and `TypeError`.
- 1. If |newestWorker| is null, invoke Clear Registration algorithm passing |registration| as its argument.
- 1. Invoke Finish Job with |job| and abort these steps.
+ 1. If |worker|'s [=classic scripts imported flag=] is set, and |worker|'s [=service worker/include updated resources flag=] is unset, then:
+ 1. Invoke [=Resolve Job Promise=] with |job| and |registration|.
+ 1. Invoke [=Finish Job=] with |job| and abort these steps.
1. Invoke Install algorithm with |job|, |worker|, and |registration| as its arguments.
@@ -2509,7 +2529,6 @@ spec: webappsec-referrer-policy; urlPrefix: https://w3c.github.io/webappsec-refe
1. Run the Update Registration State algorithm passing |registration|, "installing
" and null as the arguments.
1. If |newestWorker| is null, invoke Clear Registration algorithm passing |registration| as its argument.
1. Invoke Finish Job with |job| and abort these steps.
- 1. Set |registration|'s installing worker's imported scripts updated flag.
1. If |registration|'s waiting worker is not null, then:
1. [=Terminate Service Worker|Terminate=] |registration|'s [=waiting worker=].
1. Run the [=Update Worker State=] algorithm passing |registration|'s [=waiting worker=] and *redundant* as the arguments.