ケイパビリティ委譲

ドラフトコミュニティグループレポート,

このバージョン:
https://wicg.github.io/capability-delegation/spec.html
課題追跡:
GitHub
編集者:
(Google Canada)

概要

制限付き API を使用する能力を別のウィンドウへ移譲する。

この文書のステータス

この仕様は Web Platform Incubator Community Group により公開されました。 これは W3C 標準ではなく、W3C 標準化過程上のものでもありません。 W3C Community Contributor License Agreement (CLA) の下では、限定的なオプトアウトおよびその他の条件が適用されることに注意してください。 W3C Community and Business Groups についてさらに学ぶ。

1. 導入

この節は非規範的です。

この仕様は、スクリプトが、制限付き API を呼び出す能力を、信頼する別の ブラウジングコンテキストへ委譲できる仕組みを定義します。ここでの 焦点は、委譲されたケイパビリティをターゲットの ブラウジングコンテキストへ時間制約付きの方法で公開する、動的な委譲機構です。

1.1. ケイパビリティ委譲とは何か?

Web における多くのケイパビリティは、JS から制限された方法で使用できます。たとえば:

ケイパビリティ委譲とは、フレームが制限付き API を呼び出す能力を動的に放棄し、 その能力を、信頼できる別の(サブ)フレームへ転送できるようにすることを意味します。ここでの "dynamic" という語は、委譲の効果が、委譲されるケイパビリティにより定義される 限られた時間だけ継続することを意味します。これは、 ブラウジング コンテキストへの、iframe allow 属性を通じた、ケイパビリティの静的な(読み込み時の)公開とは異なります。その場合、ケイパビリティはサブフレームに 時間制約なしの方法で公開されます。

1.2. 委譲の開始とケイパビリティの使用

ケイパビリティ委譲が有効に機能するには、2 つの別個の手順が必要です。最初の手順は "initiation" であり、ある ブラウジングコンテキストが、委譲される特定のケイパビリティについて、別の ブラウジング コンテキストに通知します。開始後、2 番目の(つまり受信側の) ブラウジングコンテキストは、委譲された ケイパビリティを "use" します。これは通常、ケイパビリティで定義されたメソッドを呼び出すことを意味します。 ここでのケイパビリティ委譲仕様は、第 2 手順で使用される API インターフェイスを定義しませんが、 API の内部的な振る舞いを再定義します。

このため、この仕様は 2 つの別個の部分で構成されます。すなわち、 開始手順のための API の定義と、特定の 1 つの "user" API のための委譲された振る舞いの定義です。 第 2 部分について、この仕様は Payment Request API に必要な振る舞いの変更に焦点を当てます。これは、 将来ケイパビリティ委譲を利用する他の API における類似の変更の指針となるものです。

1.3. 一時的な利用可能性

上記の 2 つの手順はいずれも、本質的に時間制約付きです:

  1. 開始手順は activation consuming であるため、その手順は最近のユーザーアクティベーション後にのみ許可されます。 さらに、ここでユーザーアクティベーションを消費することにより、 委譲機構が 1 つのユーザーアクティベーションにつき複数回使用できないことが保証されます。これにより、 複数のフレームへの繰り返しの委譲試行によって、委譲対象 API のユーザーアクティベーション 制限を事実上回避するような、ケイパビリティ委譲の悪意ある使用が防止されます。

  2. 開始手順が正常に完了した後、委譲された API は、ターゲットの ブラウジングコンテキストで数秒間だけ使用可能になります。 ここでの正確な時間制限は、委譲された API が自身の仕様で委譲された振る舞いをどのように定義するかに依存します。 自身の時間制限を定義しない API については、既定の制限は user activation expiry と同じになります。

2.

サイトが、マウスクリック後にサブフレームから [payment-request]show() を呼び出すケイパビリティを委譲したい場合、委譲されたケイパビリティを指定する追加 オプション付きで、サブフレームに メッセージを投稿 します:
window.onclick = () => {
  targetWindow.postMessage('a_message', {delegate: "payment"});
};

メッセージを受信すると、サブフレームは、フレームがユーザー アクティベーションを受け取っていなくても show() を使用できるようになります:

window.onmessage = () => {
  const payRequest = new PaymentRequest(...);
  const payResponse = await payRequest.show();
  ...
}

3. ケイパビリティ委譲の開始

ブラウジングコンテキストが別の ブラウジング コンテキストへケイパビリティを委譲したい場合、そのケイパビリティを指定する delegate と呼ばれる追加の WindowPostMessageOptions を付けて、2 番目の ブラウジングコンテキストにメッセージを投稿します。この オプションの値は feature-identifier でなければなりません。 その値が、ユーザー エージェントがサポートする機能のいずれにも対応しない場合、このオプションは無視されなければなりません。

使用可能な feature-identifier 値の一覧は こちらにあります。

3.1. HTML 仕様へのモンキーパッチ

WindowPostMessageOptions IDL 定義は、次のように追加フィールドを含みます:

DOMString? delegate;

window post message のアルゴリズムにおいて、 次の手順:

  1. transferoptions["transfer"] とします。

の後に、次の 2 つの追加手順が続きます:

  1. delegateoptions["delegate"] とします。

  2. delegate が null でない場合:

    1. ユーザーエージェントが delegate により示される機能の委譲をサポートしない場合、 "NotSupportedError" DOMException を投げます。

    2. targetWindow関連付けられた Document が、delegate により示される機能を allowed-to-use でない場合、 "NotAllowedError" DOMException を投げます。

    3. targetOrigin が単一の U+002A ASTERISK 文字 (*) である場合、 "NotAllowedError" DOMException を投げます。

      targetOrigin の既定値は "/" であり、メッセージを同一オリジンのターゲットに制限します。追加要件として "*" 以外の文字列を使用することは、 クロスオリジンメッセージが、意図された特定のオリジンを指定しなければならないことを意味します。
    4. source を、incumbentSettingsグローバルオブジェクトとします。

    5. source一時的 アクティベーションを持たない場合、 "NotAllowedError" DOMException を投げます。

    6. source における ユーザー アクティベーションを 消費します。

4. 委譲されたケイパビリティの追跡

ブラウジングコンテキストへ委譲されたケイパビリティは、 Window.DELEGATED_CAPABILITY_TIMESTAMPS という名前のマップを用いて追跡されます。 ケイパビリティが Window へ委譲されるたびに、 DELEGATED_CAPABILITY_TIMESTAMPS にエントリーが追加されます。そのキーは ケイパビリティを表す feature-identifier と等しく、その値は現在の DOMHighResTimeStamp と等しくなります。 マップがすでに同じキーのエントリーを持つ場合、既存の値は現在の DOMHighResTimeStamp に更新されます。

4.1. HTML 仕様へのモンキーパッチ

window post message のアルゴリズムの直前に、 次のように新しい段落が挿入されます:

ブラウジングコンテキストへ委譲されたケイパビリティを追跡する目的で、 各 Window は、マップを持ちます。これは、feature-identifier から DOMHighResTimeStamp への DELEGATED_CAPABILITY_TIMESTAMPS と呼ばれます。 このマップは空のマップで初期化されます。

window post message のアルゴリズムにおいて、 現在の手順 8 に 2 つの追加サブ手順が追加されます。最初の追加 サブ手順は、次のサブ手順の後に挿入されます:

  1. グローバルタスクをキューに追加する ...

    1. origin を incumbentSettings の origin の直列化とします。

次のようになります:

  1. グローバルタスクをキューに追加する ... (変更なし)

    1. delegateoptions["delegate"] とします。

2 番目の追加サブ手順は、次のサブ手順の後に挿入されます:

  1. グローバルタスクをキューに追加する ...

    1. newPorts を ... からなる新しい凍結配列とします。

次のようになります:

  1. グローバルタスクをキューに追加する ... (変更なし)

    1. newPorts を ... からなる新しい凍結配列とします。(番号付けを除いて変更なし)

    2. delegate が null でなく、かつユーザーエージェントが delegate の委譲をサポートする場合、 DELEGATED_CAPABILITY_TIMESTAMPS[delegate] を 現在の 高解像度 時刻に設定します。

5. 委譲されたケイパビリティの振る舞いの定義

委譲された振る舞いを定義するケイパビリティは、対応する Window.DELEGATED_CAPABILITY_TIMESTAMPS のエントリーを、 そのケイパビリティに適した方法で使用します。 以下は、ある特定のケイパビリティに必要な仕様変更です。

5.1. Payment Request 仕様へのモンキーパッチ

show() のアルゴリズムにおいて、 委譲された振る舞いを実装するため、次の手順が 置き換えられます:

2 つの手順:

  1. request の関連するグローバルオブジェクトが一時的アクティベーションを持たない場合:

    1. "SecurityError" DOMException で拒否された promise を返します。

  2. 関連するグローバルオブジェクトのユーザーアクティベーションを消費します。

は、次の 3 つの手順に置き換えられます:

  1. request の関連するグローバルオブジェクトが 一時的 アクティベーションを持たず、 かつ関連するグローバルオブジェクト内の DELEGATED_CAPABILITY_TIMESTAMPS["payment"] のタイムスタンプが 未定義または 期限切れのいずれかである場合:

    1. "SecurityError" DOMException で拒否された promise を返します。

  2. request の関連するグローバルオブジェクトが一時的アクティベーションを持たない場合、 マップエントリー DELEGATED_CAPABILITY_TIMESTAMPS["payment"] をクリアします。

  3. そうでない場合、関連するグローバルオブジェクトの ユーザー アクティベーションを 消費します。

5.2. Fullscreen 仕様へのモンキーパッチ

requestFullscreen() のアルゴリズムにおいて、 委譲された振る舞いを実装するため、次の変更が 行われます:

手順 5 の最後の条件:

  1. 次のいずれかの条件が false である場合、error を true に設定します: ...

    • this の関連するグローバルオブジェクトが一時的アクティベーションを持つ、または アルゴリズムがユーザー生成の向き変更によりトリガーされている。

は、次のように置き換えられます:

  1. 次のいずれかの条件が false である場合、error を true に設定します: ... (変更なし)

    • this の関連するグローバルオブジェクトが一時的アクティベーションを持つ、または this の関連するグローバルオブジェクト内の DELEGATED_CAPABILITY_TIMESTAMPS["fullscreen"] のタイムスタンプが未定義でなく、かつ 期限切れ でもない、または アルゴリズムがユーザー生成の向き変更によりトリガーされている。

手順 10 の直前:

  1. fullscreenElements を this からなる順序付き集合とします。

に、次の新しい手順が挿入されます:

  1. this の関連するグローバルオブジェクトが一時的アクティベーションを持たない場合、 this の関連するグローバルオブジェクト内のマップエントリー DELEGATED_CAPABILITY_TIMESTAMPS["fullscreen"] をクリアします。

  2. fullscreenElements を this からなる順序付き集合とします。(番号付けを除いて変更なし)

5.3. [SCREEN-CAPTURE] 仕様へのモンキーパッチ

getDisplayMedia() のアルゴリズムにおいて、 委譲された振る舞いを実装するため、次の変更が 行われます:

手順 3 の条件:

  1. this の関連するグローバルオブジェクトが一時的アクティベーションを持たない場合、name 属性の値が InvalidStateError である DOMException オブジェクトで 拒否された promise を返します。

は、次のように置き換えられます:

  1. this の 関連するグローバルオブジェクト一時的アクティベーションを持たず、かつ this の 関連するグローバルオブジェクト内の DELEGATED_CAPABILITY_TIMESTAMPS["display-capture"] のタイムスタンプが未定義または 期限切れのいずれかである場合、 name 属性の値が InvalidStateError である DOMException オブジェクトで 拒否された promise を返します。

適合性

文書の 慣例

適合性要件は、記述的な表明と RFC 2119 用語の組み合わせにより表現されます。 この文書の規範部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” は、RFC 2119 で説明されているように解釈されます。 ただし、読みやすさのため、 これらの語はこの仕様ではすべて大文字で表示されるとは限りません。

この仕様のすべてのテキストは規範的です。 ただし、非規範的であると明示された節、例、および注記を除きます。[RFC2119]

この仕様の例は、「たとえば」という語で導入されるか、 または規範的テキストから切り離して class="example" により示されます。 次のようになります:

これは情報提供用の例の一例です。

情報提供用の注記は “Note” という語で始まり、 規範的テキストから切り離して class="note" により示されます。 次のようになります:

注記、これは情報提供用の注記です。

適合 アルゴリズム

アルゴリズムの一部として命令形で表現される要件 (たとえば "strip any leading space characters" や "return false and abort these steps") は、そのアルゴリズムを導入する際に使用されるキーワード ("must", "should", "may" など) の意味で解釈されます。

アルゴリズムまたは特定の手順として表現される適合性要件は、 最終結果が等価である限り、 任意の方法で実装できます。 特に、この仕様で定義されるアルゴリズムは 理解しやすいことを意図しており、 パフォーマンスが高いことを意図していません。 実装者は最適化することが推奨されます。

索引

この仕様により定義される用語

参照により定義される用語

参考文献

規範的参考文献

[FULLSCREEN]
Philip Jägenstedt. Fullscreen API Standard. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PAYMENT-REQUEST-1.1]
Marcos Caceres; Rouslan Solomakhin; Ian Jacobs. Payment Request API 1.1. URL: https://w3c.github.io/payment-request/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SCREEN-CAPTURE]
Jan-Ivar Bruaroey; Elad Alon. Screen Capture. URL: https://w3c.github.io/mediacapture-screen-share/
[WebCryptoAPI]
Mark Watson. Web Cryptography API. URL: https://w3c.github.io/webcrypto/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報の参考文献

[PAYMENT-REQUEST]
Marcos Caceres; Rouslan Solomakhin; Ian Jacobs. Payment Request API. URL: https://w3c.github.io/payment-request/