Skip to content

Commit

Permalink
Allow the addRoutes() to be called during installing (#1744)
Browse files Browse the repository at this point in the history
This is for addressing #1743.
`InstallEvent.addRoutes()` is allowed to be called during installing,
and the event wait until a promise returned by addRoutes() resolves.

Additional change:
- Update of the persistent data has been changed to follow how Chromium works.
- fetch-event existence check has been moved inside the loop.  It changed the rule verification order.
- introduced parallel queue to clarify rules added by `addRoutes()` will be added in this order even if
  `addRoutes()` can be called in parallel.
  • Loading branch information
yoshisatoyanagisawa authored Feb 4, 2025
1 parent 0c42aff commit b6ac20c
Showing 1 changed file with 23 additions and 6 deletions.
29 changes: 23 additions & 6 deletions docs/index.bs
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,8 @@ spec: storage; urlPrefix: https://storage.spec.whatwg.org/

A [=/service worker=] is said to be <dfn>running</dfn> if its [=event loop=] is running.

A [=/service worker=] has an associated <dfn>[[service worker queue]]</dfn> (a [=parallel queue=]).

<section>
<h4 id="service-worker-lifetime">Lifetime</h4>

Expand Down Expand Up @@ -1607,16 +1609,31 @@ spec: storage; urlPrefix: https://storage.spec.whatwg.org/

The <dfn method for="InstallEvent"><code>addRoutes(|rules|)</code></dfn> method steps are:

1. Let |serviceWorker| be the [=current global object=]'s associated [=ServiceWorkerGlobalScope/service worker=].
1. Let |routerRules| be a copy of |serviceWorker|'s [=list of router rules=].
1. If |rules| is a {{RouterRule}} dictionary, set |rules| to &#x00AB; |rules| &#x00BB;.
1. Let |serviceWorker| be the [=current global object=]'s associated [=ServiceWorkerGlobalScope/service worker=].
1. For each |rule| of |rules|:
1. If running the [=Verify Router Condition=] algorithm with |rule|["{{RouterRule/condition}}"] and |serviceWorker| returns false, return [=a promise rejected with=] a {{TypeError}}.
1. Append |rule| to |routerRules|.
1. If |routerRules| [=list/contains=] a {{RouterRule}} whose {{RouterRule/source}} is either of "{{RouterSourceEnum/fetch-event}}" or "{{RouterSourceEnum/race-network-and-fetch-handler}}", and |serviceWorker|'s [=set of event types to handle=] does not [=set/contain=] {{ServiceWorkerGlobalScope/fetch!!event}}, return [=a promise rejected with=] a {{TypeError}}.
1. Set |serviceWorker|'s [=service worker/list of router rules=] to |routerRules|.
1. Return [=a promise resolved with=] undefined.
1. If |rule|["{{RouterRule/source}}"] is either of "{{RouterSourceEnum/fetch-event}}" or "{{RouterSourceEnum/race-network-and-fetch-handler}}", and |serviceWorker|'s [=set of event types to handle=] does not [=set/contain=] {{ServiceWorkerGlobalScope/fetch!!event}}, return [=a promise rejected with=] a {{TypeError}}.
1. Let |lifetimePromise| be a new [=promise=].
1. [=ExtendableEvent/Add lifetime promise=] |lifetimePromise| to [=this=].

Note: {{InstallEvent/addRoutes(rules)|event.addRoutes(rules)}} extends the lifetime of the event by default as if {{ExtendableEvent/waitUntil()|event.waitUntil(promise)}} is called.

1. Let |promise| be a new [=promise=].
1. Upon [=upon fulfillment|fulfillment=] or [=upon rejection|rejection=] of |promise|, resolve |lifetimePromise| with undefined.

Note: this step is for making |lifetimePromise| always fullfilled to avoid the install event failure.

1. [=queue/Enqueue=] the following steps to [=[[service worker queue]]=]:
1. Let |allRules| be a copy of |serviceWorker|'s [=list of router rules=].
1. For each |rule| of |rules|:
1. Append |rule| to |allRules|.

1. Set |serviceWorker|'s [=service worker/list of router rules=] to |allRules|.
1. Let |serviceWorkerEventLoop| be the [=current global object=]'s [=event loop=].
1. [=Queue a task=] to run the following steps on |serviceWorkerEventLoop| using the [=DOM manipulation task source=]:
1. Resolve |promise| with undefined.
1. Return |promise|.
</section>
</section>

Expand Down

0 comments on commit b6ac20c

Please sign in to comment.