프레젠테이션 API

W3C 후보 권고안 초안

이 문서에 대한 자세한 내용
이 버전:
https://www.w3.org/TR/2025/CRD-presentation-api-20250212/
최신 발행 버전:
https://www.w3.org/TR/presentation-api/
최신 편집본:
https://w3c.github.io/presentation-api/
역사:
https://www.w3.org/standards/history/presentation-api/
커밋 히스토리
구현 보고서:
https://www.w3.org/wiki/Second_Screen/Implementation_Status#Tests
편집자:
(Google)
이전 편집자:
Dominik Röttsches (Intel) (2015년 4월까지)
피드백:
GitHub w3c/presentation-api (풀 리퀘스트, 새로운 이슈, 열린 이슈)
테스트 스위트
GitHub web-platform-tests/presentation-api
wpt.live/presentation-api/

초록

이 명세는 웹 콘텐츠가 프레젠테이션 디스플레이에 접근하고 이를 웹 콘텐츠 표시를 위해 사용할 수 있도록 하는 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 프로세스 문서에 의해 관리됩니다.

1. 소개

이 섹션은 비규범적입니다.

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에서 논의되고 있습니다.

2. 사용 사례 및 요구사항

이 섹션은 비규범적입니다.

사용 사례와 요구사항은 별도의 Presentation API 사용 사례 및 요구사항 문서에 정리되어 있습니다.

3. 적합성

비규범적으로 표시된 섹션뿐만 아니라, 이 명세의 모든 작성 지침, 도표, 예시, 참고 사항도 비규범적입니다. 그 외의 모든 내용은 규범적입니다.

이 문서에서 MAY, MUST, MUST NOT, OPTIONAL, SHOULD, SHOULD NOT 등의 핵심 키워드는 BCP 14 [RFC2119] [RFC8174]에서 설명된 대로, 오직 여기처럼 모두 대문자로 나타날 때만 해석해야 합니다.

알고리즘의 일부로 명령문 형태로 표현된 요구사항(예: "선행 공백 문자를 모두 제거" 또는 "false를 반환하고 이 단계를 종료")은 알고리즘 도입에 사용된 핵심 키워드("MUST", "SHOULD", "MAY" 등) 의미에 따라 해석합니다.

알고리즘이나 특정 단계로 표현된 적합성 요구사항은 결과가 동등하다면 어떤 방식으로든 구현할 수 있습니다. (특히, 이 명세에서 정의된 알고리즘은 따라하기 쉽게 만들었으며 성능을 위해 설계된 것은 아닙니다.)

3.1 적합성 클래스

이 명세는 사용자 에이전트의 두 가지 클래스에 대한 적합성 기준을 설명합니다.

제어 사용자 에이전트

제어 사용자 에이전트 명세를 준수하는 웹 브라우저는 이 명세에서 설명하는 제어 브라우징 컨텍스트를 제공하여 프레젠테이션을 시작하고 제어할 수 있어야 합니다. 이 컨텍스트는 Presentation, PresentationAvailability, PresentationConnection, PresentationConnectionAvailableEvent, PresentationConnectionCloseEvent, 그리고 PresentationRequest 인터페이스를 구현합니다.

수신 사용자 에이전트

수신 사용자 에이전트 명세를 준수하는 웹 브라우저는 이 명세에서 설명하는 수신 브라우징 컨텍스트를 제공하여 프레젠테이션을 렌더링할 수 있어야 합니다. 이 컨텍스트는 Presentation, PresentationConnection, PresentationConnectionAvailableEvent, PresentationConnectionCloseEvent, PresentationConnectionList, 그리고 PresentationReceiver 인터페이스를 구현합니다.

하나의 사용자 에이전트가 제어 사용자 에이전트수신 사용자 에이전트 역할을 모두 할 수 있습니다. 두 브라우징 컨텍스트를 모두 제공하고 필요한 모든 인터페이스를 구현한다면 가능합니다. 이는 동일한 사용자 에이전트가 제어 브라우징 컨텍스트수신 브라우징 컨텍스트를 모두 호스팅할 수 있을 때 발생하며, 이는 API의 1-UA 모드 구현과 같습니다.

사용자 에이전트에 대해 표현된 적합성 요구사항은 제어 사용자 에이전트, 수신 사용자 에이전트 또는 문맥에 따라 두 클래스 모두에 적용될 수 있습니다.

4. 용어

JavaScript realmcurrent realm 용어는 [ECMASCRIPT]에서 정의된 대로 사용됩니다. resolvedrejectedPromise 객체 맥락에서 [ECMASCRIPT]에서 정의된 대로 사용됩니다.

Accept-LanguageHTTP authentication 용어는 [RFC9110]에서 정의된 대로 사용됩니다.

cookie store 용어는 [RFC6265]에서 정의된 대로 사용됩니다.

UUID 용어는 [RFC4122]에서 정의된 대로 사용됩니다.

DIAL 용어는 [DIAL]에서 정의된 대로 사용됩니다.

문서 새로고침은 [HTML]에서 reload() 메소드가 호출될 때 실행되는 단계를 의미합니다.

로컬 저장소 영역localStorage 속성으로 노출되는 저장소 영역을 의미하고, 세션 저장소 영역sessionStorage 속성으로 노출되는 저장소 영역을 의미합니다. [HTML].

이 명세는 다른 명세에서 내보낸 용어를 참조합니다. B.2 참조에 의해 정의된 용어를 참고하세요. 또한 다음과 같은 다른 명세의 내부 개념도 참고합니다:

5. 예시

이 섹션은 비규범적입니다.

이 섹션에서는 Presentation API의 주요 기능 사용법을 보여주는 코드 예시를 제공합니다. 이 예시들에서 controller.html은 컨트롤러를, presentation.html은 프레젠테이션을 구현합니다. 두 페이지 모두 https://example.org 도메인에서 제공됩니다 (https://example.org/controller.htmlhttps://example.org/presentation.html). 이 예시들은 제어 페이지가 한 번에 하나의 프레젠테이션만 관리한다고 가정합니다. 더 자세한 내용은 코드 예시의 주석을 참고하시기 바랍니다.

5.1 프레젠테이션 디스플레이 가용성 모니터링

이 코드는 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>

5.2 새 프레젠테이션 시작

사용자가 presentBtn을 클릭하면, 이 코드는 PresentationRequest의 URL 중 하나를 프레젠테이션으로 요청합니다. start가 호출되면 브라우저는 일반적으로 사용자가 사용 가능한 호환 디스플레이 중 하나를 선택할 수 있도록 다이얼로그를 표시합니다. 선택된 디스플레이와 호환되는 PresentationRequest의 첫 번째 URL이 해당 디스플레이에 표시됩니다.

start 메서드는 프레젠테이션의 상태를 추적하고, 디스플레이에 프레젠테이션 페이지가 로드된 후 메시지를 교환할 수 있는 PresentationConnection 객체로 resolve됩니다.

<!-- controller.html -->
<script>
  presentBtn.onclick = function () {
    // 새 프레젠테이션 시작
    request.start()
      // 프레젠테이션 연결 객체는 성공 시 setConnection에 전달됩니다
      .then(setConnection);
      // 사용자가 선택 다이얼로그를 취소하거나 사용 가능한 스크린이 없는 경우
  };
</script>

5.3 기존 프레젠테이션 다시 연결

프레젠테이션은 원래 프레젠테이션을 시작한 페이지가 PresentationConnection을 닫거나, 내비게이션하거나, 페이지가 닫힌 후에도 계속 실행됩니다. 다른 페이지는 PresentationConnectionid를 사용하여 기존 프레젠테이션에 다시 연결하고 제어를 재개할 수 있습니다. 이는 프레젠테이션을 시작한 동일 브라우저에서만 보장됩니다.

<!-- 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>

5.4 제어 사용자 에이전트에 의한 프레젠테이션 시작

일부 브라우저는 사용자가 제어 페이지와 직접 상호작용하지 않고 프레젠테이션을 시작할 수 있는 방법을 제공합니다. 제어 페이지는 navigator.presentationdefaultRequest 속성을 설정하고, 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>

5.5 연결 상태 모니터링 및 데이터 교환

프레젠테이션이 시작되면 반환된 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>

5.6 들어오는 프레젠테이션 연결 수신

이 코드는 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>

5.7 메시지로 로케일 정보 전달

<!-- 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>

5.8 동일한 제어 페이지에서 두 번째 프레젠테이션 생성

제어 페이지는 서로 다른 두 프레젠테이션 디스플레이에서 두 개의 독립적인 프레젠테이션을 시작하고 제어할 수 있습니다. 이 코드는 위의 예시 첫 번째 프레젠테이션에 두 번째 프레젠테이션을 추가하는 방법을 보여줍니다.

<!-- 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>

6. API

6.1 일반적인 관용구

프레젠테이션 디스플레이는 구현별 연결 기술을 통해 사용자 에이전트에서 사용할 수 있는 그래픽 및/또는 오디오 출력 장치를 의미합니다.

프레젠테이션 연결제어 브라우징 컨텍스트수신 브라우징 컨텍스트를 연결하는 객체이며, 이들 간의 양방향 메시징을 가능하게 합니다. 각 프레젠테이션 연결프레젠테이션 연결 상태, 고유한 프레젠테이션 식별자(다른 프레젠테이션과 구분하기 위한 값), 그리고 프레젠테이션 URL을 가집니다. 이 URL은 URL프레젠테이션을 생성하거나 다시 연결할 때 사용됩니다. 유효한 프레젠테이션 식별자는 영문자/숫자 ASCII 문자로만 구성되며 최소 16자 이상이어야 합니다.

일부 프레젠테이션 디스플레이는 기능, 보안, 하드웨어 제한 등으로 인해 웹 콘텐츠의 일부만 표시할 수 있습니다. 예를 들면 셋톱박스, 스마트 TV, 오디오만 재생 가능한 네트워크 스피커 등이 있습니다. 이러한 디스플레이가 제어 사용자 에이전트가 해당 URL을 표시할 수 있음을 합리적으로 보장할 수 있다면 이 디스플레이는 해당 프레젠테이션 URL에 대해 사용 가능한 프레젠테이션 디스플레이입니다.

제어 브라우징 컨텍스트(줄여서 컨트롤러)는 브라우징 컨텍스트로, start 또는 reconnect를 호출하여 프레젠테이션에 연결하거나, connectionavailable 이벤트를 통해 프레젠테이션 연결을 받은 경우를 의미합니다. PresentationRequest 관련 알고리즘에서는, 제어 브라우징 컨텍스트브라우징 컨텍스트JavaScript realmPresentationRequest를 생성할 때 사용된 것을 의미합니다.

수신 브라우징 컨텍스트(줄여서 프레젠테이션)는 프레젠테이션 디스플레이에 렌더링을 담당하는 브라우징 컨텍스트입니다. 수신 브라우징 컨텍스트제어 브라우징 컨텍스트와 동일한 사용자 에이전트에 있을 수도, 다른 사용자 에이전트에 있을 수도 있습니다. 수신 브라우징 컨텍스트수신 브라우징 컨텍스트 생성 단계를 따라 생성됩니다.

절차에서는 목적지 브라우징 컨텍스트가, 해당 절차가 제어 브라우징 컨텍스트에서 시작된 경우 수신 브라우징 컨텍스트이고, 수신 브라우징 컨텍스트에서 시작된 경우 제어 브라우징 컨텍스트입니다.

제어 중인 프레젠테이션 집합(초기값: 비어 있음)은 제어 브라우징 컨텍스트에서 제어 사용자 에이전트(또는 해당 사용자 에이전트 내 특정 사용자 프로필)를 위해 생성된 프레젠테이션 연결을 포함합니다. 제어 중인 프레젠테이션 집합은 내부적으로 PresentationConnection 객체 목록으로 표현됩니다. 이 객체들은 실제 프레젠테이션 연결을 나타냅니다. 여러 PresentationConnection 객체가 동일한 프레젠테이션 URL프레젠테이션 식별자를 공유할 수 있지만, 하나의 PresentationConnection만이 특정 프레젠테이션 URL프레젠테이션 식별자를 특정 제어 브라우징 컨텍스트에서 가질 수 있습니다.

프레젠테이션 컨트롤러 집합(초기값: 비어 있음)은 수신 브라우징 컨텍스트에서 수신 사용자 에이전트를 위해 생성된 프레젠테이션 연결을 포함합니다. 프레젠테이션 컨트롤러 집합은 내부적으로 PresentationConnection 객체 목록으로 표현됩니다. 이 객체들은 실제 프레젠테이션 연결을 나타냅니다. 이 집합의 모든 프레젠테이션 연결은 동일한 프레젠테이션 URL프레젠테이션 식별자를 공유합니다.

수신 브라우징 컨텍스트에서는 프레젠테이션 컨트롤러 모니터(초기값: null)가 현재 프레젠테이션 컨트롤러 집합을 수신 애플리케이션에 노출합니다. 프레젠테이션 컨트롤러 모니터PresentationConnectionList로 표현됩니다.

수신 브라우징 컨텍스트에서는 프레젠테이션 컨트롤러 프라미스(초기값: null)가 최초 프레젠테이션 연결이 성립되면 프레젠테이션 컨트롤러 모니터를 제공합니다. 프레젠테이션 컨트롤러 프라미스Promise로, 프레젠테이션 컨트롤러 모니터와 함께 resolve됩니다.

제어 브라우징 컨텍스트에서는 기본 프레젠테이션 요청(초기값: null)이 브라우저 크롬에서 사용자가 프레젠테이션 연결을 시작하고자 할 때 사용할 요청을 나타냅니다.

이 명세에서 언급된 태스크의 태스크 소스프레젠테이션 태스크 소스입니다.

알고리즘이 Presentation API 태스크를 큐에 추가T 할 때, 사용자 에이전트MUST 글로벌 태스크 T프레젠테이션 태스크 소스에 추가해야 하며, 글로벌 오브젝트현재 realm의 것을 사용합니다.

별도의 명시가 없는 한, 알고리즘 단계에서 생성된 스크립트 객체의 JavaScript realm현재 realm입니다.

6.2 인터페이스 Presentation

WebIDLpartial interface Navigator {
  [SecureContext, SameObject] readonly attribute Presentation presentation;
};

[SecureContext, Exposed=Window]
interface Presentation {
};

presentation 속성은 Presentation 인터페이스의 인스턴스를 가져올 때 사용됩니다. 이 속성은 MUST Presentation 인스턴스를 반환해야 합니다.

6.2.1 제어 사용자 에이전트

제어 사용자 에이전트MUST 다음 partial interface를 구현해야 합니다:

WebIDLpartial interface Presentation {
  attribute PresentationRequest? defaultRequest;
};

defaultRequest 속성은 MUST 기본 프레젠테이션 요청이 있으면 반환하고, 없으면 null을 반환해야 합니다. 값을 설정할 때 기본 프레젠테이션 요청을 새 값으로 MUST 설정해야 합니다.

제어 사용자 에이전트SHOULD 사용자가 버튼 클릭 등 브라우저 크롬에서 의도를 명확히 했을 때만 기본 프레젠테이션 요청을 사용해 프레젠테이션을 시작해야 합니다.

기본 프레젠테이션 요청을 사용해 프레젠테이션을 시작하려면, 제어 사용자 에이전트MUST 기본 프레젠테이션 요청으로 프레젠테이션 시작 단계를 따라야 합니다.

기본 프레젠테이션 요청을 사용한 프레젠테이션 시작 지원은 OPTIONAL입니다.

참고
제어 사용자 에이전트기본 프레젠테이션 요청으로 프레젠테이션 시작을 지원하지 않는다면, 해당 사용자 에이전트는 defaultRequest에 설정된 값을 무시해야 합니다.

6.2.2 수신 사용자 에이전트

수신 사용자 에이전트MUST 다음 partial interface를 구현해야 합니다:

WebIDLpartial interface Presentation {
  readonly attribute PresentationReceiver? receiver;
};

receiver 속성은 MUST PresentationReceiver 인스턴스를 반환해야 하며, 이는 수신 브라우징 컨텍스트와 연결되어 있고, 수신 사용자 에이전트수신 브라우징 컨텍스트생성할 때 만듭니다. 그 외의 브라우징 컨텍스트(수신 브라우징 컨텍스트의 자식 navigable 포함)에서는 MUST null을 반환해야 합니다.

참고

웹 개발자는 navigator.presentation.receiver를 사용하여 문서가 프레젠테이션으로 로드되었는지 감지할 수 있습니다.

6.3 인터페이스 PresentationRequest

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();

  attribute EventHandler onconnectionavailable;
};

PresentationRequest 객체는 제어 브라우징 컨텍스트에서 프레젠테이션을 시작하거나 다시 연결하고자 할 때의 요청과 연결됩니다. PresentationRequest 객체는 MUST 제어 사용자 에이전트가 제공하는 제어 브라우징 컨텍스트에서 구현되어야 합니다.

PresentationRequest가 생성될 때, 지정된 urlsMUST 프레젠테이션 요청 URL의 목록으로 사용되어야 하며, 각각은 해당 PresentationRequest 인스턴스의 가능한 프레젠테이션 URL입니다.

6.3.1 PresentationRequest 생성

PresentationRequest 생성자가 호출되면, 제어 사용자 에이전트MUST 다음 단계를 실행해야 합니다:

입력
url 또는 urls, 프레젠테이션 요청 URL
출력
PresentationRequest 객체
  1. 문서 객체의 active sandboxing flag setsandboxed presentation browsing context flag 가 설정되어 있으면, SecurityError를 발생시키고 단계를 중단한다.
  2. urls가 빈 시퀀스라면, throw NotSupportedError 예외를 발생시키고 모든 남은 단계를 중단한다.
  3. 단일 url이 제공된 경우, urls를 그 url 하나만 담은 배열로 한다.
  4. presentationUrls를 빈 URL 리스트로 한다.
  5. urls의 각 URL U에 대해:
    1. A를 현재 settings object가 지정한 API base URL에 대해 U를 파싱한 결과의 절대 URL로 한다.
    2. URL 파싱 알고리즘이 실패했다면, throw SyntaxError 예외를 발생시키고 모든 남은 단계를 중단한다.
    3. A의 scheme이 제어 사용자 에이전트에서 지원된다면, presentationUrlsA를 추가한다.
  6. presentationUrls가 빈 리스트라면, NotSupportedError를 발생시키고 모든 남은 단계를 중단한다.
  7. presentationUrls의 어떤 멤버라도 잠재적으로 신뢰할 수 있는 URL이 아니라면, SecurityError를 발생시키고 단계를 중단한다.
  8. presentationUrls프레젠테이션 요청 URL로 하여 새 PresentationRequest 객체를 생성하여 반환한다.

6.3.2 프레젠테이션 디스플레이 선택

start 메서드가 호출될 때, 사용자 에이전트MUST 프레젠테이션 디스플레이를 선택하는 다음 단계를 실행해야 합니다: 프레젠테이션 디스플레이 선택.

입력
presentationRequest, PresentationRequest 객체로, start를 호출받았다.
출력
Promise
  1. 문서의 active windowtransient activation이 없다면, PromiseInvalidAccessError 예외와 함께 reject한 뒤 단계를 중단한다.
  2. topContext최상위 브라우징 컨텍스트로 한다.
  3. topContext 또는 그 하위 navigable의 어떤 브라우징 컨텍스트에서라도 이전 start 호출로 unsettled Promise가 있다면, 새 PromiseOperationError 예외와 함께 reject한 뒤 모든 남은 단계를 중단한다.
  4. P를 새 Promise로 한다.
  5. P를 반환하되, 다음 단계는 병렬로 계속 실행한다.
  6. 사용자 에이전트사용 가능한 프레젠테이션 디스플레이 목록 모니터링을 하고 있지 않다면, 사용 가능한 프레젠테이션 디스플레이 목록 모니터링 단계를 병렬로 실행한다.
  7. presentationUrls프레젠테이션 요청 URL로 한다.
  8. 프레젠테이션 디스플레이 활용 및 디스플레이 선택에 대해 사용자 권한을 요청한다.
  9. 다음 중 하나가 참이라면:
    1. 사용 가능한 프레젠테이션 디스플레이 목록이 비어 있고, 사용자 권한 요청이 완료되기 전까지도 계속 비어 있을 것이다.
    2. 사용 가능한 프레젠테이션 디스플레이 목록의 어떤 멤버도 presentationUrls의 어떤 멤버에 대해서도 사용 가능한 프레젠테이션 디스플레이가 아니다.
    다음 단계를 실행한다:
    1. Presentation API 태스크를 큐에 추가하여 Preject하고, NotFoundError 예외를 전달한다.
    2. 모든 남은 단계를 중단한다.
  10. 사용자가 디스플레이 사용 권한을 거부하면, Presentation API 태스크를 큐에 추가하여 PNotAllowedError 예외와 함께 reject하고, 모든 남은 단계를 중단한다.
  11. 그렇지 않고 사용자가 디스플레이 사용 권한을 허용하면, D를 해당 디스플레이로 한다.
  12. 프레젠테이션 연결 시작 단계를 presentationRequest, D, P로 실행한다.
참고
권한 요청과 디스플레이 선택 구현에 대한 세부 사항은 사용자 에이전트에 맡깁니다. 예를 들어, 사용자에게 다이얼로그를 표시하여 사용 가능한 디스플레이를 선택(허용)하거나 선택을 취소(거부)하도록 할 수 있습니다. 구현자에게는 사용 가능한 디스플레이가 현재 사용 중인지 사용자에게 보여주어, 여러 디스플레이를 활용하는 프레젠테이션에 도움이 되도록 권장합니다.
참고
수신 사용자 에이전트는 "거실 TV"와 같이 사용자 친화적인 이름을 프레젠테이션 디스플레이에 광고하여 사용자가 원하는 디스플레이를 선택할 수 있도록 하는 것이 권장됩니다. 수신 사용자 에이전트 구현자는 사용자 친화적 이름의 로케일과 의도된 텍스트 방향도 광고하는 것이 좋습니다. 제어 사용자 에이전트 구현자는 로케일과 텍스트 방향이 알려진 경우 이를 사용해 사용자 친화적 이름을 렌더링하는 것이 좋습니다.

6.3.3 기본 프레젠테이션 요청으로 프레젠테이션 시작

사용자가 브라우저 크롬(전용 버튼, 사용자 제스처 또는 기타 신호)을 통해 문서를 프레젠테이션 디스플레이에 표시하겠다는 의사를 표현하면, 해당 사용자 에이전트는 MUST 아래 단계를 실행하여 기본 프레젠테이션 요청으로 프레젠테이션 시작을 수행해야 합니다. 문서에 기본 프레젠테이션 요청이 설정되어 있지 않으면, 이 단계들은 MUST 실행되지 않아야 합니다.

입력
W, 사용자가 프레젠테이션 시작 의사를 표현한 문서
presentationRequest, W에 설정된 navigator.presentation.defaultRequest의 null이 아닌 값
D, 프레젠테이션 대상으로 지정된 프레젠테이션 디스플레이
  1. 아래 단계를 병렬로 실행한다.
  2. presentationUrlspresentationRequest프레젠테이션 요청 URL로 한다.
  3. DpresentationRequest의 어떤 프레젠테이션 요청 URL에 대해서도 사용 가능한 프레젠테이션 디스플레이가 아니라면 단계를 중단한다.
  4. presentationRequestD프레젠테이션 연결 시작 단계를 실행한다.
참고
기본 프레젠테이션 요청으로 프레젠테이션 시작 시, 제어 사용자 에이전트는 사용자가 프레젠테이션 요청 및 원하는 프레젠테이션 디스플레이를 동일한 사용자 제스처로 선택하게 허용할 수 있습니다. 예를 들어, 브라우저 크롬에서 메뉴에서 디스플레이를 선택하거나 근거리 무선통신(NFC)이 지원되는 디스플레이를 탭할 수 있습니다.

6.3.4 프레젠테이션 연결 시작

사용자 에이전트프레젠테이션 연결 시작을 수행해야 할 때, MUST 아래 단계를 실행합니다:

입력
presentationRequest, 프레젠테이션 연결을 시작하는 데 사용되는 PresentationRequest
D, 선택된 프레젠테이션 디스플레이
P, 새 프레젠테이션 연결로 resolve될 선택적 Promise
  1. Assert: 이 단계는 병렬로 실행 중임을 보장한다.
  2. I제어 중인 프레젠테이션 집합의 모든 알려진 프레젠테이션 연결에 대한 프레젠테이션 식별자 중에서 고유한 유효한 프레젠테이션 식별자로 한다. 지문 채취 방지를 위해, 구현은 SHOULD 프레젠테이션 식별자를 [rfc4122]의 4.4 또는 4.5 형식에 따라 생성된 UUID로 설정해야 합니다.
  3. PresentationConnection S를 생성한다.
  4. S프레젠테이션 식별자I로 설정한다.
  5. presentationUrlspresentationRequest프레젠테이션 요청 URL로 한다.
  6. S프레젠테이션 URLpresentationUrls 중에서 사용 가능한 프레젠테이션 디스플레이 목록에 (presentationUrl, D) 항목이 존재하는 첫 번째 presentationUrl로 설정한다.
  7. S프레젠테이션 연결 상태connecting으로 설정한다.
  8. S제어 중인 프레젠테이션 집합에 추가한다.
  9. P가 제공된 경우, Presentation API 태스크를 큐에 추가하여 PS로 resolve한다.
  10. Presentation API 태스크를 큐에 추가하여 connectionavailable 이벤트PresentationConnectionAvailableEvent 인터페이스를 사용하여, connection 속성을 S로 초기화하여 presentationRequest에서 발생시킨다. 이 이벤트는 버블링되지 않으며 취소할 수 없다.
  11. U를 D에 연결된 사용자 에이전트로 한다.
  12. 다음 단계가 실패하면, 모든 남은 단계를 중단하고 프레젠테이션 연결 닫기S에 대해 errorcloseReason으로, 실패 설명의 사람이 읽을 수 있는 메시지를 closeMessage로 하여 수행한다.
  13. 구현별 메커니즘을 사용해 U에게 D, presentationUrl, I를 매개변수로 수신 브라우징 컨텍스트 생성을 수행하도록 알린다.
  14. 프레젠테이션 연결 성립S로 실행한다.
참고
presentationUrl은 로컬 또는 원격 사용자 에이전트에서 접근 가능한 리소스를 지정해야 합니다. 이 명세는 http 또는 https 스킴을 사용하는 presentationUrl에 대한 동작을 정의하며, 그 외 스킴은 정의하지 않습니다.

6.3.5 프레젠테이션에 다시 연결하기

reconnect 메서드가 호출되면, 사용자 에이전트MUST 아래 단계를 실행하여 프레젠테이션에 다시 연결해야 합니다:

입력
presentationRequest, PresentationRequest 객체로, reconnect 메서드가 호출된 대상
presentationId, 유효한 프레젠테이션 식별자
출력
P, 새 Promise
  1. P를 새 Promise로 한다.
  2. P를 반환하되, 아래 단계들은 병렬로 계속 실행한다.
  3. 제어 중인 프레젠테이션 집합에서 다음 조건을 모두 만족하는 PresentationConnection을 검색한다:
  4. 이러한 PresentationConnection이 존재하면, 다음 단계를 실행한다:
    1. existingConnection을 해당 PresentationConnection로 한다.
    2. Presentation API 태스크를 큐에 추가하여 PexistingConnection으로 resolve한다.
    3. existingConnection프레젠테이션 연결 상태connecting 또는 connected이면, 남은 단계를 모두 중단한다.
    4. existingConnection프레젠테이션 연결 상태connecting으로 설정한다.
    5. 프레젠테이션 연결 성립existingConnection으로 실행한다.
    6. 모든 남은 단계를 중단한다.
  5. 제어 중인 프레젠테이션 집합에서 다음 조건을 모두 만족하는 첫 번째 PresentationConnection을 검색한다:
  6. 이러한 PresentationConnection이 존재하면, 다음 단계를 실행한다:
    1. existingConnection을 해당 PresentationConnection로 한다.
    2. PresentationConnection newConnection을 생성한다.
    3. newConnection프레젠테이션 식별자presentationId로 설정한다.
    4. newConnection프레젠테이션 URLexistingConnection프레젠테이션 URL로 설정한다.
    5. newConnection프레젠테이션 연결 상태connecting으로 설정한다.
    6. newConnection제어 중인 프레젠테이션 집합에 추가한다.
    7. Presentation API 태스크를 큐에 추가하여 PnewConnection으로 resolve한다.
    8. Presentation API 태스크를 큐에 추가하여 connectionavailable 이벤트PresentationConnectionAvailableEvent 인터페이스를 사용하여, connection 속성을 newConnection으로 초기화하여 presentationRequest에서 발생시킨다. 이벤트는 버블링되지 않고 취소할 수 없다.
    9. 프레젠테이션 연결 성립newConnection으로 실행한다.
    10. 모든 남은 단계를 중단한다.
  7. Presentation API 태스크를 큐에 추가하여 Preject하고, NotFoundError 예외를 전달한다.

6.3.6 이벤트 핸들러

아래는 PresentationRequest 인터페이스를 구현하는 객체가 이벤트 핸들러 IDL 속성으로 지원해야 하는 이벤트 핸들러 및 각 이벤트 핸들러의 이벤트 타입입니다:

이벤트 핸들러 이벤트 핸들러 이벤트 타입
onconnectionavailable connectionavailable

6.4 인터페이스 PresentationAvailability

WebIDL[SecureContext, Exposed=Window]
interface PresentationAvailability : EventTarget {
  readonly attribute boolean value;

  attribute EventHandler onchange;
};

PresentationAvailability 객체는 프레젠테이션 요청에 대한 프레젠테이션 디스플레이 가용성을 노출합니다. 프레젠테이션 디스플레이 가용성PresentationRequest에 대해 현재 해당 요청의 프레젠테이션 요청 URL 중 하나 이상을 지원하는 사용 가능한 프레젠테이션 디스플레이가 존재하는지 여부를 저장합니다.

프레젠테이션 요청에 대한 프레젠테이션 디스플레이 가용성은 ECMAScript 코드에서 PresentationAvailability 객체를 관찰할 수 없을 때 가비지 컬렉션 대상이 됩니다.

제어 사용자 에이전트가 백그라운드에서(start의 대기 중인 요청 없이) 사용 가능한 프레젠테이션 디스플레이 목록 모니터링을 할 수 있다면, PresentationAvailability 객체는 MUST 제어 브라우징 컨텍스트에서 구현되어야 합니다.

value 속성은 MUST 마지막으로 설정된 값을 반환해야 합니다. 값은 사용 가능한 프레젠테이션 디스플레이 목록 모니터링 알고리즘에서 초기화 및 업데이트됩니다.

onchange 속성은 이벤트 핸들러이며, 해당 이벤트 핸들러 이벤트 타입change입니다.

6.4.1 프레젠테이션 가용성 객체 집합

사용자 에이전트MUST 프레젠테이션 가용성 객체 집합을 관리해야 하며, 이는 getAvailability 메서드로 생성됩니다. 프레젠테이션 가용성 객체 집합은 초기값이 빈 튜플 집합 (A, availabilityUrls)로 표현되며, 여기서:

  1. A는 live PresentationAvailability 객체
  2. availabilityUrlsPresentationRequest에 대해 getAvailability가 호출될 때의 프레젠테이션 요청 URL 목록

6.4.2 사용 가능한 프레젠테이션 디스플레이 목록

사용자 에이전트MUST 사용 가능한 프레젠테이션 디스플레이 목록을 관리해야 합니다. 사용 가능한 프레젠테이션 디스플레이 목록은 튜플 리스트 (availabilityUrl, display)로 표현됩니다. 이 리스트의 항목은 display가 현재 availabilityUrl에 대해 사용 가능한 프레젠테이션 디스플레이임을 의미합니다. 이 프레젠테이션 디스플레이 리스트는 새 프레젠테이션 시작에 사용될 수 있으며, 구현별 디스커버리 메커니즘에 따라 채워집니다. 목록은 사용 가능한 프레젠테이션 디스플레이 목록 모니터링 알고리즘의 최신 결과로 설정됩니다.

프레젠테이션 가용성 객체 집합이 비어 있지 않은 동안, 사용자 에이전트MAY 사용 가능한 프레젠테이션 디스플레이 목록 모니터링을 지속적으로 수행하여, 페이지가 value 속성을 활용해 실제 사용 가능한 디스플레이가 있을 때만 프레젠테이션을 제공할 수 있게 합니다. 단, 사용자 에이전트가 백그라운드에서 지속적 가용성 모니터링을 지원하지 않을 수도 있습니다(플랫폼 또는 전력 소비 제약 등). 이 경우 PromisegetAvailability에서 reject되고, 사용 가능한 프레젠테이션 디스플레이 목록 모니터링 알고리즘은 프레젠테이션 디스플레이 선택 알고리즘의 일부로만 실행됩니다.

프레젠테이션 가용성 객체 집합이 비어 있으면(즉, 모니터링 중인 availabilityUrls가 없다면) 사용자 에이전트는 SHOULD NOT 사용 가능한 프레젠테이션 디스플레이 목록 모니터링을 수행하여 전력 절감 비기능 요구사항을 만족해야 합니다. 추가 전력 절감을 위해 사용자 에이전트PresentationAvailability 객체를 가진 페이지가 포그라운드에 있는지 여부도 추적할 수 있습니다. 이를 활용해 구현별 디스커버리 동작을 재개 또는 중지할 수 있습니다.

6.4.3 프레젠테이션 디스플레이 가용성 정보 얻기

getAvailability 메서드가 호출되면, 사용자 에이전트는 MUST 아래 단계를 실행합니다:

입력
presentationRequest, PresentationRequest 객체로, getAvailability가 호출됨
출력
Promise
  1. PpresentationRequestJavaScript realm에서 생성된 새 Promise로 한다.
  2. P를 반환하되, 아래 단계는 병렬로 계속 실행한다.
  3. 사용자 에이전트가 백그라운드에서 사용 가능한 프레젠테이션 디스플레이 목록 모니터링을 지속적으로 수행할 수 없다면, 나중에 연결을 시작할 때 프레젠테이션 디스플레이를 발견할 수 있다면 다음을 실행한다:
    1. Presentation API 태스크를 큐에 추가하여 PNotSupportedError 예외로 reject한다.
    2. 모든 남은 단계를 중단한다.
  4. presentationRequest프레젠테이션 디스플레이 가용성null이 아니면:
    1. Presentation API 태스크를 큐에 추가하여 P를 해당 요청의 프레젠테이션 디스플레이 가용성으로 resolve한다.
    2. 모든 남은 단계를 중단한다.
  5. presentationRequest프레젠테이션 디스플레이 가용성presentationRequestJavaScript realm에서 생성된 새 PresentationAvailability 객체로 설정하고, A를 해당 객체로 한다.
  6. 튜플 (A, presentationUrls)을 생성하여 프레젠테이션 가용성 객체 집합에 추가한다.
  7. 사용 가능한 프레젠테이션 디스플레이 목록 모니터링 알고리즘을 실행한다.
    참고
    모니터링 알고리즘은 직전 단계 이후 추가된 튜플을 처리하기 위해 최소 한 번 더 실행되어야 합니다.
  8. Presentation API 태스크를 큐에 추가하여 PA로 resolve한다.

6.4.4 사용 가능한 프레젠테이션 디스플레이 목록 모니터링

프레젠테이션 가용성 객체 집합이 비어 있지 않거나, 프레젠테이션 디스플레이 선택의 대기 중인 요청이 있다면, 사용자 에이전트MUST 아래 단계를 실행하여 사용 가능한 프레젠테이션 디스플레이 목록 모니터링을 수행해야 합니다:

  1. Assert: 이 단계는 병렬로 실행됨을 보장합니다.
  2. availabilitySet프레젠테이션 가용성 객체 집합의 얕은 복사본으로 한다.
  3. 프레젠테이션 디스플레이 선택의 대기 중인 요청이 있고, 해당 PresentationRequest프레젠테이션 디스플레이 가용성null이면, 아래 하위 단계를 실행한다:
    1. A를 새 PresentationAvailability 객체로 한다.
    2. 튜플 (A, presentationUrls)을 생성하며, presentationUrls는 해당 PresentationRequest프레젠테이션 요청 URL이다. 이를 availabilitySet에 추가한다.
  4. newDisplays를 빈 리스트로 한다.
  5. 사용자 에이전트프레젠테이션 디스플레이를 검색할 수 없다면(예시: 사용자가 해당 기능을 비활성화함), 다음 단계를 건너뛴다.
  6. 구현별 메커니즘을 사용하여 프레젠테이션 디스플레이를 검색하고, newDisplays에 그 리스트를 설정한다.
  7. 사용 가능한 프레젠테이션 디스플레이 목록을 빈 리스트로 설정한다.
  8. availabilitySet의 각 멤버 (A, availabilityUrls)에 대해 아래 단계를 실행한다:
    1. previousAvailabilityAvalue 속성 값으로 한다.
    2. newAvailabilityfalse로 한다.
    3. availabilityUrls의 각 availabilityUrl에 대해:
      1. newDisplays의 각 display에 대해, displayavailabilityUrl에 대해 사용 가능한 프레젠테이션 디스플레이라면, 아래 단계를 실행한다:
        1. 동일한 튜플이 이미 없으면 사용 가능한 프레젠테이션 디스플레이 목록(availabilityUrl, display) 튜플을 추가한다.
        2. newAvailabilitytrue로 설정한다.
    4. Avalue 속성이 아직 초기화되지 않았다면, Avalue 속성을 newAvailability로 설정하고, 다음 단계를 건너뛴다.
    5. previousAvailabilitynewAvailability가 다르면, Presentation API 태스크를 큐에 추가하여 아래 단계를 실행한다:
      1. Avalue 속성을 newAvailability로 설정한다.
      2. change 이벤트 발생A에서 실행한다.
참고
제어 사용자 에이전트는 모니터링 주기를 자유롭게 결정할 수 있으며, 사용 가능한 프레젠테이션 디스플레이 목록 모니터링 요청을 startgetAvailability에서 그룹화하거나, 여러 브라우징 컨텍스트 전체에서 집계할 수 있습니다.

프레젠테이션 디스플레이 가용성 객체가 가비지 컬렉션 대상이 되면, 사용자 에이전트SHOULD 다음 단계를 실행해야 합니다:

  1. A를 새로 사망한 PresentationAvailability 객체로 한다.
  2. 프레젠테이션 가용성 객체 집합에서 (A, availabilityUrl) 항목을 찾아 제거한다.
  3. 이제 프레젠테이션 가용성 객체 집합이 비어 있고, 프레젠테이션 디스플레이 선택의 대기 중인 요청이 없다면, 전력 절감을 위해 사용 가능한 프레젠테이션 디스플레이 목록 모니터링의 대기 중인 태스크를 취소하고, 사용 가능한 프레젠테이션 디스플레이 목록을 빈 리스트로 설정한다.
참고
프레젠테이션 디스플레이의 가용성 모니터링과 주어진 URL에 대한 호환성 판별 메커니즘은 사용자 에이전트에 맡깁니다.

6.4.5 인터페이스 PresentationConnectionAvailableEvent

WebIDL[SecureContext, Exposed=Window]
interface PresentationConnectionAvailableEvent : Event {
  constructor(DOMString type, PresentationConnectionAvailableEventInit eventInitDict);
  [SameObject] readonly attribute PresentationConnection connection;
};

dictionary PresentationConnectionAvailableEventInit : EventInit {
  required PresentationConnection connection;
};

제어 사용자 에이전트는 연결이 객체에 대해 생성될 때 이벤트를 발생시킵니다. 이벤트 이름은 connectionavailable이고, PresentationRequest에 연결된 인스턴스에서 발생합니다. 이 이벤트는 PresentationRequest 인스턴스에서 PresentationConnectionAvailableEvent 인터페이스를 사용하여 발생하고, connection 속성은 새로 생성된 PresentationConnection 객체로 설정됩니다. 이 이벤트는 컨트롤러에 대해 생성된 각 연결에 대해 발생합니다. 이는 컨트롤러start 또는 reconnect를 호출하거나, 제어 사용자 에이전트defaultRequest를 통해 컨트롤러를 대신하여 연결을 생성할 때 발생합니다.

수신 사용자 에이전트는 들어오는 연결이 생성될 때 이벤트를 발생시킵니다. 이벤트 이름은 connectionavailable이며, PresentationReceiver에 대해 들어오는 연결이 생성될 때 발생합니다. 이 이벤트는 프레젠테이션 컨트롤러 모니터에서, PresentationConnectionAvailableEvent 인터페이스를 사용하여 발생하며, connection 속성은 생성된 PresentationConnection 객체로 설정됩니다. 이 이벤트는 들어오는 프레젠테이션 연결 모니터링 시 생성되는 모든 연결에 대해 발생합니다.

connection 속성은 MUST PresentationConnection 객체가 생성될 때 설정된 값을 반환해야 합니다.

PresentationConnectionAvailableEvent 생성자가 호출되면, 사용자 에이전트MUST PresentationConnectionAvailableEvent 객체를 생성하며, connection 속성은 생성자에 전달된 connection 멤버와, PresentationConnectionAvailableEventInit 객체에서 설정합니다.

6.5 인터페이스 PresentationConnection

프레젠테이션 연결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 값 중 하나를 가질 수 있습니다:

참고
connected 상태는 메시지 송수신이 항상 성공함을 의미하지 않으며, 통신 채널이 언제든지 갑자기 닫힐 수 있습니다. 이러한 상황을 최대한 빨리 감지하고 싶은 애플리케이션은 자체적으로 keep-alive 메커니즘을 구현하는 것이 좋습니다.

close 메서드가 PresentationConnection S에서 호출되면, 사용자 에이전트MUST 프레젠테이션 연결 닫기 시작S에 대해 closedcloseReason으로, 빈 문자열을 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에 대해 wentawaycloseReason으로, closeMessage는 빈 문자열로 실행해야 합니다.

사용자 에이전트목적지 브라우징 컨텍스트로부터 PresentationConnection S를 닫으라는 신호를 받으면, MUST 프레젠테이션 연결 닫기S에 대해 closed 또는 wentawaycloseReason, closeMessage는 빈 문자열로 실행해야 합니다.

6.5.1 프레젠테이션 연결 성립

사용자 에이전트프레젠테이션 연결 성립프레젠테이션 연결을 사용해 수행할 때, MUST 다음 단계를 실행해야 합니다:

입력
presentationConnection, 연결할 PresentationConnection 객체
  1. Assert: 이 단계는 병렬로 실행 중임을 보장한다.
  2. presentationConnection프레젠테이션 연결 상태connecting이 아니라면, 남은 단계를 모두 중단한다.
  3. presentationConnection수신 브라우징 컨텍스트에 연결하도록 요청한다. presentationConnection프레젠테이션 식별자는 이 요청에 MUST 포함되어야 한다.
  4. 연결이 성공적으로 완료되면, Presentation API 태스크를 큐에 추가하여 아래 단계를 실행한다:
    1. presentationConnection프레젠테이션 연결 상태connected로 설정한다.
    2. connect 이벤트 발생presentationConnection에서 실행한다.
  5. 연결을 완료할 수 없다면, 프레젠테이션 연결 닫기S에 대해 errorcloseReason으로, 실패를 설명하는 사람이 읽을 수 있는 메시지를 closeMessage로 하여 실행한다.
참고
원격 디스플레이에서 표시하고 제어 브라우징 컨텍스트를 표시된 문서와 연결하는 메커니즘은 사용자 에이전트의 구현 선택입니다. 연결은 양방향 메시징 추상화를 제공해야 하며, DOMString 및 바이너리 페이로드를 신뢰성 있고 순서대로 전달할 수 있어야 하며, 아래 메시지 전송메시지 수신 단계에 설명된 대로 동작해야 합니다.

6.5.2 PresentationConnection로 메시지 전송

참고
제어 브라우징 컨텍스트수신 브라우징 컨텍스트 간의 연결 전송 방식은 특별히 지정되어 있지 않습니다. 단, send를 여러 번 호출할 때는, 메시지가 상대방에 신뢰성 있고 순서대로 전달되어야 합니다. 전송 방식은 신뢰성 모드의 RTCDataChannel과 동등하게 동작해야 합니다.

프레젠테이션 메시지 데이터는 두 브라우징 컨텍스트 사이에서 전송되는 페이로드 데이터입니다. 프레젠테이션 메시지 타입은 해당 데이터의 타입으로, text 또는 binary 중 하나입니다.

사용자 에이전트메시지 전송 알고리즘프레젠테이션 연결을 통해 수행할 때, MUST 다음 단계를 실행해야 합니다:

입력
presentationConnection, 상대 브라우징 컨텍스트에 연결된 프레젠테이션 연결
messageOrData, 상대 브라우징 컨텍스트에 전송할 프레젠테이션 메시지 데이터
  1. presentationConnectionstate 속성이 connected가 아니라면, InvalidStateError 예외를 발생시킨다.
  2. presentationConnection닫기 절차가 시작되었다면, 이 단계를 중단한다.
  3. 프레젠테이션 메시지 타입 messageTypemessageOrDataArrayBuffer, ArrayBufferView, 또는 Blob 타입이면 binary로 한다. messageOrDataDOMString 타입이면 text로 한다.
  4. 구현별 메커니즘을 사용해 messageOrData의 내용을 프레젠테이션 메시지 데이터로, messageType프레젠테이션 메시지 타입으로 목적지 브라우징 컨텍스트에 전송한다.
  5. 이전 단계에서 복구 불가능한 오류가 발생하면, 즉시 프레젠테이션 연결 닫기presentationConnection에 대해 errorcloseReason으로, 오류 설명이 담긴 closeMessage로 실행한다.
참고

프레젠테이션 연결을 통해 메시지 전송 오류 복구를 돕기 위해, 사용자 에이전트는 어떤 시도가 실패했는지에 대한 상세 정보와 사람이 읽을 수 있는 실패 원인 설명을 closeMessage에 포함하는 것이 좋습니다. closeMessage의 예시 표현:

  • Unable to send text message (network_error): "hello" (DOMString 메시지일 때, "hello"는 실패한 메시지의 최대 256자)
  • Unable to send binary message (invalid_message) (ArrayBuffer, ArrayBufferView, Blob 메시지일 때)
참고
프레젠테이션 연결을 통해 사용자에게 표시되는 문자열을 보낼 때, 페이지 작성자는 로케일 정보도 함께 전달하여 목적지 사용자 에이전트가 해당 문자열을 최적의 방식으로 렌더링할 수 있도록 해야 합니다. 한 가지 해결책은 예시를 참고하세요.

6.5.3 PresentationConnection로 메시지 수신

사용자 에이전트가 원격 측으로부터 프레젠테이션 메시지 데이터프레젠테이션 메시지 타입으로 이루어진 전송을 수신했을 때, MUST 아래 단계를 실행하여 메시지 수신PresentationConnection을 통해 수행해야 합니다:

입력
presentationConnection, 메시지를 수신하는 프레젠테이션 연결
messageType, 메시지의 프레젠테이션 메시지 타입
messageData, 메시지의 프레젠테이션 메시지 데이터
  1. Assert: 이 단계는 병렬로 실행 중임을 보장한다.
  2. presentationConnectionstate 속성이 connected가 아니면, 남은 단계를 중단한다.
  3. event이벤트 생성 결과로 한다. MessageEvent 인터페이스를 사용하며, 이벤트 타입은 message이고 버블링되지 않으며 취소되지 않는다.
  4. event의 data 속성을 다음과 같이 초기화한다:
    1. messageTypetext이면, eventdata 속성을 DOMString 타입의 messageData로 초기화한다.
    2. messageTypebinary이고 binaryType 속성이 "blob"이면, eventdata 속성을 messageData를 raw data로 하는 새로운 Blob 객체로 초기화한다.
    3. messageTypebinary이고 binaryType 속성이 "arraybuffer"이면, eventdata 속성을 messageData를 내용으로 하는 새로운 ArrayBuffer 객체로 초기화한다.
  5. Presentation API 태스크를 큐에 추가하여 event 발생presentationConnection에서 event로 실행한다.

사용자 에이전트presentationConnection을 통해 메시지 수신 중 복구 불가능한 오류를 만난 경우, MUST 즉시 프레젠테이션 연결 닫기presentationConnection에 대해 errorcloseReason으로 실행해야 합니다. 이때 SHOULD 사람이 읽을 수 있는 오류 설명을 closeMessage로 사용해야 합니다.

6.5.4 인터페이스 PresentationConnectionCloseEvent

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 멤버가 설정되면 그 값으로, 그렇지 않으면 빈 문자열로 설정합니다.

6.5.5 PresentationConnection 닫기

사용자 에이전트프레젠테이션 연결 닫기 시작을 수행할 때, MUST 다음을 실행해야 합니다:

입력
presentationConnection, 닫을 프레젠테이션 연결
closeReason, 연결이 닫히는 이유를 설명하는 PresentationConnectionCloseReason
closeMessage, 연결이 닫힌 이유에 대한 사람이 읽을 수 있는 메시지
  1. presentationConnection프레젠테이션 연결 상태connecting 또는 connected가 아니면 남은 단계를 중단한다.
  2. presentationConnection프레젠테이션 연결 상태closed로 설정한다.
  3. 목적지 브라우징 컨텍스트에 해당 PresentationConnection을 닫으려는 의도를 신호로 전달한다. 이때 closeReason을 함께 전달한다. 사용자 에이전트는 대응하는 PresentationConnection이 실제로 닫혔다는 확인을 기다릴 필요 없이 다음 단계로 진행해도 된다.
  4. closeReasonwentaway가 아니면, 로컬에서 프레젠테이션 연결 닫기 단계를 presentationConnection, closeReason, closeMessage로 실행한다.

사용자 에이전트프레젠테이션 연결 닫기를 수행할 때, MUST 다음을 실행해야 합니다:

입력
presentationConnection, 닫을 프레젠테이션 연결
closeReason, 연결이 닫히는 이유를 설명하는 PresentationConnectionCloseReason
closeMessage, 연결이 닫힌 이유에 대한 사람이 읽을 수 있는 메시지
  1. presentationConnection에 대해 대기 중인 프레젠테이션 연결 닫기 태스크가 있거나, 이미 프레젠테이션 연결 닫기 태스크가 실행된 경우 남은 단계를 중단한다.
  2. Presentation API 태스크를 큐에 추가하여 아래 단계를 실행한다:
    1. presentationConnection프레젠테이션 연결 상태connecting, connected, closed 중 하나가 아니면 남은 단계를 중단한다.
    2. presentationConnection프레젠테이션 연결 상태closed가 아니면, closed로 설정한다.
    3. presentationConnection수신 브라우징 컨텍스트에서 들어오는 프레젠테이션 연결 모니터링 결과로 생성된 경우, 다음 하위 단계를 실행한다.
      1. presentationConnection프레젠테이션 컨트롤러 집합에서 제거한다.
      2. 프레젠테이션 컨트롤러 모니터프레젠테이션 컨트롤러 집합을 채운다.
    4. close 이벤트 발생PresentationConnectionCloseEvent 인터페이스를 사용하여, reason 속성은 closeReason, message 속성은 closeMessage로 초기화하여 presentationConnection에서 발생시킨다. 이벤트는 버블링되지 않으며, 취소할 수 없다.

6.5.6 제어 브라우징 컨텍스트에서 프레젠테이션 종료

제어 사용자 에이전트제어 브라우징 컨텍스트에서 프레젠테이션 종료connection을 사용해 수행할 때, MUST 다음 단계를 실행해야 합니다:

  1. connection프레젠테이션 연결 상태connected 또는 connecting가 아니면 남은 단계를 중단한다.
  2. 그렇지 않으면, 제어 사용자 에이전트제어 중인 프레젠테이션 집합의 각 known connection에 대해:
    1. known connectionconnection프레젠테이션 식별자가 같고, known connection프레젠테이션 연결 상태connected 또는 connecting이면, 글로벌 태스크를 큐에 추가하여 프레젠테이션 태스크 소스known connection관련 글로벌 오브젝트에서 아래 단계를 실행한다:
      1. known connection프레젠테이션 연결 상태terminated로 설정한다.
      2. terminate 이벤트 발생known connection에서 실행한다.
  3. 병렬로, 구현별 메커니즘을 사용하여 프레젠테이션 종료 요청(send a termination request)을 해당 수신 사용자 에이전트에 전달한다.

6.5.7 수신 브라우징 컨텍스트에서 프레젠테이션 종료

다음 중 하나가 발생하면 수신 사용자 에이전트MUST 수신 브라우징 컨텍스트에서 프레젠테이션 종료를 실행해야 합니다:

  1. 수신 사용자 에이전트가 해당 수신 브라우징 컨텍스트에 대응하는 문서를 언로드해야 할 때(예: 브라우징 컨텍스트를 새 리소스로 내비게이트 요청 시)
  2. 사용자가 수신 사용자 에이전트를 통해 프레젠테이션 종료를 요청했을 때
    참고

    이는 명시적인 사용자 동작으로 발생할 수 있고, 사용자 에이전트의 정책에 따라 발생할 수도 있습니다. 예를 들어 수신 사용자 에이전트PresentationConnection 객체가 모두 30분간 닫힌 경우 프레젠테이션을 종료하도록 설정될 수 있습니다.

  3. 제어 사용자 에이전트가 해당 프레젠테이션에 대해 종료 요청을 전송한 경우 수신 사용자 에이전트에 도달

수신 사용자 에이전트수신 브라우징 컨텍스트에서 프레젠테이션 종료를 실행해야 할 때, MUST 아래 단계를 실행합니다:

  1. P를 종료할 프레젠테이션으로, allControllers해당 프레젠테이션을 위해 생성된 프레젠테이션 컨트롤러 집합으로, connectedControllers를 빈 리스트로 한다.
  2. allControllers의 각 connection에 대해 아래 단계를 실행한다:
    1. connection프레젠테이션 연결 상태connected이면, connectionconnectedControllers에 추가한다.
    2. connection프레젠테이션 연결 상태terminated로 설정한다.
  3. P에 대해 수신 브라우징 컨텍스트가 있고, 그 컨텍스트의 문서가 언로드되지 않았다면, 해당 문서 언로드를 수행하고 UI에서 해당 브라우징 컨텍스트를 제거 및 폐기한다.
  4. connectedControllers의 각 connection에 대해 구현별 메커니즘을 사용해 P에 대한 종료 확인을 해당 제어 사용자 에이전트(해당 connection목적지 브라우징 컨텍스트의 소유자)로 전송한다.
    참고

    제어 사용자 에이전트마다 종료 확인은 한 번만 전송하면 됩니다.

6.5.8 제어 사용자 에이전트에서 프레젠테이션 종료 확인 처리

수신 사용자 에이전트가 프레젠테이션 P에 대해 종료 확인을 전송하고, 해당 확인이 제어 사용자 에이전트에 도달한 경우, 제어 사용자 에이전트MUST 아래 단계를 실행해야 합니다:

  1. P에 연결된 제어 중인 프레젠테이션 집합의 각 connection에 대해, 글로벌 태스크를 큐에 추가하여 프레젠테이션 태스크 소스connection관련 글로벌 오브젝트에서 아래 단계를 실행한다:
    1. connection프레젠테이션 연결 상태connected 또는 connecting가 아니면 남은 단계를 중단한다.
    2. connection프레젠테이션 연결 상태terminated로 설정한다.
    3. terminate 이벤트 발생connection에서 실행한다.

6.5.9 이벤트 핸들러

아래는 PresentationConnection 인터페이스를 구현하는 객체가 이벤트 핸들러 IDL 속성으로 지원해야 하는 이벤트 핸들러 및 각 이벤트 핸들러의 이벤트 타입입니다:

이벤트 핸들러 이벤트 핸들러 이벤트 타입
onmessage message
onconnect connect
onclose close
onterminate terminate

6.6 인터페이스 PresentationReceiver

WebIDL[SecureContext, Exposed=Window]
interface PresentationReceiver {
  readonly attribute Promise<PresentationConnectionList> connectionList;
};

PresentationReceiver 인터페이스는 수신 브라우징 컨텍스트제어 브라우징 컨텍스트에 접근하고 소통할 수 있도록 합니다. PresentationReceiver 인터페이스는 MUST 수신 사용자 에이전트가 제공하는 수신 브라우징 컨텍스트에서 구현되어야 합니다.

connectionList 속성은 MUST 아래 단계를 실행한 결과를 반환해야 합니다:

  1. presentation controllers promisenull이 아니면, 그 presentation controllers promise를 반환하고 남은 단계를 중단한다.
  2. 그렇지 않으면, presentation controllers promise를 이 PromiseJavaScript realm에서 새로 생성해 할당한다.
  3. presentation controllers promise를 반환한다.
  4. presentation controllers monitornull이 아니면, resolvepresentation controllers promise에 대해 presentation controllers monitor로 실행한다.

6.6.1 수신 브라우징 컨텍스트 생성

사용자 에이전트수신 브라우징 컨텍스트 생성을 수행할 때, MUST 아래 단계를 실행해야 합니다:

입력
D, 사용자가 선택한 프레젠테이션 디스플레이
presentationUrl, 프레젠테이션 요청 URL
presentationId, 프레젠테이션 식별자
  1. 새 브라우징 컨텍스트 생성을 통해 새로운 최상위 브라우징 컨텍스트 C를 생성하고, D에 표시하도록 설정한다.
  2. C세션 히스토리를 빈 리스트로 설정한다.
  3. Csandboxed modals flagsandboxed auxiliary navigation browsing context flag를 설정한다.
  4. 수신 사용자 에이전트가 [PERMISSIONS]을 구현한다면, C의 모든 권한 상태"denied"로 설정한다.
  5. C에 대해 새로운 빈 쿠키 저장소를 생성한다.
  6. C에 대해 HTTP 인증 상태 저장소를 새로 생성한다.
  7. C에 대해 세션 스토리지 영역로컬 스토리지 영역을 위한 빈 저장소를 생성한다.
  8. 수신 사용자 에이전트가 [INDEXEDDB]를 구현한다면, C를 위한 IndexedDB 데이터베이스 저장소를 새로 생성한다.
  9. 수신 사용자 에이전트가 [SERVICE-WORKERS]를 구현한다면, C를 위한 새로운 빈 서비스 워커 등록 리스트와 빈 Cache 객체 집합을 생성한다.
  10. Navigate를 통해 CpresentationUrl로 이동한다.
  11. C에 대해 presentationIdpresentationUrl들어오는 프레젠테이션 연결 모니터링을 시작한다.

자식 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 clientworker client로, 수신 브라우징 컨텍스트와 그 하위 navigable에 연결된 것들은 서로의 서비스 워커에 노출되면 안 된다.

수신 브라우징 컨텍스트가 종료되면, 그와 브라우징 컨텍스트의 하위 navigable에 연결된 모든 서비스 워커는 MUST 등록 해제 및 종료되어야 한다. 수신 브라우징 컨텍스트와 그 브라우징 컨텍스트의 하위 navigable에 연결된 모든 브라우징 상태(스토리지 포함) (세션 히스토리, 쿠키 저장소, HTTP 인증 상태, 데이터베이스, 세션 스토리지 영역, 로컬 스토리지 영역, 서비스 워커 등록 리스트 및 Cache 객체)는 MUST 폐기되어야 하며, 다른 브라우징 컨텍스트에서 재사용될 수 없다.

참고

이 알고리즘은 1-UA2-UA 프레젠테이션 모두에 대해 상호운용성 있는 동작을 위하여 잘 정의된 환경을 만들고, 2-UA 프레젠테이션에서 사용된 프레젠테이션 디스플레이의 상태 잔존을 최소화하기 위함입니다.

수신 사용자 에이전트SHOULD 수신 브라우징 컨텍스트에서 리소스를 가져올 때 HTTP Accept-Language 헤더를 제어 사용자 에이전트의 언어 선호도에 맞게 설정해야 합니다(즉, 제어 사용자 에이전트가 전송했을 Accept-Language와 동일하게). 이는 수신 사용자 에이전트가 프레젠테이션을 폰트 및 로케일 특화 속성을 포함하여 사용자의 선호에 맞게 렌더링하는 데 도움이 됩니다.

참고

프레젠테이션 디스플레이의 운영 환경에 따라 일부 Web API는 설계상 동작하지 않을 수 있으며(예: 사용자 입력 필요), 윈도우 관리 등은 더 이상 동작하지 않을 수 있습니다. 수신 사용자 에이전트는 이를 인지해야 합니다. 또한 모든 모달 UI는 신중히 처리해야 하며, sandboxed modals flag수신 브라우징 컨텍스트에 설정되어 대부분의 해당 동작을 차단합니다.

참고

적합성에서 언급된 대로, 한 사용자 에이전트가 제어 사용자 에이전트이자 수신 사용자 에이전트일 수 있고, 이 경우 수신 브라우징 컨텍스트가 추가 프레젠테이션을 생성(즉, 제어 브라우징 컨텍스트 역할도 수행)할 수 있습니다. 웹 개발자는 navigator.presentation.receiver를 활용하여 문서가 수신 브라우징 컨텍스트로 로드된 것임을 감지할 수 있습니다.

6.7 인터페이스 PresentationConnectionList

WebIDL[SecureContext, Exposed=Window]
interface PresentationConnectionList : EventTarget {
  readonly attribute FrozenArray<PresentationConnection> connections;
  attribute EventHandler onconnectionavailable;
};

connections 속성은 MUST 프레젠테이션 컨트롤러 집합 내 종료되지 않은 프레젠테이션 연결들을 반환해야 합니다.

6.7.1 들어오는 프레젠테이션 연결 모니터링

수신 사용자 에이전트수신 브라우징 컨텍스트에서 제어 브라우징 컨텍스트로부터 들어오는 프레젠테이션 연결 모니터링을 시작할 때, MUST 구현별 메커니즘을 통해 제어 브라우징 컨텍스트로부터 들어오는 연결 요청을 수신 및 승인해야 합니다. 새로운 연결 요청이 제어 브라우징 컨텍스트로부터 수신되면, 수신 사용자 에이전트MUST 다음 단계를 실행해야 합니다:

입력
I, 들어오는 연결 요청과 함께 제어 브라우징 컨텍스트가 전달한 프레젠테이션 식별자
presentationId, 수신 브라우징 컨텍스트 생성에 사용된 프레젠테이션 식별자
presentationUrl, 수신 브라우징 컨텍스트 생성에 사용된 프레젠테이션 요청 URL
  1. Assert: 이 단계는 병렬로 실행됨을 보장한다.
  2. presentationIdI가 같지 않으면 연결을 거부하고 남은 단계를 중단한다.
  3. PresentationConnection S를 생성한다.
  4. S프레젠테이션 식별자I로 설정한다.
  5. S프레젠테이션 URLpresentationUrl로 설정한다.
  6. 제어 브라우징 컨텍스트와 수신 브라우징 컨텍스트 간의 연결을 구현별 메커니즘을 통해 성립시킨다.
  7. 연결이 성공적으로 성립되면 S 프레젠테이션 연결 상태connected로 설정한다. 그렇지 않으면 S프레젠테이션 연결 상태closed로 설정하고 남은 단계를 중단한다.
  8. S프레젠테이션 컨트롤러 집합에 추가한다.
  9. presentation controllers monitornull이면, 병렬로 아래 단계를 실행한다.
    1. presentation controllers monitorPresentationConnectionList의 새 인스턴스로 (해당 PresentationReceiver 객체의 JavaScript realm에서) 설정한다.
    2. presentation controllers monitor프레젠테이션 컨트롤러 집합으로 채운다.
    3. presentation controllers promisenull이 아니면, Presentation API 태스크를 큐에 추가하여 resolvepresentation controllers promisepresentation controllers monitor로 실행한다.
    4. 남은 단계를 중단한다.
  10. 그 외에는 병렬로 아래 단계를 실행한다.
    1. presentation controllers monitor프레젠테이션 컨트롤러 집합으로 채운다.
    2. Presentation API 태스크를 큐에 추가하여 connectionavailable 이벤트 발생PresentationConnectionAvailableEvent 인터페이스를 사용하여, connection 속성을 S로 설정하여 presentation controllers monitor에서 발생시킨다. 이벤트는 버블링되지 않으며, 취소할 수 없다.

6.7.2 이벤트 핸들러

아래는 PresentationConnectionList 인터페이스를 구현하는 객체가 이벤트 핸들러 IDL 속성으로 지원해야 하는 이벤트 핸들러 및 각 이벤트 핸들러의 이벤트 타입입니다:

이벤트 핸들러 이벤트 핸들러 이벤트 타입
onconnectionavailable connectionavailable

7. 보안 및 개인정보 고려사항

이 섹션은 규범적이지 않습니다.

7.1 개인 식별 정보

PresentationAvailability 객체에서 발생하는 change 이벤트는 브라우저의 로컬 네트워크를 통해 발견되는 프레젠테이션 디스플레이의 존재 여부에 대한 1비트 정보를 노출합니다. 이 정보는 다른 정보와 결합되어 사용자를 지문으로 식별하는 데 사용될 수 있습니다. 하지만 이 정보는 사용자의 로컬 네트워크 환경에 따라 달라지므로 위험이 최소화됩니다.

API는 사용 가능한 프레젠테이션 디스플레이 목록 모니터링을 가능하게 합니다. 사용자 에이전트가 주어진 URL에 대해 프레젠테이션 디스플레이의 호환성과 가용성을 판단하는 방식은 구현 세부사항입니다. 만약 제어 사용자 에이전트프레젠테이션 요청 URLDIAL 애플리케이션과 매칭하여 가용성을 판단한다면, 이 기능을 통해 사용자의 DIAL 애플리케이션이 프레젠테이션 디스플레이에 설치되어 있는지 사용자 동의 없이 탐지할 수 있습니다.

7.2 교차 출처 접근

프레젠테이션은 출처를 넘나들어 접근이 허용됩니다. 프레젠테이션을 생성하는 데 사용된 프레젠테이션 URL프레젠테이션 식별자만 있으면, 제어 사용자 에이전트의 어떤 출처에서든 프레젠테이션에 재연결할 수 있습니다. 즉, 프레젠테이션은 특정 오픈 출처에 묶이지 않습니다.

이 설계는 서로 다른 출처의 제어 컨텍스트가 동일한 프레젠테이션 리소스에 연결할 수 있게 합니다. 프레젠테이션 식별자의 보안성은 임의의 출처에서 기존 프레젠테이션에 연결하는 것을 방지합니다.

이 명세는 수신 사용자 에이전트가 자신의 제어 중인 프레젠테이션 집합 정보를 공개하거나, 제어 사용자 에이전트가 다른 기기에서 시작된 프레젠테이션에 재연결하는 것도 허용합니다. 이는 제어 브라우징 컨텍스트가 실행 중인 프레젠테이션의 프레젠테이션 URL프레젠테이션 식별자를 사용자, 로컬 저장소, 또는 서버로부터 받아 reconnect로 연결하는 경우 가능합니다.

이 명세는 프레젠테이션에 연결하는 당사자의 신원에 대해 어떠한 보장도 하지 않습니다. 연결 후에는 프레젠테이션이 애플리케이션 고유 방식으로 연결자의 신원을 추가적으로 검증할 수 있습니다. 예를 들어 프레젠테이션이 send를 통해 토큰을 요구하여 신원 및 권한을 검증할 수 있습니다.

7.3 사용자 인터페이스 가이드라인

출처 표시

사용자가 프레젠테이션 디스플레이 선택 단계에서 프레젠테이션 디스플레이 사용 권한을 요청받을 때, 제어 사용자 에이전트는 어떤 출처가 프레젠테이션을 요청하고 있는지와 어떤 출처가 실제로 표시될지 명확하게 보여주어야 합니다.

프레젠테이션을 요청하는 출처를 표시하면, 특히 하위 navigable에서 요청이 시작될 때 사용자가 어떤 콘텐츠가 요청하는지 더 잘 이해할 수 있습니다. 예를 들어, 임베디드 콘텐츠가 사용자를 속여 원하지 않는 프레젠테이션을 시작하도록 유도할 수 있습니다.

프레젠테이션 수명 동안 프레젠테이션의 최상위 출처가 동일하게 유지되도록 사용자 활성화 없는 sandboxed 최상위 내비게이션 브라우징 컨텍스트 플래그수신 브라우징 컨텍스트에 설정됩니다.

크로스 디바이스 접근

사용자가 프레젠테이션 연결 시작 시, 사용자는 프레젠테이션을 독점적으로 제어합니다. 하지만 Presentation API는 추가 기기(대개 다른 사용자)가 프레젠테이션에 연결해 제어할 수 있게 허용합니다. 두 번째 기기가 프레젠테이션에 연결되면, 모든 연결된 제어 사용자 에이전트는 브라우저 크롬을 통해 최초 사용자가 독점권을 잃었으며, 이제 여러 컨트롤러가 있다는 사실을 사용자에게 알려야 합니다.

또한 수신 사용자 에이전트가 사용자 입력을 받을 수 있으며 프레젠테이션 디스플레이 역할도 할 수 있다면, 수신 사용자 에이전트수신 브라우징 컨텍스트가 원격 제어(즉, 하나 이상의 컨트롤러가 연결됨) 상태임을 브라우저 크롬을 통해 사용자에게 알리는 것이 좋습니다.

7.4 디바이스 접근

프레젠테이션 API는 디스플레이의 "로컬" 의미를 추상화하여, 네트워크로 접근 가능한 디스플레이도 사용자의 기기에 직접 연결된 것처럼 노출합니다. Presentation API는 페이지가 디스플레이에 접근하려면 사용자의 권한을 요구하여, 타인에게 노출될 수 있는 디스플레이에 원하지 않는 콘텐츠가 표시되는 등의 문제를 완화합니다.

7.5 임시 식별자 및 브라우저 상태

프레젠테이션 URL프레젠테이션 식별자는 다른 브라우징 컨텍스트에서 프레젠테이션에 연결하는 데 사용될 수 있습니다. 제어 페이지에 공격자가 콘텐츠를 주입할 수 있다면 이 값들이 가로채질 수 있습니다.

7.6 시크릿 모드 및 브라우징 데이터 삭제

프레젠테이션에 표시되는 콘텐츠는 컨트롤러와 다릅니다. 특히, 사용자가 두 컨텍스트 모두에 로그인한 뒤 제어 브라우징 컨텍스트에서 로그아웃해도 수신 브라우징 컨텍스트에서 자동으로 로그아웃되지 않습니다. 인증을 사용하는 애플리케이션은 기기간 통신 시 각별히 주의해야 합니다.

사용자 에이전트가 알고 있는 프레젠테이션 집합은 사용자가 "브라우징 데이터 삭제"를 요청할 때 모두 삭제되어야 합니다.

시크릿 모드(인코그니토)에서는 해당 브라우징 세션의 초기 제어 중인 프레젠테이션 집합이 비어 있어야 합니다. 추가된 프레젠테이션 연결 역시 세션 종료 시 폐기되어야 합니다.

7.7 프레젠테이션 연결 간 메시징

이 명세는 제어 브라우징 컨텍스트수신 브라우징 컨텍스트 간 통신 프로토콜을 강제하지 않지만, 대응하는 프레젠테이션 연결 간 메시지의 기밀성과 인증성은 보장해야 합니다.

A. IDL 색인

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;
};

B. 색인

B.1 이 명세에서 정의한 용어

B.2 참조에 의해 정의된 용어

C. 감사의 글

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의 등록상표입니다. 이들은 배경 정보로만 언급되며, 이 명세를 구현하기 위해 반드시 사용해야 하는 것은 아닙니다.

D. 후보 권고안 종료 기준

이 명세가 제안 권고안(Proposed Recommendation)으로 진전되기 위해, 각 적합성 클래스(제어 사용자 에이전트수신 사용자 에이전트)별로 각 기능에 대해 최소 두 개의 독립적이고 상호운용 가능한 구현이 있어야 합니다. 각 기능은 서로 다른 제품 세트에 의해 구현될 수 있으며, 모든 기능을 단일 제품이 모두 구현해야 할 필요는 없습니다. 또한, 제어 사용자 에이전트 적합성 클래스의 구현은 1-UA 모드 하나 이상과 2-UA 모드 하나 이상의 구현을 포함해야 합니다. 2-UA 모드 구현은 http/https가 아닌 프레젠테이션 URL만 지원해도 됩니다. 수신 사용자 에이전트 적합성 클래스의 구현에는 2-UA 모드 구현이 포함될 수 없습니다.

API는 최근에 보안 컨텍스트로 제한되었습니다. 초기 구현에서 비보안 컨텍스트에서의 API 사용 중단(deprecation)에는 시간이 필요합니다. 그룹은 비보안 컨텍스트에서 아직 API를 노출하는 구현이 있더라도, 이를 향후 제한할 일정이 존재한다면 제안 권고안으로의 전환을 요청할 수 있습니다.

이 기준을 위해 다음 용어를 정의합니다:

독립적(Independent)
각 구현은 서로 다른 당사자에 의해 개발되어야 하며, 다른 적합한 구현에서 사용된 코드를 공유, 재사용, 파생해서는 안 됩니다. 이 명세 구현과 무관한 코드 부분은 예외입니다.
상호운용 가능(Interoperable)
공식 테스트 스위트에서 해당 테스트 케이스를 통과하는 것.
구현(Implementation)
다음을 만족하는 사용자 에이전트:
  1. 명세의 적합성 클래스 중 하나를 구현함
  2. 일반 대중에게 공개됨. 구현은 출시 제품이거나, 베타, 프리뷰, "나이틀리 빌드" 등 공개 버전일 수 있음. 출시되지 않은 제품의 경우, 기능이 최소 한 달간 구현되어 안정성을 증명해야 함.
  3. 실험적이지 않음(단지 테스트 스위트 통과만을 위해 특별히 설계된 버전이 아니어야 하며, 앞으로 정상적으로 사용될 예정이어야 함)

E. 변경 기록

이 섹션은 규범적이지 않습니다.

본 섹션은 2016년 7월 후보 권고안(Candidate Recommendation) 최초 공개 이후 명세에 이뤄진 변경 사항을 그룹의 이슈 트래커 관련 이슈 링크와 함께 나열합니다.

E.1 2017년 6월 1일 이후 변경 사항

E.2 2016년 7월 14일 이후 변경 사항

F. 참고 문헌

F.1 규범적 참고 문헌

[DIAL]
DIscovery And Launch Protocol Specification. Netflix; YouTube. Netflix. URL: http://www.dial-multiscreen.org/dial-protocol-specification
[dom]
DOM Standard. Anne van Kesteren. WHATWG. 현행 표준. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[fileapi]
File API. Marijn Kruisselbrink. W3C. 2024년 12월 4일. W3C Working Draft. URL: https://www.w3.org/TR/FileAPI/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[INDEXEDDB]
Indexed Database API. Nikunj Mehta; Jonas Sicking; Eliot Graff; Andrei Popescu; Jeremy Orlow; Joshua Bell. W3C. 2015년 1월 8일. W3C Recommendation. URL: https://www.w3.org/TR/IndexedDB/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. 현행 표준. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Permissions. Marcos Caceres; Mike Taylor. W3C. 2024년 12월 20일. W3C Working Draft. URL: https://www.w3.org/TR/permissions/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC4122]
A Universally Unique IDentifier (UUID) URN Namespace. P. Leach; M. Mealling; R. Salz. IETF. 2005년 7월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4122
[RFC6265]
HTTP State Management Mechanism. A. Barth. IETF. 2011년 4월. Proposed Standard. URL: https://httpwg.org/specs/rfc6265.html
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC9110]
HTTP Semantics. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022년 6월. Internet Standard. URL: https://httpwg.org/specs/rfc9110.html
[secure-contexts]
Secure Contexts. Mike West. W3C. 2023년 11월 10일. CRD. URL: https://www.w3.org/TR/secure-contexts/
[SERVICE-WORKERS]
Service Workers. Jake Archibald; Marijn Kruisselbrink. W3C. 2022년 7월 12일. CRD. URL: https://www.w3.org/TR/service-workers/
[url]
URL Standard. Anne van Kesteren. WHATWG. 현행 표준. URL: https://url.spec.whatwg.org/
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/
[websockets]
WebSockets Standard. Adam Rice. WHATWG. 현행 표준. URL: https://websockets.spec.whatwg.org/

F.2 참고용 참고 문헌

[webrtc]
WebRTC: Real-Time Communication in Browsers. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; Florent Castelli. W3C. 2024년 10월 8일. W3C Recommendation. URL: https://www.w3.org/TR/webrtc/