1. 简介
Service Worker 能够获取和缓存资源,其大小仅受限于 源存储。然而,如果用户离开该站点或关闭浏览器,Service Worker可能会被 终止。即使有传递给 waitUntil()
的未完成 Promise——如果它在几分钟内没有解析,浏览器可能会认为这是对 Service
Worker 的滥用,并终止该进程。
这对电池寿命和隐私非常有利,但却使得下载和缓存诸如播客和电影等大文件,以及上传视频和图片变得困难。
本规范旨在:
-
即使用户关闭所有与源相关的窗口和 Worker,仍允许继续进行获取(请求和响应)。
-
允许单个作业涉及多个请求,具体由应用程序定义。
-
允许浏览器/操作系统显示该作业的进度,并允许用户暂停/中止。
-
允许浏览器/操作系统通过暂停/恢复下载来应对不佳的连接。
-
允许应用程序对作业的成功/失败做出反应,可能通过缓存结果。
-
允许在后台获取资源时访问这些资源。
2. 领域
所有平台对象均在 上下文对象的 相关领域 中创建,除非另有规定。
3. 基础设施
当用户代理认为资源可能很快可用时,资源被认为是 暂时不可用。原因可能包括:
-
用户代理处于离线状态。
-
用户代理位于强制门户之后。
后台获取任务源 是一个 任务源。
3.1. Service Worker 注册的扩展
Service Worker 注册 另外包含:
3.2. 后台获取
后台获取 包含以下内容:
-
id(一个 DOMString)。
-
标题(一个 DOMString)。
-
下载总量(一个数字)。
-
上传总量(一个数字)。
-
已上传(一个数字),最初为 0。
-
结果(一个
BackgroundFetchResult
),最初为空字符串。 -
失败原因(一个
BackgroundFetchFailureReason
), 最初为空字符串。 -
记录可用标志 最初设置。
-
图标(一个 列表,包含
ImageResource
)。 -
Service Worker 注册(一个 Service Worker 注册)。
-
暂停标志,最初未设置。
-
中止所有标志,最初未设置。
3.2.1. 显示
-
UI 必须突出显示 bgFetch 的 Service Worker 注册的 范围 URL 的 源
-
如果 bgFetch 的 暂停标志 未设置,并且 bgFetch 的 结果 不是空字符串,则 UI 必须指示带宽正在被使用。
-
UI 在 bgFetch 的 结果 不为空字符串之前,不能被关闭(例如滑动关闭)。
-
UI 可以显示 bgFetch 的 标题。
-
UI 可以选择一个用于显示的 图像资源 (icon),从 bgFetch 的 图标 中,成功 处理 并通过新的 请求获取,具有以下属性:
- URL
-
icon 的 src。
- 客户端
-
environment。
- Keepalive 标志
-
设置。
- Service Worker 模式
-
"
none
"。 - 目标
-
"
image
"。 - 模式
-
"
no-cors
"。 - 凭证模式
-
"
include
"。
-
UI 可以使用 bgFetch 的 下载总量,上传总量,已存储主体字节总量,已上传,暂停标志,以及 结果 来显示获取的进度。
-
UI 必须提供一种方式让用户通过设置 bgFetch 的 中止所有标志 来中止 bgFetch。
-
如果 bgFetch 的 请求中的每个请求的 方法都是 `
GET
`,则 UI 可以提供一种方式来切换 bgFetch 的 暂停标志。注意: 如果 方法 不是 `
GET
`,重新发出请求可能会产生意想不到的副作用。 -
UI 可能会被激活(例如通过点击),在这种情况下触发后台获取点击事件 用于 bgFetch。
-
UI 可以在操作完成后仍然存在,在这种情况下仍然可以被激活。
令 permission 为 权限状态,其对应于 PermissionDescriptor
中具有 name
值为 "background-fetch"
和 environment。如果 permission 为
"prompt"
,则用户代理可能会在该算法开始时设置 bgFetch 的 暂停标志。用户代理应允许用户接受后台获取(取消设置 bgFetch 的 暂停标志),或拒绝后台获取(设置 bgFetch 的 中止所有标志)。用户代理还可以提供始终允许和始终拒绝选项,可以用作此权限的 用户意图的新增信息。
如果用户使用的是计量连接,或后台获取是在后台启动的,用户代理还可以考虑设置 bgFetch 的 暂停标志。
3.3. 后台获取记录
后台获取记录 包含以下内容:
3.4. 后台获取响应
后台获取响应 包含以下内容:
-
响应(一个 响应 或 null),最初为 null。
-
结果,(任何
BackgroundFetchFailureReason
、"success"
或"redundant"
),最初为空字符串。
如果 响应 的 暴露 状态为结果是空字符串、"success"
或
"bad-status"
,则可以暴露该响应。
4. 算法
4.1. 执行后台获取
注意: 这是管理后台获取的“后台”部分的算法。每个 后台获取 只运行该算法的一个实例。
-
令 swRegistration 为 bgFetch 的 Service Worker 注册。
-
令 settledFetches 为 0。
-
令 immediateFailure 为 false。
-
令 failureReason 为空字符串。
-
等待 settledFetches 等于 bgFetch 的 记录 的 大小,或 immediateFailure 为 true。
-
如果 immediateFailure 为 true,则将 bgFetch 的 中止所有标志 设置为 true。
注意: 完成记录 算法会监听此标志,并在设置时终止获取。
-
排队以下步骤 到 swRegistration 的 活跃后台获取编辑队列:
-
令 activeBgFetches 为 swRegistration 的 活跃后台获取。
-
令 id 为 bgFetch 的 id。
-
如果 activeBgFetches 包含后台获取 bgFetch,则移除 activeBgFetches[id]。
-
否则,将 failureReason 设置为
"aborted"
。注意: 这解决了一个竞争条件,在该条件下
abort()
已成功调用,但其中一个获取操作同时失败。如果我们已经从abort()
返回 true,这将确保我们触发相关的中止事件。 -
如果 failureReason 不是空字符串,则:
-
否则,将 bgFetch 的 结果 设置为
"success"
。 -
更新后台获取实例 用于 bgFetch。
-
令 eventName 为空字符串。
-
令 eventConstructor 为 null。
-
如果 failureReason 是
"aborted"
,则:-
将 eventName 设置为 "
backgroundfetchabort
"。 -
将 eventConstructor 设置为
BackgroundFetchEvent
。
-
-
否则,如果 failureReason 不是空字符串,则:
-
将 eventName 设置为 "
backgroundfetchfail
"。 -
将 eventConstructor 设置为
BackgroundFetchUpdateUIEvent
。
-
-
否则:
-
将 eventName 设置为 "
backgroundfetchsuccess
"。 -
将 eventConstructor 设置为
BackgroundFetchUpdateUIEvent
。
-
-
触发一个功能事件,命名为 eventName,使用 eventConstructor 在 swRegistration 上触发,属性如下:
registration
-
获取一个 BackgroundFetchRegistration 实例,用于 bgFetch 在事件对象的 相关领域。
然后使用 dispatchedEvent 运行以下步骤,并行:
-
4.2. 完成记录
注意: 此算法管理 后台获取记录 的获取。每个 后台获取记录 启动此算法的一个实例,但它会递归调用以重试获取或获取部分响应的下一部分。
-
令 responseData 为 record 的 响应数据。
-
令 downloadTotal 为 bgFetch 的 下载总量(如果不是 0),否则为 infinity。
-
等待 bgFetch 的 暂停标志 被取消设置。
-
令 request 为 record 的 请求 的副本。
注意: 此时,请求完全存储在存储中,即使它最初是流。
-
设置 request 的 keepalive 标志。
-
将 request 的 Service Worker 模式 设置为 "
none
"。 -
如果 rangeStart 不为 0,则 添加 range 标头 到 request,使用 rangeStart。
注意: 如果 rangeStart 为 0,则进行正常请求。这允许初始请求利用内容编码,因为带有 range 标头的请求会添加
Accept-Encoding: identity
。 -
令 fetchAttemptComplete 为 false。
-
令 lastTransmittedSize 为 0。
-
获取 request。
本步骤的其余部分使用 fetch "回调",目前将任务排队。这在这里不可取也不可能,所以假设任务没有排队。(问题)
为 request 处理请求体,运行以下步骤:
-
将 bgFetch 的 已上传 增加 transmittedSize 减去 lastTransmittedSize。
-
将 lastTransmittedSize 设置为 transmittedSize。
-
更新后台获取实例,用于 bgFetch。
为 response 处理响应,运行以下步骤:
-
如果 response 是一个 网络错误,则:
-
如果 response 的 状态 是
206
,则: -
否则:
-
如果 rangeStart 为 0 或 response 的 状态 不是
206
,则将 responseData 的 响应 设置为 response 的副本,除了它的 主体。 -
每当从 stream 传输一个或多个字节时,令 bytes 为已传输字节并运行以下步骤:
-
如果 stream 的字节传输在任何时候正常完成,则:
-
如果 stream 在任何时候 出错,则:
-
令 result 为空字符串。
-
运行以下步骤,但 在中止时 bgFetch 的 暂停标志 或 中止所有标志 被设置:
-
等待 fetchAttemptComplete 为 true。
-
将 result 设置为 responseData 的 结果。
-
-
如果中止,则:
-
如果 result 为空字符串,则 完成记录,用于 bgFetch 和 record。
4.3. 更新后台获取实例
-
令 downloaded 为 bgFetch 的 已存储主体字节总量。
-
令 uploaded 为 bgFetch 的 已上传。
-
令 result 为 bgFetch 的 结果。
-
令 failureReason 为 bgFetch 的 失败原因。
-
如果 bgFetch 的 记录可用标志 被设置,则令 recordsAvailable 为 true,否则为 false。
-
对于每个 环境设置对象 env,其 origin 等于 bgFetch 的 Service Worker 注册 的 范围 URL 的 origin,排队一个后台获取任务,用于 env 的 负责的事件循环,运行以下步骤:
-
令 bgFetchRegistration 为
BackgroundFetchRegistration
的实例,位于 相关领域,其 后台获取 等于 bgFetch,如果不存在则为 null。注意: 每个环境最多只有一个,因 获取 BackgroundFetchRegistration 实例 算法所致。
-
如果 bgFetchRegistration 为 null,则中止这些步骤。
-
如果 recordsAvailable 为 false,且 bgFetchRegistration 的 记录可用标志 被设置,则取消设置 bgFetchRegistration 的 记录可用标志。
-
如果 bgFetchRegistration 的 结果 不是空字符串,则中止这些步骤。
注意: 这可以防止在后台获取已结算后报告进度。当操作已中止,但某些获取尚未终止时,这是可能的。
-
如果以下条件全为 true:
-
bgFetchRegistration 的 已下载 等于 downloaded。
-
bgFetchRegistration 的 已上传 等于 uploaded。
-
bgFetchRegistration 的 结果 等于 result。
-
bgFetchRegistration 的 失败原因 等于 failureReason。
则中止这些步骤。
-
-
将 bgFetchRegistration 的 已下载 设置为 downloaded。
-
将 bgFetchRegistration 的 已上传 设置为 uploaded。
-
将 bgFetchRegistration 的 结果 设置为 result。
-
将 bgFetchRegistration 的 失败原因 设置为 failureReason。
-
触发一个事件,名为 "
progress
",在 bgFetchRegistration 上。
-
4.4. 触发后台获取点击事件
backgroundfetchclick
",使用 BackgroundFetchEvent
,在
bgFetch 的 Service Worker 注册上,具备以下属性:
registration
-
通过 获取 BackgroundFetchRegistration 实例 的结果,应用于 bgFetch,在事件对象的 相关领域中。
4.5. 获取 BackgroundFetchRegistration 实例
注意: 该算法确保为给定的 BackgroundFetchRegistration
实例返回相同的结果,用于整个 BackgroundFetchManager
生命周期中的给定 后台获取。浏览器可以优化此过程,只要无法通过相等性、扩展或弱关联数据来检测到为给定的后台获取创建了多个实例即可。
-
令 instancesMap 为该 realm 中唯一实例的 BackgroundFetchRegistration 实例。
-
如果 instancesMap[bgFetch] 存在,则返回 instancesMap[bgFetch]。
-
令 instance 为一个新的
BackgroundFetchRegistration
,在 realm 中,其 后台获取 设置为 bgFetch。 -
将 instancesMap[bgFetch] 设置为 instance。
-
返回 instance。
4.6. 验证部分响应
注意:该算法检查部分响应是否合理匹配所请求的内容,并可选地检查是否应与先前的响应合并。
-
断言:partialResponse 的 状态 是
206
。 -
令 responseFirstBytePos、responseLastBytePos 和 responseCompleteLength 为从 partialResponse 中 提取内容范围值 的结果。如果失败,则返回无效。
-
如果 responseFirstBytePos 不等于 expectedRangeStart,则返回无效。
-
如果 previousResponse 不为 null,则:
-
对于 « `
ETag
`、`Last-Modified
` » 中的 headerName: -
如果 previousResponse 的 状态 是
206
,则:-
令 previousResponseFirstBytePos、previousResponseLastBytePos 和 previousResponseCompleteLength 为从 previousResponse 中 提取内容范围值 的结果。如果失败,则返回无效。
-
如果 previousResponseCompleteLength 不为 null,且 responseCompleteLength 不等于 previousResponseCompleteLength,则返回无效。
-
-
-
返回有效。
4.7. 提取内容范围值
注意:该算法将 `Content-Range
` 解析为 单字节内容范围 并提取值。
-
如果 response 的 响应头列表 不包含 `
Content-Range
`,则返回失败。 -
令 contentRangeValue 为第一个 响应头 的 值,其 名称 与 `
Content-Range
` 字节大小写不敏感匹配,位于 response 的 响应头列表中。 -
如果按 单字节内容范围 解析 contentRangeValue 失败,则返回失败。
-
令 firstBytePos 为当 contentRangeValue 被解析为 单字节内容范围 时,名为
first-byte-pos
的部分,解析为整数。 -
令 lastBytePos 为当 contentRangeValue 被解析为 单字节内容范围 时,名为
last-byte-pos
的部分,解析为整数。 -
令 completeLength 为当 contentRangeValue 被解析为 单字节内容范围 时,名为
complete-length
的部分。 -
如果 completeLength 为
"*"
,则将 completeLength 设置为 null,否则将 completeLength 设置为解析为整数的 completeLength。 -
返回 firstBytePos、lastBytePos 和 completeLength。
解析为整数 infra/189。
4.8. 创建记录对象
注意:该算法为 后台获取记录 创建平台对象。它还管理从存储的 字节流式传输 响应。此时后台获取操作可能仍在进行中。
所有平台对象必须在 realm 中创建。
-
令 recordObjects 为一个新的 列表。
-
对于每一个 record 中的 records:
-
令 responseData 为 record 的 响应数据。
-
令 recordObject 为一个新的
BackgroundFetchRecord
。 -
设置 recordObject 的
responseReady
为 一个新的 Promise。 -
令 requestObject 为一个新的
Request
对象,包含以下内容: -
将 recordObject 的
request
设置为 requestObject。 -
令 transmittedBytes 为 0。
-
令 stream 为 一个新的可读流,带有一个 pull 操作,返回 一个新的 Promise 并执行这些步骤 并行运行:
-
令 bytes 为 null。
-
如果 responseData 的 长度 大于 transmittedBytes 且 responseData 可以 暴露,则:
-
在任务队列中排队,于 stream 的 相关设置对象 的 负责的事件循环 中,使用 网络任务源 来运行这些步骤:
-
如果 bytes 不是 null,则:
-
令 array 为一个新的
Uint8Array
,封装一个新的ArrayBuffer
,由 bytes 构成。 -
将 array 加入 stream。
-
-
如果 responseData 可以 暴露,responseData 的 结果 不是空字符串,并且 transmittedBytes 为 responseData 的 长度,则 关闭 stream。
-
否则,如果 responseData 的 结果 是
"已中止"
,则 抛出错误,使用AbortError
DOMException
。 -
解决 promise。
-
-
并行运行这些步骤:
-
等待 responseData 的 响应 变为非空。
-
如果 responseData 可以 暴露,则:
-
否则,如果 responseData 的 结果 是
"已中止"
,则 拒绝 recordObject 的responseReady
,并附带AbortError
DOMException
。 -
否则,拒绝 recordObject 的
responseReady
,并附带TypeError
。
-
-
将 recordObject 附加到 recordObjects。
-
-
返回 recordObjects。
4.9. 包含后台提取
5. 标头语法
以下是用于 HTTP ABNF 的 单字节内容范围 语法:
"bytes=" first-byte-pos "-" last-byte-pos "/" complete-length first-byte-pos = 1*DIGIT last-byte-pos = 1*DIGIT complete-length = ( 1*DIGIT / "*" )
注意: 这是 RFC 7233 允许的子集。
以上内容的铁路图:
6. API
6.1.
对 ServiceWorkerGlobalScope
的扩展
partial interface ServiceWorkerGlobalScope {attribute EventHandler ;
onbackgroundfetchsuccess attribute EventHandler ;
onbackgroundfetchfail attribute EventHandler ;
onbackgroundfetchabort attribute EventHandler ; };
onbackgroundfetchclick
6.1.1. 事件
以下是 事件处理程序(及其对应的 事件处理程序事件类型),这些程序作为 事件处理程序 IDL 属性 必须被所有实现了 ServiceWorker
接口的对象支持:
事件处理程序事件类型 | 事件处理程序 | 接口 |
---|---|---|
backgroundfetchsuccess
| onbackgroundfetchsuccess
| BackgroundFetchUpdateUIEvent
|
backgroundfetchfail
| onbackgroundfetchfail
| BackgroundFetchUpdateUIEvent
|
backgroundfetchabort
| onbackgroundfetchabort
| BackgroundFetchEvent
|
backgroundfetchclick
| onbackgroundfetchclick
| BackgroundFetchEvent
|
6.2. 对 ServiceWorkerRegistration
的扩展
partial interface ServiceWorkerRegistration {readonly attribute BackgroundFetchManager backgroundFetch ; };
一个 ServiceWorkerRegistration
拥有一个 背景获取管理器 (即 BackgroundFetchManager
),
初始时这是一个新的 BackgroundFetchManager
,其
服务工作者注册 是 上下文对象 的 服务工作者注册。
6.3. BackgroundFetchManager
[Exposed =(Window ,Worker )]interface {
BackgroundFetchManager Promise <BackgroundFetchRegistration >fetch (DOMString , (
id RequestInfo or sequence <RequestInfo >),
requests optional BackgroundFetchOptions = {});
options Promise <BackgroundFetchRegistration ?>get (DOMString );
id Promise <sequence <DOMString >>getIds (); };dictionary {
BackgroundFetchUIOptions sequence <ImageResource >;
icons DOMString ; };
title dictionary :
BackgroundFetchOptions BackgroundFetchUIOptions {unsigned long long = 0; };
downloadTotal
一个 BackgroundFetchManager
包含:
-
BackgroundFetchRegistration 实例 (即 映射), 键为 背景获取,值为
BackgroundFetchRegistration
对象。初始值为空的 映射。 -
一个 服务工作者注册 (即 服务工作者注册)。
6.3.1. fetch()
fetch(id, requests, options)
方法执行以下步骤:
-
将 records 设为一个新的 列表。
-
将 uploadTotal 设为 0。
-
如果 requests 是一个
RequestInfo
,将 requests 设为 « requests »。 -
如果 requests 是 空的,则返回 一个被拒绝的 promise,并带有
TypeError
。 -
迭代 requests 的每个 request:
-
将 internalRequest 设为 请求,其结果为使用 request 调用
Request
构造函数。如果抛出异常,则返回 一个被拒绝的 promise 并带有异常。 -
如果 internalRequest 的 模式 为 "
no-cors
",则返回 一个被拒绝的 promise 并带有TypeError
。 -
将 internalRequest 的 client 设为 null。
-
将 record 设为一个新的 背景获取记录。
-
将 record 的 请求 设为 internalRequest。
-
将 record 添加到 records。
-
-
将 promise 设为 一个新的 promise。
-
将以下步骤入队到 registration 的 活动背景获取编辑队列:
-
将 permission 设为 权限状态,使用
PermissionDescriptor
,其name
为"background-fetch"
,并使用 上下文对象的 相关设置对象。 -
如果 permission 为
"denied"
,则拒绝 promise 并带有NotAllowedError
DOMException
并中止这些步骤。 -
将 bgFetchMap 设为 registration 的 活动背景获取。
-
如果 registration 的 活动工作者 为 null,则拒绝 promise 并带有
TypeError
并中止这些步骤。 -
将 requestBodiesRemaining 设为 requests 的 大小。
-
将 requestReadFailed 设为 false。
-
迭代 requests 的每个 request:
-
并行 运行这些步骤:
-
如果在任何时候,存储 requests 因超出配额限制而失败,则 拒绝 promise 并带有
QuotaExceededError
DOMException
并中止这些步骤。 -
等待 requestBodiesRemaining 为 0 或 requestReadFailed 为 true。
-
如果 requestReadFailed 为 true,则 拒绝 promise 并带有
TypeError
并中止这些步骤。 -
将 bgFetch 设为一个新的 背景获取,包含以下内容:
-
将 bgFetchMap[id] 设为 bgFetch。
-
将背景获取任务入队以运行这些步骤:
-
解决 promise,并使用 获取背景获取注册实例,适用于 bgFetch 并在 上下文对象的 相关领域中。
-
-
-
返回 promise。
6.3.2.
get()
get(id)
方法在调用时必须返回一个新的 promise promise 并并行执行以下步骤:
-
将 bgFetch 设为 registration 的 活动的背景获取[id]。
-
如果 bgFetch 为 undefined,解决 promise 为 undefined 并中止这些步骤。
-
-
入队一个背景获取任务 task 以运行这些步骤:
-
将 bgFetchRegistration 设为 获取背景获取注册实例 的结果,适用于 bgFetch 并在 上下文对象的 相关领域。
-
解决 promise,返回 bgFetchRegistration。
-
-
等待 task 完成。
注意:这确保了新的
BackgroundFetchRegistration
实例不会错过任何进度
事件。
-
6.3.3. getIds()
6.4.
BackgroundFetchRegistration
[Exposed =(Window ,Worker )]interface :
BackgroundFetchRegistration EventTarget {readonly attribute DOMString id ;readonly attribute unsigned long long uploadTotal ;readonly attribute unsigned long long uploaded ;readonly attribute unsigned long long downloadTotal ;readonly attribute unsigned long long downloaded ;readonly attribute BackgroundFetchResult result ;readonly attribute BackgroundFetchFailureReason failureReason ;readonly attribute boolean recordsAvailable ;attribute EventHandler onprogress ;Promise <boolean >abort ();Promise <BackgroundFetchRecord >match (RequestInfo ,
request optional CacheQueryOptions = {});
options Promise <sequence <BackgroundFetchRecord >>matchAll (optional RequestInfo ,
request optional CacheQueryOptions = {}); };
options enum {
BackgroundFetchResult ,
"" ,
"success" };
"failure" enum { // 后台抓取尚未完成,或已成功。
BackgroundFetchFailureReason , // 操作已被用户中止,或调用了abort()。
"" , // 响应状态不是ok。
"aborted" , // 抓取因其他原因失败,例如CORS、MIX、无效的部分响应,或无法重试的网络故障。
"bad-status" , // 操作期间达到存储配额。
"fetch-error" , // 超过了提供的downloadTotal。
"quota-exceeded" };
"download-total-exceeded"
一个 BackgroundFetchRegistration
实例有:
-
一个 background fetch(一个 background fetch)。
-
一个 downloaded(一个数字), 初始值为 background fetch 的 已存储的主体字节总数 的副本。
-
一个 uploaded(一个数字), 初始值为 background fetch 的 uploaded 的副本。
-
一个 result(一个
BackgroundFetchResult
), 初始值为 background fetch 的 结果 的副本。 -
一个 失败原因(一个
BackgroundFetchFailureReason
), 初始值为 background fetch 的 失败原因 的副本。 -
一个 ID(一个数字), 是 background fetch 的 ID 的副本。
-
一个 上传总数(一个数字), 是 background fetch 的 上传总数 的副本。
-
一个 下载总数(一个数字), 是 background fetch 的 下载总数 的副本。
-
一个 可用记录标志, 初始设置为 background fetch 的 可用记录标志 设置的值,否则未设置。
注意:上述值为副本,因此它们可以同步使用。
属性 id
的getter
必须返回 上下文对象 的 ID。
属性 uploadTotal
的getter
必须返回 上下文对象 的 上传总数。
属性 downloadTotal
的getter
必须返回 上下文对象 的 下载总数。
属性 uploaded
的getter
必须返回 上下文对象 的 已上传。
属性 downloaded
的getter
必须返回 上下文对象 的 已下载。
属性 result
的getter
必须返回 上下文对象 的 结果。
属性 failureReason
的getter
必须返回 上下文对象 的 失败原因。
属性 recordsAvailable
的getter 必须在 上下文对象 的 可用记录标志 设置时返回true,
否则返回false。
6.4.1. 事件
属性 onprogress
的 事件处理器 的 事件处理类型 为 progress
。
事件 progress
使用 Event
接口。
6.4.2. abort()
方法 abort()
调用时,必须返回 一个新的promise promise 并按以下步骤 并行 运行:
-
令 bgFetch 为 上下文对象 关联的 background fetch。
-
令 swRegistration 为 bgFetch 的 service worker registration。
-
将以下步骤入队 到 swRegistration 的 active background fetches 编辑队列:
-
令 activeBgFetches 为 swRegistration 的 active background fetches。
-
令 id 为 bgFetch 的 id。
-
如果 activeBgFetches 不包含background fetch bgFetch,则 resolve promise 为 false 并中止这些步骤。
-
移除 activeBgFetches[id]。
-
resolve promise 为 true。
-
设置 bgFetch 的 abort all flag。
-
6.4.3. match()
方法 match(request, options)
调用时,必须按以下步骤运行:
-
令 promise 为调用算法
matchAll()
的结果,传递 request 和 options。 -
返回 对promise反应 的结果,带有一个实现处理程序,当被调用时以参数 matches 返回 matches[0]。
注意: 鼓励用户代理对上述操作进行优化,使其比调用 matchAll()
更快。
6.4.4. matchAll()
方法 matchAll(request, options)
调用时,必须按以下步骤运行:
-
如果 上下文对象 的 记录可用标志 未设置,返回 一个被拒绝的promise 并带有
InvalidStateError
和DOMException
。 -
令 promise 为 一个新的promise。
-
按以下步骤 并行 运行:
-
返回 promise。
6.5.
BackgroundFetchRecord
[Exposed =(Window ,Worker )]interface {
BackgroundFetchRecord readonly attribute Request request ;readonly attribute Promise <Response >responseReady ; };
BackgroundFetchRecord
拥有:
request
属性的 getter 必须返回 上下文对象 的 请求。
responseReady
属性的 getter
必须返回 上下文对象 的 响应 promise。
6.6. BackgroundFetchEvent
[Exposed =ServiceWorker ]interface :
BackgroundFetchEvent ExtendableEvent {(
constructor DOMString ,
type BackgroundFetchEventInit );
init readonly attribute BackgroundFetchRegistration registration ; };dictionary :
BackgroundFetchEventInit ExtendableEventInit {required BackgroundFetchRegistration ; };
registration
BackgroundFetchEvent
拥有一个 background fetch (一个 background fetch), 最初是被 registration
初始化的值。
registration
属性必须返回初始化的值。
6.7.
BackgroundFetchUpdateUIEvent
[Exposed =ServiceWorker ]interface :
BackgroundFetchUpdateUIEvent BackgroundFetchEvent {(
constructor DOMString ,
type BackgroundFetchEventInit );
init Promise <undefined >updateUI (optional BackgroundFetchUIOptions = {}); };
options
一个 BackgroundFetchUpdateUIEvent
拥有一个 UI 更新标志,其初始状态为未设置。
6.7.1. updateUI()
updateUI(options)
方法在调用时必须返回一个 新的 promise promise,并按照这些步骤 并行 运行:
-
如果以下任一情况为真:
-
如果 options 为 null,则返回。
-
解决 promise。
7. 自动化
为了用户代理自动化和应用程序测试的目的,本文档为扩展命令定义了以下[WebDriver]规范。
7.1. 点击
方法 | URI 模板 |
---|---|
POST | /session/{session id}/backgroundfetch/{id}/click |
后台提取点击 扩展命令 模拟用户激活显示后台提取的操作。远程端步骤如下:
-
如果当前顶级浏览上下文 不再打开,则返回 WebDriver 错误,错误代码为 WebDriver 错误代码 没有这样的窗口。
-
令 swRegistration 为pageURL的匹配的服务工作者注册。
-
如果 swRegistration 为空,则返回 WebDriver 错误,状态码为
400
,JSON 错误代码为“invalid service worker state
”。 -
令 bgFetch 为具有 id为 url 变量 id 的最新后台提取,并且具有 swRegistration 的服务工作者注册,否则为 null。
-
如果 bgFetch 为空,则返回 WebDriver 错误,状态码为
404
,JSON 错误代码为“background fetch not found
”。 -
触发后台提取点击事件,针对 bgFetch。
-
返回 WebDriver 成功。
8. 隐私和带宽使用
提取操作可能很大且需要很长时间才能完成。在此期间,用户将从一个或多个服务器获取数据。用户的 IP 地址可能在操作过程中发生变化,并可能被用来跟踪用户的长期位置。
为了缓解这种情况,显示后台提取的步骤要求:
这些步骤还允许用户代理在用户处于计量连接时暂停后台提取。