设备姿态 API

W3C 候选推荐标准快照

更多关于本文档的信息
此版本:
https://www.w3.org/TR/2024/CR-device-posture-20241126/
最新发布版本:
https://www.w3.org/TR/device-posture/
最新编辑者草案:
https://w3c.github.io/device-posture/
历史记录:
https://www.w3.org/standards/history/device-posture/
提交历史
测试套件:
https://wpt.live/device-posture
实现报告:
https://wpt.fyi/results/device-posture
编辑者:
Diego González (微软,前代表三星)
Kenneth Rohde Christiansen (英特尔公司)
Alexis Menard (英特尔公司)
反馈:
GitHub w3c/device-posture (拉取请求新问题开放问题)
附加资源:
解释器
Polyfill

摘要

本文档定义了一个 API,允许 Web 应用请求并接收设备姿态变化的通知。

本文档状态

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

有兴趣在本规范进入候选推荐阶段之前实现它的厂商应订阅 GitHub 上的仓库并参与讨论。

本文档由设备和传感器工作组作为候选推荐标准快照发布,采用推荐标准流程

作为候选推荐标准发布并不意味着W3C及其成员的认可。候选推荐标准快照已获得广泛审查,旨在收集实现经验,并且工作组成员已承诺对实现提供免版税许可

此候选推荐标准预计最早于2024年12月24日进入提议推荐标准阶段。

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

本文档受2023年11月3日W3C流程文档的约束。

1. 简介

设备姿态是指设备所处的物理位置,这可能是由传感器以及角度推导出来的。出现了新型的移动设备,它们具有某种可以改变其姿态的能力。最常见的设备类型是那些可以折叠的设备(其屏幕或围绕屏幕),使它们可以物理改变其外形尺寸。了解设备姿态的主要目的是通过响应式设计实现新的用户体验。

在上述“折叠”设备中,主要有两种不同的物理外形:具有单个柔性屏幕(无缝)的设备,以及具有两个屏幕(带缝)的设备。它们都可以围绕铰链折叠,当前规范适用于这两种类型。还应说明,无缝和带缝的设备都可以有不同的尺寸,从移动设备、平板到笔记本电脑大小。此外,还应注意,不同设备将有不同的默认方向(纵向或横向),折叠可能是垂直或水平的。

不同类型折叠设备的示意图

从通过避开折叠区域来增强网站的可用性,到为 Web 实现创新的用例,了解设备的姿态可以帮助开发人员根据不同设备定制其内容。

即使设备不是平放的情况下,内容也可以被浏览和消费,此时开发人员可能希望根据设备所处的姿态状态提供不同的布局。

2. Document 接口的扩展

以下内部槽被添加到了 Document 接口。

内部槽 描述
[[CurrentPosture]] 设备的当前姿态

3. Navigator 接口的扩展

[HTML] 规范定义了 Navigator 接口,本文档扩展了该接口:

WebIDL[SecureContext, Exposed=(Window)]
    partial interface Navigator {
      [SameObject] readonly attribute DevicePosture devicePosture;
    };

4. DevicePosture 接口

WebIDL[SecureContext, Exposed=(Window)]
    interface DevicePosture : EventTarget {
      readonly attribute DevicePostureType type;
      attribute EventHandler onchange;
    };
    
    enum DevicePostureType {
      "continuous",
      "folded"      
    };

4.1 type 属性:获取当前设备姿态

当获取 type 属性时,用户代理 必须 返回 this相关全局对象关联文档 的内部槽 [[CurrentPosture]] 的值。

4.2 onchange 属性:处理姿态变化

onchange 属性是 事件处理程序 IDL 属性, 用于 onchange 事件处理程序, 其 事件处理程序事件类型 为 "change"。

5. 姿态类型

本规范定义了以下 姿态 值:

  1. 连续姿态的示意图

    连续 姿态:连续姿态指的是“平坦”位置。这是大多数不允许不同姿态的设备的默认情况。

    包括没有折叠、铰链或类似功能的设备。

    由于硬件创新的性质,它还包括具有双屏、可折叠、可卷曲或曲面屏幕的设备,只要它们处于预期显示 Document 的平坦布局的姿态下。

    示例包括:

    • 在平坦、完全展开姿态下的可折叠设备。
    • 运行浏览器的可折叠设备,其窗口/部分不跨越铰链。
    • 处于平板模式并仅使用 1 个屏幕/侧面的 2 合 1 设备。
    • 不可折叠的设备。
    注意

    在某些情况下,设备可以运行多个应用程序,并处于非平坦的物理姿态,但只要浏览器不跨越多个屏幕/部分,相应的姿态就是连续的。

  2. 折叠姿态的示意图 折叠 姿态:折叠姿态是指可以物理折叠的设备。这些设备可以具有一个柔性屏幕或两个相邻的屏幕。此姿态在显示屏/部分之间形成一个不超过“平坦”位置的角度。

    示例包括:

    • 具有垂直铰链和内部屏幕的可折叠设备,处于“书本”姿态,其中内容跨越两个部分,并在 ~30° 和 ~170° 之间形成一个角度。
    • 具有水平铰链和内部屏幕的可折叠设备,处于“笔记本”姿态。
    注意

    当可折叠设备处于半折叠状态(如书本)时,实现者可能需要考虑文本方向和书写模式对布局和呈现的影响。

    例如,从右到左的语言(使用阿拉伯文、希伯来文、叙利亚文等文字的语言)以及许多东亚语言使用的垂直书写模式,其页面顺序与英文书籍相反,页码较小的页面在右侧。

    有关更多信息,请参阅中文日文韩文书写模式的差异。

在 API 中,姿态 值由 DevicePostureType 枚举值表示。

6. 设备姿态媒体查询

6.1 device-posture 媒体特性

device-posture 媒体特性通过 CSS 媒体查询 [MEDIAQ] 表示设备的 姿态。所有 可导航元素 反映它们的 姿态顶级可遍历元素

值:
continuous | folded
应用于:
视觉媒体类型
是否接受 min/max 前缀:

用户代理 必须 通过 CSS 媒体查询 [MEDIAQ] 反映 Web 应用程序的应用 姿态

7. 读取设备姿态

每个 Document 实例都有一个内部槽 [[CurrentPosture]],该槽在创建 Document 时应进行初始化,否则它们在第一次访问时 必须 初始化,并且在读取它们的值之前完成初始化。用户代理 必须document 设置为 DocumentdisallowRecursion 设置为 true 来运行 设备姿态更改步骤 以初始化它。

对于给定的 Document当前姿态 是从当前铰链角度和 屏幕方向中得出的, 并可能包含其他特定实现的信号。

这些表格是非规范性的。

7.1 姿态值表

这些值是近似值,可能因设备而异。例如,设备平放时可能不会正好是 180°,而是介于 175° 到 185° 之间的值。设备制造商 应当 确保物理设备的姿态正确映射到本规范定义的姿态。设备制造商也可以通过 使用比铰链角度更多的传感器来确定姿态。例如,他们还可以检测键盘是否连接在屏幕的下半部分。另一个例子是检测 是否展开支架。

某些设备可能由于物理限制或设备设计而缺少一种或多种姿态,在这种情况下,设备 应当 确保所有角度和设备方向的组合(可以由 [SCREEN-ORIENTATION] 和主机操作系统锁定),以及设备特定信号,映射到定义的姿态之一。

7.1.1 折叠设备

折叠设备的姿态值
姿态 角度值
continuous < ~180°
folded ~180°

8. 算法

8.1 计算设备姿态信息

计算 Document document 的设备姿态信息的步骤如下:

  1. topLevelTraversabledocument相关全局对象可导航对象顶级可遍历对象
  2. 如果 topLevelTraversable[[PostureOverride]] 非空,则返回它。
  3. 返回基于当前铰链角度值、当前 屏幕方向 以及可能的实现特定信号, 根据 姿态值表,以实现定义的方式确定的 DevicePostureType 值。

8.2 设备姿态变化

当用户代理确定屏幕的折叠角度、方向或设备特定信号已更改时,对于 顶级可遍历对象, 它 必须 运行 设备姿态更改步骤,并将 顶级可遍历对象活动文档 作为参数。

针对 Document设备姿态更改步骤 和一个可选的布尔值 disallowRecursion (默认值为 false)如下:

  1. 如果 document可见状态 为 "hidden",则中止这些步骤。
  2. posture 为使用 document 调用 计算设备姿态信息 的结果。
  3. 如果 posture 等于 document[[CurrentPosture]],则中止这些步骤。
  4. 将全局任务入队用户交互任务源 使用 document相关全局对象 执行以下步骤:
    1. document[[CurrentPosture]] 设置为 posture
    2. 触发一个名为 "change" 的事件,目标为与 document相关全局对象 关联的 NavigatorDevicePosture 对象。
  5. 如果 disallowRecursion 为 true,则中止这些步骤。
  6. 对于 descendantNavigabledocument子可导航对象
    1. 运行 设备姿态更改步骤, 将 document 设置为 descendantNavigable活动文档, 并将 disallowRecursion 设置为 true。

本规范定义了以下基于 visibility statedocument页面可见性更改步骤

  1. document 上运行 设备姿态更改步骤, 并将 disallowRecursion 设置为 false 以初始化它。
注意
Issue 103:避免使用页面可见性更改步骤钩子

来自 https://html.spec.whatwg.org/#update-the-visibility-state

更好的方法是规范作者直接发送拉取请求,将调用从此处添加到他们的规范中,而不是使用 页面可见性更改步骤 钩子, 以确保跨规范调用顺序明确。在撰写本文时,已知以下规范具有 页面可见性更改步骤, 它们将按未指定的顺序运行:设备姿态 API 和 Web NFC。[DEVICEPOSTURE] [WEBNFC]

9. 安全考虑

关于此规范,目前没有报告新的安全注意事项。但是,建议查看本文档中列出的潜在10. 隐私注意事项

10. 隐私考虑

10.1 隐私威胁类型

本节为非规范性内容。

10.1.1 跨上下文识别用户

当此 API 在同一设备上的不同浏览上下文中同时使用时,可能会将用户在这两个上下文中关联起来,形成意想不到的跟踪机制。 但是,由于姿态值通常在较长时间内保持稳定,它只能用于验证两个用户是否不相同,而不能帮助识别特定用户, 因为存在多种类型和型号的可折叠设备。

添加的熵与 pointer API 相当, 该 API 告知用户的主要输入是否为触摸类型。在设备上,当键盘可以移除/添加或激活/停用平板模式时,主要输入也可能发生变化。

这种理论攻击通过 10.2.1 数据最小化10.2.2 用户关注10.2.3 用户介导的操作 进行缓解。

10.1.2 跨域 iframe

跨域 iframe 通过此 API 获取姿态信息,因此可能会像在 10.1.1 跨上下文识别用户 中提到的那样用此信息识别用户。 同样的缓解措施也适用。

10.1.3 恶意脚本注入(用于广告或漏洞利用)

通过 iframe,恶意行为者可以注入自己的代码来访问姿势信息,并可能利用这些信息来跟踪用户。

这种理论上的攻击可以通过10.2.1 数据最小化以及姿势值本身携带的价值信息很少且在很长一段时间内保持稳定这一事实来缓解。

10.2 缓解策略

10.2.1 数据最小化

API 暴露了称为 姿态 的高级抽象,它可以是 "continuous" 或 "folded"。 不支持不同姿态的设备默认为 "continuous"。 这意味着最多增加一位熵。最多是因为揭示这一位需要用户进行显著、明确的物理操作,以改变设备姿态并触发更改。

实现可以使用多种低级信息来确定最合适的高级姿态,但通过此 API 不会暴露任何低级细节。 此外,任何精细的低级传感器读数都不存在与高级姿态状态的一对一映射。 实现可以使用例如铰链角度传感器、其他传感器、键盘是否已对接或支架是否已展开等信息,或者这些信息的任意组合, 来确定给定外形的最合适姿态。 这种抽象确保只暴露实现预期功能所需的最少信息,从而遵循数据最小化原则。

10.2.2 用户关注

姿态值更改事件仅针对每个 活动文档, 其 可见状态 为 "visible",如 设备姿态更改步骤 中所述, 在非 "visible" 状态下轮询值将返回过期值,因为只有当可见状态为 "visible" 或刚更改为 "visible" 时,值才会更新。

10.2.3 用户介导的操作

用户需要进行显著且明确的物理操作来修改设备姿态,以触发姿态更改。 显著,是因为操作必须跨过每个 姿态值表 定义的阈值; 明确,是因为底层操作系统会根据姿态变化做出相应的适应,符合用户对该操作结果的预期。

11. 可访问性考虑

Device Posture API 的主要目标是提升用户体验。应用程序基于该 API 可在三种方面对可访问性产生积极影响。
  1. 设计和开发不将内容(特别是按钮)放置在折叠/铰链区域的应用程序。由于折叠的弯曲性,使得使用手指在此区域进行交互变得困难甚至不可能。
  2. 设计和开发不在折叠/铰链区域上跨越大型连续内容(如视频或图片)的应用程序。如果设备处于折叠状态,此区域会轻微扭曲内容和颜色。
  3. 设计和开发更好地利用屏幕空间的应用程序,通过提供分屏 UI(将内容分割显示在屏幕不同部分的用户界面), 使得应用程序提供一种差异化且更具功能性的界面。
使用此 API 时,重要的是考虑以上对可访问性的机会。以下是一些具体的例子:

12. 自动化

Device Posture API 对测试作者提出了挑战,因为完全测试接口需要物理硬件设备。 为了解决这个问题,本文档定义了一种 [WEBDRIVER2] 扩展命令, 允许用户控制报告的设备姿态并模拟真实设备。

为了支持以下 扩展命令及其与 8. 算法的集成,顶级遍历 必须具有以下内部插槽:

内部插槽 描述
[[PostureOverride]] 覆盖硬件提供的当前姿态。 可能的值: 这些值不会直接暴露给脚本。

12.1 扩展命令

12.1.1 设置设备姿态

HTTP 方法 URI 模板
POST /session/{session id}/deviceposture

扩展命令将设备姿态更改为特定的 DevicePostureType

此算法使用的参数的属性
参数名称 值类型 必需
posture 字符串

远程端步骤为:

  1. 调用获取属性 "posture" 的结果为 posture
  2. 如果 posture 不是一个 字符串,则返回 错误,并附带 WebDriver 错误代码 无效参数
  3. 如果 posture 既不是 "continuous",也不是 "folded",则返回 错误,并附带 WebDriver 错误代码 无效参数
  4. topLevelTraversable当前浏览上下文顶级遍历
  5. 设置 topLevelTraversable[[PostureOverride]]posture
  6. documenttopLevelTraversable活动文档
  7. 调用设备姿态变化步骤,参数为 document
  8. 返回 成功,数据为 null

12.1.2 清除设备姿态

HTTP 方法 URI 模板
DELETE /session/{session id}/deviceposture

扩展命令移除设备姿态覆盖,并将设备姿态控制权交还给硬件。

远程端步骤为:

  1. topLevelTraversable当前浏览上下文顶级遍历
  2. 如果 topLevelTraversable [[PostureOverride]]null,则返回 成功,数据为 null
  3. 设置 topLevelTraversable[[PostureOverride]]null
  4. documenttopLevelTraversable活动文档
  5. 调用 设备姿态变化步骤,参数为 document
  6. 返回 成功,数据为 null

13. 示例

本节是非规范性的。

13.1 示例 1:姿态数据

这是一个简单的用例,将 姿态 打印到控制台上。

示例 1:响应姿态变化
navigator.devicePosture.addEventListener("change", () => {
      console.log(`The current posture is: ${navigator.devicePosture.type}!`);
    })

13.2 示例 2:设备姿态

设备正在用于视频通话网络服务。它可以折叠成笔记本姿态,当放置在平面上时可以实现免提体验。 用户代理检测到姿态后,用户界面会得到增强。类似的示例可以为内容适应任意姿态而起草。 有关其他关键场景,请参见 explainer

使用 device-posture 媒体特性和视口段媒体特性的视频通话网络服务的插图
示例 2:适应姿态的用户界面
@media (device-posture: folded) and (vertical-viewport-segments: 2) {
      body {
        display: flex;
        flex-flow: column nowrap;
      }
    
      .videocall-area, .videocall-controls  {
        flex: 1 1 env(viewport-segment-bottom 0 0);
      }
    }

13.3 示例 3:检测 device-posture 媒体特性

由于 device-posture 的有效值之一总是为真,您可以使用以下代码段来检测用户代理是否支持该媒体特性:

示例 3:检测 device-posture 特性
@media (device-posture) {
      /* 浏览器支持 device-posture 特性 */
    }
有关布尔上下文中媒体特性的更多信息,请参阅在布尔上下文中评估媒体特性

14. 一致性

除了标记为非规范性的部分外,本规范中的所有编写指南、图表、示例和注释都是非规范性的。本规范中的其他内容均为规范性。

本文档中的关键词 MUSTSHOULD 应按 BCP 14 [RFC2119] [RFC8174] 的描述进行解释,仅当这些词汇完全以大写形式出现时,如此处所示。

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

A. IDL 索引

WebIDL[SecureContext, Exposed=(Window)]
    partial interface Navigator {
      [SameObject] readonly attribute DevicePosture devicePosture;
    };
    
    [SecureContext, Exposed=(Window)]
    interface DevicePosture : EventTarget {
      readonly attribute DevicePostureType type;
      attribute EventHandler onchange;
    };
    
    enum DevicePostureType {
      "continuous",
      "folded"      
    };

B. 致谢

本节是非规范性的。

我们要衷心感谢 Daniel Appelquist、Jo Balletti、Michael Blix、Paul Grenier 和 Laura Morinigo 对本工作的贡献。

C. 实质性变更摘要

本节内容不具约束力。

D. 参考文献

D.1 规范性参考文献

[dom]
DOM 标准。Anne van Kesteren。WHATWG。 现行标准。URL:https://dom.spec.whatwg.org/
[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/
[MEDIAQ]
媒体查询第 4 级。Florian Rivoal;Tab Atkins Jr.。W3C。2021年12月25日。W3C 候选推荐标准。URL:https://www.w3.org/TR/mediaqueries-4/
[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-ORIENTATION]
屏幕方向。Marcos Caceres。W3C。2023年8月9日。W3C 工作草案。URL:https://www.w3.org/TR/screen-orientation/
[WEBDRIVER2]
WebDriver。Simon Stewart;David Burns。 W3C。2024年10月9日。W3C 工作草案。URL:https://www.w3.org/TR/webdriver2/
[webidl]
Web IDL 标准。Edgar Chen;Timothy Gu。 WHATWG。现行标准。URL:https://webidl.spec.whatwg.org/

D.2 信息性参考文献

[clreq]
中文文本布局要求 - 中文排版需求。Fuqiao Xue;Richard Ishida。W3C。2024年7月1日。W3C 工作组说明。 URL:https://www.w3.org/TR/clreq/
[jlreq]
日语文本布局要求 日本語組版処理の要件(日本語版)。Hiroyuki Chiba;Junzaburo Edamoto;Richard Ishida;Seiichi Kato;Tatsuo KOBAYASHI;Toshi Kobayashi;Nathaniel McCully;Felix Sasaki;Atsushi Shimono;Hajime Shiozawa;Fuqiao Xue 等。W3C。2020年8月11日。W3C 工作组说明。URL:https://www.w3.org/TR/jlreq/
[klreq]
韩文文本布局和排版要求: 한국어 텍스트 레이아웃 및 타이포그래피를 위한 요구사항。Richard Ishida。W3C。2020年5月27日。W3C 工作组说明。URL:https://www.w3.org/TR/klreq/