视口捕获

W3C 工作草案

关于本文档的更多详细信息
此版本:
https://www.w3.org/TR/2024/WD-mediacapture-viewport-20241009/
最新发布版本:
https://www.w3.org/TR/mediacapture-viewport/
最新编辑草案:
https://w3c.github.io/mediacapture-viewport/
历史:
https://www.w3.org/standards/history/mediacapture-viewport/
提交历史
编辑者:
Elad Alon (Google)
Jan-Ivar Bruaroey (Mozilla)
Tove Petersson (Google)
反馈:
GitHub w3c/mediacapture-viewport (拉取请求, 新议题, 未解决议题)
public-webrtc@w3.org 主题行请写为 [mediacapture-viewport] … 消息主题 …(归档)
参与
邮件列表

摘要

本文档定义了如何使用 getViewportMedia(Screen Capture API [screen-capture] 的扩展)将浏览器视口用作媒体流的来源。

本文档状态

本节描述了本文档在发布时的状态。 当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 技术 报告索引中找到,地址为 https://www.w3.org/TR/。

本文档尚未完成。

本文档由 Web 实时 通信工作组作为 工作草案发布,并使用 推荐标准轨道。

作为工作草案发布并不 意味着得到 W3C 及其成员的认可。

这是一份草案文档,随时可能由其他文档更新、替换或废弃。 除作为进行中的工作外,不宜引用本文档。

本文档由一个 根据 W3C 专利 政策运作的小组制作。 W3C 维护了一份 公开的专利披露列表, 其中列出了与该小组交付成果相关的任何专利披露; 该页面还包括 披露专利的说明。实际 知晓某项专利,并认为该专利包含 必要权利要求的个人, 必须按照 W3C 专利政策第 6 节 披露相关信息。

本文档受 2023年11月03日 W3C 流程文档管辖。

1. 引言

本节是非规范性的。

本文档描述了 Screen Capture API [screen-capture] 的一个扩展,它能够以视频轨道的形式获取 浏览器视口(当前标签页)。在某些情况下,标签页音频也会 以音频轨道的形式被捕获。这支持如下用例:录制正在进行的 WebRTC [WEBRTC] 视频会议,或者视频会议中的用户无需在 选择器中找到演示文稿,而是通过点击其演示应用程序中的按钮来共享演示文稿。

此特性仅适用于“跨源隔离”的文档。这可以防止应用程序使用 此 API 访问来自其他源的潜在机密信息,即由于用户代理沙箱所提供的保护 而本应保持不可访问的内容。

此特性具有安全影响,并且需要权限提示。共享渲染后的视口可能会 暴露用户信息,例如浏览历史(通过链接变紫)、地址或 支付信息等个人详情(通过用户代理或 Web 扩展的表单自动填充等特性),或个人偏好 (例如 字体大小)。

2. 一致性

除标记为非规范性的章节外,本 规范中的所有创作指南、图表、示例和注释均为非规范性的。本规范中的其他所有内容均为规范性的。

本文档中的关键词 MAY、MUST 和 MUST NOT 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述来解释,当且仅当它们像这里所示那样全部以大写字母出现时。

本规范定义了适用于单一产品的一致性标准:实现其所包含接口的 用户 代理。

使用 ECMAScript [ECMA-262] 实现本 规范中定义的 API 的实现,必须以与 Web IDL 规范 [WEBIDL] 中定义的 ECMAScript 绑定相一致的方式实现它们,因为本规范使用了该规范及其 术语。

3. 示例

以下示例演示了使用本文档中定义的 navigator.mediaDevices.getViewportMedia 方法请求视口捕获。

try {
  const stream = await navigator.mediaDevices.getViewportMedia();
  videoElement.srcObject = stream;
} catch (e) {
  console.log('Unable to acquire viewport capture: ' + e);
}

4. 术语

本文档使用 [GETUSERMEDIA] 中 MediaStream、MediaStreamTrack、 MediaStreamConstraints 和 ConstrainablePattern 的定义,以及 [screen-capture] 中 显示表面 和 浏览器显示表面 的定义。

5. 捕获视口媒体

通过在 MediaDevices 接口上添加新的 getViewportMedia 方法来启用视口捕获,该方法类似于 getDisplayMedia(), 但它只捕获 顶级文档的视口(当前标签页),并使用权限提示,而不是向用户呈现 选择器。出于安全原因,它也只适用于选择加入了 document-policy 的“跨源隔离”文档。

5.1 MediaDevices 扩展

WebIDLpartial interface MediaDevices {
  Promise<MediaStream> getViewportMedia(
      optional DisplayMediaStreamOptions options = {});
};
getViewportMedia

提示用户授予对视口(当前标签页)进行实时捕获的权限。

用户代理 MUST 在权限 被授予后,将任何提供的 options 应用于所产生的媒体。

对于音频,如果可用,用户代理 MAY 向最终用户提供一个 用于在捕获中包含来自 当前视口音频的选项。与 getDisplayMedia() 关于 音频+视频的情况一样,即使存在音频约束,用户代理也可以不返回音频。如果 用户代理知道在流的整个生命周期内都不会共享音频,则它 MUST NOT 在结果流中包含音频轨道。用户代理 MAY 接受对音频 和视频的请求,但在结果流中只返回视频 轨道;或者它 MAY 通过在结果流中 同时返回音频轨道和视频 轨道来接受该请求。用户代理 MUST 拒绝仅音频 请求。

与 getDisplayMedia() 一样, “granted” 权限不能被持久化。

当调用 getViewportMedia() 方法时,用户代理 MUST 运行以下 步骤:

  1. 如果 当前 设置对象的 跨源 隔离能力为 false,则返回一个使用 DOMException 对象 拒绝的 promise,该对象的 name 属性的值为 SecurityError。

  2. 如果 相关 全局对象的 关联 Document 的 顶级 浏览上下文的 required document policy 不包含 Require-Document-Policy: viewport-capture 和 Document-Policy: viewport-capture (TODO:使用正确的算法),则返回一个使用 DOMException 对象 拒绝的 promise,该对象的 name 属性的值为 SecurityError。

  3. 如果 相关 全局对象(属于 this)没有 瞬态 激活,则返回一个使用 拒绝的 promise,其拒绝理由为一个 DOMException 对象,该对象的 name 属性的值为 InvalidStateError。

  4. 令 options 为该方法的第一个参数。

  5. 如果 options.video 为 false,则返回一个使用新 创建的 TypeError 拒绝的 promise。

  6. 对 options 中每个值 CS 为字典的 存在的成员,运行以下步骤:

    1. 如果 CS 包含名为 advanced 的成员,则返回一个使用新 创建的 TypeError 拒绝的 promise。

    2. 如果 CS 包含一个成员,其名称指定了适用于 显示 表面的可约束属性,并且其值又是 包含名为 min 或 exact 的成员的字典,则返回一个 使用新 创建的 TypeError 拒绝的 promise。

    3. 如果 CS 包含一个成员,其名称指定了适用于 显示 表面的可约束属性,并且其值又是 包含名为 max 的成员的字典,而该成员的值 又小于该可约束属性的 下限 值, 则令 failedConstraint 为该成员的名称,令 message 为 undefined 或一条信息性的人类可读消息,并返回一个 使用新的 OverconstrainedError 拒绝的 promise,该错误通过调用 OverconstrainedError(failedConstraint, message) 创建。

  7. 令 requestedMediaTypes 为 options 中值为 字典或值为 true 的媒体类型集合。

  8. 如果 相关 全局对象的 关联 Document不是 完全 活跃的,或 没有 获得焦点,则返回 一个使用 DOMException 对象 拒绝的 promise,该对象的 name 属性的值为 InvalidStateError。

  9. 令 p 为一个新的 promise。

  10. 并行运行以下步骤:

    1. 对于 requestedMediaTypes 中的每个媒体类型 T,

      1. 如果没有可用的 T 类型源,则使用一个新的 DOMException 对象 拒绝 p,该对象的 name 属性的值为 NotFoundError。

      2. 读取当前浏览上下文中用于获取 T 类型源的当前 权限 状态。如果权限状态为“denied”, 则跳转到下面标记为 PermissionFailure 的 步骤。

    2. 可选地,例如基于先前建立的用户偏好,出于 安全原因,或由于 平台限制,跳转到下面标记为 Permission Failure 的步骤。

    3. 请求 使用视口捕获的权限,针对一个 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, 并中止这些步骤。

    4. 令 stream 为用户授予权限的 MediaStream 对象。

    5. 使用适当的约束,在 stream 中的所有轨道上运行 ApplyConstraints 算法。如果这失败,则令 failedConstraint 为失败算法的结果,并令 message 为 undefined 或一条信息性 的人类可读消息,然后使用新的 OverconstrainedError 拒绝 p,该错误通过调用 OverconstrainedError(failedConstraint, message) 创建。

    6. 令 videoTrack 为 stream 中的视频轨道。
    7. 将 videoTrack.[[Restrictable]] 设置为 true。
    8. 使用 stream 解决 p,并中止这些步骤。

    9. Permission Failure:使用一个新的 DOMException 对象 拒绝 p,该对象的 name 属性的值为 NotAllowedError。

  11. 返回 p。

用户代理 MUST NOT 捕获位于部分透明的被捕获 显示表面背后的内容。

用户代理 MUST NOT 共享来自被捕获 标签页所发出音频之外的音频,并且 MUST NOT 共享整个系统的音频。

5.2 被捕获 视口表面的可约束属性

与 getViewportMedia 相关的约束只是 与 getDisplayMedia() 相关的那些约束,如 5.4 被捕获显示表面的可约束属性中所定义。

5.3 权限集成

Viewport Capture 是一个 强大特性,其由 名称 "viewport-capture" 标识,并且需要 明确权限才能使用。

按照与 Permissions 规范集成的要求,本 规范定义了 以下内容:

权限状态 约束
此描述符的 权限状态的有效值为“prompt” 和 “denied”。 用户代理 MUST NOT 将此描述符的 权限状态设置为 “granted”。

5.4 权限策略集成

本规范定义了一个 策略控制 特性,由字符串 "viewport-capture" 标识。 其 默认 允许列表为 "self"。

注

一个 文档的 权限 策略决定该文档中的任何内容是否被允许 使用 getViewportMedia。如果 在任何文档中禁用,则该文档中的任何内容都不会被 允许 使用 getViewportMedia。这由 请求权限 使用 算法强制执行。

6. 隐私指示器要求

本规范扩展了 隐私指示器 要求,该要求属于 getDisplayMedia(), 以包含 getViewportMedia。

7. 安全和隐私 考量

本节是资料性的;然而,它指出了如果不遵守其中包含的建议, 会对平台安全造成的一些严重风险。

待定。

A. 参考文献

A.1 规范性参考文献

[ECMA-262]
ECMAScript 语言规范。 Ecma International。URL:https://tc39.es/ecma262/multipage/
[GETUSERMEDIA]
媒体捕获与流。 Cullen Jennings; Bernard Aboba; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet。W3C。2024年10月3日。 W3C 候选推荐标准。URL:https://www.w3.org/TR/mediacapture-streams/
[HTML]
HTML 标准。Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters。WHATWG。现行 标准。URL:https://html.spec.whatwg.org/multipage/
[infra]
Infra 标准。Anne van Kesteren; Domenic Denicola。WHATWG。现行标准。URL:https://infra.spec.whatwg.org/
[Permissions]
权限。Marcos Caceres; Mike Taylor。W3C。2024年3月19日。W3C 工作草案。URL:https://www.w3.org/TR/permissions/
[permissions-policy]
权限策略。Ian Clelland。W3C。2024年9月25日。W3C 工作草案。URL:https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
用于 RFC 中表示 要求级别的关键词。S. Bradner。IETF。1997年3月。最佳当前实践。URL:https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 关键词中大写与小写的歧义。B. Leiba。IETF。2017年5月。最佳当前实践。URL:https://www.rfc-editor.org/rfc/rfc8174
[screen-capture]
屏幕捕获。Jan-Ivar Bruaroey; Elad Alon。W3C。2024年6月27日。W3C 工作草案。URL:https://www.w3.org/TR/screen-capture/
[WEBIDL]
Web IDL 标准。Edgar Chen; Timothy Gu。 WHATWG。现行标准。URL:https://webidl.spec.whatwg.org/

A.2 资料性参考文献

[dom]
DOM 标准。Anne van Kesteren。WHATWG。 现行标准。URL:https://dom.spec.whatwg.org/
[WEBRTC]
WebRTC:浏览器中的实时通信。Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; Florent Castelli。 W3C。2024年10月8日。W3C 推荐标准。URL:https://www.w3.org/TR/webrtc/