- From: Domenic Denicola <notifications@github.com>
- Date: Fri, 14 Jul 2023 00:34:52 -0700
- To: w3c/ServiceWorker <ServiceWorker@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/ServiceWorker/pull/1686/review/1529781080@github.com>
@domenic commented on this pull request. > + Promise<undefined> registerRouter((RouterRule or sequence<RouterRule>) rules); + }; + + dictionary RouterRule { + required RouterCondition condition; + required RouterSourceEnum source; + }; + + dictionary RouterCondition { + USVString urlPattern; + }; + + enum RouterSourceEnum { "network" }; + </pre> + + Each {{RouterCondition/urlPattern}} object has an associated <dfn>hostname component</dfn>, a [=urlpattern/component=], which is initially unset. This doesn't really work. You can't associate a component with a string inside a dictionary. I think the way to do this is to create a parallel hierarchy of [structs](https://infra.spec.whatwg.org/#structs) mirroring your dictionaries, that represent the parsed result. E.g. a "router rule" struct with: - source (a `RouterSourceEnum`) - condition (a router condition struct) and then a "router condition" struct with - urlPattern, a component Then the static router rules object should be a list of parsed "router rules", not a list of `RouterRule`s. > + }; + + enum RouterSourceEnum { "network" }; + </pre> + + Each {{RouterCondition/urlPattern}} object has an associated <dfn>hostname component</dfn>, a [=urlpattern/component=], which is initially unset. + + <section> + <h4 id="register-router-method">{{InstallEvent/registerRouter(rules)|event.registerRouter(rules)}}</h4> + + {{InstallEvent/registerRouter(rules)}} registers this service worker the rules to offload simple tasks that the fetch handler does. + + <dfn method for="InstallEvent"><code>registerRouter(|rules|)</code></dfn> method *must* run these steps: + + 1. Let |routerRules| be a list of {{RouterRule}} dictionaries. + 1. If |rules| is a {{RouterRule}} dictionary: It seems simpler to have one step be 1. If |rules| is a {{RouterRule}} dictionary, set |rules| to « |rules| ». (this is using the notation from https://infra.spec.whatwg.org/#lists). > @@ -3177,6 +3231,41 @@ spec: storage; urlPrefix: https://storage.spec.whatwg.org/ 1. Return |response|. </section> + <section algorithm> + <h3 id="verify-router-rule-algorithm"><dfn>VerifyRouterRule</dfn></h3> + + : Input + :: |rule|, a {{RouterRule}} + : Output + :: a boolean + + 1. If |rule|["{{RouterRule/condition}}"]["{{RouterCondition/urlPattern}}"] is the empty string, return false. + 1. Let |urlPattern| be a result of [=urlpattern/parsing=] |rule|["{{RouterRule/condition}}"]["{{RouterCondition/urlPattern}}"]. If a <code>TypeError</code> is thrown, return false. + 1. [=list/For each=] |part| of |urlPattern|: + 1. If |part|'s [=urlpattern-part/type=] is "regexp", return false. ```suggestion 1. If |part|'s [=urlpattern-part/type=] is "<code>regexp</code>", return false. ``` > + <section algorithm> + <h3 id="verify-router-rule-algorithm"><dfn>VerifyRouterRule</dfn></h3> + + : Input + :: |rule|, a {{RouterRule}} + : Output + :: a boolean + + 1. If |rule|["{{RouterRule/condition}}"]["{{RouterCondition/urlPattern}}"] is the empty string, return false. + 1. Let |urlPattern| be a result of [=urlpattern/parsing=] |rule|["{{RouterRule/condition}}"]["{{RouterCondition/urlPattern}}"]. If a <code>TypeError</code> is thrown, return false. + 1. [=list/For each=] |part| of |urlPattern|: + 1. If |part|'s [=urlpattern-part/type=] is "regexp", return false. + + Note: Since running a user-defined regular expression has a security concern, it is prohibited. + + 1. Set |urlPattern| to |rule|["{{RouterRule/condition}}"]["{{RouterCondition/urlPattern}}"]'s associated [=hostname component=]. You need to get the hostname component from somewhere. Right now you have a list of parts (|urlPattern|) and |rule|["{{RouterRule/condition}}"]["{{RouterCondition/urlPattern}}"], which is just a string. I don't know how to get a hostname component from either of those. > + + : Input + :: |rule|, a {{RouterRule}} + : Output + :: a boolean + + 1. If |rule|["{{RouterRule/condition}}"]["{{RouterCondition/urlPattern}}"] is the empty string, return false. + 1. Let |urlPattern| be a result of [=urlpattern/parsing=] |rule|["{{RouterRule/condition}}"]["{{RouterCondition/urlPattern}}"]. If a <code>TypeError</code> is thrown, return false. + 1. [=list/For each=] |part| of |urlPattern|: + 1. If |part|'s [=urlpattern-part/type=] is "regexp", return false. + + Note: Since running a user-defined regular expression has a security concern, it is prohibited. + + 1. Set |urlPattern| to |rule|["{{RouterRule/condition}}"]["{{RouterCondition/urlPattern}}"]'s associated [=hostname component=]. + 1. Return true. + </section> Probably we should return false if the pattern has any nontrivial components besides hostname, right? Otherwise people might try to use patterns like `/:foo` and not realize that will do nothing. (I don't know how to do that precisely since, per the above, I don't know how to get from a list of parts and a string to the relevant components.) -- Reply to this email directly or view it on GitHub: https://github.com/w3c/ServiceWorker/pull/1686#pullrequestreview-1529781080 You are receiving this because you are subscribed to this thread. Message ID: <w3c/ServiceWorker/pull/1686/review/1529781080@github.com>
Received on Friday, 14 July 2023 07:34:58 UTC