プレゼンテーション 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 (プルリクエスト, 新しい issue, 未解決の issue)
テストスイート
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 を無視するようにし、受信側閲覧コンテキストが 自身をナビゲートする方法にさらなる制限を設け、HTML 仕様で定義されているものを使用するために BinaryType enum の定義を削除しました。この文書で定義されているその他のインターフェイスは、 WebIDL の更新に合わせた調整以外には変更されていません。さまざまな明確化および 編集上の更新も行われました。詳細については、変更一覧を 参照してください。

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

Second Screen Working Group は、勧告候補期間中に Presentation API の テスト スイートを改良し、 暫定 実装報告を更新します。この仕様が 勧告案へ進むためには、勧告候補終了 基準の節で詳述されているとおり、各機能について独立した相互運用可能な実装が 2 つ実証されなければなりません。

勧告候補としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。勧告候補草案には、 ワーキンググループが後続の勧告候補スナップショットに 含めることを意図している、前回の勧告候補からの変更が統合されています。

これは草案文書であり、いつでも他の 文書によって更新、置換、または廃止される可能性があります。この文書を進行中の作業以外のものとして 引用することは適切ではありません。

この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3C は、 グループの成果物に関連して行われた 特許開示の公開一覧 を維持しています。そのページには、 特許を開示するための手順も記載されています。個人が、 必須クレーム を含むと本人が考える特許について実際の 知識を有する場合、その個人は W3C 特許ポリシーの第 6 節に従って情報を開示しなければなりません。

この文書には、 2023年11月3日付 W3C プロセス文書が適用されます。

1. はじめに

この節は非規範的です。

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

画面サイズが限られたデバイスには、Web コンテンツを より多くの人々、たとえば会議室の同僚のグループや、 自宅の友人や家族に見せる能力がありません。より大きな プレゼンテーション用ディスプレイに表示される Web コンテンツは、知覚される品質、 可読性、 およびインパクトがより高くなります。

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. 適合性

非規範的と記された節に加えて、この仕様におけるすべてのオーサリングガイドライン、図、例、および注記は 非規範的です。この仕様のその他すべては規範的です。

この文書におけるキーワード MAYMUSTMUST NOTOPTIONALSHOULD、および SHOULD NOT は、 ここに示されているようにすべて大文字で現れる場合に、かつその場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈されます。

アルゴリズムの一部として命令形で表現される要件(たとえば、 「先頭の空白文字をすべて取り除く」や「false を返して これらの手順を終了する」)は、そのアルゴリズムを導入する際に使用された キーワード(「MUST」、「SHOULD」、「MAY」など) の意味を持つものとして解釈されます。

アルゴリズムまたは特定の手順として表現される適合性要件は、 結果が同等である限り、任意の方法で実装できます。( 特に、この仕様で定義されるアルゴリズムは 理解しやすいことを意図しており、高い性能を意図したものではありません。)

3.1 適合性クラス

この仕様では、2 つのクラスの ユーザーエージェントに対する適合基準を説明します。

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

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

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

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

1 つのユーザーエージェントが、制御側ユーザーエージェント受信側ユーザーエージェントの両方として動作することもできます。これは、両方の閲覧 コンテキストを提供し、それらに必要なすべてのインターフェイスを実装している場合です。同じユーザーエージェントが、 API の 1-UA モード実装のように、 1 つのプレゼンテーションについて 制御側閲覧 コンテキスト受信側閲覧コンテキストの両方を ホストできる場合に、このようなことが起こります。

ユーザーエージェントに対して表現された適合性要件は、 文脈に応じて、制御側ユーザーエージェント受信側ユーザー エージェント、または両方のクラスに適用されます。

4. 用語

用語 JavaScript レルムおよび 現在の レルムは、[ECMASCRIPT] で定義されているとおりに使用されます。Promise オブジェクトの文脈における 用語 解決済みおよび 拒否済みは、 [ECMASCRIPT] で定義されているとおりに使用されます。

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

用語 Cookie ストアは、 [RFC6265] で定義されているとおりに使用されます。

用語 UUID は、 [RFC4122] で定義されているとおりに使用されます。

用語 DIAL は、 [DIAL] で定義されているとおりに使用されます。

用語 文書を 再読み込みするは、[HTML] において reload() メソッドが呼び出されたときに実行される手順を 指します。

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

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

5.

この節は非規範的です。

この節では、Presentation API の主要な 機能の使用方法を示すコード例を示します。これらの例では、 controller.html がコントローラーを実装し、 presentation.html がプレゼンテーションを実装します。両方のページは、 ドメイン https://example.org から提供されます (https://example.org/controller.html および https://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;">表示</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 は
  // 解決される。
  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() {
    // 利用可能性の監視はプラットフォームでサポートされていないため、
    // プレゼンテーション用ディスプレイの検出は request.start() が呼び出された後にのみ行われる。
    // 簡単のため、デバイスが利用可能であると仮定する。または、ボタンに
    // 第 3 の状態を実装することもできる。
    handleAvailabilityChange(true);
  });
</script>

5.2 新しいプレゼンテーションの開始

ユーザーが presentBtn をクリックすると、このコードは PresentationRequest に含まれる URL の 1 つの プレゼンテーションを要求します。 start が呼び出されると、 ブラウザーは通常、利用可能な互換性のあるディスプレイのうち 1 つを ユーザーが選択できるダイアログを表示します。 PresentationRequest 内で選択されたディスプレイと互換性のある 最初の URL が、そのディスプレイに表示されます。

start メソッドは、 プレゼンテーションの状態を追跡し、ディスプレイに読み込まれた後に プレゼンテーションページとメッセージを交換するために使用される PresentationConnection オブジェクトで解決されます。

<!-- 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 () {
    // 存在する場合、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 制御側ユーザーエージェントによるプレゼンテーションの開始

一部のブラウザーには、ユーザーが制御側ページと 直接対話せずにプレゼンテーションを開始する方法があります。制御側ページは、 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;

  // 接続済みのプレゼンテーションがある場合、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(`受信したメッセージ: ${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 つのプレゼンテーションを開始して制御できます。 このコードは、上記の例の 1 つ目のプレゼンテーションに 2 つ目のプレゼンテーションを追加する方法を示します。

<!-- 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を持ちます。有効な プレゼンテーション識別子は英数字の ASCII 文字のみで構成され、16 文字以上でなければなりません。

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

制御側閲覧コンテキスト(略して コントローラー )とは、 start または reconnect を呼び出して プレゼンテーション に接続したか、connectionavailable イベントを介して プレゼンテーション 接続を受信した 閲覧コンテキストです。PresentationRequest のアルゴリズムでは、制御側閲覧 コンテキストは、PresentationRequest の構築に使用された JavaScript レルムを持つ 閲覧コンテキストです。

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

手順において、宛先閲覧コンテキストは、その手順が 制御側閲覧コンテキストで開始された場合は 受信側閲覧コンテキストであり、受信側 閲覧 コンテキストで開始された場合は 制御側 閲覧コンテキストです。

制御対象プレゼンテーションの集合は、初期状態では空であり、 制御側ユーザー エージェント(またはそのユーザーエージェント内の特定のユーザープロファイル)について、制御側閲覧コンテキストによって作成された プレゼンテーション接続を含みます。 制御対象プレゼンテーションの集合は、 基礎となる プレゼンテーション接続を表す PresentationConnection オブジェクトのリストとして表現されます。複数の PresentationConnection オブジェクトが、その集合内で同じ プレゼンテーション URL および プレゼンテーション 識別子を共有することはできますが、 特定の 制御側閲覧コンテキストについて、特定の プレゼンテーション URL および プレゼンテーション 識別子を持つ PresentationConnection は 1 つだけです。

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

受信側閲覧コンテキストでは、初期状態で null に設定される プレゼンテーション コントローラーモニターが、現在の プレゼンテーション コントローラーの集合を受信側アプリケーションに公開します。プレゼンテーションコントローラー モニターは、 PresentationConnectionList によって表現されます。

受信側閲覧コンテキストでは、初期状態で null に設定される プレゼンテーション コントローラー promiseが、最初の プレゼンテーション接続が 確立されると プレゼンテーションコントローラー モニターを提供します。プレゼンテーションコントローラー promiseは、プレゼンテーション コントローラーモニターで解決される Promise によって表現されます。

制御側閲覧コンテキストでは、初期状態で null に設定される デフォルト プレゼンテーション要求は、ユーザーがブラウザー chrome から プレゼンテーション接続を開始しようとするときに使用する要求を表します。

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

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

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

6.2 インターフェイス Presentation

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

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

presentation 属性は、 Presentation インターフェイスのインスタンスを取得するために使用されます。この属性は、 Presentation インスタンスを返さなければなりません。

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

制御側ユーザーエージェントは、 次の部分インターフェイスを実装しなければなりません。

WebIDLpartial interface Presentation {
  attribute PresentationRequest? defaultRequest;
};

defaultRequest 属性は、存在する場合は デフォルトプレゼンテーション要求を返し、 それ以外の場合は null を返さなければなりません。設定時には、デフォルト プレゼンテーション要求を新しい値に設定しなければなりません。

制御側ユーザーエージェントは、ユーザーがユーザージェスチャーによってその意図を示した場合にのみ、 デフォルトプレゼンテーション要求を使用してプレゼンテーションを開始するべきです。たとえば、 ブラウザー chrome のボタンをクリックした場合です。

デフォルトプレゼンテーション 要求を使用してプレゼンテーションを開始するには、制御側ユーザーエージェントは、 デフォルトプレゼンテーション 要求からプレゼンテーションを開始する手順に従わなければなりません。

デフォルト プレゼンテーション要求を使用したプレゼンテーション開始のサポートは任意です。

注記
制御側ユーザーエージェントデフォルトプレゼンテーション要求から プレゼンテーションを開始することをサポートしていない場合、そのユーザー エージェントは defaultRequest に設定された値を無視するべきです。

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

受信側ユーザーエージェントは、 次の部分インターフェイスを実装しなければなりません。

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

receiver 属性は、受信側閲覧 コンテキスト作成されたときに 受信側ユーザーエージェントによって作成され、 受信側閲覧 コンテキストに関連付けられた PresentationReceiver インスタンスを返さなければなりません。その他の 閲覧コンテキスト受信側閲覧 コンテキスト子ナビゲーターを含む)では、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 オブジェクトは、 制御側ユーザーエージェントによって提供される 制御側閲覧コンテキスト内で実装されなければなりません。

PresentationRequest が構築されるとき、指定された urlsプレゼンテーション要求 URLのリストとして使用されなければならず、それぞれが PresentationRequest インスタンスに対して可能な プレゼンテーション URLとなります。

6.3.1 PresentationRequest の構築

PresentationRequest コンストラクターが 呼び出されたとき、 制御側ユーザーエージェントは次の手順を実行しなければなりません。

入力
url または urls、すなわち プレゼンテーション要求 URL
出力
新しい PresentationRequest オブジェクト
  1. 文書オブジェクトの 有効なサンドボックスフラグ 集合サンドボックス化された プレゼンテーション閲覧コンテキストフラグ が設定されている場合、SecurityError を投げ、 これらの手順を中止します。
  2. urls が空のシーケンスの場合、 NotSupportedError投げ、 残りのすべての手順を中止します。
  3. 単一の url が指定された場合、urlsurl を含む 1 要素の配列とします。
  4. presentationUrls を URL の空のリストとします。
  5. urls 内の各 URL U について:
    1. A を、 現在の設定オブジェクトによって指定される API ベース URL を基準に U をパースした結果である絶対 URL とします。
    2. URL をパースするアルゴリズムが失敗した場合、 SyntaxError 例外を 投げ、 残りのすべての手順を中止します。
    3. A のスキームが 制御側 ユーザーエージェントによってサポートされている場合、ApresentationUrls に追加します。
  6. presentationUrls が空のリストの場合、 NotSupportedError を投げ、 残りのすべての手順を中止します。
  7. presentationUrls のいずれかのメンバーが 潜在的に信頼できる URLでない場合、 SecurityError を投げ、これらの手順を中止します。
  8. presentationUrls をその プレゼンテーション要求 URL とする新しい PresentationRequest オブジェクトを構築し、 それを返します。

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

start メソッドが呼び出されたとき、 ユーザーエージェントは、プレゼンテーション ディスプレイを選択するために次の手順を実行しなければなりません。

入力
presentationRequest、すなわち PresentationRequest オブジェクトであり、そのオブジェクトが start の呼び出しを受け取ったもの
出力
新しい Promise
  1. 文書の アクティブウィンドウ一時的なアクティベーションを持たない場合、 InvalidAccessError 例外で拒否された Promise を返し、これらの手順を中止します。
  2. topContext を、制御側閲覧 コンテキストトップレベル閲覧 コンテキストとします。
  3. topContext または topContext子孫ナビゲーター内のいずれかの 閲覧コンテキストにおいて、以前の start 呼び出しによる未決済の Promise がすでに存在する場合、 OperationError 例外で 拒否された新しい Promise を返し、 残りのすべての手順を中止します。
  4. P を新しい Promise とします。
  5. P を返しますが、これらの手順を 並列に実行し続けます。
  6. ユーザーエージェント利用可能な プレゼンテーションディスプレイのリストを監視していない場合、 利用可能なプレゼンテーションディスプレイのリストを 監視する手順を 並列に実行します。
  7. presentationUrlspresentationRequestプレゼンテーション要求 URL とします。
  8. プレゼンテーション ディスプレイの使用許可と、1 つのプレゼンテーションディスプレイの選択をユーザーに要求します。
  9. 次のいずれかが真の場合:
    1. 利用可能な プレゼンテーションディスプレイのリストが空であり、 ユーザー許可の要求が完了するまで空のままである場合。
    2. 利用可能な プレゼンテーション ディスプレイのリスト内のどのメンバーも、 presentationUrls のいずれのメンバーに対しても 利用可能な プレゼンテーションディスプレイでない場合。
    その場合、次の手順を実行します:
    1. PNotFoundError 例外で 拒否するための Presentation API タスクをキューに入れます
    2. 残りのすべての手順を中止します。
  10. ユーザーがディスプレイの使用許可を拒否した場合、 PNotAllowedError 例外で拒否するための Presentation API タスクをキューに入れ、 残りのすべての手順を中止します。
  11. それ以外の場合、ユーザーはディスプレイの使用を許可しています。 D をそのディスプレイとします。
  12. presentationRequestD、および P を用いて プレゼンテーション 接続を開始する手順を実行します。
注記
許可要求およびディスプレイ選択の実装の詳細はユーザーエージェントに委ねられます。たとえば、 ユーザーにダイアログを表示して利用可能なディスプレイを選択させる (許可を与える)か、選択をキャンセルさせる(許可を 拒否する)ことができます。複数のディスプレイを利用できる プレゼンテーションを容易にするため、実装者には、利用可能なディスプレイが 現在使用中であるかどうかをユーザーに示すことが推奨されます。
注記
受信側ユーザーエージェントには、ユーザーが目的のディスプレイを選択しやすくするため、 プレゼンテーションディスプレイについて、たとえば「リビングルームのテレビ」のようなユーザーに分かりやすい 名前を広告することが推奨されます。受信側ユーザーエージェントの実装者には、 ユーザーに分かりやすい名前のロケールおよび意図されたテキスト方向も広告することが推奨されます。制御側ユーザーエージェントの実装者には、 ロケールとテキスト方向が既知の場合、それらを使用してユーザーに分かりやすい名前をレンダリングすることが推奨されます。

6.3.3 デフォルトプレゼンテーション要求からのプレゼンテーションの開始

ユーザーがブラウザー chrome(専用ボタン、ユーザージェスチャー、またはその他のシグナルを介して)を使用し、 プレゼンテーションディスプレイ上で文書のプレゼンテーションを開始する意図を示した場合、そのユーザーエージェントは、 デフォルトプレゼンテーション要求から プレゼンテーションを開始するために次の手順を実行しなければなりません。文書に デフォルトプレゼンテーション要求が設定されていない場合、 これらの手順を実行してはなりません。

入力
W、ユーザーがプレゼンテーション開始の 意図を示した文書
presentationRequestW に設定された navigator.presentation.defaultRequest の非 null
D、プレゼンテーションの対象となる プレゼンテーションディスプレイ
  1. 次の手順を 並列に実行します。
  2. presentationUrlspresentationRequestプレゼンテーション要求 URL とします。
  3. D利用可能なプレゼンテーションディスプレイである presentationRequestプレゼンテーション要求 URLが存在しない場合、 これらの手順を中止します。
  4. presentationRequest および D を用いて プレゼンテーション 接続を開始する手順を実行します。
注記
デフォルトプレゼンテーション 要求からプレゼンテーションを開始するとき、制御側ユーザーエージェントは、 同じユーザージェスチャーでプレゼンテーションを要求し、目的の プレゼンテーション ディスプレイを選択することをユーザーに許可してもかまいません。たとえば、ブラウザー chrome がメニューからディスプレイを選択できるようにしたり、 近距離無線通信 (NFC)対応ディスプレイをタップできるようにしたりできます。

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

ユーザーエージェントプレゼンテーション 接続を開始する場合、次の手順を実行しなければなりません。

入力
presentationRequest、プレゼンテーション接続を開始するために使用される PresentationRequest
D、選択された プレゼンテーションディスプレイ
P、新しい プレゼンテーション接続で解決される任意の Promise
  1. 表明: これは 並列に実行されています。
  2. I を、制御対象 プレゼンテーションの集合内の既知の プレゼンテーション接続のすべての プレゼンテーション識別子の中で一意な、新しい 有効なプレゼンテーション 識別子とします。フィンガープリンティングを避けるため、実装は プレゼンテーション識別子を、 [rfc4122] の形式 4.4 または 4.5 に従って生成された UUID に設定するべきです。
  3. 新しい PresentationConnection S を作成します。
  4. Sプレゼンテーション識別子 I に設定します。
  5. presentationUrlspresentationRequestプレゼンテーション要求 URL とします。
  6. Sプレゼンテーション URLを、 利用可能なプレゼンテーション ディスプレイのリストにエントリー (presentationUrl, D) が存在する、 presentationUrls 内の最初の presentationUrl に設定します。
  7. Sプレゼンテーション接続状態connecting に設定します。
  8. S制御対象 プレゼンテーションの集合に追加します。
  9. P が指定されている場合、 PS解決するための Presentation API タスクをキューに入れます
  10. presentationRequest において、 connection 属性を S に初期化した PresentationConnectionAvailableEvent インターフェイスを使用する、 connectionavailable という名前のイベントを 発火するための Presentation API タスクをキューに入れます。 このイベントはバブリングしてはならず、キャンセル可能であってはなりません。
  11. U を D に接続されたユーザーエージェントとします。
  12. 次の手順が失敗した場合、残りのすべての手順を中止し、 closeReasonerrorcloseMessage を失敗を説明する人間が読めるメッセージとして、Sプレゼンテーション接続を 閉じます
  13. 実装固有のメカニズムを使用して、DpresentationUrl、および I をパラメーターとして 受信側閲覧 コンテキストを作成するよう U に通知します。
  14. S を使用して プレゼンテーション 接続を確立します
注記
presentationUrl は、ローカルまたはリモートのユーザーエージェントがアクセス可能な リソースを指定するべきです。この仕様では、 http または https スキームを使用する presentationUrl の動作を定義します。他のスキームの動作は、 この仕様では定義されていません。

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

reconnect メソッドが呼び出されたとき、ユーザーエージェントは、プレゼンテーションに再接続するために次の 手順を実行しなければなりません。

入力
presentationRequest、すなわち PresentationRequest オブジェクトであり、そのオブジェクト上で reconnect が呼び出されたもの
presentationId、有効な プレゼンテーション識別子
出力
P、新しい Promise
  1. P を新しい Promise とします。
  2. P を返しますが、これらの手順を 並列に実行し続けます。
  3. 制御対象 プレゼンテーションの集合から、次の基準を満たす PresentationConnection を検索します。
  4. そのような PresentationConnection が存在する場合、 次の手順を実行します。
    1. existingConnection をその PresentationConnection とします。
    2. PexistingConnection解決するための Presentation API タスクをキューに入れます
    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. PnewConnection解決するための Presentation API タスクをキューに入れます
    8. presentationRequest において、 connection 属性を newConnection に初期化した PresentationConnectionAvailableEvent インターフェイスを使用する connectionavailable という名前のイベントを 発火するための Presentation API タスクをキューに入れます。 このイベントはバブリングしてはならず、 キャンセル可能であってはなりません。
    9. newConnection を使用して プレゼンテーション 接続を確立します
    10. 残りのすべての手順を中止します。
  7. PNotFoundError 例外で 拒否するための Presentation API タスクをキューに入れます

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の少なくとも 1 つについて、現在 利用可能なプレゼンテーションディスプレイが存在するかどうかを格納します。

プレゼンテーション要求に対する プレゼンテーションディスプレイの利用可能性は、 ECMASCript コードが PresentationAvailability オブジェクトを観測できなくなったとき、 ガベージコレクションの対象となります。

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

value 属性は、最後に設定された値を返さなければなりません。この値は、 利用可能な プレゼンテーションディスプレイのリストを監視するアルゴリズムによって初期化および更新されます。

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

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

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

  1. A は生存している PresentationAvailability オブジェクトです。
  2. availabilityUrlsプレゼンテーション 要求 URL のリストであり、PresentationRequest に対して getAvailabilityA を作成するために呼び出されたときのものです。

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

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

プレゼンテーション 利用可能性オブジェクトの集合が空でない間、 ユーザーエージェントは、ページが PresentationAvailability オブジェクトの value プロパティを使用して、 利用可能なディスプレイがある場合にのみプレゼンテーションを提供できるようにするため、 利用可能な プレゼンテーションディスプレイのリストを継続的に監視してもかまいません。しかし、 ユーザーエージェントは、 たとえばプラットフォームや消費電力の 制約により、バックグラウンドでの継続的な利用可能性監視をサポートしない場合があります。この場合、 getAvailability が返す Promise拒否され、 利用可能な プレゼンテーションディスプレイのリストを監視するアルゴリズムは、 プレゼンテーションディスプレイを選択するアルゴリズムの一部としてのみ実行されます。

プレゼンテーション 利用可能性オブジェクトの集合が空である場合 (つまり、監視されている availabilityUrls が存在しない場合)、 ユーザーエージェントは、 省電力の非機能要件を満たすため、 利用可能な プレゼンテーションディスプレイのリストを監視するべきではありません。さらに電力を節約するため、 ユーザーエージェントは、 PresentationAvailability オブジェクトを保持するページが フォアグラウンドにあるかどうかも追跡してもかまいません。 この情報を使用して、実装固有の プレゼンテーションディスプレイの検出を再開または一時停止できます。

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

getAvailability メソッドが呼び出されたとき、 ユーザーエージェントは次の手順を実行しなければなりません。

入力
presentationRequest、すなわち PresentationRequest オブジェクトであり、そのオブジェクトが getAvailability の呼び出しを受け取ったもの
出力
新しい Promise
  1. P を、 presentationRequestJavaScript レルムで構築された新しい Promise とします。
  2. P を返しますが、これらの手順を 並列に実行し続けます。
  3. ユーザーエージェントがバックグラウンドで継続的に 利用可能な プレゼンテーションディスプレイのリストを監視できないものの、後で接続を開始するために プレゼンテーションディスプレイを見つけることはできる場合:
    1. PNotSupportedError 例外で 拒否するための Presentation API タスクをキューに入れます
    2. 残りのすべての手順を中止します。
  4. presentationRequest に対する プレゼンテーションディスプレイの利用可能性null でない場合:
    1. P をその要求の プレゼンテーションディスプレイの 利用可能性解決するための Presentation API タスクをキューに入れます
    2. 残りのすべての手順を中止します。
  5. presentationRequest に対する プレゼンテーション ディスプレイの利用可能性を、 presentationRequestJavaScript レルムで構築された、新たに作成した PresentationAvailability オブジェクトに設定し、 A をそのオブジェクトとします。
  6. タプル (A, presentationUrls) を作成し、 プレゼンテーション 利用可能性オブジェクトの集合に追加します。
  7. 利用可能な プレゼンテーションディスプレイのリストを監視するアルゴリズムを実行します。
    注記
    前の手順で追加されたタプルを プレゼンテーション 利用可能性オブジェクトの集合から取得するため、監視アルゴリズムは 前の手順の後に少なくとももう 1 回実行されなければなりません。
  8. PA解決するための Presentation API タスクをキューに入れます

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

プレゼンテーション 利用可能性オブジェクトの集合が 空でないか、プレゼンテーション ディスプレイを 選択するための保留中の要求がある場合、ユーザーエージェントは、次の 手順を実行することによって 利用可能な プレゼンテーションディスプレイのリストを監視しなければなりません。

  1. 表明: これは 並列に実行されています。
  2. availabilitySetプレゼンテーション 利用可能性オブジェクトの集合の浅いコピーとします。
  3. プレゼンテーション ディスプレイを選択するための保留中の要求が PresentationRequest に対して存在し、かつ PresentationRequestプレゼンテーションディスプレイの 利用可能性null の場合、次の 下位手順を実行します。
    1. A を新たに作成された PresentationAvailability オブジェクトとします。
    2. タプル (A, presentationUrls) を作成します。ここで presentationUrlsPresentationRequestプレゼンテーション要求 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. Achange という名前のイベントを 発火します
注記
制御側ユーザーエージェントは、 start および getAvailability からの要求をグループ化し、 それらを 複数の 閲覧コンテキストにわたって集約することを含め、 利用可能な プレゼンテーションディスプレイのリストを監視する頻度を選択できます。

プレゼンテーションディスプレイの利用可能性 オブジェクトが ガベージコレクションの対象となった場合、ユーザーエージェントは次の 手順を実行するべきです。

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

制御側ユーザーエージェントは、 オブジェクトに関連付けられた接続が作成されたとき、 PresentationRequest 上で connectionavailable という名前の イベントを発火します。これは、 作成された PresentationConnection オブジェクトに connection 属性を設定した PresentationConnectionAvailableEvent インターフェイスを使用して、PresentationRequest インスタンスで発火します。この イベントは、コントローラーに対して作成される各接続について発火します。これは、コントローラーstart または reconnect を呼び出した場合、または 制御側ユーザーエージェントdefaultRequest を介してコントローラーの代わりに接続を作成した場合です。

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

connection 属性は、 PresentationConnection オブジェクトが 作成されたときに設定された値を返さなければなりません。

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

6.5 インターフェイス PresentationConnection

プレゼンテーション接続は、 PresentationConnection オブジェクトによって表されます。制御側ユーザー エージェント受信側ユーザーエージェントはどちらも、 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;

  // 通信
  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 状態であっても、メッセージの送受信が 成功することを意味するわけではありません。通信チャネルはいつでも突然 閉じられる可能性があるためです。このような状況をできるだけ早く 検出したいアプリケーションは、独自のキープアライブメカニズムを実装するべきです。

close メソッドが PresentationConnection S 上で呼び出されたとき、 ユーザーエージェントは、 closeReasonclosedcloseMessage を空のメッセージとして、 Sプレゼンテーション 接続を閉じ始めなければなりません。

terminate メソッドが 制御側 閲覧コンテキスト内の PresentationConnection S 上で呼び出されたとき、ユーザーエージェントは、S を使用して 制御側 閲覧コンテキストでプレゼンテーションを終了するアルゴリズムを実行しなければなりません。

terminate メソッドが 受信側閲覧コンテキスト内の PresentationConnection S 上で 呼び出されたとき、ユーザーエージェントは、S を使用して 受信側 閲覧コンテキストでプレゼンテーションを終了するアルゴリズムを実行しなければなりません。

binaryType 属性は、 BinaryType の値のいずれかを取ることができます。PresentationConnection オブジェクトが 作成されたとき、その binaryType 属性は 文字列 "arraybuffer" に設定されなければなりません。取得時には、最後に設定された値を 返さなければなりません。設定時には、ユーザーエージェントは 属性を新しい値に設定しなければなりません。

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

send メソッド が PresentationConnection S 上で 呼び出されたとき、 ユーザーエージェントは、S を介して メッセージを送信する アルゴリズムを実行しなければなりません。

PresentationConnection オブジェクト S が 破棄されたとき(それを所有する文書がナビゲート中または 閉じられているため)、Sプレゼンテーション接続 状態connecting または connected の場合、ユーザーエージェント は、closeReasonwentawaycloseMessage を空として、Sプレゼンテーション 接続を閉じ始めなければなりません。

ユーザーエージェント宛先 閲覧コンテキストから、PresentationConnection S を閉じるべきであるというシグナルを受信した場合、 closeReasonclosed または wentawaycloseMessage を空として、Sプレゼンテーション 接続を閉じなければなりません。

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

ユーザーエージェントが、プレゼンテーション接続を使用して プレゼンテーション 接続を確立する場合、 次の手順を実行しなければなりません。

入力
presentationConnection、接続される PresentationConnection オブジェクト
  1. 表明: これは 並列に実行されています。
  2. presentationConnectionプレゼンテーション接続状態connecting でない場合、 残りのすべての手順を中止します。
  3. presentationConnection から 受信側閲覧コンテキストへの接続を要求します。presentationConnectionプレゼンテーション 識別子は、この要求とともに送信されなければなりません。
  4. 接続が正常に完了した場合、次の手順を実行するための Presentation API タスクをキューに入れます
    1. presentationConnectionプレゼンテーション 接続状態connected に設定します。
    2. presentationConnectionconnect という名前のイベントを 発火します
  5. 接続を完了できない場合、closeReasonerrorcloseMessage を失敗を説明する人間が読めるメッセージとして、 Sプレゼンテーション 接続を閉じます
注記
リモートディスプレイに表示し、 制御側閲覧コンテキストと表示された 文書を接続するために使用されるメカニズムは、ユーザーエージェントの実装上の選択です。 接続は、以下の メッセージを送信する手順および メッセージを受信する手順で説明されるとおり、 DOMString およびバイナリペイロードを信頼性があり 順序どおりに運べる双方向メッセージング抽象化を提供しなければなりません。

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

注記
制御側 閲覧コンテキスト受信側閲覧 コンテキスト間の接続について特定のトランスポートは 義務付けられていません。ただし、send を複数回呼び出す場合、 メッセージがもう一方の端へ確実かつ順番どおりに配信されることを保証しなければなりません。 トランスポートは、信頼性モードの RTCDataChannel と同等に機能するべきです。

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

ユーザーエージェントが、プレゼンテーション接続を介して メッセージを 送信する場合、 次の手順を実行しなければなりません。

入力
presentationConnection、もう一方の閲覧コンテキストに接続された プレゼンテーション 接続
messageOrData、もう一方の閲覧コンテキストに 送信する プレゼンテーションメッセージ データ
  1. presentationConnectionstate プロパティが connected でない場合、 InvalidStateError 例外を 投げます
  2. presentationConnectionクローズ 手順が開始されている場合、これらの 手順を中止します。
  3. プレゼンテーションメッセージ型 messageType を、 messageOrDataArrayBufferArrayBufferView、または Blob 型の場合は binary とします。 messageOrDataDOMString 型の場合、 messageTypetext とします。
  4. 実装固有のメカニズムを使用して、 messageOrData の内容を プレゼンテーションメッセージ データとして、messageTypeプレゼンテーションメッセージ 型として 宛先閲覧 コンテキストに送信します。
  5. 前の手順で回復不能なエラーが発生した場合、 closeReasonerrorcloseMessage を発生したエラーの説明として、 presentationConnectionプレゼンテーション 接続を即座に閉じます
注記

プレゼンテーション 接続を介したメッセージ送信エラーからアプリケーションが 回復できるようにするため、ユーザーエージェントは closeMessage に、どの試行が失敗したかの詳細と、 失敗理由を説明する人間が読める文字列を含めるべきです。 closeMessage の例:

  • テキストメッセージを送信できません (network_error): "hello"DOMString メッセージの場合、 "hello" は失敗した メッセージの先頭 256 文字です。
  • バイナリメッセージを送信できません (invalid_message)ArrayBufferArrayBufferView、および Blob メッセージの場合です。
注記
プレゼンテーション 接続を介してユーザーに表示される文字列を送信する場合、ページ作者は、 宛先ユーザーエージェントが文字列を最適にレンダリングする方法を判断できるように、 ロケール情報も確実に伝播されるよう注意するべきです。1 つの解決策については、を参照してください。

6.5.3 PresentationConnection を介したメッセージの受信

ユーザーエージェントが、 プレゼンテーションメッセージデータプレゼンテーションメッセージ型からなる送信を リモート側から受信したとき、PresentationConnection を介して メッセージを受信するために、次の手順を 実行しなければなりません。

入力
presentationConnection、メッセージを受信する プレゼンテーション 接続
messageType、メッセージの プレゼンテーションメッセージ 型
messageData、メッセージの プレゼンテーションメッセージ データ
  1. 表明: これは 並列に実行されています。
  2. presentationConnectionstate プロパティが connected でない場合、 これらの手順を中止します。
  3. event を、 MessageEvent インターフェイスを使用し、 イベント型を message として イベントを作成した結果とします。このイベントはバブリングせず、キャンセル可能ではありません。
  4. event の data 属性を次のように初期化します。
    1. messageTypetext の場合、 eventdata 属性を、 型 DOMStringmessageData に初期化します。
    2. messageTypebinary で、かつ binaryType 属性が "blob" に設定されている場合、 eventdata 属性を、 messageData を生の データとする新しい Blob オブジェクトに初期化します。
    3. messageTypebinary で、かつ binaryType 属性が "arraybuffer" に設定されている場合、eventdata 属性を、内容が messageData である新しい ArrayBuffer オブジェクト に初期化します。
  5. presentationConnectionevent発火するための Presentation API タスクをキューに入れます

ユーザーエージェントpresentationConnection を介して メッセージを受信している間に回復不能なエラーに遭遇した場合、 closeReasonerror として presentationConnectionプレゼンテーション 接続を即座に閉じなければなりません。発生したエラーの人間が読める説明を 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 = "";
};

プレゼンテーション接続closed 状態になったとき、 PresentationConnectionCloseEvent が発火します。reason 属性は、接続が閉じられた理由を示します。この属性は、 PresentationConnectionCloseReason の値のいずれかを 取ることができます。

  • error は、プレゼンテーションへの 接続または通信のメカニズムで 回復不能なエラーが発生したことを意味します。
  • closed は、 PresentationConnection によって接続されていた 制御側閲覧 コンテキストまたは 受信側閲覧 コンテキストのいずれかが close() を呼び出したことを意味します。
  • wentaway は、ブラウザーが 接続を閉じたことを意味します。たとえば、接続を所有していた閲覧コンテキストが ナビゲートされたか、破棄された場合です。

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

PresentationConnectionCloseEvent コンストラクターが 呼び出されたとき、ユーザーエージェントは、 reason 属性をコンストラクターに渡された PresentationConnectionCloseEventInit オブジェクトの reason メンバーに設定し、 message 属性を、 この PresentationConnectionCloseEventInit オブジェクトの message メンバーが設定されている場合はそれに、 それ以外の場合は空の文字列に設定した、新しい PresentationConnectionCloseEvent オブジェクトを構築しなければなりません。

6.5.5 PresentationConnection のクローズ

ユーザーエージェントプレゼンテーション 接続を閉じ始める場合、次のことを行わなければなりません。

入力
presentationConnection、閉じる プレゼンテーション 接続
closeReason、接続を閉じる理由を 説明する PresentationConnectionCloseReason
closeMessage、接続が閉じられた理由の詳細を含む 人間が読めるメッセージ
  1. presentationConnectionプレゼンテーション接続状態connecting または connected でない場合、 残りの 手順を中止します。
  2. presentationConnectionプレゼンテーション接続状態closed に設定します。
  3. 対応する PresentationConnection を閉じる意図を 宛先閲覧 コンテキストへ通知し始め、 closeReason をそのコンテキストに渡します。ユーザーエージェントは、 次の手順に進む前に、対応する PresentationConnection が 実際に閉じられたという確認を待つ必要はありません。
  4. closeReasonwentaway でない場合、 presentationConnectioncloseReason、および closeMessage を用いて プレゼンテーション 接続を閉じる手順をローカルで実行します。

ユーザーエージェントプレゼンテーション 接続を閉じる場合、次のことを行わなければなりません。

入力
presentationConnection、閉じる プレゼンテーション 接続
closeReason、接続を閉じる理由を 説明する PresentationConnectionCloseReason
closeMessage、接続が閉じられた理由の詳細を含む 人間が読めるメッセージ。
  1. presentationConnection に対する保留中の プレゼンテーション 接続を閉じる タスクが存在するか、presentationConnection に対する プレゼンテーション 接続を閉じるタスクがすでに実行されている場合、 残りの手順を中止します。
  2. 次の手順を実行するための Presentation API タスクをキューに入れます
    1. presentationConnectionプレゼンテーション 接続状態connectingconnected、 または closed のいずれでもない場合、残りの手順を中止します。
    2. presentationConnectionプレゼンテーション 接続状態closed でない場合、 closed に設定します。
    3. presentationConnection が、 受信側閲覧コンテキスト受信する プレゼンテーション接続を監視する 結果として作成された場合、次の 下位手順を実行します。
      1. presentationConnectionプレゼンテーション コントローラーの集合から削除します。
      2. プレゼンテーションコントローラー モニタープレゼンテーション コントローラーの集合で設定します。
    4. presentationConnection で、 reason 属性を closeReason に、message 属性を closeMessage に初期化した PresentationConnectionCloseEvent インターフェイスを使用する close という名前のイベントを 発火します。このイベントはバブリングしてはならず、 キャンセル可能であってはなりません。

6.5.6 制御側閲覧コンテキストでのプレゼンテーションの終了

制御側ユーザーエージェントconnection を使用して 制御側閲覧コンテキストで プレゼンテーションを終了する場合、 次の手順を実行しなければなりません。

  1. connectionプレゼンテーション接続状態connected または connecting でない場合、 これらの 手順を中止します。
  2. それ以外の場合、制御側ユーザー エージェント内の 制御対象 プレゼンテーションの集合にある各 known connection について:
    1. known connectionconnectionプレゼンテーション識別子が等しく、かつ known connectionプレゼンテーション接続状態connected または connecting の場合、known connection関連する グローバルオブジェクトを指定し、プレゼンテーションタスク ソース上に、次の手順を実行する グローバルタスクをキューに入れます
      1. known connectionプレゼンテーション接続 状態terminated に設定します。
      2. known connectionterminate という名前のイベントを 発火します
  3. 並列に、実装固有のメカニズムを使用して、プレゼンテーションの 終了要求を送信し、その 受信側ユーザーエージェントに届けます。

6.5.7 受信側閲覧コンテキストでのプレゼンテーションの終了

次のいずれかが発生した場合、受信側ユーザーエージェント受信側閲覧 コンテキストでプレゼンテーションを終了しなければなりません。

  1. 受信側ユーザーエージェントが、 受信側閲覧 コンテキストに対応する 文書をアンロードしようとしている場合。たとえば、 そのコンテキストを新しい リソースへ ナビゲートする要求への応答として行われる場合です。
  2. ユーザーが 受信側ユーザーエージェントを介してプレゼンテーションの終了を要求した場合。
    注記

    これは、明示的なユーザー操作によって、またはユーザーエージェントの ポリシーとして発生する可能性があります。たとえば、受信側ユーザー エージェント は、すべての PresentationConnection オブジェクトが 30 分間閉じたままのプレゼンテーションを終了するよう設定できます。

  3. 制御側ユーザーエージェントが、そのプレゼンテーションについて 受信側ユーザーエージェント終了 要求を送信する場合。

受信側ユーザーエージェント受信側閲覧コンテキストで プレゼンテーションを終了する場合、次の手順を実行しなければなりません。

  1. P を終了するプレゼンテーションとし、 allControllersP に対して作成された プレゼンテーション コントローラーの集合とし、 connectedControllers を空のリストとします。
  2. allControllers 内の各 connection について、 次の手順を実行します。
    1. connectionプレゼンテーション 接続状態connected の場合、 connectionconnectedControllers に追加します。
    2. connectionプレゼンテーション 接続状態terminated に設定します。
  3. P に対する 受信側閲覧コンテキストが存在し、 そこにまだアンロードされていない P の文書がある場合、その 閲覧コンテキストに対応する 文書をアンロードし、その 閲覧コンテキストを ユーザーインターフェイスから削除して破棄します。
  4. connectedControllers 内の各 connection について、 実装固有のメカニズムを使用して P の終了確認を、 connection宛先閲覧 コンテキストを所有する 制御側ユーザーエージェントに送信します。
    注記

    制御側ユーザーエージェントにつき、 送信する必要がある終了確認は 1 つだけです。

6.5.8 制御側ユーザーエージェントでの終了確認の処理

受信側ユーザーエージェントがプレゼンテーション P の終了 確認を送信し、その確認が 制御側ユーザーエージェントによって受信された場合、制御側 ユーザーエージェントは次の手順を実行しなければなりません。

  1. P に接続されていた 制御対象 プレゼンテーションの集合内の各 connection について、 connection関連するグローバルオブジェクトを指定し、 プレゼンテーションタスク ソース上に、次の手順を実行する グローバルタスクをキューに入れます
    1. connectionプレゼンテーション 接続状態connected または connecting でない場合、後続の手順を中止します。
    2. connectionプレゼンテーション 接続状態terminated に設定します。
    3. connectionterminate という名前のイベントを 発火します

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 インターフェイスは 実装されなければならず受信側ユーザーエージェントによって提供される 受信側閲覧コンテキスト内に 実装されなければなりません。

取得時、connectionList 属性は 次の手順を実行した結果を返さなければなりません

  1. プレゼンテーションコントローラー promisenull でない場合、プレゼンテーション コントローラー promise を返し、 残りのすべての手順を中止します。
  2. それ以外の場合、プレゼンテーション コントローラー promise を、この PresentationReceiver オブジェクトの JavaScript レルムで構築された新しい Promise とします。
  3. プレゼンテーションコントローラー promise を返します。
  4. プレゼンテーションコントローラーモニターnull でない場合、プレゼンテーションコントローラー promiseプレゼンテーション コントローラーモニター解決します。

6.6.1 受信側閲覧コンテキストの作成

ユーザーエージェント受信側閲覧 コンテキストを作成する場合、次の手順を 実行しなければなりません

入力
D、ユーザーによって選択された プレゼンテーションディスプレイ
presentationUrlプレゼンテーション要求 URL
presentationIdプレゼンテーション識別子
  1. 作成して、新しい トップレベル閲覧コンテキスト C を、D に コンテンツを表示するよう設定します。
  2. Cセッション履歴を空の リストに設定します。
  3. Cサンドボックス化されたモーダルフラグサンドボックス化された 補助ナビゲーション閲覧コンテキストフラグを設定します。
  4. 受信側ユーザーエージェントが [PERMISSIONS] を実装している場合、 C に対するすべての 権限 記述子型権限状態"denied" に設定します。
  5. C のために新しい空の Cookie ストアを作成します。
  6. C のために、HTTP 認証状態を保持する新しい空のストアを作成します。
  7. C のために、セッションストレージ領域および ローカルストレージ領域用の新しい空のストレージを作成します。
  8. 受信側ユーザーエージェントが [INDEXEDDB] を実装している場合、 C のために IndexedDB データベース用の新しい空のストレージを作成します。
  9. 受信側ユーザーエージェントが [SERVICE-WORKERS] を実装している場合、新しい空の登録済み Service Worker 登録リストと、 C のための新しい空の Cache オブジェクト集合を作成します。
  10. CpresentationUrlナビゲートします。
  11. presentationId および presentationUrl を用いて、C に対する 受信する プレゼンテーション接続の監視を開始します。

表示された文書によって 作成されたすべての 子ナビゲーター、すなわち 受信側閲覧 コンテキストを自身の トップレベル閲覧 コンテキストとして持つものにも、上記の制限 2~4 が 適用されなければなりません。さらに、 それらには ユーザー アクティベーションなしのトップレベルナビゲーションをサンドボックス化する 閲覧コンテキストフラグ設定されなければなりません。これらすべての 閲覧 コンテキストは、上記の機能 5~10 について同じ閲覧状態(ストレージ)を 共有しなければなりません

トップレベル閲覧コンテキストが 新しいリソースへのナビゲーションを試みて ナビゲートする手順を実行するとき、そのコンテキストは ナビゲートを許可されているかどうかを判定するために 手順 1 に 従わなければなりません。さらに、フラグメント識別子へ ナビゲートする場合、または 自身の文書を再読み込みする場合を除き、 自身を新しいリソースへナビゲートすることを 許可してはなりません

注記

これにより、ユーザーは プレゼンテーション ディスプレイを選択するときに表示されるプレゼンテーション URL のオリジンに基づいて 許可を与えることができます。

トップレベル閲覧コンテキストが ナビゲートを 許可されていなかった場合、そのコンテキストはリソースを新しい トップレベル閲覧コンテキストで開くことを 提示するべきではありませんが、それ以外の場合は ナビゲートする手順整合するべきです

Window クライアントおよび Worker クライアントで、 受信側閲覧コンテキストおよびその 子孫ナビゲーターに関連付けられたものは、 相互に関連付けられた Service Workerへ公開してはなりません。

受信側閲覧コンテキストが終了したとき、それに関連付けられたすべての Service Workerおよびその 子孫ナビゲーター内の 閲覧 コンテキスト登録解除され、終了されなければなりません受信側閲覧コンテキストおよびその 子孫ナビゲーター内の 閲覧コンテキスト に関連付けられたすべての閲覧状態、これには セッション 履歴Cookie ストア、すべての HTTP 認証状態、すべての データベースセッション ストレージ領域ローカルストレージ領域、登録済み Service Worker 登録のリスト、および Cache オブジェクトを含め、破棄しなければならず、他のいかなる 閲覧 コンテキストにも使用してはなりません。

注記

このアルゴリズムは、1-UA および 2-UA プレゼンテーションで相互運用可能な動作を可能にする、明確に定義された環境を作成し、 2-UA プレゼンテーションに使用される プレゼンテーションディスプレイに残る状態の量を最小限にすることを意図しています。

受信側ユーザーエージェントは、受信側閲覧コンテキスト内のリソースを、 制御側ユーザーエージェントの言語設定を反映する HTTP Accept-Language ヘッダー(すなわち、制御側ユーザーエージェントが 送信したであろうものと同じ Accept-Language)を用いて 取得するべきです。これは、受信側ユーザーエージェントが、 ユーザーの設定を反映したフォントおよびロケール固有の属性で プレゼンテーションをレンダリングするのに役立ちます。

注記

プレゼンテーションディスプレイの動作環境を考慮すると、 一部の Web API は設計上動作しない(たとえば、ユーザー入力を 必要とする)か、不要になります(たとえば、ウィンドウ 管理を試みる場合)。受信側ユーザーエージェントはこの点を認識しておくべきです。 さらに、モーダルなユーザーインターフェイスは慎重に処理する必要があります。これらの 操作のほとんどを防止するため、サンドボックス化されたモーダルフラグ受信側閲覧コンテキストに設定されます。

注記

適合性で述べたように、制御側ユーザーエージェントであると同時に 受信側ユーザー エージェントでもあるユーザーエージェントは、受信側閲覧 コンテキストが追加のプレゼンテーションを作成することを許可してもかまいません(したがって、そのコンテキストも 制御側閲覧 コンテキストになります)。Web 開発者は navigator.presentation.receiver を使用して、 文書が受信側閲覧コンテキストとして読み込まれたことを検出できます。

6.7 インターフェイス PresentationConnectionList

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

connections 属性は、プレゼンテーション コントローラーの集合内にある、終了していない プレゼンテーション 接続の集合を 返さなければなりません

6.7.1 受信するプレゼンテーション接続の監視

受信側ユーザーエージェントが、制御側閲覧 コンテキストから 受信側閲覧 コンテキストへの 受信する プレゼンテーション接続の監視を開始する場合、実装 固有のメカニズムを使用して、制御側閲覧コンテキストからの 受信接続要求を待ち受け、受け入れ なければなりません。新しい接続要求が 制御側閲覧コンテキストから受信されたとき、受信側ユーザー エージェントは次の手順を 実行しなければなりません

入力
I、受信接続 要求とともに 制御側閲覧コンテキストから渡された プレゼンテーション識別子
presentationId受信側閲覧コンテキストを 作成するために使用された プレゼンテーション識別子
presentationUrl受信側閲覧コンテキストを 作成するために使用された プレゼンテーション要求 URL
  1. 表明: これは 並列に実行されています。
  2. presentationIdI が等しくない場合、 接続を拒否し、残りのすべての手順を中止します。
  3. 新しい PresentationConnection S を作成します。
  4. Sプレゼンテーション識別子 I に設定します。
  5. Sプレゼンテーション URLpresentationUrl に設定します。
  6. 実装固有の メカニズムを使用して、制御側と 受信側閲覧コンテキストの間の接続を確立します。
  7. 接続の確立が正常に完了した場合、S プレゼンテーション接続状態connected に設定します。 それ以外の場合、Sプレゼンテーション 接続状態closed に設定し、残りのすべての 手順を中止します。
  8. Sプレゼンテーション コントローラーの集合に追加します。
  9. プレゼンテーションコントローラーモニターnull の場合、次の手順を 並列に実行します。
    1. プレゼンテーションコントローラー モニターを、受信側 閲覧コンテキストPresentationReceiver オブジェクトの JavaScript レルムで構築された新しい PresentationConnectionList とします。
    2. プレゼンテーションコントローラー モニタープレゼンテーション コントローラーの集合で設定します。
    3. プレゼンテーションコントローラー promisenull でない場合、プレゼンテーションコントローラー promiseプレゼンテーションコントローラー モニター 解決するための Presentation API タスクをキューに入れます
    4. 残りのすべての手順を中止します。
  10. それ以外の場合、次の手順を 並列に実行します。
    1. プレゼンテーションコントローラー モニタープレゼンテーション コントローラーの集合で設定します。
    2. プレゼンテーション コントローラーモニターで、connection 属性を S に初期化した PresentationConnectionAvailableEvent インターフェイスを使用する connectionavailable という名前のイベントを 発火するための Presentation API タスクをキューに入れます。 このイベントはバブリングしてはならず、 キャンセル可能であってはなりません。

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 ユーザーインターフェイスのガイドライン

オリジンの表示

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

プレゼンテーションを要求しているオリジンを表示することで、ユーザーは どのコンテンツが要求を行っているかを理解しやすくなります。特に、 要求が 子ナビゲーターから開始された場合に有用です。たとえば、 埋め込みコンテンツが、ユーザーにクリックするよう説得して、 望ましくないプレゼンテーションの開始要求を発生させようとする可能性があります。

プレゼンテーションの存続期間中、トップレベルオリジンが 同じままであることを強制するため、ユーザーアクティベーションなしの トップレベルナビゲーションをサンドボックス化する 閲覧コンテキストフラグ受信側閲覧 コンテキストに設定されます。

デバイス間アクセス

ユーザーが プレゼンテーションを 開始すると、ユーザーはまずプレゼンテーションを排他的に制御します。 しかし、Presentation API では追加の デバイス(おそらく別のユーザーが所有するもの)が接続し、 同様にプレゼンテーションを制御できます。2 台目のデバイスが プレゼンテーションに接続したとき、接続されているすべての 制御側ユーザーエージェントは、 元のユーザーが排他的アクセスを失い、現在プレゼンテーションに 複数のコントローラーが存在することを、ブラウザー chrome を介してユーザーに通知することが推奨されます。

さらに、受信側ユーザー エージェントプレゼンテーションディスプレイとして動作するだけでなく、 ユーザー入力を受け取ることもできる場合があります。この場合、受信側 ユーザーエージェントは、受信側閲覧コンテキストが リモートの当事者の制御下にある場合(すなわち、1 つ以上の接続済みコントローラーを持つ場合)、 ブラウザー chrome を介してユーザーに通知するべきです。

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 に感謝します。

AirPlayHDMIChromecastDLNA および Miracast は、それぞれ Apple Inc.、HDMI Licensing LLC.、Google Inc.、Digital Living Network Alliance、および Wi-Fi Alliance の登録商標です。これらは背景 情報としてのみ引用されており、仕様を実装するためにそれらを使用することは 必須ではありません。

D. 勧告候補終了基準

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

この API は最近、セキュアコンテキストに制限されました。初期実装における 非セキュアコンテキストでの API の非推奨化には時間がかかります。 グループは、将来これらの実装を制限する タイムラインが存在することを条件として、非セキュアコンテキストで引き続き API を公開する 実装を含めて勧告案への移行を要求する場合があります。

これらの基準の目的上、次の用語を定義します。

独立
各実装は異なる当事者によって開発されなければならず、 他の適格な実装で使用されるコードを共有、再利用、または派生させることは できません。この仕様の 実装に関係しないコード部分は、この 要件の対象外です。
相互運用可能
公式テストスイートの対応するテストケースに合格すること。
実装
次を満たすユーザーエージェント:
  1. 仕様の適合性クラスの 1 つを実装している。
  2. 一般公開されている。実装は 出荷製品またはその他の公開バージョン(すなわち、ベータ バージョン、プレビューリリース、または「nightly build」)であってもかまいません。出荷されていない製品の リリースは、安定性を示すため、少なくとも 1 か月の期間にわたって機能を実装していなければなりません。
  3. 実験的なものではない(すなわち、テストスイートに 合格するためだけに特別に設計され、今後の通常利用を意図していない バージョンではない)。

E. 変更履歴

この節は非規範的です。

この節では、この仕様が 2016 年 7 月に勧告候補として最初に 公開されて以降に行われた変更を、グループの issue トラッカー上の 関連 issue へのリンクとともに一覧します。

E.1 2017年6月1日以降の変更

E.2 2016年7月14日以降の変更

F. 参考文献

F.1 規範的参考文献

[DIAL]
DIscovery And Launch プロトコル仕様. 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]
RFC 2119 キーワードにおける大文字と小文字の曖昧さ. 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]
セキュアコンテキスト. 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/