Presentation 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/

概要

この仕様は、Webコンテンツがプレゼンテーションディスプレイへアクセスし、それらを使ってWebコンテンツを表示できるAPIを定義します。

この文書のステータス

このセクションは、公開時点でのこの文書のステータスを説明します。現行のW3C公開文書および本技術レポートの最新版は、W3C技術レポート一覧(https://www.w3.org/TR/)に掲載されています。

この文書は、Second Screen Working Groupによって 勧告トラックを用いた候補勧告ドラフトとして公開されました。

2017年6月1日に候補勧告として公開されて以降、ワーキンググループはPresentationRequestの構築手順を更新し、サポートされていないスキームのURLを無視するようにし、受信側のブラウジングコンテキストのナビゲーション方法にさらなる制限を加え、BinaryType列挙型の定義をHTML仕様のものに統合しました。本書で定義されている他のインターフェースは、WebIDLの更新に合わせて調整された以外に変更はありません。その他、様々な明確化や編集上の更新も行われました。詳細は変更点一覧をご覧ください。

リスクがあると特定された機能はありません。

Second Screen Working Groupは、候補勧告期間中にPresentation APIのテストスイートを改善し、暫定実装報告を更新します。本仕様が提案勧告へ進むためには、各機能について2つの独立した相互運用可能な実装が示される必要があります。詳細は候補勧告終了基準のセクションをご覧ください。

候補勧告として公開されたことは、W3Cおよびそのメンバーによる支持を意味するものではありません。候補勧告ドラフトは、前回の候補勧告からワーキンググループが次回の候補勧告スナップショットへ含めようとする変更を統合したものです。

この文書はドラフトであり、随時更新、置換、廃止される可能性があります。本書を進行中の作業以外として引用することは不適切です。

この文書は W3C 特許ポリシー の下で活動するグループによって作成されました。 W3Cは、 本グループ成果物に関連する特許開示の公開リスト を管理しています。また、そのページには特許開示の手順も記載されています。特許にEssential Claim(s)が含まれていると信じる個人は、 W3C特許ポリシー第6節 に従い情報を開示する必要があります。

この文書は、 2023年11月3日 W3Cプロセス文書 に従って管理されています。

1. はじめに

このセクションは規定ではありません。

Presentation APIは、プロジェクター、接続されたモニター、ネットワーク接続されたテレビなどのプレゼンテーションディスプレイをWebで利用可能にすることを目的としています。HDMI、DVIなどの有線技術、およびMiracast、Chromecast、DLNA、AirPlayなどの無線技術で接続されたディスプレイを考慮しています。

画面サイズが限られているデバイスでは、Webコンテンツを大勢に見せることができません。例えば会議室の同僚グループや家庭の友人・家族などです。より大きなプレゼンテーションディスプレイでWebコンテンツを表示すると、より高い品質、読みやすさ、インパクトが得られます。

Presentation APIの基本機能は、コントローラーページがプレゼンテーションページをプレゼンテーションディスプレイで表示し、メッセージをやり取りできるようにすることです。プレゼンテーションページをディスプレイに送信する方法や、コントローラーページとその間でメッセージを交換する方法は実装に委ねられています。これにより、さまざまなディスプレイ技術の利用が可能になります。

例えば、プレゼンテーションディスプレイがHDMIやMiracastで接続され、音声と映像のみ送信可能な場合、コントローラーをホストするユーザーエージェント(UA)はプレゼンテーションも描画します。そして、そのグラフィック出力と音声出力をOS経由でプレゼンテーションディスプレイに送ります。この状況をPresentation APIの1-UAモード実装と呼びます。必要なのは、ユーザーエージェントがプレゼンテーションの描画から得られたグラフィック・音声をプレゼンテーションディスプレイに送信し、コントローラーページとプレゼンテーションページの間で内部的にメッセージを交換できることだけです。

プレゼンテーションディスプレイがネイティブでHTMLをレンダリングでき、コントローラーとネットワーク通信できる場合、コントローラーをホストするユーザーエージェントはプレゼンテーションのレンダリングを行う必要はありません。ユーザーエージェントはプロキシとして動作し、プレゼンテーションディスプレイにプレゼンテーションページのロード・レンダリングを依頼します。メッセージ交換はユーザーエージェントとプレゼンテーションディスプレイ間のネットワーク接続で行われます。この状況をPresentation APIの2-UAモード実装と呼びます。

Presentation APIは、ユーザーエージェントがプレゼンテーションディスプレイ1-UAモード2-UAモード、および他の方法で接続する場合の利用を想定しています。ユーザーエージェントとプレゼンテーションディスプレイ間の相互運用性を高めるために、ブラウザとディスプレイ間のネットワーク通信の標準化がSecond Screen Community Groupで検討されています。

2. ユースケースと要件

このセクションは規定ではありません。

ユースケースと要件は、別途用意されたPresentation API ユースケースと要件文書にまとめられています。

3. 適合性

規定ではない部分としてマークされたセクションに加え、この仕様書内のすべての著作ガイドライン、図、例、注記は規定ではありません。それ以外の内容はすべて規定です。

この文書における MAYMUSTMUST NOTOPTIONALSHOULDSHOULD NOT というキーワードは、すべて大文字で現れた場合のみ、BCP 14 [RFC2119] および [RFC8174] に記載された通りに解釈されます。

アルゴリズムの一部として命令形で書かれた要件(例:「先頭のスペース文字を除去する」や「falseを返してこの手順を終了する」など)は、アルゴリズムの導入部分で使われているキーワード("MUST"、"SHOULD"、"MAY"など)の意味で解釈してください。

アルゴリズムや具体的な手順として表現された適合要件は、結果が同等であればどのような方法で実装しても構いません。(特に、本仕様で定義されているアルゴリズムは理解しやすさを重視しており、性能を意図したものではありません。)

3.1 適合性クラス

この仕様では、2種類のユーザーエージェントの適合性基準を記述しています。

制御側ユーザーエージェント

制御側ユーザーエージェントの仕様に準拠したWebブラウザは、本仕様で記述されているように制御側ブラウジングコンテキストを提供することで、プレゼンテーションの開始・制御ができなければなりません。このコンテキストは、PresentationPresentationAvailabilityPresentationConnectionPresentationConnectionAvailableEventPresentationConnectionCloseEvent、および PresentationRequestインターフェースを実装します。

受信側ユーザーエージェント

受信側ユーザーエージェントの仕様に準拠したWebブラウザは、本仕様で記述されているように受信側ブラウジングコンテキストを提供することで、プレゼンテーションを描画できなければなりません。このコンテキストは、PresentationPresentationConnectionPresentationConnectionAvailableEventPresentationConnectionCloseEventPresentationConnectionList、および PresentationReceiverインターフェースを実装します。

1つのユーザーエージェントが、制御側ユーザーエージェント受信側ユーザーエージェントの両方として動作する場合もあります。両方のブラウジングコンテキストを提供し、それぞれに必要なインターフェースを実装している場合です。これは、同じユーザーエージェントが制御側ブラウジングコンテキスト受信側ブラウジングコンテキストの両方をホストできる場合、つまりAPIの1-UAモード実装で発生します。

ユーザーエージェントに対して記述された適合要件は、文脈により制御側ユーザーエージェント受信側ユーザーエージェント、または両方に適用されます。

4. 用語

JavaScriptレルムおよび現在のレルムという用語は、[ECMASCRIPT]で定義されています。resolve済みおよびreject済みという用語は、Promiseオブジェクトの文脈で[ECMASCRIPT]で定義されています。

Accept-Languageおよび HTTP認証という用語は、[RFC9110]で定義されています。

Cookieストアという用語は、[RFC6265]で定義されています。

UUIDという用語は、[RFC4122]で定義されています。

DIALという用語は、 [DIAL]で定義されています。

ドキュメントのリロードは、 reload()メソッドが呼び出されたときに実行される手順を指します([HTML])。

ローカルストレージ領域は、localStorage 属性によって公開されるストレージ領域を指します。同様に、セッションストレージ領域は、sessionStorage 属性で公開される領域を指します([HTML])。

この仕様は他の仕様からエクスポートされた用語を参照しています。B.2 参照先で定義された用語を参照してください。また、他の仕様から以下の内部概念も引用しています。

5.

このセクションは規定ではありません。

このセクションでは、Presentation APIの主な機能の使い方を示すコード例を紹介します。これらの例では、controller.htmlがコントローラーを、presentation.htmlがプレゼンテーションを実装しています。両ページはhttps://example.orghttps://example.org/controller.htmlhttps://example.org/presentation.html)のドメインから配信されます。これらの例は、制御ページが一度に1つのプレゼンテーションを管理することを前提としています。詳細はコード例内のコメントを参照してください。

5.1 プレゼンテーションディスプレイの利用可能状況の監視

このコードは、https://example.com/presentation.html または https://example.net/alternate.htmlを表示できる互換性のあるプレゼンテーションディスプレイが1台以上ある場合にボタンを表示します。

ディスプレイの利用可能状況の監視は、まず提示したいURLでPresentationRequestを作成し、getAvailabilityを呼び出して、プレゼンテーションの可用性が変化したときにchangeイベントが発火するPresentationAvailabilityオブジェクトを取得します。

<!-- controller.html -->
<button id="presentBtn" style="display: none;">Present</button>
<script>
  // プレゼンテーションディスプレイが1つ以上利用可能な場合Presentボタンを表示
  var presentBtn = document.getElementById("presentBtn");
  // 相対パスのプレゼンテーションURL(例:"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で最新状態が維持される場合がある。
    // Web開発者は不要になったらオブジェクトを破棄することが推奨される。
    handleAvailabilityChange(availability.value);
    availability.onchange = function() { handleAvailabilityChange(this.value); };
  }).catch(function() {
    // プラットフォームが可用性監視をサポートしていない場合、presentation displaysの発見はrequest.start()呼び出し後にのみ行われる。
    // 簡単のためデバイスが利用可能とみなす。あるいはボタン用に第3状態を実装してもよい。
    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を閉じたり、ナビゲートしたり、閉じても継続して実行されます。別のページはidを使って既存のPresentationConnectionに再接続し、制御を再開できます。これは、プレゼンテーションを開始したのと同じブラウザでのみ保証されます。

<!-- controller.html -->
<button id="reconnectBtn" style="display: none;">Reconnect</button>
<script>
  var reconnect = function () {
    // localStorageからpresIdを取得(あれば)
    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 制御側ユーザーエージェントによるプレゼンテーションの開始

一部のブラウザは、ユーザーが制御ページを直接操作せずにプレゼンテーションを開始する方法を備えています。制御ページはdefaultRequestプロパティをnavigator.presentationに設定し、こうして開始されたプレゼンテーション時に発火する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;">Disconnect</button>
<button id="stopBtn" style="display: none;">Stop</button>
<script>
  let connection;

  // DisconnectとStopボタンは接続中プレゼンテーションがある場合に表示
  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(`Received message: ${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 同じ制御ページから2つ目のプレゼンテーションを作成

制御ページは、2つの異なるプレゼンテーションディスプレイ上に独立したプレゼンテーションを開始・制御することが可能です。このコードは、上記の例に2つ目のプレゼンテーションを追加する方法を示しています。

<!-- controller.html -->
<!-- 同じ制御ページは、start()を複数回呼ぶことで複数のプレゼンテーションを作成・管理可能 -->
<button id="secondPresentBtn" style="display: none;">Present Again</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 よく使われる用語

プレゼンテーションディスプレイは、ユーザーエージェントが実装固有の接続技術を介して利用可能なグラフィックまたは音声出力デバイスを指します。

プレゼンテーション接続制御側ブラウジングコンテキストと その受信側ブラウジングコンテキストを関連付けるオブジェクトであり、 両者間の双方向メッセージ通信を可能にします。各プレゼンテーション接続は、 プレゼンテーション接続状態、 他のプレゼンテーションと区別するための一意な プレゼンテーション識別子、 そしてプレゼンテーションの作成または再接続時に使用される プレゼンテーションURLURL)を持ちます。 有効なプレゼンテーション識別子は、英数字のみで構成され、16文字以上である必要があります。

一部のプレゼンテーションディスプレイは、機能・セキュリティ・ハードウェアの制約によりWebコンテンツの一部しか表示できない場合があります。例としては、セットトップボックス、スマートテレビ、音声のみレンダリング可能なネットワークスピーカーなどです。このようなディスプレイが、制御側ユーザーエージェントによって、そのURLの表示が確実に成功すると合理的に保証できる場合、そのディスプレイはそのプレゼンテーションURLに対する利用可能なプレゼンテーションディスプレイと呼びます。

制御側ブラウジングコンテキスト(略してコントローラー)は、ブラウジングコンテキストであり、startreconnectの呼び出し、またはconnectionavailableイベントを受け取ることでプレゼンテーションに接続されます。PresentationRequestのアルゴリズムでは、制御側ブラウジングコンテキストは、そのJavaScriptレルムによりPresentationRequestが構築されたブラウジングコンテキストです。

受信側ブラウジングコンテキスト(略してプレゼンテーション)は、プレゼンテーションディスプレイへのレンダリングを担当するブラウジングコンテキストです。受信側ブラウジングコンテキストは、制御側ブラウジングコンテキストと同じユーザーエージェント内、または異なるユーザーエージェント内にも存在し得ます。受信側ブラウジングコンテキストは、受信側ブラウジングコンテキストを作成する手順に従って作成されます。

手続きにおいて、宛先ブラウジングコンテキストは、手続きが制御側ブラウジングコンテキストで開始された場合は受信側ブラウジングコンテキストを、受信側ブラウジングコンテキストで開始された場合は制御側ブラウジングコンテキストを指します。

管理中プレゼンテーションの集合は、初期値は空であり、制御側ブラウジングコンテキスト制御側ユーザーエージェント(またはそのユーザープロファイル)で作成したプレゼンテーション接続を含みます。管理中プレゼンテーションの集合は、基礎となるプレゼンテーション接続を表すPresentationConnectionオブジェクトのリストとして表現されます。この集合内で、同じプレゼンテーションURLプレゼンテーション識別子を共有するPresentationConnectionオブジェクトが複数存在する場合がありますが、特定の制御側ブラウジングコンテキストに対しては、特定のプレゼンテーションURLプレゼンテーション識別子を持つPresentationConnectionは1つのみです。

プレゼンテーションコントローラーの集合は、初期値は空であり、受信側ブラウジングコンテキスト受信側ユーザーエージェントで作成したプレゼンテーション接続を含みます。プレゼンテーションコントローラーの集合は、基礎となるプレゼンテーション接続を表すPresentationConnectionオブジェクトのリストとして表現されます。この集合内のすべてのプレゼンテーション接続は、同じプレゼンテーションURLプレゼンテーション識別子を共有します。

受信側ブラウジングコンテキストでは、プレゼンテーションコントローラー監視器(初期値はnull)が、現在のプレゼンテーションコントローラーの集合を受信側アプリケーションに公開します。プレゼンテーションコントローラー監視器は、PresentationConnectionListとして表現されます。

受信側ブラウジングコンテキストでは、プレゼンテーションコントローラーPromise(初期値はnull)が、初回のプレゼンテーション接続が確立された後にプレゼンテーションコントローラー監視器を提供します。プレゼンテーションコントローラーPromiseは、Promiseとして表現され、プレゼンテーションコントローラー監視器でresolveされます。

制御側ブラウジングコンテキストでは、デフォルトプレゼンテーションリクエスト(初期値はnull)が、ユーザーがブラウザのクロムからプレゼンテーション接続を開始したい場合に使用されるリクエストを表します。

この仕様で言及されるタスクのタスクソースは、プレゼンテーションタスクソースです。

アルゴリズムがPresentation APIタスクTをキューに入れる場合、ユーザーエージェントMUSTグローバルタスクTを、プレゼンテーションタスクソース上に、グローバルオブジェクト現在のレルム)を使ってキューに入れなければなりません。

特に指定がない限り、アルゴリズム手順で構築されるスクリプトオブジェクトのJavaScriptレルムは、現在のレルムです。

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 インスタンスを返します。 これは、受信側ブラウジングコンテキストに関連付けられ、 受信側ユーザーエージェント受信側ブラウジングコンテキスト作成したときに生成されます。 その他の ブラウジングコンテキストchild navigable を含む)では、必ず MUST null を返します。

Web開発者は 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 それぞれが PresentationRequest インスタンスの プレゼンテーションURL となりうる プレゼンテーションリクエスト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 が与えられた場合、urlsurl 1件のみを含む配列にする。
  4. presentationUrls を空のURLリストとして初期化する。
  5. urls の各URL U について:
    1. Acurrent settings object で指定されたAPIベースURLを基準に U をパースした結果の絶対URLとする。
    2. URLの解析アルゴリズムが失敗した場合、 throwし、 SyntaxError 例外で残りの手順を中断する。
    3. A のスキームが 制御側ユーザーエージェントによりサポートされていれば、 presentationUrlsA を追加する。
  6. presentationUrls が空リストの場合、 NotSupportedError を投げて残りの手順を中断する。
  7. presentationUrls のいずれかが potentially trustworthy URL でない場合、 SecurityError を投げて手順を中断する。
  8. presentationUrlsプレゼンテーションリクエストURL として持つ新しい PresentationRequest オブジェクトを構築し、返す。

6.3.2 プレゼンテーションディスプレイの選択

start メソッドが呼び出されたとき、 ユーザーエージェントMUST 以下の手順で プレゼンテーションディスプレイの選択 を行います。

入力
presentationRequestPresentationRequest オブジェクト(startを呼び出したもの)
出力
新しい Promise
  1. ドキュメントのactive windowtransient activationがない場合、 PromiseInvalidAccessError でrejectし、手順を中断する。
  2. topContextトップレベルブラウジングコンテキスト制御側ブラウジングコンテキストのもの)とする。
  3. topContextまたはその 子孫ナビゲーブルのいずれかに 以前の startの呼び出しによる 未解決の Promise がすでに存在する場合、 新しい PromiseOperationError でrejectし、 残りの手順を中断する。
  4. P を新しい Promise とする。
  5. P を返す。ただし、以下の手順を並行して実行し続ける。
  6. ユーザーエージェント利用可能なプレゼンテーションディスプレイ一覧の監視 をしていなければ、利用可能なプレゼンテーションディスプレイ一覧の監視の手順を 並行して実行する。
  7. presentationUrlspresentationRequest の プレゼンテーションリクエストURLとする。
  8. ユーザーにプレゼンテーションディスプレイの利用と 1台のディスプレイ選択についての許可を求める。
  9. 以下のいずれかが真の場合:
    1. 利用可能なプレゼンテーションディスプレイ一覧 が空であり、ユーザー許可リクエスト完了まで空のままである場合
    2. 利用可能なプレゼンテーションディスプレイ一覧 内に presentationUrls のいずれかに対する 利用可能なプレゼンテーションディスプレイ が存在しない場合
    次の手順を実行する:
    1. Presentation APIタスクをキューに入れ reject PNotFoundError 例外でrejectする。
    2. 残りの手順を中断する。
  10. ユーザーがディスプレイの利用を 拒否 した場合、 Presentation APIタスクをキューに入れ PNotAllowedError 例外でrejectし、残りの手順を中断する。
  11. それ以外の場合、ユーザーがディスプレイ利用を 許可 した場合、D をそのディスプレイとする。
  12. presentationRequestDPプレゼンテーション接続開始の手順を実行する。
許可リクエストおよびディスプレイ選択の実装詳細はユーザーエージェントに委ねられています。例えば、ユーザーにダイアログを表示し利用可能なディスプレイを選択させる(許可)、または選択をキャンセルさせる(拒否)ことができます。実装者は複数ディスプレイを利用できるプレゼンテーションのために、利用可能なディスプレイが現在使用中かどうかをユーザーに表示することを推奨します。
受信側ユーザーエージェントはユーザーが選択しやすいように、たとえば「リビングのテレビ」など、プレゼンテーションディスプレイの分かりやすい名称を広告することが推奨されます。また、分かりやすい名称のロケールや意図されたテキスト方向も広告することが推奨されます。制御側ユーザーエージェントの実装者は、それらのロケールやテキスト方向が分かる場合は、それに応じてユーザーフレンドリーな名称を表示することも推奨されます。

6.3.3 デフォルトプレゼンテーションリクエストからプレゼンテーションを開始する

ユーザーがブラウザクロム(専用ボタン、ユーザー操作、その他のシグナルなど)を使ってドキュメントのプレゼンテーションをプレゼンテーションディスプレイで開始する意図を示した場合、そのユーザーエージェントは MUST 以下の手順を実行して デフォルトプレゼンテーションリクエストからプレゼンテーションを開始する。 ドキュメントに デフォルトプレゼンテーションリクエスト が設定されていない場合、これらの手順は MUST 実行しないこと。

入力
W:ユーザーがプレゼンテーション開始の意図を示したドキュメント
presentationRequestW に設定された navigator.presentation.defaultRequest の非null
D:プレゼンテーションのターゲットとなる プレゼンテーションディスプレイ
  1. 以下の手順を並行して実行する。
  2. presentationUrlspresentationRequestプレゼンテーションリクエストURLとする。
  3. DpresentationRequestプレゼンテーションリクエストURL のいずれにも 利用可能なプレゼンテーションディスプレイ でない場合は、これらの手順を中断する。
  4. presentationRequestDプレゼンテーション接続開始の手順を実行する。
デフォルトプレゼンテーションリクエストからプレゼンテーションを開始 する際、制御側ユーザーエージェント は、同じユーザー操作でプレゼンテーション要求および意図した プレゼンテーションディスプレイ の選択をユーザーに許可してもよい。例えば、ブラウザクロム上でメニューからディスプレイを選択したり、 近距離無線通信 (NFC) 対応ディスプレイをタップさせることもできる。

6.3.4 プレゼンテーション接続の開始

ユーザーエージェントプレゼンテーション接続開始を行う場合、 MUST 以下の手順を実行する:

入力
presentationRequest:プレゼンテーション接続開始に使う PresentationRequest
D:選択された プレゼンテーションディスプレイ
P:新しい Promise で解決される(任意) プレゼンテーション接続
  1. Assert:これは 並行して実行されている。
  2. I を新しい 有効なプレゼンテーション識別子(既知の 管理中プレゼンテーションの集合内で プレゼンテーション識別子と一意)の値とする。 フィンガープリント対策のため、実装は SHOULD プレゼンテーション識別子を [rfc4122]の4.4または4.5形式で生成した UUIDに設定することが推奨される。
  3. 新しい PresentationConnection S を作成する。
  4. Sプレゼンテーション識別子I を設定する。
  5. presentationUrlspresentationRequestプレゼンテーションリクエストURLとする。
  6. SプレゼンテーションURLを、 presentationUrlsのうち 利用可能なプレゼンテーションディスプレイ一覧(presentationUrl, D)が存在する最初のpresentationUrlに設定する。
  7. Sプレゼンテーション接続状態connectingに設定する。
  8. S管理中プレゼンテーションの集合 に追加する。
  9. P が与えられていれば、 Presentation APIタスクをキューに入れ resolve PSで解決する。
  10. Presentation APIタスクをキューに入れて、 connectionavailableイベントを PresentationConnectionAvailableEvent インターフェースで、connection 属性を S で初期化して presentationRequest 上で発火する。イベントはバブルせず、キャンセル不可。
  11. U を D に接続されているユーザーエージェントとする。
  12. 次の手順が失敗した場合、残りの手順を中断し、 プレゼンテーション接続終了 SerrorcloseReason・人間可読なcloseMessageで終了する。
  13. 実装固有メカニズムで U受信側ブラウジングコンテキストの作成D, presentationUrl, I を引数に指示する。
  14. プレゼンテーション接続確立S で行う。
presentationUrl はローカルまたはリモートユーザーエージェントからアクセスできるリソース名であるべきです。本仕様は presentationUrlhttp または https スキームの挙動のみ定義しており、他のスキームの挙動は定義しません。

6.3.5 プレゼンテーションへの再接続

reconnect メソッドが呼び出されたとき、ユーザーエージェントMUST以下の手順でプレゼンテーションに再接続を行う:

入力
presentationRequestPresentationRequest オブジェクト(reconnectが呼ばれたもの)
presentationId:有効なプレゼンテーション識別子
出力
P:新しいPromise
  1. P を新しいPromiseとする。
  2. Pを返し、以下の手順を並行して実行し続ける。
  3. 管理中プレゼンテーションの集合から、 以下の条件を満たすPresentationConnectionを検索する:
  4. そのようなPresentationConnectionが存在する場合、以下の手順を実行する:
    1. existingConnectionをそのPresentationConnectionとする。
    2. Presentation APIタスクをキューに入れ resolve PexistingConnectionで解決する
    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タスクをキューに入れ resolve PnewConnectionで解決する。
    8. Presentation APIタスクをキューに入れ connectionavailableイベントを PresentationConnectionAvailableEvent インターフェースで、connection 属性を newConnection で初期化して presentationRequest 上で発火する。イベントはバブルせず、キャンセル不可。
    9. プレゼンテーション接続確立newConnectionで行う。
    10. 残りの手順を中断する。
  7. Presentation APIタスクをキューに入れreject PNotFoundError例外でrejectする。

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 に対して、リクエストの presentation request URLs のいずれかに対応する 利用可能なプレゼンテーションディスプレイ が現在存在するかどうかを記録します。

プレゼンテーションリクエストの プレゼンテーションディスプレイ可用性 は、 ECMAScriptコードから PresentationAvailability オブジェクトが観測できなくなった時にガベージコレクション対象となります。

制御側ユーザーエージェントがバックグラウンドで(start の保留リクエストがなくても) 利用可能なプレゼンテーションディスプレイ一覧の監視 ができる場合、 PresentationAvailability オブジェクトは MUST 制御側ブラウジングコンテキストで実装されなければなりません。

value 属性は MUST 最後に設定された値を返します。値は 利用可能なプレゼンテーションディスプレイ一覧の監視 アルゴリズムによって初期化・更新されます。

onchange 属性は イベントハンドラであり、対応する イベントハンドライベントタイプchange です。

6.4.1 プレゼンテーション可用性オブジェクトの集合

ユーザーエージェントMUST プレゼンテーション可用性オブジェクトの集合getAvailability メソッドによって作成される)を管理しなければなりません。プレゼンテーション可用性オブジェクトの集合は、初期は空のタプル集合(A, availabilityUrls)として表現されます。ここで:

  1. A:生存中の PresentationAvailability オブジェクト
  2. availabilityUrlsPresentationRequestpresentation request URLs のリスト(getAvailability 呼び出し時点)

6.4.2 利用可能なプレゼンテーションディスプレイの一覧

ユーザーエージェントMUST 利用可能なプレゼンテーションディスプレイ一覧 を保持しなければなりません。利用可能なプレゼンテーションディスプレイ一覧は、タプル (availabilityUrl, display) のリストとして表現されます。このリストのエントリは display が現在 availabilityUrl に対する 利用可能なプレゼンテーションディスプレイ であることを示します。この プレゼンテーションディスプレイのリストは新しいプレゼンテーション開始に使用可能であり、実装固有の発見メカニズムに基づいて構成されます。利用可能なプレゼンテーションディスプレイ一覧の監視アルゴリズムの最新結果に設定されます。

プレゼンテーション可用性オブジェクトの集合が空でない間、ユーザーエージェントMAY 利用可能なプレゼンテーションディスプレイ一覧の監視を継続し、ページが value プロパティを用いて利用可能なディスプレイがある時だけ提示できるようにします。ただし、ユーザーエージェントはバックグラウンドでの可用性監視を常にサポートしているとは限りません(例:プラットフォームや消費電力制限)。その場合、PromisegetAvailability の呼び出しで reject され、利用可能なプレゼンテーションディスプレイ一覧の監視プレゼンテーションディスプレイの選択アルゴリズムの一部としてのみ実行されます。

プレゼンテーション可用性オブジェクトの集合が空の場合 (つまり監視対象の availabilityUrls がない場合)、ユーザーエージェントは SHOULD NOT 利用可能なプレゼンテーションディスプレイ一覧の監視を行うべきではありません( 省電力非機能要件のため)。さらに省電力のため、ユーザーエージェントPresentationAvailability オブジェクトを保持しているページがフォアグラウンドにあるかどうかも管理してもよいです。これにより、実装固有の プレゼンテーションディスプレイ発見処理の再開/一時停止が可能となります。

6.4.3 プレゼンテーションディスプレイの可用性情報の取得

getAvailability メソッドが呼び出されたとき、ユーザーエージェントは MUST 以下の手順を実行します:

入力
presentationRequestPresentationRequest オブジェクト(getAvailabilityを呼び出したもの)
出力
新しい Promise
  1. PpresentationRequestJavaScriptレルム で構築した新しい Promise とする。
  2. P を返し、以下の手順を 並行して実行し続ける。
  3. ユーザーエージェントがバックグラウンドで 利用可能なプレゼンテーションディスプレイ一覧の監視 を継続できないが、後でプレゼンテーションディスプレイを発見して接続開始はできる場合、以下の手順を実行する:
    1. Presentation APIタスクをキューに入れ reject PNotSupportedError 例外でrejectする。
    2. 残りの手順を中断する。
  4. presentationRequestプレゼンテーションディスプレイ可用性null でない場合、以下の手順を実行する:
    1. Presentation APIタスクをキューに入れ resolve P をリクエストの プレゼンテーションディスプレイ可用性 で解決する。
    2. 残りの手順を中断する。
  5. presentationRequestプレゼンテーションディスプレイ可用性presentationRequestJavaScriptレルム で新規作成した PresentationAvailability オブジェクトに設定し、Aとする。
  6. タプル (A, presentationUrls) を作成し、プレゼンテーション可用性オブジェクトの集合に追加する。
  7. 利用可能なプレゼンテーションディスプレイ一覧の監視アルゴリズムを実行する。
    監視アルゴリズムは、直前のステップで集合に追加されたタプルを反映するために少なくとももう一度実行しなければなりません。
  8. Presentation APIタスクをキューに入れresolve PA で解決する。

6.4.4 利用可能なプレゼンテーションディスプレイ一覧の監視

プレゼンテーション可用性オブジェクトの集合が空でない場合、または プレゼンテーションディスプレイの選択 の保留リクエストがある場合、ユーザーエージェントMUST 利用可能なプレゼンテーションディスプレイ一覧の監視を次の手順で実行しなければなりません:

  1. Assert:これは 並行して実行中である。
  2. availabilitySetプレゼンテーション可用性オブジェクトの集合の浅いコピーとする。
  3. プレゼンテーションディスプレイの選択の保留リクエストがあり、かつ PresentationRequestプレゼンテーションディスプレイ可用性null なら、以下のサブステップを実行する:
    1. A を新規作成した PresentationAvailability オブジェクトとする。
    2. タプル (A, presentationUrls) を作成し、 presentationUrlsPresentationRequestpresentation request URLsとし、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 プロパティが未初期化なら 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オブジェクトを設定して発火します。イベントは コントローラーstartreconnectを呼び出した場合、または 制御側ユーザーエージェントdefaultRequest経由でコントローラーの代わりに接続を作成した場合に、それぞれの接続ごとに発火されます。

受信側ユーザーエージェントは、着信接続が作成されたとき connectionavailable イベントを PresentationReceiver上で発火します。イベントは プレゼンテーションコントローラー監視器上で PresentationConnectionAvailableEventインターフェースを使い、connection属性に作成されたPresentationConnectionオブジェクトを設定して発火します。イベントは 受信プレゼンテーション接続の監視中に作成されるすべての接続に対して発火されます。

connection 属性は、 MUST PresentationConnectionオブジェクト作成時に設定された値を返します。

PresentationConnectionAvailableEvent コンストラクターが呼び出された場合、ユーザーエージェントMUST 新しい PresentationConnectionAvailableEvent オブジェクトを、渡された connection メンバーを connection 属性に設定して構築しなければなりません。

6.5 インターフェース PresentationConnection

プレゼンテーション接続PresentationConnection オブジェクトで表現されます。 制御側ユーザーエージェントおよび 受信側ユーザーエージェントMUST PresentationConnection を実装しなければなりません。

...(省略:WebIDL部分は翻訳不要)...

id 属性は プレゼンテーション接続プレゼンテーション識別子を指定します。

url 属性は プレゼンテーション接続プレゼンテーションURLを指定します。

state 属性は プレゼンテーション接続の現在の状態を表します。状態は PresentationConnectionState のいずれかです:

connected 状態は メッセージ送信・受信が必ず成功することを保証しません。通信チャネルは突然切断される可能性があります。 こうした状況を早期検知したい場合はアプリケーション側で独自のキープアライブ機構を実装してください。

close メソッドが PresentationConnection S に呼ばれた場合、 ユーザーエージェントMUST プレゼンテーション接続の開始終了Sclosed・空メッセージで実行する必要があります。

terminate メソッドが PresentationConnection S制御側ブラウジングコンテキストで呼ばれた場合、 ユーザーエージェントMUST 制御側ブラウジングコンテキストでプレゼンテーション終了アルゴリズムを Sで実行する。

terminate メソッドが PresentationConnection S受信側ブラウジングコンテキストで呼ばれた場合、 ユーザーエージェントMUST 受信側ブラウジングコンテキストでプレゼンテーション終了アルゴリズムを Sで実行する。

binaryType 属性は BinaryType の値を取ります。 PresentationConnection オブジェクト作成時、 binaryType 属性は MUST 文字列 "arraybuffer" に設定されなければなりません。 ゲッター時は最後に設定された値を返し、セッター時はユーザーエージェントは新しい値に設定しなければなりません。

binaryType 属性は バイナリデータをスクリプトでどのように扱うかを制御できます。"blob" に設定すると Blob 形式で、 "arraybuffer" に設定すると ArrayBuffer形式で返されます。 デフォルトは "arraybuffer" です。文字列形式のデータ送信には影響ありません。

send メソッドが PresentationConnection S に呼ばれた場合、 ユーザーエージェントMUST send a message アルゴリズムを S で実行しなければなりません。

PresentationConnection オブジェクト Sが破棄(ドキュメントのナビゲートや閉じる等)され、かつ プレゼンテーション接続状態connecting または connected の場合、 ユーザーエージェントMUST プレゼンテーション接続の開始終了Swentaway・空メッセージで実行する必要があります。

ユーザーエージェント宛先ブラウジングコンテキストから PresentationConnection S の終了シグナルを受け取った場合、 MUST プレゼンテーション接続終了Sclosed または wentaway・空メッセージで実行する必要があります。

6.5.1 プレゼンテーション接続の確立

ユーザーエージェントプレゼンテーション接続の確立プレゼンテーション接続 を使って行う場合、 MUST 以下の手順を実行しなければなりません:

入力
presentationConnection:接続すべき PresentationConnection オブジェクト
  1. Assert:これは並行して実行されています。
  2. presentationConnectionプレゼンテーション接続状態connectingでない場合、残りの手順を中止する。
  3. presentationConnectionの接続を受信側ブラウジングコンテキストに要求する。presentationConnectionプレゼンテーション識別子はこの要求とともにMUST送信されなければならない。
  4. 接続が正常に完了した場合、Presentation APIタスクをキューに入れて以下を実行する:
    1. presentationConnectionプレゼンテーション接続状態connectedに設定する。
    2. connect イベント(connect)を presentationConnection で発火する。
  5. 接続が完了できなかった場合、プレゼンテーション接続終了 Serror理由と 失敗内容を説明する人間可読のcloseMessageで終了する。
リモートディスプレイへの提示や制御側ブラウジングコンテキストと提示されたドキュメントとの接続に使われる仕組みはユーザーエージェントの実装選択です。接続は、メッセージ送信メッセージ受信ステップで説明される通り、DOMStringとバイナリペイロードを信頼性・順序性を持って双方向メッセージとして運べる抽象化を提供しなければなりません。

6.5.2 PresentationConnection を介したメッセージ送信

制御側ブラウジングコンテキスト受信側ブラウジングコンテキスト間の接続の具体的なトランスポートは規定されていませんが、sendを複数回呼ぶ場合は、メッセージが相手側に信頼性・順序性を持って配送されなければなりません。トランスポートは現行標準の RTCDataChannel の信頼性モードと同等に機能すべきです。

プレゼンテーションメッセージデータは2つのブラウジングコンテキスト間で送信されるペイロードデータを指します。プレゼンテーションメッセージタイプは、そのデータの型で、textまたはbinaryのいずれかです。

ユーザーエージェントメッセージ送信プレゼンテーション接続経由で行う場合、MUST 以下の手順を実行しなければなりません:

入力
presentationConnection:相手のブラウジングコンテキストへ接続済みのプレゼンテーション接続
messageOrData:相手のブラウジングコンテキストへ送信するプレゼンテーションメッセージデータ
  1. presentationConnectionstateプロパティがconnectedでない場合、throwし、InvalidStateError例外を投げて中断する。
  2. presentationConnection終了手順が開始されている場合、残りの手順を中止する。
  3. プレゼンテーションメッセージタイプ messageTypemessageOrDataArrayBufferArrayBufferViewBlob型ならbinaryDOMString型ならtextに設定する。
  4. 実装固有メカニズムでmessageOrDataの内容を プレゼンテーションメッセージデータとして、 messageTypeプレゼンテーションメッセージタイプとして 宛先ブラウジングコンテキストに送信する。
  5. 前のステップで回復不能なエラーが発生した場合、即座に プレゼンテーション接続終了 presentationConnectionerror理由と エラー内容記述のcloseMessageで終了する。

プレゼンテーション接続経由でメッセージ送信エラーが発生した場合、アプリケーションの回復支援のため、ユーザーエージェントは失敗した試行の詳細をcloseMessageに人間可読の文字列で含めるべきです。closeMessageの例:

  • Unable to send text message (network_error): "hello""hello"は失敗メッセージの最初の256文字)DOMStringメッセージの場合
  • Unable to send binary message (invalid_message) ArrayBufferArrayBufferViewBlobメッセージの場合
プレゼンテーション接続経由でユーザー向け文字列を送信する場合、ページ著者はロケール情報も伝播し、宛先ユーザーエージェントが最適に文字列をレンダリングできるよう配慮すべきです。解決例は参照。

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を生データとする新規 Blobオブジェクトで初期化。
    3. messageTypebinaryかつ binaryType 属性が"arraybuffer"なら、 eventdata属性をmessageData内容の新規 ArrayBufferオブジェクトで初期化。
  5. Presentation APIタスクをキューに入れfire eventpresentationConnection で発火する。

ユーザーエージェントpresentationConnection経由でメッセージ受信時に回復不能エラーに遭遇した場合、 MUST即座に プレゼンテーション接続終了 presentationConnectionerror理由で終了する必要がある。 SHOULD エラー内容を人間可読なcloseMessageにすることが推奨される。

6.5.4 インターフェース PresentationConnectionCloseEvent

...(省略:WebIDL部分は翻訳不要)...

PresentationConnectionCloseEventプレゼンテーション接続closed状態に遷移したときに発火されます。 reason 属性は接続が終了した理由を示します。値は PresentationConnectionCloseReason のいずれかです:

reason属性が error の場合、 ユーザーエージェントは SHOULD message 属性に 通信チャネルがどのようなエラーに遭遇したかを説明する人間可読の記述を設定すべきです。

PresentationConnectionCloseEvent コンストラクターが呼ばれたとき、ユーザーエージェントMUST 新しい PresentationConnectionCloseEvent オブジェクトを構築し、その reason 属性は渡された reason メンバーの値に設定し、 PresentationConnectionCloseEventInit オブジェクトで渡されていれば message属性に設定し、それ以外は空文字列に設定する。

6.5.5 PresentationConnection の終了

ユーザーエージェントプレゼンテーション接続の開始終了 を行う場合、MUST 以下を実行する:

入力
presentationConnection:終了する プレゼンテーション接続
closeReason:接続終了理由を示す PresentationConnectionCloseReason
closeMessage:接続終了詳細を含む人間可読メッセージ
  1. presentationConnectionプレゼンテーション接続状態connecting または connected でない場合、残りの手順を中止する。
  2. presentationConnectionプレゼンテーション接続状態closed に設定する。
  3. 宛先ブラウジングコンテキストcloseReasonを渡しつつ、対応する PresentationConnection の終了意思を通知開始する。 実際に閉じられたことの確認を待たず、次の手順に進むことができる。
  4. closeReasonwentaway でない場合、 ローカルで プレゼンテーション接続終了 の手順を presentationConnection, closeReason, closeMessage で実行する。

ユーザーエージェントプレゼンテーション接続終了 を行う場合、MUST 以下を実行する:

入力
presentationConnection:終了する プレゼンテーション接続
closeReason:接続終了理由を示す PresentationConnectionCloseReason
closeMessage:接続終了詳細を含む人間可読メッセージ
  1. presentationConnection に保留中の プレゼンテーション接続終了 タスクがある場合、 または既に プレゼンテーション接続終了 タスクが実行済みの場合、残りの手順を中止する。
  2. Presentation APIタスクをキューに入れて以下を実行する:
    1. presentationConnectionプレゼンテーション接続状態connectingconnectedclosed いずれでもない場合、残りの手順を中止する。
    2. presentationConnectionプレゼンテーション接続状態closed でない場合は closed に設定する。
    3. presentationConnection受信側ブラウジングコンテキスト受信プレゼンテーション接続の監視で作成された場合、以下を実行:
      1. presentationConnectionプレゼンテーションコントローラーの集合から削除する。
      2. プレゼンテーションコントローラー監視器プレゼンテーションコントローラーの集合を反映する。
    4. close イベントを PresentationConnectionCloseEvent インターフェースで、 reason 属性に closeReasonmessage 属性に closeMessage を指定して presentationConnection で発火する。イベントはバブルせず、キャンセル不可。

6.5.6 制御側ブラウジングコンテキストでのプレゼンテーション終了

制御側ユーザーエージェント制御側ブラウジングコンテキストでプレゼンテーション終了connection を使って行う場合、 MUST 以下の手順を実行する:

  1. connectionプレゼンテーション接続状態connected または connecting でない場合、残りの手順を中止する。
  2. それ以外の場合、制御側ユーザーエージェント管理中プレゼンテーションの集合内の各 known connection について:
    1. known connectionプレゼンテーション識別子connectionと等しく、かつ known connectionプレゼンテーション接続状態connected または connecting の場合、 グローバルタスクをキューに入れ known connection関連グローバルオブジェクトで以下を実行:
      1. known connectionプレゼンテーション接続状態terminated に設定する。
      2. terminate イベントを known connection で発火する。
  3. 並行して、実装固有メカニズムで プレゼンテーション終了要求送信を 該当プレゼンテーションの 受信側ユーザーエージェントに送る。

6.5.7 受信側ブラウジングコンテキストでのプレゼンテーション終了

以下のいずれかが発生した場合、受信側ユーザーエージェントMUST 受信側ブラウジングコンテキストでプレゼンテーション終了を行う:

  1. 受信側ユーザーエージェント受信側ブラウジングコンテキストに対応する ドキュメントのアンロードを行う場合(例:そのコンテキストを新しいリソースにナビゲートするリクエストなど)。
  2. ユーザーが受信側ユーザーエージェント経由でプレゼンテーションの終了を要求した場合。

    これは明示的なユーザー操作や、ユーザーエージェントのポリシーとして発生し得ます。たとえば、受信側ユーザーエージェントPresentationConnection オブジェクトがすべて30分間閉じていたプレゼンテーションを終了するよう設定されている場合などが挙げられます。

  3. 制御側ユーザーエージェント終了要求送信 を そのプレゼンテーションの 受信側ユーザーエージェントに送信した場合。

受信側ユーザーエージェント受信側ブラウジングコンテキストでプレゼンテーション終了 を行う場合、 MUST 以下の手順を実行する:

  1. 終了するプレゼンテーションを P とし、allControllersプレゼンテーションコントローラーの集合P用に作成されたものとし、connectedControllers を空リストとする。
  2. allControllers の各 connection について以下を実行:
    1. connectionプレゼンテーション接続状態connectedなら connectionconnectedControllers に追加する。
    2. connectionプレゼンテーション接続状態terminatedに設定する。
  3. Pに対する受信側ブラウジングコンテキストが存在し、 かつそのドキュメントがアンロードされていない場合は、そのアンロードを行い、ユーザーインターフェースからブラウジングコンテキストを削除・破棄する。
  4. connectedControllers の各 connection について、 Pの終了確認を実装固有メカニズムで、connection宛先ブラウジングコンテキストを所有する 制御側ユーザーエージェントに送信する。

    制御側ユーザーエージェントごとに1つだけ終了確認を送信すれば十分です。

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 を この PresentationReceiver オブジェクトの JavaScript realm で新規構築した Promise とする。
  3. presentation controllers promise を返す。
  4. presentation controllers monitornull でなければ、 resolvepresentation controllers promisepresentation controllers monitor で解決する。

6.6.1 受信側ブラウジングコンテキストの作成

ユーザーエージェント受信側ブラウジングコンテキストの作成 を行う場合、MUST 以下の手順を実行する:

入力
D:ユーザーが選択した プレゼンテーションディスプレイ
presentationUrlプレゼンテーションリクエストURL
presentationIdプレゼンテーション識別子
  1. 新規ブラウジングコンテキストの作成を行い、 トップレベルブラウジングコンテキスト CD の画面に表示するよう設定する。
  2. Cセッション履歴 を空リストに設定する。
  3. Csandboxed modals flag および sandboxed auxiliary navigation browsing context flag を設定する。
  4. 受信側ユーザーエージェントが [PERMISSIONS] を実装している場合、 C のすべての permission descriptor typespermission state"denied" に設定する。
  5. C 用に新しい空の cookie store を作成する。
  6. C 用に新しい空の HTTP認証ストアを作成する。
  7. C 用に新しい空の session storage arealocal storage area のストレージを作成する。
  8. 受信側ユーザーエージェントが [INDEXEDDB] を実装している場合、 C 用に新しい空の IndexedDB データベースストレージを作成する。
  9. 受信側ユーザーエージェントが [SERVICE-WORKERS] を実装している場合、C 用に新しい空の service worker登録リスト、および空の Cache オブジェクト集合を作成する。
  10. ナビゲートCpresentationUrl に遷移させる。
  11. CpresentationIdpresentationUrl を用いて 受信プレゼンテーション接続の監視を開始する。

提示されたドキュメントが 子ナビゲーブル作成した場合(すなわち 受信側ブラウジングコンテキストトップレベルブラウジングコンテキストとするもの)は、 MUST 上記2~4の制約も持つこと。また、 MUST sandboxed top-level navigation without user activation browsing context flag を設定すること。これらすべての ブラウジングコンテキストMUST 上記機能5~10で同じブラウジング状態(ストレージ)を共有すること。

トップレベルブラウジングコンテキストが新しいリソースにナビゲートし、 ナビゲート手順を実行する場合、ステップ1で ナビゲート許可か判定する必要がある。 また、MUST NOT フラグメント識別子へのナビゲートや ドキュメント再読み込み以外で自分自身を新リソースにナビゲートしてはならない。

この仕様は、プレゼンテーションディスプレイ選択時に表示される プレゼンテーションURLのオリジンに基づきユーザーが許可を与えられるようにします。

トップレベルブラウジングコンテキストが ナビゲート許可されていない場合、 SHOULD NOT 新しい トップレベルブラウジングコンテキストでリソースを開く提案をしてはならない。 それ以外は、SHOULD ナビゲート手順と一貫するべきである。

Window clients および worker clients受信側ブラウジングコンテキストおよびその 子孫ナビゲーブルに関連付けられたものであっても、 互いの service worker に公開してはならない。

受信側ブラウジングコンテキストが終了した場合、 それおよび ブラウジングコンテキスト子孫ナビゲーブルに関連付けられた service workerMUST 全て登録解除・終了されること。 また、関連する セッション履歴cookie store、HTTP認証状態、 データベースsession storage arealocal storage area、 service worker登録リストおよび Cache オブジェクトは MUST 破棄され、他の ブラウジングコンテキストで再利用されてはならない。

このアルゴリズムは 1-UA2-UA の現行標準プレゼンテーションに 相互運用可能な動作を提供し、プレゼンテーションディスプレイ上に 2-UAプレゼンテーションの 状態が残らないよう最小化することを目的としています。

受信側ユーザーエージェントSHOULD 受信側ブラウジングコンテキストで リソースを取得する際、Accept-Languageヘッダーを 制御側ユーザーエージェントの言語設定(つまり制御側ユーザーエージェントが送信する Accept-Languageと同じ)に合わせるべきです。 これにより、受信側ユーザーエージェントが ユーザーの言語・フォント設定に合わせてプレゼンテーションをレンダリングできます。

プレゼンテーションディスプレイの 動作環境によっては、設計上一部Web APIが動作しない(例えばユーザー入力必須)、 またはウィンドウ管理などが使えない場合があります。受信側ユーザーエージェントはその点を認識しておくべきです。 また、モーダルUIも慎重に扱う必要があります。 sandboxed modals flag受信側ブラウジングコンテキストに設定され、 ほとんどのそのような操作を防止します。

適合性で述べた通り、 制御側ユーザーエージェント受信側ユーザーエージェントを兼ねる場合は、 受信側ブラウジングコンテキストが 追加プレゼンテーションを作成(すなわち 制御側ブラウジングコンテキストにもなる)ことを許してもよい。 Web開発者は navigator.presentation.receiver を使い、 ドキュメントが受信側ブラウジングコンテキストとしてロードされたか検出できる。

6.7 インターフェース PresentationConnectionList

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

connections 属性は MUST プレゼンテーションコントローラーの集合内の 非terminatedなプレゼンテーション接続を返さなければなりません。

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 インターフェースでSをconnection属性に初期化し、 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 ユーザーインターフェース指針

オリジン表示

ユーザーが プレゼンテーションディスプレイ選択の手順で プレゼンテーションディスプレイ使用許可を求められた際、 制御側ユーザーエージェントは どのオリジンがリクエストしているか および どのオリジンが提示されるかを明示するべきです。

リクエスト元オリジンの表示によって、特に 子ナビゲーブル からリクエストが発生した場合、 ユーザーはどのコンテンツが要求しているか理解しやすくなります。 例えば、埋め込みコンテンツがユーザーを騙して不要なプレゼンテーション開始リクエストをクリックさせようとする可能性もあります。

sandboxed top-level navigation without user activation browsing context flag受信側ブラウジングコンテキストに設定され、 プレゼンテーションの存続期間中にトップレベルオリジンが変わらないことを保証します。

デバイス間アクセス

ユーザーが プレゼンテーション開始時は、 ユーザーがプレゼンテーションを排他的に制御します。 しかし、Presentation APIは追加デバイス(別ユーザーのものである可能性が高い)も プレゼンテーションに接続・制御できるようにします。 二台目のデバイスがプレゼンテーションに接続されたときは、すべての 制御側ユーザーエージェントが ブラウザクロムを通じて元のユーザーが排他的アクセス権を失ったこと、 複数コントローラーが存在することを通知することが推奨されます。

さらに、受信側ユーザーエージェントが ユーザー入力も受け付け、かつ プレゼンテーションディスプレイとして機能する場合、 受信側ユーザーエージェントは 受信側ブラウジングコンテキストがリモート側(つまりコントローラーが1つ以上接続された状態)で 制御されていることをブラウザクロムでユーザーに通知するべきです。

7.4 デバイスアクセス

Presentation 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 各氏に編集・レビュー・フィードバック面でご協力いただきました。感謝します。

AirPlayHDMIChromecastDLNAMiracastは、それぞれApple Inc.、HDMI Licensing LLC.、Google Inc.、Digital Living Network Alliance、Wi-Fi Allianceの登録商標です。これらは参考情報としてのみ記載されており、仕様の実装に必須ではありません。

D. 勧告候補終了基準

本仕様が提案勧告へ進むには、定義された各適合クラス(制御側ユーザーエージェント受信側ユーザーエージェント)ごとに、各機能の独立した相互運用可能な実装が2つ以上必要です。各機能は異なる製品セットで実装されてもよく、全機能を単一製品が実装する必要はありません。 また、制御側ユーザーエージェント適合クラスの実装には、1-UAモードの実装と2-UAモードの実装がそれぞれ1つ以上含まれていなければなりません。 2-UAモード実装はhttp/https以外のプレゼンテーションURLのみサポートしてもかまいません。受信側ユーザーエージェント適合クラスの実装には2-UAモード実装は含めてはなりません。

このAPIは最近セキュアコンテキスト専用となりました。初期実装で非セキュアコンテキストのAPI廃止には時間がかかります。グループは将来的に制限する計画がある場合、非セキュアコンテキストでもAPIを公開している実装での提案勧告移行を申請できます。

これら基準における用語定義:

独立
実装ごとに異なる組織が開発し、他の適合実装のコードを共有・再利用・派生してはなりません。本仕様の実装に関係ないコード部分はこの要件から除外されます。
相互運用可能
公式テストスイートの対応テストケースに合格すること。
実装
以下の条件を満たすユーザーエージェント:
  1. 仕様の適合クラスのいずれかを実装している。
  2. 一般公開されている。リリース製品、ベータ版、プレビュー版、ナイトリービルド等いずれでもよい。非製品版は少なくとも1ヶ月間該当機能を実装して安定性を示す必要あり。
  3. 実験的(テストスイート合格目的のみ・通常利用非想定)でないこと。

E. 変更履歴

このセクションは規範的ではありません。

このセクションでは、2016年7月に現行標準の候補勧告として初公開以来の仕様変更を、グループのissue tracker関連issueへのリンク付きで一覧します。

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標準 Anne van Kesteren. WHATWG. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript言語仕様 Ecma International. URL: https://tc39.es/ecma262/multipage/
[fileapi]
File API Marijn Kruisselbrink. W3C. 2024年12月4日. W3C作業草案. URL: https://www.w3.org/TR/FileAPI/
[HTML]
HTML標準 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勧告. URL: https://www.w3.org/TR/IndexedDB/
[infra]
Infra標準 Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Permissions Marcos Caceres; Mike Taylor. W3C. 2024年12月20日. W3C作業草案. URL: https://www.w3.org/TR/permissions/
[RFC2119]
RFCで要求レベルを示すためのキーワード S. Bradner. IETF. 1997年3月. 現在の最良慣行. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC4122]
ユニバーサリー一意識別子 (UUID) URNネームスペース P. Leach; M. Mealling; R. Salz. IETF. 2005年7月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc4122
[RFC6265]
HTTP状態管理メカニズム A. Barth. IETF. 2011年4月. 提案標準. URL: https://httpwg.org/specs/rfc6265.html
[RFC8174]
RFC2119キーワードの大文字と小文字の曖昧性 B. Leiba. IETF. 2017年5月. 現在の最良慣行. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC9110]
HTTPセマンティクス R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022年6月. インターネット標準. 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標準 Anne van Kesteren. WHATWG. 現行標準. URL: https://url.spec.whatwg.org/
[WEBIDL]
Web IDL標準 Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/
[websockets]
WebSockets標準 Adam Rice. WHATWG. 現行標準. URL: https://websockets.spec.whatwg.org/

F.2 参考参照文献

[webrtc]
WebRTC: ブラウザでのリアルタイム通信 Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; Florent Castelli. W3C. 2024年10月8日. W3C勧告. URL: https://www.w3.org/TR/webrtc/