Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この仕様は、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 プロセス文書が適用されます。
この節は非規範的です。
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 で検討されています。
この節は非規範的です。
ユースケースと要件は、別の Presentation API のユースケースと要件文書にまとめられています。
非規範的と記された節に加えて、この仕様におけるすべてのオーサリングガイドライン、図、例、および注記は 非規範的です。この仕様のその他すべては規範的です。
この文書におけるキーワード MAY、MUST、MUST NOT、OPTIONAL、SHOULD、および SHOULD NOT は、 ここに示されているようにすべて大文字で現れる場合に、かつその場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈されます。
アルゴリズムの一部として命令形で表現される要件(たとえば、 「先頭の空白文字をすべて取り除く」や「false を返して これらの手順を終了する」)は、そのアルゴリズムを導入する際に使用された キーワード(「MUST」、「SHOULD」、「MAY」など) の意味を持つものとして解釈されます。
アルゴリズムまたは特定の手順として表現される適合性要件は、 結果が同等である限り、任意の方法で実装できます。( 特に、この仕様で定義されるアルゴリズムは 理解しやすいことを意図しており、高い性能を意図したものではありません。)
この仕様では、2 つのクラスの ユーザーエージェントに対する適合基準を説明します。
制御側ユーザーエージェントの仕様に適合する
Web ブラウザーは、この仕様に記述されているように 制御側閲覧
コンテキストを提供することにより、
プレゼンテーションを開始および制御できなければなりません。このコンテキストは、
Presentation、
PresentationAvailability、
PresentationConnection、
PresentationConnectionAvailableEvent、
PresentationConnectionCloseEvent、
および
PresentationRequest インターフェイスを実装します。
受信側
ユーザーエージェントの仕様に適合する Web ブラウザーは、この
仕様に記述されているように
受信側閲覧コンテキストを提供することによって、プレゼンテーションをレンダリングできなければなりません。
このコンテキストは、
Presentation、
PresentationConnection、
PresentationConnectionAvailableEvent、
PresentationConnectionCloseEvent、
PresentationConnectionList、
および
PresentationReceiver
インターフェイスを実装します。
1 つのユーザーエージェントが、制御側ユーザーエージェントと 受信側ユーザーエージェントの両方として動作することもできます。これは、両方の閲覧 コンテキストを提供し、それらに必要なすべてのインターフェイスを実装している場合です。同じユーザーエージェントが、 API の 1-UA モード実装のように、 1 つのプレゼンテーションについて 制御側閲覧 コンテキストと 受信側閲覧コンテキストの両方を ホストできる場合に、このようなことが起こります。
ユーザーエージェントに対して表現された適合性要件は、 文脈に応じて、制御側ユーザーエージェント、受信側ユーザー エージェント、または両方のクラスに適用されます。
用語 JavaScript
レルムおよび 現在の
レルムは、[ECMASCRIPT] で定義されているとおりに使用されます。Promise オブジェクトの文脈における
用語 解決済みおよび 拒否済みは、
[ECMASCRIPT] で定義されているとおりに使用されます。
用語 Accept-Language および HTTP 認証は、 [RFC9110] で定義されているとおりに使用されます。
用語 Cookie ストアは、 [RFC6265] で定義されているとおりに使用されます。
用語 UUID は、 [RFC4122] で定義されているとおりに使用されます。
用語 DIAL は、 [DIAL] で定義されているとおりに使用されます。
用語 文書を
再読み込みするは、[HTML] において
reload()
メソッドが呼び出されたときに実行される手順を
指します。
用語 ローカルストレージ領域は、
localStorage
属性によって公開されるストレージ領域を指し、
用語 セッションストレージ領域は、
[HTML] において
sessionStorage
属性によって公開されるストレージ領域を指します。
この仕様では、他の仕様によってエクスポートされた用語を参照しています。 B.2 参照によって定義される 用語を参照してください。また、他の仕様から次の 内部概念も参照しています。
この節は非規範的です。
この節では、Presentation API の主要な
機能の使用方法を示すコード例を示します。これらの例では、
controller.html がコントローラーを実装し、
presentation.html がプレゼンテーションを実装します。両方のページは、
ドメイン https://example.org から提供されます
(https://example.org/controller.html および
https://example.org/presentation.html)。これらの例では、
制御側ページが一度に 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>
ユーザーが presentBtn をクリックすると、このコードは
PresentationRequest に含まれる URL の 1 つの
プレゼンテーションを要求します。
start が呼び出されると、
ブラウザーは通常、利用可能な互換性のあるディスプレイのうち 1 つを
ユーザーが選択できるダイアログを表示します。
PresentationRequest 内で選択されたディスプレイと互換性のある
最初の URL が、そのディスプレイに表示されます。
start メソッドは、
プレゼンテーションの状態を追跡し、ディスプレイに読み込まれた後に
プレゼンテーションページとメッセージを交換するために使用される
PresentationConnection オブジェクトで解決されます。
<!-- controller.html -->
<script>
presentBtn.onclick = function () {
// 新しいプレゼンテーションを開始する。
request.start()
// 成功すると、プレゼンテーションへの接続が setConnection に
// 渡される。
.then(setConnection);
// それ以外の場合、ユーザーが選択ダイアログをキャンセルしたか、画面が
// 見つからなかった。
};
</script>
プレゼンテーションを開始した元のページが
PresentationConnection を閉じたり、
ナビゲートしたり、ページ自体が閉じられたりした後も、プレゼンテーションは実行を続けます。別のページは、
PresentationConnection の id を使用して、
既存のプレゼンテーションへ再接続し、その制御を再開できます。
これは、プレゼンテーションを開始したものと同じブラウザーからのみ
動作することが保証されます。
<!-- controller.html -->
<button id="reconnectBtn" style="display: none;">再接続</button>
<script>
var reconnect = function () {
// 存在する場合、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>
一部のブラウザーには、ユーザーが制御側ページと
直接対話せずにプレゼンテーションを開始する方法があります。制御側ページは、
navigator.presentation の
defaultRequest
プロパティを設定し、この方法でプレゼンテーションが
開始されたときに発生する
connectionavailable イベントを待ち受けることで、
この動作をオプトインできます。イベントとともに渡される
PresentationConnection は、
ページが start を呼び出した場合と同じように動作します。
<!-- controller.html -->
<!-- presentation.defaultRequest を設定すると、制御側 UA が
プレゼンテーションを開始するときに使用する PresentationRequest を
ページが指定できる。 -->
<script>
navigator.presentation.defaultRequest = new PresentationRequest(presUrls);
navigator.presentation.defaultRequest.onconnectionavailable = function(evt) {
setConnection(evt.connection);
};
</script>
プレゼンテーションが開始されると、返された
PresentationConnection を使用して
その状態を監視し、それとメッセージを
交換します。通常、ユーザーには制御側ページから
プレゼンテーションへの接続を切断するか、プレゼンテーションを終了するかを
選択する手段が提供されます。
制御側ページはその存続期間中に複数のプレゼンテーションへ接続したり切断したりする可能性があるため、
現在の PresentationConnection とその状態を
追跡しておくと便利です。メッセージは、
connected 状態の接続でのみ送受信できます。
<!-- controller.html -->
<button id="disconnectBtn" style="display: none;">切断</button>
<button id="stopBtn" style="display: none;">停止</button>
<script>
let connection;
// 接続済みのプレゼンテーションがある場合、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>
このコードは表示されるページ
(https://example.org/presentation.html)で実行されます。プレゼンテーションには
複数の制御側ページから接続される場合があるため、
表示されるページが
connectionList
オブジェクト上で受信する接続を待ち受けることが重要です。
<!-- presentation.html -->
<script>
var addConnection = function(connection) {
connection.onmessage = function (message) {
if (message.data == "Say hello")
connection.send("hello");
};
};
navigator.presentation.receiver.connectionList.then(function (list) {
list.connections.map(function (connection) {
addConnection(connection);
});
list.onconnectionavailable = function (evt) {
addConnection(evt.connection);
};
});
</script>
<!-- controller.html -->
<script>
connection.send('{"string": "你好,世界!", "lang": "zh-CN"}');
connection.send('{"string": "こんにちは、世界!", "lang": "ja"}');
connection.send('{"string": "안녕하세요, 세계!", "lang": "ko"}');
connection.send('{"string": "Hello, world!", "lang": "en-US"}');
</script>
<!-- presentation.html -->
<script>
connection.onmessage = function (message) {
var messageObj = JSON.parse(message.data);
var spanElt = document.createElement("SPAN");
spanElt.lang = messageObj.lang;
spanElt.textContent = messageObj.string;
document.body.appendChild(spanElt);
};
</script>
制御側ページは、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>
プレゼンテーション ディスプレイとは、実装固有の接続 技術を介してユーザーエージェントが利用できる、グラフィックおよび/または音声出力デバイスを 指します。
プレゼンテーション 接続とは、制御側 閲覧 コンテキストをその 受信側閲覧コンテキスト に関連付け、それらの間で 双方向メッセージングを可能にするオブジェクトです。各 プレゼンテーション接続 は、プレゼンテーション接続状態、他の プレゼンテーションと区別するための一意な プレゼンテーション 識別子、 および プレゼンテーションの作成または再接続に使用される 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 レルムは、現在のレルムです。
WebIDL
[SecureContext, Exposed=Window]
interface Presentation {
};
presentation 属性は、
Presentation インターフェイスのインスタンスを取得するために使用されます。この属性は、
Presentation インスタンスを返さなければなりません。
制御側ユーザーエージェントは、 次の部分インターフェイスを実装しなければなりません。
WebIDLpartial interface Presentation {
attribute PresentationRequest? defaultRequest;
};
defaultRequest 属性は、存在する場合は デフォルトプレゼンテーション要求を返し、
それ以外の場合は null を返さなければなりません。設定時には、デフォルト
プレゼンテーション要求を新しい値に設定しなければなりません。
制御側ユーザーエージェントは、ユーザーがユーザージェスチャーによってその意図を示した場合にのみ、 デフォルトプレゼンテーション要求を使用してプレゼンテーションを開始するべきです。たとえば、 ブラウザー chrome のボタンをクリックした場合です。
デフォルトプレゼンテーション 要求を使用してプレゼンテーションを開始するには、制御側ユーザーエージェントは、 デフォルトプレゼンテーション 要求からプレゼンテーションを開始する手順に従わなければなりません。
デフォルト プレゼンテーション要求を使用したプレゼンテーション開始のサポートは任意です。
defaultRequest
に設定された値を無視するべきです。
受信側ユーザーエージェントは、 次の部分インターフェイスを実装しなければなりません。
WebIDLpartial interface Presentation {
readonly attribute PresentationReceiver? receiver;
};
receiver
属性は、受信側閲覧
コンテキストが 作成されたときに
受信側ユーザーエージェントによって作成され、
受信側閲覧
コンテキストに関連付けられた PresentationReceiver
インスタンスを返さなければなりません。その他の
閲覧コンテキスト(受信側閲覧
コンテキストの 子ナビゲーターを含む)では、null を返さなければなりません。
Web 開発者は navigator.presentation.receiver を使用して、 文書がプレゼンテーションとして読み込まれたことを検出できます。
WebIDL[SecureContext, Exposed=Window]
interface PresentationRequest : EventTarget {
constructor(USVString url);
constructor(sequence<USVString> urls);
Promise<PresentationConnection> start();
Promise<PresentationConnection> reconnect(USVString presentationId);
Promise<PresentationAvailability> getAvailability();
};
PresentationRequest オブジェクトは、
制御側
閲覧コンテキストによって行われる、プレゼンテーションを開始または再接続する要求に関連付けられます。PresentationRequest
オブジェクトは、
制御側ユーザーエージェントによって提供される 制御側閲覧コンテキスト内で実装されなければなりません。
PresentationRequest が構築されるとき、指定された
urls は プレゼンテーション要求 URLのリストとして使用されなければならず、それぞれが
PresentationRequest インスタンスに対して可能な
プレゼンテーション URLとなります。
PresentationRequest の構築
PresentationRequest コンストラクターが
呼び出されたとき、
制御側ユーザーエージェントは次の手順を実行しなければなりません。
PresentationRequest オブジェクト
SecurityError を投げ、
これらの手順を中止します。
NotSupportedError を
投げ、
残りのすべての手順を中止します。
SyntaxError
例外を 投げ、
残りのすべての手順を中止します。
NotSupportedError
を投げ、
残りのすべての手順を中止します。
SecurityError
を投げ、これらの手順を中止します。
PresentationRequest オブジェクトを構築し、
それを返します。
start
メソッドが呼び出されたとき、
ユーザーエージェントは、プレゼンテーション
ディスプレイを選択するために次の手順を実行しなければなりません。
PresentationRequest
オブジェクトであり、そのオブジェクトが start
の呼び出しを受け取ったもの
Promise
InvalidAccessError
例外で拒否された Promise を返し、これらの手順を中止します。
start 呼び出しによる未決済の
Promise がすでに存在する場合、
OperationError 例外で
拒否された新しい Promise を返し、
残りのすべての手順を中止します。
Promise とします。
NotFoundError
例外で 拒否するための
Presentation API タスクをキューに入れます。
NotAllowedError
例外で拒否するための Presentation API タスクをキューに入れ、
残りのすべての手順を中止します。
ユーザーがブラウザー chrome(専用ボタン、ユーザージェスチャー、またはその他のシグナルを介して)を使用し、 プレゼンテーションディスプレイ上で文書のプレゼンテーションを開始する意図を示した場合、そのユーザーエージェントは、 デフォルトプレゼンテーション要求から プレゼンテーションを開始するために次の手順を実行しなければなりません。文書に デフォルトプレゼンテーション要求が設定されていない場合、 これらの手順を実行してはなりません。
null 値
ユーザーエージェントが プレゼンテーション 接続を開始する場合、次の手順を実行しなければなりません。
PresentationRequest
Promise
PresentationConnection
S を作成します。
connecting
に設定します。
connection
属性を S に初期化した
PresentationConnectionAvailableEvent
インターフェイスを使用する、
connectionavailable
という名前のイベントを 発火するための
Presentation API タスクをキューに入れます。
このイベントはバブリングしてはならず、キャンセル可能であってはなりません。
error、
closeMessage を失敗を説明する人間が読めるメッセージとして、S の
プレゼンテーション接続を
閉じます。
http または https スキームを使用する
presentationUrl の動作を定義します。他のスキームの動作は、
この仕様では定義されていません。
reconnect
メソッドが呼び出されたとき、ユーザーエージェントは、プレゼンテーションに再接続するために次の
手順を実行しなければなりません。
PresentationRequest
オブジェクトであり、そのオブジェクト上で reconnect
が呼び出されたもの
Promise
Promise とします。
PresentationConnection を検索します。
terminated
ではない
PresentationConnection が存在する場合、
次の手順を実行します。
PresentationConnection
とします。
connecting
または
connected
の場合、残りのすべての手順を中止します。
connecting
に設定します。
PresentationConnection を検索します。
terminated
ではない
PresentationConnection が存在する場合、
次の手順を実行します。
PresentationConnection
とします。
PresentationConnection
newConnection を作成します。
connecting
に設定します。
connection
属性を newConnection に初期化した
PresentationConnectionAvailableEvent
インターフェイスを使用する
connectionavailable
という名前のイベントを 発火するための
Presentation API タスクをキューに入れます。
このイベントはバブリングしてはならず、
キャンセル可能であってはなりません。
NotFoundError 例外で
拒否するための
Presentation API タスクをキューに入れます。
PresentationRequest
インターフェイスを実装するオブジェクトが、イベントハンドラー IDL
属性としてサポートしなければならないイベントハンドラー(および対応するイベント
ハンドラーイベント型)は次のとおりです。
| イベントハンドラー | イベントハンドラーイベント型 |
|---|---|
onconnectionavailable
|
connectionavailable
|
各 プレゼンテーション接続は、
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 の値のいずれかを
取ることができます。
connecting は、ユーザーエージェントが
宛先閲覧コンテキストとの
プレゼンテーション
接続の確立を試みていることを意味します。これは、
PresentationConnection オブジェクトが
作成されたときの初期状態です。
connected は、プレゼンテーション
接続が確立され、通信が可能であることを意味します。
closed は、プレゼンテーション接続
が閉じられたか、開くことができなかったことを意味します。reconnect の呼び出しによって
再度開くことができます。通信は
できません。
terminated は、受信側閲覧
コンテキストが終了したことを意味します。その プレゼンテーションへのすべての プレゼンテーション
接続も終了し、再度開くことはできません。通信はできません。
connected
状態であっても、メッセージの送受信が
成功することを意味するわけではありません。通信チャネルはいつでも突然
閉じられる可能性があるためです。このような状況をできるだけ早く
検出したいアプリケーションは、独自のキープアライブメカニズムを実装するべきです。
close メソッドが
PresentationConnection S
上で呼び出されたとき、
ユーザーエージェントは、
closeReason を closed、
closeMessage を空のメッセージとして、
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 の場合、ユーザーエージェント
は、closeReason を wentaway、
closeMessage を空として、S の プレゼンテーション
接続を閉じ始めなければなりません。
ユーザーエージェントが 宛先
閲覧コンテキストから、PresentationConnection
S を閉じるべきであるというシグナルを受信した場合、
closeReason を closed または wentaway、
closeMessage を空として、S の プレゼンテーション
接続を閉じなければなりません。
ユーザーエージェントが、プレゼンテーション接続を使用して プレゼンテーション 接続を確立する場合、 次の手順を実行しなければなりません。
PresentationConnection オブジェクト
connecting でない場合、
残りのすべての手順を中止します。
connected
に設定します。
connect という名前のイベントを 発火します。
error、
closeMessage を失敗を説明する人間が読めるメッセージとして、
S の プレゼンテーション
接続を閉じます。
DOMString およびバイナリペイロードを信頼性があり
順序どおりに運べる双方向メッセージング抽象化を提供しなければなりません。
PresentationConnection
を介したメッセージの送信
send
を複数回呼び出す場合、
メッセージがもう一方の端へ確実かつ順番どおりに配信されることを保証しなければなりません。
トランスポートは、信頼性モードの RTCDataChannel
と同等に機能するべきです。
プレゼンテーションメッセージデータを、2 つの閲覧コンテキスト間で
送信されるペイロードデータとします。プレゼンテーション
メッセージ型をそのデータの型とし、
text または binary のいずれかとします。
ユーザーエージェントが、プレゼンテーション接続を介して メッセージを 送信する場合、 次の手順を実行しなければなりません。
state プロパティが
connected でない場合、
InvalidStateError
例外を 投げます。
ArrayBuffer、ArrayBufferView、または Blob 型の場合は
binary とします。
messageOrData が DOMString 型の場合、
messageType を text とします。
error、
closeMessage を発生したエラーの説明として、
presentationConnection の プレゼンテーション
接続を即座に閉じます。
プレゼンテーション 接続を介したメッセージ送信エラーからアプリケーションが 回復できるようにするため、ユーザーエージェントは closeMessage に、どの試行が失敗したかの詳細と、 失敗理由を説明する人間が読める文字列を含めるべきです。 closeMessage の例:
テキストメッセージを送信できません (network_error):
"hello"。DOMString メッセージの場合、
"hello" は失敗した
メッセージの先頭 256 文字です。
バイナリメッセージを送信できません (invalid_message)。
ArrayBuffer、ArrayBufferView、および Blob メッセージの場合です。
PresentationConnection
を介したメッセージの受信
ユーザーエージェントが、
プレゼンテーションメッセージデータ
と
プレゼンテーションメッセージ型からなる送信を
リモート側から受信したとき、PresentationConnection を介して
メッセージを受信するために、次の手順を
実行しなければなりません。
state プロパティが
connected でない場合、
これらの手順を中止します。
MessageEvent インターフェイスを使用し、
イベント型を
message として イベントを作成した結果とします。このイベントはバブリングせず、キャンセル可能ではありません。
text の場合、
event の data 属性を、
型 DOMString の messageData に初期化します。
binary で、かつ
binaryType
属性が "blob" に設定されている場合、
event の data 属性を、
messageData を生の
データとする新しい Blob オブジェクトに初期化します。
binary で、かつ
binaryType
属性が
"arraybuffer" に設定されている場合、event の
data 属性を、内容が messageData である新しい ArrayBuffer オブジェクト
に初期化します。
ユーザーエージェントが
presentationConnection を介して メッセージを受信している間に回復不能なエラーに遭遇した場合、
closeReason を
error として
presentationConnection の プレゼンテーション
接続を即座に閉じなければなりません。発生したエラーの人間が読める説明を
closeMessage として使用するべきです。
WebIDLenum PresentationConnectionCloseReason { "error", "closed", "wentaway" };
[SecureContext, Exposed=Window]
interface PresentationConnectionCloseEvent : Event {
constructor(DOMString type, PresentationConnectionCloseEventInit eventInitDict);
readonly attribute PresentationConnectionCloseReason reason;
readonly attribute DOMString message;
};
dictionary PresentationConnectionCloseEventInit : EventInit {
required PresentationConnectionCloseReason reason;
DOMString message = "";
};
プレゼンテーション接続が closed 状態になったとき、
PresentationConnectionCloseEvent
が発火します。reason
属性は、接続が閉じられた理由を示します。この属性は、
PresentationConnectionCloseReason の値のいずれかを
取ることができます。
error は、プレゼンテーションへの
接続または通信のメカニズムで
回復不能なエラーが発生したことを意味します。
closed は、
PresentationConnection
によって接続されていた
制御側閲覧
コンテキストまたは 受信側閲覧
コンテキストのいずれかが
close() を呼び出したことを意味します。
wentaway は、ブラウザーが
接続を閉じたことを意味します。たとえば、接続を所有していた閲覧コンテキストが
ナビゲートされたか、破棄された場合です。
reason 属性が
error の場合、
ユーザーエージェントは message 属性を、
通信チャネルでどのようにエラーが発生したかを示す
人間が読める説明に設定するべきです。
PresentationConnectionCloseEvent
コンストラクターが
呼び出されたとき、ユーザーエージェントは、
reason
属性をコンストラクターに渡された
PresentationConnectionCloseEventInit
オブジェクトの reason メンバーに設定し、
message 属性を、
この
PresentationConnectionCloseEventInit
オブジェクトの
message
メンバーが設定されている場合はそれに、
それ以外の場合は空の文字列に設定した、新しい
PresentationConnectionCloseEvent
オブジェクトを構築しなければなりません。
PresentationConnection のクローズ
ユーザーエージェントが プレゼンテーション 接続を閉じ始める場合、次のことを行わなければなりません。
PresentationConnectionCloseReason
connecting または connected でない場合、
残りの
手順を中止します。
closed に設定します。
PresentationConnection を閉じる意図を
宛先閲覧
コンテキストへ通知し始め、
closeReason をそのコンテキストに渡します。ユーザーエージェントは、
次の手順に進む前に、対応する
PresentationConnection が
実際に閉じられたという確認を待つ必要はありません。
wentaway
でない場合、
presentationConnection、closeReason、および
closeMessage を用いて
プレゼンテーション
接続を閉じる手順をローカルで実行します。
ユーザーエージェントが プレゼンテーション 接続を閉じる場合、次のことを行わなければなりません。
PresentationConnectionCloseReason
connecting、
connected、
または closed
のいずれでもない場合、残りの手順を中止します。
closed でない場合、
closed
に設定します。
reason
属性を closeReason に、message
属性を closeMessage に初期化した
PresentationConnectionCloseEvent
インターフェイスを使用する close という名前のイベントを
発火します。このイベントはバブリングしてはならず、
キャンセル可能であってはなりません。
制御側ユーザーエージェントが connection を使用して 制御側閲覧コンテキストで プレゼンテーションを終了する場合、 次の手順を実行しなければなりません。
connected または connecting
でない場合、
これらの
手順を中止します。
connected
または
connecting
の場合、known connection の 関連する
グローバルオブジェクトを指定し、プレゼンテーションタスク
ソース上に、次の手順を実行する グローバルタスクをキューに入れます。
terminated
に設定します。
terminate という名前のイベントを 発火します。
次のいずれかが発生した場合、受信側ユーザーエージェント は 受信側閲覧 コンテキストでプレゼンテーションを終了しなければなりません。
これは、明示的なユーザー操作によって、またはユーザーエージェントの
ポリシーとして発生する可能性があります。たとえば、受信側ユーザー
エージェント
は、すべての
PresentationConnection
オブジェクトが 30
分間閉じたままのプレゼンテーションを終了するよう設定できます。
受信側ユーザーエージェントが 受信側閲覧コンテキストで プレゼンテーションを終了する場合、次の手順を実行しなければなりません。
connected
の場合、
connection を connectedControllers に追加します。
terminated
に設定します。
各 制御側ユーザーエージェントにつき、 送信する必要がある終了確認は 1 つだけです。
受信側ユーザーエージェントがプレゼンテーション P の終了 確認を送信し、その確認が 制御側ユーザーエージェントによって受信された場合、制御側 ユーザーエージェントは次の手順を実行しなければなりません。
connected
または
connecting
でない場合、後続の手順を中止します。
terminated
に設定します。
terminate という名前のイベントを
発火します。
PresentationConnection インターフェイスを実装する
オブジェクトが、イベントハンドラー IDL
属性としてサポートしなければならないイベントハンドラー(および対応するイベント
ハンドラーイベント型)は次のとおりです。
| イベントハンドラー | イベントハンドラーイベント型 |
|---|---|
onmessage
|
message
|
onconnect
|
connect
|
onclose
|
close
|
onterminate
|
terminate
|
WebIDL[SecureContext, Exposed=Window]
interface PresentationReceiver {
readonly attribute Promise<PresentationConnectionList> connectionList;
};
PresentationReceiver インターフェイスにより、受信側
閲覧コンテキストは 制御側閲覧コンテキストにアクセスし、
それらと通信できます。PresentationReceiver インターフェイスは 実装されなければならず、
受信側ユーザーエージェントによって提供される
受信側閲覧コンテキスト内に
実装されなければなりません。
取得時、connectionList 属性は 次の手順を実行した結果を返さなければなりません。
null でない場合、プレゼンテーション
コントローラー promise を返し、
残りのすべての手順を中止します。
PresentationReceiver オブジェクトの JavaScript レルムで構築された新しい
Promise とします。
null でない場合、プレゼンテーションコントローラー
promise を プレゼンテーション
コントローラーモニターで 解決します。
ユーザーエージェントが 受信側閲覧 コンテキストを作成する場合、次の手順を 実行しなければなりません。
"denied" に設定します。
Cache オブジェクト集合を作成します。
表示された文書によって 作成されたすべての 子ナビゲーター、すなわち 受信側閲覧 コンテキストを自身の トップレベル閲覧 コンテキストとして持つものにも、上記の制限 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 を使用して、 文書が受信側閲覧コンテキストとして読み込まれたことを検出できます。
WebIDL[SecureContext, Exposed=Window]
interface PresentationConnectionList : EventTarget {
readonly attribute FrozenArray<PresentationConnection> connections;
};
connections
属性は、プレゼンテーション
コントローラーの集合内にある、終了していない プレゼンテーション
接続の集合を 返さなければなりません。
受信側ユーザーエージェントが、制御側閲覧 コンテキストから 受信側閲覧 コンテキストへの 受信する プレゼンテーション接続の監視を開始する場合、実装 固有のメカニズムを使用して、制御側閲覧コンテキストからの 受信接続要求を待ち受け、受け入れ なければなりません。新しい接続要求が 制御側閲覧コンテキストから受信されたとき、受信側ユーザー エージェントは次の手順を 実行しなければなりません。
PresentationConnection
S を作成します。
connected に設定します。
それ以外の場合、S の プレゼンテーション
接続状態を closed に設定し、残りのすべての
手順を中止します。
null の場合、次の手順を 並列に実行します。
PresentationReceiver
オブジェクトの JavaScript レルムで構築された新しい
PresentationConnectionList
とします。
null でない場合、プレゼンテーションコントローラー
promise を
プレゼンテーションコントローラー
モニターで
解決するための Presentation
API タスクをキューに入れます。
connection
属性を S に初期化した PresentationConnectionAvailableEvent
インターフェイスを使用する connectionavailable
という名前のイベントを
発火するための
Presentation API タスクをキューに入れます。
このイベントはバブリングしてはならず、
キャンセル可能であってはなりません。
PresentationConnectionList
インターフェイスを実装するオブジェクトが、イベントハンドラー IDL
属性としてサポートしなければならないイベントハンドラー(および対応するイベント
ハンドラーイベント型)は次のとおりです。
| イベントハンドラー | イベントハンドラーイベント型 |
|---|---|
onconnectionavailable
|
connectionavailable
|
この節は非規範的です。
PresentationAvailability
オブジェクトで発火する change イベントは、しばしば
ブラウザーのローカルエリアネットワークを通じて検出される
プレゼンテーションディスプレイの存在または不在に関する
1 ビットの情報を明らかにします。これは、他の情報と組み合わせて
ユーザーのフィンガープリンティングに使用される可能性があります。しかし、この
情報はユーザーのローカルネットワーク環境にも依存するため、
リスクは最小限に抑えられます。
この API は 利用可能な プレゼンテーションディスプレイのリストの監視を可能にします。ユーザーエージェントが 指定された URL と プレゼンテーション ディスプレイとの互換性および利用可能性をどのように判定するかは実装の詳細です。 制御側ユーザーエージェントが プレゼンテーション要求 URLを DIAL アプリケーションと照合してその利用可能性を判定する場合、 この機能を使用して、ユーザーの同意なしに プレゼンテーション ディスプレイにユーザーがインストールしている DIAL アプリケーションに関する情報を調べることができます。
プレゼンテーションは オリジンをまたいでアクセスすることが許可されています。プレゼンテーションの作成に使用された プレゼンテーション URL および プレゼンテーション識別子だけが、 制御側ユーザーエージェント内の任意のオリジンからプレゼンテーションに再接続するために必要な 情報です。言い換えると、 プレゼンテーションは特定の開始元オリジンに結び付けられていません。
この設計により、異なるオリジンの制御側コンテキストが 共有されたプレゼンテーションリソースに接続できます。 プレゼンテーション識別子のセキュリティによって、任意のオリジンが 既存のプレゼンテーションに接続することを防ぎます。
この仕様では、受信側ユーザーエージェントが
自身の 制御対象
プレゼンテーションの集合に関する情報を公開し、
制御側ユーザーエージェントが他のデバイスで開始されたプレゼンテーションに
再接続することも許可します。これは、制御側
閲覧コンテキストが、実行中のプレゼンテーションの プレゼンテーション URLおよび
プレゼンテーション識別子を
ユーザー、ローカルストレージ、またはサーバーから取得し、その後
reconnect
を介してプレゼンテーションに接続する場合に可能です。
この仕様は、プレゼンテーションに接続するいかなる当事者の
身元についても保証しません。接続後、プレゼンテーションは、
アプリケーション固有の手段によって接続側の身元をさらに確認することを
望む場合があります。たとえば、プレゼンテーションは
コントローラーに send を介してトークンを提供するよう要求し、
そのトークンをプレゼンテーションが身元および認可の確認に使用できます。
プレゼンテーション ディスプレイを選択する手順中に、ユーザーが プレゼンテーション ディスプレイを使用する許可を求められたとき、制御側ユーザーエージェントは、 どのオリジンがプレゼンテーションを要求しているか、およびどの オリジンが表示されるかを明確にするべきです。
プレゼンテーションを要求しているオリジンを表示することで、ユーザーは どのコンテンツが要求を行っているかを理解しやすくなります。特に、 要求が 子ナビゲーターから開始された場合に有用です。たとえば、 埋め込みコンテンツが、ユーザーにクリックするよう説得して、 望ましくないプレゼンテーションの開始要求を発生させようとする可能性があります。
プレゼンテーションの存続期間中、トップレベルオリジンが 同じままであることを強制するため、ユーザーアクティベーションなしの トップレベルナビゲーションをサンドボックス化する 閲覧コンテキストフラグが 受信側閲覧 コンテキストに設定されます。
ユーザーが プレゼンテーションを 開始すると、ユーザーはまずプレゼンテーションを排他的に制御します。 しかし、Presentation API では追加の デバイス(おそらく別のユーザーが所有するもの)が接続し、 同様にプレゼンテーションを制御できます。2 台目のデバイスが プレゼンテーションに接続したとき、接続されているすべての 制御側ユーザーエージェントは、 元のユーザーが排他的アクセスを失い、現在プレゼンテーションに 複数のコントローラーが存在することを、ブラウザー chrome を介してユーザーに通知することが推奨されます。
さらに、受信側ユーザー エージェントが プレゼンテーションディスプレイとして動作するだけでなく、 ユーザー入力を受け取ることもできる場合があります。この場合、受信側 ユーザーエージェントは、受信側閲覧コンテキストが リモートの当事者の制御下にある場合(すなわち、1 つ以上の接続済みコントローラーを持つ場合)、 ブラウザー chrome を介してユーザーに通知するべきです。
Presentation API は、ディスプレイにとって「ローカル」が何を意味するかを抽象化し、 ネットワークからアクセス可能なディスプレイを、ユーザーのデバイスに 直接接続されているかのように公開します。Presentation API は、 他人から見えるディスプレイに望ましくないコンテンツを表示するなど、 発生し得る問題を軽減するため、ページが任意のディスプレイにアクセスするには ユーザーの許可を必要とします。
プレゼンテーション URLおよび プレゼンテーション 識別子は、 別の閲覧コンテキストからプレゼンテーションに接続するために使用できます。攻撃者が 制御側ページにコンテンツを挿入できる場合、それらが 傍受される可能性があります。
プレゼンテーションに表示されるコンテンツは コントローラーとは異なります。特に、ユーザーが両方のコンテキストでログインしている場合、 制御側閲覧 コンテキストからログアウトしても、 受信側閲覧 コンテキストから自動的にログアウトされるわけではありません。認証を使用するアプリケーションは、 デバイス間で通信する際に特に注意するべきです。
ユーザーが「閲覧データを消去」を要求したとき、 ユーザーエージェントが認識しているプレゼンテーションの集合を消去するべきです。
プライベートブラウジングモード(「シークレット」)では、その閲覧セッションにおける初期の 制御対象 プレゼンテーションの集合は空でなければなりません。 そこに追加されたすべての プレゼンテーション接続は、 セッション終了時に破棄されなければなりません。
この仕様は、 制御側閲覧コンテキストと 受信側閲覧 コンテキストの間の通信プロトコルを義務付けませんが、対応する プレゼンテーション接続間のメッセージの 機密性および真正性について一定の保証を設定するべきです。
WebIDLpartial interface Navigator {
[SecureContext, SameObject] readonly attribute Presentation presentation;
};
[SecureContext, Exposed=Window]
interface Presentation {
};
partial interface Presentation {
attribute PresentationRequest? defaultRequest;
};
partial interface Presentation {
readonly attribute PresentationReceiver? receiver;
};
[SecureContext, Exposed=Window]
interface PresentationRequest : EventTarget {
constructor(USVString url);
constructor(sequence<USVString> urls);
Promise<PresentationConnection> start();
Promise<PresentationConnection> reconnect(USVString presentationId);
Promise<PresentationAvailability> getAvailability();
attribute EventHandler onconnectionavailable;
};
[SecureContext, Exposed=Window]
interface PresentationAvailability : EventTarget {
readonly attribute boolean value;
attribute EventHandler onchange;
};
[SecureContext, Exposed=Window]
interface PresentationConnectionAvailableEvent : Event {
constructor(DOMString type, PresentationConnectionAvailableEventInit eventInitDict);
[SameObject] readonly attribute PresentationConnection connection;
};
dictionary PresentationConnectionAvailableEventInit : EventInit {
required PresentationConnection connection;
};
enum PresentationConnectionState { "connecting", "connected", "closed", "terminated" };
[SecureContext, Exposed=Window]
interface PresentationConnection : EventTarget {
readonly attribute USVString id;
readonly attribute USVString url;
readonly attribute PresentationConnectionState state;
undefined close();
undefined terminate();
attribute EventHandler onconnect;
attribute EventHandler onclose;
attribute EventHandler onterminate;
// Communication
attribute BinaryType binaryType;
attribute EventHandler onmessage;
undefined send (DOMString message);
undefined send (Blob data);
undefined send (ArrayBuffer data);
undefined send (ArrayBufferView data);
};
enum PresentationConnectionCloseReason { "error", "closed", "wentaway" };
[SecureContext, Exposed=Window]
interface PresentationConnectionCloseEvent : Event {
constructor(DOMString type, PresentationConnectionCloseEventInit eventInitDict);
readonly attribute PresentationConnectionCloseReason reason;
readonly attribute DOMString message;
};
dictionary PresentationConnectionCloseEventInit : EventInit {
required PresentationConnectionCloseReason reason;
DOMString message = "";
};
[SecureContext, Exposed=Window]
interface PresentationReceiver {
readonly attribute Promise<PresentationConnectionList> connectionList;
};
[SecureContext, Exposed=Window]
interface PresentationConnectionList : EventTarget {
readonly attribute FrozenArray<PresentationConnection> connections;
attribute EventHandler onconnectionavailable;
};
binaryType
PresentationConnection の属性
§6.5
close メソッド、
PresentationConnection 用
§6.5
"connected"
PresentationConnectionState の列挙値
§6.5
"connecting" 列挙値、
PresentationConnectionState 用
§6.5
connectionList 属性、
PresentationReceiver 用
§6.6
connections 属性、
PresentationConnectionList 用
§6.7
defaultRequest
Presentation の属性
§6.2.1
"error"
PresentationConnectionCloseReason の列挙値
§6.5.4
getAvailability メソッド、
PresentationRequest 用
§6.4.3
id 属性、
PresentationConnection 用
§6.5
onchange
PresentationAvailability の属性
§6.4
onclose 属性、
PresentationConnection 用
§6.5.9
onconnect
PresentationConnection の属性
§6.5.9
PresentationRequest 用
§6.3.6
PresentationConnectionList 用
§6.7.2
onmessage
PresentationConnection の属性
§6.5.9
onterminate
PresentationConnection の属性
§6.5.9
presentation 属性、
Navigator 用
§6.2
Presentation インターフェイス
§6.2
PresentationAvailability
インターフェイス
§6.4
PresentationConnection
インターフェイス
§6.5
PresentationConnectionAvailableEvent
インターフェイス
§6.4.5
PresentationConnectionAvailableEventInit
辞書
§6.4.5
PresentationConnectionCloseEvent
インターフェイス
§6.5.4
PresentationConnectionCloseEventInit
辞書
§6.5.4
PresentationConnectionCloseReason
列挙型
§6.5.4
PresentationConnectionList インターフェイス
§6.7
PresentationConnectionState 列挙型
§6.5
PresentationReceiver
インターフェイス
§6.6
PresentationRequest インターフェイス
§6.3
receiver 属性、
Presentation 用
§6.2.2
reconnect メソッド、
PresentationRequest 用
§6.3.5
send メソッド、
PresentationConnection 用
§6.5
start メソッド、
PresentationRequest 用
§6.3.2
state 属性、
PresentationConnection 用
§6.5
terminate メソッド、
PresentationConnection 用
§6.5
"terminated" 列挙値、
PresentationConnectionState 用
§6.5
url 属性、
PresentationConnection 用
§6.5
value 属性、
PresentationAvailability 用
§6.4
"wentaway" 列挙値、
PresentationConnectionCloseReason 用
§6.5.4
Event
インターフェイス
EventInit
EventTarget インターフェイス
Blob
インターフェイス
Document 用)
EventHandler
localStorage 属性(
WindowLocalStorage 用)
MessageEvent インターフェイス
reload()(Location 用)
sessionStorage 属性(
WindowSessionStorage 用)
Cache
インターフェイス
ArrayBuffer インターフェイス
ArrayBufferView
boolean
型
DOMString インターフェイス
[Exposed] 拡張属性
FrozenArray インターフェイス
InvalidAccessError 例外
InvalidStateError 例外
NotAllowedError 例外
NotFoundError 例外
NotSupportedError 例外
OperationError 例外
Promise インターフェイス
[SameObject] 拡張属性
[SecureContext] 拡張属性
SecurityError 例外
SyntaxError 例外
exception 用)
undefined 型
USVString インターフェイス
RTCDataChannel インターフェイス
BinaryType 列挙型
この草案の編集、レビュー、およびフィードバックに協力いただいた Addison Phillips、Anne Van Kesteren、Anssi Kostiainen、Anton Vayvod、Chris Needham、Christine Runnegar、Daniel Davis、Domenic Denicola、Erik Wilde、François Daoust、闵洪波 (Hongbo Min)、Hongki CHA、 Hubert Sablonnière、Hyojin Song、Hyun June Kim、Jean-Claude Dufourd、 Joanmarie Diggs、Jonas Sicking、Louay Bassbouss、Mark Watson、Martin Dürst、Matt Hammond、Mike West、Mounir Lamouri、Nick Doty、Oleg Beletski、Philip Jägenstedt、Richard Ishida、Shih-Chiang Chien、Takeshi Kanai、Tobie Langel、Tomoyuki Shimizu、Travis Leithead、および Wayne Carr に感謝します。
AirPlay、HDMI、Chromecast、DLNA および Miracast は、それぞれ Apple Inc.、HDMI Licensing LLC.、Google Inc.、Digital Living Network Alliance、および Wi-Fi Alliance の登録商標です。これらは背景 情報としてのみ引用されており、仕様を実装するためにそれらを使用することは 必須ではありません。
この仕様を勧告案へ進めるためには、 この仕様が定義する各適合性クラス(制御側 ユーザーエージェントおよび 受信側ユーザーエージェント)について、各機能の 独立した相互運用可能な実装が少なくとも 2 つ 存在しなければなりません。各機能は異なる製品群によって実装されてもよく、 すべての機能を単一の製品が実装する必要はありません。 さらに、制御側ユーザーエージェント 適合性クラスの実装には、少なくとも 1 つの 1-UA モード実装と、1 つの 2-UA モード実装が含まれなければなりません。 2-UA モード 実装は、http/https 以外の プレゼンテーション URL のみをサポートしてもかまいません。受信側ユーザーエージェント 適合性クラスの実装には、2-UA モードの実装が含まれない場合があります。
この API は最近、セキュアコンテキストに制限されました。初期実装における 非セキュアコンテキストでの API の非推奨化には時間がかかります。 グループは、将来これらの実装を制限する タイムラインが存在することを条件として、非セキュアコンテキストで引き続き API を公開する 実装を含めて勧告案への移行を要求する場合があります。
これらの基準の目的上、次の用語を定義します。
この節は非規範的です。
この節では、この仕様が 2016 年 7 月に勧告候補として最初に 公開されて以降に行われた変更を、グループの issue トラッカー上の 関連 issue へのリンクとともに一覧します。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: