Copyright © 2024 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この文書は、ウェブアプリケーションがデバイスのポスチャ(姿勢)をリクエストし、その変化通知を受け取ることができる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プロセス文書に準拠しています。
デバイスポスチャとは、デバイスが保持する物理的な姿勢であり、角度に加えてセンサーなどから得られる情報に基づく場合もあります。近年、ポスチャを変化できる機能を持つ新しいタイプのモバイルデバイスが登場しています。最も一般的なのは、画面自体や画面周囲を折り畳めるデバイスであり、物理的な形状を変更できます。デバイスのポスチャを知る主な目的は、レスポンシブデザインによる新しいユーザー体験を可能にすることです。
「折り畳み」デバイスには主に2つの物理的なフォームファクターがあります。1つは1枚の柔軟な画面(シームレス)を持つもの、もう1つは2枚の画面(シームあり)を持つものです。どちらもヒンジ周辺で折り畳みでき、現行仕様は両方のタイプに適用されます。また、シームレス・シームありの両方とも、モバイルやタブレットからラップトップサイズまで様々な寸法があります。さらに、デバイスによってデフォルトの向き(縦向き・横向き)が異なり、折り畳みも縦方向・横方向のいずれかの場合があります。
ウェブサイトの使い勝手を折り目部分を避けて向上させたり、Webで新しいユースケースを実現したりするために、デバイスポスチャを知ることで開発者は各種デバイスに合わせたコンテンツを調整できます。
デバイスが完全に平らでない状態でも、コンテンツは利用・閲覧できます。この場合、開発者はデバイスポスチャの状態に応じて異なるレイアウトを提供したいと考えるかもしれません。
以下の内部スロットが Document
インターフェースに追加されます。
内部スロット | 説明 |
---|---|
[[CurrentPosture]] | デバイスの 現在のポスチャ。 |
WebIDL[SecureContext, Exposed=(Window)]
interface DevicePosture
: EventTarget {
readonly attribute DevicePostureType
type
;
attribute EventHandler onchange
;
};
enum DevicePostureType
{
"continuous
",
"folded
"
};
type属性を取得する際、ユーザーエージェントはMUST、this の 関連グローバルオブジェクト
の 関連付けられた
Document の
内部スロット [[CurrentPosture]]
の値を返す必要があります。
onchange
属性は イベントハンドラーIDL属性
であり、
onchange
イベントハンドラーのためのものです。
その イベントハンドラーイベントタイプ
は "change" です。
この仕様では以下のポスチャ値を定義します:
Continuous ポスチャ:Continuousポスチャは 「平らな」状態を指します。これは、異なるポスチャを持たないほとんどのデバイスのデフォルトの状態です。
折り目やヒンジ、類似の機能を持たないデバイスも含まれます。
ハードウェア革新の性質上、デュアル・折り畳み・ロール・カーブ画面なども、Document
が平坦なレイアウトで表示される姿勢であれば含まれます。
例:
デバイスによっては、物理的には平らでない姿勢で複数アプリが動作していても、ブラウザが複数画面・セクションにまたがっていなければ、そのポスチャはcontinuousとなります。
例:
API上、ポスチャ値は
DevicePostureType
列挙値で表されます。
メディア機能は、CSSメディアクエリ [MEDIAQ] を通じてデバイスの ポスチャ を表します。すべての
navigable
は、その ポスチャ
を
最上位 traversable
のものとして反映します。
device-posture
continuous
| folded
ユーザーエージェントはMUST、Webアプリケーションで適用された ポスチャ をCSSメディアクエリ [MEDIAQ] を通じて反映しなければなりません。
すべての Document
インスタンスは内部スロット
[[CurrentPosture]]
を持ち、これは
Document
の作成時に初期化されるべきですが、そうでない場合は初めてアクセスされた時点、値が読み取られる前にMUST初期化される必要があります。ユーザーエージェントはMUST、デバイスポスチャ変更手順を、documentをその Document
に設定し、disallowRecursion を true にして初期化する必要があります。
指定の Document
において、現在のポスチャは現在のヒンジ角度と 画面の向き、その他実装依存のシグナルから導出されます。
以下の表は規範的ではありません。
値は近似であり、デバイスごとに異なる場合があります。例えば、平らに置いたときに必ずしも180°にはならず、175°〜185°の値になることもあります。デバイスメーカーはSHOULD、物理的なデバイスポスチャが本仕様で定義されたポスチャに正しくマッピングされるようにしてください。また、ヒンジ角度以外にも複数のセンサーでポスチャを判断することが許されています。例として、画面下部にキーボードがドッキングされているかどうか、キックスタンドが展開されているかどうかなども検出できます。
デバイスの物理的な制約や設計によっては、1つ以上のポスチャが存在しないこともあります。その場合、デバイスはSHOULD、あらゆる角度やデバイスの向き([SCREEN-ORIENTATION]やホストOSでロック可能)、およびデバイス固有のシグナルが定義されたいずれかのポスチャにマッピングされるようにしてください。
ポスチャ | 角度値 |
---|---|
continuous | < ~180° |
folded | ~180° |
デバイスポスチャ情報を算出するための
Document
document の手順は以下の通りです:
DevicePostureType
の値を実装定義で決定して返す。
ユーザーエージェントが画面の折り畳み角度・向き・デバイス固有シグナルのいずれかが top-level traversable で変化したことを検出した場合、MUST、デバイスポスチャ変更手順を top-level traversable の active document に対して実行する。
デバイスポスチャ変更手順は Document
document と
オプションの boolean disallowRecursion(デフォルトfalse)に対して以下の通りです:
[[CurrentPosture]]
と等しい場合、これらの手順を中止する。
[[CurrentPosture]]
を
posture に設定する。
change
" を
DevicePosture
オブジェクトに対して、document の 関連グローバルオブジェクト
の関連付けられた Navigator
に発火する。
この仕様は ページ可視性変更手順 を visibility state と document に対して以下のように定義します:
From https://html.spec.whatwg.org/#update-the-visibility-state
仕様書の著者は、ページ可視性変更手順フックを使う代わりに、ここから自分の仕様に直接コールを追加するプルリクエストを送るほうが好ましいです。これにより仕様間の呼び出し順が明確になります。執筆時点で ページ可視性変更手順 を持つ仕様は未定義順で実行されます:Device Posture API と Web NFC。[DEVICEPOSTURE] [WEBNFC]
本仕様に関して新たなセキュリティ考慮事項は報告されていません。ただし、文書内で示されている 10. プライバシーに関する考慮事項 を確認することが推奨されます。
このセクションは非規範的です。
このAPIが同じデバイス上の異なる閲覧コンテキストで同時に使用される場合、ユーザーをそれら二つのコンテキスト間で相関させ、予期しないトラッキング手法が生まれる可能性があります。しかし、ポスチャ値は通常長時間安定しているため、二つのユーザーが同一人物でないことの確認には利用できますが、折り畳みデバイスにも様々な種類やモデルがあるため、特定ユーザーの識別には役立ちません。
追加されるエントロピーは、ユーザーの主要入力がタッチかどうかを判別する pointer API と同程度です。主要入力は、キーボードの着脱やタブレットモードの切り替えによって変化することがあります。
この理論的な攻撃は、10.2.1 データ最小化、 10.2.2 ユーザーの注意喚起、10.2.3 ユーザー操作によるアクションによって軽減されます。
クロスオリジンiframeはこのAPIを通じてポスチャ情報にアクセスできるため、10.1.1 複数コンテキストでのユーザー識別に記載の通り、ユーザー識別に利用される可能性があります。同様の緩和策が適用されます。
iframe経由で、悪意のあるアクターが自身のコードを注入し、ポスチャ情報へアクセスしてユーザーを追跡する用途に利用される可能性があります。
この理論的な攻撃は、10.2.1 データ最小化や、ポスチャ値自体が有用な情報をほとんどもたず長期間安定するという事実によって軽減されます。
このAPIは、高レベルの抽象化として ポスチャ を公開します。値は
"continuous
" または
"folded
"
のいずれかです。異なるポスチャをサポートしないデバイスは
"continuous
" がデフォルトとなります。
つまり、指紋情報への追加は最大1ビット分です。
この1ビットの公開には、ユーザーが物理的にデバイスのポスチャを変更するという明確な行動が必要となります。
実装は最適な高レベルポスチャを判断するために様々な低レベル情報を利用できますが、それら低レベル情報はAPIを通じて公開されません。さらに、どの詳細なセンサー値も高レベルポスチャ状態と一対一で対応しません。ヒンジ角度センサーや他のセンサー、キーボードがドッキングされているか、キックスタンドが展開されているかなどの情報や、それらの組み合わせを使って最適なポスチャを判断できます。この抽象化により、意図された機能実装に必要最小限の情報のみ公開され、データ最小化原則に従います。
ポスチャ値変更イベントは、active document の visibility state が "visible" の場合のみに デバイスポスチャ変更手順の通り発火されます。 "visible"でない間に値を取得しても、値は更新されず古い値が返されます。値は "visible" になった時点でのみ更新されます。
デバイスポスチャの変更には、ユーザーによる明確かつ物理的な操作が必要です。「明確」とは、ポスチャ値の表にある実装定義の閾値を超える操作であり、「物理的」とは、OSがポスチャ変更に応じてユーザーの期待通りに動作することを意味します。
Window
の幅・高さへ拡大しますが、
折り畳み時は要素が折り目をまたいで配置され、ユーザー体験が損なわれます。代わりに、折り目の上または下に要素を表示する方法が考えられます。
ポスチャ
のみを想定したコンテンツ設計は避ける:
折り畳みデバイスの特徴は柔軟性・可変性です。orientationと同様、常にユーザーの選択を優先すべきで、UIを選べるようにするのが理想です。
Device Posture APIは、インターフェースの完全な検証に物理的なハードウェアデバイスが必要となるため、テスト著者にとって課題となります。この課題への対応として、本書では [WEBDRIVER2] の 拡張コマンド を定義し、ユーザーが報告されるデバイスポスチャを制御し、実際のデバイスをシミュレートできるようにしています。
以下の 拡張コマンドと 8. アルゴリズム との統合をサポートするため、top-level traversable は以下の内部スロットを持つ必要があります:
内部スロット | 説明 |
---|---|
[[PostureOverride]] |
ハードウェアが提供する 現在のポスチャ を上書きします。
許可される値:
|
HTTPメソッド | URIテンプレート |
---|---|
POST | /session/{session id}/deviceposture |
この 拡張コマンド はデバイスポスチャを指定の
DevicePostureType
に変更します。
パラメータ名 | 値の型 | 必須 |
---|---|---|
posture | String | yes |
リモートエンド手順は以下の通りです:
continuous
" でも
"folded
" でもない場合、error を WebDriver error code invalid argument で返す。
null
で返す。
HTTPメソッド | URIテンプレート |
---|---|
DELETE | /session/{session id}/deviceposture |
この 拡張コマンド はデバイスポスチャの上書きを解除し、ハードウェアに制御を戻します。
リモートエンド手順は以下の通りです:
null
の場合、success
を data null
で返す。
null
を設定する。
null
で返す。
このセクションは非規範的です。
ポスチャをコンソールに出力するシンプルなユースケースです。
navigator.devicePosture.addEventListener("change", () => {
console.log(`The current posture is: ${navigator.devicePosture.type}!`);
})
デバイスがビデオ通話Webサービスに使われています。ラップトップポスチャに折り畳むことで、机上でハンズフリー体験が可能になります。UAがポスチャを検知し、UIが強化されます。どのポスチャにも適応するコンテンツ例を作成できます。他のユースケースは explainer を参照してください。
@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);
}
}
有効なdevice-posture値が必ず1つtrueになるため、以下のコードでユーザーエージェントがこのメディア機能をサポートするかどうか検出できます:
@media (device-posture) {
/*The browser supports device-posture feature*/
}
非規範的と記載されたセクションのほか、著者ガイドライン・図・例・注記はすべて非規範的です。それ以外は規範的です。
この文書の MUST および SHOULD のキーワードは、 BCP 14 [RFC2119] [RFC8174] に記載されている通り、ここで示したように全て大文字で現れる場合のみ解釈されます。
本仕様は、含まれているインターフェースを実装する ユーザーエージェントという単一の製品に対する適合基準を定義します。
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
"
};
このセクションは非規範的です。
Daniel Appelquist、Jo Balletti、Michael Blix、Paul Grenier、Laura Morinigo の皆様に本作業へのご貢献に心より感謝申し上げます。
このセクションは非規範的です。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: