デバイスポスチャ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 (Microsoft(以前はSamsungを代表))
Kenneth Rohde Christiansen (Intel Corporation)
Alexis Menard (Intel Corporation)
フィードバック:
GitHub w3c/device-posture (プルリクエスト, 新しいイシュー, オープンイシュー)
追加リソース
説明資料
ポリフィル

概要

この文書は、ウェブアプリケーションがデバイスのポスチャ(姿勢)をリクエストし、その変化通知を受け取ることができるAPIを規定します。

この文書のステータス

このセクションは、本書が公開された時点でのステータスを説明します。最新のW3C出版物一覧及び、本技術レポートの最新版は W3C技術レポートインデックス(https://www.w3.org/TR/)で確認できます。

この仕様の実装に関心のあるベンダーは、最終的に勧告候補段階に進む前に GitHubリポジトリを購読し、議論に参加してください。

この文書は Devices and Sensors Working Groupによって、 勧告トラックを用いて、勧告候補スナップショットとして公開されました。

勧告候補として公開されても、W3Cおよびその会員による承認を意味するものではありません。勧告候補スナップショットは 幅広いレビューを受けており、 実装経験の収集、およびワーキンググループメンバーによる ロイヤリティフリーライセンスの約束を目的としています。

この勧告候補が提案勧告に進むのは、2024年12月24日より早くなることはありません。

この文書は W3C特許ポリシーに基づき運営されるグループによって作成されました。 W3C関連成果物に関する特許開示の公開リストも管理しています。 そのページには特許開示の方法も記載されています。特定の特許が 必須クレームを含むと認識している場合は、 W3C特許ポリシー第6項に従って情報を開示してください。

この文書は 2023年11月3日 W3Cプロセス文書に準拠しています。

1. はじめに

デバイスポスチャとは、デバイスが保持する物理的な姿勢であり、角度に加えてセンサーなどから得られる情報に基づく場合もあります。近年、ポスチャを変化できる機能を持つ新しいタイプのモバイルデバイスが登場しています。最も一般的なのは、画面自体や画面周囲を折り畳めるデバイスであり、物理的な形状を変更できます。デバイスのポスチャを知る主な目的は、レスポンシブデザインによる新しいユーザー体験を可能にすることです。

「折り畳み」デバイスには主に2つの物理的なフォームファクターがあります。1つは1枚の柔軟な画面(シームレス)を持つもの、もう1つは2枚の画面(シームあり)を持つものです。どちらもヒンジ周辺で折り畳みでき、現行仕様は両方のタイプに適用されます。また、シームレス・シームありの両方とも、モバイルやタブレットからラップトップサイズまで様々な寸法があります。さらに、デバイスによってデフォルトの向き(縦向き・横向き)が異なり、折り畳みも縦方向・横方向のいずれかの場合があります。

さまざまな折り畳みデバイスの図

ウェブサイトの使い勝手を折り目部分を避けて向上させたり、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属性を取得する際、ユーザーエージェントはMUSTthis関連グローバルオブジェクト関連付けられた Document の 内部スロット [[CurrentPosture]] の値を返す必要があります。

4.2 onchange 属性:ポスチャ変化のハンドリング

onchange 属性は イベントハンドラーIDL属性 であり、 onchange イベントハンドラーのためのものです。 その イベントハンドラーイベントタイプ は "change" です。

5. ポスチャタイプ

この仕様では以下のポスチャ値を定義します:

  1. continuous postureの図

    Continuous ポスチャ:Continuousポスチャは 「平らな」状態を指します。これは、異なるポスチャを持たないほとんどのデバイスのデフォルトの状態です。

    折り目やヒンジ、類似の機能を持たないデバイスも含まれます。

    ハードウェア革新の性質上、デュアル・折り畳み・ロール・カーブ画面なども、Documentが平坦なレイアウトで表示される姿勢であれば含まれます。

    例:

    • 折り畳みデバイスが平らに完全展開された姿勢
    • 折り畳みデバイスで、ブラウザがヒンジをまたがないウィンドウ/セクションで動作している
    • 2-in-1デバイスがタブレットモードで片面のみ使用している場合
    • 折り畳めないデバイス

    デバイスによっては、物理的には平らでない姿勢で複数アプリが動作していても、ブラウザが複数画面・セクションにまたがっていなければ、そのポスチャはcontinuousとなります。

  2. folded postureの図 Folded ポスチャ:Foldedポスチャは物理的に折り畳み可能なデバイスを指します。これらのデバイスは柔軟な1枚画面または2枚隣接画面を持つことができます。この姿勢ではディスプレイ/セクション間に「平ら」状態を超えない角度が形成されます。

    例:

    • 折り畳みデバイスが垂直ヒンジで内部画面を「本」姿勢で使用し、内容が両セクションにまたがり、約30°〜170°の角度を形成する場合
    • 折り畳みデバイスが水平ヒンジで「ラップトップ」姿勢で使用されている場合

    折り畳みデバイスが半分折りたたまれた状態(本のような状態)で使われる場合、実装者はテキスト方向や書字モードがレイアウトや表示に与える影響を考慮する必要があります。

    例えば、右から左へ書く言語(アラビア語、ヘブライ語、シリア語など)や、多くの縦書きモード(東アジア言語など)では、英語の本とは逆の順序でページが進み、ページ番号の小さい方が右側になります。

    詳細は 中国語 日本語韓国語 の書字モードの違いを参照してください。

API上、ポスチャ値は DevicePostureType 列挙値で表されます。

6. デバイスポスチャメディアクエリ

6.1 device-posture メディア機能

device-posture メディア機能は、CSSメディアクエリ [MEDIAQ] を通じてデバイスの ポスチャ を表します。すべての navigable は、その ポスチャ最上位 traversable のものとして反映します。

値:
continuous | folded
適用対象:
ビジュアルメディアタイプ
min/maxプレフィックスの受け入れ:
いいえ

ユーザーエージェントはMUST、Webアプリケーションで適用された ポスチャ をCSSメディアクエリ [MEDIAQ] を通じて反映しなければなりません。

7. ポスチャの取得

すべての Document インスタンスは内部スロット [[CurrentPosture]] を持ち、これは Document の作成時に初期化されるべきですが、そうでない場合は初めてアクセスされた時点、値が読み取られる前にMUST初期化される必要があります。ユーザーエージェントMUSTデバイスポスチャ変更手順を、documentをその Document に設定し、disallowRecursion を true にして初期化する必要があります。

指定の Document において、現在のポスチャは現在のヒンジ角度と 画面の向き、その他実装依存のシグナルから導出されます。

以下の表は規範的ではありません。

7.1 ポスチャ値の表

値は近似であり、デバイスごとに異なる場合があります。例えば、平らに置いたときに必ずしも180°にはならず、175°〜185°の値になることもあります。デバイスメーカーはSHOULD、物理的なデバイスポスチャが本仕様で定義されたポスチャに正しくマッピングされるようにしてください。また、ヒンジ角度以外にも複数のセンサーでポスチャを判断することが許されています。例として、画面下部にキーボードがドッキングされているかどうか、キックスタンドが展開されているかどうかなども検出できます。

デバイスの物理的な制約や設計によっては、1つ以上のポスチャが存在しないこともあります。その場合、デバイスはSHOULD、あらゆる角度やデバイスの向き([SCREEN-ORIENTATION]やホストOSでロック可能)、およびデバイス固有のシグナルが定義されたいずれかのポスチャにマッピングされるようにしてください。

7.1.1 折り畳みデバイス

折り畳みデバイスのポスチャ値
ポスチャ 角度値
continuous < ~180°
folded ~180°

8. アルゴリズム

8.1 デバイスポスチャ情報の算出

デバイスポスチャ情報を算出するための Document document の手順は以下の通りです:

  1. topLevelTraversabledocument関連グローバルオブジェクトnavigabletop-level traversable とする。
  2. topLevelTraversable. [[PostureOverride]] が null でなければ、それを返す。
  3. 現在のヒンジ角度値・現在の 画面の向き・実装依存のシグナルに基づき、 ポスチャ値の表に従い DevicePostureType の値を実装定義で決定して返す。

8.2 デバイスポスチャの変化

ユーザーエージェントが画面の折り畳み角度・向き・デバイス固有シグナルのいずれかが top-level traversable で変化したことを検出した場合、MUSTデバイスポスチャ変更手順top-level traversableactive document に対して実行する。

デバイスポスチャ変更手順Document document と オプションの boolean disallowRecursion(デフォルトfalse)に対して以下の通りです:

  1. documentvisibility state が "hidden" の場合、これらの手順を中止する。
  2. postureデバイスポスチャ情報を算出するdocument に対して実行した結果とする。
  3. posturedocument.[[CurrentPosture]] と等しい場合、これらの手順を中止する。
  4. グローバルタスクをキューし、ユーザー操作タスクソース に対して、document関連グローバルオブジェクト で次の手順を実行する:
    1. document.[[CurrentPosture]]posture に設定する。
    2. イベント "change" を DevicePosture オブジェクトに対して、document関連グローバルオブジェクト の関連付けられた Navigator に発火する。
  5. disallowRecursion が true の場合、これらの手順を中止する。
  6. descendantNavigable について、 documentdescendant navigables のそれぞれに対して:
    1. デバイスポスチャ変更手順を、 documentdescendantNavigableactive document にし、disallowRecursion を true にして実行する。

この仕様は ページ可視性変更手順visibility statedocument に対して以下のように定義します:

  1. デバイスポスチャ変更手順document に対して disallowRecursion を false にして初期化のために実行する。
Issue 103: ページ可視性変更手順のフック利用を避ける

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

仕様書の著者は、ページ可視性変更手順フックを使う代わりに、ここから自分の仕様に直接コールを追加するプルリクエストを送るほうが好ましいです。これにより仕様間の呼び出し順が明確になります。執筆時点で ページ可視性変更手順 を持つ仕様は未定義順で実行されます:Device Posture API と Web NFC。[DEVICEPOSTURE] [WEBNFC]

9. セキュリティに関する考慮事項

本仕様に関して新たなセキュリティ考慮事項は報告されていません。ただし、文書内で示されている 10. プライバシーに関する考慮事項 を確認することが推奨されます。

10. プライバシーに関する考慮事項

10.1 プライバシー脅威の種類

このセクションは非規範的です。

10.1.1 複数コンテキストでのユーザー識別

このAPIが同じデバイス上の異なる閲覧コンテキストで同時に使用される場合、ユーザーをそれら二つのコンテキスト間で相関させ、予期しないトラッキング手法が生まれる可能性があります。しかし、ポスチャ値は通常長時間安定しているため、二つのユーザーが同一人物でないことの確認には利用できますが、折り畳みデバイスにも様々な種類やモデルがあるため、特定ユーザーの識別には役立ちません。

追加されるエントロピーは、ユーザーの主要入力がタッチかどうかを判別する pointer 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" がデフォルトとなります。 つまり、指紋情報への追加は最大1ビット分です。 この1ビットの公開には、ユーザーが物理的にデバイスのポスチャを変更するという明確な行動が必要となります。

実装は最適な高レベルポスチャを判断するために様々な低レベル情報を利用できますが、それら低レベル情報はAPIを通じて公開されません。さらに、どの詳細なセンサー値も高レベルポスチャ状態と一対一で対応しません。ヒンジ角度センサーや他のセンサー、キーボードがドッキングされているか、キックスタンドが展開されているかなどの情報や、それらの組み合わせを使って最適なポスチャを判断できます。この抽象化により、意図された機能実装に必要最小限の情報のみ公開され、データ最小化原則に従います。

10.2.2 ユーザーの注意喚起

ポスチャ値変更イベントは、active documentvisibility state が "visible" の場合のみに デバイスポスチャ変更手順の通り発火されます。 "visible"でない間に値を取得しても、値は更新されず古い値が返されます。値は "visible" になった時点でのみ更新されます。

10.2.3 ユーザー操作によるアクション

デバイスポスチャの変更には、ユーザーによる明確かつ物理的な操作が必要です。「明確」とは、ポスチャ値の表にある実装定義の閾値を超える操作であり、「物理的」とは、OSがポスチャ変更に応じてユーザーの期待通りに動作することを意味します。

11. アクセシビリティに関する考慮事項

Device Posture APIの主な目的はユーザー体験の向上です。APIを活用したアプリケーションがアクセシビリティに良い影響を与える方法は主に3つあります。
  1. 折り目・ヒンジ部分にコンテンツ(特にボタン)を配置しないよう設計・実装すること。この部分は曲面のため指での操作が困難または不可能な場合があります。
  2. 折り畳み時に、動画や画像など大きな連続コンテンツを折り目・ヒンジ部分にまたがって配置しないよう設計・実装すること。この部分はコンテンツや色が少し歪みます。
  3. 画面スペースをより有効活用するため、分割UI(画面セグメントごとにコンテンツを分割表示するUI)を採用し、より強力で差別化されたインターフェースを提供すること。
このAPIを使う際は、上記のアクセシビリティの機会を考慮してください。具体例は以下の通りです:

12. オートメーション

Device Posture APIは、インターフェースの完全な検証に物理的なハードウェアデバイスが必要となるため、テスト著者にとって課題となります。この課題への対応として、本書では [WEBDRIVER2] の 拡張コマンド を定義し、ユーザーが報告されるデバイスポスチャを制御し、実際のデバイスをシミュレートできるようにしています。

以下の 拡張コマンド8. アルゴリズム との統合をサポートするため、top-level traversable は以下の内部スロットを持つ必要があります:

内部スロット 説明
[[PostureOverride]] ハードウェアが提供する 現在のポスチャ を上書きします。 許可される値:
  • "continuous"
  • "folded"
  • null:上書きしない。ハードウェアが提供する値が使用されます。
これらの値はスクリプトから直接取得できません。

12.1 拡張コマンド

12.1.1 デバイスポスチャの設定

HTTPメソッド URIテンプレート
POST /session/{session id}/deviceposture

この 拡張コマンド はデバイスポスチャを指定の DevicePostureType に変更します。

このアルゴリズムで使用されるparameters引数のプロパティ
パラメータ名 値の型 必須
posture String yes

リモートエンド手順は以下の通りです:

  1. postureget a property "posture" で parameters から取得する。
  2. posturestring でなければ、errorWebDriver error code invalid argument で返す。
  3. posture が "continuous" でも "folded" でもない場合、errorWebDriver error code invalid argument で返す。
  4. topLevelTraversablecurrent browsing contexttop-level traversable とする。
  5. topLevelTraversable. [[PostureOverride]]posture を設定する。
  6. documenttopLevelTraversableactive document とする。
  7. デバイスポスチャ変更手順document に対して実行する。
  8. success を data null で返す。

12.1.2 デバイスポスチャのクリア

HTTPメソッド URIテンプレート
DELETE /session/{session id}/deviceposture

この 拡張コマンド はデバイスポスチャの上書きを解除し、ハードウェアに制御を戻します。

リモートエンド手順は以下の通りです:

  1. topLevelTraversablecurrent browsing contexttop-level traversable とする。
  2. topLevelTraversable. [[PostureOverride]]null の場合、success を data null で返す。
  3. topLevelTraversable. [[PostureOverride]]null を設定する。
  4. documenttopLevelTraversableactive document とする。
  5. デバイスポスチャ変更手順document に対して実行する。
  6. success を data null で返す。

13.

このセクションは非規範的です。

13.1 例1: ポスチャデータ

ポスチャをコンソールに出力するシンプルなユースケースです。

1: ポスチャ変化への反応
navigator.devicePosture.addEventListener("change", () => {
  console.log(`The current posture is: ${navigator.devicePosture.type}!`);
})

13.2 例2: device-posture

デバイスがビデオ通話Webサービスに使われています。ラップトップポスチャに折り畳むことで、机上でハンズフリー体験が可能になります。UAがポスチャを検知し、UIが強化されます。どのポスチャにも適応するコンテンツ例を作成できます。他のユースケースは explainer を参照してください。

device-postureメディア機能とviewport segmentメディア機能を使ったビデオ通話Webサービスの図
2: ポスチャに合わせたUIの適応
@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値が必ず1つtrueになるため、以下のコードでユーザーエージェントがこのメディア機能をサポートするかどうか検出できます:

3: device-posture機能の検出
@media (device-posture) {
  /*The browser supports device-posture feature*/
}
メディア機能のbooleanコンテキストに関する詳細は Evaluating Media Features in a Boolean Context を参照してください。

14. 適合性

非規範的と記載されたセクションのほか、著者ガイドライン・図・例・注記はすべて非規範的です。それ以外は規範的です。

この文書の MUST および SHOULD のキーワードは、 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]
Media Queries Level 4 Florian Rivoal; Tab Atkins Jr.. W3C. 2021年12月25日. W3C 勧告候補. URL: https://www.w3.org/TR/mediaqueries-4/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels S. Bradner. IETF. 1997年3月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words B. Leiba. IETF. 2017年5月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[SCREEN-ORIENTATION]
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]
Requirements for Chinese Text Layout - 中文排版需求 Fuqiao Xue; Richard Ishida. W3C. 2024年7月1日. W3C ワーキンググループノート. URL: https://www.w3.org/TR/clreq/
[jlreq]
Requirements for Japanese Text Layout 日本語組版処理の要件(日本語版) Hiroyuki Chiba; Junzaburo Edamoto; Richard Ishida; Seiichi Kato; Tatsuo KOBAYASHI; Toshi Kobayashi; Nathaniel McCully; Felix Sasaki; Atsushi Shimono; Hajime Shiozawa; Fuqiao Xue et al. W3C. 2020年8月11日. W3C ワーキンググループノート. URL: https://www.w3.org/TR/jlreq/
[klreq]
Requirements for Hangul Text Layout and Typography : 韓国語テキストレイアウト及びタイポグラフィ要件 Richard Ishida. W3C. 2020年5月27日. W3C ワーキンググループノート. URL: https://www.w3.org/TR/klreq/