视口捕获

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. 一致性

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

本文档中的关键词 MAYMUSTMUST 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] 中 MediaStreamMediaStreamTrackMediaStreamConstraintsConstrainablePattern 的定义,以及 [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-captureDocument-Policy: viewport-capture (TODO:使用正确的算法),则返回一个使用 DOMException 对象 拒绝的 promise,该对象的 name 属性的值为 SecurityError

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

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

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

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

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

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

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

  7. requestedMediaTypesoptions 中值为 字典或值为 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 为失败算法的结果,并令 messageundefined 或一条信息性 的人类可读消息,然后使用新的 OverconstrainedError 拒绝 p,该错误通过调用 OverconstrainedError(failedConstraint, message) 创建。

    6. videoTrackstream 中的视频轨道。
    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/