Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0e6d3b5

Browse files
authored
Introduce browsing context groups
The grouping concepts unit of related browsing contexts and unit of similar-origin browsing contexts were not accurate, due to browsing contexts being able to hold a sequence of (potentially cross-site) documents. Fixes whatwg#4198.
1 parent 12969e1 commit 0e6d3b5

File tree

1 file changed

+134
-37
lines changed

1 file changed

+134
-37
lines changed

source

+134-37
Original file line numberDiff line numberDiff line change
@@ -2637,6 +2637,7 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
26372637
<ul class="brief">
26382638
<li><dfn data-x="concept-host" data-x-href="https://url.spec.whatwg.org/#concept-host">host</dfn></li>
26392639
<li><dfn data-x-href="https://url.spec.whatwg.org/#host-public-suffix">public suffix</dfn></li>
2640+
<li><dfn data-x-href="https://url.spec.whatwg.org/#host-same-site">same site</dfn></li>
26402641
<li><dfn data-x="concept-domain" data-x-href="https://url.spec.whatwg.org/#concept-domain">domain</dfn></li>
26412642
<li><dfn data-x-href="https://url.spec.whatwg.org/#concept-ipv4">IPv4 address</dfn></li>
26422643
<li><dfn data-x-href="https://url.spec.whatwg.org/#concept-ipv6">IPv6 address</dfn></li>
@@ -77202,7 +77203,10 @@ dictionary <dfn>DragEventInit</dfn> : <span>MouseEventInit</span> {
7720277203
context</dfn>:</p>
7720377204

7720477205
<ol>
77205-
<li><p>Return the result of <span>creating a new browsing context</span> with null.</p></li>
77206+
<li><p>Let <var>group</var> be the result of <span>creating a new browsing context
77207+
group</span>.</p></li>
77208+
77209+
<li><p>Return <var>group</var>'s <span>browsing context set</span>[0].</p></li>
7720677210
</ol>
7720777211

7720877212
<p class="note">This creates a <span>top-level browsing context</span>.</p>
@@ -77214,6 +77218,13 @@ dictionary <dfn>DragEventInit</dfn> : <span>MouseEventInit</span> {
7721477218
<li><p>Let <var>browsingContext</var> be the result of <span>creating a new browsing
7721577219
context</span> with <var>opener</var>'s <span>active document</span>.</p></li>
7721677220

77221+
<li><p>Assert: <var>opener</var>'s <span>top-level browsing context</span>'s <span data-x="tlbc
77222+
group">group</span> is non-null, as <span data-x="navigate">navigating</span> invokes this
77223+
directly.</p></li>
77224+
77225+
<li><p><span data-x="bcg append">Append</span> <var>browsingContext</var> to <var>opener</var>'s
77226+
<span>top-level browsing context</span>'s <span data-x="tlbc group">group</span>.</p></li>
77227+
7721777228
<li><p>Set <var>browsingContext</var>'s <span>opener browsing context</span> to
7721877229
<var>opener</var>.</p></li>
7721977230

@@ -77303,6 +77314,9 @@ dictionary <dfn>DragEventInit</dfn> : <span>MouseEventInit</span> {
7730377314
data-export="">top-level browsing context</dfn> for itself and all of the browsing contexts for
7730477315
which it is an <span>ancestor browsing context</span>.</p>
7730577316

77317+
<p>A <span>top-level browsing context</span> has an associated <dfn data-x="tlbc
77318+
group">group</dfn> (null or a <span>browsing context group</span>). It is initially null.</p>
77319+
7730677320
<p>It is possible to create new browsing contexts that are related to a <span>top-level browsing
7730777321
context</span> without being nested through an element. Such browsing contexts are called <dfn
7730877322
data-x="auxiliary browsing context" data-lt="auxiliary browsing context" data-export="">auxiliary
@@ -77694,36 +77708,72 @@ console.assert(iframeWindow.frameElement === null);
7769477708

7769577709
<h4>Groupings of browsing contexts</h4>
7769677710

77697-
<p>Each <span>browsing context</span> is defined as having a list of one or more <dfn>directly
77698-
reachable browsing contexts</dfn>. These are:</p>
77711+
<p>A user agent holds a <dfn>browsing context group set</dfn> (a <span>set</span> of <span
77712+
data-x="browsing context group">browsing context groups</span>).</p>
7769977713

77700-
<ul>
77714+
<p>A <dfn>browsing context group</dfn> holds a <dfn>browsing context set</dfn> (a <span>set</span>
77715+
of <span data-x="top-level browsing context">top-level browsing contexts</span>).</p>
77716+
77717+
<p>To <dfn data-x="creating a new browsing context group">create a new browsing context
77718+
group</dfn>, run these steps:</p>
7770177719

77702-
<li>The <span>browsing context</span> itself.</li>
77720+
<ol>
77721+
<li><p>Let <var>group</var> be a new <span>browsing context group</span>.</p></li>
77722+
77723+
<li><p><span data-x="set append">Append</span> <var>group</var> to the user agent's
77724+
<span>browsing context group set</span>.</p></li>
7770377725

77704-
<li>All the <span>browsing context</span>'s <span data-x="child browsing context">child browsing
77705-
contexts</span>.</li>
77726+
<li><p><span data-x="bcg append">Append</span> the result of <span>creating a new browsing
77727+
context</span> with null to <var>group</var>.</p></li>
7770677728

77707-
<li>The <span>browsing context</span>'s <span>parent browsing context</span>.</li>
77729+
<li><p>Return <var>group</var>.</p></li>
77730+
</ol>
7770877731

77709-
<li>All the <span data-x="browsing context">browsing contexts</span> that have the <span>browsing
77710-
context</span> as their <span>opener browsing context</span>.</li>
77732+
<p>To <dfn data-x="bcg append">append</dfn> a <span>top-level browsing context</span>
77733+
<var>browsingContext</var> to a <span>browsing context group</span> <var>group</var>, run these
77734+
steps:</p>
7771177735

77712-
<li>The <span>browsing context</span>'s <span>opener browsing context</span>.</li>
77736+
<ol>
77737+
<li><p><span data-x="set append">Append</span> <var>browsingContext</var> to <var>group</var>'s
77738+
<span>browsing context set</span>.</p></li>
7771377739

77714-
</ul>
77740+
<li><p>Set <var>browsingContext</var>'s <span data-x="tlbc group">group</span> to
77741+
<var>group</var>.</p></li>
77742+
</ol>
77743+
77744+
<p>To <dfn data-x="bcg remove">remove</dfn> a <span>top-level browsing context</span>
77745+
<var>browsingContext</var>, run these steps:</p>
77746+
77747+
<ol>
77748+
<li><p>Assert: <var>browsingContext</var>'s <span data-x="tlbc group">group</span> is non-null,
77749+
because a <span>browsing context</span> only gets <span data-x="a browsing context is
77750+
discarded">discarded</span> once.</p></li>
77751+
77752+
<li><p>Let <var>group</var> be <var>browsingContext</var>'s <span data-x="tlbc
77753+
group">group</span>.</p></li>
77754+
77755+
<li><p>Set <var>browsingContext</var>'s <span data-x="tlbc group">group</span> to null.</p></li>
7771577756

77716-
<p>The transitive closure of all the <span data-x="browsing context">browsing contexts</span> that
77717-
are <span>directly reachable browsing contexts</span> forms a <dfn>unit of related browsing
77718-
contexts</dfn>.</p>
77757+
<li><p><span data-x="list remove">Remove</span> <var>browsingContext</var> from
77758+
<var>group</var>'s <span>browsing context set</span>.</p></li>
7771977759

77720-
<p>Each <span>unit of related browsing contexts</span> is then further divided into the smallest
77721-
number of groups such that every member of each group has an <span>active document</span> with an
77722-
<span>origin</span> that, through appropriate manipulation of the <code
77723-
data-x="dom-document-domain">document.domain</code> attribute, could be made to be <span>same
77724-
origin-domain</span> with other members of the group, but could not be made the same as members of
77725-
any other group. Each such group is a <dfn data-export="">unit of related similar-origin browsing
77726-
contexts</dfn>.</p>
77760+
<li><p>If <var>group</var>'s <span>browsing context set</span> <span data-x="list is empty">is
77761+
empty</span>, then <span data-x="list remove">remove</span> <var>group</var> from the user
77762+
agent's <span>browsing context group set</span>.</p></li>
77763+
</ol>
77764+
77765+
<p class="note"><span data-x="bcg append">Append</span> and <span data-x="bcg
77766+
remove">remove</span> are primitive operations that help define the lifetime of a <span>browsing
77767+
context group</span>. They are called from <span>creating a new browsing context group</span>,
77768+
<span>creating a new auxiliary browsing context</span>, and <span data-x="a browsing context is
77769+
discarded">discarding a browsing context</span>.</p>
77770+
77771+
<hr>
77772+
77773+
<p class="note">The HTML Standard used to define "<span
77774+
id="unit-of-related-browsing-contexts">unit of related browsing contexts</span>" and "<span
77775+
id="unit-of-related-similar-origin-browsing-contexts">unit of related similar-origin browsing
77776+
contexts</span>". These have been removed as they were not adequate.</p>
7772777777

7772877778
</div>
7772977779

@@ -77919,7 +77969,7 @@ console.assert(iframeWindow.frameElement === null);
7791977969
most recently focused, or more closely related.</p>
7792077970

7792177971
<p class="&#x0058;&#x0058;&#x0058;">This will be made more precise in <a
77922-
href="https://github.com/whatwg/html/issues/1440">issue #1440</a>.</p>
77972+
href="https://github.com/whatwg/html/issues/313">issue #313</a>.</p>
7792377973
</li>
7792477974

7792577975
<li>
@@ -79007,9 +79057,7 @@ dictionary <dfn>WindowPostMessageOptions</dfn> : <span>PostMessageOptions</span>
7900779057
<h4>Garbage collection and browsing contexts</h4>
7900879058

7900979059
<p>A <span>browsing context</span> has a strong reference to each of its <code>Document</code>
79010-
objects (due to its <span>session history</span>) and its <code>WindowProxy</code> object, and the
79011-
user agent itself has a strong reference to its <span data-x="top-level browsing
79012-
context">top-level browsing contexts</span>.</p>
79060+
objects (due to its <span>session history</span>) and its <code>WindowProxy</code> object.</p>
7901379061

7901479062
<p>A <code>Document</code> has a strong reference to its <code>Window</code> object.</p>
7901579063

@@ -79057,14 +79105,20 @@ dictionary <dfn>WindowPostMessageOptions</dfn> : <span>PostMessageOptions</span>
7905779105

7905879106
</ol>
7905979107

79060-
<p>When <dfn data-export="">a <em>browsing context</em> is discarded</dfn>, the strong reference
79061-
from the user agent itself to the <span>browsing context</span> must be severed, and all the
79062-
<code>Document</code> objects for all the entries in the <span>browsing context</span>'s session
79063-
history must be <span data-x="discard a document">discarded</span> as well.</p>
79108+
<p>To <dfn data-export="" data-x="a browsing context is discarded">discard</dfn> a <span>browsing
79109+
context</span> <var>browsingContext</var>, run these steps:</p>
79110+
79111+
<ol>
79112+
<li><p><span data-x="discard a document">Discard</span> all <code>Document</code> objects for all
79113+
the entries in <var>browsingContext</var>'s <span>session history</span>.</p></li>
79114+
79115+
<li><p>If <var>browsingContext</var> is a <span>top-level browsing context</span>, then
79116+
<span data-x="bcg remove">remove</span> <var>browsingContext</var>.</p></li>
79117+
</ol>
7906479118

7906579119
<p>User agents may <span data-x="a browsing context is discarded">discard</span> <span
7906679120
data-x="top-level browsing context">top-level browsing contexts</span> at any time (typically, in
79067-
response to user requests, e.g. when a user force-closes a window containing one or more <span
79121+
response to user requests, e.g., when a user force-closes a window containing one or more <span
7906879122
data-x="top-level browsing context">top-level browsing contexts</span>). Other <span
7906979123
data-x="browsing context">browsing contexts</span> must be discarded once their
7907079124
<code>WindowProxy</code> object is eligible for garbage collection, in addition to the other
@@ -89045,7 +89099,52 @@ import "https://example.com/foo/../module2.mjs";</code></pre>
8904589099
<p class="note">Conceptually, the <span>agent</span> concept is an architecture-independent,
8904689100
idealized "thread" in which JavaScript code runs. Such code can involve multiple globals/<span
8904789101
data-x="concept-global-object-realm">realms</span> that can synchronously access each other, and
89048-
thus need to run in a single execution thread.</p>
89102+
thus needs to run in a single execution thread.</p>
89103+
89104+
<p>To determine whether a <code>Window</code> object <var>A</var> and a <code>Window</code> object
89105+
<var>B</var> are considered <dfn>same-agent <code>Window</code> objects</dfn>, run
89106+
these steps:</p>
89107+
89108+
<ol>
89109+
<li>
89110+
<p>If <var>A</var>'s <span>relevant settings object</span>'s <span>responsible browsing
89111+
context</span>'s <span>top-level browsing context</span>'s <span data-x="tlbc
89112+
group">group</span> is not <var>B</var>'s <span>relevant settings object</span>'s
89113+
<span>responsible browsing context</span>'s <span>top-level browsing context</span>'s <span
89114+
data-x="tlbc group">group</span>, then return false.</p>
89115+
89116+
<p class="&#x0058;&#x0058;&#x0058;">Unfortunately this model falls apart the moment a
89117+
<span>browsing context</span> is <span data-x="a browsing context is
89118+
discarded">discarded</span>. <a href="https://github.com/whatwg/html/issues/4361">Issue
89119+
#4361</a> sketches a setup that could improve this situation.</p>
89120+
</li>
89121+
89122+
<li><p>Let <var>originA</var> be <var>A</var>'s <span>relevant settings object</span>'s <span
89123+
data-x="concept-settings-object-origin">origin</span> and <var>originB</var> be <var>B</var>'s
89124+
<span>relevant settings object</span>'s <span
89125+
data-x="concept-settings-object-origin">origin</span>.</p></li>
89126+
89127+
<li><p>If <var>originA</var> is <span>same origin</span> with <var>originB</var>, then return
89128+
true.</p></li>
89129+
89130+
<li><p>If <var>originA</var> or <var>originB</var> is not a <span
89131+
data-x="concept-origin-tuple">tuple origin</span>, then return false.</p></li>
89132+
89133+
<li><p>If <var>originA</var>'s <span data-x="concept-origin-scheme">scheme</span> is not
89134+
<var>originB</var>'s <span data-x="concept-origin-scheme">scheme</span>, then return
89135+
false.</p></li>
89136+
89137+
<li><p>If <var>originA</var>'s <span data-x="concept-origin-host">host</span> is <span>same
89138+
site</span> with <var>originB</var>'s <span data-x="concept-origin-host">host</span>, then return
89139+
true.</p></li>
89140+
89141+
<li><p>Return false.</p></li>
89142+
</ol>
89143+
89144+
<p class="note">All <span>same-agent <code>Window</code> objects</span> together represent a group
89145+
of <code>Window</code> objects that can synchronously access each other, though sometimes only
89146+
after setting the <code data-x="dom-document-domain">document.domain</code> attribute
89147+
(in)appropriately.</p>
8904989148

8905089149
<p>Until such a time that this standard has a better handle on lifetimes, it defines five types of
8905189150
<span data-x="agent">agents</span> that user agents must allocate at the appropriate time.</p>
@@ -89059,14 +89158,12 @@ import "https://example.com/foo/../module2.mjs";</code></pre>
8905989158
<dd>
8906089159
<p>An <span>agent</span> whose [[CanBlock]] is false and whose set of <span
8906189160
data-x="JavaScript realm">realms</span> consists of all <span
89062-
data-x="concept-global-object-realm">realms</span> of <code>Window</code> objects whose
89063-
<span>relevant settings object</span>'s <span>responsible browsing context</span> is in the same
89064-
<span>unit of related similar-origin browsing contexts</span>.</p>
89161+
data-x="concept-global-object-realm">realms</span> of all <span>same-agent <code>Window</code>
89162+
objects</span>.</p>
8906589163

8906689164
<p class="note">Two <code>Window</code> objects that are <span>same origin</span> can be in
8906789165
different <span data-x="similar-origin window agent">similar-origin window agents</span>, for
89068-
instance if they are each in their own <span>unit of related similar-origin browsing
89069-
contexts</span>.</p>
89166+
instance if they are each in their own <span>browsing context group</span>.</p>
8907089167
</dd>
8907189168

8907289169
<dt><dfn data-export="">Dedicated worker agent</dfn></dt>

0 commit comments

Comments
 (0)