You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
In particular, any time we look up a prefetch record to use for a navigation request, we now look it up in (a snapshot of) the source document's list of prefetch records, instead of looking it up in the target navigable's active document's list of prefetch records.
This impacts cases like allowing prefetches to fulfill navigations to target="_blank" links, and also all prerender cases (where the target navigable is a new prerender navigable).
Fixes#261. Closes#267 by superseding it, although it is mostly a port of that PR updated on top of the current spec.
Co-authored-by: Hiroshige Hayashizaki <hiroshige@chromium.org>
Copy file name to clipboardExpand all lines: prefetch.bs
+16-8Lines changed: 16 additions & 8 deletions
Original file line number
Diff line number
Diff line change
@@ -242,12 +242,11 @@ The user agent may [=prefetch record/cancel and discard=] records from the [=Doc
242
242
</div>
243
243
244
244
<div algorithm>
245
-
To <dfn export>find a matching complete prefetch record</dfn> given a {{Document}} |document|, [=URL=] |url|, and [=sandboxing flag set=] |sandboxFlags|, perform the following steps.
245
+
To <dfn export>find a matching complete prefetch record</dfn> given a [=source snapshot params=] |sourceSnapshotParams|, [=URL=] |url|, and [=sandboxing flag set=] |sandboxFlags|, perform the following steps.
246
246
247
-
1. [=Assert=]: |document| is [=Document/fully active=].
248
247
1. Let |exactRecord| be null.
249
248
1. Let |inexactRecord| be null.
250
-
1. [=list/For each=] |record| of |document|'s [=Document/prefetch records=]:
249
+
1. [=list/For each=] |record| of |sourceSnapshotParams|'s [=source snapshot params/prefetch records=]:
251
250
1. If |record|'s [=prefetch record/state=] is not "`completed`", then [=iteration/continue=].
252
251
1. If |record|'s [=prefetch record/sandboxing flag set=] is empty and |sandboxFlags| is not empty, then [=iteration/continue=].
253
252
@@ -277,24 +276,24 @@ The user agent may [=prefetch record/cancel and discard=] records from the [=Doc
277
276
</div>
278
277
279
278
<div algorithm>
280
-
To <dfn export>wait for a matching prefetch record</dfn> given a {{Document}} |document|, [=URL=] |url|, and [=sandboxing flag set=] |sandboxFlags|, perform the following steps.
279
+
To <dfn export>wait for a matching prefetch record</dfn> given a [=source snapshot params=] |sourceSnapshotParams|, [=URL=] |url|, and [=sandboxing flag set=] |sandboxFlags|, perform the following steps.
281
280
282
281
1. [=Assert=]: this is running [=in parallel=].
283
282
1. Let |cutoffTime| be null.
284
283
1. While true:
285
284
1. Let |completeRecord| be the result of [=finding a matching complete prefetch record=] given |document|, |url|, and |sandboxFlags|.
286
285
1. If |completeRecord| is not null, return |completeRecord|.
287
286
1. Let |potentialRecords| be an empty [=list=].
288
-
1. [=list/For each=] |record| of |document|'s [=Document/prefetch records=]:
287
+
1. [=list/For each=] |record| of |sourceSnapshotParams|'s [=source snapshot params/prefetch records=]:
289
288
1. If all of the following are true, then [=list/append=] |record| to |potentialRecords|:
290
289
* |record|'s [=prefetch record/state=] is "`ongoing`".
291
290
* |record| [=prefetch record/is expected to match a URL=] given |url|.
292
291
* |record|'s [=prefetch record/sandboxing flag set=] is not empty or |sandboxFlags| is empty.
293
292
* |record|'s [=prefetch record/expiry time=] is greater than the [=current high resolution time=] for the [=relevant global object=] of |document|.
294
293
* |cutoffTime| is null or |record|'s [=prefetch record/start time=] is less than |cutoffTime|.
295
294
1. If |potentialRecords| [=list/is empty=], return null.
296
-
1. Wait until the [=prefetch record/state=] of any element of |document|'s [=Document/prefetch records=] changes.
297
-
1. If |cutoffTime| is null and any element of |potentialRecords| has a [=prefetch record/state=] that is not "`ongoing`", set |cutoffTime| to the [=current high resolution time=] for the[=relevant global object=] of |document|.
295
+
1. Wait until the [=prefetch record/state=] of any element of |sourceSnapshotParams|'s [=source snapshot params/prefetch records=] changes.
296
+
1. If |cutoffTime| is null and any element of |potentialRecords| has a [=prefetch record/state=] that is not "`ongoing`", set |cutoffTime| to the [=current high resolution time=] for |sourceSnapshotParams|'s [=source snapshot params/fetch client=]'s [=environment settings object/global object=].
298
297
299
298
<p class="note">The reasoning for setting the cutoff time *after* waiting for a prefetch record to finish is to allow for flexibility in selecting a prefetch to serve the navigation while still guaranteeing falling back to a non-prefetched navigation in the case of repeated prefetch failures. We allow blocking on prefetch attempts which started before we see an attempt fail, but we don't block on subsequent attempts. Notably, this approach: does not finalize the set of prefetches to block on at the start of the navigation; allows a prefetch which started and completed after the navigation started to serve the navigation; avoids the use of a fixed timeout, which would be arbitrary and detrimental to the use of prefetch with slower servers; and blocks on, at most, two nearly-consecutive prefetches before falling back to a conventional navigation.</p>
300
299
</div>
@@ -388,6 +387,15 @@ Update all creation sites to supply an empty string, except for any in this docu
388
387
389
388
<hr>
390
389
390
+
Add an additional item to [=source snapshot params=] as follows:
Modify the [=snapshot source snapshot params=] algorithm to set the return value's [=source snapshot params/prefetch records=] to a [=list/clone=] of <var ignore>sourceDocument</var>'s [=Document/prefetch records=].
396
+
397
+
<hr>
398
+
391
399
<div algorithm>
392
400
<div class="note">This is extracted from <a spec=HTML>create navigation params by fetching</a>.</div>
393
401
@@ -475,7 +483,7 @@ Update all creation sites to supply an empty string, except for any in this docu
475
483
476
484
1. Let |request| be the result of [=creating a navigation request=] given <var ignore>entry</var>, <var ignore>sourceSnapshotParams</var>'s [=source snapshot params/fetch client=], <var ignore>navigable</var>'s [=navigable/container=], and <var ignore>sourceSnapshotParams</var>'s [=source snapshot params/has transient activation=].
477
485
1. Set |request|'s [=request/replaces client id=] to <var ignore>navigable</var>'s [=navigable/active document=]'s [=relevant settings object=]'s [=environment/id=].
478
-
1. Let |prefetchRecord| be the result of [=waiting for a matching prefetch record=] given <var ignore>navigable</var>'s [=navigable/active document=], <var ignore>entry</var>'s [=session history entry/URL=], and <var ignore>targetSnapshotParams</var>'s [=target snapshot params/sandboxing flags=].
486
+
1. Let |prefetchRecord| be the result of [=waiting for a matching prefetch record=] given <var ignore>sourceSnapshotParams</var>, <var ignore>entry</var>'s [=session history entry/URL=], and <var ignore>targetSnapshotParams</var>'s [=target snapshot params/sandboxing flags=].
479
487
1. If <var ignore>documentResource</var> is null and |prefetchRecord| is not null:
480
488
1. Set <var ignore>navigationParams</var> to the result of [=creating navigation params from a prefetch record=] given <var ignore>navigable</var>, <var ignore>entry</var>'s [=session history entry/document state=], <var ignore>navigationId</var>, <var ignore>navTimingType</var>, <var ignore>request</var>, |prefetchRecord|, <var ignore>targetSnapshotParams</var>, and <var ignore>sourceSnapshotParams</var>.
481
489
1. [=Copy prefetch cookies=] given |prefetchRecord|'s [=prefetch record/isolated partition key=] and <var ignore>navigationParams</var>'s [=navigation params/reserved environment=].
0 commit comments