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— 埋め込むコンテンツソース URLpartition— このコンテンツに関連するデータを保持するパーティション名 - アクセシビリティの考慮事項:
- 著者向け.
- 実装者向け.
注: これらは
iframe要素のアクセシビリティ 定義へリンクしている。 アクセシビリティの観点から、controlledframeはiframeと同じように振る舞うべきである。 - 実装者向け.
- DOM インターフェイス:
-
[
Exposed =Window ,IsolatedContext ]interface :HTMLControlledFrameElement HTMLElement { [HTMLConstructor ]constructor (); [CEReactions ]attribute USVString src ;attribute DOMString partition ;readonly attribute WindowProxy ?contentWindow ;readonly attribute ContextMenus contextMenus ;readonly attribute WebRequest request ; // Navigation methods.Promise <boolean >back ();Promise <boolean >canGoBack ();Promise <boolean >forward ();Promise <boolean >canGoForward ();Promise <boolean >go (long );relativeIndex undefined reload ();undefined stop (); // Scripting methods.Promise <undefined >addContentScripts (sequence <ContentScriptDetails >);contentScriptList Promise <any >executeScript (optional InjectDetails = {});details Promise <undefined >insertCSS (optional InjectDetails = {});details Promise <undefined >removeContentScripts (optional sequence <DOMString >); // Configuration methods.scriptNameList 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 ); // Capture methods.zoomMode 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
には次が関連付けられる:
-
埋め込まれた navigable。これは、 非 null の controlledFrameEmbedderParent を持つ traversable navigable、または null である。 初期値は null である。
注: 埋め込まれた navigable は、 null の parent を持つトップレベル traversable として現れる。埋め込まれた navigable 内のコンテンツは、 自身が埋め込まれていることを検出できない。
-
content script map。これは、 マップであり、その キーは
DOMStringで、その値は content script config である。 -
contentWindow。これは
WindowProxyまたは null である。 -
request。これは
WebRequestである。 -
contextMenus。これは
ContextMenusである。
contentWindow getter
手順は、this の contentWindow を返すことである。
request getter 手順
は、this の request
を返すことである。
contextMenus getter
手順は、this の contextMenus を返すことである。
controlledframe
要素 element が、非 null の
閲覧コンテキストを持つ文書に
挿入されたとき、
次の手順を実行する:
-
element の
srcが空でない場合:-
element を与えて controlledframe を初期化する。
-
controlledframe
要素 element が文書から
削除されたとき、
次の手順を実行する:
-
element の 埋め込まれた navigableを与えて、 トップレベル traversable を破棄する。
-
element の 埋め込まれた navigableを null に設定する。
controlledframe
要素 element を
初期化するには、
次の手順を実行する:
-
element の 埋め込まれた navigableが null であることを 表明する。
-
group を新しい 閲覧コンテキストグループとする。
-
document を、element の ノード文書、element、 および group を与えて、 新しい閲覧コンテキストと 文書を作成することの第 2 戻り値とする。
-
traversable を新しい traversable navigable とする。
-
documentState を与えて、traversable navigable を初期化する。
-
traversable の controlledFrameEmbedderParent を element に設定する。
-
element の 埋め込まれた navigableを traversable に設定する。
-
initialHistoryEntry を traversable の アクティブセッション履歴エントリとする。
-
initialHistoryEntry の step を 0 に設定する。
-
initialHistoryEntry を traversable の セッション履歴エントリに 付加する。
これらの手順は、 新しい navigable 内の
History.lengthを初期化するために必要である。これは HTML Standard に存在する issue である。 -
element の contentWindow を document の
WindowProxyに設定する。 -
element および element の
srcを与えて、controlledframe をナビゲートする。
controlledframe
要素 element を、USVString
urlString を与えて
ナビゲートするには、
次の手順を実行する:
-
urlString が 絶対 URL 文字列でない場合、戻る。
-
url を、urlString および element の ノード文書を与えて URL を構文解析する結果とする。
-
historyHandling を "
auto" とする。 -
element の 埋め込まれた navigable の アクティブ文書が 完全に読み込まれていない場合、historyHandling を "
replace" に設定する。 -
element の 埋め込まれた navigableを url に ナビゲートする。その際、element の ノード文書を使用し、
NavigationHistoryBehaviorとして historyHandling を用いる。
HTMLControlledFrameElement()
コンストラクタ手順は次の通りである:
-
this の request を、新しい
WebRequestに設定する。 -
this の contextMenus を、新しい
ContextMenusに設定する。
3.1. 共通インフラストラクチャ
controlledframe
controlledframe、promise promise、および省略可能な value を与えて、
埋め込み元 promise
を解決するには、
次の手順を実行する:
-
controlledframe の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 promise を value で 解決する。
注: controlledframe の 関連グローバルオブジェクトは 埋め込み元の
Windowオブジェクトである。
controlledframe
controlledframe、promise promise、および省略可能な value を与えて、
埋め込み元 promise
を拒否するには、
次の手順を実行する:
-
controlledframe の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 promise を value で 拒否する。
注: controlledframe の 関連グローバルオブジェクトは 埋め込み元の
Windowオブジェクトである。
URLPattern
に一致するとは、
次の手順が true を返すことである:
-
result を、pattern および url を与えて match した結果とする。
-
result が null の場合、
falseを返す。 -
trueを返す。
3.2. 属性
partition
属性は、
Controlled Frame のインスタンスに関連するデータをどこに格納するかを指定する識別子を取る。
この識別子は英数字の文字列で構成される。
埋め込まれた navigable のすべてのデータは、
このパーティション文字列と、そのデータを作成したオリジンによってキー付けされた
ストレージ棚に格納されなければならない。
既定では、格納されるすべてのデータはメモリ内ストレージパーティションに保持されなければならない。
これにより、特定の
partition
値を持つ最後の Controlled Frame 要素が破棄されたときに、
そのデータも破棄される。このデータがこのパーティションに保持されている間は、
Controlled Frame の 埋め込まれた navigable からのデータは永続化してはならない。
partition 属性識別子が接頭辞 "persist:" を含む場合、ユーザー エージェントはメモリ内ストレージパーティションではなく、ディスクベースのストレージ環境を使用しなければならない。 埋め込まれたコンテンツは、そのストレージがメモリ内であるか永続的であるかを検出できるべきではない。
複数の Controlled Frame が同じパーティション識別子を共有する場合、それらのすべての 埋め込まれた navigable インスタンスは同じ ストレージパーティションを共有しなければならない。
注: [STORAGE] 仕様は、partition
属性の値に基づいてストレージをパーティション化するために、下でモンキー
パッチされる。
partition
IDL 属性 setter 手順は次の通りである:
-
this の 埋め込まれた navigable が null でない場合:
src 属性は、
Controlled
Frame の 埋め込まれた navigable の
現在のセッション履歴エントリの
URL
を反映する。
src
IDL 属性 setter 手順は次の通りである:
-
this の 埋め込まれた navigable が null の場合:
-
this を与えて、 controlledframe を初期化する。
-
-
それ以外の場合:
-
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 するには、
次の手順を実行する:
-
resultPromise を新しい promise とする。
-
resultPromise を返し、残りの手順を 並列に実行する。
-
embeddedNavigable を controlledframe の 埋め込まれた navigable とする。
-
embeddedNavigable が null の場合、 controlledframe、resultPromise、および
falseを与えて 埋め込み元 promise を解決し、 これらの手順を中止する。 -
embeddedNavigable の アクティブ文書が完全にアクティブでない場合、 controlledframe、resultPromise、 および
falseを与えて 埋め込み元 promise を解決し、 これらの手順を中止する。 -
次のセッション履歴探索手順を embeddedNavigable に 付加する:
-
allSteps を、embeddedNavigable について 使用済みのすべての履歴ステップを取得する結果とする。
-
currentStepIndex を、allSteps 内における embeddedNavigable の 現在のセッション履歴ステップのインデックスとする。
-
targetStepIndex を currentStepIndex + delta とする。
-
allSteps[targetStepIndex] が 存在しない場合、 controlledframe、resultPromise、 および
falseを与えて 埋め込み元 promise を解決し、 これらの手順を中止する。 -
result を、allSteps[targetStepIndex] を embeddedNavigable に適用する traverse history step を適用する結果とし、 その際 ユーザーナビゲーション関与として "none" を与える。
-
result が "
applied" と等しくない場合、 controlledframe、resultPromise、およびfalseを与えて 埋め込み元 promise を解決する。 -
それ以外の場合、controlledframe、 resultPromise、および
trueを与えて 埋め込み元 promise を解決する。
-
canGoBack()
メソッド手順は次の通りである:
-
result を新しい promise とする。
-
controlledframe を this とする。
-
embeddedNavigable を controlledframe の 埋め込まれた navigable とする。
-
embeddedNavigable が null の場合、result を
falseで 解決し、 result を返す。 -
embeddedNavigable の ノード文書の 関連グローバルオブジェクトの ナビゲーションおよび探索タスクソースに グローバルタスクをキューに入れ、 次の手順を実行させる:
-
canGoBack を、embeddedNavigable の 現在のセッション履歴ステップが > 0 の場合は
true、そうでない場合はfalseとする。 -
controlledframe、result、 および canGoBack を与えて 埋め込み元 promise を解決する。
-
-
result を返す。
canGoForward()
メソッド手順は次の通りである:
-
result を新しい promise とする。
-
controlledframe を this とする。
-
embeddedNavigable を controlledframe の 埋め込まれた navigable とする。
-
embeddedNavigable が null の場合、result を
falseで 解決し、 result を返す。 -
embeddedNavigable の ノード文書の 関連グローバルオブジェクトの ナビゲーションおよび探索タスクソースに グローバルタスクをキューに入れ、 次の手順を実行させる:
-
step を embeddedNavigable の 現在のセッション履歴ステップとする。
-
steps を、embeddedNavigable を与えて 使用済みのすべての履歴ステップを取得する 結果とする。
-
canGoForward を、step + 1 < steps の サイズの場合は
true、 そうでない場合はfalseとする。 -
controlledframe、result、 および canGoForward を与えて 埋め込み元 promise を解決する。
-
-
result を返す。
back() メソッド手順は
次の通りである:
-
this および -1 を与えて、 埋め込まれた navigable の履歴を delta traverse する結果を返す。
forward() メソッド手順
は次の通りである:
-
this および 1 を与えて、 埋め込まれた navigable の履歴を delta traverse する結果を返す。
go(relativeIndex)
メソッド手順は次の通りである:
-
this および relativeIndex を与えて、 埋め込まれた navigable の履歴を delta traverse する結果を返す。
reload() 手順は次の通りである:
-
embeddedNavigable を this の 埋め込まれた navigable とする。
-
embeddedNavigable が null の場合、戻る。
-
embeddedNavigable の ノード文書の 関連グローバルオブジェクトの ナビゲーションおよび探索タスクソースに グローバルタスクをキューに入れ、 "none" の ユーザーナビゲーション関与を与えて embeddedNavigable を 再読み込みさせる。
stop() 手順は次の通りである:
-
embeddedNavigable を this の 埋め込まれた navigable とする。
-
embeddedNavigable が null の場合、戻る。
-
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
- css
- urlPatterns
-
URLPatternの リスト。 - excludeURLPatterns
-
URLPatternの リスト。注: 文書の URL がこれらの パターンのいずれかに一致する場合、 コンテンツは文書に注入されない。これは urlPattern を上書きする。両方のリストに、 文書の URL が一致するエントリがある場合、コンテンツは 文書に注入されない。
- allFrames
-
コンテンツをページ内のすべてのフレームに注入すべきか、トップレベルフレームのみに 注入すべきかを示す boolean。
- matchAboutBlank
-
コンテンツを about:blank ページに注入すべきかどうかを示す boolean。
- runAt
-
JavaScript コンテンツを文書のライフサイクル内のいつ実行すべきかを示す
RunAt。
controlledframe
controlledframe、USVString
urlString、boolean isCss、
long
index、および long、
boolean、
DOMString
を取るアルゴリズム completionSteps を与えて、
注入項目を取得するには、
次の手順を実行する:
注: ここでは クラシックスクリプトを取得するは使用できない。取得では controlledframe の 関連設定オブジェクトを使用する必要があるが、 クラシックスクリプトは、埋め込まれた navigable の アクティブ文書の 関連設定オブジェクトを使用して実行されるためである。
-
urlString が妥当な URL 文字列でない場合:
-
0、
false、および "" を与えて completionSteps を実行する。 -
戻る。
-
-
request を、次のフィールドを持つ新しい request とする:
- URL
-
urlString および controlledframe の ノード文書を与えて URL を構文解析する結果。
- method
-
"
GET" - destination
-
isCss が
trueの場合は "style"、 それ以外の場合は "script" - client
-
controlledframe の関連設定オブジェクト
- mode
-
"
cors"
-
request を取得し、processResponseConsumeBody を、 response response と、null、failure、または バイト列 contents を与えられた次の手順に設定する:
-
response のstatus が 200 でない、または contents が null または failure である場合、0、
false、および "" を与えて completionSteps を実行する -
それ以外の場合、index、
true、および contents を与えて completionSteps を実行する。
-
controlledframe
controlledframe および ContentScriptDetails
details を与えて、
検証して ContentScriptDetails
を解決するには、
次の手順を実行する:
-
result を新しい promise とする。
-
details["
js"] および details["css"] が両方とも定義されている、または両方とも undefined である場合、result をTypeErrorで拒否し、それを返す。 -
details["
urlPatterns"] が空である場合、 result をTypeErrorで拒否し、それを返す。 -
isCss を、details["
css"] が定義されている場合はtrue、 それ以外の場合はfalseに等しい boolean とする。 -
isCss が
trueであり、かつ details["runAt"] が "document-start" と等しくない場合、result をTypeErrorで拒否し、それを返す。 -
injectionItems を、isCss が
trueの場合は details["css"]、 それ以外の場合は details["js"] とする。 -
injectionItems["
code"] および injectionItems["files"] が両方とも定義されている、または両方とも undefined である場合、result をTypeErrorで拒否し、それを返す。 -
result を返し、残りの手順を 並列に実行する。
-
config を、次の値を持つ新しい content script config とする:
- pendingFetchCount
-
0
- urlPatterns
-
«»
- excludeURLPatterns
-
«»
- allFrames
-
details["
allFrames"] が定義されている場合はそれ、そうでない場合はfalse - matchAboutBlank
-
details["
matchAboutBlank"] が定義されている場合はそれ、 そうでない場合はfalse - runAt
-
details["
runAt"] が定義されている場合はそれ、そうでない場合はdocument-idle
-
details["
urlPatterns"] 内の各 urlPattern について 反復する:-
urlPattern が
URLPatternである場合、urlPattern を config の urlPatterns に 付加する。 -
それ以外の場合、urlPattern を与えて 新しい
URLPatternを作成し、 config の urlPatterns に 付加する。
-
-
details["
excludeURLPatterns"] が定義されている場合:-
details["
excludeURLPatterns"] 内の各 urlPattern について 反復する:-
urlPattern が
URLPatternである場合、 urlPattern を config の excludeURLPatterns に 付加する。 -
それ以外の場合、 urlPattern を与えて 新しい
URLPatternを作成し、config の excludeURLPatterns に 付加する。
-
-
-
completionSteps を、
longindex、boolean success、およびDOMStringsource を取る次のアルゴリズムとする:-
success が
falseの場合、controlledframe、 result、およびTypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
isCss の場合:
-
config の css[index] を source に設定する。
-
-
それ以外の場合:
-
config の js[index] を source に設定する。
-
-
config の pendingFetchCount をデクリメントする。
-
config の pendingFetchCount が 0 より 大きい場合、戻る。
-
controlledframe の content script map[details[
name]] を config に設定する。 -
controlledframe および result を与えて 埋め込み元 promise を解決する。
-
-
injectionItems["
code"] が定義されている場合:-
0、
true、および injectionItems ["code"] を与えて completionSteps を実行する。
-
-
それ以外の場合:
-
injectionItems["
files"] が空である場合、 controlledframe、result、 およびTypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
injectionItems ["
files"] の各 urlString について 反復する:-
controlledframe、 urlString、isCss、config の pendingFetchCount、 および completionSteps を与えて、注入項目を取得するを実行する。
-
config の pendingFetchCount をインクリメントする。
-
-
-
isTopLevel が
falseであり、かつ config の allFrames がfalseである場合、falseを返す。 -
url が about:blank に一致する、かつ config の matchAboutBlank が
falseである場合、falseを返す。 -
urlString を、url を 直列化する結果とする。
-
match を
falseとする。 -
config の urlPatterns の各 pattern について 反復する:
-
urlString が pattern である URLPattern に一致する場合、 match を
trueに設定する。
-
-
config の excludeURLPatterns の各 pattern について 反復する:
-
urlString が pattern である URLPattern に一致する場合、 match を
falseに設定する。
-
-
match を返す。
Document
document および RunAt
currentPhase を与えて、
コンテンツスクリプトを文書に注入するには、
次の手順を実行する:
-
embeddedNavigable を、document の node navigable の traversable navigable とする。
-
embeddedNavigable が null、またはその controlledFrameEmbedderParent が null である場合、 戻る。
-
controlledframe を embeddedNavigable の controlledFrameEmbedderParent とする。
-
url を document の URL とする。
-
isTopLevel を、document の node navigable の parent が null である場合は
true、 それ以外の場合はfalseとする。 -
controlledframe の content script map の各 config について反復する:
-
config、url、および isTopLevel を与えて、content script config が 文書に適用されるかどうかを判定した結果が
falseと等しい場合、 続行する。 -
currentPhase が
document-startと等しく、かつ config の css が空でない場合:-
config の css の各 styleSource について 反復し、document および styleSource を与えて スタイルシートを文書に注入するを実行する。
-
-
それ以外で、currentPhase が config の runAt と等しい場合:
-
config の js の各 scriptSource について 反復し、document、scriptSource、および空の アルゴリズムを与えて スクリプトを文書に注入するを実行する。
-
-
Document
document および DOMString
styleSource を与えて、
スタイルシートを文書に注入するには、
次の手順を実行する:
-
styleSheet を新しい CSS スタイルシートオブジェクトとする。
-
styleSheet および styleSource を与えて CSSStyleSheet の規則を同期的に置換する。
-
document のグローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 document および styleSheet を与えて CSS スタイルシートを追加する。
次のアルゴリズムは Document の 環境内でスクリプトを実行するが、それは望ましい振る舞いではない。 現行の HTML 仕様インフラストラクチャでは仕様化できない目標は、この アルゴリズムが、異なるグローバルオブジェクトを持ち、ただし DOM への共有アクセスを持つ、 Document の環境から隔離された環境でスクリプトを実行することである。この実行環境は Blink では Isolated World と呼ばれ、拡張機能で content scripts を実行するために使用されている。その実行モデルに関する追加の詳細については、この 図を参照。Gecko は Xray vision と呼ばれる同様の方式を使用している。このアルゴリズムは最終的に、 すべてのブラウザで実装可能な、この隔離の仕様化可能な実装を記述すべきである。
Document
document、
DOMString
scriptSource、および
完了レコードを取るアルゴリズム
completionSteps を与えて、
スクリプトを
文書に注入するには、次の手順を実行する:
注: document.currentScript は、
scriptSource の実行中に意図的に設定されない。
-
script を、scriptSource、document の 関連設定オブジェクト、document の URL、および 既定のスクリプト取得オプションを与えて クラシックスクリプトを作成する結果とする。
-
document の グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 次の手順を実行させる:
-
completionRecord を、 script を与えて クラシックスクリプトを実行する結果とする。
-
controlledframe を、document の node navigable の traversable navigable の controlledFrameEmbedderParent とする。
-
controlledframe の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 completionRecord を用いて completionSteps を実行させる。
-
addContentScripts(contentScriptList)
メソッド手順は次の通りである:
-
contentScriptList が空である場合、
TypeErrorで拒否された 新しい promise を返す。 -
promises を空の リストとする。
-
contentScriptList 内の各 contentScript について 反復する:
-
promise を、contentScript を与えて ContentScriptDetails を検証して解決するを呼び出した結果とする。
-
promise を promises に 付加する。
-
-
promises を与えて すべての promise を待つための promise を取得する結果を返す。
removeContentScripts(scriptNameList)
メソッド手順は次の通りである:
-
result を新しい promise とする。
-
controlledframe を this とする。
-
result を返し、残りの手順を 並列に実行する。
-
scriptNameList が undefined の場合:
-
controlledframe の content script map を クリアする。
-
-
それ以外の場合、scriptNameList の各 name について 反復する:
-
controlledframe の content script map[name] を 削除する。
-
-
controlledframe および result を与えて 埋め込み元 promise を解決する。
executeScript(details)
メソッド手順は次の通りである:
-
result を新しい promise とする。
-
controlledframe を this とする。
-
result を返し、残りの手順を 並列に実行する。
-
controlledframe の 埋め込まれた navigable が null である場合、 controlledframe、result、および
TypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
details["
code"] および details"[file"] が両方とも定義されている、または両方とも undefined である場合、controlledframe、 result、およびTypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
executionSteps を、
longおよびDOMStringまたは boolean scriptString を取る次のアルゴリズムとする:-
scriptString が
DOMStringでない場合、controlledframe、result、およびTypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
document を、controlledframe の 埋め込まれた navigable の アクティブ文書とする。
-
document、scriptString、 および 完了レコード completionRecord を受け取る次のアルゴリズムを与えて、 スクリプトを文書に注入する:
-
completionRecord が通常完了である場合:
-
controlledframe、 result、および completionRecord.
[[Value]]を与えて 埋め込み元 promise を解決する。
-
-
それ以外の場合:
-
controlledframe、 result、および completionRecord.
[[Value]]を与えて 埋め込み元 promise を拒否する。
-
-
-
-
details["
code"] が定義されている場合、0 および details["code"] を与えて executionSteps を実行する。 -
それ以外の場合、controlledframe、 details["
file"]、false、0、および executionSteps を与えて 注入項目を取得する。
insertCSS(details)
メソッド手順は次の通りである:
-
result を新しい promise とする。
-
controlledframe を this とする。
-
result を返し、残りの手順を 並列に実行する。
-
controlledframe の 埋め込まれた navigable が null である場合、 controlledframe、result、および
TypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
details["
code"] および details["file"] が両方とも定義されている、または両方とも undefined である場合、controlledframe、 result、およびTypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
executionSteps を、
long、 boolean success、およびDOMStringstyleString を取る次のアルゴリズムとする:-
success が
falseの場合、controlledframe、 result、およびTypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
document を、controlledframe の 埋め込まれた navigable の アクティブ文書とする。
-
document および styleString を与えて スタイルシートを文書に注入する。
-
controlledframe および result を与えて 埋め込み元 promise を解決する。
-
-
details["
code"] が定義されている場合、0、true、および details["code"] を与えて executionSteps を実行する。 -
それ以外の場合、controlledframe、 details["
file"]、false、0、および executionSteps を与えて 注入項目を取得する。
3.5. 設定メソッド
dictionary {ClearDataOptions long ; };since dictionary {ClearDataTypeSet boolean ;cache boolean ;cookies boolean ;fileSystems boolean ;indexedDB boolean ;localStorage boolean ;persistentCookies boolean ; };sessionCookies
long
since を与えて、
ストレージボトルを空にするには、次の手順を実行する:
注: 可能であれば、ユーザーエージェントは、 since 以後に最後に使用されたデータのみを削除すべきである。since は epoch からのミリ秒単位のタイムスタンプを表す。 すべてのユーザーエージェントが、すべての 閲覧データについて書き込み時刻またはアクセス時刻を追跡しているわけではない。 実装は可能な限り since を尊重すべきであるが、この API はその利用可能性を保証しない。
-
bottle を bucket[identifier] とする。
-
bottle の proxy map reference set を新しい 集合に設定する。
clearData(options, types)
メソッド手順は次の通りである:
-
resultPromise を新しい promise とする。
-
controlledframe を this とする。
-
resultPromise を返し、残りの手順を 並列に実行する。
-
clearSince を 0 とする。
-
options["
since"] が定義されている場合、clearSince を options|["since"] に設定する。 -
embeddingOrigin を、controlledframe の 関連設定オブジェクトの トップレベルオリジンとする。
-
partition を controlledframe の
partitionとする。 -
ユーザーエージェントの storage shed の各 storageKey → shelf について 反復する:
-
storageKey の embedding origin が embeddingOrigin と等しくない、または storageKey の partition が partition と等しくない場合、 続行する。
-
bucket を shelf["
default"] とする。 -
types["
fileSystems"] がtrueである場合:-
bucket、"
fileSystem"、および clearSince を与えて ストレージボトルを空にする。
-
-
types["
indexedDB"] がtrueである場合:-
bucket、"
indexedDB"、および clearSince を与えて ストレージボトルを空にする。
-
-
types["
localStorage"] がtrueである場合:-
bucket、"
localStorage"、および clearSince を与えて ストレージボトルを空にする。
-
-
-
types["
cookies"]、 types["persistentCookies"]、 または types["sessionCookies"] がtrueである場合:[COOKIES] 仕様は、 storage key のような仕組みによる cookies のパーティション化をサポートしていない。次の手順はすべての cookies を クリアするが、意図としては、この Controlled Frame の現在の
partitionを持つ Controlled Frame 内のコンテンツによって作成された cookies のみを削除することである。-
ユーザーエージェントの cookie store 内の各 cookie について 反復する:
-
cookie の persistent-flag が設定されている場合:
-
types["
cookies"] および types["persistentCookies"] がfalseである場合、 続行する。
-
-
それ以外の場合:
-
types["
cookies"] および types["sessionCookies"] がfalseである場合、 続行する。
-
-
cookie の last-access-time が epoch からのミリ秒として表された値が clearSince より小さい場合、続行する。
-
cookie をユーザーエージェントの cookie store から削除する。
-
-
-
types["
cache"] がtrueである場合:-
ユーザーエージェントが管理する各 storageKey → cache について反復する: [HTTP-CACHING]
-
storageKey の embedding origin が embeddingOrigin と等しくない、または storageKey の partition が partition と等しくない場合、続行する。
-
cache をクリアする。
-
-
-
controlledframe および resultPromise を与えて 埋め込み元 promise を解決する。
各埋め込まれた navigableは、
既定値が false である
muted boolean を保持する。
muted が
true の場合、ユーザーエージェントは
埋め込まれた
navigable 内に由来するすべてのオーディオストリームをミュートしなければならない。
muted
状態は、
埋め込まれた navigable 内のコンテンツには公開されるべきではない。
muted が
true の場合、音量状態はスクリプトから見えるいかなる方法でも変更されるべきではないが、
下層のオーディオストリームはユーザーに聞こえるべきではない。
getAudioState()
メソッド手順は次の通りである:
-
resultPromise を新しい promise とする。
-
controlledframe を this とする。
-
resultPromise を返し、残りの手順を 並列に実行する。
-
controlledframe の 埋め込まれた navigable が null である場合、 controlledframe、resultPromise、および
TypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
playingAudio を、controlledframe の 埋め込まれた navigable 内の、入れ子のフレームを含む任意のコンテンツが 現在オーディオを再生している場合は
true、 そうでない場合はfalseとする。 -
controlledframe、resultPromise、 および playingAudio を与えて 埋め込み元 promise を解決する。
isAudioMuted()
メソッド手順は次の通りである:
-
resultPromise を新しい promise とする。
-
controlledframe を this とする。
-
resultPromise を返し、残りの手順を 並列に実行する。
-
controlledframe の 埋め込まれた navigable が null である場合、 controlledframe、resultPromise、および
TypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
controlledframe、resultPromise、 および controlledframe の 埋め込まれた navigable の muted フラグを与えて 埋め込み元 promise を解決する。
setAudioMuted(mute)
メソッド手順は次の通りである:
-
this の 埋め込まれた navigable が null である場合、
TypeErrorを投げる。 -
this の 埋め込まれた navigable の muted フラグを mute に設定する。
3.5.1. ズーム
enum {ZoomMode ,"per-origin" ,"per-view" };"disabled"
ユーザーエージェントは、Controlled Frame zoom map を保持する。これは マップであり、その キーはタプルであり、 値はfloatである。
各 HTMLControlledFrameElement
は ZoomMode
zoomMode を保持し、その既定値は per-origin
である。
各 HTMLControlledFrameElement
は float 数 currentZoom
を保持し、初期値は 1.0f に設定される。
float zoomLevel を与えて 文書に ズームレベルを適用する方法は、実装に固有である。
この節は非規範的である。
有効な ZoomMode
値は次のように振る舞う:
per-origin-
ズーム変更は埋め込まれた文書のオリジンに永続化される。すなわち、同じ
partition内にあり、同じオリジンへナビゲートされた他のすべてのHTMLControlledFrameElementも同様にズームされる。 per-view-
ズーム変更はこの
HTMLControlledFrameElement内でのみ有効となり、他のHTMLControlledFrameElementにおけるズーム変更は、このHTMLControlledFrameElementのズームに影響しない。 disabled-
HTMLControlledFrameElement内のすべてのズームを無効化する。 コンテンツは既定のズームレベルに戻り、試行されたすべてのズーム変更は無視される。
HTMLControlledFrameElement
e を与えて、
per-origin
ズームレベルを取得するには、次の手順を実行する:
-
result を、初期値が 1.0f に設定された float とする。
-
key を、e の 埋め込まれた navigable の アクティブ文書の 現在の設定オブジェクトに関連付けられた 環境を与えて Controlled Frame storage key を取得する結果とする。
-
Controlled Frame zoom map[key] が 存在する場合、result を、キー key を与えて Controlled Frame zoom map の 値を取得する結果に設定する。
-
result を返す。
HTMLControlledFrameElement
e および float zoomLevel を与えて、
per-origin
ズームレベルを設定するには、次の手順を実行する:
-
key を、e の 埋め込まれた navigable の アクティブ文書の 現在の設定オブジェクトに関連付けられた 環境を与えて Controlled Frame storage key を取得する結果とする。
-
キー key と値 zoomLevel を与えて、Controlled Frame zoom map の 値を設定する。
HTMLControlledFrameElement
e を与えて、
現在の文書が per-origin ズーム
レベルを持つかどうかを判定するには、次の手順を実行する:
-
key を、e の 埋め込まれた navigable の アクティブ文書の 現在の設定オブジェクトに関連付けられた 環境を与えて Controlled Frame storage key を取得する結果とする。
-
Controlled Frame zoom map[key] が 存在する場合、
trueを返す。 -
falseを返す。
getZoomMode() メソッド
手順は次の通りである:
-
p を 新しい promise とする。
-
controlledframe を this とする。
-
p を返し、残りの手順を 並列に実行する。
-
controlledframe、p、および controlledframe の zoomMode を与えて 埋め込み元 promise を解決する。
setZoomMode(zoomMode)
メソッド手順は次の通りである:
-
p を 新しい promise とする。
-
controlledframe を this とする。
-
p を返し、残りの手順を 並列に実行する。
-
currentZoomMode を、controlledframe を与えて
getZoomModeした結果とする。 -
currentZoomMode が zoomMode と等しい場合、 controlledframe および p を与えて 埋め込み元 promise を解決する。
-
controlledframe の zoomMode を zoomMode に設定する。
-
zoomMode が
per-originである場合:-
controlledframe を与えて、現在の文書が per-origin ズームレベルを持つが
trueである場合:-
oldZoomFactor を controlledframe の currentZoom とする。
-
controlledframe の currentZoom を、 controlledframe を与えて per-origin ズームレベルを取得する結果に設定する。
-
oldZoomFactor が controlledframe の currentZoom と等しくない場合:
-
controlledframe の currentZoom を与えて、 controlledframe の埋め込まれた文書に ズームレベルを適用する。
-
controlledframe、oldZoomFactor、 controlledframe の currentZoom を用いて "zoomchange" イベントを発火する。
-
-
-
-
zoomMode が
disabledである場合:-
oldZoomFactor を controlledframe の currentZoom とする。
-
controlledframe の currentZoom を 1.0f に設定する。
-
oldZoomFactor が controlledframe の currentZoom と等しくない場合:
-
controlledframe の currentZoom を与えて、 controlledframe の埋め込まれた文書に ズームレベルを適用する。
-
controlledframe、oldZoomFactor、 controlledframe の currentZoom を用いて "zoomchange" イベントを発火する。
-
-
-
controlledframe および p を与えて 埋め込み元 promise を解決する。
getZoom() メソッド手順
は次の通りである:
-
p を 新しい promise とする。
-
controlledframe を this とする。
-
p を返し、残りの手順を 並列に実行する。
-
embeddedNavigable を controlledframe の 埋め込まれた navigable とする。
-
embeddedNavigable が null である場合、 controlledframe、p、および
TypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
controlledframe、p、および controlledframe の currentZoom を与えて 埋め込み元 promise を解決する。
setZoom(zoomFactor) メソッド
手順は次の通りである:
-
p を 新しい promise とする。
-
controlledframe を this とする。
-
p を返し、残りの手順を 並列に実行する。
-
embeddedNavigable を controlledframe の 埋め込まれた navigable とする。
-
embeddedNavigable が null である場合、 controlledframe、p、および
TypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
controlledframe の ZoomMode が
disabledである場合:-
controlledframe、p、および
TypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。
-
-
controlledframe の ZoomMode が
per-originである場合:-
oldZoomFactor を controlledframe の currentZoom とする。
-
controlledframe および zoomFactor を与えて per-origin ズームレベルを設定する。
-
ユーザーエージェントの 閲覧コンテキストグループ集合内の各 閲覧コンテキストグループ group について 反復する:
-
group 内の各 トップレベル閲覧コンテキスト browsingContext について 反復する:
-
embeddedDocument を browsingContext の アクティブ文書とする。
-
embedder を embeddedDocument の node navigable の controlledFrameEmbedderParent とする。
-
embedder が null である場合、続行する。
-
match を、次の条件がすべて
trueである場合はtrueとする:-
embedder の ZoomMode が
per-originである -
embeddedDocument の オリジン が controlledframe の 埋め込まれた navigable の アクティブ文書の オリジン と等しい
-
embedder の currentZoom が zoomFactor と等しくない
-
-
match が
trueである場合:-
embedder の currentZoom を zoomFactor に設定する。
-
zoomFactor を与えて embeddedDocument に ズームレベルを適用する。
-
embedder、 oldZoomFactor、および zoomFactor を用いて "zoomchange" イベントを発火する。
-
-
-
-
-
controlledframe の ZoomMode が
per-viewである場合:-
oldZoomFactor を controlledframe の currentZoom とする。
-
controlledframe の currentZoom を zoomFactor に設定する。
-
oldZoomFactor が controlledframe の currentZoom と等しくない場合:
-
controlledframe の currentZoom を与えて controlledframe の埋め込まれた文書に ズームレベルを適用する。
-
controlledframe、 oldZoomFactor、controlledframe の currentZoom を用いて "zoomchange" イベントを発火する。
-
-
-
controlledframe および p を与えて 埋め込み元 promise を解決する。
3.6. キャプチャメソッド
// One of |code| or |file| must be specified but not both.dictionary {ImageDetails DOMString ;format DOMString ; };quality
captureVisibleRegion(options)
メソッド手順は次の通りである:
-
resultPromise を新しい promise とする。
-
controlledframe を this とする。
-
resultPromise を返し、残りの手順を 並列に実行する。
-
controlledframe の 埋め込まれた navigable が null である場合、 controlledframe、resultPromise、および
TypeErrorを与えて 埋め込み元 promise を拒否し、 これらの手順を中止する。 -
optionsFormat を既定で "JPEG" とする。
-
optionsQuality を既定で 100 とする。
-
options にフィールド "format" がある場合:
-
optionsFormat を options["format"] とする。
-
-
optionsFormat が認識されない形式である場合、 controlledframe、resultPromise、および
TypeErrorを与えて埋め込み元 promise を拒否し、これらの手順を中止する。 -
options にフィールド "quality" がある場合:
-
optionsQuality を options["quality"] とする。
-
-
optionsQuality が整数でない、または 0 以上 100 以下でない場合、 controlledframe、 resultPromise、および
TypeErrorを与えて埋め込み元 promise を拒否し、 これらの手順を中止する。 -
imageData を、埋め込まれたコンテンツの可視領域を示す画像であり、 optionsFormat で、品質 optionsQuality でエンコードされたものとする。
注: サポートされる画像形式の集合は 実装定義であるが、少なくとも "JPEG" および "PNG" をサポートすることが推奨される。
-
controlledframe、resultPromise、 および imageData を含む
data:URL を与えて 埋め込み元 promise を解決する。
print()
メソッド手順は次の通りである:
-
this の 埋め込まれた navigable が null である場合、
TypeErrorを投げる。 -
埋め込まれたコンテンツに対してブラウザのページ印刷機能を開始する。
3.7. イベント
HTMLControlledFrameElement
は EventTarget
を実装し、次のイベントハンドラー(および対応する
イベントハンドラーイベント型)をサポートする。
| イベントハンドラー | イベントハンドラーイベント型 |
|---|---|
onconsolemessage
| consolemessage |
oncontentload
| contentload |
ondialog
| dialog |
onloadabort
| loadabort |
onloadcommit
| loadcommit |
onloadstart
| loadstart |
onloadstop
| loadstop |
onnewwindow
| newwindow |
onpermissionrequest
| permissionrequest |
onsizechanged
| sizechanged |
onzoomchange
| zoomchange |
インタラクティブイベント:
UI 変更イベント:
-
onsizechanged- 埋め込まれた Web コンテンツが autosize によってリサイズされたときに発火する。autosize が 有効な場合にのみ発火する。
ナビゲーションイベント:
-
oncontentload- 埋め込まれた navigable に関連付けられたWindowが load イベントを発火したときに発火する。 -
onloadabort- ナビゲーションが完了前に終了したときに発火する。 -
onloadcommit- ナビゲーションが完了したときに発火する。 -
onloadstart- ナビゲーション(再読み込みおよび traversal を含む)が開始したとき、埋め込まれた文書の各 navigable について発火するが、同一文書ナビゲーションでは発火しない。 -
onloadstop- 保留中のすべてのナビゲーションが完了(commit または abort)したときに発火する。その後に新しいナビゲーションが開始した場合、 loadstop は再び発火する可能性がある。
各 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
を発火する
には、次の手順を実行する:
-
consoleMessage を新しい
ConsoleMessageオブジェクトとする。 -
consoleMessage の次のフィールドを設定する:
-
e の
consoleMessageを consoleMessage に設定する。 -
target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、target に e をdispatch させる。
3.7.2. dialog
enum {DialogType ,"alert" ,"confirm" }; ["prompt" Exposed =Window ,IsolatedContext ]interface {DialogController undefined okay (optional DOMString );response undefined cancel (); }; [Exposed =Window ,IsolatedContext ]interface {DialogMessage readonly attribute DialogType ;messageType readonly attribute DOMString ;messageText readonly attribute DialogController ; }; [dialog Exposed =Window ,IsolatedContext ]interface :DialogEvent Event {(constructor DOMString ,type optional DialogEventInit = {});eventInitDict readonly attribute DialogMessage ; };dialogMessage dictionary :DialogEventInit EventInit {DialogMessage ?; };dialogMessage
各 DialogController
は次を持つ:
-
boolean accept。初期値は
falseに設定される。 -
DOMString response。初期値は空文字列である。
cancel() メソッド手順は次の通りである:
-
accept を
falseに設定する。
controlledframe
要素 target、simple-dialogs 型 dialogType、および
メッセージ message を与えて、
DialogEvent
を発火する
には、次の手順を実行する:
-
e["
dialogMessage"]["dialog"]["accept"] がfalseと等しいことを表明する。 -
dialogMessage を新しい
DialogMessageオブジェクトとする。 -
dialog を新しい
DialogControllerオブジェクトとする。 -
dialogMessage の次のフィールドを設定する:
messageType-
dialogType。
messageText-
message。
dialog-
dialog。
-
e の
dialogMessageを dialogMessage に設定する。 -
complete を
falseとする。 -
target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 次の手順を実行させる:
-
target に e をdispatch する。
-
complete を
trueに設定する。
-
-
complete が
trueになるまで同期的に待つ。注: ここでブロックするのは意図的である。 "dialog" イベントによって表される alert、confirm、および prompt ダイアログはメインスレッドをブロックし、ここで呼び出すイベント ハンドラーが戻り値に影響し得るためである。
-
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)
メソッド手順は次の通りである:
-
newControlledFrame の 埋め込まれた navigable を、 this の target navigable に設定する。
discard() メソッド手順は次の通りである:
-
this の target navigable が null でない場合、 this の target navigable を与えて トップレベル traversable を閉じる。
controlledframe
要素 controlledFrame、USVString
url、
DOMString
target、navigable targetNavigable、および
WindowOpenDisposition
windowOpenDisposition を与えて、
NewWindowEvent
を発火する
には、次の手順を実行する:
-
controller を新しい
NewWindowControllerオブジェクトとする。 -
controller の target navigable を targetNavigable に設定する。
-
newWindow の次のフィールドを設定する:
window-
controller
targetUrl-
url
name-
target。
windowOpenDisposition-
windowOpenDisposition
-
e の
newWindowを newWindow に設定する。 -
controlledFrame の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 controlledFrame に e をdispatch させる。
3.7.4. permissionrequest
enum {PermissionType ,"media" ,"geolocation" ,"pointerLock" ,"download" ,"filesystem" ,"fullscreen" , }; ["hid" Exposed =Window ,IsolatedContext ]interface {PermissionRequestControllerBase undefined allow ();undefined cancel (); }; [Exposed =Window ,IsolatedContext ]interface :MediaPermissionRequestController PermissionRequestControllerBase {readonly attribute USVString ; }; [url Exposed =Window ,IsolatedContext ]interface :GeolocationPermissionRequestController PermissionRequestControllerBase {readonly attribute USVString ; }; [url Exposed =Window ,IsolatedContext ]interface :PointerLockPermissionRequestController PermissionRequestControllerBase {readonly attribute boolean ;lastUnlockedBySelf readonly attribute boolean ;userGesture readonly attribute USVString ; }; [url Exposed =Window ,IsolatedContext ]interface :DownloadPermissionRequestController PermissionRequestControllerBase {readonly attribute DOMString ;requestMethod readonly attribute USVString ; }; [url Exposed =Window ,IsolatedContext ]interface :FileSystemPermissionRequestController PermissionRequestControllerBase {readonly attribute USVString ; }; [url Exposed =Window ,IsolatedContext ]interface :FullscreenPermissionRequestController PermissionRequestControllerBase {readonly attribute USVString ; }; [origin Exposed =Window ,IsolatedContext ]interface :HidPermissionRequestController PermissionRequestControllerBase {readonly attribute USVString ; }; [url Exposed =Window ,IsolatedContext ]interface {PermissionRequest readonly attribute PermissionType ;permission readonly attribute PermissionRequestControllerBase ; }; [request Exposed =Window ,IsolatedContext ]interface :PermissionRequestEvent Event {(constructor DOMString ,type optional PermissionRequestEventInit = {});eventInitDict readonly attribute PermissionRequest ; };permissionRequest dictionary :PermissionRequestEventInit EventInit {PermissionRequest ?; };permissionRequest
各 PermissionRequestControllerBase
は boolean 値 allow を持ち、
その初期値は false である。
allow()
メソッド手順は次の通りである:
-
allow を
trueに設定する。
cancel()
メソッド手順は次の通りである:
-
allow を
falseに設定する。
文書 embeddedDocument、
controlledframe
要素 target、DOMString type、USVString url、
省略可能な辞書 options、および
boolean
を取るアルゴリズム completionSteps を与えて、
PermissionRequestEvent
を発火する
には、次の手順を実行する:
-
permissionRequest を新しい
PermissionRequestオブジェクトとする。 -
type が "media" である場合:
-
requestController を、次の属性を持つ新しい
MediaPermissionRequestControllerとする:url-
url
-
-
type が "geolocation" である場合:
-
requestController を、次の属性を持つ新しい
GeolocationPermissionRequestControllerとする:url-
url
-
-
type が "pointerLock" である場合:
-
requestController を、次の属性を持つ新しい
PointerLockPermissionRequestControllerとする:lastUnlockedBySelf-
options["lastUnlockedBySelf"]
userGesture-
options["userGesture"]
url-
url
-
-
type が "download" である場合:
-
requestController を、次の属性を持つ新しい
DownloadPermissionRequestControllerとする:requestMethod-
options["requestMethod"]
url-
url
-
-
type が "filesystem" である場合:
-
requestController を、次の属性を持つ新しい
FileSystemPermissionRequestControllerとする:url-
url
-
-
type が "fullscreen" である場合:
-
requestController を、次の属性を持つ新しい
FullscreenPermissionRequestControllerとする:origin-
url のオリジン
-
-
type が "hid" である場合:
-
requestController を、次の属性を持つ新しい
HidPermissionRequestControllerとする:url-
url
-
-
permissionRequest の次のフィールドを設定する:
request-
requestController
permission-
type。
-
e の
permissionRequestを permissionRequest に設定する。 -
target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 次の手順を実行させる:
-
target に e をdispatch する。
-
embeddedDocument の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 e["
permissionRequest"]["permission"]["allow"] を用いて completionSteps を実行させる。
-
3.7.5. sizechanged
[Exposed =Window ,IsolatedContext ]interface {SizeChange readonly attribute unsigned long ;oldWidth readonly attribute unsigned long ;oldHeight readonly attribute unsigned long ;newWidth readonly attribute unsigned long ; }; [newHeight Exposed =Window ,IsolatedContext ]interface :SizeChangedEvent Event {(constructor DOMString ,type optional SizeChangedEventInit = {});eventInitDict readonly attribute SizeChange ; };sizeChange dictionary :SizeChangedEventInit EventInit {SizeChange ?; };sizeChange
controlledframe
要素 target、4 つの非負数 oldWidth、oldHeight、
newWidth、newHeight を与えて、
SizeChangedEvent
e を発火するには:
-
sizeChange を新しい
SizeChangeオブジェクトとする。 -
sizeChange の次のフィールドを設定する:
-
e の
sizeChangeを sizeChange に設定する。 -
target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。
3.7.6. zoomchange
[Exposed =Window ,IsolatedContext ]interface {ZoomChange readonly attribute float ;oldZoomFactor readonly attribute float ; }; [newZoomFactor Exposed =Window ,IsolatedContext ]interface :ZoomChangeEvent Event {(constructor DOMString ,type optional ZoomChangeEventInit = {});eventInitDict readonly attribute ZoomChange ; };zoomChange dictionary :ZoomChangeEventInit EventInit {ZoomChange ?; };zoomChange
controlledframe
要素 target、2 つの float 数
oldZoomFactor、newZoomFactor を与えて、
ZoomChangeEvent
を発火する
には:
-
zoomChange を新しい
ZoomChangeオブジェクトとする。 -
zoomChange の次のフィールドを設定する:
oldZoomFactor-
oldZoomFactor。
newZoomFactor-
newZoomFactor。
-
e の
zoomChangeを zoomChange に設定する。 -
target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。
3.7.7. contentload
[Exposed =Window ,IsolatedContext ]interface :ContentLoadEvent Event {(constructor DOMString ,type optional EventInit = {}); };eventInitDict
controlledframe
要素 target を与えて、
ContentLoadEvent
を発火する
には、次の手順を実行する:
-
target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。
3.7.8. loadabort
[Exposed =Window ,IsolatedContext ]interface {LoadInfo readonly attribute USVString ;url readonly attribute boolean ; }; [isTopLevel Exposed =Window ,IsolatedContext ]interface :LoadAbortInfo LoadInfo {readonly attribute long ;code readonly attribute DOMString ; }; [reason Exposed =Window ,IsolatedContext ]interface {LoadRedirectInfo readonly attribute USVString ;oldUrl readonly attribute USVString ;newUrl readonly attribute boolean ; }; [isTopLevel Exposed =Window ,IsolatedContext ]interface :LoadAbortEvent Event {(constructor DOMString ,type optional LoadAbortEventInit = {});eventInitDict readonly attribute LoadAbortInfo ; };loadAbortInfo dictionary :LoadAbortEventInit EventInit {LoadAbortInfo ?; };loadAbortInfo
LoadAbortEvent
e を発火するには、
controlledframe
要素 target、USVString url、boolean isTopLevel、
long code、および DOMString
reason が与えられたとき、次の手順を実行する:
-
info を、次の属性を持つ新しい
LoadAbortInfoとする:url-
url
isTopLevel-
isTopLevel
code-
code
reason-
reason
-
e の
loadAbortInfoを info に設定する。 -
target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。
3.7.9. loadcommit
[Exposed =Window ,IsolatedContext ]interface :LoadCommitEvent Event {(constructor DOMString ,type optional LoadCommitEventInit = {});eventInitDict readonly attribute LoadInfo ; };loadInfo dictionary :LoadCommitEventInit EventInit {LoadInfo ?; };loadInfo
LoadCommitEvent
e を発火するには、
controlledframe
要素 target、USVString url、および boolean isTopLevel
が与えられたとき、次の手順を実行する:
-
info を、次の属性を持つ新しい
LoadInfoとする:url-
url
isTopLevel-
isTopLevel
-
e の
loadInfoを info に設定する。 -
target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。
3.7.10. loadstart
[Exposed =Window ,IsolatedContext ]interface :LoadStartEvent Event {(constructor DOMString ,type optional LoadStartEventInit = {});eventInitDict readonly attribute LoadInfo ; };loadInfo dictionary :LoadStartEventInit EventInit {LoadInfo ?; };loadInfo
LoadStartEvent
e を発火するには、
controlledframe
要素 target、USVString url、および boolean isTopLevel
が与えられたとき、次の手順を実行する:
-
info を、次の属性を持つ新しい
LoadInfoとする:url-
url
isTopLevel-
isTopLevel
-
e の
loadInfoを info に設定する。 -
target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。
3.7.11. loadstop
[Exposed =Window ,IsolatedContext ]interface :LoadStopEvent Event {(constructor DOMString ,type optional LoadStopEventInit = {}); };eventInitDict dictionary :LoadStopEventInit EventInit { };
controlledframe
要素 target が与えられたとき、
LoadStopEvent
を発火する
には、次の手順を実行する:
-
target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。
3.7.12. loadredirect
[Exposed =Window ,IsolatedContext ]interface :LoadRedirectEvent Event {(constructor DOMString ,type optional LoadRedirectEventInit = {});eventInitDict readonly attribute LoadRedirectInfo ; };loadRedirectInfo dictionary :LoadRedirectEventInit EventInit {LoadRedirectInfo ?; };loadRedirectInfo
controlledframe
要素 target、URL oldUrl、
URL newUrl、および boolean isTopLevel
が与えられたとき、
LoadRedirectEvent
を発火する
には、次の手順を実行する:
-
info を、次の属性を持つ新しい
LoadInfoとする:oldUrl-
oldUrl を与えて URL を直列化する結果
newUrl-
newUrl を与えて URL を直列化する結果
isTopLevel-
isTopLevel
-
e の
loadRedirectInfoを info に設定する。 -
target の 関連グローバルオブジェクトの DOM 操作タスクソースに グローバルタスクをキューに入れ、 target に e をdispatch させる。
3.7.13. モンキーパッチ
3.7.13.1. [HTML]
alert について:
-
message を、必要に応じて message を切り詰めた結果に設定する。
- controlledFrameEmbedderParent を、window の navigable の controlledFrameEmbedderParent とする。 .
-
controlledFrameEmbedderParent が
HTMLControlledFrameElementである場合、 controlledFrameEmbedderParent、"alert"、および message を用いて "dialog" イベントを発火し、戻る。
confirm について:
-
message を、必要に応じて message を切り詰めた結果に設定する。
- controlledFrameEmbedderParent を、window の navigable の controlledFrameEmbedderParent とする。 .
-
controlledFrameEmbedderParent が
HTMLControlledFrameElementである場合、 controlledFrameEmbedderParent、"confirm"、 および message を用いて "dialog" イベントを発火する結果を 返す。
prompt について:
-
default を、必要に応じて default を切り詰めた結果に設定する。
- controlledFrameEmbedderParent を、window の navigable の controlledFrameEmbedderParent とする。 .
-
controlledFrameEmbedderParent が
HTMLControlledFrameElementである場合:- accept および response を、controlledFrameEmbedderParent、 "prompt"、および message を用いて "dialog" イベントを発火する結果とする。
-
accept が
falseと等しい場合、null を返す。 - response を返す。
window open steps について:
-
windowOpenDisposition を "
ignore" とする。 - controlledFrameEmbedderParent を、sourceDocument の node navigable の controlledFrameEmbedderParent とする。
...
-
targetNavigable が null である場合:
-
controlledFrameEmbedderParent が null でない場合:
- controlledFrameEmbedderParent、url、 target、targetNavigable、および windowOpenDisposition を用いて "newwindow" イベントを発火する。
- null を返す。
-
controlledFrameEmbedderParent が null でない場合:
-
windowType が "new and unrestricted" または "new with no opener" のいずれかである場合:
-
windowOpenDisposition を、
"
new_background_tab"、 "new_foreground_tab"、または "new_window" のいずれかに設定する。
注: 値はユーザーエージェントがサポートする挙動と ユーザー設定に依存する。
-
targetNavigable のアクティブ閲覧コンテキストの is popup を、 tokenizedFeatures を与えてポップアップウィンドウが要求されているかを確認した結果に設定する。
-
targetNavigable の アクティブ閲覧コンテキストの is popup
が
trueである場合、windowOpenDisposition を "new_popup" に設定する。
...
-
windowOpenDisposition を、
"
-
それ以外の場合:
-
windowOpenDisposition を
"
current_tab" に設定する。
...
-
windowOpenDisposition を
"
注: 手順 15 および 16 も
targetNavigable をナビゲートする。ナビゲーション中に、
windowOpenDisposition も更新される可能性がある。たとえば、ナビゲーションが
阻止された場合、windowOpenDisposition は
"ignore"
に設定される可能性がある。
ナビゲーション応答が download になった場合、windowOpenDisposition は
"save_to_disk"
に設定される可能性がある。
-
controlledFrameEmbedderParent が null でない場合:
- controlledFrameEmbedderParent、url、 target、targetNavigable、および windowOpenDisposition を用いて "newwindow" イベントを発火する。
completely finish loading について:
-
それ以外で container が非 null である場合、container を与えて DOM 操作タスクソースに 要素タスクをキューに入れ、container で load という名前のイベントを発火する。
- controlledFrameEmbedderParent を、document の node navigable の controlledFrameEmbedderParent とする。
-
controlledFrameEmbedderParent が
HTMLControlledFrameElementである場合、 controlledFrameEmbedderParent を用いて "contentload" イベントを発火する。
loadstart、loadabort、および loadcommit のモンキーパッチは次のようになる:
-
loadstart -> ナビゲーションの入口点: 通常のナビゲーション、再読み込み、traversal。
-
loadcommit -> 共通のナビゲーション完了点。
-
loadabort -> loadstart と loadcommit の間にあるアルゴリズムの各早期終了点。
これらのそれぞれについて、navigable の top-level traversable が、HTMLControlledFrameElement
の controlledFrameEmbedderParent
を持つかどうかを確認し、
持つ場合は、入力引数を用いて対応するイベントを発火する。
3.7.13.2. [FETCH]
HTTP fetch(loadredirect)について:
-
internalResponse の status がリダイレクトステータスである場合:
-
request の window window が、環境設定オブジェクトであり、その グローバルオブジェクトが
Windowオブジェクトである場合:- currentNavigable を、window に関連付けられた navigable とする。
- controlledFrameEmbedderParent を、currentNavigable の top-level traversable の controlledFrameEmbedderParent とする。
-
controlledFrameEmbedderParent が
HTMLControlledFrameElementである場合:1. oldUrl を、request に関連付けられた URL とする。
1. newUrl を、response の location url とする。
1. isTopLevel を
falseとし、currentNavigable が null の parent を持つ場合は isTopLevel をtrueに設定する。1. controlledFrameEmbedderParent、oldUrl、newUrl、 および isTopLevel を用いて "loadredirect" イベントを発火する。
-
request の window window が、環境設定オブジェクトであり、その グローバルオブジェクトが
3.7.13.3. [Permissions]
新しいアルゴリズムを定義する:
Document document が、 DOMString permission、省略可能な辞書 options、および boolean を取るアルゴリズム completionSteps を与えられて、 permission を使用することを埋め込み元に許可されている かどうかを判定するには、次の手順を実行する:
-
controlledFrameEmbedderParent を、document の node navigable の controlledFrameEmbedderParent とする。
-
controlledFrameEmbedderParent が
HTMLControlledFrameElementでない場合、trueを返す。 -
document、 controlledFrameEmbedderParent、permission、document の URL、options、および completionSteps を用いて "permissionrequest" イベントを発火する。
request a position(geolocation)について:
-
document が "geolocation" 機能の使用を許可されていない場合:
-
watchId が渡されていた場合、watchIDs から watchId を削除する。
-
errorCallback および PERMISSION_DENIED を渡して error でコールバックする。
-
このアルゴリズムを終了する。
-
-
blockedByEmbedder を
falseとする。 - document が "geolocation" 機能を埋め込み元に使用を許可されているかを、 その boolean 引数を blockedByEmbedder に代入し、これらの手順の残りを続行するアルゴリズムを与えて確認する。
-
blockedByEmbedder が
trueである場合:- watchId が渡されていた場合、watchIDs から watchId を削除する。
- errorCallback および PERMISSION_DENIED を渡して error でコールバックする。
- このアルゴリズムを終了する。
- controlledFrameEmbedderParent を、document の node navigable の controlledFrameEmbedderParent とする。
-
controlledFrameEmbedderParent が
HTMLControlledFrameElementである場合:-
nodeDocument を controlledFrameEmbedderParent の node document とする。
-
nodeDocument が null である場合:
- watchId が渡されていた場合、watchIDs から watchId を削除する。
- errorCallback および PERMISSION_DENIED を渡して error でコールバックする。
- このアルゴリズムを終了する。
- embedderNavigator を、nodeDocument の グローバルオブジェクトの 関連 Navigator とする。
-
embedderGeolocation を、embedderNavigator の
geolocationとする。 - embedderGeolocation、successCallback、errorCallback、 options、および whatchId を用いて request a position した結果を返す。
-
注: 他の permission も geolocation と同様に モンキーパッチされる。しかし簡潔さのため、この文書では詳細は省略されている。
3.7.13.4. [Console]
Logger について:
-
それ以外の場合、Printer(logLevel, Formatter(args)) を実行する。
- logLevel および Formatter(args) を用いて "consolemessage" イベントを発火する。
注: Console は既定では document との関連付けを持たないため、
関連付けられた HTMLControlledFrameElement
を追跡できない。
3.8. 他の仕様との統合
この仕様は、Controlled Frame のニーズに対応するため、仕様にいくつかの変更を加える。
3.8.1. モンキーパッチ
3.8.1.1. [HTML]
各 navigable は次を持つ:
-
frameId 整数。初期値は 0 である。
-
next frameId 整数。初期値は 1 である。
-
controlledFrameEmbedderParent。これは
HTMLControlledFrameElementまたは null である。
initialize the navigable アルゴリズムは、navigable navigable および省略可能な navigable-or-null parent(既定値 null)を与えられたとき、 次のようにモンキーパッチされる:
-
navigable の parent を parent に設定する。
-
parent が null でない(navigable が
top-level traversable でない)場合:
- topLevelTraversable を、 navigable が子孫である top-level traversable とする。
- navigable の frameId を topLevelTraversable の next frameId に設定する。
- topLevelTraversable の next frameId をインクリメントする。
Document
document を
readinessValue にする
update the current document readiness
アルゴリズムは、次のようにモンキーパッチされる:
-
runAt を、
readinessValue に次のマッピングを適用した結果とする:
- "
loading" - "
interactive" - "
complete"
- "
- document および runAt を与えて コンテンツスクリプトを文書に注入する。
-
document で
readystatechangeという名前のイベントを発火する。
3.8.1.2. [FETCH]
determine the network partition key アルゴリズムは、 Controlled Frame の 埋め込まれた navigable に由来する ネットワークリクエストについて double-keying を要求するように モンキー拡張される。
-
topLevelOrigin を与えて site を取得する結果を topLevelSite とする。
-
secondKey を null
または実装定義の値とする。 - controlledFrameEmbedderParent を、environment を与えて environment の controlledFrameEmbedderParent を取得する結果とする。
-
controlledFrameEmbedderParent が null でない場合、secondKey を、
controlledFrameEmbedderParent の
関連設定オブジェクトの
トップレベルオリジンと、
controlledFrameEmbedderParent の
partitionからなる タプルに設定する。 -
(topLevelSite, secondKey) を返す。
3.8.1.3. [STORAGE]
ストレージキーは次のように再定義される:
storage key は、
embedding origin(origin または null)、
partition(DOMString
または null)、および
origin(origin)からなる
タプル
である。
注: この定義は、storage partitioning が完全に仕様化された後、 将来的に origin に加えて埋め込まれたコンテンツの トップレベルオリジンを含むように拡張する必要がある。
注: Controlled Frame データは、それを所有するトップレベル文書ではなく、 Controlled Frame 要素を所有する文書の origin によって triple keyed される。
obtain a storage key for non-storage
purposes アルゴリズムは、
controlledframe
の
埋め込まれた navigable に属するすべてのストレージについて
double-keying を要求するように拡張される。
-
environment が環境設定オブジェクトである場合は environment の origin を、 それ以外の場合は environment の creation URL の origin を、 origin とする。
-
origin からなる タプルを返す。 - topLevelOrigin および partition を null とする。
- controlledFrameEmbedderParent を、environment を与えて environment の controlledFrameEmbedderParent を取得する結果とする。
-
controlledFrameEmbedderParent が null でない場合:
- topLevelOrigin を、 controlledFrameEmbedderParent の 関連設定オブジェクトの トップレベルオリジンに設定する。
-
partition を controlledFrameEmbedderParent の
partitionに設定する。
- topLevelOrigin、partition、 および origin からなる タプルを返す。
-
environment が環境設定オブジェクトであり、その グローバルオブジェクトが
Windowオブジェクトである場合:このアルゴリズムは、 Shared Worker または Service Worker では機能しない。なぜなら controlledFrameEmbedderParent は navigable 上でのみ定義されており、 非
Windowの environment から navigable へ到達することが常に可能とは限らないためである。-
navigable を、environment の グローバルオブジェクトの navigable とする。
-
top を navigable の top-level traversable とする。
-
top の controlledFrameEmbedderParent が null でない場合、top の controlledFrameEmbedderParent を返す。
-
-
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 = "none";includeHeaders 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。これは
WebRequestInterceptorの リストであり、 初期値は «» である。
注: Interceptors は、
controlledframe
要素のイベントループ上のタスクから書き込まれるが、fetch 中には
並列に読み取られる。
適用可能な WebRequestInterceptors のスナップショットは、
WebRequest イベントを dispatch する前に作成される。
イベントの処理中に WebRequestInterceptor
上に登録されたイベントリスナーは、そのイベントでは発火されない。
各 WebRequestInterceptor
は、関連付けられた次のものを持つ:
-
urlPatterns。これは
URLPatternの リストである。 -
resourceTypes。これは
ResourceTypeの リスト である。 -
blocking。これは boolean である。
-
includeRequestBody。これは boolean である。
-
includeHeaders。これは
RequestedHeadersである。 -
securityInfo。これは boolean である。
-
securityInfoRawDer。これは boolean である。
各 UploadData
は、関連付けられた次のものを持つ:
各 RequestBody
は、関連付けられた次のものを持つ:
各 WebRequestRequest
は、関連付けられた次のものを持つ:
-
method。これは
DOMStringである。 -
id。これは
DOMStringである。 -
type。これは
ResourceTypeである。 -
url。これは
USVStringである。 -
initiator。これは
USVStringまたは null である。 -
headers。これは
Headersまたは null であり、初期値は null である。 -
body。これは
RequestBodyまたは null であり、初期値は null である。
各 AuthChallenger
は、関連付けられた次のものを持つ:
各 WebRequestAuthDetails
は、関連付けられた次のものを持つ:
各 WebRequestResponse
は、関連付けられた次のものを持つ:
-
statusCode。これは
longである。statusCodegetter 手順は、 this の statusCode を返すことである。 -
statusLine。これは
DOMStringである。statusLinegetter 手順は、 this の statusLine を返すことである。 -
fromCache。これは boolean である。
-
headers。これは
Headersまたは null であり、初期値は null である。 -
ip。これは
DOMStringまたは null である。 -
redirectURL。これは
USVStringまたは null であり、初期値は null である。redirectURLgetter 手順は、 this の redirectURL を返すことである。 -
auth。これは
WebRequestAuthDetailsまたは null であり、初期値は null である。
各 WebRequestEvent
は、関連付けられた次のものを持つ:
-
request。これは
WebRequestRequestである。 -
frameId。これは
longである。 -
frameType。これは
FrameTypeまたは null であり、初期値は null である。 -
documentId。これは
DOMStringまたは null であり、初期値は null である。documentIdgetter 手順は、 this の documentId を返すことである。 -
documentLifecycle。これは
DocumentLifecycleまたは null であり、 初期値は null である。documentLifecyclegetter 手順は、 this の documentLifecycle を返すことである。 -
parentDocumentId。これは
DOMStringまたは null であり、初期値は null である。parentDocumentIdgetter 手順は、 this の parentDocumentId を返すことである。 -
parentFrameId。これは
longまたは null であり、初期値は null である。parentFrameIdgetter 手順は、 this の parentFrameId を返すことである。
各 WebRequestAuthRequiredEvent
は、関連付けられた次のものを持つ:
-
response。これは
WebRequestResponseである。
各 WebRequestBeforeRedirectEvent
は、関連付けられた次のものを持つ:
-
response。これは
WebRequestResponseである。
各 WebRequestCompletedEvent
は、関連付けられた次のものを持つ:
-
response。これは
WebRequestResponseである。
各 WebRequestErrorOccurredEvent
は、関連付けられた次のものを持つ:
各 WebRequestHeadersReceivedEvent
は、関連付けられた次のものを持つ:
-
response。これは
WebRequestResponseである。 -
securityInfo。これは
SecurityInfoである。securityInfogetter 手順は、 this の securityInfo を返すことである。
各 WebRequestResponseStartedEvent
は、関連付けられた次のものを持つ:
-
response。これは
WebRequestResponseである。
createWebRequestInterceptor(options)
メソッド手順は次の通りである:
-
interceptor を新しい
WebRequestInterceptorオブジェクトとする。 -
interceptor に次のフィールドを設定する:
- resourceTypes
-
options["
resourceTypes"] - blocking
-
options["
blocking"] - includeRequestBody
-
options["
includeRequestBody"] - includeHeaders
-
options["
includeHeaders"] - securityInfo
-
options["
securityInfo"] - securityInfoRawDer
-
options["
securityInfoRawDer"]
-
options["
urlPatterns"] 内の各 urlPattern について 反復する:-
urlPattern が
URLPatternである場合、urlPattern を interceptor の urlPatterns に 追加する。 -
それ以外の場合、urlPattern を与えて新しい
URLPatternを作成し、それを interceptor の urlPatterns に 追加する。
-
-
interceptor を this の interceptors に 追加する。
-
interceptor を返す。
WebRequestInterceptor
を取得するには、次の手順を実行する:
-
client を request の client とする。
-
client が null である場合、空のリストおよび
falseを返す。 -
window を、client を与えて 環境設定オブジェクトの所有 Window を取得した結果とする。
-
window が null である場合、空のリストおよび
falseを返す。 -
navigable を window の navigable とする。
-
navigable またはその controlledFrameEmbedderParent が null である場合、空のリスト および
falseを返す。 -
controlledFrame を navigable の controlledFrameEmbedderParent とする。
-
applicableInterceptors を空のリストとする。
-
controlledFrame の request の interceptors 内の各 interceptor について:
-
request が interceptor によって intercepted されるべきでない場合、続行する。
-
interceptor を applicableInterceptors に 追加する。
-
-
applicableInterceptors を返す。
WebRequestInterceptor
によって
intercepted されるべきかを判定するには、
次の手順を実行する:
-
types を interceptor の resourceTypes とする。
-
types が空でなく、 かつ request を与えて request の ResourceType を取得する結果を types が含まない場合、
falseを返す。 -
urlPatterns を interceptor の urlPatterns とする。
-
urlPatterns 内の各 urlPattern について:
-
request の URL が urlPattern を与えて URLPattern に一致する 場合、
trueを返す。
-
-
falseを返す。
Window
を取得するには、次の手順を実行する:
-
global を environment の グローバルオブジェクトとする。
-
global が
Windowオブジェクトである場合、global を返す。 -
global が
DedicatedWorkerGlobalScopeオブジェクトである場合:-
owner を global とする。
-
owner が
DedicatedWorkerGlobalScopeオブジェクトである間:-
owner を owner の owner set[0] とする。
-
-
owner が
Documentオブジェクトである場合、owner の 関連グローバルオブジェクト を返す。
-
-
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
は、関連付けられた次のものを持つ:
-
cancel。これは boolean であり、初期値は
falseである。 -
authCredentials。これは
Promise<WebRequestAuthCredentials> または null であり、初期値は null である。 -
options。これは
WebRequestAuthOptionsであり、初期値は «» である。
WebRequestAuthRequiredEvent
の
setCredentials(credentials, options)
メソッド手順は次の通りである:
-
this の authCredentials を credentials に設定する。
各 WebRequestBeforeRequestEvent
は、関連付けられた次のものを持つ:
WebRequestBeforeRequestEvent
の
redirect(redirectURL)
メソッド手順は、this の
redirectURL
を redirectURL に設定することである。
各 WebRequestBeforeSendHeadersEvent
は、関連付けられた次のものを持つ:
WebRequestBeforeSendHeadersEvent
の
setRequestHeaders(requestHeaders)
メソッド手順は、this の
requestHeaders を
requestHeaders に設定することである。
各 WebRequestHeadersReceivedEvent
は、関連付けられた次のものを持つ:
WebRequestHeadersReceivedEvent
の
redirect(redirectURL)
メソッド手順は、this の
redirectURL を redirectURL
に設定することである。
WebRequestHeadersReceivedEvent
の
setResponseHeaders(responseHeaders)
メソッド手順は、this の
responseHeaders を
responseHeaders に設定することである。
WebRequestEvent result は、次の 項目を持つ構造体である:
- cancel
-
boolean。初期値は
false - redirectURL
-
USVString。 初期値は "" - authCredentials
-
WebRequestAuthCredentialsまたは null。初期値は null - requestHeaders
-
header list。初期値は «»
- responseHeaders
-
header list。初期値は «»
-
interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。
-
result を WebRequestEvent result とする。
-
pendingHandlerCount を 0 とする。
-
controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。
-
controlledFrameEmbedderGlobal が null である場合、戻る。
-
interceptors 内の各 interceptor について:
-
interceptor の blocking が
trueの場合、 pendingHandlerCount をインクリメントする。 -
controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:
-
event を、 beforerequest という名前の 新しい
WebRequestBeforeRequestEventとする。 -
event、request、および "
none" を与えて WebRequestEvent に値を設定する。 -
interceptor の includeRequestBody が
trueであり、かつ request の body が null でない場合:-
requestBody を新しい
RequestBodyとする。 -
body を request の body とする。
TODO: body の stream が存在する場合、それを直列化する。
-
body の source で分岐する:
- byte sequence
-
直列化された body の source と等しい bytes を持つ 新しい
UploadDataを requestBody の raw に 追加する。 Blob-
直列化された body の source と等しい bytes を持つ 新しい
UploadDataを requestBody の raw に 追加する。 FormData-
-
formData を «[]» とする。
-
body の source の entry list 内の各 entry について 反復する:
-
entry[1] で分岐する:
-
-
requestBody の formData を formData に設定する。
-
-
-
event を interceptor に dispatch する。
-
event の redirectURL が null でなく、かつ result の redirectURL が "" である場合、 result の redirectURL を event の redirectURL に設定する。
-
interceptor の blocking が
trueである場合、 pendingHandlerCount をデクリメントする。
-
-
-
pendingHandlerCount > 0 である場合、 pendingHandlerCount が 0 と等しくなるまで 並列に待機し、その後 グローバルタスクをキューに入れ、 それらの手順が並列に移行する前にどのように実行されていたかに応じて、 request の client の グローバルオブジェクトの ネットワーキングタスクソース、またはこれらの手順が 最初に呼び出された 並列コンテキストのいずれかで、 このアルゴリズムの残りの手順を続行させる。
-
result を返す。
-
interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。
-
result を WebRequestEvent result とする。
-
pendingHandlerCount を 0 とする。
-
controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。
-
controlledFrameEmbedderGlobal が null である場合、戻る。
-
interceptors 内の各 interceptor について:
-
interceptor の blocking が
trueの場合、 pendingHandlerCount をインクリメントする。 -
controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:
-
event を、 beforesendheaders という名前の 新しい
WebRequestBeforeSendHeadersEventとする。 -
event、request、および interceptor の includeHeaders を与えて WebRequestEvent に値を設定する。
-
event を interceptor に dispatch する。
-
event の requestHeaders が null でない場合:
-
result の requestHeaders が null である場合、それを新しい
Headersに設定する。 -
event の requestHeaders 内の各 header について:
-
header を result の requestHeaders に 追加する。
-
-
-
interceptor の blocking が
trueである場合、 pendingHandlerCount をデクリメントする。
-
-
-
pendingHandlerCount > 0 である場合、 pendingHandlerCount が 0 と等しくなるまで 並列に待機し、その後 グローバルタスクをキューに入れ、 それらの手順が並列に移行する前にどのように実行されていたかに応じて、 request の client の グローバルオブジェクトの ネットワーキングタスクソース、またはこれらの手順が 最初に呼び出された 並列コンテキストのいずれかで、 このアルゴリズムの残りの手順を続行させる。
-
result を返す。
-
interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。
-
controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。
-
controlledFrameEmbedderGlobal が null である場合、戻る。
-
interceptors 内の各 interceptor について:
-
controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:
-
event を、 sendheaders という名前の 新しい
WebRequestSendHeadersEventとする。 -
event、request、および interceptor の includeHeaders を与えて WebRequestEvent に値を設定する。
-
event を interceptor に dispatch する。
-
-
-
interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。
-
result を WebRequestEvent result とする。
-
pendingHandlerCount を interceptor の サイズとする。
-
controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。
-
controlledFrameEmbedderGlobal が null である場合、戻る。
-
interceptors 内の各 interceptor について:
-
interceptor の blocking が
trueの場合、 pendingHandlerCount をインクリメントする。 -
controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:
-
event を、 headersreceived という名前の 新しい
WebRequestHeadersReceivedEventとする。 -
event、request、および "
none" を与えて WebRequestEvent に値を設定する。 -
event の response を、 request、 response、および interceptor の includeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。
-
interceptor の securityInfo が
trueである、または interceptor の securityInfoRawDer がtrueである場合:-
info を、response および interceptor の securityInfoRawDer を与えて security info を取得する結果とする。
-
event の securityInfo を info に設定する。
-
-
event を interceptor に dispatch する。
-
event の redirectURL が null でなく、かつ result の redirectURL が "" である場合、 result の redirectURL を event の redirectURL に設定する。
-
event の responseHeaders が null でない場合:
-
result の responseHeaders が null である場合、それを新しい
Headersに設定する。 -
event の responseHeaders 内の各 header について:
-
header を result の responseHeaders に 追加する。
-
-
-
interceptor の blocking が
trueである場合、 pendingHandlerCount をデクリメントする。
-
-
-
pendingHandlerCount > 0 である場合、 pendingHandlerCount が 0 と等しくなるまで 並列に待機し、その後 グローバルタスクをキューに入れ、 それらの手順が並列に移行する前にどのように実行されていたかに応じて、 request の client の グローバルオブジェクトの ネットワーキングタスクソース、またはこれらの手順が 最初に呼び出された 並列コンテキストのいずれかで、 このアルゴリズムの残りの手順を続行させる。
-
result を返す。
-
challenger を、response の URL の host および port と等しい host および port を持つ 新しい
AuthChallengerとする。 -
response の status が 401 である場合:
-
それ以外の場合:
-
scheme が null である場合、null を返す。
-
interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。
-
result を WebRequestEvent result とする。
-
pendingHandlerCount を 0 とする。
-
controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。
-
controlledFrameEmbedderGlobal が null である場合、戻る。
-
interceptors 内の各 interceptor について:
-
interceptor の blocking が
trueの場合、 pendingHandlerCount をインクリメントする。 -
controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:
-
event を、 authrequired という名前の 新しい
WebRequestAuthRequiredEventとする。 -
event、request、および "
none" を与えて WebRequestEvent に値を設定する。 -
event の response を、 request、 response、および interceptor の includeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。
-
event の response の auth を、challenger、 isProxy、 scheme、および realm フィールドがそれぞれ challenger、isProxy、scheme、および realm の値を持つ 新しい
WebRequestAuthDetailsに設定する。 -
event を interceptor に dispatch する。
-
credentials を event の authCredentials とする。
-
それ以外で、credentials が
Promiseである場合:-
done を
falseとする。 -
signal が
AbortSignalである場合、次の abort アルゴリズムを signal に 追加する:-
result の cancel を
trueに設定する。 -
done を
trueに設定する。
-
-
credentials の 充足時に、 resolvedValue を取る次の手順を実行する:
-
resolvedValue が、"username" および "password" と等しい 2 つのキーを 含む dictionary であり、かつ result の authCredentials が undefined である場合、result の authCredentials を resolvedValue に設定する。
-
done を
trueに設定する。
-
-
credentials の 拒否時に、次の手順を実行する:
-
done を
trueに設定する。
注: 拒否された promise はリクエストをキャンセルしないが、サーバーには 資格情報が提供されない。
-
-
done が
trueと等しくなるまで 並列に待機し、その後 controlledFrameEmbedderGlobal の DOM 操作タスク ソースに グローバルタスクをキューに入れ、 このアルゴリズムの残りの手順を続行させる。
-
interceptor の blocking が
trueである場合、 pendingHandlerCount をデクリメントする。
-
-
-
pendingHandlerCount > 0 である場合、 pendingHandlerCount が 0 と等しくなるまで 並列に待機し、その後 グローバルタスクをキューに入れ、 それらの手順が並列に移行する前にどのように実行されていたかに応じて、 request の client の グローバルオブジェクトの ネットワーキングタスクソース、またはこれらの手順が 最初に呼び出された 並列コンテキストのいずれかで、 このアルゴリズムの残りの手順を続行させる。
-
result を返す。
-
interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。
-
controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。
-
controlledFrameEmbedderGlobal が null である場合、戻る。
-
interceptors 内の各 interceptor について:
-
controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:
-
event を、 beforeredirect という名前の 新しい
WebRequestBeforeRedirectEventとする。 -
event、request、および "
none" を与えて WebRequestEvent に値を設定する。 -
event の response を、 request、 response、および interceptor の includeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。
-
internalResponse を、response が filtered response でない場合は response とし、それ以外の場合は response の internal response とする。
-
event の response の redirectURL を、 request の current URL の fragment を与えた internalResponse の location URL に設定する。
-
event を interceptor に dispatch する。
-
-
-
interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。
-
controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。
-
controlledFrameEmbedderGlobal が null である場合、戻る。
-
interceptors 内の各 interceptor について:
-
controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:
-
event を、 responsestarted という名前の 新しい
WebRequestResponseStartedEventとする。 -
event、request、および "
none" を与えて WebRequestEvent に値を設定する。 -
event の response を、 request、 response、および interceptor の includeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。
-
event を interceptor に dispatch する。
-
-
-
interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。
-
controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。
-
controlledFrameEmbedderGlobal が null である場合、戻る。
-
interceptors 内の各 interceptor について:
-
controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:
-
event を、 completed という名前の 新しい
WebRequestCompletedEventとする。 -
event、request、および "
none" を与えて WebRequestEvent に値を設定する。 -
event の response を、 request、 response、および interceptor の includeHeaders を与えて WebRequestResponse オブジェクトを作成する結果に設定する。
-
event を interceptor に dispatch する。
-
-
-
interceptors を、request の 適用可能な WebRequestInterceptors を取得した結果とする。
-
controlledFrameEmbedderGlobal を、 request の client を与えて environment の controlledFrameEmbedderParent を取得する結果の 関連グローバルオブジェクトとする。
-
controlledFrameEmbedderGlobal が null である場合、戻る。
-
interceptors 内の各 interceptor について:
-
controlledFrameEmbedderGlobal の DOM 操作タスクソースに グローバルタスクをキューに入れ、次の手順を実行させる:
-
event を、 erroroccurred という名前の 新しい
WebRequestErrorOccurredEventとする。 -
event、request、および "
none" を与えて WebRequestEvent に値を設定する。 -
event を interceptor に dispatch する。
-
-
WebRequestEvent
event、request request、および RequestedHeaders
requestedHeaders を与えて、
WebRequestEvent
に値を設定するには、
次の手順を実行する:
-
environmentSettingsObject を request の client とする。
-
event に次のフィールドを設定する:
- frameId
-
-1
-
window を、environmentSettingsObject を与えて 環境設定オブジェクトの所有 Window とする。
-
window が null でない場合:
-
event の次のフィールドを更新する:
- documentId
-
environmentSettingsObject の id。
- documentLifecycle
-
window の 関連付けられた文書を与えて Document の DocumentLifecycle を取得する結果。
- frameId
- frameType
-
window の 閲覧コンテキストの fenced frame config instance が null でない場合は
"fenced-frame"、 parentNavigable が null である場合は"outermost-frame"、 それ以外の場合は"sub-frame"。
-
parentNavigable が null でない場合、event の 次の値を更新する:
- parentDocumentId
-
parentNavigable の アクティブ文書の 関連グローバルオブジェクトの id。
- parentFrameId
-
parentNavigable の frameId。
-
event の request を、次のフィールドを持つ 新しい
WebRequestRequestに設定する: -
requestedHeaders が "
none" でない場合、 event の request の headers を、request の header list、requestedHeaders、およびtrueと等しい isRequest を与えて header list を Headers オブジェクトに変換することを呼び出した結果に設定する。
Document
の DocumentLifecycle
を取得するには、
次の手順を実行する:
-
document の unload counter > 0 である場合、"
pending-deletion" を返す。 -
document の node navigable が非 null であり、かつ prerendering navigable である場合、"
prerender" を返す。 -
document が salvageable であり、かつその page showing を持たない場合、 "
cached" を返す。 -
"
active" を返す。
RequestedHeaders
requestedHeaders を与えて、
WebRequestResponse
オブジェクトを作成するには、次の手順を実行する:
-
response を、次のフィールドを持つ 新しい
WebRequestResponseとする:- statusCode
-
response の status。
- statusLine
-
response の status message。
- fromCache
-
response の cache state が "local" である場合は
true、 それ以外の場合はfalse。 - ip
-
リクエストにネットワークリクエストが含まれていた場合に、 response が受信された元の ip address。
[FETCH] 仕様は現在、 request の送信時に使用されたリモート IP アドレスの格納を指定していない。
-
requestedHeaders が "
none" でない場合、 response の headers を、 response の header list、requestedHeaders、およびfalseと等しい isRequest を与えて header list を Headers オブジェクトに変換することを呼び出した結果に設定する。 -
response を返す。
-
info を 新しい
SecurityInfoとする。 -
scheme が "http" または "ws" である場合:
-
info["
state"] を "secure" に設定する。注: ブラウザーは通常、証明書エラー時に 接続を中断する。ユーザーが明示的に許可した場合、state は代わりに "
broken" に設定される可能性がある。 -
leafCert を、response に関連付けられたサーバーの X.509 証明書 ([RFC5280] で定義される)とする。
-
derBytes を、leafCert を DER エンコードした結果 ([X.690] で定義される)とする。
-
certInfo を 新しい
CertificateInfoとする。 -
fingerprint を 新しい
Fingerprintとする。 -
fingerprint 文字列を計算する:
-
certInfo["
fingerprint"] を fingerprint に設定する。 -
includeRawDER が
trueである場合:-
arrayBuffer を、derBytes から ArrayBuffer を作成する結果とする。
-
certInfo["
rawDER"] を、arrayBuffer を参照する 新しいUint8Arrayオブジェクトに設定する。
-
-
certList を空のリストとする。
-
certInfo を certList に 追加する。
-
info["
certificates"] を certList に設定する。 -
info を返す。
RequestedHeaders
requestedHeaders、
および boolean
isRequest を与えて、
header
list を Headers
オブジェクトに変換するには、次の手順を実行する:
-
fetchHeaders 内の各 fetchHeader について:
-
次の条件がすべて満たされる場合、続行する:
-
isRequest が
trueである -
requestedHeaders が "
cors" である。 -
fetchHeader が CORS-safelisted request-header でない
-
-
次の条件がすべて満たされる場合、続行する:
-
isRequest が
falseである -
requestedHeaders が "
cors" である。 -
fetchHeader[0] が CORS-safelisted response-header name でない
-
-
fetchHeader を headers に 追加する。
-
-
headers を返す。
ResourceType
を取得するには、
次の手順を実行する:
-
request の url の scheme が
"ws"または"wss"と等しい場合、"websocket" を返す。 -
request の initiator が
"fetch"または"xmlhttprequest"と等しい場合、"xmlhttprequest" を返す。 -
request の destination が
"document"と等しい場合、"main-frame" を返す。 -
request の destination が
"frame"または"iframe"と等しい場合、 "sub-frame" を返す。 -
request の destination が
"style"または"xslt"と等しい場合、 "stylesheet" を返す。 -
request の destination が
"script"、"json"、"audioworklet"、"paintworklet"、"serviceworker"、"sharedworker"、 または"worker"と等しい場合、"script" を返す。 -
request の destination が
"image"と等しい場合、"image" を返す。 -
request の destination が
"font"と等しい場合、"font" を返す。 -
request の destination が
"object"または"embed"と等しい場合、 "object" を返す。 -
request の destination が
"audio"、"track"、または"video"と等しい場合、"media" を返す。 -
request の destination が
"report"と等しい場合、"csp-report" を返す。 -
request の destination が
""と等しく、 かつ request の keepalive がtrueである場合、"ping" を返す。 -
"
other" を返す。
DOMString
redirectUrl を与えて、
redirect response
を作成するには、
次のフィールドを持つ
response を返す:
- status
-
301
- header list
-
« ("Location", redirectUrl) »
4.2. モンキーパッチ
4.2.1. Fetch
request は、関連付けられた requestId を持ち、 これは request の作成時にランダムに割り当てられる opaque 文字列である。
main fetch アルゴリズムは、次のようにモンキーパッチされる:
-
request を fetchParams の request とする。
-
response を null とする。
- webRequestResult を、request を与えて beforeRequest イベントを処理することを呼び出した結果とする。
-
webRequestResult が null でない場合:
-
webRequestResult の cancel が
trueである場合、response を network error に設定する。 -
それ以外で、webRequestResult の redirectURL が空でない
DOMStringである場合、response を、 webRequestResult の redirectURL を与えて redirect response を作成する結果に設定する。
-
webRequestResult の cancel が
fetch response handover アルゴリズムは、次のようにモンキーパッチされる:
- response が network error でない場合、fetchParams の request および response を与えて responseStarted イベントを処理することを呼び出す。
-
timingInfo を fetchParams の timing info とする。
⋮
-
fetchParams の process response consume body が非 null である場合:
…
- response が network error でない場合、fetchParams の request および response を与えて completed イベントを処理することを呼び出す。
- それ以外の場合、fetchParams の request および response を与えて errorOccurred イベントを処理することを呼び出す。
HTTP-network-or-cache fetch アルゴリズムは、 次のようにモンキーパッチされる:
-
revalidatingFlag を未設定とする。
- webRequestResult を、request を与えて beforeSendHeaders イベントを処理することを呼び出した結果に設定する。
-
webRequestResult が null でない場合:
-
webRequestResult の cancel が
trueである場合、response を network error に設定する。 - それ以外で、webRequestResult の requestHeaders が空でない リストである場合、request の header list を webRequestResult の requestHeaders の header list に設定する。
-
webRequestResult の cancel が
-
response が null でない場合、
これらの手順を実行する。ただし、
fetchParams がキャンセルされた場合は中止する:
⋮
-
中止された場合、fetchParams に対する適切な network error を返す。
-
response が null である場合:
-
httpRequest の cache mode が "
only-if-cached" である場合、network error を返す。 - request を与えて sendHeaders イベントを処理することを呼び出す。
-
forwardResponse を、httpFetchParams、includeCredentials、および isNewConnectionFetch を与えて HTTP-network fetch を実行した結果とする。
- webRequestResult を、forwardResponse が network error でない場合は request および forwardResponse を与えて headersReceived イベントを処理することを呼び出した結果、 それ以外の場合は null とする。
-
webRequestResult が null でない場合:
-
webRequestResult の cancel が
trueである場合、response を network error に設定する。 -
それ以外で、webRequestResult の
redirectURL が空でない
DOMStringである場合、forwardResponse を、 webRequestResult の redirectURL を与えて redirect response を作成する結果に設定する。 - それ以外で、webRequestResult の responseHeaders が空でない リストである場合、forwardResponse の header list を webRequestResult の responseHeaders の header list に設定する。
-
webRequestResult の cancel が
-
⋮
-
response の status が 401 であり、httpRequest の response tainting が "cors" でなく、includeCredentials が
trueであり、かつ request の window が environment settings object である場合:⋮
-
request の use-URL-credentials flag が未設定であるか、 isAuthenticationFetch が
trueである場合:-
fetchParams がキャンセルされた場合、fetchParams に対する適切な network error を返す。
-
username および password を null とする。
- webRequestResult を、request および response を与えて authRequired イベントを処理することを 呼び出した結果とする。
-
webRequestResult が null でない場合:
-
webRequestResult の cancel
が
trueである場合、response を network error に設定する。 -
それ以外で、webRequestResult の authCredentials
が
objectである場合:-
username を webRequestResult の
authCredentials["
username"] に設定する。 -
password を webRequestResult の
authCredentials["
password"] に設定する。
-
username を webRequestResult の
authCredentials["
-
webRequestResult の cancel
が
- username および password が null である場合、それらを request の window でエンドユーザーにユーザー名とパスワードを それぞれ入力させた結果に設定する。
-
-
-
response の status が 407 である場合:
- webRequestResult を、request および response を与えて authRequired イベントを処理することを呼び出した結果とする。
-
webRequestResult が null でない場合:
-
webRequestResult の cancel が
trueである場合、response を network error に設定する。 -
それ以外で、webRequestResult の authCredentials が
objectである場合:- webRequestResult の authCredentials を proxy-authentication entry として保存する。
-
webRequestResult の cancel が
- それ以外の場合、 適切にエンドユーザーに入力を求める ...
HTTP-redirect fetch アルゴリズムは、次のようにモンキーパッチされる:
- request および response を与えて beforeRedirect イベントを処理することを呼び出す。
-
request を fetchParams の request とする。
5. コンテキストメニュー API
enum {ContextType ,"all" ,"page" ,"frame" ,"selection" ,"link" ,"editable" ,"image" ,"video" , };"audio" enum {ItemType ,"normal" ,"checkbox" ,"radio" , };"separator" dictionary {ContextMenusProperties boolean ;checked sequence <ContextType >;contexts sequence <(URLPattern or URLPatternInput )>;documentURLPatterns boolean ;enabled DOMString ;parentId sequence <(URLPattern or URLPatternInput )>;targetURLPatterns DOMString ;title ItemType ; };type dictionary :ContextMenusCreateProperties ContextMenusProperties {required DOMString ; }; [id Exposed =Window ,IsolatedContext ]interface :ContextMenus EventTarget {Promise <undefined >create (ContextMenusCreateProperties );properties Promise <undefined >remove (DOMString );id Promise <undefined >removeAll ();Promise <undefined >update (DOMString ,id optional ContextMenusProperties = {});properties attribute EventHandler onclick ;attribute EventHandler onshow ; }; [Exposed =Window ,IsolatedContext ]interface {MenuItemDetails readonly attribute DOMString ;id readonly attribute DOMString ?;parentMenuId readonly attribute boolean ?;checked readonly attribute boolean ?; }; [wasChecked Exposed =Window ,IsolatedContext ]interface :ContextMenusClickEvent Event {readonly attribute MenuItemDetails ; // コンテキストメニューが開かれたフレームについての詳細。menuItem readonly attribute long ;frameId readonly attribute USVString ;frameURL readonly attribute USVString ; // コンテキストメニューが開かれた文脈内の要素についての詳細。pageURL readonly attribute boolean ;editable readonly attribute USVString ?;linkURL readonly attribute DOMString ?;mediaType readonly attribute DOMString ?;selectionText readonly attribute USVString ?; };srcURL
各
controlledframe
は contextMenus
メンバーを持ち、これは ContextMenus
である。
各 ContextMenus
は、
context menu map を管理し、
その キーはメニュー項目 ID を表す
DOMString
であり、
その 値は
ContextMenusProperties
である。
context menu map の各 entry は、context menu item を表す。 context menu item は、context menu 内のエントリを表す。各 context menu item は、関連付けられた次のものを持つ:
-
id。これは、context menu item が対応する context menu map entry の key である。
-
properties。これは、context menu item が対応する context menu map entry の value である。
-
menu。これは、context menu item が属する context menu である。
context menu は、context menu
items をユーザーに表示できる
実装定義のインターフェイスを表す。
各 context
menu は、関連付けられた
context element を持つ。これは、context menu
がその文脈内で開かれた HTMLElement
である。
context menu item item は、
item を与えて context menu item
が表示されるかどうかを判定する結果が
true を返す場合、実装定義のアクションの結果としてユーザーに表示されるべきである。
注: この API の意図は、文脈依存の追加アクションを ユーザーに公開することである。デスクトッププラットフォームでは、これは Controlled Frame 内のコンテンツを右クリックすることでアクセスされる コンテキストメニュー内のエントリという形式を取る可能性があり、モバイルデバイスでは Controlled Frame 内の項目を長押しすることでアクセスされる可能性がある。 これらの例では、context menu の context element は、ユーザーが右クリックまたは長押しした要素になる。
context menu map の
値、すなわち
ContextMenusProperties
オブジェクトは、
context menu items が表示される条件、および項目の
機能と挙動を制御する。
ContextMenusProperties
は次のフィールドを持つ:
contexts-
異なる
ContextTypeの リスト。 それが空でない場合、 context menu を開くためにクリックされた要素が リストの 項目のいずれかと等しくない限り、 context menu item は表示されない。 それが空である場合、このチェックは無視される。 documentURLPatterns-
URLPatternまたはURLPatternInputの リスト。 それが 空でない場合、埋め込まれた文書の URL が、 リストの 項目のいずれかによって URLPattern に一致する場合を除き、 context menu item は表示されない。それが 空である場合、この チェックは無視される。 targetURLPatterns-
URLPatternまたはURLPatternInputの リスト。 それが 空でない場合、context menu のターゲットの URL が リストの 項目のいずれかによって URLPattern に一致する場合を除き、 context menu item は表示されない。それが 空である場合、このチェックは無視される。
注: Target は img/audio/video タグの "src" 属性および anchor タグの "href" である。
parentId-
親 context menu item の ID。 context menu item は親のサブメニューの下に 表示されることがある。
titletype-
メニュー項目の型。
checked-
typeがcheckboxである場合に、context menu item が初期状態でチェックされているかどうか。 enabled-
context menu item が有効かどうか。
create(properties) メソッド手順は次の通りである:
-
p を新しい promise とする。
-
controlledframe を this とする。
-
p を返し、次の手順を並列に実行する。
-
contextMenusMap を controlledframe の context menu map とする。
-
id を properties["
id"] とする。 -
contextMenusMap[id] が存在する場合、 controlledframe、p、および
TypeErrorを与えて埋め込み元 promise を拒否し、 これらの手順を中止する。 -
contextMenusMap[id] を properties に 設定する。
-
controlledframe および p を与えて 埋め込み元 promise を解決する。
remove(id) メソッド手順は次の通りである:
-
p を新しい promise とする。
-
controlledframe を this とする。
-
p を返し、次の手順を並列に実行する。
-
contextMenusMap を controlledframe の context menu map とする。
-
contextMenusMap[id] を 削除する。
-
controlledframe および p を与えて 埋め込み元 promise を解決する。
removeAll() メソッド手順は次の通りである:
-
p を新しい promise とする。
-
controlledframe を this とする。
-
p を返し、次の手順を並列に実行する。
-
contextMenusMap を controlledframe の context menu map とする。
-
contextMenusMap を クリアする。
-
controlledframe および p を与えて 埋め込み元 promise を解決する。
update(id, properties) メソッド
手順は次の通りである:
-
p を新しい promise とする。
-
controlledframe を this とする。
-
p を返し、次の手順を並列に実行する。
-
contextMenusMap を controlledframe の context menu map とする。
-
contextMenusMap[id] が存在しない場合、 controlledframe、p、および
TypeErrorを与えて埋め込み元 promise を拒否し、 これらの手順を中止する。 -
contextMenusMap[id] を properties に 設定する。
-
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 が表示されるかどうかを判定するには:
-
properties を item の properties とする。
-
element を item の menu の context element とする。
-
controlledframe を element の node navigable の controlledFrameEmbedderParent とする。
-
controlledframe が null である場合、
falseを返す。 -
documentUrl を、controlledframe の 埋め込まれた navigable の アクティブ文書の URL とする。
-
targetUrl を空文字列とする。
-
element が
HTMLImageElementのインスタンスである場合、 targetUrl を element のsrc属性に設定する。 -
element が
HTMLMediaElementのインスタンスである場合、 targetUrl を element のsrc属性に設定する。 -
element が
HTMLAnchorElementのインスタンスである場合、 targetUrl を element の href 属性に設定する。 -
properties["
contexts"] が 空でない場合:-
matchesContext を初期値
falseの boolean 値とする。 -
properties["
contexts"] 内の各 context について:-
element が context に一致する場合、matchesContext を
trueに設定し、 break する。ContextTypeの一致動作は指定されていないが、 上の注には望ましい挙動に関する情報がいくらかある。
-
-
matchesContext が
falseである場合、falseを返す。
-
-
properties["
documentURLPatterns"] が 空でない場合:-
matchesDocumentUrl を初期値
falseの boolean 値とする。 -
properties["
documentURLPatterns"] 内の各 urlPattern について:-
urlPattern が
URLPatternInputである場合、urlPattern を、 urlPattern を与えた 新しいURLPatternに設定する。 -
documentUrl が urlPattern を与えて URLPattern に一致する場合、 matchesDocumentUrl を
trueに設定し、break する。
-
-
matchesDocumentUrl が
falseである場合、falseを返す。
-
-
properties["
targetURLPatterns"] が 空でない場合:-
matchesTargetUrl を初期値
falseの boolean 値とする。 -
properties["
targetURLPatterns"] 内の各 urlPattern について:-
urlPattern が
URLPatternInputである場合、urlPattern を、 urlPattern を与えた 新しいURLPatternに設定する。 -
targetUrl が urlPattern を与えて URLPattern に一致する場合、 matchesTargetUrl を
trueに設定し、break する。
-
-
matchesTargetUrl が
falseである場合、falseを返す。
-
-
trueを返す。
5.1. イベント
ContextMenus
は次のイベントを発火する:
| イベント名 | インターフェイス | 発火する時点... |
|---|---|---|
| show | Event
| context menu がユーザーに表示されたとき。 |
| click | ContextMenusClickEvent
| context menu item がユーザーによって選択されたとき。 |
ContextMenus
は、次のイベントハンドラー(および対応する
イベントハンドラーイベント型)を イベントハンドラー IDL 属性としてサポートする:
| イベントハンドラー | イベントハンドラーイベント型 |
|---|---|
onshow
| show |
onclick
| click |
ContextMenus
contextMenus の 1 つ以上の context menu items がユーザーに表示されるとき、
contextMenus にshow イベントを dispatch する。
context menu item item がユーザーによって選択されたとき、 item を与えて click イベントを dispatch する。
ContextMenus
contextMenus を与えて、dispatch される show event
を dispatch するには、
show という名前の
新しい Event
を
contextMenus に
dispatch する。
-
properties を item の properties とする。
-
menu を item の menu とする。
-
element を menu の context element とする。
-
event を、 click という名前の 新しい
ContextMenusClickEventとする。 -
event["
menuItem"] を、次のフィールドを持つ 新しいMenuItemDetailsに設定する:id-
item の id。
parentMenuId-
properties["
parentId"]。 checked-
context menu item がチェックされているかどうか。
wasChecked-
クリックされる前の checkbox または radio 項目の状態。
-
event の次のフィールドを設定する:
frameId-
element の node navigable の frameId。
frameURL-
element の node navigable の URL。
pageURL-
element の traversable navigable の URL。
editable-
選択された element が、テキスト入力などの編集可能なものかどうか。
linkURL-
element が
HTMLAnchorElementのインスタンスである場合、element のhref属性。 mediaType-
element に基づく、"image"、"video"、または "audio" のいずれか。
selectionText-
存在する場合、コンテキスト選択のテキスト。
srcURL-
存在する場合、element の "src" 属性。
-
menu で event をdispatch する。
6. 使用概要
Lorem ipsum。基本情報と例をここに挿入する。
7. 動機となるアプリケーション
この節は非規範的である。
7.1. 仮想化セッションにおけるレイテンシに敏感なアプリケーション
仮想化環境では、ユーザーは通常、完全な仮想デスクトップを レンダリングするローカルのシンクライアントを持つ。実際のデスクトップ実行環境は、 リモート仮想化サーバー上で実行される。ユーザーのブラウザーが レイテンシに敏感なアプリケーション(動画アプリなど)へナビゲートした場合、 レンダリングされるコンテンツには追加のレイテンシ("lag")が生じ、 体験がユーザーにとって困難または不可能になる。これは、ビデオ会議アプリケーションなど、 ユーザーを記録するアプリケーションにも適用される。これらのレイテンシに敏感な アプリケーションでは、仮想デスクトップアプリケーションはレイテンシに敏感な コンテンツをローカルでレンダリングし、レンダリングされたリモートコンテンツの上に オーバーレイして、このレイテンシを低減できる。このユースケースは "browser content redirection" としても知られている。
7.2. 第三者 Web コンテンツを制限なく埋め込む
キオスク環境では、アプリケーションは第三者からコンテンツを読み込み、
そのコンテンツをアプリケーション内の画面に表示しなければならない。教師が
ナビゲーションイベントをトリガーすることもあれば、ショッピングモールの管理者などの
管理者によって構成されることもある。コンテンツは X-Frame-Options と CSP の
使用により、iframe
による埋め込みを禁止している場合がある。しかし、controlled frame は、
iframe
による埋め込みを禁止するコンテンツであっても、すべてのコンテンツを読み込めるべきである。
7.3. Web コンテンツのリモート表示と操作
キオスク環境では、アプリケーションはコンテンツが画面上に表示され続けることを 確実にしなければならず、独自に提供する挙動でコンテンツを中断する必要がある場合もある。 この挙動は管理者が現地にいなくても動作するべきであり、理想的にはネットワーク越しに リモートで管理できる。たとえばコンテンツがクラッシュした場合、これらのアプリケーションは そのクラッシュを観測し、新しい埋め込みビューでコンテンツを再読み込みすることで 応答するべきである。
7.4. 各セッション後にユーザーコンテンツを消去する
一部の環境では、レストランで注文する場合のように、誰かが単一のデバイスを 短時間だけ使ってタスクを完了する。タスクが完了したとき、埋め込み元アプリケーションは そのタスクに関連付けられたすべてのローカルユーザーデータを消去し、その後 埋め込まれたインスタンスを再起動できるべきである。
7.5. アイドルセッションを監視する
ユーザーが埋め込みコンテンツと対話している間、ユーザーが明示的に セッションを終了しないことがある。このコンテンツは、ユーザーが実際には タスクを完了したか、完了せずに離れたにもかかわらず、ユーザーが存在すると仮定する場合がある。 埋め込み元アプリケーションは、ユーザーがそのケースのしきい値を超えてアイドル状態になった ことを検出し、新しいセッションを開始したい。
7.6. 任意にナビゲーションをブロックする
埋め込み元が作成していない埋め込み Web コンテンツを表示している間、ページは 許可されていない第三者 Web コンテンツへリンクすることがある。埋め込み元が Web コンテンツへの任意のスクリプト注入によって埋め込みコンテンツ内の要素を 編集できるようにすると、ブロックされたページへのナビゲーションが発生しないことを 確実にできる。埋め込み元はまた、Controlled Frame API を使用して ナビゲーションイベントを捕捉し、承認済みサイトのページだけがその controlled frame 内に 読み込まれることを確実にできる。
8. セキュリティ、プライバシー、およびアクセシビリティの考慮事項
この節は非規範的である。
8.1. セキュリティ
Controlled Frame は [Isolated-Web-Apps](IWA) に基づいており、コアセキュリティ仕様と統合される
Controlled Frame は特に強力な API であるため、それを使用すること、あるいは 利用可能であることだけでも、アプリはさまざまな種類のハッキングの標的になる。その結果、 この API は、アプリケーション開発者とユーザーを保護するための追加の 安全対策が備わっている IWA での使用に制限される。Isolated Web App explainer には次のように記載されている:
"開発者が、アプリケーションを XSS またはサーバーサイド攻撃の魅力的な標的にする API へのアクセスを必要とする場合、ユーザーエージェントはアプリケーションに この脅威モデルを採用させることもできる。"
Controlled Frame はまさにそのような魅力的な標的を作るため、これを慎重に 公開するために、特定の攻撃を防ぐべく IWA にオプトインしている。一般に、 IWA は、アプリケーション内の各リソースが 保存時および転送時の両方で安全であるという強力なセキュリティ保証を提供する。 IWA のセキュリティと権限については、 IWA explainer および IWA の [High-Watermark-Permissions] explainer でさらに読むことができる。
Controlled Frame は [Permissions-Policy] および [Permissions] と統合される。 Permissions Policy § 12. Privacy and Security および Permissions § E Security considerations(この項目は現在まばらであることに注意)でさらに読むことができる。
攻撃する Web サイトは、本来は埋め込みを許可しないコンテンツを表示し、 非 IWA 上のユーザーを欺く可能性がある。
計画されている緩和策:
-
Controlled Frame は IWA 内でのみ利用可能になる
IWA は Controlled Frame 経由で別の IWA(または 自身)を埋め込み、何らかの方法で IWA ポリシーを操作する可能性がある(例: Controlled Frame に埋め込まれた IWA は、"controlled-frame" policy-controlled feature が存在しないことにより、 自身が埋め込まれていることを検出する可能性がある)。
計画されている緩和策:
-
Controlled Frame は、IWA に使用される "isolated-app" scheme を除外し、"https" scheme のみを指すことができる
Controlled Frame は強力な <controlledframe> 要素へのアクセスを得る可能性がある。
Controlled Frame を使用することが期待されていない IWA が コンテンツの埋め込みを試みる可能性がある。
計画されている緩和策:
-
IWA API は cross-origin に委譲されることはないため、 入れ子の top-level navigable が IWA にアクセスすることは不可能になる。
-
第二に、埋め込み元アプリケーションおよび、"controlled-frame" policy-controlled feature を 付与された同一オリジンの IWA 子 navigable のみが Controlled Frame 要素を利用できる。
-
"controlled-frame" policy-controlled feature を持たない同一オリジンの子 navigable には Controlled Frame 要素は提供されない。その内側の同一オリジンの入れ子 navigable では、 それは常に利用できない。
IWA は 'http:' や 'isolated-app:' など、非 https scheme からのコンテンツを 埋め込もうとする可能性がある
計画されている緩和策:
-
Controlled Frame は、navigable の "src" URL が 'https:' scheme を持つ場合にのみ動作する。
悪意ある Controlled Frame が埋め込み元の実行中プロセスにアクセスする可能性がある (例: Spectre 攻撃)
計画されている緩和策:
-
Controlled Frame は埋め込み元のプロセスとは別のプロセスで実行される
ある "https origin" に対する Controlled Frame が、その https origin に対する ユーザー自身のストレージデータと相互作用または干渉する可能性がある
計画されている緩和策:
-
Partition 概念を追加している。すべての Partition は StorageKey と別個のオブジェクトキーの tuple である。
-
"非 IWA" の window および tab の使用を格納する、key=0 の default partition が存在するものとする。
-
Controlled Frame は常に、default partition とは別の特定の StorageKey にデータを格納する。
-
ユーザーが IWA Controlled Frame 経由で その origin にアクセスしている間に、ある "https origin" によって書き込まれたデータは、 default partition から分離される。
-
すべての使用は IWA と各 partition の間で分離され、各 partition は相互に、また IWA 外部の default 使用から完全に分離される。
悪意ある Controlled Frame が埋め込み元の保存データを上書きする可能性がある
-
埋め込み元と埋め込まれたストレージユーザーエージェントが重複する可能性があり、 複数の same-site IWA 子 navigable が Controlled Frame 内の活動によって影響を受ける可能性がある
-
ストレージユーザーエージェントが埋め込み元と埋め込まれたサイトの間で共有されている場合、 どちらか一方のデータを消去すると、他方に悪影響を及ぼす可能性がある
計画されている緩和策:
-
IWA と Controlled Frame は常に別々の storage user agent を持つ
-
Controlled Frame は、自身のもの以外の storage user agent に対する読み取りまたは 書き込みアクセスを持つべきではない
悪意ある Controlled Frame が自身が埋め込まれていることを検出し、 埋め込み元アプリケーションを攻撃しようとする可能性がある
計画されている緩和策:
-
ユーザーエージェントはブラウザーと一致する。
-
Controlled Frame の storage user agent は、 IWA および default storage user agent とは別になる。
-
Controlled Frame のプロセスは、 IWA および default renderer と browser のプロセスとは別になる。
-
Controlled Frame 環境は top-most navigable であるように見える:
-
window は window.parent および window.top と一致するべきである
-
policy-controlled feature のリストとそれらの disable/enable 状態は、 navigable の default と一致するべきである
-
アイデア:
-
filesystem、quota storage、および localStorage API 周辺の潜在的な相互作用を調査する
ユーザーは Controlled Frame 内で表示されているページの origin を 検証できない可能性がある
アイデア:
-
Controlled Frame の上部に origin を表示する UI を追加するなど、 何らかの方法でユーザーに origin を公開するか?
-
IWA が、アクセスを想定する origin を manifest で指定するようにするか?
Controlled Frame が古いブラウザーエンジンの脆弱性を悪用する可能性がある
すでに対処済み:
-
既存のブラウザーエンジン自動更新機構
8.2. プライバシー
Controlled Frame は Permissions Policy および Permissions と統合される。 Permissions Policy § 12. Privacy and Security でさらに読むことができる。 Permissions § E Security considerations でさらに読むことができる。
Controlled Frame について具体的に、次のプライバシー上の考慮事項を特定している:
-
Controlled Frame 内でのユーザーの閲覧は IWA から可視になる
-
IWA は Controlled Frame の セッション cookie にアクセスして持ち出すことができる(これは、Controlled Frame のセッションにのみ 適用される。これは、IWA および タブで閲覧された場合の第三者 origin とは別の storage partition を使用するためである)
-
Controlled Frame 内のユーザー活動は IWA によって観測され得る (例: キーボードイベントを監視でき、パスワード入力を盗み見ることができる)
-
Controlled Frame へのユーザーファイルアップロードは乗っ取られる可能性がある
-
Controlled Frame のリモートサーバーに保持されるユーザーデータは、 IWA によって埋め込まれたコードにより アクセスされる可能性がある
-
セッション履歴を消去したいユーザーは、それも IWA 経由で行わなければならず、その後 IWA は関連付けられた storage user agent を消去する必要がある
-
これは、任意の https origin に対して、埋め込まれた storage user agent が 非埋め込み storage user agent とは別であるため必要になる
-
-
ユーザーが Controlled Frame storage user agent を消去できるようにする ブラウザー UX を調査する予定であり、次のケースが考慮される:
-
ユーザーが IWA の site data を消去したい場合、関連付けられた embedded storage user agent も消去される
-
ユーザーは、ある origin が IWA の embedded storage user agent 内に格納されている場合でも、特定の "https origin" に対する すべての site data を消去したい場合がある
-
その site data が embedded storage user agent 内に保持されている場合でも、 その "https origin" に対するすべての IWA site data を消去する機能を 提供することを選択する可能性がある
-
"https origin" データを消去することを選択した場合、 IWA は embedded storage user agent がその制御外で削除される可能性に備える必要があり、 これは IWA にとって混乱を招き、実装の複雑さを導入する可能性がある
-
これを browser user agent でサポートすると、ブラウザーベンダー、 開発者、およびユーザーに追加の複雑さをもたらすため、このアプローチを サポートせず、代わりに IWA 開発者による実装に委ねることを 選択する可能性がある
-
特定の単一 "https origin" の embedded storage user agent の消去を サポートすることへの反例として、我々の知る限り、そのように振る舞う オペレーティングシステムは存在しないことを考慮されたい
-
すなわち、インストールされたすべてのブラウザーエンジンのストレージを 消去する中央の "clear browsing data" オプションはなく、各アプリケーションの ストレージは管理すべき自分自身のものとして扱われる
-
-
-
ユーザーが、特定の "https origin" に対する、ある IWA の Controlled Frame-embedded storage user agent の site data を消去したい場合
-
ユーザーが、すべての "https origins" に対する、ある IWA の Controlled Frame-embedded storage user agent の site data を消去したい場合
-
-
IWA は、特定の "https origin" に対する storage user agent の Controlled Frame-embedded storage user agent を 消去する機能を必要とする
8.3. アクセシビリティ
Controlled Frame について、次のアクセシビリティ上の考慮事項を特定している:
-
ブラウザー user agent のアクセシビリティツールおよび API は、Controlled Frame 内を 可視にできるべきである
-
IWA は、一部のユースケース ("browser content redirection" など)でアクセシビリティ機能を適切に統合するために、 Controlled Frame コンテンツ用の独自のアクセシビリティツールを提供することを期待するべきである
9. 謝辞
次の人々がこの文書の開発に貢献した。