Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本文档提出了一种机制,通过该机制,如果 CAPTR 正在屏幕捕获 APP 运行所在的标签页,则应用 APP 可以选择向 另一个应用 CAPTR 暴露某些信息。它 描述了一种用于 标签页捕获或 窗口捕获的机制。
本节描述的是本文档在发布时的状态。当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 技术 报告索引中找到,网址为 https://www.w3.org/TR/。
本文档尚未完成。
本文档由 Web 实时 通信工作组作为 工作草案发布,使用 推荐标准轨道。
发布为工作草案并不 意味着获得 W3C 及其成员的认可。
这是一份草案文档,可能随时被其他文档更新、替换或废弃。 除了作为正在进行中的工作之外,不应引用本文档。
本文档由一个在 W3C 专利 政策下运作的小组制作。 W3C 维护着一份与该小组交付物相关的 任何专利披露的公开列表; 该页面还包括 披露专利的说明。实际 知晓某项专利,并且该个人认为该专利包含 必要权利要求的个人, 必须按照 W3C 专利政策第 6 节 披露该信息。
本文档受 2023 年 11 月 03 日 W3C 流程文档管辖。
除了标记为非规范性的章节之外,本规范中的所有编写指南、图表、示例和注释都是非规范性的。 本规范中的其他所有内容都是规范性的。
本文档中的关键词 MUST 和 MUST NOT 应按 BCP 14 [RFC2119] [RFC8174] 中的描述来解释,但仅当它们如这里所示全部以大写形式出现时才如此。
考虑一个在某个标签页中运行的 Web 应用,我们将其命名为“main_app”。 假定 main_app 调用 getDisplayMedia, 并且用户选择:
注意:
对于一般情况而言,这两个特性都是可取的,但也存在合法的用例, 浏览器会希望允许应用选择加入,以弥合这一差距并 启用连接。
我们希望在保持一般情况与以往相同的同时,启用这些合法用例。
考虑一个协作的演示软件和视频会议软件。假定用户正在一个 VC 会话中。 用户开始共享一个演示文稿。两个应用都希望让 VC 应用发现它正在捕获一个幻灯片会话、 哪个应用,甚至哪个会话,以便 VC 应用能够向用户暴露用于翻阅幻灯片的控件。 当用户点击这些控件时,VC 应用将能够向演示应用发送消息,请求其执行 翻阅幻灯片、进入/离开演示模式等操作。
传输这些消息的手段不在本文档范围内。一些 选项包括:
捕获应用通常希望收集有关其用户倾向于捕获哪些应用的统计信息。 例如,VC 应用希望知道其用户共享来自特定提供商的演示应用、 Wikipedia、CNN 等的频率。收集此类信息可用于通过引入新的 协作来改善用户服务,例如上文所描述的协作。
用户有时会选择共享错误的标签页。有时他们会因为误点“改为共享此标签页”按钮, 而切换为共享错误的标签页。一个善意的应用可以在认为用户可能犯错时, 通过显示应用内对话框来要求重新确认,从而尝试保护用户。
此用例是 #3 的一个子用例,但由于其重要性,值得单独成节。 当用户选择共享 VC 通话所在的标签页时,就会出现“镜厅”效应。 在检测到自我捕获时,VC 应用可以避免将被捕获的流再显示给用户, 从而避免这种令人不快的效应。
捕获句柄机制由两个主要部分组成:一个位于被捕获端,一个位于 捕获端。
setCaptureHandleConfig
选择加入以暴露信息。
CaptureHandle。
允许应用向捕获应用暴露信息。它们通常会在甚至不知道自己是否被捕获之前
这样做。所使用的机制是用适当的
CaptureHandleConfig
调用
setCaptureHandleConfig。
CaptureHandleConfig 字典用于指示用户代理:被捕获应用打算暴露哪些信息, 以及它愿意向哪些应用暴露上述信息。
WebIDLdictionary CaptureHandleConfig {
boolean exposeOrigin = false;
DOMString handle = "";
sequence<DOMString> permittedOrigins = [];
};
exposeOrigin
如果为 true,用户代理 MUST 通过
CaptureHandle 的
origin 字段暴露被捕获
应用的 origin。如果为
false,用户代理 MUST NOT 暴露被捕获
应用的 origin。
handle
用户代理 MUST 将此值作为
handle 暴露。
注:此字段的值限制为 1024 个 16 位字符。此限制在
setCaptureHandleConfig
中有进一步规定。
permittedOrigins
此字段的有效值包括:
"*" 的列表。
如果 permittedOrigins
由单个项目
"*" 组成,则该 CaptureHandle 对所有
捕获者都是可观察的。
否则,CaptureHandle 仅对
其 origin 列在 permittedOrigins
中的捕获者是可观察的。
MediaDevices
扩展了一个方法——setCaptureHandleConfig——
该方法接受一个 CaptureHandleConfig
对象。通过调用此方法,应用会告知用户代理它允许捕获应用观察哪些信息。
关于 setCaptureHandleConfig
在被调用多次时应如何表现,目前尚无共识,原因是担心它本身被误用为跨源
消息传递通道。此问题正在
议题 #11
中讨论。
WebIDLpartial interface MediaDevices {
undefined setCaptureHandleConfig(optional CaptureHandleConfig config = {});
};
setCaptureHandleConfig
用户代理 MUST 运行以下验证:
handle 被设置为
无效值,则用户代理 MUST
通过抛出 TypeError
来拒绝。
permittedOrigins
被设置为无效值,则用户
代理 MUST 通过抛出 NotSupportedError
来拒绝。
setCaptureHandleConfig()
的调用并非来自顶级
浏览上下文,则用户代理 MUST 通过抛出 InvalidStateError
来拒绝。
如果所有验证都通过,则用户代理 MUST 接受新的 config。
用户代理
MUST 忘记之前对 setCaptureHandleConfig
的任何调用;从现在起,
应用的 CaptureHandleConfig 为
config。
将为所有捕获应用重新评估可观察的 CaptureHandle。
CaptureHandle
与调用 setCaptureHandleConfig
之前不同,则
用户代理 MUST 触发一个事件,其名称为
capturehandlechange。
getCaptureHandle
时,用户代理 MUST 报告新的可观察的 CaptureHandle。
被允许观察某个轨道的
CaptureHandle 的捕获应用,有两种读取方式。
getCaptureHandle
返回的当前值。oncapturehandlechange
注册一个 EventListener。
用户代理通过 CaptureHandle 字典,
向捕获应用暴露有关被捕获应用的信息。注意,
MUST NOT 将 CaptureHandle 对象
提供给未被允许观察它的捕获应用。
WebIDLdictionary CaptureHandle {
DOMString origin;
DOMString handle;
};
origin
如果被捕获应用选择加入以暴露其 origin(通过将
exposeOrigin 设置为 true),
则用户代理 MUST 将
origin 设置为被捕获
应用的 origin。否则,
不设置 origin。
handle
用户代理 MUST 将此字段设置为被捕获
应用在
handle
中设置的值。
使用名为 getCaptureHandle
的方法扩展 MediaStreamTrack。
当 MediaStreamTrack
是从屏幕捕获派生的视频轨道时,
getCaptureHandle 返回最新的
可观察的 CaptureHandle。
否则返回 null。
关于 getCaptureHandle
应属于
MediaStreamTrack
还是属于一个既不可
克隆也不可
转移
的专用控制器对象,目前尚无共识;后者可将影响所有轨道的消息传递与
单条轨道的使用分离。此问题正在
议题 #12
中讨论。
WebIDLpartial interface MediaStreamTrack {
CaptureHandle? getCaptureHandle();
};
getCaptureHandle
如果所讨论的轨道不是视频轨道,则用户代理 MUST
返回
null。
如果该轨道不表示
browser 或
window
display surface,
则用户
代理 MUST 返回 null。
如果该轨道已结束,则用户
代理 MUST 返回
null。
如果被捕获应用未设置 CaptureHandleConfig,或者如果它最后一次
将其设置为空的 CaptureHandleConfig,则用户
代理 MUST 返回
null。
用户代理 MUST 将捕获 document 的 origin 与被捕获
应用在 permittedOrigins
中列出的那些 origin 进行比较。如果该
捕获 origin 不被允许观察该 CaptureHandle,
则用户代理 MUST 返回 null。
如果之前所有验证均通过,则用户代理 MUST 返回一个
CaptureHandle 字典,其值
派生自被捕获应用最后设置的
CaptureHandleConfig。
每当给定捕获应用的可观察的 CaptureHandle 发生变化时,
用户代理都会触发一个名为 capturehandlechange
的事件。这可能发生在以下情况中:
CaptureHandleConfig
调用 setCaptureHandleConfig()。
(注意,新的 CaptureHandleConfig 可能会也可能不会
导致可观察的 CaptureHandle 发生变化,例如在更改
permittedOrigins
时。)
MediaStreamTrack
扩展了一个名为
oncapturehandlechange
的 EventListener。
WebIDLpartial interface MediaStreamTrack {
attribute EventHandler oncapturehandlechange;
};
oncapturehandlechange
用于名为 capturehandlechange
的事件的 EventHandler。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: