1. 概念
鉴于存储分区,本规范定义了将在同一分区内发生导航的预取(例如,同一网站内的顶级导航)和将在不同分区内发生导航的预取(例如,前往不同网站的顶级导航)。
-
将redirectChain最后一项的请求设置为request的克隆。
克隆可确保在后续重定向期间对request进行的任何修改不会影响存储的请求,后者在激活时(在根据预取记录创建导航参数)需要用于获取原始重定向链的全貌。目前已知唯一在请求字段发生变更且激活时也需要查询的情况是referrer字段,但为规范的健壮性,我们克隆整个请求。
由于预取仅对
`GET`请求进行,请求主体始终为null,因此克隆过程很简单。 -
将redirectChain最后一项的响应设置为response。
每个Document都有预取记录,它是一个列表,包括预取记录。
-
URL,一个URL
-
匿名策略,一个预取IP匿名策略
-
引用者策略,一个referrer policy
-
No-Vary-Search提示,一个URL搜索变体
-
来源,一个字符串
用于规范或实现自定义功能标识其创建的预取。也可关联其他数据。 -
预渲染可遍历对象,一个预渲染可遍历对象、“
待创建”或null(默认null) -
预渲染目标可导航名称提示,一个有效可导航目标名称或关键字或null(默认null)
-
状态,“
进行中”(默认)、“已完成”或“已取消”“已取消”表示预取被作者或用户中止,或被代理终止。 -
重定向链,一个重定向链(默认空)
-
开始时间,一个
DOMHighResTimeStamp(默认0.0) -
过期时间,一个
DOMHighResTimeStamp(默认0.0) -
来源分区键,一个网络分区键或null(默认)
-
曾有冲突的凭据,一个布尔值(初始为false)
一个本应携带凭据但由于跨分区预取而无法发送凭据的请求将导致预取被放弃。
预取记录的响应为其重定向链最后一个元素的响应,若该列表为空则为null。
即使没有过期,用户代理也可取消和丢弃预取记录,比如因资源受限。已完成记录且过期时间在过去的,永远不会成为匹配预取记录,可无影响地移除。
-
如果prefetchRecord匹配URL给定url,返回true。
-
如果prefetchRecord的响应为null:
-
令searchVariance为prefetchRecord的No-Vary-Search提示。
-
-
否则返回false。
Document
document,执行以下步骤:
-
将prefetchRecord的状态设置为“
已取消”。 -
触发预取状态更新事件,参数为document的节点可导航对象、prefetchRecord和“
失败”状态。
即使是已完成的预取或预渲染也不会被激活。然而,预取或预渲染过程可能已修改HTTP缓存,从而加速后续导航。
-
令exactRecord为null。
-
令inexactRecord为null。
-
令recordToUse为exactRecord(若不为null),否则为inexactRecord。
-
如果recordToUse不为null:
-
如果recordToUse的过期时间小于currentTime:
-
触发预取状态更新事件,参数为navigable、recordToUse和“
失败”状态。 -
返回null。
-
-
遍历recordToUse的重定向链的每个exchangeRecord:
-
如果存在冲突的凭据针对exchangeRecord的响应、navigable和recordToUse的来源分区键:
-
触发预取状态更新事件,参数为navigable、recordToUse和“
失败”状态。 -
返回null。
-
这用于处理起初没有跨分区凭据,但后来出现这种情况。用户代理可以采用更粗略的算法如监控该URL的cookie是否变动,或存储哈希值、时间戳或版本号。 -
-
返回recordToUse。
-
返回null。
虽然不明显,但该逻辑实际上不要求预取已接收完整主体,只需响应头即可。也就是说,导航到已预取的响应仍可能无法瞬间加载。
-
令timeout为null。
-
可选地,将timeout设置为实现自定义的持续时间,代表实现愿意等待进行中预取响应的最长时间,超过即等待结束并重新发起导航。
选择合适超时时间很难,且可能依赖具体导航或预取的发起者(如其推测规则积极性,或是否用于预渲染)。一般不建议用超时时间,因为很少重新导航比等预取更优。但部分实现发现某些情况下几秒的超时能取得更好体验。
-
令startTime为不安全共享当前时间。
-
执行如下步骤,当timeout不为null且不安全共享当前时间−startTime大于timeout时终止:
-
循环如下:
-
令completeRecord为查找匹配的完成预取记录的结果,参数为navigable、sourceSnapshotParams和url。
-
如果completeRecord不为null,则返回completeRecord。
-
令potentialRecords为一个空列表。
-
-
若如下全部成立:
则追加record到potentialRecords。
循环每次都会重新计算potentialRecords,使得后续循环的potentialRecords是上次的子集。这因sourceSnapshotParams的预取记录为快照,且上述条件不能由false变为true。
等价做法是初次构建完整potentialRecords,随后逐步移除不再满足条件的项。
-
-
如果potentialRecords为空,返回null。
-
等待sourceSnapshotParams中任意预取记录状态发生变化。
-
-
-
返回null。
因sourceSnapshotParams的预取记录是快照,导航后启动的预取不会随该导航而被激活。
Document
document有匹配的预取记录,给定一个预取记录
recordUnderConsideration和一个可选布尔值checkPrerender(默认 false),如下算法返回
true:
-
-
如果checkPrerender为 true:
-
如果record的预渲染目标可导航名称提示不等于 recordUnderConsideration的预渲染目标可导航名称提示,则用户代理可继续。
对于依照预渲染可遍历对象和预渲染目标可导航名称提示创建独立实例的用户代理,会继续该分支,认为此类记录是不同的。能激活已有预渲染可遍历对象且不区分预渲染目标可导航名称提示的用户代理则认为此类记录等价。
-
令recordNVS为 null。
-
如果record的响应不为 null,则设置 recordNVS为获取URL搜索变体的结果, 参数为record的响应。
-
否则,设置recordNVS为record的No-Vary-Search提示。
-
如果recordUnderConsideration的No-Vary-Search提示不等于recordNVS,则继续。
-
如果recordUnderConsideration的URL与 record的URL根据recordUnderConsideration的No-Vary-Search提示变体等价,返回true。
-
返回false。
参见 HTML
标准中No-Vary-Search比对相关讨论。
NavigationTimingType
navTimingType、请求request、预取记录record、目标快照参数targetSnapshotParams和源快照参数sourceSnapshotParams,按如下步骤:
-
令responseOrigin为null。
-
令responseCOOP为null。
-
令coopEnforcementResult为为导航创建跨域窗口打开策略执行结果,参数为navigable的活跃文档与documentState的发起者源。
-
令finalSandboxFlags为一个空沙箱标志集合。
-
令responsePolicyContainer为null。
-
令urlList为一个空列表。
-
令response为record的响应。
-
遍历record的重定向链中的每个exchangeRecord:
-
令redirectChainRequest为exchangeRecord的请求。
-
令redirectChainResponse为exchangeRecord的响应。
-
令responsePolicyContainer为根据获取响应创建策略容器的结果,参数为redirectChainResponse及redirectChainRequest的保留客户端。
-
令finalSandboxFlags为targetSnapshotParams的沙箱标志与responsePolicyContainer的CSP列表的CSP派生沙箱标志的并集。
-
令responseOrigin为确定源的结果,参数为redirectChainResponse的URL、finalSandboxFlags、documentState的发起者源与null。
-
令responseCOOP为获取跨域窗口打开策略(参数为redirectChainResponse及redirectChainRequest的保留客户端)。
-
令coopEnforcementResult为执行响应的跨域窗口打开策略的结果,参数为navigable的活跃浏览环境、redirectChainResponse的URL、responseOrigin、responseCOOP、coopEnforcementResult以及redirectChainRequest的referrer。
-
如果finalSandboxFlags非空且responseCOOP的值为"
unsafe-none",则将response设为适当的网络错误并跳出。
-
-
如果request的URL不等于urlList[0],则将request的URL插入urlList第0项之后。
此时导航的是request的URL,但响应是来自urlList[0],因
No-Vary-Search。 视为第0个响应到URL的重定向。插入后若urlList的长度为2,则生成的Document使用导航到的URL,否则长度更大时无效。 -
将request的URL列表设为urlList。
-
将request的保留客户端设为创建保留客户端的结果,参数为navigable与request的URL。
这将用作生成
Document与环境设置对象的环境。每次消耗一个预取记录时需独立环境,不能用record的重定向链最后项的请求的保留客户端。否则复用同一预取记录会导致创建的环境设置对象拥有相同id。会被如clients.get()API暴露,且极为混乱。 -
将request的保留客户端的活跃 Service Worker设为record的重定向链最后项的请求的保留客户端的活跃 Service Worker。
此时理论上有两种 service worker 控制生成的Document:一种是在预取过程中拦截最终响应的,一种是与导航到的 URL(即request的URL)匹配的注册。这两者大部分情况相同,但涉及No-Vary-Search且开发者为/page?param=1和/page?param=2分别建了不同 service worker 时可能不同。我们选择用预取阶段拦截最终响应的 service worker。这样实现更简单(无需额外查找),且与预渲染行为一致,“激活时 URL 更新”不会导致切换 service worker。
-
令resultPolicyContainer为确定导航参数策略容器的结果,参数为record的响应的URL、documentState的历史策略容器、sourceSnapshotParams的源策略容器、null和responsePolicyContainer。
-
如果response不是网络错误,则:
-
返回一个新的导航参数,内容如下:
- id
-
navigationId
- 请求
-
request
- 响应
-
response
- 源
-
responseOrigin
- 策略容器
-
resultPolicyContainer
- 最终沙箱标志集
-
finalSandboxFlags
- 跨域窗口打开策略
-
responseCOOP
- COOP执行结果
-
coopEnforcementResult
- 保留环境
-
request的保留客户端
- 可导航对象
-
navigable
- 导航时序类型
-
navTimingType
- 获取控制器
-
record的获取控制器
如上述可选步骤被采用,record可多次生成导航参数,均共享同一个获取控制器。因导航参数的唯一用途是统计导航时序,复用无影响。
- 提前提示提交
-
null
意味着预取文档的提前提示不会被处理。若未来资源提示无法复用主响应头则可修订。因预取只在响应头到达时生效,提前提示不会早于主响应头。后续规范可考虑利用预取阶段获得的提前提示。
- 交付类型
-
"
导航预取"
2. HTML补丁
本节包含对[HTML]的补丁内容。
按如下方式为环境增加一项:
- 是否为导航预取客户端
-
一个布尔值(默认false)
按如下方式为导航参数增加一项:
- 交付类型
更新所有创建点设为""(空字符串),除非本规范文档内明示为其他值(见根据预取记录创建导航参数)。
为源快照参数增加一项:
修改快照源快照参数算法,将返回值的预取记录设为sourceDocument的预取记录的克隆。
创建保留客户端, 给定可导航对象navigable,一个URLurl与 一个不透明源或nullisolationOrigin:
为导航创建跨域窗口打开策略执行结果
,给定一个Document
activeDocument与一个源initiatorOrigin,返回一个新的跨域窗口打开策略执行结果对象,内容如下:
创建导航请求, 给定一个会话历史条目entry, 一个环境设置对象fetchClient, 一个可导航容器或nullcontainer, 以及一个布尔值hasTransientActivation,进行如下步骤。
-
否则,若下列所有条件为真:
则:
-
令request为创建导航请求的结果,参数为 entry、sourceSnapshotParams的取用客户端、navigable的容器以及sourceSnapshotParams的是否瞬时激活。
-
令prefetched为false。
-
如果documentResource为null且navigable为顶级可遍历对象:
-
令prefetchRecord为等待匹配的预取记录, 参数为navigable、sourceSnapshotParams、entry的URL。
-
若prefetchRecord非null:
-
设navigationParams为根据预取记录创建导航参数, 参数为navigable、entry的文档状态、 navigationId、navTimingType、request、 prefetchRecord、targetSnapshotParams、 sourceSnapshotParams。
-
复制预取Cookie,参数为prefetchRecord的隔离分区键 与navigationParams的保留环境。
此复制在继续前完成, 即子资源获取、document.cookie等能感知Cookie。若预取未访问跨站点URL,则无可复制的Cookie。 -
设prefetched为true。
-
触发预取状态更新事件, 参数为navigable、prefetchRecord、"
成功"状态。
上述步骤保证预取仅用于满足`
GET`请求, 且仅用于激活顶级可遍历对象。 -
-
-
若prefetched为false,则设navigationParams为根据获取创建导航参数结果, 参数为request、entry、navigable、 sourceSnapshotParams、targetSnapshotParams、 cspNavigationType、navigationId和navTimingType。
-
通过
fetch 创建导航参数给定一个 请求 request,一个 会话历史条目 entry,一个可导航对象
navigable,一个 源快照参数 sourceSnapshotParams,一个
目标快照参数 targetSnapshotParams,一个
字符串 cspNavigationType,一个 导航ID或null navigationId,一个 NavigationTimingType
navTimingType,以及可选的 预取记录 prefetchRecord,执行以下步骤。
-
断言:request的redirect mode为"
manual"。 -
令response为null。
-
令responseOrigin为null。
-
令fetchController为null。
-
令coopEnforcementResult为为导航创建跨域窗口打开策略执行结果, 参数为navigable的活跃文档和entry的文档状态的发起者源。
-
令finalSandboxFlags为空的沙箱标志集合。
-
令responsePolicyContainer为null。
-
令responseCOOP为新的跨域窗口打开策略。
-
令locationURL为null。
-
令currentURL为request的current URL。
-
令commitEarlyHints为null。
-
令isolationOrigin为null。
-
如给定prefetchRecord:
-
循环如下:
-
如果request的保留客户端非null且currentURL的源与request的保留客户端的创建URL的源不同,则:
-
如果request的保留客户端为null,则:
-
设request的保留客户端为 创建保留客户端的结果,参数为 navigable、currentURL、isolationOrigin。
-
如果prefetchRecord给定,则设request的 是否为导航预取客户端 为 true。
-
-
如果检查是否 CSP 应阻止此导航请求类型 的结果为"
Blocked",则设response为网络错误,并跳出。 -
如给定prefetchRecord:
-
令purpose为包含
prefetch的列表。 -
如果prefetchRecord的匿名策略 需要匿名 ,针对request,则:
-
向
prefetch令牌中添加键为"anonymous-client-ip"值为true的参数。
-
-
如果prefetchRecord的预渲染可遍历对象 非null,则向
prefetch令牌中添加键为"prerender"值为true的参数。 -
写入结构化字段值, 参数为 (`
Sec-Purpose`, purpose),至request的标头列表。实现可能兼容性发送厂商定制头,如 Chromium 的`Purpose`/`prefetch`、 Mozilla 的`X-moz`/`prefetch`、 WebKit 的`X-Purpose`/`preview`等。 期望业界最终采用统一头。 -
如果request的当前URL不是潜在可信URL,则设response为网络错误并跳出。
旨在降低预取流量被链路攻击者看到概率,并鼓励公网使用加密方案。 -
如果proposedPartitionKey不等于prefetchRecord的来源分区键且 request的referrer策略 不在足够严格的推测导航referrer策略列表 中,则设response为网络错误并跳出。
实际上,跨站预取会放弃而不暴露比来源更多的referrer信息。 -
如因实现自定义原因无法按prefetchRecord的匿名策略获取request,则设response为网络错误并跳出。
此处允许实现进一步限制,比如匿名流量无法访问部分主机、或主机拒绝私有预取流量。
-
-
设response为null。
-
如fetchController为null,则将fetchController设为对request执行fetch的结果, processEarlyHintsResponse设为下述算法, processResponse设为下述算法, useParallelQueue设为true。
令processEarlyHintsResponse为如下算法,输入response earlyResponse:
-
若给定prefetchRecord且commitEarlyHints为null, 设其为处理 early hint 头, 参数为earlyResponse和request的保留客户端。
令processResponse为如下算法,输入response fetchedResponse:
-
设response为fetchedResponse。
-
-
否则,对fetchController执行处理下一个手动重定向。
-
等待直到response非null,或navigable的进行中导航不等于navigationId。
如后者发生,则中止 fetchController,并返回。否则继续。 预取在导航开始时立刻中止,可能不是理想行为。
-
设responsePolicyContainer为根据响应创建策略容器的结果,参数为response和 request的保留客户端。
-
设finalSandboxFlags为targetSnapshotParams的沙箱标志与responsePolicyContainer的CSP列表的CSP派生沙箱标志的并集。
-
设responseOrigin为确定源的结果,参数为response的URL、finalSandboxFlags、entry的文档状态的发起者源、null。
-
如果navigable为顶级可遍历对象,且prefetchRecord未给定:
-
令responseCOOP为获取跨域窗口打开策略的结果,参数为response和 request的保留客户端。
-
令coopEnforcementResult为执行响应的跨域窗口打开策略的结果,参数为navigable的活跃浏览环境、request的URL、responseOrigin、responseCOOP、coopEnforcementResult、request的referrer。
-
如果finalSandboxFlags非空且responseCOOP的值不是"
unsafe-none",则设response为相应网络错误并跳出。
-
-
如果response不是网络错误,navigable是子可导航对象,且对 navigable的容器文档的源、相关设置对象、request的目标、response、true 进行 跨域资源策略检查的结果是阻止,则设response为网络错误并跳出。
-
如给定prefetchRecord:
-
设locationURL为response的location URL, 参数为currentURL的片段。
-
如locationURL为failure或null,跳出。
-
设entry的序列化状态为StructuredSerializeForStorage(null)。
-
令oldDocState为entry的文档状态。
-
- 历史策略容器
- 请求referrer
-
oldDocState的请求referrer
- 请求referrer策略
-
oldDocState的请求referrer策略
- 源
-
oldDocState的源
- 资源
-
oldDocState的资源
- 曾加载
-
oldDocState的曾加载
- 导航目标名称
-
oldDocState的导航目标名称
-
若locationURL的方案不是HTTP(S) 方案,则:
-
设currentURL为locationURL。
-
设entry的URL为currentURL。
-
-
如果locationURL为URL且其方案不是fetch 方案,则返回新的非fetch方案导航参数,内容:
-
如下任意为真:
则返回null。 -
令resultPolicyContainer为 确定导航参数策略容器的结果, 参数为response的URL、 entry的文档状态的历史策略容器、 sourceSnapshotParams的源策略容器、null、responsePolicyContainer。
-
返回新的导航参数,内容如下:
-
如果navigationParams的交付类型为"
prefetch",则可选设swapGroup为true。这样让引用站点更难通过加载时序判断预取是否被使用,有助于防止关于目标站点的信息泄露到引用站点。
3. 导航时序补丁
本节包含对[NAVIGATION-TIMING]的补丁内容。
4. Service Workers 补丁
本节包含对[SERVICE-WORKERS]的补丁内容。
resultingClientId
的步骤如下:
如果request是非子资源请求且request的目标不是"report" 且reservedClient的是否为导航预取客户端为false ,则将e的resultingClientId属性初始化为reservedClient的id,否则初始化为空字符串。
在预取场景下,虽然此时request有保留客户端,仅为规范层帮助请求通过,
并不代表实际客户端,不会被如clients.matchAll()
等观察到。实际客户端创建将在激活时,即FetchEvent
触发后。
5. 清除站点数据补丁
在清除站点数据 § 3.1 Clear-Site-Data HTTP 响应头字段中添加一条新的头部值说明:
修改解析响应的 Clear-Site-Data 头的解析步骤:
-
遇到
`"cache"`或`"*"`时,除原有已追加值外,还追加"prefetchCache"到types; -
遇到
`"prefetchCache"`时,追加"prefetchCache"到types。
修改为响应清除站点数据的 switch 结构,新增处理
"prefetchCache"
的分支,调用清除预取缓存,
参数为origin。
6. 预取算法
推测导航足够严格的 referrer policy
列表包括如下内容:"",
"strict-origin-when-cross-origin", "strict-origin", "same-origin",
"no-referrer"。
Document
document 和 预取记录 prefetchRecord,按如下步骤:
-
在子可导航对象支持预取存在一些复杂性,当前尚未定义。将来有可能定义。
-
如果document已有匹配的预取记录给定 prefetchRecord,则返回。
-
令sourceSnapshotParams为快照源快照参数,参数为document。
-
断言:prefetchRecord的URL的方案为HTTP(S) 方案。
-
触发预取状态更新事件,参数为document的节点可导航对象、prefetchRecord和"
待定" 状态。 -
令referrerPolicy为prefetchRecord的referrer 策略 (若非空字符串),否则为document的策略容器的referrer 策略。
-
令documentState为新文档状态,包括:
- 请求referrer策略
-
referrerPolicy
- 发起者源
-
document的源
-
令entry为新会话历史条目,包括:
-
令request为创建导航请求的结果, 参数为entry、document的相关设置对象、document的 节点可导航对象的容器以及 false。
-
令global为document的相关全局对象。
-
并行执行:
-
令navigationParams为通过 fetch 创建导航参数的结果, 参数为request、entry、document的节点可导航对象、 sourceSnapshotParams、targetSnapshotParams、"
other"、null(navigationId)、 "navigate"及prefetchRecord prefetchRecord。 -
如果prefetchRecord的曾有冲突凭据为 true,则设 navigationParams为 null。
即重定向链中的任何跨分区 origin 存在凭据时,将丢弃预取。可减少用户看到登出页面的概率。 -
在全局任务队列中排队 网络任务源,参数为global,内容:
-
-
令status为response的状态。
-
如果status不是ok状态,则返回 false。
即错误响应不会缓存,发生导航时会重试。可提升导航成功的概率,如错误是临时或因预取导致,也便于服务器拒绝含Sec-Purpose头请求。 -
返回true。
7. Cookies
[COOKIES]
定义了“cookie”,可以使用
`Set-Cookie`
响应头字段进行设置。由于 "uncredentialed" 分区方案强制使用单独的网络分区键,因此需要将这些 cookie 复制到普通分区,就像它们是在导航时接收的一样。
-
令isolatedCookieStore为与isolatedPartitionKey关联的cookie存储。
-
遍历isolatedCookieStore中的每个cookie cookie。
-
从isolatedCookieStore移除cookie。
-
用户代理可以完全忽略某个cookie。如果是这种情况,则跳过。
-
令topLevelSite为 null。
-
-
令topLevelSite为获取站点的结果,参数为tuple origin ("
https", cookie的domain, null, null)。这里使用"https"协议和null端口,是因为cookie可跨scheme和端口,不同于同源策略。用户代理分配cookie存储时因此不应区分。
在顶级浏览环境进行预取时,请求(包括重定向)是为顶级导航做准备。 environment的顶级站点会因重定向改变,且重定向可能跨站点,因此收到cookie时顶级站点可能已变。不过由于是顶级导航,下发cookie的origin即为当时的顶级站点。由于cookie的domain必须与下发origin同站,所以domain可用于判定顶级站点。 -
-
否则:
-
令secondKey为null或实现自定义的值。
secondKey应该与普通导航下该响应应有的值相同。 -
令destinationPartitionKey为(topLevelSite, secondKey)。
-
令cookieStore为与destinationPartitionKey关联的cookie存储。
-
令newCookie为cookie的副本。
-
设置newCookie的creation-time和last-access-time为当前日期和时间。
-
如果cookieStore中已有与newCookie同名、同domain、同path的existingCookie:
-
设newCookie的creation-time为existingCookie的creation-time。
-
从cookieStore移除existingCookie。
-
-
插入newCookie到cookieStore。
这种先移除后插入的处理和接收cookie时一致。
-
8. `Sec-Purpose`
HTTP请求头
本节重定义了
`Sec-Purpose`
HTTP请求头在[FETCH]中的定义。
`Sec-Purpose`
HTTP请求头用于声明该请求目的不只是为了用户即时使用资源。
该头部字段为[RFC9651]结构化头,其值必须为List。
其成员可能包含一个Item,即Token
prefetch。若包含该项,即表示请求目的是预先下载即将被获取的资源。
下列参数用于prefetch令牌:
-
键名为"
anonymous-client-ip"的参数。当该参数存在且值不是布尔型false(字段值内的
`?0`),表示预取请求使用匿名客户端IP。服务器不应假定该IP与实际用户IP一致,也不应假定其地理位置或网络运营商一致。若无法给出合适响应(如资源依赖于客户端地理位置且无其他定位方式,例如Geohash client hint,且无位置不可知响应),则服务端应返回适当HTTP状态码及不可缓存的响应头。
未来规范可能为非布尔型值赋予更具体的含义,目前与true等价。建议实现不要发送此类值。本规范遵循此建议,启动referrer发起的导航预取算法不会发送非布尔型值。
-
键名为"
prerender"的参数。若存在且值不是布尔型false(字段值内的
`?0`),表示该预取是为了后续的预渲染。注意,对于预渲染 navigable中的资源请求也会设置此值,激活前。未来规范可能为非布尔型赋予具体含义,目前等价于true,建议不要发送。本规范遵循此建议,启动referrer发起的导航预取算法不会发送非布尔型参数。
9. 自动化测试
为用户代理自动化和应用测试目的,本文档定义了对[WebDriver-BiDi] 规范的扩展。
9.1. speculation模块
speculation模块包含用于管理远端预取、预渲染和推测规则行为的命令。
9.1.1. 定义
speculation.PreloadingStatus = "pending" / "ready" / "success" / "failure"
speculation.PreloadingStatus类型表示不同预加载状态。此状态为预取和预渲染共用。
- "
pending" - 预取记录 prefetchRecord开始启动referrer发起的导航预取。
- "
ready" - 预取记录 prefetchRecord已完成。
- "
success" - 预取记录 prefetchRecord被激活(如用户代理导航时触发)。
- "
failure" - 预取记录 prefetchRecord失败(如过期时)。
9.1.2. 事件
SpeculationEvent = ( speculation.PrefetchStatusUpdated )
9.1.2.1. speculation.prefetchStatusUpdated事件
speculation.PrefetchStatusUpdated = ( method : "speculation.prefetchStatusUpdated" , params : speculation.PrefetchStatusUpdatedParameters ) speculation.PrefetchStatusUpdatedParameters = { context : text, url : text, status : speculation.PreloadingStatus }
speculation.PreloadingStatus
preloadingStatus:
-
令params为一个有序映射,对应
speculation.PrefetchStatusUpdatedParameters定义,其context字段为navigable的顶级可遍历对象的navigable id,url字段为prefetchRecord的URL,status字段为preloadingStatus。 -
令body为一个有序映射,同
speculation.PrefetchStatusUpdatedParameters定义,其params字段为params。 -
令relatedNavigables为一个有序集合,包含navigable。
-
对于"
speculation.prefetchStatusUpdated"事件和relatedNavigables,对已启用事件的会话集合中的每个session:-
发送事件,参数为session和body。
-