1. 용어
이 명세서는 Infra 표준에 의존합니다. [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입니다.
모든 문서는 pending fullscreen 이벤트 목록과 연관되어 있으며, 이는 (string, 요소)로 구성된 튜플의 순서가 지정된 집합입니다. 초기값은 비어 있습니다.
element를 전체 화면으로 만들기 위한 방법:
-
hideUntil을 element, null, false가 주어진 상태로 최상위 popover 조상을 실행한 결과로 둔다.
-
element의 node document, hideUntil, false, true가 주어진 상태로 popover들을 다음까지 숨기기를 실행한다.
-
element의 fullscreen flag를 설정한다.
-
element가 주어진 상태로 top layer에서 즉시 제거한다.
- element가 주어진 상태로 top layer에 추가한다.
element를 전체 화면 해제하려면, element의 fullscreen flag, iframe fullscreen flag(있는 경우), keyboard lock flag를 unset하고, 주어진 element를 top layer에서 즉시 제거한다.
document의 전체 화면을 해제하기는 전체 화면 해제 알고리즘을 요소 각각에 대해 실행합니다. 이때 document의 top layer에서 fullscreen flag가 설정된 요소를 찾아 실행합니다.
document의 전체 화면을 완전히 종료하기 알고리즘은 다음과 같습니다:
-
document의 fullscreen element가 null이면, 알고리즘을 종료합니다.
-
전체 화면 해제 알고리즘을 fullscreen flag가 설정된 요소 각각에 대해 실행합니다. 단, document의 fullscreen element는 제외합니다.
-
전체 화면 종료 알고리즘을 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인 경우, 전체 화면 종료 알고리즘을 document에 대해 실행합니다.
-
그 외의 경우, node의 전체 화면 해제 알고리즘을 실행합니다.
-
document의 top layer가 node를 포함하고 있다면, 즉시 top layer에서 제거 알고리즘을 node에 대해 실행합니다.
다른 명세서에서도 top layer에서 요소를 추가/제거할 수 있으므로, node가 document의 fullscreen element가 아닐 수 있습니다. 예를 들어, node가 열린
dialog요소일 수 있습니다.
-
unloading document cleanup steps가 document와 함께 실행될 때, 전체 화면 완전 종료 알고리즘을 document에 대해 실행합니다.
전체 화면이 지원됨은 이전에 설정된 사용자 환경설정, 보안 위험 또는 플랫폼 제한이 없을 때를 의미합니다.
전체 화면 단계 실행하기 알고리즘을 document document에 대해 실행하려면 다음을 수행합니다:
-
pendingEvents를 document의 pending fullscreen 이벤트 목록으로 설정합니다.
-
비우기 알고리즘을 document의 pending fullscreen 이벤트 목록에 대해 실행합니다.
-
각각의 (type, element) 튜플에 대해 다음을 수행합니다:
-
element가 connected 상태이고, node document가 document인 경우 target을 element로, 그렇지 않으면 target을 document로 설정합니다.
-
이벤트 발생 알고리즘을 type 이름으로,
bubbles및composed속성 값을 true로 하여 target에서 실행합니다.
-
모든 요소에는 연관된 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를 전체 화면으로 표시하고, 완료되면 promise를 resolve한다.
제공된 경우, options의
navigationUI멤버는 전체 화면 중 navigation UI를 표시하는 것이 선호되는지 여부를 나타낸다. "show"로 설정된 경우, 화면 공간보다 navigation의 단순성이 선호되고, "hide"로 설정된 경우 더 많은 화면 공간이 선호된다. 사용자 에이전트는 언제나 애플리케이션의 선호보다 사용자의 선호를 우선할 수 있다. 기본값 "auto"는 애플리케이션의 선호가 없음을 나타낸다.제공된 경우, options의
keyboardLock멤버는 제공된 keyboard lock 모드가 적용될지 여부를 나타낸다."
browser"로 설정된 경우, keyboard lock이 적용될 수 있다.사용자 에이전트는 언제나 애플리케이션의 선호보다 사용자의 선호를 우선할 수 있다. 기본값 "
none"은 keyboard lock이 적용되지 않음을 나타낸다. document .fullscreenEnabled-
document가 요소를 전체 화면으로 표시할 수 있고 fullscreen이 지원되면 true를 반환하고, 그렇지 않으면 false를 반환한다.
promise = document .exitFullscreen()-
document의 fullscreen element가 전체 화면으로 표시되는 것을 중지하고, 완료되면 promise를 resolve한다.
document .fullscreenElement-
document의 fullscreen element를 반환한다.
shadowroot .fullscreenElement-
shadowroot의 fullscreen element를 반환한다.
요소 element에 대한 fullscreen element ready check는 다음이 모두 true이면 true를 반환하고, 그렇지 않으면 false를 반환한다:
-
element가 connected 상태임.
-
element의 node document가 "
fullscreen" 기능을 사용할 수 있음. -
element의 namespace가 HTML namespace가 아니거나, element의 popover visibility state가 상태임.
requestFullscreen(options) 메서드 단계는
다음과 같습니다:
-
pendingDoc을 this의 node document로 설정합니다.
-
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 준비 확인 알고리즘을 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의 viewport 크기를 재설정합니다. 이때 options["
navigationUI"] 값을 반영할 수 있습니다:값 viewport 크기 " hide"출력 장치의 화면 전체 크기 " show"출력 장치의 화면 크기를 페이지 네비게이션 컨트롤이 표시될 수 있도록 제한 " auto"사용자 에이전트가 정의하지만, 위 둘 중 하나와 일치함 사용자가 전체 화면을 해제하는 방법에 대한 메시지를 선택적으로 표시할 수 있습니다.
-
다음 조건 중 하나라도 false이면 error를 true로 설정합니다:
-
This의 node document가 pendingDoc과 동일함.
-
fullscreen element 준비 확인 알고리즘을 this에 적용한 결과가 true임.
-
-
error가 true이면:
-
Append (
fullscreenerror, this)를 pendingDoc의 pending fullscreen 이벤트 목록에 추가합니다. -
promise를
TypeError예외로 reject하고, 이 단계들을 종료합니다.
-
-
fullscreenElements를 순서가 지정된 집합으로 생성하고, 초기값은 this 하나만 포함합니다.
-
다음 반복을 수행합니다:
-
last를 fullscreenElements의 마지막 item으로 설정합니다.
-
container를 last의 node navigable의 container로 설정합니다.
-
container가 null이면 break합니다.
-
Append container를 fullscreenElements에 추가합니다.
-
-
fullscreenElements 내의 각 element에 대해 반복한다:
-
doc을 element의 node document로 둔다.
-
element가 doc의 fullscreen element이면, continue.
아무것도 변경되지 않았을 때는 observer에게 알릴 필요가 없다.
-
element가 this이고, this가
iframe요소이면, element의 iframe fullscreen flag를 설정한다. -
doc 내에서 element를 전체 화면으로 만든다.
-
(
fullscreenchange, element)를 doc의 pending fullscreen event 리스트에 추가한다.
요소들이 전체 화면 처리되는 순서는 관찰 가능하지 않다. 왜냐하면 fullscreen 단계를 실행하는 것이 tree order로 호출되기 때문이다.
-
-
options["
keyboardLock"]의 값에 따라:- "
browser" -
this의 keyboard lock flag를 설정한다.
- "
none" -
this의 keyboard lock flag를 unset한다.
- "
-
promise를 undefined로 resolve한다.
프로세스 분리된 navigable 구현은 독자에게 맡깁니다. 개선 제안 환영합니다.
fullscreenEnabled getter 단계는,
this가
"fullscreen"
기능을 사용하도록 허용되어 있고
fullscreen이
지원되면 true를 반환하고,
그렇지 않으면 false를 반환한다.
fullscreen getter 단계는,
this의 fullscreen
element가
null이면 false를 반환하고, 그렇지 않으면 true를 반환한다.
대신 fullscreenElement
attribute를 사용하라.
fullscreenElement
getter 단계는 다음과 같다:
-
this가 shadow root이고, 그 host가 connected가 아니면 null을 반환한다.
-
candidate를 fullscreen element를 this에 대해 retargeting한 결과로 둔다.
-
null을 반환한다.
문서는, 자신의 top layer 안에 fullscreen flag가 설정된 요소가 정확히 하나 있으면 simple fullscreen document라고 한다.
문서의
top layer 안에 두 개의 요소가 있어도
simple
fullscreen document가 될 수 있다. 예를 들어, fullscreen element에 더해
open 상태인
dialog
요소가 있을 수 있다.
doc이 주어졌을 때 전체 화면 해제할 문서를 수집하려면, 다음 단계를 실행한다:
-
docs를 doc으로 구성된 ordered set으로 둔다.
-
true인 동안 반복한다:
-
lastDoc을 docs의 마지막 문서로 둔다.
-
단언: lastDoc의 fullscreen element는 null이 아니다.
-
lastDoc이 simple fullscreen document가 아니면, break.
-
container를 lastDoc의 node navigable의 container로 둔다.
-
container가 null이면 break.
-
container의 iframe fullscreen flag가 설정되어 있으면, break.
-
container의 node document를 docs에 추가한다.
-
-
docs를 반환한다.
이는 fullscreen element가 전체 화면 해제될 문서들의 set이다. 하지만 docs 안의 마지막 문서는 자신의 top layer 안에 fullscreen flag가 설정된 요소가 둘 이상 있을 수 있으며, 이 경우 그 문서는 여전히 fullscreen 상태로 남는다.
문서 doc의 fullscreen을 종료하려면, 다음 단계를 실행한다:
-
promise를 새 promise로 둔다.
-
doc이 fully active가 아니거나 doc의 fullscreen element가 null이면, promise를
TypeError예외로 reject하고 promise를 반환한다. -
resize를 false로 둔다.
-
docs를 주어진 doc에 대해 전체 화면 해제할 문서들을 수집한 결과로 둔다.
-
topLevelDoc을 doc의 node navigable의 top-level traversable의 active document로 둔다.
-
topLevelDoc이 docs 안에 있고, 그것이 simple fullscreen document이면, doc을 topLevelDoc으로 설정하고 resize를 true로 설정한다.
-
doc의 fullscreen element가 connected가 아니면:
-
(
fullscreenchange, doc의 fullscreen element)를 doc의 pending fullscreen event 리스트에 추가한다. -
doc의 fullscreen element를 전체 화면 해제한다.
-
-
promise를 반환하고, 나머지 단계를 병렬로 실행한다.
-
doc으로 screen orientation을 완전히 unlock하는 단계를 실행한다.
-
resize가 true이면, doc의 viewport를 그 "normal" 크기로 resize한다.
-
doc의 fullscreen element가 null이면, promise를 undefined로 resolve하고 이 단계를 종료한다.
-
exitDocs를 주어진 doc에 대해 전체 화면 해제할 문서들을 수집한 결과로 둔다.
-
descendantDocs를, 존재한다면 fullscreen element가 null이 아닌 doc의 descendant navigables의 active documents로 구성된, tree order의 ordered set으로 둔다.
-
exitDocs 내의 각 exitDoc에 대해 반복한다:
-
(
fullscreenchange, exitDoc의 fullscreen element)를 exitDoc의 pending fullscreen event 리스트에 추가한다. -
resize가 true이면, exitDoc를 전체 화면 해제한다.
-
그렇지 않으면, exitDoc의 fullscreen element를 전체 화면 해제한다.
-
-
descendantDocs 내의 각 descendantDoc에 대해 반복한다:
-
(
fullscreenchange, descendantDoc의 fullscreen element)를 descendantDoc의 pending fullscreen event 리스트에 추가한다.
문서들이 전체 화면 해제되는 순서는 관찰 가능하지 않다. 왜냐하면 fullscreen 단계를 실행하는 것이 tree order로 호출되기 때문이다.
-
-
promise를 undefined로 resolve한다.
exitFullscreen() 메서드 단계는
this에 대해 fullscreen
종료를 실행한 결과를 반환하는 것이다.
다음은 Element
및 Document
객체가
event handler IDL attributes로 지원해야 하는
event handlers와 그에 대응하는
event handler event types이다:
| event handler | event handler event type |
|---|---|
onfullscreenchange
| fullscreenchange
|
onfullscreenerror
| fullscreenerror
|
이들은 ShadowRoot
또는 Window
객체에서는 지원되지 않으며, 어떤 namespace에서도 Element
객체에 대해 대응하는
event handler content attributes는 없다.
4. UI
사용자 에이전트는 requestFullscreen()
및 exitFullscreen()를
활용하여 네이티브 미디어 전체 화면 컨트롤을 구현할 것을 권장합니다.
사용자가 종료 요청을 시작하면, 이는 전체 화면 완전 종료 알고리즘을 종료 요청 단계의 일부로 트리거합니다. 이는 모든 종료 감시자보다 우선합니다.
사용자 에이전트는 필요하다고 판단할 때마다 close request 또는
exitFullscreen()
호출 없이도 모든 fullscreen session을 종료할 수 있다.
keyboard locking이 활성 상태일 때는, 가능하면 브라우저 UI indicator를 통해 사용자에게 명확히 알려야 한다.
사용자가 keyboard locking을 override하여 제어를 system 또는 user agent로 되돌릴 수 있는 단순하고 직관적인 방법이 있어야 한다.
5. 렌더링
이 섹션은 HTML의 렌더링 섹션과 동일하게 해석되어야 합니다. [HTML]
5.1. :fullscreen 의사 클래스
:fullscreen 의사 클래스는 다음 조건 중 하나라도 true인 요소
element에 대해 반드시 일치해야 합니다:
-
element의 fullscreen flag가 설정되어 있는 경우.
-
element가 shadow host이고, 그 node document의 fullscreen element를 element에 대해 retargeting한 결과가 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. 키보드 잠금
키보드 잠금은 전체 화면에서 실행되는 웹 애플리케이션이 보통 system 또는 user agent가 처리하는 특정 key 입력을 가로챌 수 있게 하여 그 기능을 향상시킨다. 이는 ESC나 function key 같은 키가 애플리케이션 기능에 필수적인 게임 또는 원격 데스크톱 애플리케이션 같은 상황에서 유용하다.
keyboard lock은 웹
애플리케이션이 key 입력을 직접 capture하고 처리할 수 있게 하며,
일반적으로 user agent 또는 운영 체제가 실행하는 기본 동작을 우회한다. 보통 user agent 또는
system-level 동작을 trigger하는 key event는 대신 전체 화면의 웹 애플리케이션으로 redirect된다.
이러한 key event(개별 key 또는 keyboard shortcut에 대한 것)는 keyboard
lock이 활성 상태인 동안 아무 동작이 없을 수도 있고, 여전히 동일한 동작을 가질 수도 있지만
웹 페이지가 preventDefault()를
호출하여 그 동작을 취소할 수 있게 할 수 있다.
document의 keyboard lock이 활성 상태에서 비활성 상태로 변경될 때마다, user agent는 keyboard lock을 비활성화하고 keyboard 입력 처리를 user agent 및 운영 체제의 기본 동작으로 복원해야 한다.
User agent는 전체 화면을 종료하기 위한 추가 입력을 reserve해야 한다. 또한 Windows의 Ctrl+Alt+Del처럼 보안상의 이유로 가로챌 수 없는 일부 system-level key sequence 또는 조합도 있다.
예를 들어, Esc key를 사용해 전체 화면을 종료하는 user agent는 keyboard lock을 사용하여 key press 시 즉시 종료되는 것을 방지하고, 대신 전체 화면 종료에 long press를 요구한다. 이러한 일부 user agent는 fullscreen session에 partial keyboard lock을 암묵적으로 부여하기도 하며, 이 경우 Esc key가 명시적 keyboard lock의 영향을 받는 유일한 key일 수 있다.
7. 권한 정책 통합
이 명세서는
"fullscreen"
문자열로 식별되는 정책 제어 기능을 정의합니다. 해당 기능의 기본 허용 목록은 'self'입니다.
문서의 권한 정책은 해당 문서의 모든 콘텐츠가 전체 화면으로 전환될 수 있는지 여부를 결정합니다. 문서에서 비활성화된 경우, 해당 문서의 모든 콘텐츠는 전체 화면 기능을 사용할 수 없습니다.
HTML
allowfullscreen
속성은
iframe
요소에 중첩된 문서의 컨테이너 정책에 영향을 미칩니다.
allow
속성으로 재정의하지 않는 한, iframe에
allowfullscreen을
설정하는 것은 <iframe allow="fullscreen *">와 동일하며, 자세한 내용은 Permissions
Policy § 6.3.1 allowfullscreen에서 설명합니다.
8. 보안 및 개인정보 보호 고려사항
User agent는, 예를 들어 overlay를 통해, 최종 사용자가 무언가가 전체 화면으로 표시되고 있음을
인식할 수 있도록 보장해야 한다. User agent는 항상 작동하는 전체 화면 종료 수단을 제공하고,
이를 사용자에게 알려야 한다. 이는 사이트가 전체 화면에서 user agent 또는 심지어 운영 체제 환경을
재현하여 최종 사용자를 spoofing하는 것을 방지하기 위한 것이다. 다음의 정의도 참조하라:
requestFullscreen().
child navigable 안의 콘텐츠가 fullscreen으로 전환될 수 있게 하려면,
permissions policy를 통해 명시적으로 허용되어야 한다. 이는 HTML
iframe
요소의
allowfullscreen
attribute를 통해서나, HTML
iframe
요소의
allow
attribute 안의 적절한 선언을 통해서나, 또는 그것이 중첩되는 document와 함께
전달되는 `Permissions-Policy` HTTP header를 통해
이루어질 수 있다.
이는 예를 들어 명시적 허가 없이 third-party 콘텐츠가 fullscreen으로 전환되는 것을 방지한다.
keyboard lock을 적용할 때는, 주로 system control 또는 privacy 위험(Alt+Tab, Ctrl+Alt+Del 같은 것)을 수반하지 않는 제한된 key set만 API를 통해 lock될 수 있다.
keyboard lock을 적용할 때, user agent는 사용자가 lock을 override할 수 있게 하는 등, 이 기능의 남용을 방지하기 위한 safeguard를 구현해야 한다.
User agent는 keyboard lock을 무시하는
사용자 선호를 제공할 수 있다(예를 들어
특정 site 또는 전역 등 임의의 granularity로). 마찬가지로, 일부 platform에는 keyboard가 없을 수 있으며,
이 경우 user agent는 keyboard lock
상태를 무시할 수 있다. 그러나 fingerprinting을 피하기 위해,
이는 requestFullscreen()
메서드의 웹에서 관찰 가능한 동작에 영향을 주거나 다른 방식으로 노출되어서는 안 된다.
이전에 호스팅된 정의
이 명세서는 이전에 ::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로 소스 코드에서 라이선스가 부여됩니다.
이 문서는 현행 표준입니다. 특허 검토 버전에 관심이 있으신 분은 현행 표준 검토 초안을 참고하시기 바랍니다.