- From: Jake Archibald <notifications@github.com>
- Date: Mon, 06 Mar 2023 01:53:57 -0800
- To: w3c/ServiceWorker <ServiceWorker@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/ServiceWorker/pull/1672/review/1325828853@github.com>
@jakearchibald requested changes on this pull request. This is really close to ready! The PR uses `<a spec="">…</a>` links to link to concepts that haven't been exported by other specs. Instead, PRs should be made against those specs to export those terms. Example: https://github.com/whatwg/html/pull/8924 > 1. Run the <a>responsible event loop</a> specified by |settingsObject| until it is destroyed. 1. [=map/Clear=] |workerGlobalScope|'s [=map of active timers=]. 1. Wait for |serviceWorker| to be [=running=], or for |startFailed| to be true. 1. If |startFailed| is true, then return *failure*. 1. Return |serviceWorker|'s [=start status=]. </section> + <section algorithm> + <h3 id="all-fetch-listeners-are-empty-algorithm"><dfn>All Fetch Listeners Are Empty</dfn></h3> + + : Input + :: |workerGlobalScope|, a [=service worker/global object=]. + : Output + :: a boolean + + 1. If |workerGlobalScope|'s [=set of event types to handle=] does not [=set/contain=] <code>fetch</code>, then returns true. ```suggestion 1. If |workerGlobalScope|'s [=set of event types to handle=] does not [=set/contain=] <code>fetch</code>, then return true. ``` > 1. Run the <a>responsible event loop</a> specified by |settingsObject| until it is destroyed. 1. [=map/Clear=] |workerGlobalScope|'s [=map of active timers=]. 1. Wait for |serviceWorker| to be [=running=], or for |startFailed| to be true. 1. If |startFailed| is true, then return *failure*. 1. Return |serviceWorker|'s [=start status=]. </section> + <section algorithm> + <h3 id="all-fetch-listeners-are-empty-algorithm"><dfn>All Fetch Listeners Are Empty</dfn></h3> + + : Input + :: |workerGlobalScope|, a [=service worker/global object=]. + : Output + :: a boolean + + 1. If |workerGlobalScope|'s [=set of event types to handle=] does not [=set/contain=] <code>fetch</code>, then returns true. + 1. Let |eventHandler| be |workerGlobalScope|'s <a spec="html">event handler map</a>["fetch"]'s value. ```suggestion 1. Let |eventHandler| be |workerGlobalScope|'s <a spec="html">event handler map</a>["onfetch"]'s value. ``` As per https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-name, handler names always start "`on`". > 1. Run the <a>responsible event loop</a> specified by |settingsObject| until it is destroyed. 1. [=map/Clear=] |workerGlobalScope|'s [=map of active timers=]. 1. Wait for |serviceWorker| to be [=running=], or for |startFailed| to be true. 1. If |startFailed| is true, then return *failure*. 1. Return |serviceWorker|'s [=start status=]. </section> + <section algorithm> + <h3 id="all-fetch-listeners-are-empty-algorithm"><dfn>All Fetch Listeners Are Empty</dfn></h3> + + : Input + :: |workerGlobalScope|, a [=service worker/global object=]. + : Output + :: a boolean + + 1. If |workerGlobalScope|'s [=set of event types to handle=] does not [=set/contain=] <code>fetch</code>, then returns true. + 1. Let |eventHandler| be |workerGlobalScope|'s <a spec="html">event handler map</a>["fetch"]'s value. + 1. Let |eventListenerList| be an empty [=list=]. + 1. [=list/For each=] |eventListener| of |workerGlobalScope|'s [=event listener list=]: + 1. If |eventListener|'s <a spec="dom">type</a> is <code>fetch</code>, then [=list/append=] |eventListener| to |eventListenerList|. ```suggestion 1. If |eventListener|'s <a spec="dom">type</a> is "<code>fetch</code>", then [=list/append=] |eventListener| to |eventListenerList|. ``` > 1. Run the <a>responsible event loop</a> specified by |settingsObject| until it is destroyed. 1. [=map/Clear=] |workerGlobalScope|'s [=map of active timers=]. 1. Wait for |serviceWorker| to be [=running=], or for |startFailed| to be true. 1. If |startFailed| is true, then return *failure*. 1. Return |serviceWorker|'s [=start status=]. </section> + <section algorithm> + <h3 id="all-fetch-listeners-are-empty-algorithm"><dfn>All Fetch Listeners Are Empty</dfn></h3> + + : Input + :: |workerGlobalScope|, a [=service worker/global object=]. + : Output + :: a boolean + + 1. If |workerGlobalScope|'s [=set of event types to handle=] does not [=set/contain=] <code>fetch</code>, then returns true. + 1. Let |eventHandler| be |workerGlobalScope|'s <a spec="html">event handler map</a>["fetch"]'s value. + 1. Let |eventListenerList| be an empty [=list=]. + 1. [=list/For each=] |eventListener| of |workerGlobalScope|'s [=event listener list=]: + 1. If |eventListener|'s <a spec="dom">type</a> is <code>fetch</code>, then [=list/append=] |eventListener| to |eventListenerList|. + 1. [=list/For each=] |eventListener| of |eventListenerList|: + 1. If |eventListener|'s [=callback=] is not null: ```suggestion 1. If |eventListener|'s [=event listener/callback=] is null, then [=continue=]. ``` Then un-indent the subsequent lines. This is mostly personal preference. I prefer early-return/continue rather than nesting everything in an `if`. I swapped `[=callback=]` for `[=event listener/callback=]`. It isn't an issue now, but it feels like this could become ambiguous in future. > + <section algorithm> + <h3 id="all-fetch-listeners-are-empty-algorithm"><dfn>All Fetch Listeners Are Empty</dfn></h3> + + : Input + :: |workerGlobalScope|, a [=service worker/global object=]. + : Output + :: a boolean + + 1. If |workerGlobalScope|'s [=set of event types to handle=] does not [=set/contain=] <code>fetch</code>, then returns true. + 1. Let |eventHandler| be |workerGlobalScope|'s <a spec="html">event handler map</a>["fetch"]'s value. + 1. Let |eventListenerList| be an empty [=list=]. + 1. [=list/For each=] |eventListener| of |workerGlobalScope|'s [=event listener list=]: + 1. If |eventListener|'s <a spec="dom">type</a> is <code>fetch</code>, then [=list/append=] |eventListener| to |eventListenerList|. + 1. [=list/For each=] |eventListener| of |eventListenerList|: + 1. If |eventListener|'s [=callback=] is not null: + 1. If |eventListener| equals |eventHandler|'s <a spec="html">listener</a>, then set |callback| to the result of [=converting|convert to an ECMAScript value=] |eventHandler|'s value to an ECMAScript value. "|eventHandler|" may be null here. Also, "value" in "|eventHandler|'s value" needs to be referenced properly. > + 1. Let |eventHandler| be |workerGlobalScope|'s <a spec="html">event handler map</a>["fetch"]'s value. + 1. Let |eventListenerList| be an empty [=list=]. + 1. [=list/For each=] |eventListener| of |workerGlobalScope|'s [=event listener list=]: + 1. If |eventListener|'s <a spec="dom">type</a> is <code>fetch</code>, then [=list/append=] |eventListener| to |eventListenerList|. + 1. [=list/For each=] |eventListener| of |eventListenerList|: + 1. If |eventListener|'s [=callback=] is not null: + 1. If |eventListener| equals |eventHandler|'s <a spec="html">listener</a>, then set |callback| to the result of [=converting|convert to an ECMAScript value=] |eventHandler|'s value to an ECMAScript value. + 1. Otherwise, set |callback| to the result of [=converting|convert to an ECMAScript value=] |eventListener|'s [=callback=] to an ECMAScript value. + 1. If [$IsCallable$](|callback|) is false: + 1. Let |getResult| be [=Completion=]([$Get$](|callback|), <code>handleEvent</code>). + 1. If |getResult| is [=abrupt completion=], then return false. + 1. Set |callback| to |getResult|. + 1. If [$IsCallable$](|callback|) is false, then return false. + 1. If |callback|'s [=function body=] is not empty (i.e. either a [=statement=] or [=declaration=] exist), then return false. + + Note: it detects something like `onfetch = () => {}`. Some sites have a fetch event listener with empty body to make them recognized as progressive web application (PWA). ```suggestion Note: This detects "<code>fetch</code>" listeners like `() => {}`. Some sites have a fetch event listener with empty body to make them recognized by Chromium as a progressive web application (PWA). ``` > + 1. [=list/For each=] |eventListener| of |eventListenerList|: + 1. If |eventListener|'s [=callback=] is not null: + 1. If |eventListener| equals |eventHandler|'s <a spec="html">listener</a>, then set |callback| to the result of [=converting|convert to an ECMAScript value=] |eventHandler|'s value to an ECMAScript value. + 1. Otherwise, set |callback| to the result of [=converting|convert to an ECMAScript value=] |eventListener|'s [=callback=] to an ECMAScript value. + 1. If [$IsCallable$](|callback|) is false: + 1. Let |getResult| be [=Completion=]([$Get$](|callback|), <code>handleEvent</code>). + 1. If |getResult| is [=abrupt completion=], then return false. + 1. Set |callback| to |getResult|. + 1. If [$IsCallable$](|callback|) is false, then return false. + 1. If |callback|'s [=function body=] is not empty (i.e. either a [=statement=] or [=declaration=] exist), then return false. + + Note: it detects something like `onfetch = () => {}`. Some sites have a fetch event listener with empty body to make them recognized as progressive web application (PWA). + + 1. Return true. + + Note: the user agents are encouraged to show warnings that the event listeners are no-op, and their executions can be skipped. ```suggestion Note: User agents are encouraged to show a warning indicating that empty "<code>fetch</code>" listeners are unnecessary, and may have a negative performance impact. ``` -- Reply to this email directly or view it on GitHub: https://github.com/w3c/ServiceWorker/pull/1672#pullrequestreview-1325828853 You are receiving this because you are subscribed to this thread. Message ID: <w3c/ServiceWorker/pull/1672/review/1325828853@github.com>
Received on Monday, 6 March 2023 09:54:09 UTC