1. 用語
この仕様は Infra Standard に依存します。[INFRA]
この仕様で使用されるほとんどの用語は、CSS、DOM、HTML、Web IDL からのものです。[CSS] [DOM] [HTML] [WEBIDL]
2. モデル
すべての 要素には、fullscreen flag が関連付けられています。特に指定がない限り、これは未設定です。
すべての
iframe
要素には、iframe fullscreen flag が関連付けられています。特に指定がない限り、これは未設定です。
すべての 文書には、fullscreen element が関連付けられています。 fullscreen element は、 文書 の top layer において fullscreen flag が設定されている最上位の 要素 です。該当しない場合は null です。
すべての 文書には、list of pending fullscreen events が関連付けられています。 これは (string, 要素) からなる タプル の 順序付き集合 です。初期状態は空です。
element を fullscreen にする手順:
-
hideUntil に、topmost popover ancestor に element, null, false を渡して実行した結果を設定する。
-
hideUntil が null の場合、element の node document を hideUntil に設定する。
-
hide all popovers until に hideUntil, false, true を渡して実行する。
-
element の fullscreen flag を設定する。
-
Remove from the top layer immediately に element を渡して実行する。
- Add to the top layer に element を渡して実行する。
element の fullscreen を解除するには、element の fullscreen フラグ、iframe fullscreen フラグ(もしあれば)、および キーボードロックフラグを解除し、与えられた element をtop layer から 直ちに削除します。
document の fullscreen を解除するには、 document の top layer 内で fullscreen flag が設定されているすべての 要素 に対して unfullscreen を実行する。
fully exit fullscreen を document document に対して実行するには、次の手順を実行する:
-
document の fullscreen element が null なら、これ以降の手順を終了する。
-
document の top layer 内で、fullscreen flag が設定されている fullscreen element 以外の要素について Unfullscreen elements を実行する。
-
Exit fullscreen document.
removing steps が removedNode で実行されるときは、次の手順を実行する:
-
document に removedNode の node document を設定する。
-
nodes に removedNode の shadow-including inclusive descendants のうち fullscreen flag が設定されているものを shadow-including tree order で取得する。
-
各 node について、次のとおり:
-
node が document の fullscreen element なら、 exit fullscreen document を実行する。
-
それ以外の場合は、node の fullscreen を解除する。
-
document の top layer が node を 含む場合、 remove from the top layer immediately に node を渡して実行する。
他の仕様でも top layer に要素を追加・削除できるため、 node が document の fullscreen element でない場合もあります。 例えば node が開いている
dialog要素である場合などです。
-
unloading document cleanup steps が document で実行されるとき、 fully exit fullscreen を document に実行する。
Fullscreen がサポートされるのは、 事前に設定されたユーザーの好み、安全上のリスク、またはプラットフォームの制限がない場合です。
run the fullscreen steps を document document に対して実行するには、次の手順を実行する:
-
pendingEvents に document の list of pending fullscreen events を設定する。
-
各 (type, element) について、pendingEvents の中で:
-
element が connected かつ、 その node document が document なら target に element を設定し、そうでなければ target に document を設定する。
-
Fire an event という名前で type、
bubblesとcomposed属性を true にして target でイベントを発火する。
-
これらの手順は HTML で定義されている event loop と統合されています。[HTML]
모든 요소에는 연관된 keyboard lock flag가 있다. 달리 명시되지 않는 한 이는 unset 상태이다.
문서는 자신의 fullscreen element가 null이 아니고, 그 fullscreen element의 keyboard lock flag가 set되어 있을 때 keyboard lock가 활성 상태이며, 그렇지 않으면 비활성 상태이다.
3. API
enum {FullscreenNavigationUI "auto" ,"show" ,"hide" };enum {FullscreenKeyboardLock ,"browser" };"none" dictionary {FullscreenOptions FullscreenKeyboardLock = "none";keyboardLock FullscreenNavigationUI = "auto"; };navigationUI partial interface Element {Promise <undefined >requestFullscreen (optional FullscreenOptions = {});options attribute EventHandler onfullscreenchange ;attribute EventHandler onfullscreenerror ; };partial interface Document { [LegacyLenientSetter ]readonly attribute boolean fullscreenEnabled ; [LegacyLenientSetter ,Unscopable ]readonly attribute boolean fullscreen ; // historicalPromise <undefined >exitFullscreen ();attribute EventHandler onfullscreenchange ;attribute EventHandler onfullscreenerror ; };partial interface mixin DocumentOrShadowRoot { [LegacyLenientSetter ]readonly attribute Element ?fullscreenElement ; };
promise = element . requestFullscreen([options])-
element を fullscreen で表示し、完了したら promise を解決します。
指定された場合、options の
navigationUIメンバーは、fullscreen 中にナビゲーション UI を表示することが望ましいかどうかを示します。 "show" に設定された場合、画面領域よりもナビゲーションの簡潔さが優先され、 "hide" に設定された場合、より多くの画面領域が優先されます。ユーザーエージェントは常に、 アプリケーションの設定よりもユーザー設定を尊重してかまいません。既定値 "auto" は、アプリケーションの設定がないことを示します。指定された場合、options の
keyboardLockメンバーは、指定されたキーボードロックモードが適用されるかどうかを示します。"
browser" に設定された場合、キーボードロックを 適用できます。ユーザーエージェントは常に、アプリケーションの設定よりもユーザー設定を尊重してかまいません。既定値 "
none" は、キーボードロックが適用されないことを示します。 document .fullscreenEnabled-
document が要素を fullscreen で表示する能力を持ち、かつfullscreen がサポートされている場合は true を返し、 そうでない場合は false を返します。
promise = document .exitFullscreen()-
document のfullscreen 要素の fullscreen 表示を停止し、 完了したら promise を解決します。
document .fullscreenElement-
document のfullscreen 要素を返します。
shadowroot .fullscreenElement-
shadowroot のfullscreen 要素を返します。
要素 element に対する fullscreen 要素準備確認は、以下のすべてが true の場合に true を返し、そうでない場合は false を返します:
-
element が connected である。
-
element の node document が "
fullscreen" 機能の allowed to use である。 -
element の namespace が HTML namespace でないか、 element の popover visibility state が である。
requestFullscreen(options) メソッドの
手順は以下の通りです:
-
pendingDoc に this の node document を設定する。
-
promise に新しい promise を作成する。
-
pendingDoc が fully active でない場合、promise を
TypeError例外で reject し、promise を返す。 -
error に false を設定する。
-
次のいずれかの条件が false の場合、error を true にする:
-
this の namespace が HTML namespace であるか、 this が SVG
svgまたは MathMLmath要素である。[SVG] [MATHML] -
fullscreen element ready check が this に対して true を返す。
-
this の relevant global object が transient activation を持つか、または アルゴリズムが ユーザー生成の向き変更によって起動された場合。
-
-
error が false の場合、consume user activation を pendingDoc の relevant global object で実行する。
-
promise を返し、残りの手順を 並列で実行する。
-
error が false の場合、pendingDoc の node navigable の top-level traversable の active document のビューポートサイズを options["
navigationUI"] を考慮して変更する(任意):値 ビューポートサイズ " hide"出力デバイス画面の全サイズ " show"ユーザーエージェントがページナビゲーションコントロールを表示できるように制限された出力デバイス画面のサイズ " auto"上記いずれかに一致するユーザーエージェント定義 必要に応じて、ユーザーがこれを元に戻す方法を知らせるメッセージを表示することができます。
-
次のいずれかの条件が false の場合、error を true にする:
-
this の node document が pendingDoc である。
-
fullscreen element ready check が this で true を返す。
-
-
error が true の場合:
-
Append (
fullscreenerror, this) を pendingDoc の list of pending fullscreen events に追加する。 -
promise を
TypeError例外で reject し、これ以降の手順を終了する。
-
-
while true:
-
last に fullscreenElements の最後の 要素 を設定する。
-
container に last の node navigable の container を設定する。
-
container が null なら break する。
-
Append で container を fullscreenElements に追加する。
-
-
fullscreenElements 内の各 element について反復します:
-
doc を element のノード文書とします。
-
element が doc のfullscreen 要素である場合、 continue します。
何も変更されていない場合、オブザーバーに通知する必要はありません。
-
element が this であり、かつ this が
iframe要素である場合、element の iframe fullscreen フラグを設定します。 -
doc 内でelement を fullscreen にします。
-
(
fullscreenchange, element) を doc の保留中の fullscreen イベントのリストに追加します。
要素がfullscreen にされる 順序は観測できません。なぜなら、fullscreen 手順を実行するがツリー順で呼び出されるためです。
-
-
options["
keyboardLock"] の値に応じて:- "
browser" -
this のキーボードロックフラグを設定します。
- "
none" -
this のキーボードロックフラグを解除します。
- "
-
promise を undefined で解決します。
アウトオブプロセスの navigables を持つ実装は読者への課題として残されています。改善案のフィードバック歓迎です。
fullscreenEnabled の getter 手順は、
this が
"fullscreen"
機能の使用を許可されているかつ fullscreen がサポートされている場合は
true を返し、そうでない場合は false を返します。
fullscreen の getter 手順は、
this のfullscreen 要素
が null の場合は false を返し、そうでない場合は true を返します。
代わりに fullscreenElement
属性を使用してください。
fullscreenElement
の getter 手順は次のとおりです:
文書は、そのtop layer内に、fullscreen フラグが設定された要素がちょうど 1 つ存在する場合、 単純 fullscreen 文書であるといいます。
文書は、その
top layer内に 2 つの要素があっても、
単純
fullscreen 文書であることがあります。たとえば、fullscreen 要素に加えて、
open 状態の
dialog
要素が存在することがあります。
doc が与えられたとき、fullscreen を解除する文書を収集するには、 次の手順を実行します:
-
docs を、doc からなる順序付き集合 とします。
-
true の間反復します:
-
lastDoc を docs の最後の文書とします。
-
表明: lastDoc のfullscreen 要素は null ではありません。
-
lastDoc が単純 fullscreen 文書でない場合、break します。
-
container を lastDoc のノード navigable の コンテナとします。
-
container が null の場合、break します。
-
container のiframe fullscreen フラグが設定されている場合、break します。
-
-
docs を返します。
これは、fullscreen 要素が fullscreen 解除される文書の集合ですが、 docs 内の最後の文書は、そのtop layer内に fullscreen フラグが設定された 要素を複数持つ場合があり、 その場合、その文書は fullscreen のままになります。
文書 doc の fullscreen を終了するには、 次の手順を実行します:
-
promise を新しい promise とします。
-
doc が完全にアクティブでない、または doc のfullscreen 要素 が null の場合、promise を
TypeError例外で拒否し、 promise を返します。 -
resize を false とします。
-
docs を、 doc が与えられた fullscreen を解除する文書を収集する 結果とします。
-
topLevelDoc を doc のノード navigable の トップレベル traversable のアクティブ文書とします。
-
topLevelDoc が docs 内にあり、かつそれが 単純 fullscreen 文書である場合、 doc を topLevelDoc に設定し、 resize を true に設定します。
-
doc のfullscreen 要素が接続されていない場合:
-
(
fullscreenchange, doc のfullscreen 要素) を doc の保留中の fullscreen イベントのリストに追加します。 -
doc のfullscreen 要素をfullscreen 解除します。
-
-
promise を返し、残りの手順を並列に実行します。
-
doc で画面の向きの完全ロック解除手順を実行します。
-
resize が true の場合、doc のビューポートをその "normal" 寸法にリサイズします。
-
doc のfullscreen 要素が null の場合、promise を undefined で解決し、これらの手順を終了します。
-
exitDocs を、 doc が与えられた fullscreen を解除する文書を収集する 結果とします。
-
descendantDocs を、doc の 子孫 navigable のアクティブ文書のうち、 fullscreen 要素が非 null のもの(もしあれば)からなる、 ツリー 順の順序付き集合 とします。
-
exitDocs 内の各 exitDoc について反復します:
-
(
fullscreenchange, exitDoc の fullscreen 要素) を exitDoc の保留中の fullscreen イベントのリストに追加します。 -
resize が true の場合、exitDoc の fullscreen を解除します。
-
そうでない場合、exitDoc の fullscreen 要素をfullscreen 解除します。
-
-
descendantDocs 内の各 descendantDoc について反復します:
-
(
fullscreenchange, descendantDoc の fullscreen 要素) を descendantDoc の 保留中の fullscreen イベントのリストに追加します。
文書がfullscreen 解除される 順序は観測できません。なぜなら、fullscreen 手順を実行するがツリー順で呼び出されるためです。
-
-
promise を undefined で解決します。
exitFullscreen() メソッド手順は、
this 上でfullscreen
を終了するを実行した結果を返します。
以下は、Element
および Document
オブジェクトによってイベントハンドラー IDL 属性として
サポートされなければならないイベントハンドラー(および対応する
イベントハンドラーイベント型)です:
| イベントハンドラー | イベントハンドラーイベント型 |
|---|---|
onfullscreenchange
| fullscreenchange
|
onfullscreenerror
| fullscreenerror
|
これらは ShadowRoot
または Window
オブジェクトではサポートされず、どの名前空間の Element
オブジェクトにも、対応するイベントハンドラー内容属性はありません。
4. UI
ユーザーエージェントは、ネイティブのメディア全画面コントロールの実装に
requestFullscreen()
および exitFullscreen()
を利用することが推奨されます。
ユーザーが クローズリクエスト を開始すると、これは 全画面から完全に退出する アルゴリズムを クローズリクエスト手順の一部として起動します。これは クローズウォッチャー よりも優先されます。
ユーザーエージェントは、必要と判断した場合にはいつでも、閉じるリクエストや
exitFullscreen()
の呼び出しなしに、任意の fullscreen セッションを終了してかまいません。
キーボードロックがアクティブな場合、ユーザーには、 たとえばブラウザー UI インジケーターを通じて、明確に通知されるべきです。
ユーザーがキーボードロックを上書きし、制御をシステムまたはユーザーエージェントに戻すための、 単純で直感的な方法があるべきです。
5. レンダリング
このセクションは HTML のレンダリングセクションと同等に解釈されます。[HTML]
5.1. :fullscreen 疑似クラス
:fullscreen 疑似クラスは、次のいずれかの条件が true である
要素 element にマッチしなければなりません:
-
element の fullscreen flag が設定されている。
-
element が シャドウホスト であり、 retargeting で その node document の fullscreen element を element に対して実行した結果が element である。
これは
fullscreenElement
API と異なり、API は最上位の fullscreen element を返します。
5.2. ユーザーエージェントレベルのスタイルシートのデフォルト
@namespace "http://www.w3.org/1999/xhtml";
*|*:not(:root):fullscreen {
position:fixed !important;
inset:0 !important;
margin:0 !important;
box-sizing:border-box !important;
min-width:0 !important;
max-width:none !important;
min-height:0 !important;
max-height:none !important;
width:100% !important;
height:100% !important;
transform:none !important;
/* intentionally not !important */
object-fit:contain;
}
iframe:fullscreen {
border:none !important;
padding:0 !important;
}
*|*:not(:root):fullscreen::backdrop {
background:black;
}
6. キーボードロック
キーボードロックは、通常はシステムまたはユーザーエージェントのいずれかによって処理される特定のキー入力を インターセプトできるようにすることで、fullscreen で実行される Web アプリケーションの機能を拡張します。 これは、ESC やファンクションキーのようなキーがアプリケーションの機能に不可欠である、 ゲームやリモートデスクトップアプリケーションなどのシナリオで有用です。
キーボードロックは、Web
アプリケーションがキー入力を直接キャプチャして処理し、
ユーザーエージェントまたはオペレーティングシステムによって通常実行される既定の動作を迂回できるようにします。
通常ならユーザーエージェントまたはシステムレベルのアクションをトリガーするキーイベントは、代わりに
fullscreen の Web アプリケーションへリダイレクトされます。そのようなキーイベント(個々のキーまたはキーボードショートカット)は、
キーボード
ロックがアクティブな間はアクションを持たないこともあれば、同じアクションを依然として持ちつつ、
Web ページが preventDefault()
を呼び出してそのアクションをキャンセルできるようにすることもあります。
文書のキーボードロックがアクティブから非アクティブに変更されるたびに、ユーザーエージェントは キーボードロックを無効化し、キーボード入力の処理をユーザーエージェントおよびオペレーティングシステムの 既定の動作に復元しなければなりません。
ユーザーエージェントは、fullscreen を終了する目的のために追加の入力を予約するべきです。 また、Windows の Ctrl+Alt+Del など、セキュリティ上の理由によりインターセプトできない システムレベルのキーシーケンスまたは組み合わせもあります。
たとえば、Esc キーを使用して fullscreen を終了するユーザーエージェントは、キー押下時の 即時終了を防ぐためにキーボードロックを使用し、代わりに fullscreen を終了するには長押しを要求します。 そのようなユーザーエージェントの中には、fullscreen セッションに部分的なキーボードロックを暗黙的に付与するものもあり、 その場合、Esc キーが明示的なキーボードロックの影響を受ける唯一のキーである可能性があります。
7. Permissions Policy 統合
この仕様は、"fullscreen"
という文字列で識別される
ポリシー制御機能を定義します。
その デフォルト許可リスト は 'self' です。
文書の permissions policy は、その文書内のコンテンツが全画面表示できるかどうかを決定します。いずれかの文書で無効化されている場合、その文書内のコンテンツは 全画面表示の使用が許可されません。
HTML
allowfullscreen
属性は、iframe
要素の
container policy
に影響します。allow
属性で上書きされない限り、iframe の
allowfullscreen
を設定することは <iframe allow="fullscreen *"> と同等です。
詳細は Permissions
Policy § 6.3.1 allowfullscreen を参照してください。
8. セキュリティとプライバシーに関する考慮事項
ユーザーエージェントは、たとえばオーバーレイによって、何かが fullscreen で表示されていることを
エンドユーザーが認識できるようにするべきです。ユーザーエージェントは、常に機能する fullscreen の終了手段を提供し、
これをユーザーに知らせるべきです。これは、fullscreen 中にユーザーエージェント、あるいはオペレーティングシステム環境さえも
再現することで、サイトがエンドユーザーをだますことを防ぐためです。
requestFullscreen()
の定義も参照してください。
子 navigable 内のコンテンツが fullscreen になることを可能にするには、
権限ポリシーを通じて具体的に許可されている必要があります。これは、HTML
iframe
要素の
allowfullscreen
属性、または HTML
iframe
要素の
allow
属性内の適切な宣言、またはネスト元の文書とともに配信される `Permissions-Policy` HTTP ヘッダーを通じて行います。
これは、たとえば第三者のコンテンツが明示的な許可なしに fullscreen になることを防ぎます。
キーボードロックを適用する場合、 主にシステム制御やプライバシー上のリスク(Alt+Tab、Ctrl+Alt+Del など)を伴わない、 限定されたキー集合のみを API 経由でロックできます。
キーボードロックを適用する場合、 ユーザーエージェントは、ユーザーがロックを上書きできるようにするなど、 この機能の濫用を防ぐための保護策を実装するべきです。
ユーザーエージェントは、任意の粒度(たとえば特定のサイトに対して、またはグローバルに)で
キーボードロックを無視するユーザー設定を提供してもかまいません。
同様に、一部のプラットフォームにはキーボードが存在しない場合があり、その場合ユーザーエージェントは
キーボードロック状態を無視してもかまいません。ただし、フィンガープリンティングを避けるため、
これは requestFullscreen()
メソッドの Web から観測可能な動作に影響を与えたり、他の方法で公開されたりするべきではありません。
過去にホストされていた定義
この仕様では以前、::backdrop や文書の top layer の概念を定義していました。
謝辞
最初のモデル設計と素晴らしい貢献をしてくれた Robert O’Callahan 氏に多大なる感謝を申し上げます。
以下の方々にも感謝します: Andy Earnshaw, Changwan Hong, Chris Pearce, Darin Fisher, Dave Tapuska, fantasai, Giuseppe Pascale, Glenn Maynard, Ian Clelland, Ian Hickson, Ignacio Solla, João Eiras, Josh Soref, Kagami Sascha Rosylight, Matt Falkenhagen, Mihai Balan, Mounir Lamouri, Øyvind Stenhaug, Pat Ladd, Rafał Chłodnicki, Riff Jiang, Rune Lillesveen, Sigbjørn Vik, Simon Pieters, Tab Atkins-Bittner, Takayoshi Kochi, Theresa O’Connor, triple-underscore, Vincent Scheib, Xidorn Quan も素晴らしい貢献者です。
この標準は Philip Jägenstedt (Google, philip@foolip.org) によって編集されています。元の執筆者は Anne van Kesteren (Apple, annevk@annevk.nl) です。 Tantek Çelik (Mozilla, tantek@cs.stanford.edu) は法的な整理を担当しました。
知的財産権
Copyright © WHATWG (Apple, Google, Mozilla, Microsoft). この成果物は Creative Commons Attribution 4.0 International License の下でライセンスされています。その一部がソースコードに組み込まれる場合、その部分は BSD 3-Clause License の下でライセンスされます。
これは現行標準です。 特許審査版に興味がある方は 現行標準審査ドラフト をご覧ください。