制御フレーム API

ドラフトコミュニティグループ報告書,

このバージョン:
https://wicg.github.io/controlled-frame/
課題追跡:
GitHub
仕様内インライン
編集者:
(Google LLC)
(Google LLC)
(Google LLC)

概要

この文書は、任意の Web コンテンツを Isolated Web Application (IWA) の コンテキスト内でのみ埋め込むための API を定義する。埋め込まれる コンテンツは、埋め込み元の内部にあり、埋め込み元によって制御される新しいトップレベル閲覧コンテキストである。

この文書のステータス

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

1. 導入

この仕様は、IWAs におけるいくつかの重要なユースケースを満たす コンテンツ埋め込み API を記述する。これらは iframe ではサポートされないものである。この埋め込み 環境は、埋め込まれるサイトから明示的な許可なしにすべてのコンテンツを 埋め込めるようにすべきであり、 iframe が埋め込めないコンテンツを含め、埋め込み サイトがその埋め込まれたコンテンツをより制御できるようにするべきである。

これは特に強力な API であるため、その使用と利用可能性はアプリを さまざまな種類のハッキングの標的にする。その結果、この API の使用は、 ユーザーと開発者を保護するための追加の 安全措置が備わっている Isolated Web Applications (IWAs) に限定される。IWAs は通常の Web アプリケーションではなく、特別な 'isolated-app:' スキームにのみ存在できる。これは 設計上、この API が通常の Web ページでは利用できないことを意味する。

注: この API は iframe の置き換えまたは代替として意図されたものではない。 すべての iframe のユースケースは依然として有効であり、可能な場合には IWAs を含めて iframe を使い続けるべきである。

2. Fenced Frame 仕様

便宜上、Controlled Frame 仕様は Fenced Frame 仕様が存在することを前提とする。Fenced Frame 仕様で導入された概念、たとえば入れ子のトップレベル traversable などは、 Controlled Frame のコンテキストで参照するのに広く有用である。

Fenced Frame 仕様は、HTML などの一部の仕様にモンキー パッチを適用することによって、これらの概念を定義している。この Controlled Frame 仕様の一部についても、 仕様にモンキー パッチを適用する必要がある。

3. controlledframe 要素

カテゴリ:
フローコンテンツ.
句内容.
埋め込みコンテンツ.
インタラクティブコンテンツ.
知覚可能コンテンツ.
この要素を使用できるコンテキスト:
埋め込みコンテンツが期待される場所。
内容モデル:
なし.
内容属性:
グローバル属性
src — 埋め込むコンテンツソース URL
partition — このコンテンツに関連するデータを保持するパーティション名
アクセシビリティの考慮事項:
著者向け.
実装者向け.

注: これらは iframe 要素のアクセシビリティ 定義へリンクしている。 アクセシビリティの観点から、 controlledframe は iframe と同じように振る舞うべきである。

DOM インターフェイス:
[Exposed=Window, IsolatedContext]
interface HTMLControlledFrameElement : HTMLElement {
    [HTMLConstructor] constructor();

    [CEReactions] attribute USVString src;
    attribute DOMString partition;

    readonly attribute WindowProxy? contentWindow;
    readonly attribute ContextMenus contextMenus;
    readonly attribute WebRequest request;

    // Navigation methods.
    Promise<boolean> back();
    Promise<boolean> canGoBack();
    Promise<boolean> forward();
    Promise<boolean> canGoForward();
    Promise<boolean> go(long relativeIndex);
    undefined reload();
    undefined stop();

    // Scripting methods.
    Promise<undefined> addContentScripts(sequence<ContentScriptDetails> contentScriptList);
    Promise<any> executeScript(optional InjectDetails details = {});
    Promise<undefined> insertCSS(optional InjectDetails details = {});
    Promise<undefined> removeContentScripts(optional sequence<DOMString> scriptNameList);

    // Configuration methods.
    Promise<undefined> clearData(
      optional ClearDataOptions options = {},
      optional ClearDataTypeSet types = {});
    Promise<boolean> getAudioState();
    Promise<long> getZoom();
    Promise<DOMString> getZoomMode();
    Promise<boolean> isAudioMuted();
    undefined setAudioMuted(boolean mute);
    Promise<undefined> setZoom(long zoomFactor);
    Promise<undefined> setZoomMode(DOMString zoomMode);

    // Capture methods.
    Promise<undefined> captureVisibleRegion(optional ImageDetails options = {});
    undefined print();

    // Events.
    attribute EventHandler onconsolemessage;
    attribute EventHandler oncontentload;
    attribute EventHandler ondialog;
    attribute EventHandler onloadabort;
    attribute EventHandler onloadcommit;
    attribute EventHandler onloadstart;
    attribute EventHandler onloadstop;
    attribute EventHandler onnewwindow;
    attribute EventHandler onpermissionrequest;
    attribute EventHandler onsizechanged;
    attribute EventHandler onzoomchange;
};

controlledframe 要素は、その埋め込まれた navigableを表す。

controlledframe 要素の子孫は何も表さない。

Controlled Frame 要素は、 "controlled-frame" ポリシー制御機能を持ち、その 環境設定オブジェクトが隔離コンテキストである、任意の Document に公開される。

IDL 属性 src および partition は、同じ名前の それぞれの内容属性を反映 しなければならない。

各 controlledframe には次が関連付けられる:

contentWindow getter 手順は、this の contentWindow を返すことである。

request getter 手順 は、this の request を返すことである。

contextMenus getter 手順は、this の contextMenus を返すことである。

controlledframe 要素 element が、非 null の 閲覧コンテキストを持つ文書に 挿入されたとき、 次の手順を実行する:
  1. element の src が空でない場合:

    1. element を与えて controlledframe を初期化する。

controlledframe 要素 element が文書から 削除されたとき、 次の手順を実行する:
  1. element の 埋め込まれた navigableを与えて、 トップレベル traversable を破棄する。

  2. element の 埋め込まれた navigableを null に設定する。

controlledframe 要素 element を 初期化するには、 次の手順を実行する:
  1. element の 埋め込まれた navigableが null であることを 表明する。

  2. group を新しい 閲覧コンテキストグループとする。

  3. document を、element の ノード文書、element、 および group を与えて、 新しい閲覧コンテキストと 文書を作成することの第 2 戻り値とする。

  4. documentState を新しい 文書状態とし、その 文書 は document である。

  5. traversable を新しい traversable navigable とする。

  6. documentState を与えて、traversable navigable を初期化する。

  7. traversable の controlledFrameEmbedderParent を element に設定する。

  8. element の 埋め込まれた navigableを traversable に設定する。

  9. initialHistoryEntry を traversable の アクティブセッション履歴エントリとする。

  10. initialHistoryEntry の step を 0 に設定する。

  11. initialHistoryEntry を traversable の セッション履歴エントリに 付加する。

    これらの手順は、 新しい navigable 内の History.length を初期化するために必要である。これは HTML Standard に存在する issue である。

  12. element の contentWindow を document の WindowProxy に設定する。

  13. element および element の src を与えて、controlledframe をナビゲートする。

controlledframe 要素 element を、USVString urlString を与えて ナビゲートするには、 次の手順を実行する:
  1. urlString が 絶対 URL 文字列でない場合、戻る。

  2. url を、urlString および element の ノード文書を与えて URL を構文解析する結果とする。

  3. historyHandling を "auto" とする。

  4. element の 埋め込まれた navigable の アクティブ文書が 完全に読み込まれていない場合、historyHandling を "replace" に設定する。

  5. element の 埋め込まれた navigableを url に ナビゲートする。その際、element の ノード文書を使用し、NavigationHistoryBehavior として historyHandling を用いる。

HTMLControlledFrameElement() コンストラクタ手順は次の通りである:
  1. this の request を、新しい WebRequest に設定する。

  2. this の contextMenus を、新しい ContextMenus に設定する。

3.1. 共通インフラストラクチャ

controlledframe controlledframe、promise promise、および省略可能な value を与えて、 埋め込み元 promise を解決するには、 次の手順を実行する:
  1. controlledframe の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 promise を value で 解決する。

    注: controlledframe の 関連グローバルオブジェクトは 埋め込み元の Window オブジェクトである。

controlledframe controlledframe、promise promise、および省略可能な value を与えて、 埋め込み元 promise を拒否するには、 次の手順を実行する:
  1. controlledframe の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 promise を value で 拒否する。

    注: controlledframe の 関連グローバルオブジェクトは 埋め込み元の Window オブジェクトである。

URL url が pattern である URLPattern に一致するとは、 次の手順が true を返すことである:
  1. result を、pattern および url を与えて match した結果とする。

  2. result が null の場合、false を返す。

  3. true を返す。

3.2. 属性

partition 属性は、 Controlled Frame のインスタンスに関連するデータをどこに格納するかを指定する識別子を取る。 この識別子は英数字の文字列で構成される。 埋め込まれた navigable のすべてのデータは、 このパーティション文字列と、そのデータを作成したオリジンによってキー付けされた ストレージ棚に格納されなければならない。

既定では、格納されるすべてのデータはメモリ内ストレージパーティションに保持されなければならない。 これにより、特定の partition 値を持つ最後の Controlled Frame 要素が破棄されたときに、 そのデータも破棄される。このデータがこのパーティションに保持されている間は、 Controlled Frame の 埋め込まれた navigable からのデータは永続化してはならない。

partition 属性識別子が接頭辞 "persist:" を含む場合、ユーザー エージェントはメモリ内ストレージパーティションではなく、ディスクベースのストレージ環境を使用しなければならない。 埋め込まれたコンテンツは、そのストレージがメモリ内であるか永続的であるかを検出できるべきではない。

複数の Controlled Frame が同じパーティション識別子を共有する場合、それらのすべての 埋め込まれた navigable インスタンスは同じ ストレージパーティションを共有しなければならない。

注: [STORAGE] 仕様は、partition 属性の値に基づいてストレージをパーティション化するために、下でモンキー パッチされる。

partition IDL 属性 setter 手順は次の通りである:
  1. this の 埋め込まれた navigable が null でない場合:

    1. "NotSupportedError" DOMException を投げる。

  2. this の partition を与えられた値に設定する。

src 属性は、 Controlled Frame の 埋め込まれた navigable の 現在のセッション履歴エントリの URL を反映する。

src IDL 属性 setter 手順は次の通りである:
  1. this が文書 ツリー内にない場合、戻る。

  2. this の 埋め込まれた navigable が null の場合:

    1. this を与えて、 controlledframe を初期化する。

  3. それ以外の場合:

    1. this および与えられた値を与えて、 controlledframe をナビゲートする。

3.3. ナビゲーションメソッド

back()

Controlled Frame 内の traversable navigable について、全体の セッション履歴エントリリスト内で 1 ステップ戻る。

ページが正常に戻るナビゲーションを行った場合は true に解決し、ナビゲーションが失敗した場合または前の ステップがなかった場合は false に解決する promise を返す。

canGoBack()

現在のセッション履歴エントリが 埋め込まれた navigable の セッション履歴エントリ内の最初のものではない場合、 true に解決する promise を返す。これは、その navigable に前の セッション履歴エントリが存在することを意味する。

forward()

Controlled Frame 内の traversable navigable について、全体の セッション履歴エントリリスト内で 1 ステップ進む。

ページが正常に進むナビゲーションを行った場合は true に解決し、ナビゲーションが失敗した場合または次の ステップがなかった場合は false に解決する promise を返す。

canGoForward()

現在のセッション履歴エントリが 埋め込まれた navigable の セッション履歴エントリ内の最後のものではない場合、 true に解決する promise を返す。これは、その navigable に次の セッション履歴エントリが存在することを意味する。

go()

現在のページを再読み込みする。

go(relativeIndex)

現在の traversable navigable について、全体の セッション履歴エントリリスト内で、relativeIndex 個のステップだけ戻るまたは進む。

ゼロの相対インデックスは現在のページを再読み込みする。

ページが正常にナビゲートされた場合は true に解決し、ナビゲーションが失敗した場合または提供された相対 インデックスが範囲外だった場合は false に解決する promise を返す。

reload()

現在のページを再読み込みする。

stop()

文書の読み込みをキャンセルする。

controlledframe controlledframe と整数 delta を与えて、 埋め込まれた navigable の履歴を delta traverse するには、 次の手順を実行する:
  1. resultPromise を新しい promise とする。

  2. resultPromise を返し、残りの手順を 並列に実行する。

  3. embeddedNavigable を controlledframe の 埋め込まれた navigable とする。

  4. embeddedNavigable が null の場合、 controlledframe、resultPromise、および false を与えて 埋め込み元 promise を解決し、 これらの手順を中止する。

  5. embeddedNavigable の アクティブ文書が完全にアクティブでない場合、 controlledframe、resultPromise、 および false を与えて 埋め込み元 promise を解決し、 これらの手順を中止する。

  6. 次のセッション履歴探索手順を embeddedNavigable に 付加する:

    1. allSteps を、embeddedNavigable について 使用済みのすべての履歴ステップを取得する結果とする。

    2. currentStepIndex を、allSteps 内における embeddedNavigable の 現在のセッション履歴ステップのインデックスとする。

    3. targetStepIndex を currentStepIndex + delta とする。

    4. allSteps[targetStepIndex] が 存在しない場合、 controlledframe、resultPromise、 および false を与えて 埋め込み元 promise を解決し、 これらの手順を中止する。

    5. result を、allSteps[targetStepIndex] を embeddedNavigable に適用する traverse history step を適用する結果とし、 その際 ユーザーナビゲーション関与として "none" を与える。

    6. result が "applied" と等しくない場合、 controlledframe、resultPromise、および false を与えて 埋め込み元 promise を解決する。

    7. それ以外の場合、controlledframe、 resultPromise、および true を与えて 埋め込み元 promise を解決する。

canGoBack() メソッド手順は次の通りである:
  1. result を新しい promise とする。

  2. controlledframe を this とする。

  3. embeddedNavigable を controlledframe の 埋め込まれた navigable とする。

  4. embeddedNavigable が null の場合、result を false で 解決し、 result を返す。

  5. embeddedNavigable の ノード文書の 関連グローバルオブジェクトの ナビゲーションおよび探索タスクソースに グローバルタスクをキューに入れ、 次の手順を実行させる:

    1. canGoBack を、embeddedNavigable の 現在のセッション履歴ステップが > 0 の場合は true、そうでない場合は false とする。

    2. controlledframe、result、 および canGoBack を与えて 埋め込み元 promise を解決する。

  6. result を返す。

canGoForward() メソッド手順は次の通りである:
  1. result を新しい promise とする。

  2. controlledframe を this とする。

  3. embeddedNavigable を controlledframe の 埋め込まれた navigable とする。

  4. embeddedNavigable が null の場合、result を false で 解決し、 result を返す。

  5. embeddedNavigable の ノード文書の 関連グローバルオブジェクトの ナビゲーションおよび探索タスクソースに グローバルタスクをキューに入れ、 次の手順を実行させる:

    1. step を embeddedNavigable の 現在のセッション履歴ステップとする。

    2. steps を、embeddedNavigable を与えて 使用済みのすべての履歴ステップを取得する 結果とする。

    3. canGoForward を、step + 1 < steps の サイズの場合は true、 そうでない場合は false とする。

    4. controlledframe、result、 および canGoForward を与えて 埋め込み元 promise を解決する。

  6. result を返す。

back() メソッド手順は 次の通りである:
  1. this および -1 を与えて、 埋め込まれた navigable の履歴を delta traverse する結果を返す。

forward() メソッド手順 は次の通りである:
  1. this および 1 を与えて、 埋め込まれた navigable の履歴を delta traverse する結果を返す。

go(relativeIndex) メソッド手順は次の通りである:
  1. this および relativeIndex を与えて、 埋め込まれた navigable の履歴を delta traverse する結果を返す。

reload() 手順は次の通りである:
  1. embeddedNavigable を this の 埋め込まれた navigable とする。

  2. embeddedNavigable が null の場合、戻る。

  3. embeddedNavigable の ノード文書の 関連グローバルオブジェクトの ナビゲーションおよび探索タスクソースに グローバルタスクをキューに入れ、 "none" の ユーザーナビゲーション関与を与えて embeddedNavigable を 再読み込みさせる。

stop() 手順は次の通りである:
  1. embeddedNavigable を this の 埋め込まれた navigable とする。

  2. embeddedNavigable が null の場合、戻る。

  3. embeddedNavigable の ノード文書の 関連グローバルオブジェクトの ナビゲーションおよび探索タスクソースに グローバルタスクをキューに入れ、 embeddedNavigable の 読み込みを停止させる。

3.4. スクリプティングメソッド

// One of |code| or |file| must be specified but not both.
dictionary InjectDetails {
  DOMString code;
  USVString file;
};

dictionary InjectionItems {
  DOMString code;
  sequence<USVString> files;
};

enum RunAt {
  "document-start",
  "document-end",
  "document-idle",
};

dictionary ContentScriptDetails {
  required DOMString name;
  InjectionItems js;
  InjectionItems css;
  required sequence<(URLPattern or URLPatternInput)> urlPatterns;
  sequence<(URLPattern or URLPatternInput)> excludeURLPatterns;
  boolean allFrames;
  boolean matchAboutBlank;
  RunAt runAt;
};

content script config は、次の 項目を持つ 構造体である:

pendingFetchCount

保留中のスクリプト/スタイル取得の数を表す long。

js

文書に注入される JavaScript を含む DOMString の リスト。

css

ドキュメントに挿入される CSS を含む DOMString の リスト。

urlPatterns

URLPattern の リスト。

注: 文書の URL がこれらのパターンのいずれかに 一致する場合、コンテンツを文書に注入できる。

excludeURLPatterns

URLPattern の リスト。

注: 文書の URL がこれらの パターンのいずれかに一致する場合、 コンテンツは文書に注入されない。これは urlPattern を上書きする。両方のリストに、 文書の URL が一致するエントリがある場合、コンテンツは 文書に注入されない。

allFrames

コンテンツをページ内のすべてのフレームに注入すべきか、トップレベルフレームのみに 注入すべきかを示す boolean。

matchAboutBlank

コンテンツを about:blank ページに注入すべきかどうかを示す boolean。

runAt

JavaScript コンテンツを文書のライフサイクル内のいつ実行すべきかを示す RunAt。

controlledframe controlledframe、USVString urlString、boolean isCss、 long index、および long、 boolean、 DOMString を取るアルゴリズム completionSteps を与えて、 注入項目を取得するには、 次の手順を実行する:

注: ここでは クラシックスクリプトを取得するは使用できない。取得では controlledframe の 関連設定オブジェクトを使用する必要があるが、 クラシックスクリプトは、埋め込まれた navigable の アクティブ文書の 関連設定オブジェクトを使用して実行されるためである。

  1. urlString が妥当な URL 文字列でない場合:

    1. 0、false、および "" を与えて completionSteps を実行する。

    2. 戻る。

  2. request を、次のフィールドを持つ新しい request とする:

    URL

    urlString および controlledframe の ノード文書を与えて URL を構文解析する結果。

    method

    "GET"

    destination

    isCss が true の場合は "style"、 それ以外の場合は "script"

    client

    controlledframe の関連設定オブジェクト

    mode

    "cors"

  3. request を取得し、processResponseConsumeBody を、 response response と、null、failure、または バイト列 contents を与えられた次の手順に設定する:

    1. response のstatus が 200 でない、または contents が null または failure である場合、0、false、および "" を与えて completionSteps を実行する

    2. それ以外の場合、index、true、および contents を与えて completionSteps を実行する。

controlledframe controlledframe および ContentScriptDetails details を与えて、 検証して ContentScriptDetails を解決するには、 次の手順を実行する:
  1. result を新しい promise とする。

  2. details["js"] および details["css"] が両方とも定義されている、または両方とも undefined である場合、result を TypeError で拒否し、それを返す。

  3. details["urlPatterns"] が空である場合、 result を TypeError で拒否し、それを返す。

  4. isCss を、details["css"] が定義されている場合は true、 それ以外の場合は false に等しい boolean とする。

  5. isCss が true であり、かつ details["runAt"] が "document-start" と等しくない場合、result を TypeError で拒否し、それを返す。

  6. injectionItems を、isCss が true の場合は details["css"]、 それ以外の場合は details["js"] とする。

  7. injectionItems["code"] および injectionItems["files"] が両方とも定義されている、または両方とも undefined である場合、result を TypeError で拒否し、それを返す。

  8. result を返し、残りの手順を 並列に実行する。

  9. config を、次の値を持つ新しい content script config とする:

    pendingFetchCount

    0

    urlPatterns

    «»

    excludeURLPatterns

    «»

    allFrames

    details["allFrames"] が定義されている場合はそれ、そうでない場合は false

    matchAboutBlank

    details["matchAboutBlank"] が定義されている場合はそれ、 そうでない場合は false

    runAt

    details["runAt"] が定義されている場合はそれ、そうでない場合は document-idle

  10. details["urlPatterns"] 内の各 urlPattern について 反復する:

    1. urlPattern が URLPattern である場合、urlPattern を config の urlPatterns に 付加する。

    2. それ以外の場合、urlPattern を与えて 新しい URLPattern を作成し、 config の urlPatterns に 付加する。

  11. details["excludeURLPatterns"] が定義されている場合:

    1. details["excludeURLPatterns"] 内の各 urlPattern について 反復する:

      1. urlPattern が URLPattern である場合、 urlPattern を config の excludeURLPatterns に 付加する。

      2. それ以外の場合、 urlPattern を与えて 新しい URLPattern を作成し、config の excludeURLPatterns に 付加する。

  12. completionSteps を、long index、boolean success、および DOMString source を取る次のアルゴリズムとする:

    1. success が false の場合、controlledframe、 result、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

    2. isCss の場合:

      1. config の css[index] を source に設定する。

    3. それ以外の場合:

      1. config の js[index] を source に設定する。

    4. config の pendingFetchCount をデクリメントする。

    5. config の pendingFetchCount が 0 より 大きい場合、戻る。

    6. controlledframe の content script map[details[name]] を config に設定する。

    7. controlledframe および result を与えて 埋め込み元 promise を解決する。

  13. injectionItems["code"] が定義されている場合:

    1. 0、true、および injectionItems ["code"] を与えて completionSteps を実行する。

  14. それ以外の場合:

    1. injectionItems["files"] が空である場合、 controlledframe、result、 および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

    2. injectionItems ["files"] の各 urlString について 反復する:

      1. controlledframe、 urlString、isCss、config の pendingFetchCount、 および completionSteps を与えて、注入項目を取得するを実行する。

      2. config の pendingFetchCount をインクリメントする。

content script config config、URL url、および boolean isTopLevel を与えて、content script config が文書に適用されるかどうかを判定するには、 次の手順を実行する:
  1. isTopLevel が false であり、かつ config の allFrames が false である場合、 false を返す。

  2. url が about:blank に一致する、かつ config の matchAboutBlank が false である場合、false を返す。

  3. urlString を、url を 直列化する結果とする。

  4. match を false とする。

  5. config の urlPatterns の各 pattern について 反復する:

    1. urlString が pattern である URLPattern に一致する場合、 match を true に設定する。

  6. config の excludeURLPatterns の各 pattern について 反復する:

    1. urlString が pattern である URLPattern に一致する場合、 match を false に設定する。

  7. match を返す。

Document document および RunAt currentPhase を与えて、 コンテンツスクリプトを文書に注入するには、 次の手順を実行する:
  1. embeddedNavigable を、document の node navigable の traversable navigable とする。

  2. embeddedNavigable が null、またはその controlledFrameEmbedderParent が null である場合、 戻る。

  3. controlledframe を embeddedNavigable の controlledFrameEmbedderParent とする。

  4. url を document の URL とする。

  5. isTopLevel を、document の node navigable の parent が null である場合は true、 それ以外の場合は false とする。

  6. controlledframe の content script map の各 config について反復する:

    1. config、url、および isTopLevel を与えて、content script config が 文書に適用されるかどうかを判定した結果が false と等しい場合、 続行する。

    2. currentPhase が document-start と等しく、かつ config の css が空でない場合:

      1. config の css の各 styleSource について 反復し、document および styleSource を与えて スタイルシートを文書に注入するを実行する。

    3. それ以外で、currentPhase が config の runAt と等しい場合:

      1. config の js の各 scriptSource について 反復し、document、scriptSource、および空の アルゴリズムを与えて スクリプトを文書に注入するを実行する。

Document document および DOMString styleSource を与えて、 スタイルシートを文書に注入するには、 次の手順を実行する:
  1. styleSheet を新しい CSS スタイルシートオブジェクトとする。

  2. styleSheet および styleSource を与えて CSSStyleSheet の規則を同期的に置換する。

  3. document のグローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 document および styleSheet を与えて CSS スタイルシートを追加する。

次のアルゴリズムは Document の 環境内でスクリプトを実行するが、それは望ましい振る舞いではない。 現行の HTML 仕様インフラストラクチャでは仕様化できない目標は、この アルゴリズムが、異なるグローバルオブジェクトを持ち、ただし DOM への共有アクセスを持つ、 Document の環境から隔離された環境でスクリプトを実行することである。この実行環境は Blink では Isolated World と呼ばれ、拡張機能で content scripts を実行するために使用されている。その実行モデルに関する追加の詳細については、この 図を参照。Gecko は Xray vision と呼ばれる同様の方式を使用している。このアルゴリズムは最終的に、 すべてのブラウザで実装可能な、この隔離の仕様化可能な実装を記述すべきである。

Document document、 DOMString scriptSource、および 完了レコードを取るアルゴリズム completionSteps を与えて、 スクリプトを 文書に注入するには、次の手順を実行する:

注: document.currentScript は、 scriptSource の実行中に意図的に設定されない。

  1. script を、scriptSource、document の 関連設定オブジェクト、document の URL、および 既定のスクリプト取得オプションを与えて クラシックスクリプトを作成する結果とする。

  2. document の グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 次の手順を実行させる:

    1. completionRecord を、 script を与えて クラシックスクリプトを実行する結果とする。

    2. controlledframe を、document の node navigable の traversable navigable の controlledFrameEmbedderParent とする。

    3. controlledframe の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 completionRecord を用いて completionSteps を実行させる。

addContentScripts(contentScriptList) メソッド手順は次の通りである:
  1. contentScriptList が空である場合、 TypeError で拒否された 新しい promise を返す。

  2. promises を空の リストとする。

  3. contentScriptList 内の各 contentScript について 反復する:

    1. promise を、contentScript を与えて ContentScriptDetails を検証して解決するを呼び出した結果とする。

    2. promise を promises に 付加する。

  4. promises を与えて すべての promise を待つための promise を取得する結果を返す。

removeContentScripts(scriptNameList) メソッド手順は次の通りである:
  1. result を新しい promise とする。

  2. controlledframe を this とする。

  3. result を返し、残りの手順を 並列に実行する。

  4. scriptNameList が undefined の場合:

    1. controlledframe の content script map を クリアする。

  5. それ以外の場合、scriptNameList の各 name について 反復する:

    1. controlledframe の content script map[name] を 削除する。

  6. controlledframe および result を与えて 埋め込み元 promise を解決する。

executeScript(details) メソッド手順は次の通りである:
  1. result を新しい promise とする。

  2. controlledframe を this とする。

  3. result を返し、残りの手順を 並列に実行する。

  4. controlledframe の 埋め込まれた navigable が null である場合、 controlledframe、result、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

  5. details["code"] および details"[file"] が両方とも定義されている、または両方とも undefined である場合、controlledframe、 result、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

  6. executionSteps を、long および DOMString または boolean scriptString を取る次のアルゴリズムとする:

    1. scriptString が DOMString でない場合、controlledframe、result、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

    2. document を、controlledframe の 埋め込まれた navigable の アクティブ文書とする。

    3. document、scriptString、 および 完了レコード completionRecord を受け取る次のアルゴリズムを与えて、 スクリプトを文書に注入する:

      1. completionRecord が通常完了である場合:

        1. controlledframe、 result、および completionRecord.[[Value]] を与えて 埋め込み元 promise を解決する。

      2. それ以外の場合:

        1. controlledframe、 result、および completionRecord.[[Value]] を与えて 埋め込み元 promise を拒否する。

  7. details["code"] が定義されている場合、0 および details["code"] を与えて executionSteps を実行する。

  8. それ以外の場合、controlledframe、 details["file"]、 false、0、および executionSteps を与えて 注入項目を取得する。

insertCSS(details) メソッド手順は次の通りである:
  1. result を新しい promise とする。

  2. controlledframe を this とする。

  3. result を返し、残りの手順を 並列に実行する。

  4. controlledframe の 埋め込まれた navigable が null である場合、 controlledframe、result、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

  5. details["code"] および details["file"] が両方とも定義されている、または両方とも undefined である場合、controlledframe、 result、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

  6. executionSteps を、long、 boolean success、および DOMString styleString を取る次のアルゴリズムとする:

    1. success が false の場合、controlledframe、 result、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

    2. document を、controlledframe の 埋め込まれた navigable の アクティブ文書とする。

    3. document および styleString を与えて スタイルシートを文書に注入する。

    4. controlledframe および result を与えて 埋め込み元 promise を解決する。

  7. details["code"] が定義されている場合、0、true、および details["code"] を与えて executionSteps を実行する。

  8. それ以外の場合、controlledframe、 details["file"]、 false、0、および executionSteps を与えて 注入項目を取得する。

3.5. 設定メソッド

dictionary ClearDataOptions {
  long since;
};

dictionary ClearDataTypeSet {
  boolean cache;
  boolean cookies;
  boolean fileSystems;
  boolean indexedDB;
  boolean localStorage;
  boolean persistentCookies;
  boolean sessionCookies;
};
ストレージバケット bucket、 ストレージ識別子 identifier、および long since を与えて、 ストレージボトルを空にするには、次の手順を実行する:

注: 可能であれば、ユーザーエージェントは、 since 以後に最後に使用されたデータのみを削除すべきである。since は epoch からのミリ秒単位のタイムスタンプを表す。 すべてのユーザーエージェントが、すべての 閲覧データについて書き込み時刻またはアクセス時刻を追跡しているわけではない。 実装は可能な限り since を尊重すべきであるが、この API はその利用可能性を保証しない。

  1. bottle を bucket[identifier] とする。

  2. bottle の map を クリアする。

  3. bottle の proxy map reference set を新しい 集合に設定する。

clearData(options, types) メソッド手順は次の通りである:
  1. resultPromise を新しい promise とする。

  2. controlledframe を this とする。

  3. resultPromise を返し、残りの手順を 並列に実行する。

  4. clearSince を 0 とする。

  5. options["since"] が定義されている場合、clearSince を options|["since"] に設定する。

  6. embeddingOrigin を、controlledframe の 関連設定オブジェクトの トップレベルオリジンとする。

  7. partition を controlledframe の partition とする。

  8. ユーザーエージェントの storage shed の各 storageKey → shelf について 反復する:

    1. storageKey の embedding origin が embeddingOrigin と等しくない、または storageKey の partition が partition と等しくない場合、 続行する。

    2. bucket を shelf["default"] とする。

    3. types["fileSystems"] が true である場合:

      1. bucket、"fileSystem"、および clearSince を与えて ストレージボトルを空にする。

    4. types["indexedDB"] が true である場合:

      1. bucket、"indexedDB"、および clearSince を与えて ストレージボトルを空にする。

    5. types["localStorage"] が true である場合:

      1. bucket、"localStorage"、および clearSince を与えて ストレージボトルを空にする。

  9. types["cookies"]、 types["persistentCookies"]、 または types["sessionCookies"] が true である場合:

    [COOKIES] 仕様は、 storage key のような仕組みによる cookies のパーティション化をサポートしていない。次の手順はすべての cookies を クリアするが、意図としては、この Controlled Frame の現在の partition を持つ Controlled Frame 内のコンテンツによって作成された cookies のみを削除することである。

    1. ユーザーエージェントの cookie store 内の各 cookie について 反復する:

      1. cookie の persistent-flag が設定されている場合:

        1. types["cookies"] および types["persistentCookies"] が false である場合、 続行する。

      2. それ以外の場合:

        1. types["cookies"] および types["sessionCookies"] が false である場合、 続行する。

      3. cookie の last-access-time が epoch からのミリ秒として表された値が clearSince より小さい場合、続行する。

      4. cookie をユーザーエージェントの cookie store から削除する。

  10. types["cache"] が true である場合:

    1. ユーザーエージェントが管理する各 storageKey → cache について反復する: [HTTP-CACHING]

      1. storageKey の embedding origin が embeddingOrigin と等しくない、または storageKey の partition が partition と等しくない場合、続行する。

      2. cache をクリアする。

  11. controlledframe および resultPromise を与えて 埋め込み元 promise を解決する。

各埋め込まれた navigableは、 既定値が false である muted boolean を保持する。 muted が true の場合、ユーザーエージェントは 埋め込まれた navigable 内に由来するすべてのオーディオストリームをミュートしなければならない。 muted 状態は、 埋め込まれた navigable 内のコンテンツには公開されるべきではない。 muted が true の場合、音量状態はスクリプトから見えるいかなる方法でも変更されるべきではないが、 下層のオーディオストリームはユーザーに聞こえるべきではない。

getAudioState() メソッド手順は次の通りである:
  1. resultPromise を新しい promise とする。

  2. controlledframe を this とする。

  3. resultPromise を返し、残りの手順を 並列に実行する。

  4. controlledframe の 埋め込まれた navigable が null である場合、 controlledframe、resultPromise、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

  5. playingAudio を、controlledframe の 埋め込まれた navigable 内の、入れ子のフレームを含む任意のコンテンツが 現在オーディオを再生している場合は true、 そうでない場合は false とする。

  6. controlledframe、resultPromise、 および playingAudio を与えて 埋め込み元 promise を解決する。

isAudioMuted() メソッド手順は次の通りである:
  1. resultPromise を新しい promise とする。

  2. controlledframe を this とする。

  3. resultPromise を返し、残りの手順を 並列に実行する。

  4. controlledframe の 埋め込まれた navigable が null である場合、 controlledframe、resultPromise、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

  5. controlledframe、resultPromise、 および controlledframe の 埋め込まれた navigable の muted フラグを与えて 埋め込み元 promise を解決する。

setAudioMuted(mute) メソッド手順は次の通りである:
  1. this の 埋め込まれた navigable が null である場合、 TypeError を投げる。

  2. this の 埋め込まれた navigable の muted フラグを mute に設定する。

3.5.1. ズーム

enum ZoomMode {
  "per-origin",
  "per-view",
  "disabled"
};

ユーザーエージェントは、Controlled Frame zoom map を保持する。これは マップであり、その キーはタプルであり、 値はfloatである。

各 HTMLControlledFrameElement は ZoomMode zoomMode を保持し、その既定値は per-origin である。

各 HTMLControlledFrameElement は float 数 currentZoom を保持し、初期値は 1.0f に設定される。

float zoomLevel を与えて 文書に ズームレベルを適用する方法は、実装に固有である。

この節は非規範的である。

有効な ZoomMode 値は次のように振る舞う:

per-origin

ズーム変更は埋め込まれた文書のオリジンに永続化される。すなわち、同じ partition 内にあり、同じオリジンへナビゲートされた他のすべての HTMLControlledFrameElement も同様にズームされる。

per-view

ズーム変更はこの HTMLControlledFrameElement 内でのみ有効となり、他の HTMLControlledFrameElement におけるズーム変更は、この HTMLControlledFrameElement のズームに影響しない。

disabled

HTMLControlledFrameElement 内のすべてのズームを無効化する。 コンテンツは既定のズームレベルに戻り、試行されたすべてのズーム変更は無視される。

HTMLControlledFrameElement e を与えて、 per-origin ズームレベルを取得するには、次の手順を実行する:

  1. result を、初期値が 1.0f に設定された float とする。

  2. key を、e の 埋め込まれた navigable の アクティブ文書の 現在の設定オブジェクトに関連付けられた 環境を与えて Controlled Frame storage key を取得する結果とする。

  3. Controlled Frame zoom map[key] が 存在する場合、result を、キー key を与えて Controlled Frame zoom map の 値を取得する結果に設定する。

  4. result を返す。

HTMLControlledFrameElement e および float zoomLevel を与えて、 per-origin ズームレベルを設定するには、次の手順を実行する:

  1. key を、e の 埋め込まれた navigable の アクティブ文書の 現在の設定オブジェクトに関連付けられた 環境を与えて Controlled Frame storage key を取得する結果とする。

  2. キー key と値 zoomLevel を与えて、Controlled Frame zoom map の 値を設定する。

HTMLControlledFrameElement e を与えて、 現在の文書が per-origin ズーム レベルを持つかどうかを判定するには、次の手順を実行する:

  1. key を、e の 埋め込まれた navigable の アクティブ文書の 現在の設定オブジェクトに関連付けられた 環境を与えて Controlled Frame storage key を取得する結果とする。

  2. Controlled Frame zoom map[key] が 存在する場合、true を返す。

  3. false を返す。

getZoomMode() メソッド 手順は次の通りである:

  1. p を 新しい promise とする。

  2. controlledframe を this とする。

  3. p を返し、残りの手順を 並列に実行する。

  4. controlledframe、p、および controlledframe の zoomMode を与えて 埋め込み元 promise を解決する。

setZoomMode(zoomMode) メソッド手順は次の通りである:

  1. p を 新しい promise とする。

  2. controlledframe を this とする。

  3. p を返し、残りの手順を 並列に実行する。

  4. currentZoomMode を、controlledframe を与えて getZoomMode した結果とする。

  5. currentZoomMode が zoomMode と等しい場合、 controlledframe および p を与えて 埋め込み元 promise を解決する。

  6. controlledframe の zoomMode を zoomMode に設定する。

  7. zoomMode が per-origin である場合:

    1. controlledframe を与えて、現在の文書が per-origin ズームレベルを持つが true である場合:

      1. oldZoomFactor を controlledframe の currentZoom とする。

      2. controlledframe の currentZoom を、 controlledframe を与えて per-origin ズームレベルを取得する結果に設定する。

      3. oldZoomFactor が controlledframe の currentZoom と等しくない場合:

        1. controlledframe の currentZoom を与えて、 controlledframe の埋め込まれた文書に ズームレベルを適用する。

        2. controlledframe、oldZoomFactor、 controlledframe の currentZoom を用いて "zoomchange" イベントを発火する。

  8. zoomMode が disabled である場合:

    1. oldZoomFactor を controlledframe の currentZoom とする。

    2. controlledframe の currentZoom を 1.0f に設定する。

    3. oldZoomFactor が controlledframe の currentZoom と等しくない場合:

      1. controlledframe の currentZoom を与えて、 controlledframe の埋め込まれた文書に ズームレベルを適用する。

      2. controlledframe、oldZoomFactor、 controlledframe の currentZoom を用いて "zoomchange" イベントを発火する。

  9. controlledframe および p を与えて 埋め込み元 promise を解決する。

getZoom() メソッド手順 は次の通りである:

  1. p を 新しい promise とする。

  2. controlledframe を this とする。

  3. p を返し、残りの手順を 並列に実行する。

  4. embeddedNavigable を controlledframe の 埋め込まれた navigable とする。

  5. embeddedNavigable が null である場合、 controlledframe、p、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

  6. controlledframe、p、および controlledframe の currentZoom を与えて 埋め込み元 promise を解決する。

setZoom(zoomFactor) メソッド 手順は次の通りである:

  1. p を 新しい promise とする。

  2. controlledframe を this とする。

  3. p を返し、残りの手順を 並列に実行する。

  4. embeddedNavigable を controlledframe の 埋め込まれた navigable とする。

  5. embeddedNavigable が null である場合、 controlledframe、p、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

  6. controlledframe の ZoomMode が disabled である場合:

    1. controlledframe、p、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

  7. controlledframe の ZoomMode が per-origin である場合:

    1. oldZoomFactor を controlledframe の currentZoom とする。

    2. controlledframe および zoomFactor を与えて per-origin ズームレベルを設定する。

    3. ユーザーエージェントの 閲覧コンテキストグループ集合内の各 閲覧コンテキストグループ group について 反復する:

      1. group 内の各 トップレベル閲覧コンテキスト browsingContext について 反復する:

        1. embeddedDocument を browsingContext の アクティブ文書とする。

        2. embedder を embeddedDocument の node navigable の controlledFrameEmbedderParent とする。

        3. embedder が null である場合、続行する。

        4. match を、次の条件がすべて true である場合は true とする:

        5. match が true である場合:

          1. embedder の currentZoom を zoomFactor に設定する。

          2. zoomFactor を与えて embeddedDocument に ズームレベルを適用する。

          3. embedder、 oldZoomFactor、および zoomFactor を用いて "zoomchange" イベントを発火する。

  8. controlledframe の ZoomMode が per-view である場合:

    1. oldZoomFactor を controlledframe の currentZoom とする。

    2. controlledframe の currentZoom を zoomFactor に設定する。

    3. oldZoomFactor が controlledframe の currentZoom と等しくない場合:

      1. controlledframe の currentZoom を与えて controlledframe の埋め込まれた文書に ズームレベルを適用する。

      2. controlledframe、 oldZoomFactor、controlledframe の currentZoom を用いて "zoomchange" イベントを発火する。

  9. controlledframe および p を与えて 埋め込み元 promise を解決する。

3.6. キャプチャメソッド

// One of |code| or |file| must be specified but not both.
dictionary ImageDetails {
  DOMString format;
  DOMString quality;
};
captureVisibleRegion(options) メソッド手順は次の通りである:
  1. resultPromise を新しい promise とする。

  2. controlledframe を this とする。

  3. resultPromise を返し、残りの手順を 並列に実行する。

  4. controlledframe の 埋め込まれた navigable が null である場合、 controlledframe、resultPromise、および TypeError を与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。

  5. optionsFormat を既定で "JPEG" とする。

  6. optionsQuality を既定で 100 とする。

  7. options にフィールド "format" がある場合:

    1. optionsFormat を options["format"] とする。

  8. optionsFormat が認識されない形式である場合、 controlledframe、resultPromise、および TypeError を与えて埋め込み元 promise を拒否し、これらの手順を中止する。

  9. options にフィールド "quality" がある場合:

    1. optionsQuality を options["quality"] とする。

  10. optionsQuality が整数でない、または 0 以上 100 以下でない場合、 controlledframe、 resultPromise、および TypeError を与えて埋め込み元 promise を拒否し、 これらの手順を中止する。

  11. imageData を、埋め込まれたコンテンツの可視領域を示す画像であり、 optionsFormat で、品質 optionsQuality でエンコードされたものとする。

    注: サポートされる画像形式の集合は 実装定義であるが、少なくとも "JPEG" および "PNG" をサポートすることが推奨される。

  12. controlledframe、resultPromise、 および imageData を含む data: URL を与えて 埋め込み元 promise を解決する。

print() メソッド手順は次の通りである:
  1. this の 埋め込まれた navigable が null である場合、 TypeError を投げる。

  2. 埋め込まれたコンテンツに対してブラウザのページ印刷機能を開始する。

3.7. イベント

HTMLControlledFrameElement は EventTarget を実装し、次のイベントハンドラー(および対応する イベントハンドラーイベント型)をサポートする。

イベントハンドラー イベントハンドラーイベント型
onconsolemessage consolemessage
oncontentload contentload
ondialog dialog
onloadabort loadabort
onloadcommit loadcommit
onloadstart loadstart
onloadstop loadstop
onnewwindow newwindow
onpermissionrequest permissionrequest
onsizechanged sizechanged
onzoomchange zoomchange

インタラクティブイベント:

UI 変更イベント:

ナビゲーションイベント:

各 HTMLControlledFrameElement は、初期値が 0 である数値 load counter を持つ。

onloadstart イベントが発火するたびに、load counter は 1 増加する。

onloadabort イベントが発火するたびに、load counter は 1 減少する。

onloadcommit イベントが発火するたびに、load counter は 1 減少する。

load counter が 0 でない数から 0 に変化したとき、"loadstop" イベントを発火する。

3.7.1. consolemessage

[Exposed=Window, IsolatedContext]
interface ConsoleMessage {
  readonly attribute long level;
  readonly attribute DOMString message;
};

[Exposed=Window, IsolatedContext]
interface ConsoleMessageEvent : Event {
  constructor(DOMString type, optional ConsoleMessageEventInit eventInitDict = {});
  readonly attribute ConsoleMessage consoleMessage;
};

dictionary ConsoleMessageEventInit: EventInit {
  ConsoleMessage? consoleMessage;
};

controlledframe 要素 target、long logLevel、および DOMString message を与えて、 ConsoleMessageEvent を発火する には、次の手順を実行する:

  1. consoleMessage を新しい ConsoleMessage オブジェクトとする。

  2. consoleMessage の次のフィールドを設定する:

    level

    logLevel。

    message

    message。

  3. e の consoleMessage を consoleMessage に設定する。

  4. target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、target に e をdispatch させる。

3.7.2. dialog

enum DialogType {
  "alert",
  "confirm",
  "prompt"
};

[Exposed=Window, IsolatedContext]
interface DialogController {
  undefined okay(optional DOMString response);
  undefined cancel();
};

[Exposed=Window, IsolatedContext]
interface DialogMessage {
  readonly attribute DialogType messageType;
  readonly attribute DOMString messageText;
  readonly attribute DialogController dialog;
};

[Exposed=Window, IsolatedContext]
interface DialogEvent : Event {
  constructor(DOMString type, optional DialogEventInit eventInitDict = {});
  readonly attribute DialogMessage dialogMessage;
};

dictionary DialogEventInit: EventInit {
  DialogMessage? dialogMessage;
};

各 DialogController は次を持つ:

okay(response) メソッド手順は次の通りである:

  1. accept を true に設定する。

  2. response を response に設定する。

cancel() メソッド手順は次の通りである:

  1. accept を false に設定する。

controlledframe 要素 target、simple-dialogs 型 dialogType、および メッセージ message を与えて、 DialogEvent を発火する には、次の手順を実行する:

  1. e["dialogMessage"]["dialog"]["accept"] が false と等しいことを表明する。

  2. dialogMessage を新しい DialogMessage オブジェクトとする。

  3. dialog を新しい DialogController オブジェクトとする。

  4. dialogMessage の次のフィールドを設定する:

    messageType

    dialogType。

    messageText

    message。

    dialog

    dialog。

  5. e の dialogMessage を dialogMessage に設定する。

  6. complete を false とする。

  7. target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 次の手順を実行させる:

    1. target に e をdispatch する。

    2. complete を true に設定する。

  8. complete が true になるまで同期的に待つ。

    注: ここでブロックするのは意図的である。 "dialog" イベントによって表される alert、confirm、および prompt ダイアログはメインスレッドをブロックし、ここで呼び出すイベント ハンドラーが戻り値に影響し得るためである。

  9. e["dialogMessage"]["dialog"]["accept"] および e["dialogMessage"]["dialog"]["response"] を返す。

3.7.3. newwindow

enum WindowOpenDisposition {
  "ignore",
  "save_to_disk",
  "current_tab",
  "new_background_tab",
  "new_foreground_tab",
  "new_window",
  "new_popup"
};

[Exposed=Window, IsolatedContext]
interface NewWindowController {
  undefined attach(HTMLControlledFrameElement newControlledFrame);
  undefined discard();
};

[Exposed=Window, IsolatedContext]
interface NewWindow {
  readonly attribute NewWindowController window;
  readonly attribute USVString targetUrl;
  readonly attribute DOMString name;
  readonly attribute WindowOpenDisposition windowOpenDisposition;
};

[Exposed=Window, IsolatedContext]
interface NewWindowEvent : Event {
  constructor(DOMString type, optional NewWindowEventInit eventInitDict = {});
  readonly attribute NewWindow newWindow;
};

dictionary NewWindowEventInit: EventInit {
  NewWindow? newWindow;
};

各 NewWindowController は、 target navigable への参照を持ち、その初期値は null である。

attach(newControlledFrame) メソッド手順は次の通りである:

  1. newControlledFrame の 埋め込まれた navigable を、 this の target navigable に設定する。

discard() メソッド手順は次の通りである:

  1. this の target navigable が null でない場合、 this の target navigable を与えて トップレベル traversable を閉じる。

controlledframe 要素 controlledFrame、USVString url、 DOMString target、navigable targetNavigable、および WindowOpenDisposition windowOpenDisposition を与えて、 NewWindowEvent を発火する には、次の手順を実行する:

  1. controller を新しい NewWindowController オブジェクトとする。

  2. controller の target navigable を targetNavigable に設定する。

  3. newWindow を新しい NewWindow オブジェクトとする。

  4. newWindow の次のフィールドを設定する:

    window

    controller

    targetUrl

    url

    name

    target。

    windowOpenDisposition

    windowOpenDisposition

  5. e の newWindow を newWindow に設定する。

  6. controlledFrame の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 controlledFrame に e をdispatch させる。

3.7.4. permissionrequest

enum PermissionType {
  "media",
  "geolocation",
  "pointerLock",
  "download",
  "filesystem",
  "fullscreen",
  "hid",
};

[Exposed=Window, IsolatedContext]
interface PermissionRequestControllerBase {
  undefined allow();
  undefined cancel();
};

[Exposed=Window, IsolatedContext]
interface MediaPermissionRequestController: PermissionRequestControllerBase {
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface GeolocationPermissionRequestController: PermissionRequestControllerBase {
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface PointerLockPermissionRequestController: PermissionRequestControllerBase {
  readonly attribute boolean lastUnlockedBySelf;
  readonly attribute boolean userGesture;
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface DownloadPermissionRequestController : PermissionRequestControllerBase {
  readonly attribute DOMString requestMethod;
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface FileSystemPermissionRequestController : PermissionRequestControllerBase {
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface FullscreenPermissionRequestController : PermissionRequestControllerBase {
  readonly attribute USVString origin;
};

[Exposed=Window, IsolatedContext]
interface HidPermissionRequestController : PermissionRequestControllerBase {
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface PermissionRequest {
  readonly attribute PermissionType permission;
  readonly attribute PermissionRequestControllerBase request;
};

[Exposed=Window, IsolatedContext]
interface PermissionRequestEvent : Event {
  constructor(DOMString type, optional PermissionRequestEventInit eventInitDict = {});
  readonly attribute PermissionRequest permissionRequest;
};

dictionary PermissionRequestEventInit: EventInit {
  PermissionRequest? permissionRequest;
};

各 PermissionRequestControllerBase は boolean 値 allow を持ち、 その初期値は false である。

allow() メソッド手順は次の通りである:

  1. allow を true に設定する。

cancel() メソッド手順は次の通りである:

  1. allow を false に設定する。

文書 embeddedDocument、 controlledframe 要素 target、DOMString type、USVString url、 省略可能な辞書 options、および boolean を取るアルゴリズム completionSteps を与えて、 PermissionRequestEvent を発火する には、次の手順を実行する:

  1. permissionRequest を新しい PermissionRequest オブジェクトとする。

  2. type が "media" である場合:

    1. requestController を、次の属性を持つ新しい MediaPermissionRequestController とする:

      url

      url

  3. type が "geolocation" である場合:

    1. requestController を、次の属性を持つ新しい GeolocationPermissionRequestController とする:

      url

      url

  4. type が "pointerLock" である場合:

    1. requestController を、次の属性を持つ新しい PointerLockPermissionRequestController とする:

      lastUnlockedBySelf

      options["lastUnlockedBySelf"]

      userGesture

      options["userGesture"]

      url

      url

  5. type が "download" である場合:

    1. requestController を、次の属性を持つ新しい DownloadPermissionRequestController とする:

      requestMethod

      options["requestMethod"]

      url

      url

  6. type が "filesystem" である場合:

    1. requestController を、次の属性を持つ新しい FileSystemPermissionRequestController とする:

      url

      url

  7. type が "fullscreen" である場合:

    1. requestController を、次の属性を持つ新しい FullscreenPermissionRequestController とする:

      origin

      url のオリジン

  8. type が "hid" である場合:

    1. requestController を、次の属性を持つ新しい HidPermissionRequestController とする:

      url

      url

  9. permissionRequest の次のフィールドを設定する:

    request

    requestController

    permission

    type。

  10. e の permissionRequest を permissionRequest に設定する。

  11. target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 次の手順を実行させる:

    1. target に e をdispatch する。

    2. embeddedDocument の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 e["permissionRequest"]["permission"]["allow"] を用いて completionSteps を実行させる。

3.7.5. sizechanged

[Exposed=Window, IsolatedContext]
interface SizeChange {
  readonly attribute unsigned long oldWidth;
  readonly attribute unsigned long oldHeight;
  readonly attribute unsigned long newWidth;
  readonly attribute unsigned long newHeight;
};

[Exposed=Window, IsolatedContext]
interface SizeChangedEvent : Event {
  constructor(DOMString type, optional SizeChangedEventInit eventInitDict = {});
  readonly attribute SizeChange sizeChange;
};

dictionary SizeChangedEventInit: EventInit {
  SizeChange? sizeChange;
};

controlledframe 要素 target、4 つの非負数 oldWidth、oldHeight、 newWidth、newHeight を与えて、 SizeChangedEvent e を発火するには:

  1. sizeChange を新しい SizeChange オブジェクトとする。

  2. sizeChange の次のフィールドを設定する:

    oldWidth

    oldWidth。

    oldHeight

    oldHeight。

    newWidth

    newWidth。

    newHeight

    newHeight。

  3. e の sizeChange を sizeChange に設定する。

  4. target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。

3.7.6. zoomchange

[Exposed=Window, IsolatedContext]
interface ZoomChange {
  readonly attribute float oldZoomFactor;
  readonly attribute float newZoomFactor;
};

[Exposed=Window, IsolatedContext]
interface ZoomChangeEvent : Event {
  constructor(DOMString type, optional ZoomChangeEventInit eventInitDict = {});
  readonly attribute ZoomChange zoomChange;
};

dictionary ZoomChangeEventInit: EventInit {
  ZoomChange? zoomChange;
};

controlledframe 要素 target、2 つの float 数 oldZoomFactor、newZoomFactor を与えて、 ZoomChangeEvent を発火する には:

  1. zoomChange を新しい ZoomChange オブジェクトとする。

  2. zoomChange の次のフィールドを設定する:

    oldZoomFactor

    oldZoomFactor。

    newZoomFactor

    newZoomFactor。

  3. e の zoomChange を zoomChange に設定する。

  4. target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。

3.7.7. contentload

[Exposed=Window, IsolatedContext]
interface ContentLoadEvent : Event {
  constructor(DOMString type, optional EventInit eventInitDict = {});
};

controlledframe 要素 target を与えて、 ContentLoadEvent を発火する には、次の手順を実行する:

  1. target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。

3.7.8. loadabort

[Exposed=Window, IsolatedContext]
interface LoadInfo {
  readonly attribute USVString url;
  readonly attribute boolean isTopLevel;
};

[Exposed=Window, IsolatedContext]
interface LoadAbortInfo : LoadInfo{
  readonly attribute long code;
  readonly attribute DOMString reason;
};

[Exposed=Window, IsolatedContext]
interface LoadRedirectInfo{
  readonly attribute USVString oldUrl;
  readonly attribute USVString newUrl;
  readonly attribute boolean isTopLevel;
};

[Exposed=Window, IsolatedContext]
interface LoadAbortEvent : Event {
  constructor(DOMString type, optional LoadAbortEventInit eventInitDict = {});
  readonly attribute LoadAbortInfo loadAbortInfo;
};

dictionary LoadAbortEventInit: EventInit {
  LoadAbortInfo? loadAbortInfo;
};

LoadAbortEvent e を発火するには、 controlledframe 要素 target、USVString url、boolean isTopLevel、 long code、および DOMString reason が与えられたとき、次の手順を実行する:

  1. info を、次の属性を持つ新しい LoadAbortInfo とする:

    url

    url

    isTopLevel

    isTopLevel

    code

    code

    reason

    reason

  2. e の loadAbortInfo を info に設定する。

  3. target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。

3.7.9. loadcommit

[Exposed=Window, IsolatedContext]
interface LoadCommitEvent : Event {
  constructor(DOMString type, optional LoadCommitEventInit eventInitDict = {});
  readonly attribute LoadInfo loadInfo;
};

dictionary LoadCommitEventInit: EventInit {
  LoadInfo? loadInfo;
};

LoadCommitEvent e を発火するには、 controlledframe 要素 target、USVString url、および boolean isTopLevel が与えられたとき、次の手順を実行する:

  1. info を、次の属性を持つ新しい LoadInfo とする:

    url

    url

    isTopLevel

    isTopLevel

  2. e の loadInfo を info に設定する。

  3. target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。

3.7.10. loadstart

[Exposed=Window, IsolatedContext]
interface LoadStartEvent : Event {
  constructor(DOMString type, optional LoadStartEventInit eventInitDict = {});
  readonly attribute LoadInfo loadInfo;
};

dictionary LoadStartEventInit: EventInit {
  LoadInfo? loadInfo;
};

LoadStartEvent e を発火するには、 controlledframe 要素 target、USVString url、および boolean isTopLevel が与えられたとき、次の手順を実行する:

  1. info を、次の属性を持つ新しい LoadInfo とする:

    url

    url

    isTopLevel

    isTopLevel

  2. e の loadInfo を info に設定する。

  3. target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。

3.7.11. loadstop

[Exposed=Window, IsolatedContext]
interface LoadStopEvent : Event {
  constructor(DOMString type, optional LoadStopEventInit eventInitDict = {});
};

dictionary LoadStopEventInit: EventInit {
};

controlledframe 要素 target が与えられたとき、 LoadStopEvent を発火する には、次の手順を実行する:

  1. target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。

3.7.12. loadredirect

[Exposed=Window, IsolatedContext]
interface LoadRedirectEvent : Event {
  constructor(DOMString type, optional LoadRedirectEventInit eventInitDict = {});
  readonly attribute LoadRedirectInfo loadRedirectInfo;
};

dictionary LoadRedirectEventInit: EventInit {
  LoadRedirectInfo? loadRedirectInfo;
};

controlledframe 要素 target、URL oldUrl、 URL newUrl、および boolean isTopLevel が与えられたとき、 LoadRedirectEvent を発火する には、次の手順を実行する:

  1. info を、次の属性を持つ新しい LoadInfo とする:

    oldUrl

    oldUrl を与えて URL を直列化する結果

    newUrl

    newUrl を与えて URL を直列化する結果

    isTopLevel

    isTopLevel

  2. e の loadRedirectInfo を info に設定する。

  3. target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。

3.7.13. モンキーパッチ

3.7.13.1. [HTML]

alert について:

  1. message を、必要に応じて message を切り詰めた結果に設定する。

  2. controlledFrameEmbedderParent を、window の navigable の controlledFrameEmbedderParent とする。 .
  3. controlledFrameEmbedderParent が HTMLControlledFrameElement である場合、 controlledFrameEmbedderParent、"alert"、および message を用いて "dialog" イベントを発火し、戻る。

confirm について:

  1. message を、必要に応じて message を切り詰めた結果に設定する。

  2. controlledFrameEmbedderParent を、window の navigable の controlledFrameEmbedderParent とする。 .
  3. controlledFrameEmbedderParent が HTMLControlledFrameElement である場合、 controlledFrameEmbedderParent、"confirm"、 および message を用いて "dialog" イベントを発火する結果を 返す。

prompt について:

  1. default を、必要に応じて default を切り詰めた結果に設定する。

  2. controlledFrameEmbedderParent を、window の navigable の controlledFrameEmbedderParent とする。 .
  3. controlledFrameEmbedderParent が HTMLControlledFrameElement である場合:
    1. accept および response を、controlledFrameEmbedderParent、 "prompt"、および message を用いて "dialog" イベントを発火する結果とする。
    2. accept が false と等しい場合、null を返す。
    3. response を返す。

window open steps について:

  1. windowOpenDisposition を "ignore" とする。
  2. controlledFrameEmbedderParent を、sourceDocument の node navigable の controlledFrameEmbedderParent とする。

...

14. targetNavigable が null である場合、null を返す。
  1. targetNavigable が null である場合:
    1. controlledFrameEmbedderParent が null でない場合:
      1. controlledFrameEmbedderParent、url、 target、targetNavigable、および windowOpenDisposition を用いて "newwindow" イベントを発火する。
    2. null を返す。
  2. windowType が "new and unrestricted" または "new with no opener" のいずれかである場合:

    1. windowOpenDisposition を、 "new_background_tab"、 "new_foreground_tab"、または "new_window" のいずれかに設定する。

    注: 値はユーザーエージェントがサポートする挙動と ユーザー設定に依存する。

    1. targetNavigable のアクティブ閲覧コンテキストの is popup を、 tokenizedFeatures を与えてポップアップウィンドウが要求されているかを確認した結果に設定する。

    2. targetNavigable の アクティブ閲覧コンテキストの is popup が true である場合、windowOpenDisposition を "new_popup" に設定する。

    ...

  3. それ以外の場合:

    1. windowOpenDisposition を "current_tab" に設定する。

    ...

注: 手順 15 および 16 も targetNavigable をナビゲートする。ナビゲーション中に、 windowOpenDisposition も更新される可能性がある。たとえば、ナビゲーションが 阻止された場合、windowOpenDisposition は "ignore" に設定される可能性がある。 ナビゲーション応答が download になった場合、windowOpenDisposition は "save_to_disk" に設定される可能性がある。

  1. controlledFrameEmbedderParent が null でない場合:
    1. 「newwindow」イベントを発火する。その際、 controlledFrameEmbedderParent、url、 target、targetNavigable、および windowOpenDisposition を指定する。

completely finish loading について:

  1. それ以外で container が非 null である場合、container を与えて DOM 操作タスクソースに 要素タスクをキューに入れ、container で load という名前のイベントを発火する。

  2. controlledFrameEmbedderParent を、document の node navigable の controlledFrameEmbedderParent とする。
  3. controlledFrameEmbedderParent が HTMLControlledFrameElement である場合、 controlledFrameEmbedderParent を用いて "contentload" イベントを発火する。

loadstart、loadabort、および loadcommit のモンキーパッチは次のようになる:

  1. loadstart -> ナビゲーションの入口点: 通常のナビゲーション、再読み込み、traversal。

  2. loadcommit -> 共通のナビゲーション完了点。

  3. loadabort -> loadstart と loadcommit の間にあるアルゴリズムの各早期終了点。

これらのそれぞれについて、navigable の top-level traversable が、HTMLControlledFrameElement の controlledFrameEmbedderParent を持つかどうかを確認し、 持つ場合は、入力引数を用いて対応するイベントを発火する。

3.7.13.2. [FETCH]

HTTP fetch(loadredirect)について:

  1. internalResponse の status がリダイレクトステータスである場合:

    1. request の window window が、環境設定オブジェクトであり、その グローバルオブジェクトが Window オブジェクトである場合:
      1. currentNavigable を、window に関連付けられた navigable とする。
      2. controlledFrameEmbedderParent を、currentNavigable の top-level traversable の controlledFrameEmbedderParent とする。
      3. controlledFrameEmbedderParent が HTMLControlledFrameElement である場合:

        1. oldUrl を、request に関連付けられた URL とする。

        1. newUrl を、response の location url とする。

        1. isTopLevel を false とし、currentNavigable が null の parent を持つ場合は isTopLevel を true に設定する。

        1. controlledFrameEmbedderParent、oldUrl、newUrl、 および isTopLevel を用いて "loadredirect" イベントを発火する。

3.7.13.3. [Permissions]

新しいアルゴリズムを定義する:

Document document が、 DOMString permission、省略可能な辞書 options、および boolean を取るアルゴリズム completionSteps を与えられて、 permission を使用することを埋め込み元に許可されている かどうかを判定するには、次の手順を実行する:

  1. controlledFrameEmbedderParent を、document の node navigable の controlledFrameEmbedderParent とする。

  2. controlledFrameEmbedderParent が HTMLControlledFrameElement でない場合、true を返す。

  3. document、 controlledFrameEmbedderParent、permission、document の URL、options、および completionSteps を用いて "permissionrequest" イベントを発火する。

request a position(geolocation)について:

  1. document が "geolocation" 機能の使用を許可されていない場合:

    1. watchId が渡されていた場合、watchIDs から watchId を削除する。

    2. errorCallback および PERMISSION_DENIED を渡して error でコールバックする。

    3. このアルゴリズムを終了する。

  2. blockedByEmbedder を false とする。
  3. document が "geolocation" 機能を埋め込み元に使用を許可されているかを、 その boolean 引数を blockedByEmbedder に代入し、これらの手順の残りを続行するアルゴリズムを与えて確認する。
  4. blockedByEmbedder が true である場合:
    1. watchId が渡されていた場合、watchIDs から watchId を削除する。
    2. errorCallback および PERMISSION_DENIED を渡して error でコールバックする。
    3. このアルゴリズムを終了する。
  5. controlledFrameEmbedderParent を、document の node navigable の controlledFrameEmbedderParent とする。
  6. controlledFrameEmbedderParent が HTMLControlledFrameElement である場合:
    1. nodeDocument を controlledFrameEmbedderParent の node document とする。

    2. nodeDocument が null である場合:
      1. watchId が渡されていた場合、watchIDs から watchId を削除する。
      2. errorCallback および PERMISSION_DENIED を渡して error でコールバックする。
      3. このアルゴリズムを終了する。
    3. embedderNavigator を、nodeDocument の グローバルオブジェクトの 関連 Navigator とする。
    4. embedderGeolocation を、embedderNavigator の geolocation とする。
    5. embedderGeolocation、successCallback、errorCallback、 options、および whatchId を用いて request a position した結果を返す。

注: 他の permission も geolocation と同様に モンキーパッチされる。しかし簡潔さのため、この文書では詳細は省略されている。

3.7.13.4. [Console]

Logger について:

  1. それ以外の場合、Printer(logLevel, Formatter(args)) を実行する。

  2. logLevel および Formatter(args) を用いて "consolemessage" イベントを発火する。

注: Console は既定では document との関連付けを持たないため、 関連付けられた HTMLControlledFrameElement を追跡できない。

3.8. 他の仕様との統合

この仕様は、Controlled Frame のニーズに対応するため、仕様にいくつかの変更を加える。

3.8.1. モンキーパッチ

3.8.1.1. [HTML]

各 navigable は次を持つ:

initialize the navigable アルゴリズムは、navigable navigable および省略可能な navigable-or-null parent(既定値 null)を与えられたとき、 次のようにモンキーパッチされる:

  1. navigable の parent を parent に設定する。

  2. parent が null でない(navigable が top-level traversable でない)場合:
    1. topLevelTraversable を、 navigable が子孫である top-level traversable とする。
    2. navigable の frameId を topLevelTraversable の next frameId に設定する。
    3. topLevelTraversable の next frameId をインクリメントする。

Document document を readinessValue にする update the current document readiness アルゴリズムは、次のようにモンキーパッチされる:

  1. runAt を、 readinessValue に次のマッピングを適用した結果とする:
    "loading"

    "document-start"

    "interactive"

    "document-end"

    "complete"

    "document-idle"

  2. document および runAt を与えて コンテンツスクリプトを文書に注入する。
  3. document で readystatechange という名前のイベントを発火する。

3.8.1.2. [FETCH]

determine the network partition key アルゴリズムは、 Controlled Frame の 埋め込まれた navigable に由来する ネットワークリクエストについて double-keying を要求するように モンキー拡張される。

environment environment を与えて、network partition key を決定するには:
  1. topLevelOrigin を与えて site を取得する結果を topLevelSite とする。

  2. secondKey を null または実装定義の値 とする。

  3. controlledFrameEmbedderParent を、environment を与えて environment の controlledFrameEmbedderParent を取得する結果とする。
  4. controlledFrameEmbedderParent が null でない場合、secondKey を、 controlledFrameEmbedderParent の 関連設定オブジェクトの トップレベルオリジンと、 controlledFrameEmbedderParent の partition からなる タプルに設定する。
  5. (topLevelSite, secondKey) を返す。

3.8.1.3. [STORAGE]

ストレージキーは次のように再定義される:

storage key は、 embedding origin(origin または null)、 partition(DOMString または null)、および origin(origin)からなる タプル である。

注: この定義は、storage partitioning が完全に仕様化された後、 将来的に origin に加えて埋め込まれたコンテンツの トップレベルオリジンを含むように拡張する必要がある。

注: Controlled Frame データは、それを所有するトップレベル文書ではなく、 Controlled Frame 要素を所有する文書の origin によって triple keyed される。

obtain a storage key for non-storage purposes アルゴリズムは、 controlledframe の 埋め込まれた navigable に属するすべてのストレージについて double-keying を要求するように拡張される。

environment environment を与えて、 non-storage purposes のための storage key を取得するには、 次の手順を実行する:
  1. environment が環境設定オブジェクトである場合は environment の origin を、 それ以外の場合は environment の creation URL の origin を、 origin とする。

  2. origin からなる タプルを返す。
  3. topLevelOrigin および partition を null とする。
  4. controlledFrameEmbedderParent を、environment を与えて environment の controlledFrameEmbedderParent を取得する結果とする。
  5. controlledFrameEmbedderParent が null でない場合:
    1. topLevelOrigin を、 controlledFrameEmbedderParent の 関連設定オブジェクトの トップレベルオリジンに設定する。
    2. partition を controlledFrameEmbedderParent の partition に設定する。
  6. topLevelOrigin、partition、 および origin からなる タプルを返す。
environment environment を与えて、 environment の controlledFrameEmbedderParent を取得するには、 次の手順を実行する:
  1. environment が環境設定オブジェクトであり、その グローバルオブジェクトが Window オブジェクトである場合:

    このアルゴリズムは、 Shared Worker または Service Worker では機能しない。なぜなら controlledFrameEmbedderParent は navigable 上でのみ定義されており、 非 Window の environment から navigable へ到達することが常に可能とは限らないためである。

    1. navigable を、environment の グローバルオブジェクトの navigable とする。

    2. top を navigable の top-level traversable とする。

    3. top の controlledFrameEmbedderParent が null でない場合、top の controlledFrameEmbedderParent を返す。

  2. null を返す。

4. Web Request API

enum ResourceType {
  "main-frame",
  "sub-frame",
  "stylesheet",
  "script",
  "image",
  "font",
  "object",
  "xmlhttprequest",
  "ping",
  "csp-report",
  "media",
  "websocket",
  "other",
};

enum RequestedHeaders {
  "none",
  "cors",
  "all",
};

enum ConnectionState {
  "broken", "insecure", "secure"
};

dictionary Fingerprint {
  required DOMString sha256;
};

dictionary CertificateInfo {
  required Fingerprint fingerprint;
  Uint8Array rawDER;
};

dictionary SecurityInfo {
  required sequence<CertificateInfo> certificates;
  required ConnectionState state;
};

dictionary WebRequestInterceptorOptions {
  required sequence<(URLPattern or URLPatternInput)> urlPatterns;
  sequence<ResourceType> resourceTypes = [];
  boolean blocking = false;
  boolean includeRequestBody = false;
  RequestedHeaders includeHeaders = "none";
  boolean securityInfo = false;
  boolean securityInfoRawDer = false;
};

[Exposed=Window, IsolatedContext]
interface WebRequest {
  WebRequestInterceptor createWebRequestInterceptor(
      WebRequestInterceptorOptions options);
};

[Exposed=Window, IsolatedContext]
interface WebRequestInterceptor : EventTarget {
  attribute EventHandler onauthrequired;
  attribute EventHandler onbeforeredirect;
  attribute EventHandler onbeforerequest;
  attribute EventHandler onbeforesendheaders;
  attribute EventHandler oncompleted;
  attribute EventHandler onerroroccurred;
  attribute EventHandler onheadersreceived;
  attribute EventHandler onsendheaders;
  attribute EventHandler onresponsestarted;
};

enum DocumentLifecycle {
  "prerender",
  "active",
  "cached",
  "pending-deletion",
};

enum FrameType {
  "outermost-frame",
  "fenced-frame",
  "sub-frame",
};

[Exposed=Window, IsolatedContext]
interface UploadData {
  readonly attribute ArrayBuffer? bytes;
  readonly attribute DOMString? file;
};

[Exposed=Window, IsolatedContext]
interface RequestBody {
  readonly attribute DOMString? error;
  readonly attribute any formData;
  readonly attribute FrozenArray<UploadData>? raw;
};

[Exposed=Window, IsolatedContext]
interface WebRequestRequest {
  readonly attribute DOMString method;
  readonly attribute DOMString id;
  readonly attribute ResourceType type;
  readonly attribute USVString url;
  readonly attribute USVString? initiator;
  readonly attribute Headers? headers;
  readonly attribute RequestBody? body;
};

[Exposed=Window, IsolatedContext]
interface AuthChallenger {
  readonly attribute DOMString host;
  readonly attribute long port;
};

[Exposed=Window, IsolatedContext]
interface WebRequestAuthDetails {
  readonly attribute AuthChallenger challenger;
  readonly attribute boolean isProxy;
  readonly attribute DOMString scheme;
  readonly attribute DOMString? realm;
};

[Exposed=Window, IsolatedContext]
interface WebRequestResponse {
  readonly attribute long statusCode;
  readonly attribute DOMString statusLine;
  readonly attribute boolean fromCache;
  readonly attribute Headers? headers;
  readonly attribute DOMString? ip;
  readonly attribute USVString? redirectURL;
  readonly attribute WebRequestAuthDetails? auth;
};

[Exposed=Window, IsolatedContext]
interface WebRequestEvent : Event {
  readonly attribute WebRequestRequest request;
  readonly attribute long frameId;
  readonly attribute FrameType? frameType;
  readonly attribute DOMString? documentId;
  readonly attribute DocumentLifecycle? documentLifecycle;
  readonly attribute DOMString? parentDocumentId;
  readonly attribute long? parentFrameId;
};

dictionary WebRequestAuthCredentials {
  required DOMString username;
  required DOMString password;
};

dictionary WebRequestAuthOptions {
  AbortSignal signal;
};

[Exposed=Window, IsolatedContext]
interface WebRequestAuthRequiredEvent : WebRequestEvent {
  readonly attribute WebRequestResponse response;

  undefined setCredentials(
    Promise<WebRequestAuthCredentials> credentials,
    optional WebRequestAuthOptions options = {});
};

[Exposed=Window, IsolatedContext]
interface WebRequestBeforeRedirectEvent : WebRequestEvent {
  readonly attribute WebRequestResponse response;
};

[Exposed=Window, IsolatedContext]
interface WebRequestBeforeRequestEvent : WebRequestEvent {
  undefined redirect(USVString redirectURL);
};

[Exposed=Window, IsolatedContext]
interface WebRequestBeforeSendHeadersEvent : WebRequestEvent {
  undefined setRequestHeaders((Headers or HeadersInit) requestHeaders);
};

[Exposed=Window, IsolatedContext]
interface WebRequestCompletedEvent : WebRequestEvent {
  readonly attribute WebRequestResponse response;
};

[Exposed=Window, IsolatedContext]
interface WebRequestErrorOccurredEvent : WebRequestEvent {
  readonly attribute DOMString error;
};

[Exposed=Window, IsolatedContext]
interface WebRequestHeadersReceivedEvent : WebRequestEvent {
  readonly attribute WebRequestResponse response;
  readonly attribute SecurityInfo? securityInfo;

  undefined redirect(USVString redirectURL);
  undefined setResponseHeaders((Headers or HeadersInit) responseHeaders);
};

[Exposed=Window, IsolatedContext]
interface WebRequestResponseStartedEvent : WebRequestEvent {
  readonly attribute WebRequestResponse response;
};

[Exposed=Window, IsolatedContext]
interface WebRequestSendHeadersEvent : WebRequestEvent {};

各 WebRequest は、関連付けられた次のものを持つ:

注: Interceptors は、 controlledframe 要素のイベントループ上のタスクから書き込まれるが、fetch 中には 並列に読み取られる。

適用可能な WebRequestInterceptors のスナップショットは、 WebRequest イベントを dispatch する前に作成される。 イベントの処理中に WebRequestInterceptor 上に登録されたイベントリスナーは、そのイベントでは発火されない。

各 WebRequestInterceptor は、関連付けられた次のものを持つ:

各 UploadData は、関連付けられた次のものを持つ:

各 RequestBody は、関連付けられた次のものを持つ:

各 WebRequestRequest は、関連付けられた次のものを持つ:

各 AuthChallenger は、関連付けられた次のものを持つ:

各 WebRequestAuthDetails は、関連付けられた次のものを持つ:

各 WebRequestResponse は、関連付けられた次のものを持つ:

各 WebRequestEvent は、関連付けられた次のものを持つ:

各 WebRequestAuthRequiredEvent は、関連付けられた次のものを持つ:

各 WebRequestBeforeRedirectEvent は、関連付けられた次のものを持つ:

各 WebRequestCompletedEvent は、関連付けられた次のものを持つ:

各 WebRequestErrorOccurredEvent は、関連付けられた次のものを持つ:

各 WebRequestHeadersReceivedEvent は、関連付けられた次のものを持つ:

各 WebRequestResponseStartedEvent は、関連付けられた次のものを持つ:

createWebRequestInterceptor(options) メソッド手順は次の通りである:
  1. interceptor を新しい WebRequestInterceptor オブジェクトとする。

  2. interceptor に次のフィールドを設定する:

    resourceTypes

    options["resourceTypes"]

    blocking

    options["blocking"]

    includeRequestBody

    options["includeRequestBody"]

    includeHeaders

    options["includeHeaders"]

    securityInfo

    options["securityInfo"]

    securityInfoRawDer

    options["securityInfoRawDer"]

  3. options["urlPatterns"] 内の各 urlPattern について 反復する:

    1. urlPattern が URLPattern である場合、urlPattern を interceptor の urlPatterns に 追加する。

    2. それ以外の場合、urlPattern を与えて新しい URLPattern を作成し、それを interceptor の urlPatterns に 追加する。

  4. interceptor を this の interceptors に 追加する。

  5. interceptor を返す。

request request について、 適用可能な WebRequestInterceptor を取得するには、次の手順を実行する:
  1. client を request の client とする。

  2. client が null である場合、空のリストおよび false を返す。

  3. window を、client を与えて 環境設定オブジェクトの所有 Window を取得した結果とする。

  4. window が null である場合、空のリストおよび false を返す。

  5. navigable を window の navigable とする。

  6. navigable またはその controlledFrameEmbedderParent が null である場合、空のリスト および false を返す。

  7. controlledFrame を navigable の controlledFrameEmbedderParent とする。

  8. applicableInterceptors を空のリストとする。

  9. controlledFrame の request の interceptors 内の各 interceptor について:

    1. request が interceptor によって intercepted されるべきでない場合、続行する。

    2. interceptor を applicableInterceptors に 追加する。

  10. applicableInterceptors を返す。

request request が WebRequestInterceptor によって intercepted されるべきかを判定するには、 次の手順を実行する:
  1. types を interceptor の resourceTypes とする。

  2. types が空でなく、 かつ request を与えて request の ResourceType を取得する結果を types が含まない場合、false を返す。

  3. urlPatterns を interceptor の urlPatterns とする。

  4. urlPatterns 内の各 urlPattern について:

    1. request の URL が urlPattern を与えて URLPattern に一致する 場合、true を返す。

  5. false を返す。

環境設定オブジェクト environment が 与えられたとき、 環境設定オブジェクトの所有 Window を取得するには、次の手順を実行する:
  1. global を environment の グローバルオブジェクトとする。

  2. global が Window オブジェクトである場合、global を返す。

  3. global が DedicatedWorkerGlobalScope オブジェクトである場合:

    1. owner を global とする。

    2. owner が DedicatedWorkerGlobalScope オブジェクトである間:

      1. owner を owner の owner set[0] とする。

    3. owner が Document オブジェクトである場合、owner の 関連グローバルオブジェクト を返す。

  4. null を返す。

4.1. イベント

WebRequestInterceptor は次のイベントを発火する:

イベント名 インターフェイス 発火する時点...
authrequired WebRequestAuthRequiredEvent intercepted されたrequest が、HTTP 401 (Unauthorized) または 407 (Proxy Authentication Required) のstatus を持つ response を受け取ったとき。
beforeredirect WebRequestBeforeRedirectEvent intercepted されたrequest が、リダイレクト response を受け取ったとき。
beforerequest WebRequestBeforeRequestEvent intercepted されたrequest の処理が 開始されようとしているとき。
beforesendheaders WebRequestBeforeSendHeadersEvent intercepted された request のリクエストヘッダーが送信されようとしているとき。
completed WebRequestCompletedEvent intercepted されたrequest が完了したとき。
erroroccurred WebRequestErrorOccurredEvent intercepted された request の処理中にエラーが発生したとき。
headersreceived WebRequestHeadersReceivedEvent intercepted されたrequest が レスポンスヘッダーを受け取ったとき。
sendheaders WebRequestSendHeadersEvent intercepted されたrequest が、そのリクエスト ヘッダーを送信するとき。
responsestarted WebRequestResponseStartedEvent intercepted されたrequest が、その response を受け取り始めたとき。

WebRequestInterceptor は、次のイベントハンドラー(および対応する イベントハンドラーイベント型)を イベントハンドラー IDL 属性としてサポートする:

イベントハンドラー イベントハンドラーイベント型
onauthrequired authrequired
onbeforeredirect beforeredirect
onbeforerequest beforerequest
onbeforesendheaders beforesendheaders
oncompleted completed
onerroroccurred erroroccurred
onheadersreceived headersreceived
onsendheaders sendheaders
onresponsestarted responsestarted

各 WebRequestAuthRequiredEvent は、関連付けられた次のものを持つ:

WebRequestAuthRequiredEvent の setCredentials(credentials, options) メソッド手順は次の通りである:
  1. this の authCredentials を credentials に設定する。

  2. this の options を options に設定する。

WebRequestAuthRequiredEvent の preventDefault() メソッド手順は、this の cancel を true に設定することである。

各 WebRequestBeforeRequestEvent は、関連付けられた次のものを持つ:

WebRequestBeforeRequestEvent の redirect(redirectURL) メソッド手順は、this の redirectURL を redirectURL に設定することである。
WebRequestBeforeRequestEvent の preventDefault() メソッド手順は、this の cancel を true に設定することである。

各 WebRequestBeforeSendHeadersEvent は、関連付けられた次のものを持つ:

WebRequestBeforeSendHeadersEvent の setRequestHeaders(requestHeaders) メソッド手順は、this の requestHeaders を requestHeaders に設定することである。
WebRequestBeforeSendHeadersEvent の preventDefault() メソッド手順は、this の cancel を true に設定することである。

各 WebRequestHeadersReceivedEvent は、関連付けられた次のものを持つ:

WebRequestHeadersReceivedEvent の redirect(redirectURL) メソッド手順は、this の redirectURL を redirectURL に設定することである。
WebRequestHeadersReceivedEvent の setResponseHeaders(responseHeaders) メソッド手順は、this の responseHeaders を responseHeaders に設定することである。
WebRequestHeadersReceivedEvent の preventDefault() メソッド手順は、this の cancel を true に設定することである。

WebRequestEvent result は、次の 項目を持つ構造体である:

cancel

boolean。初期値は false

redirectURL

USVString。 初期値は ""

authCredentials

WebRequestAuthCredentials または null。初期値は null

requestHeaders

header list。初期値は «»

responseHeaders

header list。初期値は «»

request request を与えて beforeRequest イベントを処理するには、 次の手順を実行する:
  1. interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。

  2. result を WebRequestEvent result とする。

  3. pendingHandlerCount を 0 とする。

  4. controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。

  5. controlledFrameEmbedderGlobal が null である場合、戻る。

  6. interceptors 内の各 interceptor について:

    1. interceptor の blocking が true の場合、 pendingHandlerCount をインクリメントする。

    2. controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:

      1. event を、 beforerequest という名前の 新しい WebRequestBeforeRequestEvent とする。

      2. event、request、および "none" を与えて WebRequestEvent に値を設定する。

      3. interceptor の includeRequestBody が true であり、かつ request の body が null でない場合:

        1. requestBody を新しい RequestBody とする。

        2. body を request の body とする。

          TODO: body の stream が存在する場合、それを直列化する。

        3. body の source で分岐する:

          byte sequence

          直列化された body の source と等しい bytes を持つ 新しい UploadData を requestBody の raw に 追加する。

          Blob

          直列化された body の source と等しい bytes を持つ 新しい UploadData を requestBody の raw に 追加する。

          FormData
          1. formData を «[]» とする。

          2. body の source の entry list 内の各 entry について 反復する:

            1. entry[1] で分岐する:

            File

            entry[1] の name と等しい file を持つ 新しい UploadData を requestBody の raw に 追加する。

            USVString
            1. formData[entry[0]] が存在しない場合、 formData[entry[0]] を空の リスト に設定する。

            2. entry[1] を formData[entry[0]] に 追加する。

          3. requestBody の formData を formData に設定する。

        4. event の request の body を requestBody に設定する。

      4. event を interceptor に dispatch する。

      5. event の cancel が true である場合、 result の cancel を true に設定する。

      6. event の redirectURL が null でなく、かつ result の redirectURL が "" である場合、 result の redirectURL を event の redirectURL に設定する。

      7. interceptor の blocking が true である場合、 pendingHandlerCount をデクリメントする。

  7. pendingHandlerCount > 0 である場合、 pendingHandlerCount が 0 と等しくなるまで 並列に待機し、その後 グローバルタスクをキューに入れ、 それらの手順が並列に移行する前にどのように実行されていたかに応じて、 request の client の グローバルオブジェクトの ネットワーキングタスクソース、またはこれらの手順が 最初に呼び出された 並列コンテキストのいずれかで、 このアルゴリズムの残りの手順を続行させる。

  8. result を返す。

request request を与えて beforeSendHeaders イベントを処理するには、 次の手順を実行する:
  1. interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。

  2. result を WebRequestEvent result とする。

  3. pendingHandlerCount を 0 とする。

  4. controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。

  5. controlledFrameEmbedderGlobal が null である場合、戻る。

  6. interceptors 内の各 interceptor について:

    1. interceptor の blocking が true の場合、 pendingHandlerCount をインクリメントする。

    2. controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:

      1. event を、 beforesendheaders という名前の 新しい WebRequestBeforeSendHeadersEvent とする。

      2. event、request、および interceptor の includeHeaders を与えて WebRequestEvent に値を設定する。

      3. event を interceptor に dispatch する。

      4. event の cancel が true である場合、 result の cancel を true に設定する。

      5. event の requestHeaders が null でない場合:

        1. result の requestHeaders が null である場合、それを新しい Headers に設定する。

        2. event の requestHeaders 内の各 header について:

          1. header を result の requestHeaders に 追加する。

      6. interceptor の blocking が true である場合、 pendingHandlerCount をデクリメントする。

  7. pendingHandlerCount > 0 である場合、 pendingHandlerCount が 0 と等しくなるまで 並列に待機し、その後 グローバルタスクをキューに入れ、 それらの手順が並列に移行する前にどのように実行されていたかに応じて、 request の client の グローバルオブジェクトの ネットワーキングタスクソース、またはこれらの手順が 最初に呼び出された 並列コンテキストのいずれかで、 このアルゴリズムの残りの手順を続行させる。

  8. result を返す。

request request を与えて sendHeaders イベントを処理するには、 次の手順を実行する:
  1. interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。

  2. controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。

  3. controlledFrameEmbedderGlobal が null である場合、戻る。

  4. interceptors 内の各 interceptor について:

    1. controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:

      1. event を、 sendheaders という名前の 新しい WebRequestSendHeadersEvent とする。

      2. event、request、および interceptor の includeHeaders を与えて WebRequestEvent に値を設定する。

      3. event を interceptor に dispatch する。

request request および response response を与えて、 headersReceived イベントを処理するには、次の手順を実行する:
  1. interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。

  2. result を WebRequestEvent result とする。

  3. pendingHandlerCount を interceptor の サイズとする。

  4. controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。

  5. controlledFrameEmbedderGlobal が null である場合、戻る。

  6. interceptors 内の各 interceptor について:

    1. interceptor の blocking が true の場合、 pendingHandlerCount をインクリメントする。

    2. controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:

      1. event を、 headersreceived という名前の 新しい WebRequestHeadersReceivedEvent とする。

      2. event、request、および "none" を与えて WebRequestEvent に値を設定する。

      3. event の response を、 request、 response、および interceptor の includeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。

      4. interceptor の securityInfo が true である、または interceptor の securityInfoRawDer が true である場合:

        1. info を、response および interceptor の securityInfoRawDer を与えて security info を取得する結果とする。

        2. event の securityInfo を info に設定する。

      5. event を interceptor に dispatch する。

      6. event の cancel が true である場合、 result の cancel を true に設定する。

      7. event の redirectURL が null でなく、かつ result の redirectURL が "" である場合、 result の redirectURL を event の redirectURL に設定する。

      8. event の responseHeaders が null でない場合:

        1. result の responseHeaders が null である場合、それを新しい Headers に設定する。

        2. event の responseHeaders 内の各 header について:

          1. header を result の responseHeaders に 追加する。

      9. interceptor の blocking が true である場合、 pendingHandlerCount をデクリメントする。

  7. pendingHandlerCount > 0 である場合、 pendingHandlerCount が 0 と等しくなるまで 並列に待機し、その後 グローバルタスクをキューに入れ、 それらの手順が並列に移行する前にどのように実行されていたかに応じて、 request の client の グローバルオブジェクトの ネットワーキングタスクソース、またはこれらの手順が 最初に呼び出された 並列コンテキストのいずれかで、 このアルゴリズムの残りの手順を続行させる。

  8. result を返す。

request request および response response を与えて authRequired イベントを処理するには、次の手順を実行する:
  1. challenger を、response の URL の host および port と等しい host および port を持つ 新しい AuthChallenger とする。

  2. response の status が 401 である場合:

    1. isProxy を false とする。

    2. scheme を、response の WWW-Authenticate header から、 [HTML] 仕様で定義されるように構文解析された scheme とする。 header が存在しない、または無効な場合は null とする。

    3. realm を、response の WWW-Authenticate header から、 [HTML] 仕様で定義されるように構文解析された realm とする。

  3. それ以外の場合:

    1. isProxy を true とする。

    2. scheme を、response の Proxy-Authenticate header から、[HTML] 仕様で定義されるように構文解析された scheme とする。 header が存在しない、または無効な場合は null とする。

    3. realm を、response の Proxy-Authenticate header から、 [HTML] 仕様で定義されるように構文解析された realm とする。

  4. scheme が null である場合、null を返す。

  5. interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。

  6. result を WebRequestEvent result とする。

  7. pendingHandlerCount を 0 とする。

  8. controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。

  9. controlledFrameEmbedderGlobal が null である場合、戻る。

  10. interceptors 内の各 interceptor について:

    1. interceptor の blocking が true の場合、 pendingHandlerCount をインクリメントする。

    2. controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:

      1. event を、 authrequired という名前の 新しい WebRequestAuthRequiredEvent とする。

      2. event、request、および "none" を与えて WebRequestEvent に値を設定する。

      3. event の response を、 request、 response、および interceptor の includeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。

      4. event の response の auth を、challenger、 isProxy、 scheme、および realm フィールドがそれぞれ challenger、isProxy、scheme、および realm の値を持つ 新しい WebRequestAuthDetails に設定する。

      5. event を interceptor に dispatch する。

      6. credentials を event の authCredentials とする。

      7. event の cancel が true である場合、 result の cancel を true に設定する。

      8. それ以外で、credentials が Promise である場合:

        1. signal を event の options["signal"] とする。

        2. done を false とする。

        3. signal が AbortSignal である場合、次の abort アルゴリズムを signal に 追加する:

          1. result の cancel を true に設定する。

          2. done を true に設定する。

        4. credentials の 充足時に、 resolvedValue を取る次の手順を実行する:

          1. resolvedValue が、"username" および "password" と等しい 2 つのキーを 含む dictionary であり、かつ result の authCredentials が undefined である場合、result の authCredentials を resolvedValue に設定する。

          2. done を true に設定する。

        5. credentials の 拒否時に、次の手順を実行する:

          1. done を true に設定する。

          注: 拒否された promise はリクエストをキャンセルしないが、サーバーには 資格情報が提供されない。

        6. done が true と等しくなるまで 並列に待機し、その後 controlledFrameEmbedderGlobal の DOM 操作タスク ソースに グローバルタスクをキューに入れ、 このアルゴリズムの残りの手順を続行させる。

      9. interceptor の blocking が true である場合、 pendingHandlerCount をデクリメントする。

  11. pendingHandlerCount > 0 である場合、 pendingHandlerCount が 0 と等しくなるまで 並列に待機し、その後 グローバルタスクをキューに入れ、 それらの手順が並列に移行する前にどのように実行されていたかに応じて、 request の client の グローバルオブジェクトの ネットワーキングタスクソース、またはこれらの手順が 最初に呼び出された 並列コンテキストのいずれかで、 このアルゴリズムの残りの手順を続行させる。

  12. result を返す。

request request および response response を与えて、 beforeRedirect イベントを処理するには、次の手順を実行する:
  1. interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。

  2. controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。

  3. controlledFrameEmbedderGlobal が null である場合、戻る。

  4. interceptors 内の各 interceptor について:

    1. controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:

      1. event を、 beforeredirect という名前の 新しい WebRequestBeforeRedirectEvent とする。

      2. event、request、および "none" を与えて WebRequestEvent に値を設定する。

      3. event の response を、 request、 response、および interceptor の includeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。

      4. internalResponse を、response が filtered response でない場合は response とし、それ以外の場合は response の internal response とする。

      5. event の response の redirectURL を、 request の current URL の fragment を与えた internalResponse の location URL に設定する。

      6. event を interceptor に dispatch する。

request request および response response を与えて、 responseStarted イベントを処理するには、次の手順を実行する:
  1. interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。

  2. controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。

  3. controlledFrameEmbedderGlobal が null である場合、戻る。

  4. interceptors 内の各 interceptor について:

    1. controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:

      1. event を、 responsestarted という名前の 新しい WebRequestResponseStartedEvent とする。

      2. event、request、および "none" を与えて WebRequestEvent に値を設定する。

      3. event の response を、 request、 response、および interceptor の includeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。

      4. event を interceptor に dispatch する。

request request および response response を与えて、 completed イベントを処理するには、次の手順を実行する:
  1. interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。

  2. controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。

  3. controlledFrameEmbedderGlobal が null である場合、戻る。

  4. interceptors 内の各 interceptor について:

    1. controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:

      1. event を、 completed という名前の 新しい WebRequestCompletedEvent とする。

      2. event、request、および "none" を与えて WebRequestEvent に値を設定する。

      3. event の response を、 request、 response、および interceptor の includeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。

      4. event を interceptor に dispatch する。

request request および response response を与えて、 errorOccurred イベントを処理するには、次の手順を実行する:
  1. interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。

  2. controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。

  3. controlledFrameEmbedderGlobal が null である場合、戻る。

  4. interceptors 内の各 interceptor について:

    1. controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:

      1. event を、 erroroccurred という名前の 新しい WebRequestErrorOccurredEvent とする。

      2. event、request、および "none" を与えて WebRequestEvent に値を設定する。

      3. event の error を、 response 内のエラーを記述する 実装定義のエラー メッセージに設定する。

      4. event を interceptor に dispatch する。

WebRequestEvent event、request request、および RequestedHeaders requestedHeaders を与えて、 WebRequestEvent に値を設定するには、 次の手順を実行する:
  1. environmentSettingsObject を request の client とする。

  2. event に次のフィールドを設定する:

    frameId

    -1

  3. window を、environmentSettingsObject を与えて 環境設定オブジェクトの所有 Window とする。

  4. window が null でない場合:

    1. parentNavigable を、window の navigable の parent とする。

    2. event の次のフィールドを更新する:

      documentId

      environmentSettingsObject の id。

      documentLifecycle

      window の 関連付けられた文書を与えて Document の DocumentLifecycle を取得する結果。

      frameId

      window の navigable の frameId。

      frameType

      window の 閲覧コンテキストの fenced frame config instance が null でない場合は "fenced-frame"、 parentNavigable が null である場合は "outermost-frame"、 それ以外の場合は "sub-frame"。

    3. parentNavigable が null でない場合、event の 次の値を更新する:

      parentDocumentId

      parentNavigable の アクティブ文書の 関連グローバルオブジェクトの id。

      parentFrameId

      parentNavigable の frameId。

  5. event の request を、次のフィールドを持つ 新しい WebRequestRequest に設定する:

    url

    request の URL list の最後の要素。

    method

    request の method。

    initiator

    request の origin を与えて origin を直列化する結果。

    注: opaque origin の場合、 initiator は DOMString "null" に設定される。

    type

    request を与えて request の ResourceType を取得する結果。

    id

    request の requestId。

  6. requestedHeaders が "none" でない場合、 event の request の headers を、request の header list、requestedHeaders、および true と等しい isRequest を与えて header list を Headers オブジェクトに変換することを呼び出した結果に設定する。

document を与えて、 Document の DocumentLifecycle を取得するには、 次の手順を実行する:
  1. document の unload counter > 0 である場合、"pending-deletion" を返す。

  2. document の node navigable が非 null であり、かつ prerendering navigable である場合、"prerender" を返す。

  3. document が salvageable であり、かつその page showing を持たない場合、 "cached" を返す。

  4. "active" を返す。

request request、response response、および RequestedHeaders requestedHeaders を与えて、 WebRequestResponse オブジェクトを作成するには、次の手順を実行する:
  1. response を、次のフィールドを持つ 新しい WebRequestResponse とする:

    statusCode

    response の status。

    statusLine

    response の status message。

    fromCache

    response の cache state が "local" である場合は true、 それ以外の場合は false。

    ip

    リクエストにネットワークリクエストが含まれていた場合に、 response が受信された元の ip address。

    [FETCH] 仕様は現在、 request の送信時に使用されたリモート IP アドレスの格納を指定していない。

  2. requestedHeaders が "none" でない場合、 response の headers を、 response の header list、requestedHeaders、および false と等しい isRequest を与えて header list を Headers オブジェクトに変換することを呼び出した結果に設定する。

  3. response を返す。

response response および boolean includeRawDER を与えて security info を取得するには、 次の手順を実行する:
  1. info を 新しい SecurityInfo とする。

  2. scheme を、response の url の scheme とする。

  3. scheme が "http" または "ws" である場合:

    1. info["state"] を "insecure" に設定する。

    2. info を返す。

  4. info["state"] を "secure" に設定する。

    注: ブラウザーは通常、証明書エラー時に 接続を中断する。ユーザーが明示的に許可した場合、state は代わりに "broken" に設定される可能性がある。

  5. leafCert を、response に関連付けられたサーバーの X.509 証明書 ([RFC5280] で定義される)とする。

  6. derBytes を、leafCert を DER エンコードした結果 ([X.690] で定義される)とする。

  7. certInfo を 新しい CertificateInfo とする。

  8. fingerprint を 新しい Fingerprint とする。

  9. fingerprint 文字列を計算する:

    1. hashBytes を、derBytes に対して SHA-256 アルゴリズム([RFC6234] で定義される)を実行した結果とする。

    2. hexString を空文字列とする。

    3. hashBytes 内の各 byte byte について:

      1. hexString が空でない場合、U+003A (:) を hexString に追加する。

      2. hexPair を、byte を表す 2 つの ASCII 大文字 16 進数字からなる文字列とする。

      3. hexPair を hexString に追加する。

    4. fingerprint["sha256"] を hexString に設定する。

  10. certInfo["fingerprint"] を fingerprint に設定する。

  11. includeRawDER が true である場合:

    1. arrayBuffer を、derBytes から ArrayBuffer を作成する結果とする。

    2. certInfo["rawDER"] を、arrayBuffer を参照する 新しい Uint8Array オブジェクトに設定する。

  12. certList を空のリストとする。

  13. certInfo を certList に 追加する。

  14. info["certificates"] を certList に設定する。

  15. info を返す。

header list fetchHeaders、RequestedHeaders requestedHeaders、 および boolean isRequest を与えて、 header list を Headers オブジェクトに変換するには、次の手順を実行する:
  1. requestedHeaders が "none" でないことをアサートする。

  2. headers を 新しい Headers オブジェクトとする。

  3. fetchHeaders 内の各 fetchHeader について:

    1. 次の条件がすべて満たされる場合、続行する:

    2. 次の条件がすべて満たされる場合、続行する:

    3. fetchHeader を headers に 追加する。

  4. headers を返す。

request request を与えて、 request の ResourceType を取得するには、 次の手順を実行する:
  1. request の url の scheme が "ws" または "wss" と等しい場合、"websocket" を返す。

  2. request の initiator が "fetch" または "xmlhttprequest" と等しい場合、"xmlhttprequest" を返す。

  3. request の destination が "document" と等しい場合、"main-frame" を返す。

  4. request の destination が "frame" または "iframe" と等しい場合、 "sub-frame" を返す。

  5. request の destination が "style" または "xslt" と等しい場合、 "stylesheet" を返す。

  6. request の destination が "script"、 "json"、 "audioworklet"、"paintworklet"、"serviceworker"、 "sharedworker"、 または "worker" と等しい場合、"script" を返す。

  7. request の destination が "image" と等しい場合、"image" を返す。

  8. request の destination が "font" と等しい場合、"font" を返す。

  9. request の destination が "object" または "embed" と等しい場合、 "object" を返す。

  10. request の destination が "audio"、 "track"、または "video" と等しい場合、"media" を返す。

  11. request の destination が "report" と等しい場合、"csp-report" を返す。

  12. request の destination が "" と等しく、 かつ request の keepalive が true である場合、"ping" を返す。

  13. "other" を返す。

DOMString redirectUrl を与えて、 redirect response を作成するには、 次のフィールドを持つ response を返す:
status

301

header list

« ("Location", redirectUrl) »

4.2. モンキーパッチ

4.2.1. Fetch

request は、関連付けられた requestId を持ち、 これは request の作成時にランダムに割り当てられる opaque 文字列である。

main fetch アルゴリズムは、次のようにモンキーパッチされる:

  1. request を fetchParams の request とする。

  2. response を null とする。

  3. webRequestResult を、request を与えて beforeRequest イベントを処理することを呼び出した結果とする。
  4. webRequestResult が null でない場合:
    1. webRequestResult の cancel が true である場合、response を network error に設定する。
    2. それ以外で、webRequestResult の redirectURL が空でない DOMString である場合、response を、 webRequestResult の redirectURL を与えて redirect response を作成する結果に設定する。

fetch response handover アルゴリズムは、次のようにモンキーパッチされる:

  1. response が network error でない場合、fetchParams の request および response を与えて responseStarted イベントを処理することを呼び出す。
  2. timingInfo を fetchParams の timing info とする。

⋮

  1. fetchParams の process response consume body が非 null である場合:

    …

  2. response が network error でない場合、fetchParams の request および response を与えて completed イベントを処理することを呼び出す。
  3. それ以外の場合、fetchParams の request および response を与えて errorOccurred イベントを処理することを呼び出す。

HTTP-network-or-cache fetch アルゴリズムは、 次のようにモンキーパッチされる:

  1. revalidatingFlag を未設定とする。

  2. webRequestResult を、request を与えて beforeSendHeaders イベントを処理することを呼び出した結果に設定する。
  3. webRequestResult が null でない場合:
    1. webRequestResult の cancel が true である場合、response を network error に設定する。
    2. それ以外で、webRequestResult の requestHeaders が空でない リストである場合、request の header list を webRequestResult の requestHeaders の header list に設定する。
  4. response が null でない場合、 これらの手順を実行する。ただし、 fetchParams がキャンセルされた場合は中止する:

    ⋮

  5. 中止された場合、fetchParams に対する適切な network error を返す。

  6. response が null である場合:

    1. httpRequest の cache mode が "only-if-cached" である場合、network error を返す。

    2. request を与えて sendHeaders イベントを処理することを呼び出す。
    3. forwardResponse を、httpFetchParams、includeCredentials、および isNewConnectionFetch を与えて HTTP-network fetch を実行した結果とする。

    4. webRequestResult を、forwardResponse が network error でない場合は request および forwardResponse を与えて headersReceived イベントを処理することを呼び出した結果、 それ以外の場合は null とする。
    5. webRequestResult が null でない場合:
      1. webRequestResult の cancel が true である場合、response を network error に設定する。
      2. それ以外で、webRequestResult の redirectURL が空でない DOMString である場合、forwardResponse を、 webRequestResult の redirectURL を与えて redirect response を作成する結果に設定する。
      3. それ以外で、webRequestResult の responseHeaders が空でない リストである場合、forwardResponse の header list を webRequestResult の responseHeaders の header list に設定する。

⋮

  1. response の status が 401 であり、httpRequest の response tainting が "cors" でなく、includeCredentials が true であり、かつ request の window が environment settings object である場合:

    ⋮

    1. request の use-URL-credentials flag が未設定であるか、 isAuthenticationFetch が true である場合:

      1. fetchParams がキャンセルされた場合、fetchParams に対する適切な network error を返す。

      2. username および password を null とする。

      3. webRequestResult を、request および response を与えて authRequired イベントを処理することを 呼び出した結果とする。
      4. webRequestResult が null でない場合:
        1. webRequestResult の cancel が true である場合、response を network error に設定する。
        2. それ以外で、webRequestResult の authCredentials が object である場合:
          1. username を webRequestResult の authCredentials["username"] に設定する。
          2. password を webRequestResult の authCredentials["password"] に設定する。
      5. username および password が null である場合、それらを request の window でエンドユーザーにユーザー名とパスワードを それぞれ入力させた結果に設定する。
  2. response の status が 407 である場合:

    1. webRequestResult を、request および response を与えて authRequired イベントを処理することを呼び出した結果とする。
    2. webRequestResult が null でない場合:
      1. webRequestResult の cancel が true である場合、response を network error に設定する。
      2. それ以外で、webRequestResult の authCredentials が object である場合:
        1. webRequestResult の authCredentials を proxy-authentication entry として保存する。
    3. それ以外の場合、 適切にエンドユーザーに入力を求める ...

HTTP-redirect fetch アルゴリズムは、次のようにモンキーパッチされる:

  1. request および response を与えて beforeRedirect イベントを処理することを呼び出す。
  2. request を fetchParams の request とする。

5. コンテキストメニュー API

enum ContextType {
    "all",
    "page",
    "frame",
    "selection",
    "link",
    "editable",
    "image",
    "video",
    "audio",
};

enum ItemType {
    "normal",
    "checkbox",
    "radio",
    "separator",
};

dictionary ContextMenusProperties {
    boolean checked;
    sequence<ContextType> contexts;
    sequence<(URLPattern or URLPatternInput)> documentURLPatterns;
    boolean enabled;
    DOMString parentId;
    sequence<(URLPattern or URLPatternInput)> targetURLPatterns;
    DOMString title;
    ItemType type;
};

dictionary ContextMenusCreateProperties : ContextMenusProperties {
    required DOMString id;
};

[Exposed=Window, IsolatedContext]
interface ContextMenus : EventTarget {
    Promise<undefined> create(ContextMenusCreateProperties properties);
    Promise<undefined> remove(DOMString id);
    Promise<undefined> removeAll();
    Promise<undefined> update(DOMString id, optional ContextMenusProperties properties = {});

    attribute EventHandler onclick;
    attribute EventHandler onshow;
};

[Exposed=Window, IsolatedContext]
interface MenuItemDetails {
    readonly attribute DOMString id;
    readonly attribute DOMString? parentMenuId;
    readonly attribute boolean? checked;
    readonly attribute boolean? wasChecked;
};

[Exposed=Window, IsolatedContext]
interface ContextMenusClickEvent : Event {
  readonly attribute MenuItemDetails menuItem;

  // コンテキストメニューが開かれたフレームについての詳細。
  readonly attribute long frameId;
  readonly attribute USVString frameURL;
  readonly attribute USVString pageURL;

  // コンテキストメニューが開かれた文脈内の要素についての詳細。
  readonly attribute boolean editable;
  readonly attribute USVString? linkURL;
  readonly attribute DOMString? mediaType;
  readonly attribute DOMString? selectionText;
  readonly attribute USVString? srcURL;
};

各 controlledframe は contextMenus メンバーを持ち、これは ContextMenus である。 各 ContextMenus は、 context menu map を管理し、 その キーはメニュー項目 ID を表す DOMString であり、 その 値は ContextMenusProperties である。

context menu map の各 entry は、context menu item を表す。 context menu item は、context menu 内のエントリを表す。各 context menu item は、関連付けられた次のものを持つ:

context menu は、context menu items をユーザーに表示できる 実装定義のインターフェイスを表す。 各 context menu は、関連付けられた context element を持つ。これは、context menu がその文脈内で開かれた HTMLElement である。

context menu item item は、 item を与えて context menu item が表示されるかどうかを判定する結果が true を返す場合、実装定義のアクションの結果としてユーザーに表示されるべきである。

注: この API の意図は、文脈依存の追加アクションを ユーザーに公開することである。デスクトッププラットフォームでは、これは Controlled Frame 内のコンテンツを右クリックすることでアクセスされる コンテキストメニュー内のエントリという形式を取る可能性があり、モバイルデバイスでは Controlled Frame 内の項目を長押しすることでアクセスされる可能性がある。 これらの例では、context menu の context element は、ユーザーが右クリックまたは長押しした要素になる。

context menu map の 値、すなわち ContextMenusProperties オブジェクトは、 context menu items が表示される条件、および項目の 機能と挙動を制御する。

この節は非規範的である。

ContextMenusProperties は次のフィールドを持つ:

contexts

異なる ContextType の リスト。 それが空でない場合、 context menu を開くためにクリックされた要素が リストの 項目のいずれかと等しくない限り、 context menu item は表示されない。 それが空である場合、このチェックは無視される。

documentURLPatterns

URLPattern または URLPatternInput の リスト。 それが 空でない場合、埋め込まれた文書の URL が、 リストの 項目のいずれかによって URLPattern に一致する場合を除き、 context menu item は表示されない。それが 空である場合、この チェックは無視される。

targetURLPatterns

URLPattern または URLPatternInput の リスト。 それが 空でない場合、context menu のターゲットの URL が リストの 項目のいずれかによって URLPattern に一致する場合を除き、 context menu item は表示されない。それが 空である場合、このチェックは無視される。

注: Target は img/audio/video タグの "src" 属性および anchor タグの "href" である。

parentId

親 context menu item の ID。 context menu item は親のサブメニューの下に 表示されることがある。

title

メニュー項目のタイトル。type が "separator" でない限り、これは必須である。

type

メニュー項目の型。

checked

type が checkbox である場合に、context menu item が初期状態でチェックされているかどうか。

enabled

context menu item が有効かどうか。

create(properties) メソッド手順は次の通りである:

  1. p を新しい promise とする。

  2. controlledframe を this とする。

  3. p を返し、次の手順を並列に実行する。

  4. contextMenusMap を controlledframe の context menu map とする。

  5. id を properties["id"] とする。

  6. contextMenusMap[id] が存在する場合、 controlledframe、p、および TypeError を与えて埋め込み元 promise を拒否し、 これらの手順を中止する。

  7. contextMenusMap[id] を properties に 設定する。

  8. controlledframe および p を与えて 埋め込み元 promise を解決する。

remove(id) メソッド手順は次の通りである:

  1. p を新しい promise とする。

  2. controlledframe を this とする。

  3. p を返し、次の手順を並列に実行する。

  4. contextMenusMap を controlledframe の context menu map とする。

  5. contextMenusMap[id] を 削除する。

  6. controlledframe および p を与えて 埋め込み元 promise を解決する。

removeAll() メソッド手順は次の通りである:

  1. p を新しい promise とする。

  2. controlledframe を this とする。

  3. p を返し、次の手順を並列に実行する。

  4. contextMenusMap を controlledframe の context menu map とする。

  5. contextMenusMap を クリアする。

  6. controlledframe および p を与えて 埋め込み元 promise を解決する。

update(id, properties) メソッド 手順は次の通りである:

  1. p を新しい promise とする。

  2. controlledframe を this とする。

  3. p を返し、次の手順を並列に実行する。

  4. contextMenusMap を controlledframe の context menu map とする。

  5. contextMenusMap[id] が存在しない場合、 controlledframe、p、および TypeError を与えて埋め込み元 promise を拒否し、 これらの手順を中止する。

  6. contextMenusMap[id] を properties に 設定する。

  7. controlledframe および p を与えて 埋め込み元 promise を解決する。

この節は非規範的である。

ContextType はコンテキストメニューの文脈を表し、次の値を取り得る:

frame

ユーザーが iframe などの入れ子フレーム内でコンテキストクリックした場合に適用される。

selection

文書の一部が選択されている場合に適用される。

link

ユーザーがリンク上でコンテキストクリックした場合に適用される。

editable

ユーザーが textarea などの編集可能な要素をコンテキストクリックした場合に適用される。

image

ユーザーが画像をコンテキストクリックした場合に適用される。

video

ユーザーが video 要素をコンテキストクリックした場合に適用される。

audio

ユーザーが audio 要素をコンテキストクリックした場合に適用される。

page

ユーザーがページ内でコンテキストクリックしたが、他の page コンテキストのいずれにも該当しない場合に適用される (たとえば、クリックが画像、入れ子 iframe、またはリンク上でない場合)。

all

all を指定することは、他のすべてのコンテキストの組み合わせと同等である。

context menu item item を与えて、 context menu item が表示されるかどうかを判定するには:

  1. properties を item の properties とする。

  2. element を item の menu の context element とする。

  3. controlledframe を element の node navigable の controlledFrameEmbedderParent とする。

  4. controlledframe が null である場合、false を返す。

  5. documentUrl を、controlledframe の 埋め込まれた navigable の アクティブ文書の URL とする。

  6. targetUrl を空文字列とする。

  7. element が HTMLImageElement のインスタンスである場合、 targetUrl を element の src 属性に設定する。

  8. element が HTMLMediaElement のインスタンスである場合、 targetUrl を element の src 属性に設定する。

  9. element が HTMLAnchorElement のインスタンスである場合、 targetUrl を element の href 属性に設定する。

  10. properties["contexts"] が 空でない場合:

    1. matchesContext を初期値 false の boolean 値とする。

    2. properties["contexts"] 内の各 context について:

      1. element が context に一致する場合、matchesContext を true に設定し、 break する。

        ContextType の一致動作は指定されていないが、 上の注には望ましい挙動に関する情報がいくらかある。

    3. matchesContext が false である場合、false を返す。

  11. properties["documentURLPatterns"] が 空でない場合:

    1. matchesDocumentUrl を初期値 false の boolean 値とする。

    2. properties["documentURLPatterns"] 内の各 urlPattern について:

      1. urlPattern が URLPatternInput である場合、urlPattern を、 urlPattern を与えた 新しい URLPattern に設定する。

      2. documentUrl が urlPattern を与えて URLPattern に一致する場合、 matchesDocumentUrl を true に設定し、break する。

    3. matchesDocumentUrl が false である場合、false を返す。

  12. properties["targetURLPatterns"] が 空でない場合:

    1. matchesTargetUrl を初期値 false の boolean 値とする。

    2. properties["targetURLPatterns"] 内の各 urlPattern について:

      1. urlPattern が URLPatternInput である場合、urlPattern を、 urlPattern を与えた 新しい URLPattern に設定する。

      2. targetUrl が urlPattern を与えて URLPattern に一致する場合、 matchesTargetUrl を true に設定し、break する。

    3. matchesTargetUrl が false である場合、false を返す。

  13. true を返す。

5.1. イベント

ContextMenus は次のイベントを発火する:

イベント名 インターフェイス 発火する時点...
show Event context menu がユーザーに表示されたとき。
click ContextMenusClickEvent context menu item がユーザーによって選択されたとき。

ContextMenus は、次のイベントハンドラー(および対応する イベントハンドラーイベント型)を イベントハンドラー IDL 属性としてサポートする:

イベントハンドラー イベントハンドラーイベント型
onshow show
onclick click

ContextMenus contextMenus の 1 つ以上の context menu items がユーザーに表示されるとき、 contextMenus にshow イベントを dispatch する。

context menu item item がユーザーによって選択されたとき、 item を与えて click イベントを dispatch する。

ContextMenus contextMenus を与えて、dispatch される show event を dispatch するには、 show という名前の 新しい Event を contextMenus に dispatch する。
context menu item item を与えて、 dispatch される click event を dispatch するには、次の手順を実行する:
  1. properties を item の properties とする。

  2. menu を item の menu とする。

  3. element を menu の context element とする。

  4. event を、 click という名前の 新しい ContextMenusClickEvent とする。

  5. event["menuItem"] を、次のフィールドを持つ 新しい MenuItemDetails に設定する:

    id

    item の id。

    parentMenuId

    properties["parentId"]。

    checked

    context menu item がチェックされているかどうか。

    wasChecked

    クリックされる前の checkbox または radio 項目の状態。

  6. event の次のフィールドを設定する:

    frameId

    element の node navigable の frameId。

    frameURL

    element の node navigable の URL。

    pageURL

    element の traversable navigable の URL。

    editable

    選択された element が、テキスト入力などの編集可能なものかどうか。

    linkURL

    element が HTMLAnchorElement のインスタンスである場合、element の href 属性。

    mediaType

    element に基づく、"image"、"video"、または "audio" のいずれか。

    selectionText

    存在する場合、コンテキスト選択のテキスト。

    srcURL

    存在する場合、element の "src" 属性。

  7. menu で event をdispatch する。

6. 使用概要

Lorem ipsum。基本情報と例をここに挿入する。

7. 動機となるアプリケーション

この節は非規範的である。

7.1. 仮想化セッションにおけるレイテンシに敏感なアプリケーション

仮想化環境では、ユーザーは通常、完全な仮想デスクトップを レンダリングするローカルのシンクライアントを持つ。実際のデスクトップ実行環境は、 リモート仮想化サーバー上で実行される。ユーザーのブラウザーが レイテンシに敏感なアプリケーション(動画アプリなど)へナビゲートした場合、 レンダリングされるコンテンツには追加のレイテンシ("lag")が生じ、 体験がユーザーにとって困難または不可能になる。これは、ビデオ会議アプリケーションなど、 ユーザーを記録するアプリケーションにも適用される。これらのレイテンシに敏感な アプリケーションでは、仮想デスクトップアプリケーションはレイテンシに敏感な コンテンツをローカルでレンダリングし、レンダリングされたリモートコンテンツの上に オーバーレイして、このレイテンシを低減できる。このユースケースは "browser content redirection" としても知られている。

7.2. 第三者 Web コンテンツを制限なく埋め込む

キオスク環境では、アプリケーションは第三者からコンテンツを読み込み、 そのコンテンツをアプリケーション内の画面に表示しなければならない。教師が ナビゲーションイベントをトリガーすることもあれば、ショッピングモールの管理者などの 管理者によって構成されることもある。コンテンツは X-Frame-Options と CSP の 使用により、iframe による埋め込みを禁止している場合がある。しかし、controlled frame は、 iframe による埋め込みを禁止するコンテンツであっても、すべてのコンテンツを読み込めるべきである。

7.3. Web コンテンツのリモート表示と操作

キオスク環境では、アプリケーションはコンテンツが画面上に表示され続けることを 確実にしなければならず、独自に提供する挙動でコンテンツを中断する必要がある場合もある。 この挙動は管理者が現地にいなくても動作するべきであり、理想的にはネットワーク越しに リモートで管理できる。たとえばコンテンツがクラッシュした場合、これらのアプリケーションは そのクラッシュを観測し、新しい埋め込みビューでコンテンツを再読み込みすることで 応答するべきである。

7.4. 各セッション後にユーザーコンテンツを消去する

一部の環境では、レストランで注文する場合のように、誰かが単一のデバイスを 短時間だけ使ってタスクを完了する。タスクが完了したとき、埋め込み元アプリケーションは そのタスクに関連付けられたすべてのローカルユーザーデータを消去し、その後 埋め込まれたインスタンスを再起動できるべきである。

7.5. アイドルセッションを監視する

ユーザーが埋め込みコンテンツと対話している間、ユーザーが明示的に セッションを終了しないことがある。このコンテンツは、ユーザーが実際には タスクを完了したか、完了せずに離れたにもかかわらず、ユーザーが存在すると仮定する場合がある。 埋め込み元アプリケーションは、ユーザーがそのケースのしきい値を超えてアイドル状態になった ことを検出し、新しいセッションを開始したい。

7.6. 任意にナビゲーションをブロックする

埋め込み元が作成していない埋め込み Web コンテンツを表示している間、ページは 許可されていない第三者 Web コンテンツへリンクすることがある。埋め込み元が Web コンテンツへの任意のスクリプト注入によって埋め込みコンテンツ内の要素を 編集できるようにすると、ブロックされたページへのナビゲーションが発生しないことを 確実にできる。埋め込み元はまた、Controlled Frame API を使用して ナビゲーションイベントを捕捉し、承認済みサイトのページだけがその controlled frame 内に 読み込まれることを確実にできる。

8. セキュリティ、プライバシー、およびアクセシビリティの考慮事項

この節は非規範的である。

8.1. セキュリティ

Controlled Frame は [Isolated-Web-Apps](IWA) に基づいており、コアセキュリティ仕様と統合される

Controlled Frame は特に強力な API であるため、それを使用すること、あるいは 利用可能であることだけでも、アプリはさまざまな種類のハッキングの標的になる。その結果、 この API は、アプリケーション開発者とユーザーを保護するための追加の 安全対策が備わっている IWA での使用に制限される。Isolated Web App explainer には次のように記載されている:

"開発者が、アプリケーションを XSS またはサーバーサイド攻撃の魅力的な標的にする API へのアクセスを必要とする場合、ユーザーエージェントはアプリケーションに この脅威モデルを採用させることもできる。"

Controlled Frame はまさにそのような魅力的な標的を作るため、これを慎重に 公開するために、特定の攻撃を防ぐべく IWA にオプトインしている。一般に、 IWA は、アプリケーション内の各リソースが 保存時および転送時の両方で安全であるという強力なセキュリティ保証を提供する。 IWA のセキュリティと権限については、 IWA explainer および IWA の [High-Watermark-Permissions] explainer でさらに読むことができる。

Controlled Frame は [Permissions-Policy] および [Permissions] と統合される。 Permissions Policy § 12. Privacy and Security および Permissions § E Security considerations(この項目は現在まばらであることに注意)でさらに読むことができる。

攻撃する Web サイトは、本来は埋め込みを許可しないコンテンツを表示し、 非 IWA 上のユーザーを欺く可能性がある。

計画されている緩和策:

IWA は Controlled Frame 経由で別の IWA(または 自身)を埋め込み、何らかの方法で IWA ポリシーを操作する可能性がある(例: Controlled Frame に埋め込まれた IWA は、"controlled-frame" policy-controlled feature が存在しないことにより、 自身が埋め込まれていることを検出する可能性がある)。

計画されている緩和策:

Controlled Frame は強力な <controlledframe> 要素へのアクセスを得る可能性がある。

Controlled Frame を使用することが期待されていない IWA が コンテンツの埋め込みを試みる可能性がある。

計画されている緩和策:

IWA は 'http:' や 'isolated-app:' など、非 https scheme からのコンテンツを 埋め込もうとする可能性がある

計画されている緩和策:

悪意ある Controlled Frame が埋め込み元の実行中プロセスにアクセスする可能性がある (例: Spectre 攻撃)

計画されている緩和策:

ある "https origin" に対する Controlled Frame が、その https origin に対する ユーザー自身のストレージデータと相互作用または干渉する可能性がある

計画されている緩和策:

悪意ある Controlled Frame が埋め込み元の保存データを上書きする可能性がある

計画されている緩和策:

悪意ある Controlled Frame が自身が埋め込まれていることを検出し、 埋め込み元アプリケーションを攻撃しようとする可能性がある

計画されている緩和策:

アイデア:

ユーザーは Controlled Frame 内で表示されているページの origin を 検証できない可能性がある

アイデア:

Controlled Frame が古いブラウザーエンジンの脆弱性を悪用する可能性がある

すでに対処済み:

8.2. プライバシー

Controlled Frame は Permissions Policy および Permissions と統合される。 Permissions Policy § 12. Privacy and Security でさらに読むことができる。 Permissions § E Security considerations でさらに読むことができる。

Controlled Frame について具体的に、次のプライバシー上の考慮事項を特定している:

8.3. アクセシビリティ

Controlled Frame について、次のアクセシビリティ上の考慮事項を特定している:

9. 謝辞

次の人々がこの文書の開発に貢献した。

適合性

文書の慣例

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

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

この仕様における例は、“for example” という語で導入されるか、または class="example" によって規範的テキストから区別される。 次のように:

これは情報的な例の一例である。

情報的な注は “Note” という語で始まり、 class="note" によって規範的テキストから区別される。 次のように:

Note、これは情報的な注である。

索引

この仕様で定義される用語

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

参照文献

規範的参照文献

[Console]
Dominic Farolino; Robert Kowalski; Terin Stock. Console Standard. Living Standard. URL: https://console.spec.whatwg.org/
[CSS-PAGE-FLOATS-3]
Johannes Wilm. CSS Page Floats. URL: https://drafts.csswg.org/css-page-floats/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). URL: https://drafts.csswg.org/cssom/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[FENCED-FRAME]
Fenced Frame. Draft Community Group Report. URL: https://wicg.github.io/fenced-frame/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[FileAPI]
Marijn Kruisselbrink. File API. URL: https://w3c.github.io/FileAPI/
[GEOLOCATION]
Marcos Caceres; Reilly Grant. Geolocation. URL: https://w3c.github.io/geolocation/
[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/
[ISOLATED-CONTEXTS]
Isolated Contexts. Draft Community Group Report. URL: https://wicg.github.io/isolated-web-apps/isolated-contexts.html
[MANIFEST-APP-INFO]
Aaron Gustafson. Web App Manifest - Application Information. URL: https://w3c.github.io/manifest-app-info/
[Permissions]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[Permissions-Policy]
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
[RFC5280]
D. Cooper; et al. Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. URL: https://datatracker.ietf.org/doc/html/rfc5280
[RFC6234]
D. Eastlake 3rd; T. Hansen. US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF). URL: https://datatracker.ietf.org/doc/html/rfc6234
[STORAGE]
Anne van Kesteren. Storage Standard. Living Standard. URL: https://storage.spec.whatwg.org/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[URLPATTERN]
Ben Kelly; Jeremy Roman; 宍戸俊哉 (Shunya Shishido). URL Pattern Standard. Living Standard. URL: https://urlpattern.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[X.690]
Information technology - ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER). URL: https://www.itu.int/rec/T-REC-X.690
[XHR]
Anne van Kesteren. XMLHttpRequest Standard. Living Standard. URL: https://xhr.spec.whatwg.org/

参考情報の参照文献

[COOKIES]
A. Barth. HTTP State Management Mechanism. April 2011. Proposed Standard. URL: https://httpwg.org/specs/rfc6265.html
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. URL: https://drafts.csswg.org/css-cascade-5/
[High-Watermark-Permissions]
Robbie McElrath. Isolated Web Apps High Watermark Permissions Explainer. URL: https://github.com/WICG/isolated-web-apps/blob/main/Permissions.md
[HTTP-CACHING]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP Caching. June 2022. Internet Standard. URL: https://httpwg.org/specs/rfc9111.html
[Isolated-Web-Apps]
Reilly Grant. Isolated Web Apps Explainer. URL: https://github.com/WICG/isolated-web-apps/blob/main/README.md

IDL 索引

[Exposed=Window, IsolatedContext]
interface HTMLControlledFrameElement : HTMLElement {
    [HTMLConstructor] constructor();

    [CEReactions] attribute USVString src;
    attribute DOMString partition;

    readonly attribute WindowProxy? contentWindow;
    readonly attribute ContextMenus contextMenus;
    readonly attribute WebRequest request;

    // Navigation methods.
    Promise<boolean> back();
    Promise<boolean> canGoBack();
    Promise<boolean> forward();
    Promise<boolean> canGoForward();
    Promise<boolean> go(long relativeIndex);
    undefined reload();
    undefined stop();

    // Scripting methods.
    Promise<undefined> addContentScripts(sequence<ContentScriptDetails> contentScriptList);
    Promise<any> executeScript(optional InjectDetails details = {});
    Promise<undefined> insertCSS(optional InjectDetails details = {});
    Promise<undefined> removeContentScripts(optional sequence<DOMString> scriptNameList);

    // Configuration methods.
    Promise<undefined> clearData(
      optional ClearDataOptions options = {},
      optional ClearDataTypeSet types = {});
    Promise<boolean> getAudioState();
    Promise<long> getZoom();
    Promise<DOMString> getZoomMode();
    Promise<boolean> isAudioMuted();
    undefined setAudioMuted(boolean mute);
    Promise<undefined> setZoom(long zoomFactor);
    Promise<undefined> setZoomMode(DOMString zoomMode);

    // Capture methods.
    Promise<undefined> captureVisibleRegion(optional ImageDetails options = {});
    undefined print();

    // Events.
    attribute EventHandler onconsolemessage;
    attribute EventHandler oncontentload;
    attribute EventHandler ondialog;
    attribute EventHandler onloadabort;
    attribute EventHandler onloadcommit;
    attribute EventHandler onloadstart;
    attribute EventHandler onloadstop;
    attribute EventHandler onnewwindow;
    attribute EventHandler onpermissionrequest;
    attribute EventHandler onsizechanged;
    attribute EventHandler onzoomchange;
};

// One of |code| or |file| must be specified but not both.
dictionary InjectDetails {
  DOMString code;
  USVString file;
};

dictionary InjectionItems {
  DOMString code;
  sequence<USVString> files;
};

enum RunAt {
  "document-start",
  "document-end",
  "document-idle",
};

dictionary ContentScriptDetails {
  required DOMString name;
  InjectionItems js;
  InjectionItems css;
  required sequence<(URLPattern or URLPatternInput)> urlPatterns;
  sequence<(URLPattern or URLPatternInput)> excludeURLPatterns;
  boolean allFrames;
  boolean matchAboutBlank;
  RunAt runAt;
};

dictionary ClearDataOptions {
  long since;
};

dictionary ClearDataTypeSet {
  boolean cache;
  boolean cookies;
  boolean fileSystems;
  boolean indexedDB;
  boolean localStorage;
  boolean persistentCookies;
  boolean sessionCookies;
};

enum ZoomMode {
  "per-origin",
  "per-view",
  "disabled"
};


// One of |code| or |file| must be specified but not both.
dictionary ImageDetails {
  DOMString format;
  DOMString quality;
};

[Exposed=Window, IsolatedContext]
interface ConsoleMessage {
  readonly attribute long level;
  readonly attribute DOMString message;
};

[Exposed=Window, IsolatedContext]
interface ConsoleMessageEvent : Event {
  constructor(DOMString type, optional ConsoleMessageEventInit eventInitDict = {});
  readonly attribute ConsoleMessage consoleMessage;
};

dictionary ConsoleMessageEventInit: EventInit {
  ConsoleMessage? consoleMessage;
};


enum DialogType {
  "alert",
  "confirm",
  "prompt"
};

[Exposed=Window, IsolatedContext]
interface DialogController {
  undefined okay(optional DOMString response);
  undefined cancel();
};

[Exposed=Window, IsolatedContext]
interface DialogMessage {
  readonly attribute DialogType messageType;
  readonly attribute DOMString messageText;
  readonly attribute DialogController dialog;
};

[Exposed=Window, IsolatedContext]
interface DialogEvent : Event {
  constructor(DOMString type, optional DialogEventInit eventInitDict = {});
  readonly attribute DialogMessage dialogMessage;
};

dictionary DialogEventInit: EventInit {
  DialogMessage? dialogMessage;
};


enum WindowOpenDisposition {
  "ignore",
  "save_to_disk",
  "current_tab",
  "new_background_tab",
  "new_foreground_tab",
  "new_window",
  "new_popup"
};

[Exposed=Window, IsolatedContext]
interface NewWindowController {
  undefined attach(HTMLControlledFrameElement newControlledFrame);
  undefined discard();
};

[Exposed=Window, IsolatedContext]
interface NewWindow {
  readonly attribute NewWindowController window;
  readonly attribute USVString targetUrl;
  readonly attribute DOMString name;
  readonly attribute WindowOpenDisposition windowOpenDisposition;
};

[Exposed=Window, IsolatedContext]
interface NewWindowEvent : Event {
  constructor(DOMString type, optional NewWindowEventInit eventInitDict = {});
  readonly attribute NewWindow newWindow;
};

dictionary NewWindowEventInit: EventInit {
  NewWindow? newWindow;
};


enum PermissionType {
  "media",
  "geolocation",
  "pointerLock",
  "download",
  "filesystem",
  "fullscreen",
  "hid",
};

[Exposed=Window, IsolatedContext]
interface PermissionRequestControllerBase {
  undefined allow();
  undefined cancel();
};

[Exposed=Window, IsolatedContext]
interface MediaPermissionRequestController: PermissionRequestControllerBase {
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface GeolocationPermissionRequestController: PermissionRequestControllerBase {
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface PointerLockPermissionRequestController: PermissionRequestControllerBase {
  readonly attribute boolean lastUnlockedBySelf;
  readonly attribute boolean userGesture;
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface DownloadPermissionRequestController : PermissionRequestControllerBase {
  readonly attribute DOMString requestMethod;
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface FileSystemPermissionRequestController : PermissionRequestControllerBase {
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface FullscreenPermissionRequestController : PermissionRequestControllerBase {
  readonly attribute USVString origin;
};

[Exposed=Window, IsolatedContext]
interface HidPermissionRequestController : PermissionRequestControllerBase {
  readonly attribute USVString url;
};

[Exposed=Window, IsolatedContext]
interface PermissionRequest {
  readonly attribute PermissionType permission;
  readonly attribute PermissionRequestControllerBase request;
};

[Exposed=Window, IsolatedContext]
interface PermissionRequestEvent : Event {
  constructor(DOMString type, optional PermissionRequestEventInit eventInitDict = {});
  readonly attribute PermissionRequest permissionRequest;
};

dictionary PermissionRequestEventInit: EventInit {
  PermissionRequest? permissionRequest;
};


[Exposed=Window, IsolatedContext]
interface SizeChange {
  readonly attribute unsigned long oldWidth;
  readonly attribute unsigned long oldHeight;
  readonly attribute unsigned long newWidth;
  readonly attribute unsigned long newHeight;
};

[Exposed=Window, IsolatedContext]
interface SizeChangedEvent : Event {
  constructor(DOMString type, optional SizeChangedEventInit eventInitDict = {});
  readonly attribute SizeChange sizeChange;
};

dictionary SizeChangedEventInit: EventInit {
  SizeChange? sizeChange;
};


[Exposed=Window, IsolatedContext]
interface ZoomChange {
  readonly attribute float oldZoomFactor;
  readonly attribute float newZoomFactor;
};

[Exposed=Window, IsolatedContext]
interface ZoomChangeEvent : Event {
  constructor(DOMString type, optional ZoomChangeEventInit eventInitDict = {});
  readonly attribute ZoomChange zoomChange;
};

dictionary ZoomChangeEventInit: EventInit {
  ZoomChange? zoomChange;
};


[Exposed=Window, IsolatedContext]
interface ContentLoadEvent : Event {
  constructor(DOMString type, optional EventInit eventInitDict = {});
};


[Exposed=Window, IsolatedContext]
interface LoadInfo {
  readonly attribute USVString url;
  readonly attribute boolean isTopLevel;
};

[Exposed=Window, IsolatedContext]
interface LoadAbortInfo : LoadInfo{
  readonly attribute long code;
  readonly attribute DOMString reason;
};

[Exposed=Window, IsolatedContext]
interface LoadRedirectInfo{
  readonly attribute USVString oldUrl;
  readonly attribute USVString newUrl;
  readonly attribute boolean isTopLevel;
};

[Exposed=Window, IsolatedContext]
interface LoadAbortEvent : Event {
  constructor(DOMString type, optional LoadAbortEventInit eventInitDict = {});
  readonly attribute LoadAbortInfo loadAbortInfo;
};

dictionary LoadAbortEventInit: EventInit {
  LoadAbortInfo? loadAbortInfo;
};


[Exposed=Window, IsolatedContext]
interface LoadCommitEvent : Event {
  constructor(DOMString type, optional LoadCommitEventInit eventInitDict = {});
  readonly attribute LoadInfo loadInfo;
};

dictionary LoadCommitEventInit: EventInit {
  LoadInfo? loadInfo;
};


[Exposed=Window, IsolatedContext]
interface LoadStartEvent : Event {
  constructor(DOMString type, optional LoadStartEventInit eventInitDict = {});
  readonly attribute LoadInfo loadInfo;
};

dictionary LoadStartEventInit: EventInit {
  LoadInfo? loadInfo;
};


[Exposed=Window, IsolatedContext]
interface LoadStopEvent : Event {
  constructor(DOMString type, optional LoadStopEventInit eventInitDict = {});
};

dictionary LoadStopEventInit: EventInit {
};


[Exposed=Window, IsolatedContext]
interface LoadRedirectEvent : Event {
  constructor(DOMString type, optional LoadRedirectEventInit eventInitDict = {});
  readonly attribute LoadRedirectInfo loadRedirectInfo;
};

dictionary LoadRedirectEventInit: EventInit {
  LoadRedirectInfo? loadRedirectInfo;
};


enum ResourceType {
  "main-frame",
  "sub-frame",
  "stylesheet",
  "script",
  "image",
  "font",
  "object",
  "xmlhttprequest",
  "ping",
  "csp-report",
  "media",
  "websocket",
  "other",
};

enum RequestedHeaders {
  "none",
  "cors",
  "all",
};

enum ConnectionState {
  "broken", "insecure", "secure"
};

dictionary Fingerprint {
  required DOMString sha256;
};

dictionary CertificateInfo {
  required Fingerprint fingerprint;
  Uint8Array rawDER;
};

dictionary SecurityInfo {
  required sequence<CertificateInfo> certificates;
  required ConnectionState state;
};

dictionary WebRequestInterceptorOptions {
  required sequence<(URLPattern or URLPatternInput)> urlPatterns;
  sequence<ResourceType> resourceTypes = [];
  boolean blocking = false;
  boolean includeRequestBody = false;
  RequestedHeaders includeHeaders = "none";
  boolean securityInfo = false;
  boolean securityInfoRawDer = false;
};

[Exposed=Window, IsolatedContext]
interface WebRequest {
  WebRequestInterceptor createWebRequestInterceptor(
      WebRequestInterceptorOptions options);
};

[Exposed=Window, IsolatedContext]
interface WebRequestInterceptor : EventTarget {
  attribute EventHandler onauthrequired;
  attribute EventHandler onbeforeredirect;
  attribute EventHandler onbeforerequest;
  attribute EventHandler onbeforesendheaders;
  attribute EventHandler oncompleted;
  attribute EventHandler onerroroccurred;
  attribute EventHandler onheadersreceived;
  attribute EventHandler onsendheaders;
  attribute EventHandler onresponsestarted;
};

enum DocumentLifecycle {
  "prerender",
  "active",
  "cached",
  "pending-deletion",
};

enum FrameType {
  "outermost-frame",
  "fenced-frame",
  "sub-frame",
};

[Exposed=Window, IsolatedContext]
interface UploadData {
  readonly attribute ArrayBuffer? bytes;
  readonly attribute DOMString? file;
};

[Exposed=Window, IsolatedContext]
interface RequestBody {
  readonly attribute DOMString? error;
  readonly attribute any formData;
  readonly attribute FrozenArray<UploadData>? raw;
};

[Exposed=Window, IsolatedContext]
interface WebRequestRequest {
  readonly attribute DOMString method;
  readonly attribute DOMString id;
  readonly attribute ResourceType type;
  readonly attribute USVString url;
  readonly attribute USVString? initiator;
  readonly attribute Headers? headers;
  readonly attribute RequestBody? body;
};

[Exposed=Window, IsolatedContext]
interface AuthChallenger {
  readonly attribute DOMString host;
  readonly attribute long port;
};

[Exposed=Window, IsolatedContext]
interface WebRequestAuthDetails {
  readonly attribute AuthChallenger challenger;
  readonly attribute boolean isProxy;
  readonly attribute DOMString scheme;
  readonly attribute DOMString? realm;
};

[Exposed=Window, IsolatedContext]
interface WebRequestResponse {
  readonly attribute long statusCode;
  readonly attribute DOMString statusLine;
  readonly attribute boolean fromCache;
  readonly attribute Headers? headers;
  readonly attribute DOMString? ip;
  readonly attribute USVString? redirectURL;
  readonly attribute WebRequestAuthDetails? auth;
};

[Exposed=Window, IsolatedContext]
interface WebRequestEvent : Event {
  readonly attribute WebRequestRequest request;
  readonly attribute long frameId;
  readonly attribute FrameType? frameType;
  readonly attribute DOMString? documentId;
  readonly attribute DocumentLifecycle? documentLifecycle;
  readonly attribute DOMString? parentDocumentId;
  readonly attribute long? parentFrameId;
};

dictionary WebRequestAuthCredentials {
  required DOMString username;
  required DOMString password;
};

dictionary WebRequestAuthOptions {
  AbortSignal signal;
};

[Exposed=Window, IsolatedContext]
interface WebRequestAuthRequiredEvent : WebRequestEvent {
  readonly attribute WebRequestResponse response;

  undefined setCredentials(
    Promise<WebRequestAuthCredentials> credentials,
    optional WebRequestAuthOptions options = {});
};

[Exposed=Window, IsolatedContext]
interface WebRequestBeforeRedirectEvent : WebRequestEvent {
  readonly attribute WebRequestResponse response;
};

[Exposed=Window, IsolatedContext]
interface WebRequestBeforeRequestEvent : WebRequestEvent {
  undefined redirect(USVString redirectURL);
};

[Exposed=Window, IsolatedContext]
interface WebRequestBeforeSendHeadersEvent : WebRequestEvent {
  undefined setRequestHeaders((Headers or HeadersInit) requestHeaders);
};

[Exposed=Window, IsolatedContext]
interface WebRequestCompletedEvent : WebRequestEvent {
  readonly attribute WebRequestResponse response;
};

[Exposed=Window, IsolatedContext]
interface WebRequestErrorOccurredEvent : WebRequestEvent {
  readonly attribute DOMString error;
};

[Exposed=Window, IsolatedContext]
interface WebRequestHeadersReceivedEvent : WebRequestEvent {
  readonly attribute WebRequestResponse response;
  readonly attribute SecurityInfo? securityInfo;

  undefined redirect(USVString redirectURL);
  undefined setResponseHeaders((Headers or HeadersInit) responseHeaders);
};

[Exposed=Window, IsolatedContext]
interface WebRequestResponseStartedEvent : WebRequestEvent {
  readonly attribute WebRequestResponse response;
};

[Exposed=Window, IsolatedContext]
interface WebRequestSendHeadersEvent : WebRequestEvent {};

enum ContextType {
    "all",
    "page",
    "frame",
    "selection",
    "link",
    "editable",
    "image",
    "video",
    "audio",
};

enum ItemType {
    "normal",
    "checkbox",
    "radio",
    "separator",
};

dictionary ContextMenusProperties {
    boolean checked;
    sequence<ContextType> contexts;
    sequence<(URLPattern or URLPatternInput)> documentURLPatterns;
    boolean enabled;
    DOMString parentId;
    sequence<(URLPattern or URLPatternInput)> targetURLPatterns;
    DOMString title;
    ItemType type;
};

dictionary ContextMenusCreateProperties : ContextMenusProperties {
    required DOMString id;
};

[Exposed=Window, IsolatedContext]
interface ContextMenus : EventTarget {
    Promise<undefined> create(ContextMenusCreateProperties properties);
    Promise<undefined> remove(DOMString id);
    Promise<undefined> removeAll();
    Promise<undefined> update(DOMString id, optional ContextMenusProperties properties = {});

    attribute EventHandler onclick;
    attribute EventHandler onshow;
};

[Exposed=Window, IsolatedContext]
interface MenuItemDetails {
    readonly attribute DOMString id;
    readonly attribute DOMString? parentMenuId;
    readonly attribute boolean? checked;
    readonly attribute boolean? wasChecked;
};

[Exposed=Window, IsolatedContext]
interface ContextMenusClickEvent : Event {
  readonly attribute MenuItemDetails menuItem;

  // Details about the frame the context menu is opened within.
  readonly attribute long frameId;
  readonly attribute USVString frameURL;
  readonly attribute USVString pageURL;

  // Details about the element the context menu is opened within the context of.
  readonly attribute boolean editable;
  readonly attribute USVString? linkURL;
  readonly attribute DOMString? mediaType;
  readonly attribute DOMString? selectionText;
  readonly attribute USVString? srcURL;
};

課題索引

これらの手順は、新しい navigable 内で History.length を初期化するために必要である。これは HTML Standard における既存の issue である。 ↵
このアルゴリズムは Shared または Service Workers では機能しない。なぜなら controlledFrameEmbedderParent は navigable 上でのみ定義されており、 non-Window environment から navigable へ移ることが 常に可能であるとは限らないためである。 ↵
ContextType の一致動作は指定されていないが、 上の注には望ましい挙動に関する情報がいくらかある。 ↵