Skip to content

Commit

Permalink
Fix "attempt to populate a history entry's document"
Browse files Browse the repository at this point in the history
...largely by rewriting everything that takes place inside the queued task. Compared to the previous version, this one has a clearer if/otherwise branching structure, avoids any early returns, and makes it easier to follow when exactly the entry's document state's document is set to a non-null value and what impact that has.

This fixes a couple logic bugs where final steps were not getting applied quite correctly for all branches. Closes #9767.
  • Loading branch information
domenic authored Jan 11, 2024
1 parent a2bedd7 commit cdd014a
Showing 1 changed file with 138 additions and 98 deletions.
236 changes: 138 additions & 98 deletions source
Original file line number Diff line number Diff line change
Expand Up @@ -99467,67 +99467,93 @@ location.href = '#foo';</code></pre>

<ol>
<li><p>If <var>navigable</var>'s <span>ongoing navigation</span> no longer equals
<var>navigationId</var>, then run <var>completionSteps</var> and return.</p></li>

<li><p>Let <var>failure</var> be false.</p></li>
<var>navigationId</var>, then run <var>completionSteps</var> and abort these steps.</p></li>

<li>
<p>If <var>navigationParams</var> is a <span>non-fetch scheme navigation params</span>, then
set <var>entry</var>'s <span data-x="she-document-state">document state</span>'s <span
data-x="document-state-document">document</span> to the result of running <span>attempt to
create a non-fetch scheme document</span> given <var>navigationParams</var>.
</p>

<p class="note">The <var>entry</var>'s <span data-x="she-url">URL</span> might have been
changed within the previous step of this algorithm following an HTTP redirect.</p>
<p>Let <var>saveExtraDocumentState</var> be true.</p>

<div class="note">
<p>Usually, in the cases where we end up populating <var>entry</var>'s <span
data-x="she-document-state">document state</span>'s <span
data-x="document-state-document">document</span>, we then want to save some of the state
from that <code>Document</code> into <var>entry</var>. This ensures that if there are future
traversals to <var>entry</var> where its <span
data-x="document-state-document">document</span> <a href="#note-bfcache">has been
destroyed</a>, we can use that state when creating a new <code>Document</code>.</p>

<p>However, in some specific cases, saving the state would be unhelpful. For those, we set
<var>saveExtraDocumentState</var> to false later in this algorithm.</p>
</div>
</li>

<li><p>Otherwise, if <var>navigationParams</var> is null, then set <var>failure</var> to
true.</p></li>
<li>
<p>If <var>navigationParams</var> is a <span>non-fetch scheme navigation params</span>,
then:</p>

<ol>
<li>
<p>Set <var>entry</var>'s <span data-x="she-document-state">document state</span>'s <span
data-x="document-state-document">document</span> to the result of running <span>attempt to
create a non-fetch scheme document</span> given <var>navigationParams</var>.</p>

<p class="note">This can result in setting <var>entry</var>'s <span
data-x="she-document-state">document state</span>'s <span
data-x="document-state-document">document</span> to null, e.g., when <span data-x="hand-off
to external software">handing-off to external software</span>.</p>
</li>

<li><p>Otherwise, if the result of <span>should navigation response to navigation request of
type in target be blocked by Content Security Policy?</span> given
<var>navigationParams</var>'s <span data-x="navigation-params-request">request</span>,
<var>navigationParams</var>'s <span data-x="navigation-params-response">response</span>,
<var>navigationParams</var>'s <span data-x="navigation-params-policy-container">policy
container</span>'s <span data-x="policy-container-csp-list">CSP list</span>,
<var>cspNavigationType</var>, and <var>navigable</var> is "<code data-x="">Blocked</code>",
then set <var>failure</var> to true. <ref>CSP</ref></p></li>

<li><p>Otherwise, if <var>navigationParams</var>'s <span
data-x="navigation-params-reserved-environment">reserved environment</span> is non-null and
the result of <span data-x="check a navigation response's adherence to its embedder
policy">checking a navigation response's adherence to its embedder policy</span> given
<var>navigationParams</var>'s <span data-x="navigation-params-response">response</span>,
<var>navigable</var>, and <var>navigationParams</var>'s <span
data-x="navigation-params-policy-container">policy container</span>'s <span
data-x="policy-container-embedder-policy">embedder policy</span> is false, then set
<var>failure</var> to true.</p></li>

<li><p>Otherwise, if the result of <span data-x="check a navigation response's adherence to
`X-Frame-Options`">checking a navigation response's adherence to
`<code>X-Frame-Options</code>`</span> given <var>navigationParams</var>'s <span
data-x="navigation-params-response">response</span>, <var>navigable</var>,
<var>navigationParams</var>'s <span data-x="navigation-params-policy-container">policy
container</span>'s <span data-x="policy-container-csp-list">CSP list</span>, and
<var>navigationParams</var>'s <span data-x="navigation-params-origin">origin</span> is false,
then set <var>failure</var> to true.</p></li>
<li><p>Set <var>saveExtraDocumentState</var> to false.</p></li>
</ol>
</li>

<li>
<p>If <var>failure</var> is true, then:</p>
<p>Otherwise, if any of the following are true:</p>

<ul>
<li><p><var>navigationParams</var> is null;</p></li>

<li><p>the result of <span>should navigation response to navigation request of type in
target be blocked by Content Security Policy?</span> given <var>navigationParams</var>'s
<span data-x="navigation-params-request">request</span>, <var>navigationParams</var>'s <span
data-x="navigation-params-response">response</span>, <var>navigationParams</var>'s <span
data-x="navigation-params-policy-container">policy container</span>'s <span
data-x="policy-container-csp-list">CSP list</span>, <var>cspNavigationType</var>, and
<var>navigable</var> is "<code data-x="">Blocked</code>";</p></li>

<li><p><var>navigationParams</var>'s <span
data-x="navigation-params-reserved-environment">reserved environment</span> is non-null and
the result of <span data-x="check a navigation response's adherence to its embedder
policy">checking a navigation response's adherence to its embedder policy</span> given
<var>navigationParams</var>'s <span data-x="navigation-params-response">response</span>,
<var>navigable</var>, and <var>navigationParams</var>'s <span
data-x="navigation-params-policy-container">policy container</span>'s <span
data-x="policy-container-embedder-policy">embedder policy</span> is false; or </p></li>

<li><p>the result of <span data-x="check a navigation response's adherence to
`X-Frame-Options`">checking a navigation response's adherence to
`<code>X-Frame-Options</code>`</span> given <var>navigationParams</var>'s <span
data-x="navigation-params-response">response</span>, <var>navigable</var>,
<var>navigationParams</var>'s <span data-x="navigation-params-policy-container">policy
container</span>'s <span data-x="policy-container-csp-list">CSP list</span>, and
<var>navigationParams</var>'s <span data-x="navigation-params-origin">origin</span> is
false,</p></li>
</ul>

<p>then:</p>

<ol>
<li><p>Set <var>entry</var>'s <span data-x="she-document-state">document state</span>'s <span
data-x="document-state-document">document</span> to the result of <span
<li><p>Set <var>entry</var>'s <span data-x="she-document-state">document state</span>'s
<span data-x="document-state-document">document</span> to the result of <span
data-x="navigate-ua-inline">creating a document for inline content that doesn't have a
DOM</span>, given <var>navigable</var>, null, and
<var>navTimingType</var>. The inline content should indicate to the user the sort of error
that occurred.</p></li>
DOM</span>, given <var>navigable</var>, null, and <var>navTimingType</var>. The inline
content should indicate to the user the sort of error that occurred.</p></li>

<li><p>Set <var>entry</var>'s <span data-x="she-document-state">document state</span>'s
<span data-x="document-state-document">document</span>'s <i
data-x="concept-document-salvageable">salvageable</i> to false.</p></li>

<li><p>Set <var>saveExtraDocumentState</var> to false.</p></li>

<li>
<p>If <var>navigationParams</var> is not null, then:</p>

Expand All @@ -99549,22 +99575,6 @@ location.href = '#foo';</code></pre>
</ol>
</li>

<li>
<p>Otherwise, if <var>navigationParams</var>'s <span
data-x="navigation-params-response">response</span>'s <span
data-x="concept-response-status">status</span> is 204 or 205, then:</p>

<!-- Theoretically, HTTP 205 processing would occur here, resetting all forms with no other
effect. However, it seems nobody actually wants to use this ability, so requiring it here
seems like unnecessary work. -->

<ol>
<li><p>Run <var>completionSteps</var>.</p></li>

<li><p>Return.</p></li>
</ol>
</li>

<li id="navigation-as-a-download">
<p>Otherwise, if <var>navigationParams</var>'s <span
data-x="navigation-params-response">response</span> has a `<code
Expand Down Expand Up @@ -99602,56 +99612,86 @@ location.href = '#foo';</code></pre>
data-x="concept-response-url">URL</span>.</p></li>
</ol>
</li>
</ol>

<li><p>Run <var>completionSteps</var>.</p></li>
<p class="note">This branch leaves <var>entry</var>'s <span
data-x="she-document-state">document state</span>'s <span
data-x="document-state-document">document</span> as null.</p>
</li>

<li><p>Return.</p></li>
</ol>
<li>
<p>Otherwise, if <var>navigationParams</var>'s <span
data-x="navigation-params-response">response</span>'s <span
data-x="concept-response-status">status</span> is not 204 and is not 205, then set
<var>entry</var>'s <span data-x="she-document-state">document state</span>'s <span
data-x="document-state-document">document</span> to the result of <span>loading a
document</span> given <var>navigationParams</var>, <var>sourceSnapshotParams</var>, and
<var>entry</var>'s <span data-x="she-document-state">document state</span>'s <span
data-x="document-state-initiator-origin">initiator origin</span>.</p>

<p class="note">This can result in setting <var>entry</var>'s <span
data-x="she-document-state">document state</span>'s <span
data-x="document-state-document">document</span> to null, e.g., when <span data-x="hand-off
to external software">handing-off to external software</span>.</p>
</li>

<li>
<p>Otherwise:</p>
<p>If <var>entry</var>'s <span data-x="she-document-state">document state</span>'s <span
data-x="document-state-document">document</span> is not null, then:</p>

<ol>
<li><p>Let <var>document</var> be the result of <span>loading a document</span> given
<var>navigationParams</var>, <var>sourceSnapshotParams</var>, and <var>entry</var>'s <span
data-x="she-document-state">document state</span>'s <span
data-x="document-state-initiator-origin">initiator origin</span>.</p></li>
<li><p>Set <var>entry</var>'s <span data-x="she-document-state">document state</span>'s
<span data-x="document-state-ever-populated">ever populated</span> to true.</p></li>

<li><p>If <var>document</var> is null, then run <var>completionSteps</var> and
return.</p></li>
<li>
<p>If <var>saveExtraDocumentState</var> is true:</p>

<li><p>Set <var>entry</var>'s <span data-x="she-document-state">document state</span>'s
<span data-x="document-state-document">document</span> to <var>document</var>.</p></li>
<ol>
<li><p>Let <var>document</var> be <var>entry</var>'s <span
data-x="she-document-state">document state</span>'s <span
data-x="document-state-document">document</span>.</p></li>

<li><p>Set <var>entry</var>'s <span data-x="she-document-state">document state</span>'s
<span data-x="document-state-origin">origin</span> to <var>document</var>'s <span
data-x="concept-document-origin">origin</span>.</p></li>
<li><p>Set <var>entry</var>'s <span data-x="she-document-state">document state</span>'s
<span data-x="document-state-origin">origin</span> to <var>document</var>'s <span
data-x="concept-document-origin">origin</span>.</p></li>

<li><p>If <var>document</var>'s <span data-x="concept-document-url">URL</span> <span>requires
storing the policy container in history</span>, then set <var>entry</var>'s <span
data-x="she-document-state">document state</span>'s <span
data-x="document-state-history-policy-container">history policy container</span> to
<var>navigationParams</var>'s <span data-x="navigation-params-policy-container">policy
container</span>.</p></li>
</ol>
</li>
<li>
<p>If <var>document</var>'s <span data-x="concept-document-url">URL</span>
<span>requires storing the policy container in history</span>, then:</p>

<li>
<p>If <var>entry</var>'s <span data-x="she-document-state">document state</span>'s <span
data-x="document-state-request-referrer">request referrer</span> is "<code
data-x="">client</code>", then set it to <var>request</var>'s <span
data-x="concept-request-referrer">referrer</span>.</p>
<ol>
<li><p><span>Assert</span>: <var>navigationParams</var> is a <span>navigation
params</span> (i.e., neither null nor a <span>non-fetch scheme navigation
params</span>).</p></li>

<li><p>Set <var>entry</var>'s <span data-x="she-document-state">document state</span>'s
<span data-x="document-state-history-policy-container">history policy container</span>
to <var>navigationParams</var>'s <span
data-x="navigation-params-policy-container">policy container</span>.</p></li>
</ol>
</li>
</ol>
</li>

<p class="note">This ensures that if we traverse back <var>entry</var> and have to refetch,
we use the same <span data-x="concept-request-referrer">referrer</span>, instead of deriving
the referrer from the fetch client.</p>
</li>
<li>
<p>If <var>entry</var>'s <span data-x="she-document-state">document state</span>'s <span
data-x="document-state-request-referrer">request referrer</span> is "<code
data-x="">client</code>", and <var>navigationParams</var> is a <span>navigation
params</span> (i.e., neither null nor a <span>non-fetch scheme navigation params</span>),
then:</p>

<ol>
<li><p><span>Assert</span>: <var>navigationParams</var>'s <span
data-x="navigation-params-request">request</span> is not null.</p></li>

<li><p>If <var>entry</var>'s <span data-x="she-document-state">document state</span>'s <span
data-x="document-state-document">document</span> is not null, then set <var>entry</var>'s
<span data-x="she-document-state">document state</span>'s <span
data-x="document-state-ever-populated">ever populated</span> to true.</p></li>
<li><p>Set <var>entry</var>'s <span data-x="she-document-state">document state</span>'s
<span data-x="document-state-request-referrer">request referrer</span> to
<var>navigationParams</var>'s <span data-x="navigation-params-request">request</span>'s
<span data-x="concept-request-referrer">referrer</span>.</p></li>
</ol>
</li>
</ol>
</li>

<li><p>Run <var>completionSteps</var>.</p></li>
</ol>
Expand Down

0 comments on commit cdd014a

Please sign in to comment.