Skip to content

Commit e9ccb97

Browse files
authored
Editorial: clarify worker lifetime definitions
The previous definitions relied on long prose sentences with lots of conjunctions and disjunctions. Change them to algorithms that return true or false. These algorithms also operate on the well-defined concept of a WorkerGlobalScope object, instead of the ill-defined concept of a "worker". Rearrange the order to be actively needed, then protected, then permissible, since these are ever-widening definitions. Add a clarifying note summarizing how these terms are used, and their relationship to each other, and their relationship to bfcache. Add a definition, and clarifying note, for the "between-loads shared worker timeout", to make it more prominent.
1 parent 16cb780 commit e9ccb97

File tree

1 file changed

+138
-42
lines changed

1 file changed

+138
-42
lines changed

source

Lines changed: 138 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -122199,8 +122199,8 @@ interface <dfn interface>BroadcastChannel</dfn> : <span>EventTarget</span> {
122199122199
<code>Document</code></span> is <span>fully active</span>, or</p></li>
122200122200

122201122201
<li><p>a <code>WorkerGlobalScope</code> object whose <span
122202-
data-x="dom-WorkerGlobalScope-closing">closing</span> flag is false and whose
122203-
<span>worker</span> is not a <span>suspendable worker</span>.</p></li>
122202+
data-x="dom-WorkerGlobalScope-closing">closing</span> flag is false and is not <span
122203+
data-x="suspendable worker">suspendable</span>.</p></li>
122204122204
</ul>
122205122205

122206122206
<p>The <dfn method for="BroadcastChannel"><code
@@ -123081,35 +123081,132 @@ interface <dfn interface>SharedWorkerGlobalScope</dfn> : <span>WorkerGlobalScope
123081123081

123082123082
<hr>
123083123083

123084-
<p>A worker is said to be a <dfn>permissible worker</dfn> if its <code>WorkerGlobalScope</code>'s
123085-
<span>owner set</span> is not <span data-x="list is empty">empty</span> or:</p>
123084+
<p>A user agent has an <span>implementation-defined</span> value, the <dfn>between-loads shared
123085+
worker timeout</dfn>, which is some small amount of time. This represents how long the user agent
123086+
allows shared workers to survive while a page is loading, in case that page is going to contact
123087+
the shared worker again. Setting this value to greater than zero lets user agents avoid the cost
123088+
of restarting a shared worker used by a site when the user is navigating from page to page within
123089+
that site.</p>
123086123090

123087-
<ul class=brief>
123088-
<li>its <span>owner set</span> has been <span data-x="list is empty">empty</span> for no more
123089-
than a short <span>implementation-defined</span> timeout value,</li>
123090-
<li>its <code>WorkerGlobalScope</code> object is a <code>SharedWorkerGlobalScope</code> object
123091-
(i.e., the worker is a shared worker), and</li>
123092-
<li>the user agent has a <span>navigable</span> whose <span data-x="nav-document">active
123093-
document</span> is not <span>completely loaded</span>.</li>
123094-
</ul>
123091+
<p class="note">A typical value for the <span>between-loads shared worker timeout</span> might be
123092+
5 seconds.</p>
123093+
123094+
<hr>
123095+
123096+
<p>A <code>WorkerGlobalScope</code> <var>global</var> is <dfn data-x="active needed
123097+
worker">actively needed</dfn> if the following algorithm returns true:</p>
123098+
123099+
<ol>
123100+
<li>
123101+
<p><span data-x="list iterate">For each</span> <var>owner</var> of <var>global</var>'s
123102+
<span>owner set</span>:</p>
123103+
123104+
<ol>
123105+
<li><p>If <var>owner</var> is a <code>Document</code>, and <var>owner</var> is <span>fully
123106+
active</span>, then return true.</p></li>
123107+
123108+
<li><p>If <var>owner</var> is a <code>WorkerGlobalScope</code> that is <span data-x="active
123109+
needed worker">actively needed</span>, then return true.</p></li>
123110+
</ol>
123111+
</li>
123112+
123113+
<li><p>Return false.</p></li>
123114+
</ol>
123115+
123116+
<p>A <code>WorkerGlobalScope</code> <var>global</var> is <dfn data-x="protected
123117+
worker">protected</dfn> if the following algorithm returns true:</p>
123118+
123119+
<ol>
123120+
<li><p>If <var>global</var> is not <span data-x="active needed worker">actively needed</span>,
123121+
then return false.</p></li>
123122+
123123+
<li><p>If <var>global</var> is a <code>SharedWorkerGlobalScope</code>, then return true.</p></li>
123124+
123125+
<li><p>If <var>global</var>'s <span>the worker's ports</span> is not <span data-x="list is
123126+
empty">empty</span>, then return true.</p></li>
123127+
123128+
<li><p>If <var>global</var> has outstanding timers, database transactions, or network
123129+
connections, then return true.</p></li>
123130+
<!-- TODO: would be nice to make the above rigorous. -->
123131+
123132+
<li><p>Return false.</p></li>
123133+
</ol>
123134+
123135+
<p>A <code>WorkerGlobalScope</code> <var>global</var> is <dfn data-x="permissible
123136+
worker">permissible</dfn> if the following algorithm returns true:</p>
123137+
123138+
<ol>
123139+
<li><p>If <var>global</var>'s <span>owner set</span> is not <span data-x="list is
123140+
empty">empty</span>, then return true.</p></li>
123141+
123142+
<li>
123143+
<p>If all of the following are true:</p>
123095123144

123096-
<p class="note">The second part of this definition allows a shared worker to survive for a short
123097-
time while a page is loading, in case that page is going to contact the shared worker again. This
123098-
can be used by user agents as a way to avoid the cost of restarting a shared worker used by a site
123099-
when the user is navigating from page to page within that site.</p>
123145+
<ul>
123146+
<li><p><var>global</var> is a <code>SharedWorkerGlobalScope</code>;</p></li>
123147+
123148+
<li><p><var>global</var>'s <span>owner set</span> has been <span data-x="list is
123149+
empty">empty</span> for no more than the user agent's <span>between-loads shared worker
123150+
timeout</span>; and</p>
123151+
123152+
<li><p>the user agent has a <span>navigable</span> whose <span data-x="nav-document">active
123153+
document</span> is not <span>completely loaded</span>,</p></li>
123154+
</ul>
123155+
123156+
<p>then return true.</p>
123157+
</li>
123158+
123159+
<li><p>Return false.</p></li>
123160+
</ol>
123100123161

123101-
<p>A worker is said to be an <dfn>active needed worker</dfn> if any of its <span data-x="owner
123102-
set">owners</span> are either <code>Document</code> objects that are <span>fully active</span> or
123103-
<span data-x="active needed worker">active needed workers</span>.</p>
123162+
<p>A <code>WorkerGlobalScope</code> <var>global</var> is <dfn data-x="suspendable
123163+
worker">suspendable</dfn> if the following algorithm returns true:</p>
123104123164

123105-
<p>A worker is said to be a <dfn>protected worker</dfn> if it is an <span>active needed
123106-
worker</span> and either it has outstanding timers, database transactions, or network connections,
123107-
or its list of <span>the worker's ports</span> is not empty, or its <code>WorkerGlobalScope</code>
123108-
is actually a <code>SharedWorkerGlobalScope</code> object (i.e., the worker is a shared
123109-
worker).</p>
123165+
<ol>
123166+
<li><p>If <var>global</var> is <span data-x="active needed worker">actively needed</span>, then
123167+
return false.</p></li>
123110123168

123111-
<p>A worker is said to be a <dfn>suspendable worker</dfn> if it is not an <span>active needed
123112-
worker</span> but it is a <span>permissible worker</span>.</p>
123169+
<li><p>If <var>global</var> is <span data-x="permissible worker">permissible</span>, then return
123170+
true.</p></li>
123171+
123172+
<li><p>Return false.</p></li>
123173+
</ol>
123174+
123175+
<div class="note" id="note-worker-lifetime-terminology">
123176+
<p>These concepts are used elsewhere in the specification's normative requirements as
123177+
follows:</p>
123178+
123179+
<ul>
123180+
<li><p>Workers get <a href="#step-closing-orphan-workers">closed as orphans</a> between when
123181+
they stop being <span data-x="protected worker">protected</span> and when they stop being <span
123182+
data-x="permissible worker">permissible</span>.</p></li>
123183+
123184+
<li><p>Workers get <a href="#step-suspending-workers">suspended or un-suspended</a> based on
123185+
whether they are <span data-x="suspendable worker">suspendable</span>.</p></li>
123186+
123187+
<li><p>Workers that have been closed, but keep executing, <a
123188+
href="#terminate-rampant-workers">can be terminated</a> at the user agent's discretion, once
123189+
they stop being <span data-x="active needed worker">actively needed</span>.</p></li>
123190+
</ul>
123191+
123192+
<p>Note that every <code>WorkerGlobalScope</code> that is <span data-x="active needed
123193+
worker">actively needed</span> is <span data-x="protected worker">protected</span>, and every
123194+
<code>WorkerGlobalScope</code> that is <span data-x="protected worker">protected</span> is <span
123195+
data-x="permissible worker">permissible</span>. (But the converses do not hold.)</p>
123196+
123197+
<p>An important difference between <span data-x="protected worker">protected</span> and <span
123198+
data-x="permissible worker">permissible</span> is that a <code>WorkerGlobalScope</code> is <span
123199+
data-x="protected worker">protected</span> only if its transitive set of owners contains at least
123200+
one <span>fully active</span> <code>Document</code>, whereas a <code>WorkerGlobalScope</code> can
123201+
be <span data-x="permissible worker">permissible</span> even if all the <code>Document</code>s in
123202+
its transitive set of owners are in <a href="#note-bfcache">bfcache</a>.</p>
123203+
</div>
123204+
123205+
<p class="note" id="note-between-loads-shared-worker-timeout-lifetime">The <span>between-loads
123206+
shared worker timeout</span> only influences the definition of <span data-x="permissible
123207+
worker">permissible</span>, not <span data-x="protected worker">protected</span>, and so
123208+
implementations are not required to keep shared workers alive for that duration. Rather, they are
123209+
required to close shared workers after the timeout is reached.</p>
123113123210

123114123211

123115123212
<h4 id="worker-processing-model"><span id="processing-model-10"></span>Processing model</h4>
@@ -123333,21 +123430,19 @@ interface <dfn interface>SharedWorkerGlobalScope</dfn> : <span>WorkerGlobalScope
123333123430
<li><p>Create a new <code>WorkerLocation</code> object and associate it with <var>worker global
123334123431
scope</var>.</p>
123335123432

123336-
<li>
123337-
<p><i>Closing orphan workers</i>: Start monitoring the worker such that no sooner than
123338-
it stops being a <span>protected worker</span>, and no later than it stops being a
123339-
<span>permissible worker</span>, <var>worker global scope</var>'s <span
123340-
data-x="dom-WorkerGlobalScope-closing">closing</span> flag is set to true.</p>
123341-
</li>
123433+
<li id="step-closing-orphan-workers"><p><i>Closing orphan workers</i>: Start monitoring
123434+
<var>worker global scope</var> such that no sooner than it stops being <span data-x="protected
123435+
worker">protected</span>, and no later than it stops being <span data-x="permissible
123436+
worker">permissible</span>, <var>worker global scope</var>'s <span
123437+
data-x="dom-WorkerGlobalScope-closing">closing</span> flag is set to true.</p></li>
123342123438

123343-
<li>
123344-
<p><i>Suspending workers</i>: Start monitoring the worker, such that whenever
123345-
<var>worker global scope</var>'s <span data-x="dom-WorkerGlobalScope-closing">closing</span>
123346-
flag is false and the worker is a <span>suspendable worker</span>, the user agent suspends
123347-
execution of script in that worker until such time as either the <span
123348-
data-x="dom-WorkerGlobalScope-closing">closing</span> flag switches to true or the worker stops
123349-
being a <span>suspendable worker</span>.</p>
123350-
</li>
123439+
<li id="step-suspending-workers"><p><i>Suspending workers</i>: Start monitoring <var>worker
123440+
global scope</var>, such that whenever <var>worker global scope</var>'s <span
123441+
data-x="dom-WorkerGlobalScope-closing">closing</span> flag is false and it is <span
123442+
data-x="suspendable worker">suspendable</span>, the user agent suspends execution of script in
123443+
<var>worker global scope</var> until such time as either the <span
123444+
data-x="dom-WorkerGlobalScope-closing">closing</span> flag switches to true or <var>worker
123445+
global scope</var> stops being <span data-x="suspendable worker">suspendable</span>.</p></li>
123351123446

123352123447
<li><p>Set <var>inside settings</var>'s <span
123353123448
data-x="concept-environment-execution-ready-flag">execution ready flag</span>.</p></li>
@@ -123439,8 +123534,9 @@ interface <dfn interface>SharedWorkerGlobalScope</dfn> : <span>WorkerGlobalScope
123439123534
entangled with.</p></li>
123440123535
</ol>
123441123536

123442-
<p>User agents may invoke the <span>terminate a worker</span> algorithm when a worker stops being
123443-
an <span>active needed worker</span> and the worker continues executing even after its <span
123537+
<p id="terminate-rampant-workers">User agents may invoke the <span>terminate a worker</span>
123538+
algorithm when a worker stops being <span data-x="active needed worker">actively needed</span> and
123539+
the worker continues executing even after its <span
123444123540
data-x="dom-WorkerGlobalScope-closing">closing</span> flag was set to true.</p>
123445123541

123446123542
</div>

0 commit comments

Comments
 (0)