この文書は、Web開発者がデスクトップ環境で実行されているインストール済みWebアプリケーションのタイトルバー領域を制御できる一連の技術を規定しています。これらの技術は (WCO) として知られています。
本ドラフトは、WCOおよびそれで説明されている技術の標準化プロセスの出発点として意図されたものです。記載されている技術は、他のワーキンググループの別仕様に移動される可能性があります。
モバイル以外のデバイスを対象としたアプリケーションは、一般的にタイトルバーを持つフレーム内でホストされます。タイトルバーは通常、ウィンドウの最上部に横長に表示され、アクティブなプログラムやドキュメント名、[=window controls=] を示す UI 要素です。現代のアプリケーションは、タイトルバー領域を利用して UI コンテンツを表示し、より良いUXを創出できます。
ユーザーエージェント(UA)のフレーム内にホストされたインストール済みWebアプリでは、希望する表示モードを指定することでフレームをある程度カスタマイズできます。開発者は [=manifest=] ファイルの `display` メンバーを用いてアプリケーションの要件に最も適したモードを選択できます。しかし、これらのモードは制限があり、タイトルバーの完全な制御はできません。そのため、インストール済みアプリに没入型でネイティブのようなタイトルバーを作成したい開発者はこのメンバーだけでは実現できません。代わりに、クライアント領域は予約済みのタイトルバー領域の直下から始まり、特に画面サイズの小さい携帯端末ではアプリ領域が狭くなってしまいます。
WCO により、[=window controls=] を [=overlaid=] でフレーム上に残しつつ、Webコンテンツが従来タイトルバー領域だった箇所にも描画できるようになり、カスタムタイトルバーUIが作成できるようになります。
[[HTML]] 仕様は Navigator インターフェースを定義しており、本仕様ではこれを拡張します:
[SecureContext, Exposed=(Window)]
partial interface Navigator {
[SameObject] readonly attribute WindowControlsOverlay windowControlsOverlay;
};
| 内部スロット | 初期値 | 説明 |
|---|---|---|
| [[\TitleBarArea]] | タイトルバー領域用の空の[=struct=]。 | タイトルバー領域を定義する値(`x`, `y`, `width`, `height`)を格納する[=struct=]。 |
[Exposed=Window]
interface WindowControlsOverlay : EventTarget {
readonly attribute boolean visible;
DOMRect getTitlebarAreaRect();
attribute EventHandler ongeometrychange;
};
[Exposed=Window]
interface WindowControlsOverlayGeometryChangeEvent : Event {
constructor(DOMString type, WindowControlsOverlayGeometryChangeEventInit eventInitDict);
[SameObject] readonly attribute DOMRect titlebarAreaRect;
readonly attribute boolean visible;
};
dictionary WindowControlsOverlayGeometryChangeEventInit : EventInit {
required DOMRect titlebarAreaRect;
boolean visible = false;
};
`visible` 属性は [=boolean=] で、{{Window/window}}.[[\TitleBarArea]] の値が0でない場合に `true` を返します。
`getTitlebarAreaRect()` メソッドは、Webコンテンツが表示可能な利用可能領域を表すDOMRectを返します。このタイトルバー領域は[=window controls=] [=overlay=]の下部領域は含みません。
`ongeometrychange` 属性は"change"型イベントに対応したイベントハンドラーです。
本仕様は次の[=display mode=]を定義します:
[=display mode/window-controls-overlay=]
[=display mode=] はmanifestの [=manifest/display_override=] メンバーで指定できます。
| 名前 | 値 |
|---|---|
| `titlebar-area-x` | length |
| `titlebar-area-y` | length |
| `titlebar-area-width` | length |
| `titlebar-area-height` | length |
[=タイトルバー領域用環境変数=] は4つのenv変数で、ビューポート内の始点と幅・高さによって長方形領域を定義します。この領域はタイトルバーの利用可能な領域であり、その範囲内に動的なWebコンテンツを配置できます。
本仕様は [[cssom-view]] 仕様と連携し、以下のアルゴリズム を修正します:
ビューポートで[=Window/resize=] アルゴリズムを実行する際、ステップ1の後に [=resize the title bar area=] を実行します。
ウィンドウ |win| の タイトルバー領域をリサイズするには、次の手順を実行します:
overlay area informationを更新するには、次の手順を実行します:
インストール済みWebアプリをフレーム無しで表示することで、それまでユーザーエージェントが管理していた信頼領域でのコンテンツなりすましのリスクが生じます。
現在のChromium系ブラウザでは、`standalone` モード時、初回起動時はWebページタイトルが左に、ページのオリジンが右(その後に「設定など」ボタンとウィンドウコントロール)にタイトルバー内で表示されます。数秒後、オリジンのテキストは消えます。
RTL構成のブラウザでは、このレイアウトが反転し、オリジンが左にきます。オーバーレイの右端との間に十分なパディングがないと、攻撃者が例えば "evil.ltd" のオリジンに信頼される "google.com" を付加した文字列を配置でき、ユーザーに信頼できるサイトだと錯覚させる恐れがあります。
インストール済みWebアプリには、ユーザーがアプリ定義スコープから外れたことを示すセキュリティ指標も存在します。範囲外に移動した際は、タイトルバーとWebコンテンツの間に黒いバーが表示され、以下の情報が含まれます:
ウィンドウコントロールオーバーレイが有効な場合、ユーザーが範囲外に移動すると、オーバーレイは一時的に通常のタイトルバーに置き換えられます。スコープ内に戻ると、タイトルバーは非表示になり、再びオーバーレイが表示されます。
ウィンドウコントロールオーバーレイを有効にすると、オーバーレイのサイズがOSやテキスト倍率、OSフォントサイズ、OSズーム倍率、Webコンテンツのズーム倍率などに依存するため、フィンガープリントの表面積が増します。
ただし、これはインストール済みのデスクトップWebアプリでwindow controls overlay機能を利用する場合に限ります。一般的なブラウザ利用には該当しません。さらに、windowControlsOverlay APIはインストール済みWebアプリ内に埋め込まれたiframeには提供されません。
Amanda Baker氏、Joshua Bell氏、Yoav Weiss氏に多大なる貢献を感謝いたします。