Skip to content

Commit cbb986b

Browse files
Define COEP:cors-or-credentialless
Specify the behavior of `Cross-Origin-Embedder-Policy: cors-or-credentialless`, Originally described in: https://github.com/mikewest/credentiallessness For the HTML spec: - `COEP:cors-or-credentialless` - `COEP:require-corp` have equivalent behavior.. Those value are said to be `compatible with crossOriginIsolation`. This patch rewrite the specification to use this concept. This patch is accompagned with a fetch specification patch: XXX COEP:cors-or-credentialless causes cross-origin no-cors request to omit credentials. In exchange, Cross-Origin-Resource-Policy in response isn't required.
1 parent 496413f commit cbb986b

1 file changed

Lines changed: 119 additions & 52 deletions

File tree

‎source‎

Lines changed: 119 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -78591,9 +78591,9 @@ console.assert(iframeWindow.frameElement === null);
7859178591
data-x="http-cross-origin-opener-policy">Cross-Origin-Opener-Policy</span>: <span
7859278592
data-x="coop-same-origin">same-origin</span></code>`, and</p></li>
7859378593

78594-
<li><p>every <span>Document</span> has `<code
78595-
data-x=""><span>Cross-Origin-Embedder-Policy</span>: <span
78596-
data-x="coep-require-corp">require-corp</span></code>`.</p></li>
78594+
<li><p>every <span>Document</span> has a `<code data-x="embedder policy value">
78595+
Cross-Origin-Embedder-Policy</code>value <span>compatible with crossOriginIsolation</span>.
78596+
</p></li>
7859778597
</ul>
7859878598

7859978599
<p>On some platforms, it is difficult to provide the security properties required to grant safe
@@ -81508,8 +81508,9 @@ interface <dfn>BarProp</dfn> {
8150881508
data-x="http-cross-origin-opener-policy">Cross-Origin-Opener-Policy</code>` header, but results
8150981509
from a combination of setting both `<code data-x=""><span
8151081510
data-x="http-cross-origin-opener-policy">Cross-Origin-Opener-Policy</span>: <span
81511-
data-x="coop-same-origin">same-origin</span></code>` and `<code
81512-
data-x=""><span>Cross-Origin-Embedder-Policy</span>: require-corp</code>` together.</p>
81511+
data-x="coop-same-origin">same-origin</span></code>` and a
81512+
`<code data-x="embedder policy value"> Cross-Origin-Embedder-Policy</code>` value
81513+
<span>compatible with crossOriginIsolation</span> together.<p>
8151381514
</dd>
8151481515
</dl>
8151581516

@@ -81598,10 +81599,10 @@ interface <dfn>BarProp</dfn> {
8159881599
policy">obtaining a cross-origin embedder policy</span> from <var>response</var> and
8159981600
<var>reservedEnvironment</var>.</p></li>
8160081601

81601-
<li><p>If <var>coep</var>'s <span data-x="embedder-policy-value">value</span> is "<code
81602-
data-x="coep-require-corp">require-corp</code>", then set <var>policy</var>'s <span
81603-
data-x="coop-struct-value">value</span> to "<code
81604-
data-x="coop-same-origin-plus-COEP">same-origin-plus-COEP</code>".</p></li>
81602+
<li><p>If <var>coep</var>'s <span data-x="embedder-policy-value">value</span> is
81603+
<span>compatible with crossOriginIsolation</span>, then set <var>policy</var>'s <span
81604+
data-x="coop-struct-value">value</span> to "<code data-x="coop-same-origin-plus-COEP">
81605+
same-origin-plus-COEP</code>".</p></li>
8160581606

8160681607
<li><p>Otherwise, set <var>policy</var>'s <span
8160781608
data-x="coop-struct-value">value</span> to "<code
@@ -81640,10 +81641,10 @@ interface <dfn>BarProp</dfn> {
8164081641
<var>reservedEnvironment</var>.</p></li>
8164181642

8164281643
<li>
81643-
<p>If <var>coep</var>'s <span data-x="embedder-policy-value">value</span> is "<code
81644-
data-x="coep-require-corp">require-corp</code>" or <var>coep</var>'s <span
81645-
data-x="embedder-policy-report-only-value">report-only value</span> is "<code
81646-
data-x="coep-require-corp">require-corp</code>", then set <var>policy</var>'s <span
81644+
<p>If <var>coep</var>'s <span data-x="embedder-policy-value">value</span> is
81645+
<span>compatible with crossOriginIsolation</span> or <var>coep</var>'s <span
81646+
data-x="embedder-policy-report-only-value">report-only value</span> is
81647+
<span>compatible with crossOriginIsolation</span>, then set <var>policy</var>'s <span
8164781648
data-x="coop-struct-report-only-value">report-only value</span> to "<code
8164881649
data-x="coop-same-origin-plus-COEP">same-origin-plus-COEP</code>".</p>
8164981650

@@ -82655,7 +82656,7 @@ interface <dfn>BarProp</dfn> {
8265582656
<h3 id="coep">Cross-origin embedder policies</h3>
8265682657

8265782658
<p>An <dfn export>embedder policy value</dfn> controls the fetching of cross-origin resources
82658-
without explicit permission from resource owners. There are two such values:</p>
82659+
without explicit permission from resource owners. There are three such values:</p>
8265982660

8266082661
<dl>
8266182662
<dt>"<dfn data-x="coep-unsafe-none" export for="embedder policy value"><code
@@ -82664,6 +82665,12 @@ interface <dfn>BarProp</dfn> {
8266482665
without giving explicit permission through the <span>CORS protocol</span> or the
8266582666
`<code>Cross-Origin-Resource-Policy</code>` header.</p></dd>
8266682667

82668+
<dt>"<dfn data-x="coep-cors-or-credentialless" export for="embedder policy value"><code
82669+
data-x="">cors-or-credentialless</code></dfn>"</dt>
82670+
<dd><p>When this value is used, fetching cross-origin no-CORS resources omits credentials. In
82671+
exchange, an explicit `<code>Cross-Origin-Resource-Policy</code>` on response is not required.
82672+
</p></dd>
82673+
8266782674
<dt>"<dfn data-x="coep-require-corp" export for="embedder policy value"><code
8266882675
data-x="">require-corp</code></dfn>"</dt>
8266982676
<dd><p>When this value is used, fetching cross-origin resources requires the server's
@@ -82774,18 +82781,31 @@ interface <dfn>BarProp</dfn> {
8277482781
with `<code>Cross-Origin-Embedder-Policy</code>` and "<code data-x="">item</code>" from
8277582782
<var>response</var>'s <span data-x="concept-response-header-list">header list</span>.</p></li>
8277682783

82777-
<li>
82778-
<p>If <var>parsedItem</var> is non-null and <var>parsedItem</var>[0] is "<code
82779-
data-x="">require-corp</code>":</p>
82780-
82784+
<li><p>If <var>parsedItem</var> is non-null</p>
8278182785
<ol>
82782-
<li><p>Set <var>policy</var>'s <span data-x="embedder-policy-value">value</span> to "<code
82783-
data-x="coep-require-corp">require-corp</code>".</p></li>.
82786+
<!--cors-or-credentialless-->
82787+
<li><p>If <var>parsedItem</var>[0] is "<code data-x="">cors-or-credentialless</code>":</p>
82788+
<ol>
82789+
<li><p>Set <var>policy</var>'s <span data-x="embedder-policy-value">value</span> to "<code
82790+
data-x="coep-cors-or-credentialless">cors-or-credentialless</code>".</p></li>.
8278482791

82785-
<li><p>If <var>parsedItem</var>[1]["<code data-x="coep-report-to">report-to</code>"] <span
82786-
data-x="map exists">exists</span>, then set <var>policy</var>'s <span
82787-
data-x="embedder-policy-reporting-endpoint">endpoint</span> to <var>parsedItem</var>[1]["<code
82788-
data-x="coep-report-to">report-to</code>"].</p></li>
82792+
<li><p>If <var>parsedItem</var>[1]["<code data-x="coep-report-to">report-to</code>"] <span
82793+
data-x="map exists">exists</span>, then set <var>policy</var>'s <span
82794+
data-x="embedder-policy-reporting-endpoint">endpoint</span> to <var>parsedItem</var>
82795+
[1]["<code data-x="coep-report-to">report-to</code>"].</p></li>
82796+
</ol>
82797+
82798+
<!--require-corp-->
82799+
<li><p>If <var>parsedItem</var>[0] is "<code data-x="">require-corp</code>":</p>
82800+
<ol>
82801+
<li><p>Set <var>policy</var>'s <span data-x="embedder-policy-value">value</span> to "<code
82802+
data-x="coep-require-corp">require-corp</code>".</p></li>.
82803+
82804+
<li><p>If <var>parsedItem</var>[1]["<code data-x="coep-report-to">report-to</code>"] <span
82805+
data-x="map exists">exists</span>, then set <var>policy</var>'s <span
82806+
data-x="embedder-policy-reporting-endpoint">endpoint</span> to <var>parsedItem</var>
82807+
[1]["<code data-x="coep-report-to">report-to</code>"].</p></li>
82808+
</ol>
8278982809
</ol>
8279082810
</li>
8279182811

@@ -82809,9 +82829,59 @@ interface <dfn>BarProp</dfn> {
8280982829
</ol>
8281082830
</li>
8281182831

82832+
<li><p>If <var>parsedItem</var> is non-null</p>
82833+
<ol>
82834+
<!--cors-or-credentialless-->
82835+
<li><p>If <var>parsedItem</var>[0] is "<code data-x="">cors-or-credentialless</code>":</p>
82836+
<ol>
82837+
<li><p>Set <var>policy</var>'s <span
82838+
data-x="embedder-policy-report-only-value">report-only value </span> to "<code
82839+
data-x="coep-cors-or-credentialless">cors-or-credentialless</code>".</p></li>.
82840+
82841+
<li><p>If <var>parsedItem</var>[1]["<code data-x="coep-report-to">report-to</code>"] <span
82842+
data-x="map exists">exists</span>, then set <var>policy</var>'s <span
82843+
data-x="embedder-policy-report-only-reporting-endpoint">report-only reporting endpoint
82844+
</span> to <var>parsedItem </var> [1]["<code data-x="coep-report-to">report-to</code>"].</p>
82845+
</li>
82846+
</ol>
82847+
82848+
<!--require-corp-->
82849+
<li><p>If <var>parsedItem</var>[0] is "<code data-x="">require-corp</code>":</p>
82850+
<ol>
82851+
<li><p>Set <var>policy</var>'s <span data-x="embedder-policy-report-only-value">value
82852+
</span> to "<code data-x="coep-require-corp">require-corp</code>".</p></li>.
82853+
82854+
<li><p>If <var>parsedItem</var>[1]["<code data-x="coep-report-to">report-to</code>"] <span
82855+
data-x="map exists">exists</span>, then set <var>policy</var>'s <span
82856+
data-x="embedder-policy-report-only-reporting-endpoint">report-only reporting endpoint
82857+
</span> to <var>parsedItem</var> [1]["<code data-x="coep-report-to">report-to</code>"].</p>
82858+
</li>
82859+
</ol>
82860+
</ol>
82861+
</li>
82862+
8281282863
<li><p>Return <var>policy</var>.</p></li>
8281382864
</ol>
8281482865

82866+
<h4>Compatible with crossOriginIsolated</h4>
82867+
82868+
<p>A <span data-x="embedder policy value">Cross-Origin-Embedder-Policy value</span> is
82869+
<dfn>compatible with crossOriginIsolation</dfn> following this table</p>
82870+
82871+
<table class="data">
82872+
<thead>
82873+
<tr>
82874+
<th><span data-x="embedder policy value">Value</span></th>
82875+
<th><span>Compatible with crossOriginIsolation</span></th>
82876+
</tr>
82877+
</thead>
82878+
<tbody>
82879+
<tr><td><code data-x="coep-unsafe-none">unsafe-none</code></td> <td>false</td></tr>
82880+
<tr><td><code data-x="coep-cors-or-credentialless">cors-or-credentialless</code></td><td>true
82881+
</td> </tr>
82882+
<tr><td><code data-x="coep-require-corp">require-corp</code></td> <td>true</td></tr>
82883+
</table>
82884+
8281582885
<h4>Embedder policy checks</h4>
8281682886

8281782887
<p>To <dfn>check a navigation response's adherence to its embedder policy</dfn> given a <span
@@ -82831,19 +82901,18 @@ interface <dfn>BarProp</dfn> {
8283182901
data-x="concept-document-embedder-policy">embedder policy</span>.</p></li>
8283282902

8283382903
<li><p>If <var>parentPolicy</var>'s <span data-x="embedder-policy-report-only-value">report-only
82834-
value</span> is "<code data-x="coep-require-corp">require-corp</code>" and
82835-
<var>responsePolicy</var>'s <span data-x="embedder-policy-value">value</span> is "<code
82836-
data-x="coep-unsafe-none">unsafe-none</code>", then <span>queue a cross-origin embedder policy
82837-
inheritance violation</span> with <var>response</var>, "<code data-x="">navigation</code>",
82838-
<var>parentPolicy</var>'s <span data-x="embedder-policy-report-only-reporting-endpoint">report
82839-
only reporting endpoint</span>, "<code data-x="">reporting</code>", and <var>target</var>'s <span
82904+
value</span> is <span>compatible with crossOriginIsolation</span> and
82905+
<var>responsePolicy</var>'s <span data-x="embedder-policy-value">value</span> is not, then
82906+
<span>queue a cross-origin embedder policy inheritance violation</span> with <var>response</var>,
82907+
"<code data-x="">navigation</code>", <var>parentPolicy</var>'s <span
82908+
data-x="embedder-policy-report-only-reporting-endpoint">report only reporting endpoint</span>,
82909+
"<code data-x="">reporting</code>", and <var>target</var>'s <span
8284082910
data-x="bc-container-document">container document</span>'s <span>relevant settings
8284182911
object</span>.</p></li>
8284282912

82843-
<li><p>If <var>parentPolicy</var>'s <span data-x="embedder-policy-value">value</span> is "<code
82844-
data-x="coep-unsafe-none">unsafe-none</code>" or <var>responsePolicy</var>'s <span
82845-
data-x="embedder-policy-value">value</span> is "<code
82846-
data-x="coep-require-corp">require-corp</code>", then return true.</p></li>
82913+
<li><p>If <var>parentPolicy</var>'s <span data-x="embedder-policy-value">value</span> is not
82914+
<span>compatible with crossOriginIsolation</span> or <var>responsePolicy</var>'s is
82915+
<span>compatible with crossOriginIsolation</span>, then return true.</p></li>
8284782916

8284882917
<li><p><span>Queue a cross-origin embedder policy inheritance violation</span> with
8284982918
<var>response</var>, "<code data-x="">navigation</code>", <var>parentPolicy</var>'s <span
@@ -82870,18 +82939,17 @@ interface <dfn>BarProp</dfn> {
8287082939
data-x="concept-settings-object-embedder-policy">embedder policy</span>.
8287182940

8287282941
<li><p>If <var>ownerPolicy</var>'s <span data-x="embedder-policy-report-only-value">report-only
82873-
value</span> is "<code data-x="coep-require-corp">require-corp</code>" and <var>policy</var>'s
82874-
<span data-x="embedder-policy-value">value</span> is "<code
82875-
data-x="coep-unsafe-none">unsafe-none</code>", then <span>queue a cross-origin embedder policy
82876-
inheritance violation</span> with <var>response</var>, "<code data-x="">worker
82942+
value</span> is <span>compatible with crossOriginIsolation</span> and <var>policy</var>'s
82943+
<span data-x="embedder-policy-value">value</span> is not, then <span>queue a cross-origin
82944+
embedder policy inheritance violation</span> with <var>response</var>, "<code data-x="">worker
8287782945
initialization</code>", <var>owner's policy</var>'s <span
8287882946
data-x="embedder-policy-report-only-reporting-endpoint">report only reporting endpoint</span>,
82879-
"<code data-x="">reporting</code>", and <var>owner</var>.</p></li>
82947+
"<code data-x="">reporting</code>", and
82948+
<var>owner</var>.</p></li>
8288082949

82881-
<li><p>If <var>ownerPolicy</var>'s <span data-x="embedder-policy-value">value</span> is "<code
82882-
data-x="coep-unsafe-none">unsafe-none</code>" or <var>policy</var>'s <span
82883-
data-x="embedder-policy-value">value</span> is "<code
82884-
data-x="coep-require-corp">require-corp</code>", then return true.</p></li>
82950+
<li><p>If <var>ownerPolicy</var>'s not <span>compatible with crossOriginIsolation</span>
82951+
or <var>policy</var>'s <span data-x="embedder-policy-value">value</span> is <span>compatible with
82952+
crossOriginisolation</span>, then return true.</p></li>
8288582953

8288682954
<li><p><span>Queue a cross-origin embedder policy inheritance violation</span> with
8288782955
<var>response</var>, "<code data-x="">worker initialization</code>", <var>owner's policy</var>'s
@@ -85230,9 +85298,9 @@ interface <dfn>Location</dfn> { // but see also <a href="#the-location-interface
8523085298

8523185299
<li>
8523285300
<p>If <var>sandboxFlags</var> is not empty and <var>responseCOOP</var>'s <span
85233-
data-x="coop-struct-value">value</span> is not "<code
85234-
data-x="coop-unsafe-none">unsafe-none</code>", then set <var>response</var> to an
85235-
appropriate <span>network error</span> and <span>break</span>.</p>
85301+
data-x="coop-struct-value">value</span> is <span>compatible with
85302+
crossOriginIsolation</span>, then set <var>response</var> to an appropriate <span>network
85303+
error</span> and <span>break</span>.</p>
8523685304

8523785305
<p class="note">This results in a network error as one cannot simultaneously provide a
8523885306
clean slate to a response using cross-origin opener policy and sandbox the result of
@@ -99731,12 +99799,11 @@ interface <dfn>SharedWorkerGlobalScope</dfn> : <span>WorkerGlobalScope</span> {
9973199799

9973299800
<li>
9973399801
<p>If <var>worker global scope</var>'s <span
99734-
data-x="concept-WorkerGlobalScope-embedder-policy">embedder policy</span> is "<code
99735-
data-x="coep-require-corp">require-corp</code>" and <var>is shared</var> is true, then set
99736-
<var>agent</var>'s <span>agent cluster</span>'s <span
99737-
data-x="agent-cluster-cross-origin-isolation">cross-origin isolation mode</span> to "<code
99738-
data-x="cross-origin-isolation-logical">logical</code>" or "<code
99739-
data-x="cross-origin-isolation-concrete">concrete</code>". The one chosen is
99802+
data-x="concept-WorkerGlobalScope-embedder-policy">embedder policy</span> is <span>compatible
99803+
with crossOriginIsolation</span> and <var>is shared</var> is true, then set <var>agent</var>'s
99804+
<span>agent cluster</span>'s <span data-x="agent-cluster-cross-origin-isolation">cross-origin
99805+
isolation mode</span> to "<code data-x="cross-origin-isolation-logical">logical</code>" or
99806+
"<code data-x="cross-origin-isolation-concrete">concrete</code>". The one chosen is
9974099807
<span>implementation-defined</span>.</p>
9974199808

9974299809
<p class="XXX">This really ought to be set when the agent cluster is created, which requires a

0 commit comments

Comments
 (0)