制御フレーム 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 要素のアクセシビリティ 定義へリンクしている。 アクセシビリティの観点から、 controlledframeiframe と同じように振る舞うべきである。

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 手順は、thiscontentWindow を返すことである。

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

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

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

    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. traversablecontrolledFrameEmbedderParentelement に設定する。

  8. element埋め込まれた navigabletraversable に設定する。

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

  10. initialHistoryEntrystep を 0 に設定する。

  11. initialHistoryEntrytraversableセッション履歴エントリ付加する

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

  12. elementcontentWindowdocumentWindowProxy に設定する。

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

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

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

  3. historyHandling を "auto" とする。

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

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

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

  2. thiscontextMenus を、新しい ContextMenus に設定する。

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

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

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

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

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

URL urlpattern である 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. thispartition を与えられた値に設定する。

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. embeddedNavigablecontrolledframe埋め込まれた navigable とする。

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

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

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

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

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

    3. targetStepIndexcurrentStepIndex + delta とする。

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

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

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

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

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

  2. controlledframethis とする。

  3. embeddedNavigablecontrolledframe埋め込まれた navigable とする。

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

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

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

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

  6. result を返す。

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

  2. controlledframethis とする。

  3. embeddedNavigablecontrolledframe埋め込まれた navigable とする。

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

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

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

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

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

    4. controlledframeresult、 および 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. embeddedNavigablethis埋め込まれた navigable とする。

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

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

stop() 手順は次の通りである:
  1. embeddedNavigablethis埋め込まれた 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 controlledframeUSVString urlStringboolean isCsslong index、および longbooleanDOMString を取るアルゴリズム completionSteps を与えて、 注入項目を取得するには、 次の手順を実行する:

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

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

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

    2. 戻る。

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

    URL

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

    method

    "GET"

    destination

    isCsstrue の場合は "style"、 それ以外の場合は "script"

    client

    controlledframe関連設定オブジェクト

    mode

    "cors"

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

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

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

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

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

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

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

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

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

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

  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. urlPatternURLPattern である場合、urlPatternconfigurlPatterns付加する

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

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

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

      1. urlPatternURLPattern である場合、 urlPatternconfigexcludeURLPatterns付加する

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

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

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

    2. isCss の場合:

      1. configcss[index] を source に設定する。

    3. それ以外の場合:

      1. configjs[index] を source に設定する。

    4. configpendingFetchCount をデクリメントする。

    5. configpendingFetchCount が 0 より 大きい場合、戻る。

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

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

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

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

  14. それ以外の場合:

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

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

      1. controlledframeurlStringisCssconfigpendingFetchCount、 および completionSteps を与えて、注入項目を取得するを実行する。

      2. configpendingFetchCount をインクリメントする。

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

  2. urlabout:blank に一致する、かつ configmatchAboutBlankfalse である場合、false を返す。

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

  4. matchfalse とする。

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

    1. urlStringpattern である URLPattern に一致する場合、 matchtrue に設定する。

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

    1. urlStringpattern である URLPattern に一致する場合、 matchfalse に設定する。

  7. match を返す。

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

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

  3. controlledframeembeddedNavigablecontrolledFrameEmbedderParent とする。

  4. urldocumentURL とする。

  5. isTopLevel を、documentnode navigableparent が null である場合は true、 それ以外の場合は false とする。

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

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

    2. currentPhasedocument-start と等しく、かつ configcssでない場合:

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

    3. それ以外で、currentPhaseconfigrunAt と等しい場合:

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

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 documentDOMString scriptSource、および 完了レコードを取るアルゴリズム completionSteps を与えて、 スクリプトを 文書に注入するには、次の手順を実行する:

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

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

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

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

    2. controlledframe を、documentnode navigabletraversable navigablecontrolledFrameEmbedderParent とする。

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

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

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

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

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

    2. promisepromises付加する

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

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

  2. controlledframethis とする。

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

  4. scriptNameList が undefined の場合:

    1. controlledframecontent script mapクリアする

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

    1. controlledframecontent script map[name] を 削除する

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

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

  2. controlledframethis とする。

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

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

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

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

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

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

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

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

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

      2. それ以外の場合:

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

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

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

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

  2. controlledframethis とする。

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

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

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

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

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

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

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

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

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

  8. それ以外の場合、controlledframedetails["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 以後に最後に使用されたデータのみを削除すべきである。sinceepoch からのミリ秒単位のタイムスタンプを表す。 すべてのユーザーエージェントが、すべての 閲覧データについて書き込み時刻またはアクセス時刻を追跡しているわけではない。 実装は可能な限り since を尊重すべきであるが、この API はその利用可能性を保証しない。

  1. bottlebucket[identifier] とする。

  2. bottlemapクリアする

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

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

  2. controlledframethis とする。

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

  4. clearSince を 0 とする。

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

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

  7. partitioncontrolledframepartition とする。

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

    1. storageKeyembedding originembeddingOrigin と等しくない、または storageKeypartitionpartition と等しくない場合、 続行する

    2. bucketshelf["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. ユーザーエージェントが管理する各 storageKeycache について反復する: [HTTP-CACHING]

      1. storageKeyembedding originembeddingOrigin と等しくない、または storageKeypartitionpartition と等しくない場合、続行する

      2. cache をクリアする。

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

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

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

  2. controlledframethis とする。

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

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

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

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

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

  2. controlledframethis とする。

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

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

  5. controlledframeresultPromise、 および controlledframe埋め込まれた navigablemuted フラグを与えて 埋め込み元 promise を解決する

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

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

3.5.1. ズーム

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

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

HTMLControlledFrameElementZoomMode 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. controlledframethis とする。

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

  4. controlledframep、および controlledframezoomMode を与えて 埋め込み元 promise を解決する

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

  1. p新しい promise とする。

  2. controlledframethis とする。

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

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

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

  6. controlledframezoomModezoomMode に設定する。

  7. zoomModeper-origin である場合:

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

      1. oldZoomFactorcontrolledframecurrentZoom とする。

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

      3. oldZoomFactorcontrolledframecurrentZoom と等しくない場合:

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

        2. controlledframeoldZoomFactorcontrolledframecurrentZoom を用いて "zoomchange" イベントを発火する

  8. zoomModedisabled である場合:

    1. oldZoomFactorcontrolledframecurrentZoom とする。

    2. controlledframecurrentZoom を 1.0f に設定する。

    3. oldZoomFactorcontrolledframecurrentZoom と等しくない場合:

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

      2. controlledframeoldZoomFactorcontrolledframecurrentZoom を用いて "zoomchange" イベントを発火する

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

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

  1. p新しい promise とする。

  2. controlledframethis とする。

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

  4. embeddedNavigablecontrolledframe埋め込まれた navigable とする。

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

  6. controlledframep、および controlledframecurrentZoom を与えて 埋め込み元 promise を解決する

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

  1. p新しい promise とする。

  2. controlledframethis とする。

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

  4. embeddedNavigablecontrolledframe埋め込まれた navigable とする。

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

  6. controlledframeZoomModedisabled である場合:

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

  7. controlledframeZoomModeper-origin である場合:

    1. oldZoomFactorcontrolledframecurrentZoom とする。

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

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

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

        1. embeddedDocumentbrowsingContextアクティブ文書とする。

        2. embedderembeddedDocumentnode navigablecontrolledFrameEmbedderParent とする。

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

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

        5. matchtrue である場合:

          1. embeddercurrentZoomzoomFactor に設定する。

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

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

  8. controlledframeZoomModeper-view である場合:

    1. oldZoomFactorcontrolledframecurrentZoom とする。

    2. controlledframecurrentZoomzoomFactor に設定する。

    3. oldZoomFactorcontrolledframecurrentZoom と等しくない場合:

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

      2. controlledframeoldZoomFactorcontrolledframecurrentZoom を用いて "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. controlledframethis とする。

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

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

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

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

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

    1. optionsFormatoptions["format"] とする。

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

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

    1. optionsQualityoptions["quality"] とする。

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

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

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

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

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

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

3.7. イベント

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

イベントハンドラー イベントハンドラーイベント型
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. econsoleMessageconsoleMessage に設定する。

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

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. accepttrue に設定する。

  2. responseresponse に設定する。

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

  1. acceptfalse に設定する。

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

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

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

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

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

    messageType

    dialogType

    messageText

    message

    dialog

    dialog

  5. edialogMessagedialogMessage に設定する。

  6. completefalse とする。

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

    1. targetedispatch する。

    2. completetrue に設定する。

  8. completetrue になるまで同期的に待つ。

    注: ここでブロックするのは意図的である。 "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 を、 thistarget navigable に設定する。

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

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

controlledframe 要素 controlledFrameUSVString urlDOMString targetnavigable targetNavigable、および WindowOpenDisposition windowOpenDisposition を与えて、 NewWindowEvent を発火する には、次の手順を実行する:

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

  2. controllertarget navigabletargetNavigable に設定する。

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

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

    window

    controller

    targetUrl

    url

    name

    target

    windowOpenDisposition

    windowOpenDisposition

  5. enewWindownewWindow に設定する。

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

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. allowtrue に設定する。

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

  1. allowfalse に設定する。

文書 embeddedDocumentcontrolledframe 要素 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. epermissionRequestpermissionRequest に設定する。

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

    1. targetedispatch する。

    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 つの非負数 oldWidtholdHeightnewWidthnewHeight を与えて、 SizeChangedEvent e を発火するには:

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

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

    oldWidth

    oldWidth

    oldHeight

    oldHeight

    newWidth

    newWidth

    newHeight

    newHeight

  3. esizeChangesizeChange に設定する。

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

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 つの floatoldZoomFactornewZoomFactor を与えて、 ZoomChangeEvent を発火する には:

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

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

    oldZoomFactor

    oldZoomFactor

    newZoomFactor

    newZoomFactor

  3. ezoomChangezoomChange に設定する。

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

3.7.7. contentload

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

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

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

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. eloadAbortInfoinfo に設定する。

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

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. eloadInfoinfo に設定する。

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

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. eloadInfoinfo に設定する。

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

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 操作タスクソースグローバルタスクをキューに入れtargetedispatch させる。

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 要素 targetURL oldUrlURL newUrl、および boolean isTopLevel が与えられたとき、 LoadRedirectEvent を発火する には、次の手順を実行する:

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

    oldUrl

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

    newUrl

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

    isTopLevel

    isTopLevel

  2. eloadRedirectInfoinfo に設定する。

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

3.7.13. モンキーパッチ

3.7.13.1. [HTML]

alert について:

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

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

confirm について:

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

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

prompt について:

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

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

window open steps について:

  1. windowOpenDisposition を "ignore" とする。
  2. controlledFrameEmbedderParent を、sourceDocumentnode navigablecontrolledFrameEmbedderParent とする。

...

14. targetNavigable が null である場合、null を返す。
  1. targetNavigable が null である場合:
    1. controlledFrameEmbedderParent が null でない場合:
      1. controlledFrameEmbedderParenturltargettargetNavigable、および 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 popuptrue である場合、windowOpenDisposition を "new_popup" に設定する。

    ...

  3. それ以外の場合:

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

    ...

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

  1. controlledFrameEmbedderParent が null でない場合:
    1. controlledFrameEmbedderParenturltargettargetNavigable、および windowOpenDisposition を用いて "newwindow" イベントを発火する

completely finish loading について:

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

  2. controlledFrameEmbedderParent を、documentnode navigablecontrolledFrameEmbedderParent とする。
  3. controlledFrameEmbedderParentHTMLControlledFrameElement である場合、 controlledFrameEmbedderParent を用いて "contentload" イベントを発火する

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

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

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

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

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

3.7.13.2. [FETCH]

HTTP fetch(loadredirect)について:

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

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

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

        1. newUrl を、responselocation url とする。

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

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

3.7.13.3. [Permissions]

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

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

  1. controlledFrameEmbedderParent を、documentnode navigablecontrolledFrameEmbedderParent とする。

  2. controlledFrameEmbedderParentHTMLControlledFrameElement でない場合、true を返す。

  3. documentcontrolledFrameEmbedderParentpermissiondocumentURLoptions、および completionSteps を用いて "permissionrequest" イベントを発火する

request a position(geolocation)について:

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

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

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

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

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

    2. nodeDocument が null である場合:
      1. watchId が渡されていた場合、watchIDs から watchId を削除する。
      2. errorCallback および PERMISSION_DENIED を渡して error でコールバックする。
      3. このアルゴリズムを終了する。
    3. embedderNavigator を、nodeDocumentグローバルオブジェクト関連 Navigator とする。
    4. embedderGeolocation を、embedderNavigatorgeolocation とする。
    5. embedderGeolocationsuccessCallbackerrorCallbackoptions、および 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. navigableparentparent に設定する。

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

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

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

    "document-start"

    "interactive"

    "document-end"

    "complete"

    "document-idle"

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

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関連設定オブジェクトトップレベルオリジンと、 controlledFrameEmbedderParentpartition からなる タプルに設定する。
  5. (topLevelSite, secondKey) を返す。

3.8.1.3. [STORAGE]

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

storage key は、 embedding originorigin または null)、 partitionDOMString または null)、および originorigin)からなる タプル である。

注: この定義は、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環境設定オブジェクトである場合は environmentorigin を、 それ以外の場合は environmentcreation URLorigin を、 origin とする。

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

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

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

    2. topnavigabletop-level traversable とする。

    3. topcontrolledFrameEmbedderParent が null でない場合、topcontrolledFrameEmbedderParent を返す。

  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. urlPatternURLPattern である場合、urlPatterninterceptorurlPatterns追加する

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

  4. interceptorthisinterceptors追加する

  5. interceptor を返す。

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

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

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

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

  5. navigablewindownavigable とする。

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

  7. controlledFramenavigablecontrolledFrameEmbedderParent とする。

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

  9. controlledFramerequestinterceptors 内の各 interceptor について:

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

    2. interceptorapplicableInterceptors追加する

  10. applicableInterceptors を返す。

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

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

  3. urlPatternsinterceptorurlPatterns とする。

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

    1. requestURLurlPattern を与えて URLPattern に一致する 場合、true を返す。

  5. false を返す。

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

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

  3. globalDedicatedWorkerGlobalScope オブジェクトである場合:

    1. ownerglobal とする。

    2. ownerDedicatedWorkerGlobalScope オブジェクトである間:

      1. ownerownerowner set[0] とする。

    3. ownerDocument オブジェクトである場合、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 は、関連付けられた次のものを持つ:

WebRequestAuthRequiredEventsetCredentials(credentials, options) メソッド手順は次の通りである:
  1. thisauthCredentialscredentials に設定する。

  2. thisoptionsoptions に設定する。

WebRequestAuthRequiredEventpreventDefault() メソッド手順は、thiscanceltrue に設定することである。

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

WebRequestBeforeRequestEventredirect(redirectURL) メソッド手順は、thisredirectURLredirectURL に設定することである。
WebRequestBeforeRequestEventpreventDefault() メソッド手順は、thiscanceltrue に設定することである。

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

WebRequestBeforeSendHeadersEventsetRequestHeaders(requestHeaders) メソッド手順は、thisrequestHeadersrequestHeaders に設定することである。
WebRequestBeforeSendHeadersEventpreventDefault() メソッド手順は、thiscanceltrue に設定することである。

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

WebRequestHeadersReceivedEventredirect(redirectURL) メソッド手順は、thisredirectURLredirectURL に設定することである。
WebRequestHeadersReceivedEventsetResponseHeaders(responseHeaders) メソッド手順は、thisresponseHeadersresponseHeaders に設定することである。
WebRequestHeadersReceivedEventpreventDefault() メソッド手順は、thiscanceltrue に設定することである。

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. resultWebRequestEvent result とする。

  3. pendingHandlerCount を 0 とする。

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

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

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

    1. interceptorblockingtrue の場合、 pendingHandlerCount をインクリメントする。

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

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

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

      3. interceptorincludeRequestBodytrue であり、かつ requestbody が null でない場合:

        1. requestBody新しい RequestBody とする。

        2. bodyrequestbody とする。

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

        3. bodysource で分岐する:

          byte sequence

          直列化された bodysource と等しい bytes を持つ 新しい UploadDatarequestBodyraw追加する

          Blob

          直列化された bodysource と等しい bytes を持つ 新しい UploadDatarequestBodyraw追加する

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

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

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

            File

            entry[1] の name と等しい file を持つ 新しい UploadDatarequestBodyraw追加する

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

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

          3. requestBodyformDataformData に設定する。

        4. eventrequestbodyrequestBody に設定する。

      4. eventinterceptordispatch する。

      5. eventcanceltrue である場合、 resultcanceltrue に設定する。

      6. eventredirectURL が null でなく、かつ resultredirectURL が "" である場合、 resultredirectURLeventredirectURL に設定する。

      7. interceptorblockingtrue である場合、 pendingHandlerCount をデクリメントする。

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

  8. result を返す。

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

  2. resultWebRequestEvent result とする。

  3. pendingHandlerCount を 0 とする。

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

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

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

    1. interceptorblockingtrue の場合、 pendingHandlerCount をインクリメントする。

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

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

      2. eventrequest、および interceptorincludeHeaders を与えて WebRequestEvent に値を設定する

      3. eventinterceptordispatch する。

      4. eventcanceltrue である場合、 resultcanceltrue に設定する。

      5. eventrequestHeaders が null でない場合:

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

        2. eventrequestHeaders 内の各 header について:

          1. headerresultrequestHeaders追加する

      6. interceptorblockingtrue である場合、 pendingHandlerCount をデクリメントする。

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

  8. result を返す。

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

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

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

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

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

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

      2. eventrequest、および interceptorincludeHeaders を与えて WebRequestEvent に値を設定する

      3. eventinterceptordispatch する。

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

  2. resultWebRequestEvent result とする。

  3. pendingHandlerCountinterceptorサイズとする。

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

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

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

    1. interceptorblockingtrue の場合、 pendingHandlerCount をインクリメントする。

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

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

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

      3. eventresponse を、 requestresponse、および interceptorincludeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。

      4. interceptorsecurityInfotrue である、または interceptorsecurityInfoRawDertrue である場合:

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

        2. eventsecurityInfoinfo に設定する。

      5. eventinterceptordispatch する。

      6. eventcanceltrue である場合、 resultcanceltrue に設定する。

      7. eventredirectURL が null でなく、かつ resultredirectURL が "" である場合、 resultredirectURLeventredirectURL に設定する。

      8. eventresponseHeaders が null でない場合:

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

        2. eventresponseHeaders 内の各 header について:

          1. headerresultresponseHeaders追加する

      9. interceptorblockingtrue である場合、 pendingHandlerCount をデクリメントする。

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

  8. result を返す。

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

  2. responsestatus が 401 である場合:

    1. isProxyfalse とする。

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

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

  3. それ以外の場合:

    1. isProxytrue とする。

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

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

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

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

  6. resultWebRequestEvent result とする。

  7. pendingHandlerCount を 0 とする。

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

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

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

    1. interceptorblockingtrue の場合、 pendingHandlerCount をインクリメントする。

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

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

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

      3. eventresponse を、 requestresponse、および interceptorincludeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。

      4. eventresponseauth を、challengerisProxyscheme、および realm フィールドがそれぞれ challengerisProxyscheme、および realm の値を持つ 新しい WebRequestAuthDetails に設定する。

      5. eventinterceptordispatch する。

      6. credentialseventauthCredentials とする。

      7. eventcanceltrue である場合、 resultcanceltrue に設定する。

      8. それ以外で、credentialsPromise である場合:

        1. signaleventoptions["signal"] とする。

        2. donefalse とする。

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

          1. resultcanceltrue に設定する。

          2. donetrue に設定する。

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

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

          2. donetrue に設定する。

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

          1. donetrue に設定する。

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

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

      9. interceptorblockingtrue である場合、 pendingHandlerCount をデクリメントする。

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

  12. result を返す。

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

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

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

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

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

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

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

      3. eventresponse を、 requestresponse、および interceptorincludeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。

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

      5. eventresponseredirectURL を、 requestcurrent URLfragment を与えた internalResponselocation URL に設定する。

      6. eventinterceptordispatch する。

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

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

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

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

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

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

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

      3. eventresponse を、 requestresponse、および interceptorincludeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。

      4. eventinterceptordispatch する。

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

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

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

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

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

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

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

      3. eventresponse を、 requestresponse、および interceptorincludeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。

      4. eventinterceptordispatch する。

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

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

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

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

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

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

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

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

      4. eventinterceptordispatch する。

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

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

    frameId

    -1

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

  4. window が null でない場合:

    1. parentNavigable を、windownavigableparent とする。

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

      documentId

      environmentSettingsObjectid

      documentLifecycle

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

      frameId

      windownavigableframeId

      frameType

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

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

      parentDocumentId

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

      parentFrameId

      parentNavigableframeId

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

    url

    requestURL list の最後の要素。

    method

    requestmethod

    initiator

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

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

    type

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

    id

    requestrequestId

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

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

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

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

  4. "active" を返す。

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

    statusCode

    responsestatus

    statusLine

    responsestatus message

    fromCache

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

    ip

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

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

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

  3. response を返す。

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

  2. scheme を、responseurlscheme とする。

  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. hexPairhexString に追加する。

    4. fingerprint["sha256"] を hexString に設定する。

  10. certInfo["fingerprint"] を fingerprint に設定する。

  11. includeRawDERtrue である場合:

    1. arrayBuffer を、derBytes から ArrayBuffer を作成する結果とする。

    2. certInfo["rawDER"] を、arrayBuffer を参照する 新しい Uint8Array オブジェクトに設定する。

  12. certList を空のリストとする。

  13. certInfocertList追加する

  14. info["certificates"] を certList に設定する。

  15. info を返す。

header list fetchHeadersRequestedHeaders requestedHeaders、 および boolean isRequest を与えて、 header listHeaders オブジェクトに変換するには、次の手順を実行する:
  1. requestedHeaders が "none" でないことをアサートする

  2. headers新しい Headers オブジェクトとする。

  3. fetchHeaders 内の各 fetchHeader について:

    1. 次の条件がすべて満たされる場合、続行する:

    2. 次の条件がすべて満たされる場合、続行する:

    3. fetchHeaderheaders追加する

  4. headers を返す。

request request を与えて、 request の ResourceType を取得するには、 次の手順を実行する:
  1. requesturlscheme"ws" または "wss" と等しい場合、"websocket" を返す。

  2. requestinitiator"fetch" または "xmlhttprequest" と等しい場合、"xmlhttprequest" を返す。

  3. requestdestination"document" と等しい場合、"main-frame" を返す。

  4. requestdestination"frame" または "iframe" と等しい場合、 "sub-frame" を返す。

  5. requestdestination"style" または "xslt" と等しい場合、 "stylesheet" を返す。

  6. requestdestination"script""json""audioworklet""paintworklet""serviceworker""sharedworker"、 または "worker" と等しい場合、"script" を返す。

  7. requestdestination"image" と等しい場合、"image" を返す。

  8. requestdestination"font" と等しい場合、"font" を返す。

  9. requestdestination"object" または "embed" と等しい場合、 "object" を返す。

  10. requestdestination"audio""track"、または "video" と等しい場合、"media" を返す。

  11. requestdestination"report" と等しい場合、"csp-report" を返す。

  12. requestdestination"" と等しく、 かつ requestkeepalivetrue である場合、"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. requestfetchParams の request とする。

  2. response を null とする。

  3. webRequestResult を、request を与えて beforeRequest イベントを処理することを呼び出した結果とする。
  4. webRequestResult が null でない場合:
    1. webRequestResultcanceltrue である場合、responsenetwork error に設定する。
    2. それ以外で、webRequestResultredirectURL が空でない DOMString である場合、response を、 webRequestResultredirectURL を与えて redirect response を作成する結果に設定する。

fetch response handover アルゴリズムは、次のようにモンキーパッチされる:

  1. responsenetwork error でない場合、fetchParamsrequest および response を与えて responseStarted イベントを処理することを呼び出す。
  2. timingInfo を fetchParams の timing info とする。

  1. fetchParams の process response consume body が非 null である場合:

  2. responsenetwork error でない場合、fetchParamsrequest および response を与えて completed イベントを処理することを呼び出す。
  3. それ以外の場合、fetchParamsrequest および response を与えて errorOccurred イベントを処理することを呼び出す。

HTTP-network-or-cache fetch アルゴリズムは、 次のようにモンキーパッチされる:

  1. revalidatingFlag を未設定とする。

  2. webRequestResult を、request を与えて beforeSendHeaders イベントを処理することを呼び出した結果に設定する。
  3. webRequestResult が null でない場合:
    1. webRequestResultcanceltrue である場合、responsenetwork error に設定する。
    2. それ以外で、webRequestResultrequestHeaders が空でない リストである場合、requestheader listwebRequestResultrequestHeadersheader 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 を、forwardResponsenetwork error でない場合は request および forwardResponse を与えて headersReceived イベントを処理することを呼び出した結果、 それ以外の場合は null とする。
    5. webRequestResult が null でない場合:
      1. webRequestResultcanceltrue である場合、responsenetwork error に設定する。
      2. それ以外で、webRequestResultredirectURL が空でない DOMString である場合、forwardResponse を、 webRequestResultredirectURL を与えて redirect response を作成する結果に設定する。
      3. それ以外で、webRequestResultresponseHeaders が空でない リストである場合、forwardResponseheader listwebRequestResultresponseHeadersheader 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. webRequestResultcanceltrue である場合、responsenetwork error に設定する。
        2. それ以外で、webRequestResultauthCredentialsobject である場合:
          1. usernamewebRequestResultauthCredentials["username"] に設定する。
          2. passwordwebRequestResultauthCredentials["password"] に設定する。
      5. username および password が null である場合、それらを requestwindow でエンドユーザーにユーザー名とパスワードを それぞれ入力させた結果に設定する。
  2. response の status が 407 である場合:

    1. webRequestResult を、request および response を与えて authRequired イベントを処理することを呼び出した結果とする。
    2. webRequestResult が null でない場合:
      1. webRequestResultcanceltrue である場合、responsenetwork error に設定する。
      2. それ以外で、webRequestResultauthCredentialsobject である場合:
        1. webRequestResultauthCredentialsproxy-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;
};

controlledframecontextMenus メンバーを持ち、これは 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 menucontext 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

typecheckbox である場合に、context menu item が初期状態でチェックされているかどうか。

enabled

context menu item が有効かどうか。

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

  1. p新しい promise とする。

  2. controlledframethis とする。

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

  4. contextMenusMapcontrolledframecontext menu map とする。

  5. idproperties["id"] とする。

  6. contextMenusMap[id] が存在する場合、 controlledframep、および TypeError を与えて埋め込み元 promise を拒否し、 これらの手順を中止する。

  7. contextMenusMap[id] を properties設定する

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

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

  1. p新しい promise とする。

  2. controlledframethis とする。

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

  4. contextMenusMapcontrolledframecontext menu map とする。

  5. contextMenusMap[id] を 削除する

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

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

  1. p新しい promise とする。

  2. controlledframethis とする。

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

  4. contextMenusMapcontrolledframecontext menu map とする。

  5. contextMenusMapクリアする

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

update(id, properties) メソッド 手順は次の通りである:

  1. p新しい promise とする。

  2. controlledframethis とする。

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

  4. contextMenusMapcontrolledframecontext menu map とする。

  5. contextMenusMap[id] が存在しない場合、 controlledframep、および 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. propertiesitemproperties とする。

  2. elementitemmenucontext element とする。

  3. controlledframeelementnode navigablecontrolledFrameEmbedderParent とする。

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

  5. documentUrl を、controlledframe埋め込まれた navigableアクティブ文書URL とする。

  6. targetUrl を空文字列とする。

  7. elementHTMLImageElement のインスタンスである場合、 targetUrlelementsrc 属性に設定する。

  8. elementHTMLMediaElement のインスタンスである場合、 targetUrlelementsrc 属性に設定する。

  9. elementHTMLAnchorElement のインスタンスである場合、 targetUrlelementhref 属性に設定する。

  10. properties["contexts"] が でない場合:

    1. matchesContext を初期値 false の boolean 値とする。

    2. properties["contexts"] 内の各 context について:

      1. elementcontext に一致する場合、matchesContexttrue に設定し、 break する。

        ContextType の一致動作は指定されていないが、 上の注には望ましい挙動に関する情報がいくらかある。

    3. matchesContextfalse である場合、false を返す。

  11. properties["documentURLPatterns"] が でない場合:

    1. matchesDocumentUrl を初期値 false の boolean 値とする。

    2. properties["documentURLPatterns"] 内の各 urlPattern について:

      1. urlPatternURLPatternInput である場合、urlPattern を、 urlPattern を与えた 新しい URLPattern に設定する。

      2. documentUrlurlPattern を与えて URLPattern に一致する場合、 matchesDocumentUrltrue に設定し、break する。

    3. matchesDocumentUrlfalse である場合、false を返す。

  12. properties["targetURLPatterns"] が でない場合:

    1. matchesTargetUrl を初期値 false の boolean 値とする。

    2. properties["targetURLPatterns"] 内の各 urlPattern について:

      1. urlPatternURLPatternInput である場合、urlPattern を、 urlPattern を与えた 新しい URLPattern に設定する。

      2. targetUrlurlPattern を与えて URLPattern に一致する場合、 matchesTargetUrltrue に設定し、break する。

    3. matchesTargetUrlfalse である場合、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 がユーザーに表示されるとき、 contextMenusshow イベントを dispatch する

context menu item item がユーザーによって選択されたとき、 item を与えて click イベントを dispatch する

ContextMenus contextMenus を与えて、dispatch される show event を dispatch するには、 show という名前の 新しい EventcontextMenusdispatch する。
context menu item item を与えて、 dispatch される click event を dispatch するには、次の手順を実行する:
  1. propertiesitemproperties とする。

  2. menuitemmenu とする。

  3. elementmenucontext element とする。

  4. event を、 click という名前の 新しい ContextMenusClickEvent とする。

  5. event["menuItem"] を、次のフィールドを持つ 新しい MenuItemDetails に設定する:

    id

    itemid

    parentMenuId

    properties["parentId"]。

    checked

    context menu item がチェックされているかどうか。

    wasChecked

    クリックされる前の checkbox または radio 項目の状態。

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

    frameId

    elementnode navigableframeId

    frameURL

    elementnode navigableURL

    pageURL

    elementtraversable navigableURL

    editable

    選択された element が、テキスト入力などの編集可能なものかどうか。

    linkURL

    elementHTMLAnchorElement のインスタンスである場合、elementhref 属性

    mediaType

    element に基づく、"image"、"video"、または "audio" のいずれか。

    selectionText

    存在する場合、コンテキスト選択のテキスト。

    srcURL

    存在する場合、element の "src" 属性。

  7. menueventdispatch する。

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 では機能しない。なぜなら controlledFrameEmbedderParentnavigable 上でのみ定義されており、 non-Window environment から navigable へ移ることが 常に可能であるとは限らないためである。
ContextType の一致動作は指定されていないが、 上の注には望ましい挙動に関する情報がいくらかある。