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을 topmost popover ancestor 알고리즘을 element, null, false로 실행한 결과로 설정합니다.
-
hideUntil이 null인 경우, element의 node document로 hideUntil을 설정합니다.
-
hide all popovers until 알고리즘을 hideUntil, false, true로 실행합니다.
-
element의 fullscreen flag를 설정합니다.
-
즉시 top layer에서 제거 알고리즘을 element에 대해 실행합니다.
- top layer에 추가 알고리즘을 element에 대해 실행합니다.
element의 전체 화면을 해제하기는 element의 fullscreen flag와 iframe fullscreen flag(있는 경우)을 해제하고, 즉시 top layer에서 제거 알고리즘을 element에 대해 실행합니다.
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에서 실행합니다.
-
3. API
enum {
FullscreenNavigationUI "auto" ,"show" ,"hide" };dictionary {
FullscreenOptions 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가 제공되면, options의
navigationUI
멤버는 전체 화면 상태에서 탐색 UI를 표시할지의 선호를 나타냅니다. "show
"로 설정하면 화면 공간보다 탐색의 간편함이 우선시되고, "hide
"로 설정하면 더 많은 화면 공간이 우선시됩니다. 사용자 에이전트는 항상 애플리케이션의 선호보다 사용자 선호를 우선할 수 있습니다. 기본값 "auto
"는 애플리케이션 선호가 없음을 나타냅니다. document .
fullscreenEnabled
-
document가 요소를 전체 화면으로 표시할 수 있고, 전체 화면이 지원됨이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
promise = document .
exitFullscreen()
-
document의 fullscreen element가 전체 화면 표시를 중지하며, 작업 완료 시 promise가 resolve됩니다.
document .
fullscreenElement
-
document의 fullscreen element를 반환합니다.
shadowroot .
fullscreenElement
-
shadowroot의 fullscreen element를 반환합니다.
fullscreen element 준비 확인 알고리즘은 element element에 대해 다음 조건이 모두 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에 추가합니다.
-
-
각각의 element에 대해 fullscreenElements에서 다음을 수행합니다:
-
doc를 element의 node document로 설정합니다.
-
element가 doc의 fullscreen element이면 continue합니다.
변경 사항이 없을 때는 옵저버에게 알릴 필요가 없습니다.
-
element가 this이고, this가
iframe
요소인 경우, element의 iframe fullscreen flag를 설정합니다. -
전체 화면 element 알고리즘을 doc에서 실행합니다.
-
Append (
fullscreenchange
, element)를 doc의 pending fullscreen 이벤트 목록에 추가합니다.
요소들이 전체 화면 처리되는 순서는 관찰할 수 없습니다. 전체 화면 단계 실행하기 알고리즘이 트리 순서로 호출되기 때문입니다.
-
-
promise를 undefined로 resolve합니다.
프로세스 분리된 navigable 구현은 독자에게 맡깁니다. 개선 제안 환영합니다.
fullscreenEnabled
getter 단계는 this가
"fullscreen
"
기능을 사용할 수 있고, 전체 화면이 지원됨이면 true를 반환하고, 아니면 false를 반환합니다.
fullscreen
getter 단계는 this의 fullscreen element가 null이면 false를 반환하고,
그렇지 않으면 true를 반환합니다.
fullscreenElement
속성을 대신 사용하세요.
fullscreenElement
getter 단계는 다음과
같습니다:
-
this가 shadow root이고, 그 host가 connected가 아니면 null을 반환합니다.
-
candidate를 fullscreen element를 this에 대해 retargeting한 결과로 설정합니다.
-
null을 반환합니다.
문서는 simple fullscreen document라고 하는데, 그 top layer에 fullscreen flag가 설정된 요소가 정확히 하나 있을 때를 말합니다.
문서의 top
layer에 요소가 두 개 있어도 simple fullscreen document가 될 수 있습니다. 예를 들어, fullscreen element
외에 열린
dialog
요소가 있을 수 있습니다.
collect documents to unfullscreen 알고리즘은 doc을 받아 다음 단계로 진행합니다:
-
docs를 순서가 지정된 집합으로 생성하고, doc만 포함합니다.
-
While true:
-
lastDoc를 docs의 마지막 문서로 설정합니다.
-
Assert: lastDoc의 fullscreen element는 null이 아니다.
-
lastDoc가 simple fullscreen document가 아니면 break합니다.
-
container를 lastDoc의 node navigable의 container로 설정합니다.
-
container가 null이면 break합니다.
-
container의 iframe fullscreen flag가 설정되어 있으면 break합니다.
-
Append container의 node document를 docs에 추가합니다.
-
-
docs를 반환합니다.
이 집합은 fullscreen element의 전체 화면 해제가 실행될 문서 집합입니다. 단, docs의 마지막 문서에 top layer에 fullscreen flag가 설정된 요소가 두 개 이상 있을 경우, 그 문서는 여전히 전체 화면 상태를 유지할 수 있습니다.
exit fullscreen 알고리즘은 문서 doc에 대해 다음 단계를 수행합니다:
-
promise를 새 프로미스로 생성합니다.
-
doc가 fully active가 아니거나 doc의 fullscreen element가 null이면 promise를
TypeError
예외로 reject하고 반환합니다. -
resize를 false로 설정합니다.
-
docs를 collect documents to unfullscreen 알고리즘을 doc에 대해 실행한 결과로 설정합니다.
-
topLevelDoc을 doc의 node navigable의 top-level traversable의 active document로 설정합니다.
-
topLevelDoc이 docs에 포함되어 있고, simple fullscreen document이면, doc을 topLevelDoc으로 설정하고 resize를 true로 설정합니다.
-
doc의 fullscreen element가 connected가 아니면:
-
Append (
fullscreenchange
, doc의 fullscreen element)를 doc의 pending fullscreen 이벤트 목록에 추가합니다. -
전체 화면 해제 알고리즘을 doc의 fullscreen element에 대해 실행합니다.
-
-
promise를 반환하고, 나머지 단계는 병렬로 실행합니다.
-
화면 방향 완전 해제 단계 알고리즘을 doc에 대해 실행합니다.
-
resize가 true이면, doc의 viewport를 "normal" 크기로 재설정합니다.
-
doc의 fullscreen element가 null이면, promise를 undefined로 resolve하고 이 단계를 종료합니다.
-
exitDocs를 collect documents to unfullscreen 알고리즘을 doc에 대해 실행한 결과로 설정합니다.
-
descendantDocs를 순서가 지정된 집합으로 생성하고, doc의 descendant navigables의 active documents 중 fullscreen element가 null이 아닌 문서를 트리 순서대로 포함합니다.
-
각각의 exitDoc에 대해 exitDocs에서 다음을 수행합니다:
-
Append (
fullscreenchange
, exitDoc의 fullscreen element)를 exitDoc의 pending fullscreen 이벤트 목록에 추가합니다. -
resize가 true이면, 전체 화면 해제 알고리즘을 exitDoc에 대해 실행합니다.
-
그 외에는 전체 화면 해제 알고리즘을 exitDoc의 fullscreen element에 대해 실행합니다.
-
-
각각의 descendantDoc에 대해 descendantDocs에서 다음을 수행합니다:
-
Append (
fullscreenchange
, descendantDoc의 fullscreen element)를 descendantDoc의 pending fullscreen 이벤트 목록에 추가합니다. -
전체 화면 해제 알고리즘을 descendantDoc에 대해 실행합니다.
문서들이 전체 화면 해제되는 순서는 관찰할 수 없습니다. 전체 화면 단계 실행하기 알고리즘이 트리 순서로 호출되기 때문입니다.
-
-
promise를 undefined로 resolve합니다.
exitFullscreen()
메서드 단계는 exit fullscreen 알고리즘을 this에 대해 실행한 결과를 반환합니다.
아래는 이벤트 핸들러(및 해당 이벤트 핸들러 이벤트 타입) 목록으로, Element
및 Document
객체가 이벤트 핸들러 IDL 속성으로 지원해야 합니다:
이벤트 핸들러 | 이벤트 핸들러 이벤트 타입 |
---|---|
onfullscreenchange
| fullscreenchange
|
onfullscreenerror
| fullscreenerror
|
이것들은 ShadowRoot
나
Window
객체에서는 지원되지 않으며, 어떤 네임스페이스에서도 Element
객체에 대한 이벤트 핸들러 컨텐츠 속성도 없습니다.
4. UI
사용자 에이전트는 requestFullscreen()
및 exitFullscreen()
를
활용하여 네이티브 미디어 전체 화면 컨트롤을 구현할 것을 권장합니다.
사용자가 종료 요청을 시작하면, 이는 전체 화면 완전 종료 알고리즘을 종료 요청 단계의 일부로 트리거합니다. 이는 모든 종료 감시자보다 우선합니다.
사용자 에이전트는 사용자가 필요하다고 판단하는 경우 종료 요청이나 exitFullscreen()
호출 없이도 모든 전체 화면 세션을 종료할 수 있습니다.
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. 권한 정책 통합
이 명세서는
"fullscreen
"
문자열로 식별되는 정책 제어 기능을 정의합니다. 해당 기능의 기본 허용 목록은 'self'
입니다.
문서의 권한 정책은 해당 문서의 모든 콘텐츠가 전체 화면으로 전환될 수 있는지 여부를 결정합니다. 문서에서 비활성화된 경우, 해당 문서의 모든 콘텐츠는 전체 화면 기능을 사용할 수 없습니다.
HTML
allowfullscreen
속성은
iframe
요소에 중첩된 문서의 컨테이너 정책에 영향을 미칩니다.
allow
속성으로 재정의하지 않는 한, iframe에
allowfullscreen
을
설정하는 것은 <iframe allow="fullscreen *">
와 동일하며, 자세한 내용은 Permissions
Policy § 6.3.1 allowfullscreen에서 설명합니다.
7. 보안 및 개인정보 보호 고려사항
사용자 에이전트는 오버레이 등을 통해 최종 사용자가 무엇이 전체 화면으로 표시되고 있는지 인지할 수 있도록 해야 합니다. 사용자 에이전트는 항상 동작하는 전체 화면 종료 방법을 제공하고, 이를
사용자에게 알려야 합니다. 이는 사이트가 전체 화면 상태에서 사용자 에이전트나 운영체제 환경을 모방하여 사용자를 속이는 것을 방지하기 위한 것입니다. requestFullscreen()
정의도 참고하세요.
자식 navigable의 콘텐츠가 전체 화면으로 전환되려면, 권한 정책을 통해 명시적으로 허용되어야 합니다. 이는 HTML
allowfullscreen
속성, HTML
iframe
요소의 적절한
allow
속성 선언, 또는 해당 Permissions-Policy
HTTP 헤더를 통한 방식으로 허용할 수 있습니다.
이는 해당 문서가 중첩되는 경로를 통해 전달됩니다.
이로써 제3자 콘텐츠가 명확한 권한 없이 전체 화면으로 전환되는 것을 방지할 수 있습니다.
이전에 호스팅된 정의
이 명세서는 이전에 ::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로 소스 코드에서 라이선스가 부여됩니다.
이 문서는 현행 표준입니다. 특허 검토 버전에 관심이 있으신 분은 현행 표준 검토 초안을 참고하시기 바랍니다.