Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 명세는 웹 콘텐츠가 프레젠테이션 디스플레이에 접근하고 이를 웹 콘텐츠 표시를 위해 사용할 수 있도록 하는 API를 정의합니다.
이 섹션은 발행 시점에서 이 문서의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정본은 W3C 기술 보고서 인덱스 https://www.w3.org/TR/에서 확인할 수 있습니다.
이 문서는 Second Screen Working Group에서 Recommendation track을 사용하여 Candidate Recommendation Draft로 발행되었습니다.
2017년 6월 1일 Candidate
Recommendation으로 발행된 이후, 작업 그룹은 PresentationRequest
를 구성할 때 지원되지 않는 스킴의 URL을 무시하도록 단계를 업데이트했으며,
수신 브라우징 컨텍스트가 스스로 탐색하는 방식에 추가 제한을 두었고, BinaryType
enum의 정의는 HTML 명세에서 정의된 것으로 대체했습니다. 이 문서에서
정의된 다른 인터페이스는 WebIDL 업데이트에 맞춰 조정된 것 외에는 변경되지 않았습니다. 다양한 명확화 및 편집 업데이트도 이루어졌습니다. 자세한 사항은 변경 사항 목록을 참조하세요.
위험으로 식별된 기능은 없습니다.
Second Screen Working Group은 Candidate Recommendation 기간 동안 Presentation API의 테스트 스위트를 개선하고 예비 구현 보고서를 업데이트할 것입니다. 이 명세가 Proposed Recommendation으로 진행되려면 각 기능에 대해 두 개의 독립적이고 상호 운용 가능한 구현이 입증되어야 합니다. 자세한 기준은 Candidate Recommendation exit criteria 섹션에 설명되어 있습니다.
Candidate Recommendation으로 발행되었다고 하여 W3C와 그 회원의 지지를 의미하지는 않습니다. Candidate Recommendation Draft는 작업 그룹이 후속 Candidate Recommendation Snapshot에 포함하려는 이전 Candidate Recommendation의 변경 사항을 통합합니다.
이 문서는 초안이며 언제든지 업데이트, 대체 또는 폐기될 수 있습니다. 이 문서를 진행 중인 작업 외의 것으로 인용하는 것은 부적절합니다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C는 해당 그룹의 산출물과 관련된 특허 공개 목록을 유지합니다. 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 본인이 필수적 청구를 포함하고 있다고 생각하는 특허에 대한 실제 지식을 가진 개인은 Essential Claim(s) 를 포함해 W3C 특허 정책 6장에 따라 정보를 공개해야 합니다.
이 문서는 2023년 11월 3일 W3C 프로세스 문서에 의해 관리됩니다.
이 섹션은 비규범적입니다.
Presentation API는 프로젝터, 연결된 모니터, 네트워크에 연결된 TV와 같은 프레젠테이션 디스플레이를 웹에서 사용할 수 있도록 하는 것을 목표로 합니다. HDMI, DVI 등 유선과 Miracast, Chromecast, DLNA, AirPlay 등 무선 기술로 연결된 디스플레이를 모두 고려합니다.
화면 크기가 제한된 장치는 더 많은 사람들에게 웹 콘텐츠를 보여주는 기능이 부족합니다. 예를 들어 회의실의 동료들, 집에 있는 친구와 가족 등에게 말입니다. 더 큰 프레젠테이션 디스플레이에 표시된 웹 콘텐츠는 더 높은 품질, 가독성, 그리고 더 큰 임팩트를 제공합니다.
Presentation API의 핵심은 컨트롤러 페이지가 프레젠테이션 페이지를 프레젠테이션 디스플레이에 표시하고 메시지를 교환할 수 있도록 하는 것입니다. 프레젠테이션 페이지가 디스플레이로 전송되는 방식과 메시지가 컨트롤러 페이지와 주고받는 방식은 구현에 따라 다릅니다. 이를 통해 다양한 디스플레이 기술을 사용할 수 있습니다.
예를 들어 프레젠테이션 디스플레이가 HDMI나 Miracast 등 오디오/비디오만 전송할 수 있는 방식으로 연결되어 있다면 컨트롤러를 호스팅하는 사용자 에이전트(UA)가 프레젠테이션도 렌더링합니다. 그리고 운영체제를 통해 생성된 그래픽과 오디오 출력을 프레젠테이션 디스플레이로 보냅니다. 이러한 상황을 Presentation API의 1-UA 모드 구현이라고 부릅니다. 요구되는 것은 사용자 에이전트가 프레젠테이션을 렌더링한 그래픽과 오디오를 프레젠테이션 디스플레이로 전송하고, 컨트롤러와 프레젠테이션 페이지 간의 메시지를 내부적으로 교환할 수 있다는 점입니다.
프레젠테이션 디스플레이가 HTML을 네이티브로 렌더링할 수 있고 컨트롤러와 네트워크로 통신할 수 있다면, 컨트롤러를 호스팅하는 사용자 에이전트는 프레젠테이션을 직접 렌더링할 필요가 없습니다. 대신 사용자 에이전트는 프레젠테이션 디스플레이에 프레젠테이션 페이지를 직접 로드하고 렌더링하도록 요청하는 프록시 역할을 합니다. 메시지 교환은 사용자 에이전트와 프레젠테이션 디스플레이 간 네트워크 연결을 통해 이루어집니다. 이러한 상황을 Presentation API의 2-UA 모드 구현이라고 부릅니다.
Presentation API는 프레젠테이션 디스플레이와 1-UA 모드, 2-UA 모드 그리고 위에 나열되지 않은 다른 방식으로 연결되는 사용자 에이전트와 함께 사용될 수 있습니다. 사용자 에이전트와 프레젠테이션 디스플레이 간의 상호 운용성을 높이기 위해 브라우저와 디스플레이 간 네트워크 통신의 표준화가 Second Screen Community Group에서 논의되고 있습니다.
이 섹션은 비규범적입니다.
사용 사례와 요구사항은 별도의 Presentation API 사용 사례 및 요구사항 문서에 정리되어 있습니다.
비규범적으로 표시된 섹션뿐만 아니라, 이 명세의 모든 작성 지침, 도표, 예시, 참고 사항도 비규범적입니다. 그 외의 모든 내용은 규범적입니다.
이 문서에서 MAY, MUST, MUST NOT, OPTIONAL, SHOULD, SHOULD NOT 등의 핵심 키워드는 BCP 14 [RFC2119] [RFC8174]에서 설명된 대로, 오직 여기처럼 모두 대문자로 나타날 때만 해석해야 합니다.
알고리즘의 일부로 명령문 형태로 표현된 요구사항(예: "선행 공백 문자를 모두 제거" 또는 "false를 반환하고 이 단계를 종료")은 알고리즘 도입에 사용된 핵심 키워드("MUST", "SHOULD", "MAY" 등) 의미에 따라 해석합니다.
알고리즘이나 특정 단계로 표현된 적합성 요구사항은 결과가 동등하다면 어떤 방식으로든 구현할 수 있습니다. (특히, 이 명세에서 정의된 알고리즘은 따라하기 쉽게 만들었으며 성능을 위해 설계된 것은 아닙니다.)
이 명세는 사용자 에이전트의 두 가지 클래스에 대한 적합성 기준을 설명합니다.
제어 사용자 에이전트 명세를 준수하는 웹 브라우저는 이 명세에서 설명하는 제어 브라우징 컨텍스트를 제공하여 프레젠테이션을 시작하고 제어할 수
있어야 합니다. 이 컨텍스트는
Presentation
,
PresentationAvailability
,
PresentationConnection
,
PresentationConnectionAvailableEvent
,
PresentationConnectionCloseEvent
,
그리고
PresentationRequest
인터페이스를 구현합니다.
수신 사용자 에이전트 명세를 준수하는 웹 브라우저는 이 명세에서 설명하는 수신 브라우징 컨텍스트를 제공하여 프레젠테이션을 렌더링할 수 있어야 합니다.
이 컨텍스트는
Presentation
,
PresentationConnection
,
PresentationConnectionAvailableEvent
,
PresentationConnectionCloseEvent
,
PresentationConnectionList
,
그리고
PresentationReceiver
인터페이스를 구현합니다.
하나의 사용자 에이전트가 제어 사용자 에이전트와 수신 사용자 에이전트 역할을 모두 할 수 있습니다. 두 브라우징 컨텍스트를 모두 제공하고 필요한 모든 인터페이스를 구현한다면 가능합니다. 이는 동일한 사용자 에이전트가 제어 브라우징 컨텍스트와 수신 브라우징 컨텍스트를 모두 호스팅할 수 있을 때 발생하며, 이는 API의 1-UA 모드 구현과 같습니다.
사용자 에이전트에 대해 표현된 적합성 요구사항은 제어 사용자 에이전트, 수신 사용자 에이전트 또는 문맥에 따라 두 클래스 모두에 적용될 수 있습니다.
JavaScript
realm과 current
realm 용어는 [ECMASCRIPT]에서 정의된 대로 사용됩니다.
resolved와 rejected는
Promise
객체 맥락에서 [ECMASCRIPT]에서 정의된 대로 사용됩니다.
Accept-Language와 HTTP authentication 용어는 [RFC9110]에서 정의된 대로 사용됩니다.
cookie store 용어는 [RFC6265]에서 정의된 대로 사용됩니다.
UUID 용어는 [RFC4122]에서 정의된 대로 사용됩니다.
DIAL 용어는 [DIAL]에서 정의된 대로 사용됩니다.
문서 새로고침은
[HTML]에서
reload
()
메소드가 호출될 때 실행되는 단계를
의미합니다.
로컬 저장소 영역은 localStorage
속성으로 노출되는 저장소 영역을 의미하고,
세션 저장소 영역은 sessionStorage
속성으로 노출되는 저장소 영역을 의미합니다.
[HTML].
이 명세는 다른 명세에서 내보낸 용어를 참조합니다. B.2 참조에 의해 정의된 용어를 참고하세요. 또한 다음과 같은 다른 명세의 내부 개념도 참고합니다:
이 섹션은 비규범적입니다.
이 섹션에서는 Presentation API의 주요 기능 사용법을 보여주는 코드 예시를 제공합니다. 이 예시들에서
controller.html
은 컨트롤러를, presentation.html
은 프레젠테이션을 구현합니다. 두 페이지 모두
https://example.org
도메인에서 제공됩니다
(https://example.org/controller.html
및
https://example.org/presentation.html
). 이 예시들은 제어 페이지가 한 번에 하나의 프레젠테이션만 관리한다고 가정합니다. 더 자세한 내용은
코드 예시의 주석을 참고하시기 바랍니다.
이 코드는 https://example.com/presentation.html
또는
https://example.net/alternate.html
을 표시할 수 있는 호환 가능한 프레젠테이션 디스플레이가
하나 이상 있을 때 버튼을 렌더링합니다.
디스플레이 가용성 모니터링은 먼저 표시하고자 하는 URL들로 PresentationRequest
를
생성한 후,
getAvailability
를 호출하여
프레젠테이션 가용성 변화 시 change
이벤트가 발생하는 PresentationAvailability
객체를 얻는 방식으로
이루어집니다.
<!-- controller.html -->
<button id="presentBtn" style="display: none;">프레젠트</button>
<script>
// 프레젠트 버튼은 프레젠테이션 디스플레이가 하나 이상 있을 때 표시됩니다
var presentBtn = document.getElementById("presentBtn");
// 상대 경로의 프레젠테이션 URL(e.g. "presentation.html")도 사용할 수 있습니다
var presUrls = ["https://example.com/presentation.html",
"https://example.net/alternate.html"];
// 디스플레이 가용성에 따라 present 버튼 표시/숨김 처리
var handleAvailabilityChange = function(available) {
presentBtn.style.display = available ? "inline" : "none";
};
// 프레젠테이션 디스플레이의 가용성이 알려지는 즉시 Promise가 resolve됩니다.
var request = new PresentationRequest(presUrls);
request.getAvailability().then(function(availability) {
// availability.value는 availability 객체가 살아있는 동안 제어 UA가 최신 상태로 유지할 수 있습니다. 필요 없을 때 객체를 즉시 폐기하는 것이 좋습니다.
handleAvailabilityChange(availability.value);
availability.onchange = function() { handleAvailabilityChange(this.value); };
}).catch(function() {
// 플랫폼에서 가용성 모니터링을 지원하지 않는 경우 request.start() 호출 후에만 프레젠테이션 디스플레이를 검색할 수 있습니다.
// 단순화를 위해 디바이스가 있다고 가정합니다. 또는 버튼에 대해 세 번째 상태를 구현할 수도 있습니다.
handleAvailabilityChange(true);
});
</script>
사용자가 presentBtn
을 클릭하면, 이 코드는 PresentationRequest
의
URL 중 하나를 프레젠테이션으로 요청합니다.
start
가 호출되면
브라우저는 일반적으로 사용자가 사용 가능한 호환 디스플레이 중 하나를 선택할 수 있도록 다이얼로그를 표시합니다. 선택된 디스플레이와 호환되는 PresentationRequest
의 첫 번째 URL이 해당 디스플레이에
표시됩니다.
start
메서드는
프레젠테이션의 상태를 추적하고, 디스플레이에 프레젠테이션 페이지가 로드된 후 메시지를 교환할 수 있는 PresentationConnection
객체로 resolve됩니다.
<!-- controller.html -->
<script>
presentBtn.onclick = function () {
// 새 프레젠테이션 시작
request.start()
// 프레젠테이션 연결 객체는 성공 시 setConnection에 전달됩니다
.then(setConnection);
// 사용자가 선택 다이얼로그를 취소하거나 사용 가능한 스크린이 없는 경우
};
</script>
프레젠테이션은 원래 프레젠테이션을 시작한 페이지가 PresentationConnection
을 닫거나, 내비게이션하거나,
페이지가 닫힌 후에도 계속 실행됩니다.
다른 페이지는 PresentationConnection
의 id
를 사용하여 기존 프레젠테이션에 다시 연결하고 제어를 재개할 수
있습니다.
이는 프레젠테이션을 시작한 동일 브라우저에서만 보장됩니다.
<!-- controller.html -->
<button id="reconnectBtn" style="display: none;">다시 연결</button>
<script>
var reconnect = function () {
// presId가 있으면 localStorage에서 읽기
var presId = localStorage["presId"];
// 프레젠테이션에 다시 연결할 때 presId는 필수입니다.
if (!!presId) {
request.reconnect(presId)
// 새 연결 객체는 성공 시 setConnection에 전달됩니다
.then(setConnection);
// presUrl과 presId에 대해 연결이 없거나 오류가 발생한 경우
}
};
// 컨트롤러가 내비게이션될 때 자동으로 다시 연결
document.addEventListener("DOMContentLoaded", reconnect);
// 또는 수동으로 다시 연결
const reconnectBtn = document.querySelector("#reconnectBtn");
reconnectBtn.onclick = reconnect;
</script>
일부 브라우저는 사용자가 제어 페이지와 직접 상호작용하지 않고 프레젠테이션을 시작할 수 있는 방법을 제공합니다. 제어 페이지는
navigator.presentation
의 defaultRequest
속성을 설정하고,
connectionavailable
이벤트를 수신하여 프레젠테이션이 이런
방식으로 시작될 때 처리할 수 있습니다. 이벤트로 전달되는 PresentationConnection
은 페이지가 start
를 호출한 것과 동일하게 동작합니다.
<!-- controller.html -->
<!-- presentation.defaultRequest를 설정하면 제어 UA가 프레젠테이션을 시작할 때 사용할 PresentationRequest를 페이지에서 지정할 수 있습니다. -->
<script>
navigator.presentation.defaultRequest = new PresentationRequest(presUrls);
navigator.presentation.defaultRequest.onconnectionavailable = function(evt) {
setConnection(evt.connection);
};
</script>
프레젠테이션이 시작되면 반환된 PresentationConnection
을 사용해 상태를 모니터링하고
메시지를 주고받습니다. 일반적으로 사용자는 제어 페이지에서 프레젠테이션을 종료하거나 연결을 해제할 수 있습니다.
제어 페이지는 생애주기 동안 여러 프레젠테이션에 연결 및 연결 해제가 가능하므로, 현재 PresentationConnection
과 상태를 관리하는 것이 좋습니다.
메시지는 connected
상태의 연결에서만 송수신할 수
있습니다.
<!-- controller.html -->
<button id="disconnectBtn" style="display: none;">연결 해제</button>
<button id="stopBtn" style="display: none;">종료</button>
<script>
let connection;
// 연결 해제 및 종료 버튼은 연결된 프레젠테이션이 있을 때 표시됩니다
const stopBtn = document.querySelector("#stopBtn");
const disconnectBtn = document.querySelector("#disconnectBtn");
stopBtn.onclick = _ => {
connection && connection.terminate();
};
disconnectBtn.onclick = _ => {
connection && connection.close();
};
function setConnection(newConnection) {
// 기존 프레젠테이션 연결 해제 (재연결 시가 아닌 경우)
if (connection && connection != newConnection && connection.state != 'closed') {
connection.onclose = undefined;
connection.close();
}
// 새 연결을 설정하고 프레젠테이션 ID 저장
connection = newConnection;
localStorage["presId"] = connection.id;
function showConnectedUI() {
// 사용자가 프레젠테이션을 연결 해제하거나 종료할 수 있도록 함
stopBtn.style.display = "inline";
disconnectBtn.style.display = "inline";
reconnectBtn.style.display = "none";
}
function showDisconnectedUI() {
disconnectBtn.style.display = "none";
stopBtn.style.display = "none";
reconnectBtn.style.display = localStorage["presId"] ? "inline" : "none";
}
// 연결 상태 모니터링
connection.onconnect = _ => {
showConnectedUI();
// 메시지 핸들러 등록
connection.onmessage = message => {
console.log(`메시지 수신: ${message.data}`);
};
// 프레젠테이션 페이지에 초기 메시지 전송
connection.send("Say hello");
};
connection.onclose = _ => {
connection = null;
showDisconnectedUI();
};
connection.onterminate = _ => {
// localStorage에 presId가 있으면 삭제
delete localStorage["presId"];
connection = null;
showDisconnectedUI();
};
};
</script>
이 코드는 https://example.org/presentation.html
에서 실행됩니다. 프레젠테이션은 여러 제어 페이지에서 연결될 수 있으므로,
표시되는 페이지는 connectionList
객체에서 들어오는 연결을 반드시 수신해야 합니다.
<!-- presentation.html -->
<script>
var addConnection = function(connection) {
connection.onmessage = function (message) {
if (message.data == "Say hello")
connection.send("hello");
};
};
navigator.presentation.receiver.connectionList.then(function (list) {
list.connections.map(function (connection) {
addConnection(connection);
});
list.onconnectionavailable = function (evt) {
addConnection(evt.connection);
};
});
</script>
<!-- controller.html -->
<script>
connection.send('{"string": "你好,世界!", "lang": "zh-CN"}');
connection.send('{"string": "こんにちは、世界!", "lang": "ja"}');
connection.send('{"string": "안녕하세요, 세계!", "lang": "ko"}');
connection.send('{"string": "Hello, world!", "lang": "en-US"}');
</script>
<!-- presentation.html -->
<script>
connection.onmessage = function (message) {
var messageObj = JSON.parse(message.data);
var spanElt = document.createElement("SPAN");
spanElt.lang = messageObj.lang;
spanElt.textContent = messageObj.string;
document.body.appendChild(spanElt);
};
</script>
제어 페이지는 서로 다른 두 프레젠테이션 디스플레이에서 두 개의 독립적인 프레젠테이션을 시작하고 제어할 수 있습니다. 이 코드는 위의 예시 첫 번째 프레젠테이션에 두 번째 프레젠테이션을 추가하는 방법을 보여줍니다.
<!-- controller.html -->
<!-- 동일한 제어 페이지에서 start()를 여러 번 호출하여 여러 프레젠테이션을 생성 및 관리할 수 있습니다. -->
<button id="secondPresentBtn" style="display: none;">다시 프레젠트</button>
<script>
var secondPresentBtn = document.getElementById("secondPresentBtn");
var secondPresUrl = "https://example.com/second-presentation.html";
var secondRequest = new PresentationRequest(secondPresUrl);
// 단순화를 위해 secondRequest의 스크린 가용성 처리 및 secondPresentBtn 상태 갱신 로직은 생략되었습니다.
secondPresentBtn.onclick = function () {
// 새 프레젠테이션 시작(원래 request와 다른 스크린에서 시작될 수 있음)
//
secondRequest.start().then(setSecondConnection);
};
function setSecondConnection(newConnection) {
// second-presentation.html에 메시지 송수신하는 로직
};
</script>
프레젠테이션 디스플레이는 구현별 연결 기술을 통해 사용자 에이전트에서 사용할 수 있는 그래픽 및/또는 오디오 출력 장치를 의미합니다.
프레젠테이션 연결은 제어 브라우징 컨텍스트와 수신 브라우징 컨텍스트를 연결하는 객체이며, 이들 간의 양방향 메시징을 가능하게 합니다. 각 프레젠테이션 연결은 프레젠테이션 연결 상태, 고유한 프레젠테이션 식별자(다른 프레젠테이션과 구분하기 위한 값), 그리고 프레젠테이션 URL을 가집니다. 이 URL은 URL로 프레젠테이션을 생성하거나 다시 연결할 때 사용됩니다. 유효한 프레젠테이션 식별자는 영문자/숫자 ASCII 문자로만 구성되며 최소 16자 이상이어야 합니다.
일부 프레젠테이션 디스플레이는 기능, 보안, 하드웨어 제한 등으로 인해 웹 콘텐츠의 일부만 표시할 수 있습니다. 예를 들면 셋톱박스, 스마트 TV, 오디오만 재생 가능한 네트워크 스피커 등이 있습니다. 이러한 디스플레이가 제어 사용자 에이전트가 해당 URL을 표시할 수 있음을 합리적으로 보장할 수 있다면 이 디스플레이는 해당 프레젠테이션 URL에 대해 사용 가능한 프레젠테이션 디스플레이입니다.
제어 브라우징 컨텍스트(줄여서 컨트롤러)는 브라우징 컨텍스트로, start
또는 reconnect
를 호출하여 프레젠테이션에
연결하거나, connectionavailable
이벤트를 통해 프레젠테이션 연결을 받은 경우를 의미합니다. PresentationRequest
관련 알고리즘에서는, 제어 브라우징 컨텍스트란 브라우징 컨텍스트 중 JavaScript
realm이 PresentationRequest
를 생성할 때 사용된 것을 의미합니다.
수신 브라우징 컨텍스트(줄여서 프레젠테이션)는 프레젠테이션 디스플레이에 렌더링을 담당하는 브라우징 컨텍스트입니다. 수신 브라우징 컨텍스트는 제어 브라우징 컨텍스트와 동일한 사용자 에이전트에 있을 수도, 다른 사용자 에이전트에 있을 수도 있습니다. 수신 브라우징 컨텍스트는 수신 브라우징 컨텍스트 생성 단계를 따라 생성됩니다.
절차에서는 목적지 브라우징 컨텍스트가, 해당 절차가 제어 브라우징 컨텍스트에서 시작된 경우 수신 브라우징 컨텍스트이고, 수신 브라우징 컨텍스트에서 시작된 경우 제어 브라우징 컨텍스트입니다.
제어
중인 프레젠테이션 집합(초기값: 비어 있음)은 제어 브라우징 컨텍스트에서 제어 사용자 에이전트(또는 해당 사용자 에이전트 내 특정 사용자 프로필)를 위해 생성된 프레젠테이션 연결을 포함합니다. 제어 중인 프레젠테이션 집합은 내부적으로 PresentationConnection
객체 목록으로 표현됩니다. 이
객체들은 실제 프레젠테이션 연결을 나타냅니다. 여러 PresentationConnection
객체가 동일한 프레젠테이션 URL과 프레젠테이션 식별자를
공유할 수 있지만, 하나의 PresentationConnection
만이 특정 프레젠테이션 URL과 프레젠테이션 식별자를
특정 제어 브라우징 컨텍스트에서 가질 수 있습니다.
프레젠테이션 컨트롤러 집합(초기값: 비어 있음)은 수신 브라우징
컨텍스트에서 수신 사용자 에이전트를 위해 생성된 프레젠테이션 연결을 포함합니다. 프레젠테이션 컨트롤러 집합은 내부적으로 PresentationConnection
객체 목록으로 표현됩니다. 이
객체들은 실제 프레젠테이션 연결을 나타냅니다. 이 집합의 모든 프레젠테이션 연결은 동일한 프레젠테이션 URL과 프레젠테이션 식별자를 공유합니다.
수신 브라우징 컨텍스트에서는 프레젠테이션 컨트롤러 모니터(초기값: null
)가 현재 프레젠테이션 컨트롤러 집합을 수신 애플리케이션에 노출합니다. 프레젠테이션 컨트롤러 모니터는 PresentationConnectionList
로 표현됩니다.
수신 브라우징 컨텍스트에서는 프레젠테이션 컨트롤러 프라미스(초기값: null
)가 최초 프레젠테이션 연결이 성립되면 프레젠테이션 컨트롤러 모니터를 제공합니다. 프레젠테이션 컨트롤러 프라미스는 Promise
로, 프레젠테이션 컨트롤러 모니터와 함께 resolve됩니다.
제어 브라우징 컨텍스트에서는 기본
프레젠테이션 요청(초기값: null
)이 브라우저 크롬에서 사용자가 프레젠테이션 연결을
시작하고자 할 때 사용할 요청을 나타냅니다.
이 명세에서 언급된 태스크의 태스크 소스는 프레젠테이션 태스크 소스입니다.
알고리즘이 Presentation API 태스크를 큐에 추가T 할 때, 사용자 에이전트는 MUST 글로벌 태스크 T를 프레젠테이션 태스크 소스에 추가해야 하며, 글로벌 오브젝트는 현재 realm의 것을 사용합니다.
별도의 명시가 없는 한, 알고리즘 단계에서 생성된 스크립트 객체의 JavaScript realm은 현재 realm입니다.
WebIDL
[SecureContext, Exposed=Window]
interface Presentation
{
};
presentation
속성은
Presentation
인터페이스의 인스턴스를 가져올 때 사용됩니다. 이 속성은
MUST Presentation
인스턴스를 반환해야 합니다.
제어 사용자 에이전트는 MUST 다음 partial interface를 구현해야 합니다:
WebIDLpartial interface Presentation
{
attribute PresentationRequest
? defaultRequest
;
};
defaultRequest
속성은 MUST
기본 프레젠테이션 요청이 있으면 반환하고,
없으면 null
을 반환해야 합니다. 값을 설정할 때 기본
프레젠테이션 요청을 새 값으로 MUST 설정해야 합니다.
제어 사용자 에이전트는 SHOULD 사용자가 버튼 클릭 등 브라우저 크롬에서 의도를 명확히 했을 때만 기본 프레젠테이션 요청을 사용해 프레젠테이션을 시작해야 합니다.
기본 프레젠테이션 요청을 사용해 프레젠테이션을 시작하려면, 제어 사용자 에이전트는 MUST 기본 프레젠테이션 요청으로 프레젠테이션 시작 단계를 따라야 합니다.
기본 프레젠테이션 요청을 사용한 프레젠테이션 시작 지원은 OPTIONAL입니다.
수신 사용자 에이전트는 MUST 다음 partial interface를 구현해야 합니다:
WebIDLpartial interface Presentation
{
readonly attribute PresentationReceiver
? receiver
;
};
receiver
속성은 MUST PresentationReceiver
인스턴스를 반환해야 하며,
이는 수신 브라우징 컨텍스트와 연결되어 있고,
수신 사용자 에이전트가 수신 브라우징 컨텍스트를 생성할 때 만듭니다.
그 외의 브라우징 컨텍스트(수신 브라우징 컨텍스트의 자식 navigable 포함)에서는 MUST null
을 반환해야 합니다.
웹 개발자는 navigator.presentation.receiver를 사용하여 문서가 프레젠테이션으로 로드되었는지 감지할 수 있습니다.
WebIDL[SecureContext, Exposed=Window]
interface PresentationRequest
: EventTarget {
constructor
(USVString url);
constructor
(sequence<USVString> urls);
Promise<PresentationConnection
> start
();
Promise<PresentationConnection
> reconnect
(USVString presentationId);
Promise<PresentationAvailability
> getAvailability
();
};
PresentationRequest
객체는
제어 브라우징 컨텍스트에서 프레젠테이션을 시작하거나 다시 연결하고자 할 때의 요청과
연결됩니다. PresentationRequest
객체는 MUST
제어 사용자 에이전트가 제공하는 제어 브라우징 컨텍스트에서 구현되어야 합니다.
PresentationRequest
가 생성될 때,
지정된 urls
는 MUST 프레젠테이션 요청
URL의 목록으로 사용되어야 하며,
각각은 해당 PresentationRequest
인스턴스의 가능한 프레젠테이션 URL입니다.
PresentationRequest
생성
PresentationRequest
생성자가 호출되면,
제어 사용자 에이전트는 MUST 다음 단계를
실행해야 합니다:
PresentationRequest
객체
SecurityError
를 발생시키고 단계를
중단한다.
NotSupportedError
예외를 발생시키고 모든 남은 단계를 중단한다.
SyntaxError
예외를 발생시키고 모든 남은 단계를 중단한다.
NotSupportedError
를
발생시키고 모든 남은 단계를 중단한다.
SecurityError
를 발생시키고 단계를
중단한다.
PresentationRequest
객체를 생성하여 반환한다.
start
메서드가 호출될 때,
사용자
에이전트는 MUST 프레젠테이션 디스플레이를 선택하는 다음 단계를 실행해야 합니다: 프레젠테이션 디스플레이 선택.
PresentationRequest
객체로, start
를 호출받았다.
Promise
Promise
를 InvalidAccessError
예외와 함께 reject한 뒤 단계를 중단한다.
start
호출로 unsettled Promise
가 있다면,
새 Promise
를 OperationError
예외와 함께
reject한 뒤 모든 남은 단계를 중단한다.
Promise
로 한다.
NotFoundError
예외를
전달한다.
NotAllowedError
예외와 함께
reject하고, 모든 남은 단계를 중단한다.
사용자가 브라우저 크롬(전용 버튼, 사용자 제스처 또는 기타 신호)을 통해 문서를 프레젠테이션 디스플레이에 표시하겠다는 의사를 표현하면, 해당 사용자 에이전트는 MUST 아래 단계를 실행하여 기본 프레젠테이션 요청으로 프레젠테이션 시작을 수행해야 합니다. 문서에 기본 프레젠테이션 요청이 설정되어 있지 않으면, 이 단계들은 MUST 실행되지 않아야 합니다.
사용자 에이전트가 프레젠테이션 연결 시작을 수행해야 할 때, MUST 아래 단계를 실행합니다:
PresentationRequest
Promise
PresentationConnection
S를 생성한다.
connecting
으로
설정한다.
PresentationConnectionAvailableEvent
인터페이스를 사용하여, connection
속성을 S로 초기화하여 presentationRequest에서 발생시킨다.
이 이벤트는 버블링되지 않으며 취소할 수 없다.
error
를
closeReason으로, 실패 설명의 사람이 읽을 수 있는 메시지를 closeMessage로 하여 수행한다.
http
또는 https
스킴을 사용하는 presentationUrl에 대한 동작을 정의하며,
그 외 스킴은 정의하지 않습니다.
reconnect
메서드가 호출되면, 사용자 에이전트는 MUST 아래 단계를 실행하여 프레젠테이션에 다시
연결해야 합니다:
PresentationRequest
객체로, reconnect
메서드가 호출된 대상
Promise
Promise
로 한다.
PresentationConnection
을 검색한다:
terminated
가
아님
PresentationConnection
이 존재하면, 다음
단계를 실행한다:
PresentationConnection
로
한다.
connecting
또는
connected
이면,
남은 단계를 모두 중단한다.
connecting
으로
설정한다.
PresentationConnection
을 검색한다:
terminated
가
아님
PresentationConnection
이 존재하면, 다음
단계를 실행한다:
PresentationConnection
로
한다.
PresentationConnection
newConnection을 생성한다.
connecting
으로
설정한다.
PresentationConnectionAvailableEvent
인터페이스를 사용하여, connection
속성을 newConnection으로 초기화하여 presentationRequest에서 발생시킨다. 이벤트는 버블링되지
않고 취소할 수 없다.
NotFoundError
예외를 전달한다.
아래는 PresentationRequest
인터페이스를 구현하는 객체가 이벤트 핸들러 IDL 속성으로 지원해야 하는 이벤트 핸들러 및 각 이벤트 핸들러의 이벤트 타입입니다:
이벤트 핸들러 | 이벤트 핸들러 이벤트 타입 |
---|---|
onconnectionavailable
|
connectionavailable
|
각 프레젠테이션 연결은
PresentationConnection
객체로 표현됩니다.
제어 사용자 에이전트와 수신 사용자 에이전트는
MUST
PresentationConnection
을 구현해야 합니다.
WebIDLenum PresentationConnectionState
{ "connecting
", "connected
", "closed
", "terminated
" };
[SecureContext, Exposed=Window]
interface PresentationConnection
: EventTarget {
readonly attribute USVString id
;
readonly attribute USVString url
;
readonly attribute PresentationConnectionState
state
;
undefined close
();
undefined terminate
();
attribute EventHandler onconnect
;
attribute EventHandler onclose
;
attribute EventHandler onterminate
;
// Communication
attribute BinaryType binaryType
;
attribute EventHandler onmessage
;
undefined send
(DOMString message);
undefined send
(Blob data);
undefined send
(ArrayBuffer data);
undefined send
(ArrayBufferView data);
};
id
속성은
프레젠테이션 연결의 프레젠테이션 식별자를 지정합니다.
url
속성은
프레젠테이션 연결의 프레젠테이션 URL을
지정합니다.
state
속성은
프레젠테이션 연결의 현재 상태를 나타냅니다. 연결 상태에 따라 PresentationConnectionState
값 중 하나를 가질 수 있습니다:
connecting
은 사용자 에이전트가 목적지 브라우징 컨텍스트와 프레젠테이션 연결 성립을 시도 중임을 의미합니다. 이 상태가
PresentationConnection
객체가 생성될
때의 초기 상태입니다.
connected
은 프레젠테이션
연결이 성립되어 통신이 가능한 상태임을 의미합니다.
closed
은 프레젠테이션 연결이 닫혔거나 열리지 않은 상태임을 의미합니다. reconnect
호출을 통해 다시 열 수
있습니다. 통신은 불가능합니다.
terminated
은 수신 브라우징 컨텍스트가 종료됨을 의미합니다. 해당 프레젠테이션으로의 프레젠테이션 연결도 종료되어 다시 열 수 없습니다. 통신은 불가능합니다.
connected
상태는 메시지 송수신이 항상 성공함을 의미하지 않으며, 통신 채널이 언제든지 갑자기 닫힐 수 있습니다. 이러한 상황을 최대한 빨리 감지하고 싶은 애플리케이션은 자체적으로
keep-alive 메커니즘을 구현하는 것이 좋습니다.
close
메서드가 PresentationConnection
S에서 호출되면,
사용자 에이전트는 MUST 프레젠테이션 연결 닫기 시작를
S에 대해 closed
를
closeReason으로,
빈 문자열을 closeMessage로 하여 실행해야 합니다.
terminate
메서드가 PresentationConnection
S에서
제어 브라우징 컨텍스트 내에서 호출되면,
사용자 에이전트는 MUST 제어 브라우징 컨텍스트에서 프레젠테이션 종료 알고리즘을
S로 실행해야 합니다.
terminate
메서드가 PresentationConnection
S에서
수신 브라우징 컨텍스트 내에서 호출되면,
사용자 에이전트는 MUST 수신 브라우징 컨텍스트에서 프레젠테이션 종료 알고리즘을
S로 실행해야 합니다.
binaryType
속성은
BinaryType
값 중 하나를 가질 수 있습니다.
PresentationConnection
객체가 생성될 때,
binaryType
속성은 MUST 문자열 "arraybuffer
"로 설정되어야 합니다. 값을 가져올 때 최근 설정된 값을 반환해야 하며,
값을 설정하면 사용자 에이전트는 MUST 해당 속성에 새 값을 설정해야 합니다.
binaryType
속성은
작성자가 이진 데이터를 스크립트에 어떻게 노출할지 제어할 수 있도록 합니다. "blob
"으로 설정하면 이진 데이터가 Blob
형태로 반환되고,
"arraybuffer
"로 설정하면 ArrayBuffer
형태로 반환됩니다.
기본값은 "arraybuffer
"입니다. 이 속성은 문자열 형태로 전송되는 데이터에는 영향을 주지 않습니다.
send
메서드가
PresentationConnection
S에서 호출되면,
사용자 에이전트는 MUST 메시지 전송 알고리즘을 S를 통해 실행해야 합니다.
PresentationConnection
객체
S가
(해당 객체를 소유한 문서가 이동되거나 닫혀서) 폐기되는 동안, S의 프레젠테이션
연결 상태가
connecting
또는
connected
이면,
사용자 에이전트는 MUST
프레젠테이션 연결 닫기 시작을 S에
대해
wentaway
를
closeReason으로,
closeMessage는 빈 문자열로 실행해야 합니다.
사용자 에이전트가 목적지
브라우징 컨텍스트로부터
PresentationConnection
S를
닫으라는 신호를 받으면, MUST 프레젠테이션 연결 닫기를 S에 대해
closed
또는
wentaway
를
closeReason,
closeMessage는 빈 문자열로 실행해야 합니다.
사용자 에이전트가 프레젠테이션 연결 성립을 프레젠테이션 연결을 사용해 수행할 때, MUST 다음 단계를 실행해야 합니다:
PresentationConnection
객체
connecting
이 아니라면,
남은 단계를 모두 중단한다.
connected
로
설정한다.
error
를
closeReason으로, 실패를 설명하는 사람이 읽을 수 있는 메시지를 closeMessage로 하여 실행한다.
DOMString
및 바이너리 페이로드를 신뢰성 있고 순서대로 전달할 수 있어야 하며,
아래 메시지 전송 및
메시지 수신 단계에 설명된 대로 동작해야 합니다.
PresentationConnection
로 메시지 전송
send
를 여러 번 호출할 때는,
메시지가 상대방에 신뢰성 있고 순서대로 전달되어야 합니다.
전송 방식은 신뢰성 모드의 RTCDataChannel
과 동등하게
동작해야 합니다.
프레젠테이션 메시지 데이터는 두 브라우징 컨텍스트 사이에서 전송되는 페이로드 데이터입니다.
프레젠테이션 메시지 타입은 해당 데이터의 타입으로,
text
또는 binary
중 하나입니다.
사용자 에이전트가 메시지 전송 알고리즘을 프레젠테이션 연결을 통해 수행할 때, MUST 다음 단계를 실행해야 합니다:
state
속성이 connected
가 아니라면,
InvalidStateError 예외를 발생시킨다.
ArrayBuffer
, ArrayBufferView
, 또는 Blob
타입이면 binary
로 한다.
messageOrData가 DOMString
타입이면 text
로 한다.
error
를
closeReason으로,
오류 설명이 담긴 closeMessage로 실행한다.
프레젠테이션 연결을 통해 메시지 전송 오류 복구를 돕기 위해, 사용자 에이전트는 어떤 시도가 실패했는지에 대한 상세 정보와 사람이 읽을 수 있는 실패 원인 설명을 closeMessage에 포함하는 것이 좋습니다. closeMessage의 예시 표현:
Unable to send text message (network_error):
"hello"
(DOMString
메시지일 때, "hello"
는 실패한 메시지의 최대 256자)
Unable to send binary message (invalid_message)
(ArrayBuffer
, ArrayBufferView
, Blob
메시지일 때)
PresentationConnection
로 메시지 수신
사용자 에이전트가 원격 측으로부터 프레젠테이션 메시지
데이터와
프레젠테이션 메시지 타입으로 이루어진 전송을 수신했을 때,
MUST 아래 단계를 실행하여 메시지 수신을
PresentationConnection
을 통해 수행해야 합니다:
state
속성이 connected
가 아니면, 남은
단계를 중단한다.
MessageEvent
인터페이스를 사용하며,
이벤트 타입은 message
이고 버블링되지 않으며 취소되지 않는다.
text
이면,
event의 data
속성을 DOMString
타입의
messageData로 초기화한다.
binary
이고
binaryType
속성이
"blob
"이면,
event의 data
속성을 messageData를 raw data로 하는 새로운 Blob
객체로 초기화한다.
binary
이고
binaryType
속성이
"arraybuffer
"이면,
event의 data
속성을 messageData를 내용으로 하는 새로운 ArrayBuffer
객체로
초기화한다.
사용자 에이전트가 presentationConnection을 통해
메시지 수신 중 복구 불가능한 오류를 만난 경우,
MUST 즉시 프레젠테이션 연결 닫기를
presentationConnection에 대해
error
를
closeReason으로 실행해야 합니다.
이때 SHOULD 사람이 읽을 수 있는 오류 설명을 closeMessage로 사용해야 합니다.
WebIDLenum PresentationConnectionCloseReason
{ "error
", "closed
", "wentaway
" };
[SecureContext, Exposed=Window]
interface PresentationConnectionCloseEvent
: Event {
constructor
(DOMString type, PresentationConnectionCloseEventInit
eventInitDict);
readonly attribute PresentationConnectionCloseReason
reason
;
readonly attribute DOMString message
;
};
dictionary PresentationConnectionCloseEventInit
: EventInit {
required PresentationConnectionCloseReason
reason
;
DOMString message
= "";
};
PresentationConnectionCloseEvent
이벤트는
프레젠테이션 연결이 closed
상태에 들어갈 때 발생합니다.
reason
속성은 연결이 종료된 이유를 제공합니다. 다음 값 중 하나를 가질 수 있습니다:
PresentationConnectionCloseReason
:
error
연결 혹은 프레젠테이션과의 통신 수단이 복구 불가능한 오류에 빠졌음을 의미합니다.
closed
연결된 제어 브라우징 컨텍스트 또는 수신 브라우징 컨텍스트가
close()
를 호출했음을 의미합니다.
wentaway
브라우저가 연결을 종료했음을 의미하며, 예를 들어 연결을 소유한 브라우징 컨텍스트가 내비게이션되거나 폐기된 경우 등입니다.
reason
속성이
error
일 때,
사용자 에이전트는 SHOULD message
속성에
통신 채널이 오류에 도달한 방법을 사람이 읽을 수 있도록 기술해야 합니다.
PresentationConnectionCloseEvent
생성자가 호출되면,
사용자 에이전트는 MUST
새로운 PresentationConnectionCloseEvent
객체를 생성하며,
reason
속성은 이 생성자에 전달된 reason
멤버로 설정하고,
message
속성은
message
멤버가 설정되면 그
값으로,
그렇지 않으면 빈 문자열로 설정합니다.
PresentationConnection
닫기
사용자 에이전트가 프레젠테이션 연결 닫기 시작을 수행할 때, MUST 다음을 실행해야 합니다:
PresentationConnectionCloseReason
connecting
또는 connected
가 아니면 남은
단계를 중단한다.
closed
로 설정한다.
PresentationConnection
을 닫으려는 의도를
신호로 전달한다. 이때 closeReason을 함께 전달한다. 사용자 에이전트는 대응하는 PresentationConnection
이 실제로 닫혔다는
확인을 기다릴 필요 없이 다음 단계로 진행해도 된다.
wentaway
가
아니면,
로컬에서 프레젠테이션 연결 닫기 단계를
presentationConnection, closeReason, closeMessage로 실행한다.
사용자 에이전트가 프레젠테이션 연결 닫기를 수행할 때, MUST 다음을 실행해야 합니다:
PresentationConnectionCloseReason
connecting
,
connected
,
closed
중 하나가
아니면 남은 단계를 중단한다.
closed
가 아니면,
closed
로 설정한다.
PresentationConnectionCloseEvent
인터페이스를 사용하여,
reason
속성은 closeReason,
message
속성은 closeMessage로 초기화하여
presentationConnection에서 발생시킨다. 이벤트는 버블링되지 않으며, 취소할 수 없다.
제어 사용자 에이전트가 제어 브라우징 컨텍스트에서 프레젠테이션 종료를 connection을 사용해 수행할 때, MUST 다음 단계를 실행해야 합니다:
connected
또는 connecting
가 아니면
남은 단계를 중단한다.
connected
또는
connecting
이면,
글로벌 태스크를 큐에 추가하여 프레젠테이션 태스크 소스의
known connection의 관련 글로벌 오브젝트에서 아래 단계를 실행한다:
terminated
로
설정한다.
다음 중 하나가 발생하면 수신 사용자 에이전트는 MUST 수신 브라우징 컨텍스트에서 프레젠테이션 종료를 실행해야 합니다:
이는 명시적인 사용자 동작으로 발생할 수 있고, 사용자 에이전트의 정책에 따라 발생할 수도 있습니다. 예를 들어 수신 사용자 에이전트가
PresentationConnection
객체가 모두 30분간 닫힌 경우 프레젠테이션을 종료하도록 설정될 수 있습니다.
수신 사용자 에이전트가 수신 브라우징 컨텍스트에서 프레젠테이션 종료를 실행해야 할 때, MUST 아래 단계를 실행합니다:
connected
이면,
connection을 connectedControllers에 추가한다.
terminated
로
설정한다.
제어 사용자 에이전트마다 종료 확인은 한 번만 전송하면 됩니다.
수신 사용자 에이전트가 프레젠테이션 P에 대해 종료 확인을 전송하고, 해당 확인이 제어 사용자 에이전트에 도달한 경우, 제어 사용자 에이전트는 MUST 아래 단계를 실행해야 합니다:
connected
또는
connecting
가
아니면 남은 단계를 중단한다.
terminated
로
설정한다.
아래는 PresentationConnection
인터페이스를 구현하는
객체가
이벤트 핸들러 IDL 속성으로 지원해야 하는 이벤트 핸들러 및 각 이벤트 핸들러의 이벤트 타입입니다:
이벤트 핸들러 | 이벤트 핸들러 이벤트 타입 |
---|---|
onmessage
|
message
|
onconnect
|
connect
|
onclose
|
close
|
onterminate
|
terminate
|
WebIDL[SecureContext, Exposed=Window]
interface PresentationReceiver
{
readonly attribute Promise<PresentationConnectionList
> connectionList
;
};
PresentationReceiver
인터페이스는 수신 브라우징 컨텍스트가 제어 브라우징 컨텍스트에 접근하고 소통할 수
있도록 합니다. PresentationReceiver
인터페이스는 MUST
수신 사용자 에이전트가 제공하는 수신 브라우징 컨텍스트에서 구현되어야 합니다.
connectionList
속성은 MUST 아래 단계를 실행한 결과를 반환해야 합니다:
null
이 아니면, 그 presentation
controllers promise를 반환하고 남은 단계를 중단한다.
Promise
를 JavaScript realm에서 새로 생성해 할당한다.
null
이 아니면, resolve를 presentation controllers
promise에 대해 presentation
controllers monitor로 실행한다.
사용자 에이전트가 수신 브라우징 컨텍스트 생성을 수행할 때, MUST 아래 단계를 실행해야 합니다:
"denied"
로 설정한다.
Cache
객체 집합을 생성한다.
자식 navigable로, 즉 표시된 문서에 의해 생성된 것들은 수신 브라우징 컨텍스트를 최상위 브라우징 컨텍스트로 가진다. 이들은 위의 2-4번 제한도 MUST 적용받으며, 또한 sandboxed top-level navigation without user activation browsing context flag가 설정되어야 한다. 위 브라우징 컨텍스트들은 5-10번 기능에 대해 동일한 브라우징 상태(스토리지)를 공유해야 한다.
최상위 브라우징 컨텍스트가 새 리소스로 이동하려 시도하고 이동 단계를 실행할 때, MUST 1번 단계를 따라 이동 허용 여부를 판단해야 한다. 또한 MUST NOT 자기 자신을 새로운 리소스로 이동할 수 없으며, 단, fragment identifier로의 이동이나 문서 새로고침만 허용된다.
사용자가 프레젠테이션 디스플레이 선택 시 표시되는 프레젠테이션 URL의 출처에 따라 권한을 부여할 수 있도록 합니다.
최상위 브라우징 컨텍스트가 이동 허용되지 않았다면, SHOULD NOT 새 최상위 브라우징 컨텍스트에서 리소스를 열도록 제공해야 하며, 그 외에는 SHOULD 이동 단계와 일치해야 한다.
Window client와 worker client로, 수신 브라우징 컨텍스트와 그 하위 navigable에 연결된 것들은 서로의 서비스 워커에 노출되면 안 된다.
수신 브라우징 컨텍스트가 종료되면, 그와 브라우징 컨텍스트의 하위 navigable에 연결된 모든 서비스 워커는 MUST 등록 해제 및 종료되어야 한다.
수신 브라우징 컨텍스트와 그 브라우징 컨텍스트의 하위 navigable에 연결된 모든 브라우징 상태(스토리지 포함)
(세션 히스토리, 쿠키 저장소, HTTP 인증 상태, 데이터베이스, 세션 스토리지 영역, 로컬 스토리지 영역,
서비스 워커 등록 리스트 및 Cache
객체)는 MUST 폐기되어야 하며,
다른 브라우징 컨텍스트에서 재사용될 수 없다.
이 알고리즘은 1-UA와 2-UA 프레젠테이션 모두에 대해 상호운용성 있는 동작을 위하여 잘 정의된 환경을 만들고, 2-UA 프레젠테이션에서 사용된 프레젠테이션 디스플레이의 상태 잔존을 최소화하기 위함입니다.
수신 사용자 에이전트는 SHOULD 수신 브라우징 컨텍스트에서 리소스를 가져올 때 HTTP Accept-Language 헤더를 제어 사용자 에이전트의 언어 선호도에 맞게 설정해야 합니다(즉, 제어 사용자 에이전트가 전송했을 Accept-Language와 동일하게). 이는 수신 사용자 에이전트가 프레젠테이션을 폰트 및 로케일 특화 속성을 포함하여 사용자의 선호에 맞게 렌더링하는 데 도움이 됩니다.
프레젠테이션 디스플레이의 운영 환경에 따라 일부 Web API는 설계상 동작하지 않을 수 있으며(예: 사용자 입력 필요), 윈도우 관리 등은 더 이상 동작하지 않을 수 있습니다. 수신 사용자 에이전트는 이를 인지해야 합니다. 또한 모든 모달 UI는 신중히 처리해야 하며, sandboxed modals flag가 수신 브라우징 컨텍스트에 설정되어 대부분의 해당 동작을 차단합니다.
적합성에서 언급된 대로, 한 사용자 에이전트가 제어 사용자 에이전트이자 수신 사용자 에이전트일 수 있고, 이 경우 수신 브라우징 컨텍스트가 추가 프레젠테이션을 생성(즉, 제어 브라우징 컨텍스트 역할도 수행)할 수 있습니다. 웹 개발자는 navigator.presentation.receiver를 활용하여 문서가 수신 브라우징 컨텍스트로 로드된 것임을 감지할 수 있습니다.
WebIDL[SecureContext, Exposed=Window]
interface PresentationConnectionList
: EventTarget {
readonly attribute FrozenArray<PresentationConnection
> connections
;
};
connections
속성은 MUST 프레젠테이션 컨트롤러 집합 내
종료되지 않은 프레젠테이션 연결들을 반환해야 합니다.
수신 사용자 에이전트가 수신 브라우징 컨텍스트에서 제어 브라우징 컨텍스트로부터 들어오는 프레젠테이션 연결 모니터링을 시작할 때, MUST 구현별 메커니즘을 통해 제어 브라우징 컨텍스트로부터 들어오는 연결 요청을 수신 및 승인해야 합니다. 새로운 연결 요청이 제어 브라우징 컨텍스트로부터 수신되면, 수신 사용자 에이전트는 MUST 다음 단계를 실행해야 합니다:
PresentationConnection
S를 생성한다.
connected
로 설정한다.
그렇지 않으면 S의 프레젠테이션 연결 상태를
closed
로 설정하고 남은 단계를
중단한다.
null
이면, 병렬로 아래 단계를 실행한다.
PresentationConnectionList
의
새 인스턴스로
(해당 PresentationReceiver
객체의
JavaScript realm에서) 설정한다.
null
이 아니면,
Presentation API 태스크를 큐에 추가하여
resolve를 presentation controllers
promise에
presentation controllers
monitor로 실행한다.
PresentationConnectionAvailableEvent
인터페이스를 사용하여,
connection
속성을 S로 설정하여 presentation controllers
monitor에서 발생시킨다.
이벤트는 버블링되지 않으며, 취소할 수 없다.
아래는 PresentationConnectionList
인터페이스를 구현하는 객체가 이벤트 핸들러 IDL 속성으로 지원해야 하는 이벤트 핸들러 및 각 이벤트 핸들러의 이벤트 타입입니다:
이벤트 핸들러 | 이벤트 핸들러 이벤트 타입 |
---|---|
onconnectionavailable
|
connectionavailable
|
이 섹션은 규범적이지 않습니다.
PresentationAvailability
객체에서 발생하는 change
이벤트는 브라우저의 로컬 네트워크를 통해 발견되는 프레젠테이션 디스플레이의 존재 여부에 대한 1비트 정보를 노출합니다. 이 정보는 다른 정보와
결합되어 사용자를 지문으로 식별하는 데 사용될 수 있습니다. 하지만 이 정보는 사용자의 로컬 네트워크 환경에 따라 달라지므로 위험이 최소화됩니다.
API는 사용 가능한 프레젠테이션 디스플레이 목록 모니터링을 가능하게 합니다. 사용자 에이전트가 주어진 URL에 대해 프레젠테이션 디스플레이의 호환성과 가용성을 판단하는 방식은 구현 세부사항입니다. 만약 제어 사용자 에이전트가 프레젠테이션 요청 URL을 DIAL 애플리케이션과 매칭하여 가용성을 판단한다면, 이 기능을 통해 사용자의 DIAL 애플리케이션이 프레젠테이션 디스플레이에 설치되어 있는지 사용자 동의 없이 탐지할 수 있습니다.
프레젠테이션은 출처를 넘나들어 접근이 허용됩니다. 프레젠테이션을 생성하는 데 사용된 프레젠테이션 URL과 프레젠테이션 식별자만 있으면, 제어 사용자 에이전트의 어떤 출처에서든 프레젠테이션에 재연결할 수 있습니다. 즉, 프레젠테이션은 특정 오픈 출처에 묶이지 않습니다.
이 설계는 서로 다른 출처의 제어 컨텍스트가 동일한 프레젠테이션 리소스에 연결할 수 있게 합니다. 프레젠테이션 식별자의 보안성은 임의의 출처에서 기존 프레젠테이션에 연결하는 것을 방지합니다.
이 명세는 수신 사용자 에이전트가 자신의 제어 중인 프레젠테이션 집합 정보를 공개하거나,
제어 사용자 에이전트가 다른 기기에서 시작된 프레젠테이션에 재연결하는 것도 허용합니다. 이는
제어 브라우징 컨텍스트가 실행 중인 프레젠테이션의 프레젠테이션 URL과 프레젠테이션 식별자를
사용자, 로컬 저장소, 또는 서버로부터 받아 reconnect
로
연결하는 경우 가능합니다.
이 명세는 프레젠테이션에 연결하는 당사자의 신원에 대해 어떠한 보장도 하지 않습니다. 연결 후에는 프레젠테이션이 애플리케이션 고유 방식으로 연결자의 신원을 추가적으로 검증할 수 있습니다.
예를 들어 프레젠테이션이 send
를 통해 토큰을 요구하여 신원 및 권한을 검증할 수
있습니다.
사용자가 프레젠테이션 디스플레이 선택 단계에서 프레젠테이션 디스플레이 사용 권한을 요청받을 때, 제어 사용자 에이전트는 어떤 출처가 프레젠테이션을 요청하고 있는지와 어떤 출처가 실제로 표시될지 명확하게 보여주어야 합니다.
프레젠테이션을 요청하는 출처를 표시하면, 특히 하위 navigable에서 요청이 시작될 때 사용자가 어떤 콘텐츠가 요청하는지 더 잘 이해할 수 있습니다. 예를 들어, 임베디드 콘텐츠가 사용자를 속여 원하지 않는 프레젠테이션을 시작하도록 유도할 수 있습니다.
프레젠테이션 수명 동안 프레젠테이션의 최상위 출처가 동일하게 유지되도록 사용자 활성화 없는 sandboxed 최상위 내비게이션 브라우징 컨텍스트 플래그가 수신 브라우징 컨텍스트에 설정됩니다.
사용자가 프레젠테이션 연결 시작 시, 사용자는 프레젠테이션을 독점적으로 제어합니다. 하지만 Presentation API는 추가 기기(대개 다른 사용자)가 프레젠테이션에 연결해 제어할 수 있게 허용합니다. 두 번째 기기가 프레젠테이션에 연결되면, 모든 연결된 제어 사용자 에이전트는 브라우저 크롬을 통해 최초 사용자가 독점권을 잃었으며, 이제 여러 컨트롤러가 있다는 사실을 사용자에게 알려야 합니다.
또한 수신 사용자 에이전트가 사용자 입력을 받을 수 있으며 프레젠테이션 디스플레이 역할도 할 수 있다면, 수신 사용자 에이전트는 수신 브라우징 컨텍스트가 원격 제어(즉, 하나 이상의 컨트롤러가 연결됨) 상태임을 브라우저 크롬을 통해 사용자에게 알리는 것이 좋습니다.
프레젠테이션 API는 디스플레이의 "로컬" 의미를 추상화하여, 네트워크로 접근 가능한 디스플레이도 사용자의 기기에 직접 연결된 것처럼 노출합니다. Presentation API는 페이지가 디스플레이에 접근하려면 사용자의 권한을 요구하여, 타인에게 노출될 수 있는 디스플레이에 원하지 않는 콘텐츠가 표시되는 등의 문제를 완화합니다.
프레젠테이션 URL과 프레젠테이션 식별자는 다른 브라우징 컨텍스트에서 프레젠테이션에 연결하는 데 사용될 수 있습니다. 제어 페이지에 공격자가 콘텐츠를 주입할 수 있다면 이 값들이 가로채질 수 있습니다.
프레젠테이션에 표시되는 콘텐츠는 컨트롤러와 다릅니다. 특히, 사용자가 두 컨텍스트 모두에 로그인한 뒤 제어 브라우징 컨텍스트에서 로그아웃해도 수신 브라우징 컨텍스트에서 자동으로 로그아웃되지 않습니다. 인증을 사용하는 애플리케이션은 기기간 통신 시 각별히 주의해야 합니다.
사용자 에이전트가 알고 있는 프레젠테이션 집합은 사용자가 "브라우징 데이터 삭제"를 요청할 때 모두 삭제되어야 합니다.
시크릿 모드(인코그니토)에서는 해당 브라우징 세션의 초기 제어 중인 프레젠테이션 집합이 비어 있어야 합니다. 추가된 프레젠테이션 연결 역시 세션 종료 시 폐기되어야 합니다.
이 명세는 제어 브라우징 컨텍스트와 수신 브라우징 컨텍스트 간 통신 프로토콜을 강제하지 않지만, 대응하는 프레젠테이션 연결 간 메시지의 기밀성과 인증성은 보장해야 합니다.
WebIDLpartial interface Navigator {
[SecureContext, SameObject] readonly attribute Presentation
presentation
;
};
[SecureContext, Exposed=Window]
interface Presentation
{
};
partial interface Presentation
{
attribute PresentationRequest
? defaultRequest
;
};
partial interface Presentation
{
readonly attribute PresentationReceiver
? receiver
;
};
[SecureContext, Exposed=Window]
interface PresentationRequest
: EventTarget {
constructor
(USVString url);
constructor
(sequence<USVString> urls);
Promise<PresentationConnection
> start
();
Promise<PresentationConnection
> reconnect
(USVString presentationId);
Promise<PresentationAvailability
> getAvailability
();
attribute EventHandler onconnectionavailable
;
};
[SecureContext, Exposed=Window]
interface PresentationAvailability
: EventTarget {
readonly attribute boolean value
;
attribute EventHandler onchange
;
};
[SecureContext, Exposed=Window]
interface PresentationConnectionAvailableEvent
: Event {
constructor
(DOMString type, PresentationConnectionAvailableEventInit
eventInitDict);
[SameObject] readonly attribute PresentationConnection
connection
;
};
dictionary PresentationConnectionAvailableEventInit
: EventInit {
required PresentationConnection
connection
;
};
enum PresentationConnectionState
{ "connecting
", "connected
", "closed
", "terminated
" };
[SecureContext, Exposed=Window]
interface PresentationConnection
: EventTarget {
readonly attribute USVString id
;
readonly attribute USVString url
;
readonly attribute PresentationConnectionState
state
;
undefined close
();
undefined terminate
();
attribute EventHandler onconnect
;
attribute EventHandler onclose
;
attribute EventHandler onterminate
;
// Communication
attribute BinaryType binaryType
;
attribute EventHandler onmessage
;
undefined send
(DOMString message);
undefined send
(Blob data);
undefined send
(ArrayBuffer data);
undefined send
(ArrayBufferView data);
};
enum PresentationConnectionCloseReason
{ "error
", "closed
", "wentaway
" };
[SecureContext, Exposed=Window]
interface PresentationConnectionCloseEvent
: Event {
constructor
(DOMString type, PresentationConnectionCloseEventInit
eventInitDict);
readonly attribute PresentationConnectionCloseReason
reason
;
readonly attribute DOMString message
;
};
dictionary PresentationConnectionCloseEventInit
: EventInit {
required PresentationConnectionCloseReason
reason
;
DOMString message
= "";
};
[SecureContext, Exposed=Window]
interface PresentationReceiver
{
readonly attribute Promise<PresentationConnectionList
> connectionList
;
};
[SecureContext, Exposed=Window]
interface PresentationConnectionList
: EventTarget {
readonly attribute FrozenArray<PresentationConnection
> connections
;
attribute EventHandler onconnectionavailable
;
};
binaryType
PresentationConnection
의 attribute
§6.5
close
PresentationConnection
의 method
§6.5
"connected"
PresentationConnectionState
의 enum 값
§6.5
"connecting"
PresentationConnectionState
의 enum 값
§6.5
connectionList
PresentationReceiver
의 attribute
§6.6
connections
PresentationConnectionList
의 attribute
§6.7
defaultRequest
Presentation
의 attribute
§6.2.1
"error"
PresentationConnectionCloseReason
의 enum 값
§6.5.4
getAvailability
PresentationRequest
의 method
§6.4.3
id
PresentationConnection
의 attribute
§6.5
onchange
PresentationAvailability
의 attribute
§6.4
onclose
PresentationConnection
의 attribute
§6.5.9
onconnect
PresentationConnection
의 attribute
§6.5.9
onmessage
PresentationConnection
의 attribute
§6.5.9
onterminate
PresentationConnection
의 attribute
§6.5.9
presentation
Navigator
의 attribute
§6.2
Presentation
인터페이스
§6.2
PresentationAvailability
인터페이스
§6.4
PresentationConnection
인터페이스
§6.5
PresentationConnectionAvailableEvent
인터페이스
§6.4.5
PresentationConnectionAvailableEventInit
딕셔너리
§6.4.5
PresentationConnectionCloseEvent
인터페이스
§6.5.4
PresentationConnectionCloseEventInit
딕셔너리
§6.5.4
PresentationConnectionCloseReason
enum
§6.5.4
PresentationConnectionList
인터페이스
§6.7
PresentationConnectionState
enum
§6.5
PresentationReceiver
인터페이스
§6.6
PresentationRequest
인터페이스
§6.3
receiver
Presentation
의 attribute
§6.2.2
reconnect
PresentationRequest
의 method
§6.3.5
send
PresentationConnection
의 method
§6.5
start
PresentationRequest
의 method
§6.3.2
state
PresentationConnection
의 attribute
§6.5
terminate
PresentationConnection
의 method
§6.5
"terminated"
PresentationConnectionState
의 enum 값
§6.5
url
PresentationConnection
의 attribute
§6.5
value
PresentationAvailability
의 attribute
§6.4
"wentaway"
PresentationConnectionCloseReason
의 enum 값
§6.5.4
Event
인터페이스
EventInit
EventTarget
인터페이스
Blob
인터페이스
Document
용)
EventHandler
localStorage
attribute
(WindowLocalStorage
용)
MessageEvent
인터페이스
reload()
(Location
용)
sessionStorage
attribute
(WindowSessionStorage
용)
Cache
인터페이스
ArrayBuffer
인터페이스
ArrayBufferView
boolean
타입
DOMString
인터페이스
[Exposed]
확장 속성
FrozenArray
인터페이스
InvalidAccessError
예외
InvalidStateError
예외
NotAllowedError
예외
NotFoundError
예외
NotSupportedError
예외
OperationError
예외
Promise
인터페이스
[SameObject]
확장 속성
[SecureContext]
확장 속성
SecurityError
예외
SyntaxError
예외
undefined
타입
USVString
인터페이스
RTCDataChannel
인터페이스
BinaryType
enum
Addison Phillips, Anne Van Kesteren, Anssi Kostiainen, Anton Vayvod, Chris Needham, Christine Runnegar, Daniel Davis, Domenic Denicola, Erik Wilde, François Daoust, 闵洪波 (Hongbo Min), Hongki CHA, Hubert Sablonnière, Hyojin Song, Hyun June Kim, Jean-Claude Dufourd, Joanmarie Diggs, Jonas Sicking, Louay Bassbouss, Mark Watson, Martin Dürst, Matt Hammond, Mike West, Mounir Lamouri, Nick Doty, Oleg Beletski, Philip Jägenstedt, Richard Ishida, Shih-Chiang Chien, Takeshi Kanai, Tobie Langel, Tomoyuki Shimizu, Travis Leithead, 그리고 Wayne Carr에게 편집, 리뷰 및 피드백에 도움을 주셔서 감사드립니다.
AirPlay, HDMI, Chromecast, DLNA, Miracast는 각각 Apple Inc., HDMI Licensing LLC., Google Inc., Digital Living Network Alliance, Wi-Fi Alliance의 등록상표입니다. 이들은 배경 정보로만 언급되며, 이 명세를 구현하기 위해 반드시 사용해야 하는 것은 아닙니다.
이 명세가 제안 권고안(Proposed Recommendation)으로 진전되기 위해, 각 적합성 클래스(제어 사용자 에이전트와 수신 사용자 에이전트)별로 각 기능에 대해 최소 두 개의 독립적이고 상호운용 가능한 구현이 있어야 합니다. 각 기능은 서로 다른 제품 세트에 의해 구현될 수 있으며, 모든 기능을 단일 제품이 모두 구현해야 할 필요는 없습니다. 또한, 제어 사용자 에이전트 적합성 클래스의 구현은 1-UA 모드 하나 이상과 2-UA 모드 하나 이상의 구현을 포함해야 합니다. 2-UA 모드 구현은 http/https가 아닌 프레젠테이션 URL만 지원해도 됩니다. 수신 사용자 에이전트 적합성 클래스의 구현에는 2-UA 모드 구현이 포함될 수 없습니다.
API는 최근에 보안 컨텍스트로 제한되었습니다. 초기 구현에서 비보안 컨텍스트에서의 API 사용 중단(deprecation)에는 시간이 필요합니다. 그룹은 비보안 컨텍스트에서 아직 API를 노출하는 구현이 있더라도, 이를 향후 제한할 일정이 존재한다면 제안 권고안으로의 전환을 요청할 수 있습니다.
이 기준을 위해 다음 용어를 정의합니다:
이 섹션은 규범적이지 않습니다.
본 섹션은 2016년 7월 후보 권고안(Candidate Recommendation) 최초 공개 이후 명세에 이뤄진 변경 사항을 그룹의 이슈 트래커 관련 이슈 링크와 함께 나열합니다.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: