Copyright © 2021-2024 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本文档定义了如何使用
getViewportMedia(Screen Capture API [screen-capture] 的扩展)将浏览器视口用作媒体流的来源。
本节描述了本文档在发布时的状态。 当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 技术 报告索引中找到,地址为 https://www.w3.org/TR/。
本文档尚未完成。
本文档由 Web 实时 通信工作组作为 工作草案发布,并使用 推荐标准轨道。
作为工作草案发布并不 意味着得到 W3C 及其成员的认可。
这是一份草案文档,随时可能由其他文档更新、替换或废弃。 除作为进行中的工作外,不宜引用本文档。
本文档由一个 根据 W3C 专利 政策运作的小组制作。 W3C 维护了一份 公开的专利披露列表, 其中列出了与该小组交付成果相关的任何专利披露; 该页面还包括 披露专利的说明。实际 知晓某项专利,并认为该专利包含 必要权利要求的个人, 必须按照 W3C 专利政策第 6 节 披露相关信息。
本文档受 2023年11月03日 W3C 流程文档管辖。
本节是非规范性的。
本文档描述了 Screen Capture API [screen-capture] 的一个扩展,它能够以视频轨道的形式获取 浏览器视口(当前标签页)。在某些情况下,标签页音频也会 以音频轨道的形式被捕获。这支持如下用例:录制正在进行的 WebRTC [WEBRTC] 视频会议,或者视频会议中的用户无需在 选择器中找到演示文稿,而是通过点击其演示应用程序中的按钮来共享演示文稿。
此特性仅适用于“跨源隔离”的文档。这可以防止应用程序使用 此 API 访问来自其他源的潜在机密信息,即由于用户代理沙箱所提供的保护 而本应保持不可访问的内容。
此特性具有安全影响,并且需要权限提示。共享渲染后的视口可能会 暴露用户信息,例如浏览历史(通过链接变紫)、地址或 支付信息等个人详情(通过用户代理或 Web 扩展的表单自动填充等特性),或个人偏好 (例如 字体大小)。
除标记为非规范性的章节外,本 规范中的所有创作指南、图表、示例和注释均为非规范性的。本规范中的其他所有内容均为规范性的。
本文档中的关键词 MAY、MUST 和 MUST NOT 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述来解释,当且仅当它们像这里所示那样全部以大写字母出现时。
本规范定义了适用于单一产品的一致性标准:实现其所包含接口的 用户 代理。
使用 ECMAScript [ECMA-262] 实现本 规范中定义的 API 的实现,必须以与 Web IDL 规范 [WEBIDL] 中定义的 ECMAScript 绑定相一致的方式实现它们,因为本规范使用了该规范及其 术语。
以下示例演示了使用本文档中定义的
navigator.mediaDevices.getViewportMedia 方法请求视口捕获。
try {
const stream = await navigator.mediaDevices.getViewportMedia();
videoElement.srcObject = stream;
} catch (e) {
console.log('Unable to acquire viewport capture: ' + e);
}
本文档使用 [GETUSERMEDIA] 中
MediaStream、MediaStreamTrack、
MediaStreamConstraints
和
ConstrainablePattern
的定义,以及 [screen-capture] 中
显示表面
和 浏览器显示表面
的定义。
通过在
MediaDevices 接口上添加新的 getViewportMedia 方法来启用视口捕获,该方法类似于 getDisplayMedia(),
但它只捕获
顶级文档的视口(当前标签页),并使用权限提示,而不是向用户呈现
选择器。出于安全原因,它也只适用于选择加入了
document-policy 的“跨源隔离”文档。
WebIDLpartial interface MediaDevices {
Promise<MediaStream> getViewportMedia(
optional DisplayMediaStreamOptions options = {});
};
getViewportMedia
提示用户授予对视口(当前标签页)进行实时捕获的权限。
用户代理 MUST 在权限 被授予后,将任何提供的 options 应用于所产生的媒体。
对于音频,如果可用,用户代理 MAY 向最终用户提供一个
用于在捕获中包含来自
当前视口音频的选项。与 getDisplayMedia()
关于
音频+视频的情况一样,即使存在音频约束,用户代理也可以不返回音频。如果
用户代理知道在流的整个生命周期内都不会共享音频,则它 MUST NOT 在结果流中包含音频轨道。用户代理 MAY 接受对音频
和视频的请求,但在结果流中只返回视频
轨道;或者它 MAY 通过在结果流中
同时返回音频轨道和视频
轨道来接受该请求。用户代理 MUST 拒绝仅音频
请求。
与 getDisplayMedia()
一样,
“granted”
权限不能被持久化。
当调用 getViewportMedia()
方法时,用户代理 MUST 运行以下
步骤:
如果 当前
设置对象的 跨源
隔离能力为 false,则返回一个使用 DOMException
对象 拒绝的 promise,该对象的
name
属性的值为 SecurityError。
如果 相关
全局对象的 关联
Document 的 顶级
浏览上下文的
required document policy
不包含 Require-Document-Policy: viewport-capture 和
Document-Policy: viewport-capture
(TODO:使用正确的算法),则返回一个使用 DOMException
对象 拒绝的 promise,该对象的
name
属性的值为 SecurityError。
如果 相关
全局对象(属于 this)没有 瞬态
激活,则返回一个使用
拒绝的
promise,其拒绝理由为一个 DOMException
对象,该对象的 name
属性的值为
InvalidStateError。
令 options 为该方法的第一个参数。
如果 options.video 为 false,则返回一个使用新
创建的 TypeError
拒绝的 promise。
对 options 中每个值 CS 为字典的 存在的成员,运行以下步骤:
如果 CS 包含一个成员,其名称指定了适用于
显示
表面的可约束属性,并且其值又是
包含名为 min 或
exact 的成员的字典,则返回一个
使用新 创建的 TypeError
拒绝的
promise。
如果 CS 包含一个成员,其名称指定了适用于
显示
表面的可约束属性,并且其值又是
包含名为 max 的成员的字典,而该成员的值
又小于该可约束属性的 下限
值,
则令 failedConstraint 为该成员的名称,令
message 为
undefined 或一条信息性的人类可读消息,并返回一个
使用新的 OverconstrainedError 拒绝的
promise,该错误通过调用
OverconstrainedError(failedConstraint, message)
创建。
令 requestedMediaTypes 为 options 中值为
字典或值为 true 的媒体类型集合。
如果 相关
全局对象的 关联
Document不是 完全
活跃的,或
没有 获得焦点,则返回
一个使用 DOMException
对象 拒绝的 promise,该对象的 name
属性的值为 InvalidStateError。
令 p 为一个新的 promise。
并行运行以下步骤:
对于 requestedMediaTypes 中的每个媒体类型 T,
如果没有可用的 T 类型源,则使用一个新的
DOMException
对象 拒绝
p,该对象的 name
属性的值为 NotFoundError。
读取当前浏览上下文中用于获取 T 类型源的当前 权限
状态。如果权限状态为“denied”,
则跳转到下面标记为 PermissionFailure 的
步骤。
可选地,例如基于先前建立的用户偏好,出于 安全原因,或由于 平台限制,跳转到下面标记为 Permission Failure 的步骤。
请求
使用视口捕获的权限,针对一个 PermissionDescriptor,
其
name
设置为 "viewport-capture",
产生一组提供的
媒体。
所提供的媒体 MUST 精确包含一个视频
轨道,该轨道 MUST 是
相关
全局对象的 关联
Document 的 顶级
浏览上下文的
视口的
浏览器
显示
表面
的实时捕获。
所提供的媒体 MUST 最多包含一个音频
轨道;如果提供,则该轨道 MUST 是由一组文档产生的组合
音频之和,这组文档包括 相关
全局对象的
关联
Document 的 顶级
浏览上下文的 活动
文档,以及
相关
全局对象的 关联
Document 的 顶级
浏览上下文中嵌套 浏览
上下文内的所有 活动
文档。如果未在 requestedMediaTypes 中指定音频,或如果
音频被指定
为 false,则该音频轨道 MUST NOT
被包含。
MediaStreamTrack
的源
MUST NOT 改变。
如果请求结果为“granted”,
则对于正在作为所提供媒体来源的每个设备,使用该设备的稳定且私有的 id
deviceId,
将 [[devicesLiveMap]][deviceId] 设置为 true(如果它尚未为
true),并将 [[devicesAccessibleMap]][deviceId] 设置为
true(如果它尚未为 true)。
用户代理 MUST NOT 存储“granted”
权限条目。
如果结果为“denied”,
则跳转到下面标记为
Permission Failure 的步骤。如果用户从未响应,则该算法
停滞在此步骤。
如果用户授予了权限,但由于操作系统/程序/网页
锁定等硬件错误阻止访问,则使用一个新的 DOMException
对象 拒绝
p,该对象的 name
属性的值为 NotReadableError,
并中止这些步骤。
如果结果为“granted”,
但设备访问因上述原因之外的任何原因失败,则使用一个新的 DOMException
对象 拒绝
p,该对象的
name
属性的值为 AbortError,
并中止这些步骤。
令 stream 为用户授予权限的 MediaStream
对象。
使用适当的约束,在 stream 中的所有轨道上运行 ApplyConstraints
算法。如果这失败,则令 failedConstraint
为失败算法的结果,并令
message 为 undefined 或一条信息性
的人类可读消息,然后使用新的 OverconstrainedError
拒绝
p,该错误通过调用
OverconstrainedError(failedConstraint, message)
创建。
[[Restrictable]]
设置为 true。使用 stream 解决 p,并中止这些步骤。
Permission Failure:使用一个新的 DOMException
对象 拒绝 p,该对象的
name
属性的值为 NotAllowedError。
返回 p。
用户代理 MUST NOT 捕获位于部分透明的被捕获 显示表面背后的内容。
用户代理 MUST NOT 共享来自被捕获 标签页所发出音频之外的音频,并且 MUST NOT 共享整个系统的音频。
与 getViewportMedia 相关的约束只是
与
getDisplayMedia()
相关的那些约束,如
5.4 被捕获显示表面的可约束属性中所定义。
Viewport Capture 是一个 强大特性,其由
名称
"viewport-capture"
标识,并且需要 明确权限才能使用。
按照与 Permissions 规范集成的要求,本 规范定义了 以下内容:
prompt”
和
“denied”。
用户代理 MUST NOT 将此描述符的 权限状态设置为
“granted”。
本规范定义了一个 策略控制
特性,由字符串 "viewport-capture" 标识。
其 默认
允许列表为 "self"。
一个 文档的 权限
策略决定该文档中的任何内容是否被允许
使用 getViewportMedia。如果
在任何文档中禁用,则该文档中的任何内容都不会被
允许
使用 getViewportMedia。这由
请求权限
使用
算法强制执行。
本规范扩展了
隐私指示器
要求,该要求属于
getDisplayMedia(),
以包含 getViewportMedia。
本节是资料性的;然而,它指出了如果不遵守其中包含的建议, 会对平台安全造成的一些严重风险。
待定。
Referenced in: