WebDriver BiDi

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-webdriver-bidi-20261008/
最新公開バージョン:
https://www.w3.org/TR/webdriver-bidi/
編集者草案:
https://w3c.github.io/webdriver-bidi/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/webdriver-bidi/
実装報告:
https://wpt.fyi/results/webdriver/tests/bidi
テストスイート:
https://github.com/web-platform-tests/wpt/tree/master/webdriver/tests/bidi
フィードバック:
GitHub
仕様内インライン
編集者:
James Graham (Mozilla)
Alex Rudenko (Google)
Maksim Sadym (Google)
チャンネル:
irc.w3.org 上の #webdriver
Wiki:
W3C WebDriver Wiki

概要

この文書は、ユーザーエージェントをリモート制御するための仕組みである、双方向 WebDriver プロトコルを定義する。

この文書のステータス

この節は、この文書の公開時点におけるステータスを説明する。現在の W3C 公開文書の一覧およびこの技術報告書の最新改訂版は、W3C 標準および草案索引で確認できる。

この仕様に関する議論には、GitHub Issues が推奨される。 あるいは、Browser Testing and Tools Working Group のメーリングリスト public-browser-tools-testing@w3.org (アーカイブ)へコメントを送ることもできる。

この文書は、Browser Testing and Tools Working Group により、勧告 トラックを用いた作業草案として公開された。

作業草案としての公開は、 W3C およびそのメンバーによる支持を意味しない。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性がある。 作業中のもの以外としてこの文書を引用することは不適切である。

この文書は、W3C Patent Policy の下で活動するグループによって作成された。 W3C は、このグループの成果物に関連して行われたすべての 特許開示の公開リストを維持している。そのページには、特許を開示するための手順も含まれる。 個人が、その個人の知る限り Essential Claim(s) を含むと考える特許について実際の知識を有する場合、その情報を W3C Patent Policy の第 6 節に従って開示しなければならない。

この文書は、2025年8月18日版 W3C Process Document によって管理される。

1. 序論

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

WebDriver は、ユーザーエージェントの イントロスペクションおよび リモート制御のためのプロトコルを定義する。この仕様は、 双方向通信を導入することにより WebDriver を拡張する。WebDriver の厳密な コマンド/レスポンス形式に代えて、これによりイベントを ユーザーエージェントから制御ソフトウェアへストリーミングできるようになり、 ブラウザー DOM のイベント駆動の性質によりよく一致する。

2. 基盤

この仕様は Infra Standard に依存する。[INFRA]

ネットワークプロトコルメッセージは CDDL を用いて定義される。[RFC8610]

この仕様は、map である wait queue を定義する。

この「イベントを待つ」ことを行うための、もっとよい 仕組みがきっとあるはずだ。

並列に実行されているアルゴリズム algorithm が、イベントの集合 events および resume id を awaits するとき:

  1. algorithm の実行を一時停止する。

  2. 表明: wait queue は resume id を含まない。

  3. wait queue[resume id] を (events, algorithm) に設定する。

与えられた name、 id および parameters で resume するには:
  1. wait queue が id を含まない場合、戻る。

  2. (events, algorithm) を wait queue[id] とする

  3. events 内の各 event について:

    1. event が name と等しい場合:

      1. wait queue から id を削除する。

      2. algorithm 内のステップの実行を、 一時停止された地点から再開し、name および parameters を await の結果として渡す。

        これがイベントループ上の他のどのタスクよりも先に 実行されることを保証するために、microtasks のようなものを 持つべきだろうか?

WebDriver configuration は、次を持つ struct である:

WebDriver configuration は associated type を持ち、 これは type である。

WebDriver configuration に対する value は、その設定に対する associated type である型を持つ値、または unset のいずれかである。

Unset は、特定の設定 value が設定されていないことを示す値である。

注: このアルゴリズムは、与えられた navigable についての WebDriver configuration に、 navigables 内の値を確認し、次に user contexts 内、最後に global 内を確認することでアクセスできるようにする。 設定されていない場合は unset を返す。

WebDriver configuration configuration の、 navigable navigable に対する get WebDriver configuration value は:

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

  2. configuration の navigables が top-level traversable を含む場合:

    1. navigable configuration value を configuration の navigables[top-level traversable] とする。

    2. navigable configuration value が unset でない場合、 navigable configuration value を返す。

  3. user context を navigable の associated user context とする。

  4. configuration の user contexts が user context を含む場合:

    1. user context configuration value を configuration の user contexts[user context] とする。

    2. user context configuration value が unset でない場合、 user context configuration value を返す。

  5. configuration の global を返す。

注: これは WebDriver configuration を target ごとに格納するための汎用アルゴリズムであり、target は navigable、user context のいずれか、または target が null もしくは省略された場合はグローバルに格納できる。

WebDriver configuration configuration の value value を、任意の target に store するには。これは navigable、 user context、または提供されない場合は null である:

  1. target が null である場合、configuration の global を value に設定する。

  2. target が user context である場合、configuration の user contexts[target] を value に設定する。

  3. target が navigable である場合、configuration の navigables[target] を value に設定する。

注: この汎用アルゴリズムは、 command parameters 内の "userContexts" および "contexts" の存在に応じて、WebDriver configuration の value を global、user contexts、または navigables に格納する。これらの パラメーター は相互に排他的である。どちらも提供されない場合、設定はグローバルに格納される。

与えられた command parameters について、WebDriver configuration configuration の value value を store WebDriver configuration するには:

  1. command parameters が "userContexts" を含み、かつ command parameters が "contexts" を含む場合、error を、error code invalid argument とともに返す。

  2. affected navigables を空の set とする。

  3. command parameters が "contexts" を含む場合:

    1. navigables を、command parameters["contexts"] で get valid top-level traversables by ids することを試みた結果とする。

    2. navigables の各 navigable について:

      1. navigable を affected navigables に追加する。

      2. configuration の value を navigable に store する。

  4. そうでなく、command parameters が "userContexts" を含む場合:

    1. user contexts を、command parameters["userContexts"] で get valid user contexts することを試みた結果とする。

    2. user contexts の各 user context について:

      1. user context である associated user context を持つ、すべての top-level traversables のリスト内の 各 top-level traversable について反復する:

        1. top-level traversable を affected navigables に追加する。

      2. configuration の value を user context に store する。

  5. そうでなければ:

    1. すべての top-level traversables の各 top-level traversable について反復し、top-level traversable を affected navigables に追加する。

    2. configuration の value をStore する。

  6. affected navigables を返す。

3. プロトコル

この節は、WebDriver BiDi プロトコルの基本概念を定義する。これらの用語は、 トランスポート層での表現とは異なる。

このプロトコルは CDDL 定義を用いて定義される。実装者の便宜のため、2 つの別々の CDDL 定義が定義される。 すなわち、local end で生成され、remote end で消費されるメッセージの形式を 定義する remote end definition と、 remote end で生成され、 local end で消費されるメッセージの形式を定義する local end definition である。

3.1. 定義

これは 付録であるべきだろうか?

この節は、remote end definition および local end definition の初期内容を示す。 これらは、仕様の残りの部分で定義される定義断片によって拡張される。

Remote end definition

Command = {
    id: js-uint,
    CommandData,
    Extensible,
    }

    CommandData = (
    BrowserCommand //
    BrowsingContextCommand //
    EmulationCommand //
    InputCommand //
    NetworkCommand //
    ScriptCommand //
    SessionCommand //
    StorageCommand //
    WebExtensionCommand
    )

    EmptyParams = {
    Extensible
    }

Local end definition

Message = (
  CommandResponse /
  ErrorResponse /
  Event
)

CommandResponse = {
  type: "success",
  id: js-uint,
  result: ResultData,
  Extensible
}

ErrorResponse = {
  type: "error",
  id: js-uint / null,
  error: ErrorCode,
  message: text,
  ? stacktrace: text,
  Extensible
}

ResultData = (
  BrowserResult /
  BrowsingContextResult /
  EmulationResult /
  InputResult /
  NetworkResult /
  ScriptResult /
  SessionResult /
  StorageResult /
  WebExtensionResult
)

EmptyResult = {
  Extensible
}

Event = {
  type: "event",
  EventData,
  Extensible
}

EventData = (
  BrowsingContextEvent //
  InputEvent //
  LogEvent //
  NetworkEvent //
  ScriptEvent
)

EmptyResult は、 必須フィールドを持たない結果型であり、 結果データを生成しないコマンドの返り値の型として使用される。

Remote end definition および Local end definition

Extensible = (*text => any)

js-int = -9007199254740991..9007199254740991
js-uint = 0..9007199254740991

3.2. セッション

WebDriver BiDi は、セッション概念を WebDriver から拡張する。

セッションは BiDi フラグを持ち、特に明記されない限り、 これは false である。

BiDi セッションは、セッションであって、BiDi フラグが true に設定されているものである。

active BiDi sessions のリストは、次で与えられる:
  1. BiDi sessions を新しい list とする。

  2. active sessions 内の各 session について:

    1. session が BiDi session である場合、session を BiDi sessions に追加する。

  3. BiDi sessions を返す。

3.3. モジュール

WebDriver BiDi プロトコルはモジュールに編成される。

各 module は、ユーザー エージェントの特定の側面に関係する、関連した commands および events の集合を表す。たとえば、モジュールは DOM の検査や 操作、またはスクリプト実行のための機能を含むことがある。

各モジュールは、文字列である module name を持つ。 モジュール内で定義されるコマンドおよびイベントに対する command name および event name は、 module name で始まり、その後にピリオド "." が続く。

commands を含むモジュールは、remote end definition 断片を定義する。これらは、モジュールの commands に対して CommandData グループ内に選択肢を提供し、また 追加の定義プロパティを定義することもできる。それらは、モジュール内のコマンド結果に対して ResultData グループ内に追加の選択肢を提供する local end definition 断片を定義することもできる。

イベントを含むモジュールは、モジュールの events に対して Event グループ内の 選択肢となる local end definition 断片を定義する。

実装は extension modules を定義してもよい。これらは、単一のコロン ":" 文字を含む module name を持たなければならない。コロンの前の部分は接頭辞であり、通常は特定の実装に固有のすべての extension modules で同じであり、特定の実装に対して一意であるべきである。

他の仕様は、プロトコルを拡張する独自の WebDriver-BiDi モジュールを定義してもよい。 そのようなモジュールは、コロン(:)文字を含む名前を持ってはならず、 また、その文字を含む command names、event names、またはプロパティ 名を定義してはならない。

外部仕様の作者には、既存のモジュールを拡張するのではなく、新しいモジュールを追加することが推奨される。 既存のモジュールを拡張することが望まれる場合は、その拡張を元のモジュール定義を含む仕様に直接統合することが望ましい。

3.4. コマンド

command は非同期 操作であり、local end によって要求され、remote end 上で実行され、 その結果として result または error のいずれかが local end に返される。 複数の コマンドを同時に実行でき、コマンドは潜在的に 長時間実行されることがある。その結果、コマンドは順序どおりでなく完了することがある。

各 command は次によって定義される:

アクティブなセッションなしで実行できるコマンドは static command である。コマンドは、その 定義で述べられない限り static command ではない。

コマンドが local end から送信されるとき、 それらは command id を持つ。これは、特定の コマンドからのレスポンスを識別するために local end が使用する識別子である。 remote end の観点からは、この識別子は不透明であり、 コマンドを識別するために内部的に使用することはできない。

注: これは、command id が完全に local end によって制御され、セッションの過程で必ずしも一意ではないためである。たとえば、すべてのレスポンスを無視する local end は、 各コマンドに同じ command id を使用できる。

set of all command names は、set であり、 extension modules に属するものを含む、定義済みのすべての command names を含む。

3.5. エラー

WebDriver BiDi は、error codes の集合を WebDriver から次の追加コードで拡張する:

invalid web extension
無効な Web 拡張機能をインストールしようとした。
no such client window
未知の client window とやり取りしようとした。
no such handle
未知の RemoteObjectReference を逆シリアル化しようとした。
no such history entry
未知の session history entry へ移動しようとした。
no such network collector
未知の collector を削除しようとした。
no such intercept
未知の network intercept を削除しようとした。
no such network data
未知の network data を参照しようとした。
no such node
未知の SharedReference を逆シリアル化しようとした。
no such request
未知の request を続行しようとした。
そのようなスクリーンキャストはない
不明なスクリーンキャスト記録を停止しようとした。
no such script
未知の preload script を削除しようとした。
no such storage partition
存在しないストレージパーティション内のデータにアクセスしようとした。
no such user context
未知の user context を参照しようとした。
no such web extension
未知の Web 拡張機能を参照しようとした。
unable to close browser
ブラウザーを閉じようとしたが、失敗した。
unable to set cookie
Cookie を作成しようとしたが、ユーザーエージェントに拒否された。
underspecified storage partition
十分に指定されていないストレージパーティション内のデータとやり取りしようとした。
unable to set file input
ファイル入力を設定しようとしたが、失敗した。
unavailable network data
収集されていない、またはすでに破棄されたネットワークデータを取得しようとした。
ErrorCode = "invalid argument" /
            "invalid selector" /
            "invalid session id" /
            "invalid web extension" /
            "move target out of bounds" /
            "no such alert" /
            "no such network collector" /
            "no such element" /
            "no such frame" /
            "no such handle" /
            "no such history entry" /
            "no such intercept" /
            "no such network data" /
            "no such node" /
            "no such request" /
            "no such screencast" /
            "no such script" /
            "no such storage partition" /
            "no such user context" /
            "no such web extension" /
            "session not created" /
            "unable to capture screen" /
            "unable to close browser" /
            "unable to set cookie" /
            "unable to set file input" /
            "unavailable network data" /
            "underspecified storage partition" /
            "unknown command" /
            "unknown error" /
            "unsupported operation"

3.6. イベント

event は通知であり、 remote end によって local end へ送信され、remote end 上で関心のある何かが 発生したことを通知する。

BiDi session は subscriptions を持ち、これは list of subscriptions である。

BiDi session は known subscription ids を持ち、これは set であり、 local end に発行されたがまだ購読解除されていない、すべての subscription ids を含む。

subscription は、struct であり、 subscription id(文字列)、 event names(event names の set)、 top-level traversable ids(top-level traversables の ID の set) および user context ids(user contexts の ID の set)からなる。

subscription subscription は、subscription の top-level traversable ids が空の set であり、 かつ subscription の user context ids が空の set である場合、 global である。

event name および navigables が与えられたときの set of sessions for which an event is enabled は次である:

  1. sessions を新しい set とする。

  2. active BiDi sessions 内の各 session について:

    1. session、event name および navigables で event is enabled である場合、 session を sessions に追加する。

  3. sessions を返す。

session、 event name および navigables が与えられたとき、event is enabled であるかどうかを判定するには:

注: shared worker は複数のコンテキストに関連付けられ得るため、 navigables は set である。

  1. top-level traversables を、navigables で get top-level traversables したものとする。

  2. session の subscriptions 内の各 subscription について:

    1. subscription の event names が event name を含まない場合、continue する。

    2. subscription が global である場合、true を返す。

    3. user context ids が空でない場合:

      1. top-level traversables 内の各 navigable について反復する:

        1. subscription の user context ids が、 navigable の associated user context の user context id を含む場合、 true を返す。

    4. そうでなければ:

      1. subscription top-level traversables を、subscription の top-level traversable ids で get navigables by ids したものとする。

      2. top-level traversables と subscription top-level traversables の積集合が空でない場合、true を返す。

  3. false を返す。

event name および session が与えられたときの set of top-level traversables for which an event is enabled は次である:

  1. result を新しい set とする。

  2. session の subscriptions 内の各 subscription について:

    1. subscription の event names が event name を含まない場合、 continue する。

    2. subscription が global である場合:

      1. remote end の top-level traversables 内の各 traversable について:

        1. traversable を result に追加する。

      2. Break する。

    3. そうでなく、user context ids が空でない場合:

      1. remote end の top-level traversables 内の各 traversable について:

        1. subscription の user context ids が traversable の associated user context の user context id を含む場合、 traversable を result に追加する。

    4. そうでなければ:

      1. top-level traversables を、subscription の top-level traversable ids で get navigables by ids したものとする。

      2. top-level traversables の各項目を result に追加する。

  3. result を返す。

与えられた name で obtain a set of event names するには:
  1. events を空の set とする。

  2. name が U+002E(ピリオド)を含む場合:

    1. name がイベントに対する event name である場合、name を events に追加し、 data events とともに success を返す。

    2. error code invalid argument を持つ error を返す

  3. そうでなければ、name はモジュール内のすべてのイベントを表すものとして解釈される。 name が module name でない場合、error code invalid argument を持つ error を返す。

  4. 名前 name を持つモジュール内の各 event に対する event name を events に追加する。

  5. data events とともに success を返す。

4. トランスポート

メッセージトランスポートは WebSocket プロトコルを用いて提供される。 [RFC6455]

注: WebSocket プロトコルの用語では、local end は クライアントであり、remote end はサーバー / リモートホストである。

注: commands および events のメッセージとしての符号化は JSON-RPC に似ているが、この仕様はそれを規範的に 参照しない。[JSON-RPC] 代わりに、remote ends に対する規範的要件は正確な処理モデルとして与えられ、 local ends に対する 規範的要件は与えられない。

WebSocket listener は、受信する WebSocket 接続を 受け入れることができるネットワークエンドポイントである。

WebSocket listener は host、port、secure flag、および list of WebSocket resources を持つ。

WebSocket listener listener が作成されたとき、remote end は、listener の host および port によって与えられるホストおよびポート上で、 WebSocket 接続を待ち受け始めなければならない。 listener の secure flag が設定されている場合、 listener から確立される接続は TLS で暗号化されなければならない。

remote end は、set of WebSocket listeners である active listeners を持ち、これは初期状態では空である。

remote end は、set of WebSocket connections not associated with a session を持ち、これは初期状態では空である。

WebSocket connection は、 WebSocket protocol の要件に従うネットワーク接続である

BiDi session は、set of session WebSocket connections を持ち、その要素は WebSocket connections である。これは 初期状態では空である。

BiDi session session は、session の session WebSocket connections が connection を含む場合、connection と associated with connection している。

注: 各 WebSocket connection は、最大でも 1 つの BiDi session と関連付けられる。

クライアントが WebSocket 接続を確立するとき、すなわち connection を active listeners の集合内の listener の 1 つに接続して 確立するとき、実装は WebSocket の server-side requirements に従って進めなければならず、受信接続を 受け入れるかどうかを決定するときに次のステップを実行する:

  1. resource name を、クライアントの開始ハンドシェイクを読むことから得られるリソース名とする。 resource name が listener の list of WebSocket resources 内にない場合、 これらのステップの実行を停止し、要求されたサービスが利用できないかのように動作する。

  2. resource name がバイト文字列 "/session" であり、 実装が supports BiDi-only sessions する場合:

    1. 接続を受け入れるべきかどうかを決定するための、その他の実装定義のステップを実行し、 受け入れない場合はこれらのステップの実行を停止し、 要求されたサービスが利用できないかのように動作する。

    2. その接続を WebSocket connections not associated with a session に追加する。

    3. 戻る。

  3. resource name で Get a session ID for a WebSocket resource し、 session id をその値とする。session id が null である場合、 これらのステップの実行を停止し、要求されたサービスが利用できないかのように動作する。

  4. アクティブなセッションのリスト内に、 session id をその セッション ID とする セッションがある場合、session をその セッションとする。そうでなければ、これらの手順の実行を停止し、 要求されたサービスが利用できないものとして振る舞う。

  5. 接続を受け入れるべきかどうかを決定するための、その他の実装定義のステップを実行し、 受け入れない場合はこれらのステップの実行を停止し、 要求されたサービスが利用できないかのように動作する。

  6. そうでなければ、connection を session の session WebSocket connections に追加し、サーバーが受信接続を受け入れることを選択するときの WebSocket server-side requirements に従って進める。

1 つのセッションに対して 2 つ以上の 接続をサポートするのか?

WebSocket メッセージが受信されたとき、WebSocket connection connection について、型 type およびデータ data が与えられる場合、remote end は connection、 type および data が与えられたものとして handle an incoming message しなければならない。

WebSocket の終了ハンドシェイクが開始されたとき、または WebSocket 接続が閉じられたとき、WebSocket connection connection について、remote end は connection が与えられたものとして handle a connection closing しなければならない。

注: 終了ハンドシェイクなしに WebSocket 接続が閉じられる可能性があるため、 両方の条件が必要である。

セッション session が与えられたとき、WebSocket リソース名を構築するには、次を実行する:

  1. session が null なら、"/session" を返す

  2. 文字列 "/session/" と session の セッション ID とを連結した結果を返す。

WebSocket リスナー listener および セッション session が与えられたとき、WebSocket URL を構築するには、 次を実行する:

  1. resource name を、session により WebSocket リソース名を構築する 結果とする。

  2. host を listener の host に、port を listener の port に、path を resource name に設定して構築された WebSocket URI を返す。これは、 listener の secure flag が設定されている場合は wss-URI 構成に従い、そうでなければ ws-URL 構成に従う。

resource name が与えられたとき、WebSocket リソースのセッション ID を取得するには、次を実行する:

  1. resource name がバイト文字列 "/session/" で始まらない場合、null を返す。

  2. session id を、resource name 内の "/session/" 接頭辞に続くバイト列とする。

  3. session id が UUID の文字列表現でない場合、null を返す。

  4. session id を返す。

セッション session が与えられたとき、WebSocket 接続のリッスンを開始するには、次を実行する:
  1. リモートエンドが再利用したい既存の WebSocket リスナーが アクティブリスナー内にある場合、 listener をその リスナーとする。そうでなければ、listener を、実装定義の host、port、 secure flag、および空の WebSocket リソースのリストを持つ新しい WebSocket リスナーとする。

  2. resource name を、session により WebSocket リソース名を構築する 結果とする。

  3. resource name を listener の WebSocket リソースのリストに 追加する。

  4. listener を リモートエンドの アクティブリスナーに 追加する。

  5. listener を返す。

注: 複数のセッションを処理する intermediary node は、1 つまたは多数の WebSocket listener を使用できる。WebDriver は、 endpoint node が同時に最大 1 つのセッションをサポートすると定義しているため、 listener は 1 つだけであることが想定される。

注: endpoint node では、上記ステップにおける host は 通常 "localhost" になる。

WebSocket connection connection、型 type およびデータ data が与えられたとき、 handle an incoming message するには:
  1. type が text でない場合、connection、 null、および invalid argument が与えられたものとして send an error response し、最後に 戻る。

  2. Assert: data は scalar value string である。そうでなければ、WebSocket の UTF-8 符号化データ内のエラー処理 が、すでに WebSocket connection を失敗させているためである。

    UTF-8 エラーにどの status code が使用されるかを定義しているものはないように思われる。

  3. connection と associated with connection している BiDi Session が存在する場合、 session をそのセッションとする。そうでなく、connection が WebSocket connections not associated with a session 内にある場合、session を null とする。そうでなければ、戻る。

  4. parsed を、data が与えられたものとして JSON を Infra values に構文解析する結果とする。 これが例外を投げる場合、connection、 null、および invalid argument が与えられたものとして send an error response し、 最後に戻る。

  5. session が null でなく、かつ active sessions 内にない場合、戻る。

  6. parsed を remote end definition に対して照合する。 これが 一致になる場合:

    1. matched を、一致したデータを表す map とする。

    2. Assert: matched は "id"、"method"、および "params" を含む。

    3. command id を matched["id"] とする。

    4. method を matched["method"] とする

    5. command を、command name method を持つ command とする。

    6. session が null であり、かつ command が static command でない場合、 connection、command id、および invalid session id が与えられたものとして send an error response し、戻る。

    7. 次のステップを並列に実行する:

      1. result を、 session および command parameters matched["params"] が与えられたものとして、 command に対する remote end steps を実行した結果とする。

      2. result が error である場合、 connection、command id、および result の error code が与えられたものとして send an error response し、最後に 戻る。

      3. value を result の data とする。

      4. Assert: value は、command name method を持つ command に対応する result type の定義に一致する。

      5. method が "session.new" である場合、session を active sessions のリスト内の、その session ID が value の "sessionId" プロパティと等しいエントリーとし、connection を session の session WebSocket connections に追加し、 connection を WebSocket connections not associated with a session から削除する。

      6. response を、local end definition 内の CommandResponse 生成規則に一致する新しい map とする。 id フィールドは command id に設定され、value フィールドは value に設定される。

      7. serialized を、response が与えられたものとして serialize an infra value to JSON bytes した結果とする。

      8. serialized からなる WebSocket メッセージを送信する。 これは connection 上で行う。

  7. そうでなければ:

    1. command id を null とする。

    2. parsed が map であり、かつ parsed["id"] が存在し、0 以上の integer である場合、command id をその integer に設定する。

    3. error code を invalid argument とする。

    4. parsed が map であり、かつ parsed["method"] が存在し、 string であるが、parsed["method"] が set of all command names 内にない場合、 error code を unknown command に設定する。

    5. connection、command id、および error code が与えられたものとして Send an error response する。

settings object settings が与えられたとき、get related navigables するには:

  1. related navigables を空の set とする。

  2. settings の relevant global object が Window である場合:

    1. navigable を、relevant global object の associated Document の node navigable とする。

    2. navigable が null でない場合、navigable を related navigables に追加する。

  3. そうでなく、settings によって指定される global object が WorkerGlobalScope である場合、 global object の owner set 内の各 owner について:

    1. navigable を null とする。

    2. owner が Document である場合、navigable を owner の node navigable に設定する。

    3. navigable が null でない場合、navigable を related navigables に追加する。

  4. related navigables を返す。

context ids の list navigable ids が与えられたとき、get navigables by ids するには:

  1. result を空の set とする。

  2. navigable ids 内の各 navigable id について:

    1. navigable を、id navigable id を持つ navigable が存在する場合はその navigable、そうでなければ null とする。

    2. navigable が null でない場合、 navigable を result に追加する。

  3. result を返す。

list of navigables navigables が与えられたとき、get top-level traversables するには:

  1. result を空の set とする。

  2. navigables 内の各 navigable について:

    1. navigable の top-level traversable を result に追加する。

  3. result を返す。

context ids の list navigable ids が与えられたとき、get valid navigables by ids するには:

  1. result を空の set とする。

  2. navigable ids 内の各 navigable id について:

    1. navigable を、navigable id で get a navigable することを試みた結果とする。

    2. navigable を result に追加する。

  3. data result とともに success を返す。

context ids の list navigable ids が与えられたとき、 get valid top-level traversables by ids するには:

  1. result を空の set とする。

  2. navigable ids 内の各 navigable id について:

    1. navigable を、navigable id で get a navigable することを試みた結果とする。

    2. navigable が top-level traversable でない場合、 error を、error code invalid argument とともに返す。

    3. navigable を result に追加する。

  3. data result とともに success を返す。

session および body が与えられたとき、 emit an event するには:
  1. Assert: body は Event 生成規則に一致する。

  2. serialized を、body が与えられたものとして serialize an infra value to JSON bytes した結果とする。

  3. session の session WebSocket connections 内の各 connection について反復する:

    1. serialized からなる WebSocket メッセージを送信する。 これは connection 上で行う。

WebSocket connection connection、command id、および error code が与えられたとき、 send an error response するには:
  1. error data を、local end definition 内の ErrorResponse 生成規則に一致する新しい map とする。 id フィールドは command id に設定され、error フィールドは error code に設定され、 message フィールドは、発生したエラーの人間可読な定義を含む 実装定義の文字列に設定され、stacktrace フィールドは任意で、 エラーが発生した時点のアクティブなスタックフレームのスタックトレース報告を含む 実装定義の文字列に設定される。

  2. response を、error data が与えられたものとして serialize an infra value to JSON bytes した結果とする。

    注: command id は null になり得る。その場合、 id フィールドも null に設定され、 response から省略されるわけではない。

  3. response からなる WebSocket メッセージを送信する。 これは connection 上で行う。

WebSocket connection connection が与えられたとき、handle a connection closing するには:

  1. connection と associated with connection している BiDi session が存在する場合:

    1. session を、connection と associated with connection している BiDi session とする。

    2. connection を session の session WebSocket connections から削除する。

  2. そうでなく、WebSocket connections not associated with a session が connection を含む場合、connection をその set から削除する。

注記: これはいかなる セッションも終了しない。

UA が望む場合に listener を閉じられるようにするため、session の終了にフックする必要がある。

session が与えられたとき、close the WebSocket connections するには:

  1. session の session WebSocket connections 内の各 connection について:

    1. connection で WebSocket の終了ハンドシェイクを開始する。

      注: これにより、connection に対して handle a connection closing のステップが実行されることになり、connection に関連付けられたリソースが クリーンアップされる。

4.1. 接続の確立

WebDriver クライアントは、値 true で WebSocket URL capability を要求することにより、 双方向接続にオプトインする。

この仕様によって定義される WebDriver new session algorithm は、 パラメーター session、capabilities、および flags を取り、次である:
  1. flags が "bidi" を含む場合、戻る。

  2. webSocketUrl を、capabilities から "webSocketUrl" という名前のプロパティを取得する結果とする。

  3. webSocketUrl が undefined である場合、戻る。

  4. Assert: webSocketUrl は true である。

  5. listener を、session が与えられたものとして start listening for a WebSocket connection した結果とする。

  6. webSocketUrl を、listener および session で construct a WebSocket URL した結果に設定する。

  7. capabilities 上の "webSocketUrl" という名前のプロパティを webSocketUrl に設定する。

  8. session の BiDi flag を true に設定する。

  9. "bidi" を flags に追加する。

実装は、HTTP Session ではない BiDi Session を クライアントが確立できるようにもするべきである。この場合、WebSocket サーバーへの URL は 帯域外で伝達される。これを許可する実装は supports BiDi-only sessions する。そのような実装が WebDriver セッションを開始する要求を 受け入れる準備ができた時点で、次を行わなければならない:

  1. null が与えられたものとして Start listening for a WebSocket connection する。

5. サンドボックス化されたスクリプト実行

自動化ツールに共通する要件は、文書の DOM に アクセスできるが、その文書を含む navigable 内で実行されるスクリプトによって DOM API に加えられた変更についての情報を持たないスクリプトを 実行することである。

BiDi session は sandbox map を持ち、これは weak map であり、その キーは Window オブジェクト、値は文字列と SandboxWindowProxy オブジェクトの間の map である。

注: ここでのサンドボックスの定義は、既存実装の 振る舞いを成文化しようとするものである。これは、仕様では以前は内部的なものと みなされていた実装の一部、特にプラットフォームオブジェクトの内部状態 (これは通常、ブラウザーエンジンの主たる実装言語におけるネイティブオブジェクトとして 実装される)と ECMAScript から見える状態との区別を公開する。既存のサンドボックス 実装はエンジン内の低レベルで行われているため、実装が仕様のすべての詳細に 収束するには遅い過程になる可能性がある。当面の間、実装者には 仕様との差異について詳細な文書を提供することが推奨され、この機能の利用者には サンドボックス内で実行されるスクリプトがすべての実装で動作することを 明示的にテストすることが推奨される。

5.1. サンドボックスレルム

各サンドボックスは一意の ECMAScript Realm である。しかし、sandbox realm は Window realm 内の既存のプラットフォームオブジェクトへのアクセスを、 SandboxProxy オブジェクトを介して提供する。

name および navigable が与えられたとき、 get or create a sandbox realm するには:
  1. name が空文字列である場合、error を error code invalid argument とともに返す。

  2. window を navigable の active window とする。

  3. sandbox map が window を含まない場合、sandbox map[window] を新しい map に設定する。

  4. sandboxes を sandbox map[window] とする。

  5. sandboxes が name を含まない場合、 sandboxes[name] を navigable で create a sandbox realm したものに設定する。

  6. data sandboxes[name] とともに success を返す。

window で create a sandbox realm するには:

sandbox realm の作成を定義する。これは window をラップする SandboxWindowProxy を返すことになる。

target realm が与えられたとき、get a sandbox name するには:

  1. realms maps を、sandbox map の値を取得するものとする。

  2. realms maps 内の各 realms map について:

    1. realms map 内の各 name → realm について:

      1. realm が target realm である場合、name を返す。

  3. null を返す。

5.2. サンドボックスプロキシオブジェクト

SandboxProxy オブジェクトは、別の realm からの オブジェクトへのサンドボックス化されたアクセスを仲介する exotic object である。 Sandbox proxy objects は、次の制限を強制するように設計されている:

SandboxProxy interface object は存在しない。

SandboxProxy がどのように機能するかを詳細に定義する

unwrapped object を取得するには:
  1. object が SandboxProxy または SandboxWindowProxy である間、object をその wrapped object に設定する。

  2. object を返す。

5.3. SandboxWindowProxy

SandboxWindowProxy は、 Window オブジェクトを表す exotic object であり、それは SandboxProxy オブジェクトによってラップされる。これは、そのデータへのサンドボックス化された アクセスを Window global 内で提供する。

これがどのように機能するかを定義する。

6. ユーザーコンテキスト

user context は、remote end 内にある 0 個以上の top-level traversables の集合を表す。 各 user context は、 関連付けられた storage partition を持つため、remote end のデータは 異なる user contexts 間で共有されない。

これが user context の概念や storage との相互作用を形式的に定義する最良の方法であるかは不明である。

注: Infra 仕様は、user contexts と同じ概念を指すために "user agent" という用語を使用する。しかし、これは 複数の user contexts を持つ Web クライアント全体を意味する "user agent" という用語の用法と互換性がない。この違いは Web コンテンツからは 見えないが、WebDriver を介して観測されるため、この用語法の使用を避ける。

user context は user context id を持ち、 これは user context の作成時に設定される一意の文字列である。

navigable は associated user context を持ち、これは user context である。

新しい top-level traversable が作成されると、その associated user context は set of user contexts 内の user context に設定される。

注: 場合によっては、 top-level traversable が作成されるときに user context が 仕様によって設定される。しかし、そのような要件が存在しない場合、 associated user context for a top-level traversable は implementation-defined である。

non-null の opener を持つ top-level traversables は、その opener と同じ associated user context を持つと指定すべきだろうか? これが既存実装で強制されているものか確認する必要がある。

child navigable の associated user context は、 その parent の associated user context である。

どの associated user context にもなっていない user context、 すなわちどの top-level traversable に対してもそうでないものは、empty user context である。

default user context は、user context であり、user context id "default" を持つ。

実装は set of user contexts を持ち、これは set of user contexts である。初期状態では、これは default user context を含む。

実装はいつでも、たとえばユーザー操作に応じて、新しい user contexts を set of user contexts に 追加してもよい。

注: ここでいう「いつでも」には実装の 起動中も含まれるため、ある実装は常に set of user contexts 内に 複数のエントリーを持つことがある。

実装は、default user context を除き、任意の empty user context を set of user contexts からいつでも 削除してもよい。 ただし、そのような user contexts を削除する必要はない。 empty user contexts でない User contexts は、 set of user contexts から削除されてはならない。

BiDi session は user context to accept insecure certificates override map を持ち、これは user contexts と boolean の間の map である。

BiDi session は user context to proxy configuration map を持ち、これは user contexts と proxy configuration の間の map である。

emulated network conditions struct は、次を持つ struct である:

BiDi session は emulated network conditions を持ち、これは struct であり、 default network conditions という名前の item を持つ。これは emulated network conditions struct または null であり、また user context network conditions という名前の item を持つ。これは user contexts と emulated network conditions struct の間の weak map であり、 さらに navigable network conditions という名前の item を持つ。これは navigables と emulated network conditions struct の間の weak map である。

user context が set of user contexts から削除されたとき、 remove user context subscriptions する。

remove user context subscriptions するには:

  1. active sessions 内の各 session について:

    1. subscriptions to remove を set とする。

    2. session の subscriptions 内の各 subscription について:

      1. subscription の user context ids が、 navigable の associated user context の user context id を含む場合;

        1. navigable の associated user context の user context id を、 subscription の user context ids から削除する。

        2. subscription の user context ids が 空である場合:

          1. subscription を subscriptions to remove に追加する。

    3. subscriptions to remove を session の subscriptions から削除する。

user context id が与えられたとき、 get user context するには:
  1. set of user contexts 内の各 user context について:

  2. user context の user context id が user context id と等しい場合:

    1. user context を返す。

  3. null を返す。

user context ids が与えられたとき、get valid user contexts するには:

  1. result を空の set とする。

  2. user context ids の各 user context id について:

    1. user context を、user context id で get user context したものに設定する。

    2. user context が null である場合、error を error code no such user context とともに返す。

    3. user context を result に追加する。

  3. result を返す。

7. モジュール

7.1. session モジュール

session モジュールは、remote end のステータスを監視するための コマンドおよびイベントを含む。

7.1.1. 定義

remote end definition

SessionCommand = (
    session.End //
    session.New //
    session.Status //
    session.Subscribe //
    session.Unsubscribe
    )

local end definition

SessionResult = (
    session.EndResult /
    session.NewResult /
    session.StatusResult /
    session.SubscribeResult /
    session.UnsubscribeResult
    )
session が与えられたとき、 end the session するには:
  1. session を active sessions から削除する。

  2. active sessions が 空である場合、 webdriver-active flag を false に設定する。

session が与えられたとき、cleanup the session するには:

  1. session で Close the WebSocket connections する。

  2. set of user contexts 内の各 user context について:

    1. session の user context to accept insecure certificates override map[user context] を削除する。

    2. session の user context to proxy configuration map[user context] を削除する。

  3. session の blocked request map 内の各 request id → (request, phase, response) について:

    1. "continue request"、request id および (response, "incomplete") で Resume する。

  4. session の network collectors 内の各 collector について:

    1. collector id を collector の collector とする。

    2. collected network data 内の各 collected data について、collected data および collector id で remove collector from data する。

  5. session の スクリーンキャスト 記録マップ内の各screencast recordingについて:

    1. screencast recordingを与えて、スクリーンキャスト記録を停止する。

    2. screencast recordingを除去する、スクリーンキャスト記録マップから。

  6. active sessions が 空である場合、 cleanup remote end state する。

  7. 実装固有のクリーンアップステップを実行する。

cleanup remote end state するには。
  1. before request sent map をクリアする。

  2. default cache behavior を "default" に設定する。

  3. navigable cache behavior map をクリアする。

  4. 現在の remote end 設定で通常有効にされる 実装固有のリソースキャッシュを有効にするための、実装定義のステップを実行する。

7.1.2. 型

7.1.2.1. session.CapabilitiesRequest 型
session.CapabilitiesRequest = {
  ? alwaysMatch: session.CapabilityRequest,
  ? firstMatch: [*session.CapabilityRequest]
}

session.CapabilitiesRequest 型は、セッションに対して要求されたケイパビリティを 表します。

7.1.2.2. session.CapabilityRequest 型

リモートエンド定義 および ローカルエンド定義

session.CapabilityRequest = {
  ? acceptInsecureCerts: bool,
  ? browserName: text,
  ? browserVersion: text,
  ? platformName: text,
  ? proxy: session.ProxyConfiguration,
  ? unhandledPromptBehavior: session.UserPromptHandler,
  Extensible
}

session.CapabilityRequest 型は、要求されたケイパビリティの特定の集合を 表します。

WebDriver BiDi は、追加の WebDriver ケイパビリティを定義します。以下の表は、各 実装が WebDriver BiDi でサポートしなければならないケイパビリティを列挙します。

ケイパビリティ: WebSocket URL
キー: "webSocketUrl"
値の型: ブール値
説明: 現在のセッションが双方向接続をサポートしているかどうかを定義します。
"webSocketUrl" ケイパビリティの 追加ケイパビリティのデシリアライズ アルゴリズムは、 パラメーター value を指定すると、次のようになります。
  1. value がブール値でない場合、エラーを コード 無効な引数で返します。

  2. データ value を伴う成功を返します。

"webSocketUrl" ケイパビリティの 一致したケイパビリティのシリアライズ アルゴリズムは、 パラメーター value を指定すると、次のようになります。
  1. value が false の場合、データ null を伴う成功 を返します。

  2. データ true を伴う成功を返します。

7.1.2.3. session.CapabilityResponse 型
session.CapabilityResponse = {
  acceptInsecureCerts: bool,
  browserName: text,
  browserVersion: text,
  platformName: text,
  setWindowRect: bool,
  userAgent: text,
  ? proxy: session.ProxyConfiguration,
  ? unhandledPromptBehavior: session.UserPromptHandler,
  ? webSocketUrl: text,
  Extensible
}

session.CapabilityResponse 型は、新しいセッションについてネゴシエーションされたすべての ケイパビリティを表します。

7.1.2.4. session.ProxyConfiguration 型

リモートエンド定義 および ローカルエンド定義

session.ProxyConfiguration = {
   session.AutodetectProxyConfiguration //
   session.DirectProxyConfiguration //
   session.ManualProxyConfiguration //
   session.PacProxyConfiguration //
   session.SystemProxyConfiguration
}

session.AutodetectProxyConfiguration = (
   proxyType: "autodetect",
   Extensible
)

session.DirectProxyConfiguration = (
   proxyType: "direct",
   Extensible
)

session.ManualProxyConfiguration = (
   proxyType: "manual",
   ? httpProxy: text,
   ? sslProxy: text,
   ? session.SocksProxyConfiguration,
   ? noProxy: [*text],
   Extensible
)

session.SocksProxyConfiguration = (
   socksProxy: text,
   socksVersion: 0..255,
)

session.PacProxyConfiguration = (
   proxyType: "pac",
   proxyAutoconfigUrl: text,
   Extensible
)

session.SystemProxyConfiguration = (
   proxyType: "system",
   Extensible
)
7.1.2.5. session.UserPromptHandler 型

リモートエンド定義 および ローカルエンド定義

session.UserPromptHandler = {
  ? alert: session.UserPromptHandlerType,
  ? beforeUnload: session.UserPromptHandlerType,
  ? confirm: session.UserPromptHandlerType,
  ? default: session.UserPromptHandlerType,
  ? file: session.UserPromptHandlerType,
  ? prompt: session.UserPromptHandlerType,
}

session.UserPromptHandler 型は、 ユーザープロンプトハンドラーの設定を表します。

注: file はファイルピッカーを処理します。"accept" および "dismiss" は ピッカーを閉じます。"ignore" はピッカーを開いたままにします。

7.1.2.6. session.UserPromptHandlerType 型

リモートエンド定義 および ローカルエンド定義

session.UserPromptHandlerType = "accept" / "dismiss" / "ignore";

session.UserPromptHandlerType 型は、ユーザープロンプトハンドラーの 動作を表します。

7.1.2.7. session.Subscription 型
session.Subscription = text

session.Subscription 型は、一意のサブスクリプション識別子を表します。

7.1.2.8. session.SubscribeParameters 型
session.SubscribeParameters = {
  events: [+text],
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

session.SubscribeParameters 型は、特定のイベント集合を サブスクライブする要求を表します。

7.1.2.9. session.UnsubscribeByIDRequest 型
session.UnsubscribeByIDRequest = {
  subscriptions: [+session.Subscription],
}

session.UnsubscribeByIDRequest 型は、 サブスクリプション ID によって識別されるイベントサブスクリプションを削除する要求を表します。

7.1.2.10. session.UnsubscribeByAttributesRequest 型
session.UnsubscribeByAttributesRequest = {
  events: [+text],
}

session.UnsubscribeByAttributesRequest 型は、 サブスクリプション属性を使用してサブスクライブ解除する要求を表します。

7.1.3. コマンド

7.1.3.1. session.status コマンド

session.status コマンドは、remote end が新しいセッションを 作成できる状態にあるかどうかについての情報を返し、 さらに実装固有の任意のメタ情報を含んでもよい。

これは static command である。

Command Type
session.Status = (
  method: "session.status",
  params: EmptyParams,
)
Return Type
session.StatusResult = {
  ready: bool,
  message: text,
}

session および command parameters が与えられたときの remote end steps は次である:

  1. body を、次のプロパティを持つ新しい map とする:

    "ready"
    remote end の readiness state。
    "message"
    remote end の readiness state を説明する実装定義の文字列。
  2. data body とともに success を返す

7.1.3.2. session.new コマンド

session.new コマンドにより、新しい BiDi session を作成できる。

注: この方法で作成されたセッションは、 HTTP 経由ではアクセスできない。

これは static command である。

Command Type
session.New = (
    method: "session.new",
    params: session.NewParameters
    )

    session.NewParameters = {
    capabilities: session.CapabilitiesRequest
    }
Return Type
session.NewResult = {
  sessionId: text,
  capabilities: session.CapabilityResponse
}

session および command parameters が与えられたときの remote end steps は次である:

  1. session が null でない場合、error code session not created を持つ error を返す。

  2. 実装が何らかの理由で新しいセッションを開始できない場合、 error code session not created を持つ error を返す。

  3. flags を、"bidi" を含む set とする。

  4. capabilities json を、command parameters および flags で process capabilities することを試みた結果とする。

  5. capabilities を、capabilities json で convert a JSON-derived JavaScript value to an Infra value したものとする。

  6. session を、capabilities および flags で create a session することを試みた結果とする。

  7. session の BiDi flag を true に設定する。

    注: このセッションの connection は、 呼び出し元によって現在の connection に設定される。

  8. body を、session.NewResult 生成規則に一致する 新しい map とし、sessionId フィールドを session の session ID に設定し、 capabilities フィールドを capabilities に設定する。

  9. data body とともに success を返す。

7.1.3.3. session.end コマンド

session.end コマンドは現在の セッションを終了する。

Command Type
session.End = (
    method: "session.end",
    params: EmptyParams
    )

Return Type
session.EndResult = EmptyResult

session および command parameters が与えられたときの remote end steps は次である:

  1. session で End the session する。

  2. data null とともに success を返し、並列に次の ステップを実行する:

    1. このコマンドへのレスポンスで Send a WebSocket message ステップが呼び出されるまで待つ。

      これは かなり不正確な表現だが、意図としては接続の シャットダウンを開始する前にコマンドへのレスポンスを送信する、ということが明確であることを期待している。

    2. session で Cleanup the session する。

7.1.3.4. session.subscribe コマンド

session.subscribe コマンドは、特定のイベントを グローバルに、または navigables の集合に対して有効にする。

これは realms でも機能するよう 一般化する必要がある。

Command Type
session.Subscribe = (
    method: "session.subscribe",
    params: session.SubscribeParameters
    )
Return Type
session.SubscribeResult = {
    subscription: session.Subscription,
    }
session および command parameters を伴う remote end steps は次である:
  1. event names を空の set とする。

  2. command parameters["events"] 内の各エントリー name について、 event names を、event names と、 name で obtain a set of event names することを 試みた結果との union とする。

  3. input user context ids を、command parameters[userContexts] で create a set したものとする。

  4. input context ids を、command parameters[contexts] で create a set したものとする。

  5. input user context ids が空でなく、かつ input context ids が空でない場合、 error を error code invalid argument とともに返す。

  6. subscription navigables を set とする。

  7. top-level traversable context ids を set とする。

  8. input context ids が空でない場合:

    1. navigables を、 input context ids で get valid navigables by ids することを 試みた結果とする。

    2. subscription navigables を、navigables で get top-level traversables したものに設定する。

    3. subscription navigables 内の各 navigable について:

      1. navigable の navigable id を top-level traversable context ids に追加する。

  9. そうでなく、input user context ids が空でない場合:

    1. input user context ids の各 user context id について反復する:

      1. user context を、user context id で get user context したものとする。

      2. user context が null である場合、error を error code no such user context とともに返す。

      3. user context である associated user context を持つ、すべての top-level traversables のリスト内の 各 top-level traversable について反復する:

        1. top-level traversable を subscription navigables に追加する。

  10. そうでなければ、subscription navigables を、remote end 内のすべての top-level traversables の set に設定する。

  11. subscription を、 subscription id が UUID の文字列表現に設定され、 event names が event names に設定され、 top-level traversable ids が top-level traversable context ids に設定され、 user context ids が input user context ids に設定された subscription とする。

  12. subscribe step events を新しい map とする。

  13. event names 内の各 event name について:

    1. event name event name を持つ event が remote end subscribe steps を定義していない場合、 continue する。

    2. existing navigables を、session および event name で set of top-level traversables for which an event is enabled したものとする。

    3. subscribe step events[event name] を、 subscription navigables と existing navigables の difference に設定する。

  14. subscription を session の subscriptions に追加する。

  15. subscription の subscription id を session の known subscription ids に追加する。

  16. subscribe step events を、キー event name one および event name two を持つ 2 つのエントリーが与えられたときの次の less than アルゴリズムを用いて昇順に並べ替える:

    1. event one を、名前 event name one を持つ event とする

    2. event two を、名前 event name two を持つ event とする

    3. event one の subscribe priority が event two の subscribe priority より小さい場合は true を返し、そうでなければ false を返す。

  17. subscription が global である場合、include global を true とし、 そうでなければ include global を false とする。

  18. subscribe step events 内の各 event name → navigables について:

    1. event name event name を持つ event について、 session、navigables および include global が与えられたものとして remote end subscribe steps を実行する。

  19. body を、session.SubscribeResult 生成規則に一致する 新しい map とし、 subscription フィールドを subscription の subscription id に設定する。

  20. data body とともに success を返す。

7.1.3.5. session.unsubscribe コマンド

session.unsubscribe コマンドは、イベントを グローバルに、または navigables の集合に対して無効にする。

これは realms でも機能するように 一般化する必要がある。

コマンド型
session.Unsubscribe = (
    method: "session.unsubscribe",
    params: session.UnsubscribeParameters,
    )

    session.UnsubscribeParameters = session.UnsubscribeByAttributesRequest / session.UnsubscribeByIDRequest
戻り値型
session.UnsubscribeResult = EmptyResult
session および command parameters を伴う remote end steps は次である:
  1. command parameters が "subscriptions" を含まない場合:

    注: この条件は、 command parameters が session.UnsubscribeByAttributesRequest 生成規則に一致することを意味する。

    1. event names を空の set とする。

    2. command parameters["events"] 内の各エントリー name について、 event names を、 event names と、name で obtain a set of event names することを 試みた結果との union とする。

    3. new subscriptions を list とする。

    4. matched events を set とする。

    5. session の subscriptions の各 subscription について:

      1. subscription の event names と event names のintersection が空の set である場合:

        1. subscription を new subscriptions に追加する。

        2. Continue する。

      2. subscription が global でない場合:

        1. subscription を new subscriptions に追加する。

        2. Continue する。

      3. subscription event names を、subscription の event names のclone とする。

      4. event names の各 event name について:

        1. subscription event names が event name を含む場合:

          1. event name を matched events に追加する。

          2. event name を subscription event names から削除する。

      5. subscription event names が空でない場合:

        1. cloned subscription を、 subscription id が subscription の subscription id に設定され、 event names が subscription event names を含む新しい set に設定された subscription とする。

        2. cloned subscription を new subscriptions に追加する。

    6. もし matched events と 等しい関係に event names がない場合、次を返す: エラー(エラーコード invalid argument)。

    7. session の subscriptions を new subscriptions に設定する。

  2. そうでなければ:

    1. subscriptions を、command parameters[subscriptions] で create a set したものとする。

    2. unknown subscription ids を、subscriptions と session の known subscription ids の間の difference とする。

    3. unknown subscription ids が空でない場合:

      1. error を error code invalid argument とともに返す。

    4. subscriptions to remove を空の set とする。

    5. session の subscriptions 内の各 subscription について:

      1. subscriptions が subscription の subscription id を含む場合:

        1. subscription を subscriptions to remove に追加する。

    6. session の known subscription ids を、 session の known subscription ids と subscriptions の間の difference に設定する。

    7. subscriptions to remove 内の各項目を session の subscriptions から削除する。

  3. data null とともに success を返す。

7.2. browser モジュール

browser モジュールは、 remote end のブラウザープロセスを管理するためのコマンドを含む。

7.2.1. 定義

remote end definition

BrowserCommand = (
    browser.Close //
    browser.CreateUserContext //
    browser.GetClientWindows //
    browser.GetUserContexts //
    browser.RemoveUserContext //
    browser.SetClientWindowState //
    browser.SetDownloadBehavior
    )

local end definition

BrowserResult = (
    browser.CloseResult /
    browser.CreateUserContextResult /
    browser.GetClientWindowsResult /
    browser.GetUserContextsResult /
    browser.RemoveUserContextResult /
    browser.SetClientWindowStateResult /
    browser.SetDownloadBehaviorResult
    )

7.2.2. ウィンドウ

各 top-level traversable は単一の client window に関連付けられる。これは、その top-level traversable の active document を、その visibility state が "visible" であるときにレンダリングするために使用される viewport を含む矩形領域を表し、 traversable の表示に関連付けられたブラウザー固有のユーザーインターフェイス要素 (例: URL バー、ツールバー、または OS のウィンドウ装飾)も表す。

client window は client window id を持ち、 これはそのウィンドウを一意に識別する文字列である。

client window は x-coordinate を持ち、これは web-exposed screen area の左端とウィンドウの左端との間の CSS ピクセル数、または特定のウィンドウについてそれが意味をなさない場合は ゼロである。

client window は y-coordinate を持ち、これは web-exposed screen area の上端とウィンドウの上端との間の CSS ピクセル数、または特定のウィンドウについてそれが意味をなさない場合は ゼロである。

client window は width を持ち、これは CSS ピクセルにおけるウィンドウ矩形の幅である。

client window は height を持ち、これは CSS ピクセルにおけるウィンドウ矩形の高さである。

window の maximize the client window を行うには、実装はプラットフォームにおける window の最大化の概念に対応する ステップを実行するか、 window の x-coordinate が可能な限り 0 に近くなり、 その y-coordinate が可能な限り 0 に近くなり、 その width が web-exposed screen area の幅に可能な限り近くなり、その height が web-exposed screen area の高さに可能な限り近くなるように window を配置するべきである。これらのいずれかの選択肢がサポートされる場合、 maximize client window is supported である。

window の minimize the client window を行うには、実装はプラットフォームにおける window の最小化の概念に対応する ステップを実行するか、 そうでなければ window に関連付けられた top-level traversables 内のすべての active documents の visibility state が "hidden" になり、かつ window の width および height がどちらも可能な限り 0 に近くなるように、 window を隠すべきである。これらのいずれかの選択肢が サポートされる場合、minimize client window is supported である。

window の restore the client window を行うには、実装はそれが プラットフォーム定義の最大化状態でも、プラットフォーム定義の 最小化状態でもなく、かつ window に関連付けられた 1 つ以上の top-level traversable が存在する場合は、そのうち少なくとも 1 つが "visible" 状態の active document を持つことを保証するべきである。 これがサポートされる場合、restore client window is supported である。

window が与えられたとき、get the client window state するには:

  1. documents を空の list とする。

  2. visible documents を空の list とする。

  3. 各 top-level traversable traversable について:

    1. traversable の client window が window でない場合、 continue する。

    2. document を traversable の active document とする。

    3. document を documents に追加する。

    4. document の visibility state が "visible" である場合、 document を visible documents に追加する。

  4. visible documents 内の各 document について:

    1. document の fullscreen element が null でない場合、 "fullscreen" を返す。

  5. visible documents が空であるが documents が 空でない場合、または window がその他の OS 固有の 最小化状態にある場合、"minimized" を返す。

    注: これは通常、必ずしもそうとは限らないが、 window の width および height が 0 に等しいことを意味する。

  6. window が OS 固有の最大化状態にある場合、 "maximized" を返す。

    注: これは通常、必ずしもそうとは限らないが、 window の width が web-exposed screen area の幅に等しく、 window の height が web-exposed screen area の高さに等しいことを意味する。

  7. "normal" を返す。

window および state が与えられたとき、set the client window state するには:

  1. current state を、window で get the client window state したものとする。

  2. current state が "fullscreen"、"maximized"、または "minimized" であり、かつ state と等しい場合、data null とともに success を返す。

  3. 次の条件と関連するステップのリストにおいて、 関連する条件が true である最初のステップ集合を実行する:

    "fullscreen"
    fullscreen is supported でない場合、error を error code unsupported operation とともに返す。
    "normal"
    window について restore client window is supported でない場合、error を error code unsupported operation とともに返す。
    "maximize"
    window について maximize client window is supported でない場合、error を error code unsupported operation とともに返す。
    "minimize"
    window について minimize client window is supported でない場合、error を error code unsupported operation とともに返す。
  4. documents を空の list とする。

  5. 各 top-level traversable traversable について:

    1. traversable に関連付けられた client window が window でない場合、 continue する。

    2. document を traversable の active document とする。

    3. document を documents に追加する。

  6. documents が空である場合、 error を error code no such client window とともに返す。

  7. current state が "fullscreen" である場合:

    1. documents 内の各 document について:

      1. document で Fully exit fullscreen する。

        注: これは、 fullscreen でない window 内の文書に対しては何もしない。

  8. current state が "maximized" または "minimized" である場合:

    1. window で Restore the client window する。

  9. state の値について分岐する:

    "fullscreen"
    1. documents 内の各 document について:

      1. document の visibility state が "visible" である場合、 document の document element で fullscreen an element する。

      2. Break する。

    "maximize"
    1. window で Maximize the client window する。
    "minimize"
    1. window で Minimize the client window する。
  10. data null とともに success を返す。

7.2.3. 型

7.2.3.1. browser.ClientWindow 型
browser.ClientWindow = text;

browser.ClientWindow は client window を一意に識別する。

7.2.3.2. browser.ClientWindowInfo 型
browser.ClientWindowInfo = {
  active: bool,
  clientWindow: browser.ClientWindow,
  height: js-uint,
  state: "fullscreen" / "maximized" / "minimized" / "normal",
  width: js-uint,
  x: js-int,
  y: js-int,
}

browser.ClientWindowInfo 型は、 client window のプロパティを表す。

client window が与えられたとき、 get the client window info するには:
  1. client window id を、client window の client window id とする。

  2. state を、client window で get the client window state したものとする。

  3. client window がオペレーティングシステムから送られるキーボード入力を 受け取ることができる場合、active を true とし、そうでなければ active を false とする。

    注: これは、client window である client window を持つ top-level traversable が system focus を持つことを意味する場合もあれば、 ブラウザー自体のユーザーインターフェイスが現在フォーカスを持つことを意味する場合もある。

  4. client window info を、 browser.ClientWindowsInfo 生成規則に一致する map とし、 clientWindow フィールドを client window id に、state フィールドを state に、x フィールドを client window の x-coordinate に、y フィールドを client window の y-coordinate に、width フィールドを client window の width に、height フィールドを client window の height に、active フィールドを active に設定したものとする。

  5. client window info を返す

7.2.3.3. browser.UserContext 型
browser.UserContext = text;

browser.UserContext は user context を一意に識別する。

7.2.3.4. browser.UserContextInfo 型
browser.UserContextInfo = {
    userContext: browser.UserContext
    }

browser.UserContextInfo 型は user context のプロパティを表す。

7.2.4. コマンド

7.2.4.1. browser.close コマンド

browser.close コマンドは、すべての WebDriver セッションを終了し、remote browser instance 内の自動化状態をクリーンアップする。

コマンド型
browser.Close = (
    method: "browser.close",
    params: EmptyParams,
    )
戻り値型
browser.CloseResult = EmptyResult
session および command parameters を伴う remote end steps は次である:
  1. session で End the session する。

  2. active sessions が空でない場合、 実装は unable to close browser の error code を持つ error を返してもよく、その後 次のステップを並列に実行する:

    1. このコマンドへのレスポンスで Send a WebSocket message ステップが呼び出されるまで待つ。

    2. session で Cleanup the session する。

    注: ブラウザーが複数の自動化 セッションを持つ場合の挙動は、現在未指定である。任意のセッションが ブラウザーを閉じられるのか、最後に開かれたセッションだけが実際に ブラウザーを閉じられるのか、あるいは最初に開始されたセッションだけが可能なのかもしれない。この挙動は、 この仕様の将来のバージョンで完全に指定されるかもしれない。

  3. active sessions 内の各 active session について:

    1. active session で End the session する。

    2. active session で Cleanup the session する

  4. data null とともに success を返し、次のステップを並列に実行する。

    1. このコマンドへのレスポンスで Send a WebSocket message ステップが呼び出されるまで待つ。

    2. session で Cleanup the session する。

    3. top-level traversables を、どれでも Close する。ただし prompting to unload しない。

    4. 自動化下の remote end に関連付けられたリソースを クリーンアップするための実装定義のステップを実行する。

      注: たとえばこれには、自動化下のブラウザーに関連付けられた OS レベルのプロセスを正常にシャットダウンすること、remote end が自動化下にある間に作成した ユーザープロファイルデータなどの一時状態を削除すること、または WebSocket Listener をシャットダウンすることが 含まれ得る。ブラウザーおよびオペレーティングシステムの違いにより、 local ends がここで依存できる正確な不変条件を 詳細に指定することはできない。

7.2.4.2. browser.createUserContext コマンド

browser.createUserContext コマンドは user context を作成する。

コマンド型
browser.CreateUserContext = (
  method: "browser.createUserContext",
  params: browser.CreateUserContextParameters,
)

browser.CreateUserContextParameters = {
  ? acceptInsecureCerts: bool,
  ? proxy: session.ProxyConfiguration,
  ? unhandledPromptBehavior: session.UserPromptHandler
}
戻り値型
browser.CreateUserContextResult = browser.UserContextInfo

session および command parameters を伴う remote end steps は次である:

  1. user context を新しい user context とする。

  2. command parameters が "acceptInsecureCerts" を含む場合:

    注: "acceptInsecureCerts" が 設定されている場合、それは accept insecure TLS flag の挙動を上書きする。

    1. acceptInsecureCerts を command parameters["acceptInsecureCerts"] とする:

    2. acceptInsecureCerts が true であり、endpoint node が insecure TLS connections の受け入れをサポートしていない場合、 unsupported operation の error code を持つ error を返す。

    3. session の user context to accept insecure certificates override map[user context] を acceptInsecureCerts に設定する。

  3. command parameters が "unhandledPromptBehavior" を含む場合、 unhandled prompt behavior overrides map[user context] を command parameters["unhandledPromptBehavior"] に設定する。

  4. command parameters が "proxy" を含む場合:

    1. proxy configuration を command parameters["proxy"] とする。

    2. remote end が user context ごとに proxy settings を構成できない場合、 または proxy configuration で proxy を構成できない場合、 unsupported operation の error code を持つ error を返す。

    3. session の user context to proxy configuration map[user context] を proxy configuration に設定する。

  5. user context を set of user contexts に追加する。

  6. user context info を、 browser.UserContextInfo 生成規則に一致する map とし、 userContext フィールドを user context の user context id に設定したものとする。

  7. data user context info とともに success を返す。

7.2.4.3. browser.getClientWindows コマンド

browser.getClientWindows コマンドは、 client window のリストを返す。

コマンド型
browser.GetClientWindows = (
    method: "browser.getClientWindows",
    params: EmptyParams,
    )
戻り値型
browser.GetClientWindowsResult = {
    clientWindows: [ * browser.ClientWindowInfo]
    }

remote end steps は次である:

  1. client window ids を空の set とする。

  2. client windows を空の list とする。

  3. 各 top-level traversable traversable について:

    1. client window を、traversable に関連付けられた client window とする

    2. client window id を、client window の client window id とする。

    3. client window ids が client window id を含む場合、continue する。

    4. client window id を client window ids に追加する。

    5. client window info を、client window で get the client window info したものとする。

    6. client window info を client windows に追加する。

  4. result を、 browser.GetClientWindowsResult 生成規則に一致する map とし、 clientWindows フィールドを client windows に設定したものとする。

  5. data result とともに success を返す。

7.2.4.4. browser.getUserContexts コマンド

browser.getUserContexts コマンドは、 user context のリストを返す。

コマンド型
browser.GetUserContexts = (
    method: "browser.getUserContexts",
    params: EmptyParams,
    )
戻り値型
browser.GetUserContextsResult = {
    userContexts: [ + browser.UserContextInfo]
    }

remote end steps は次である:

  1. user contexts を空の list とする。

  2. set of user contexts 内の各 user context について:

    1. user context info を、 browser.UserContextInfo 生成規則に一致する map とし、 userContext フィールドを user context の user context id に設定したものとする。

    2. user context info を user contexts に追加する。

  3. result を、 browser.GetUserContextsResult 生成規則に一致する map とし、 userContexts フィールドを user contexts に設定したものとする。

  4. data result とともに success を返す。

7.2.4.5. browser.removeUserContext コマンド

browser.removeUserContext コマンドは、 beforeunload ハンドラーを実行せずに、user context およびその中のすべての navigables を閉じる。

コマンド型
browser.RemoveUserContext = (
    method: "browser.removeUserContext",
    params: browser.RemoveUserContextParameters
    )

    browser.RemoveUserContextParameters = {
    userContext: browser.UserContext
    }
戻り値型
browser.RemoveUserContextResult = EmptyResult

command parameters を伴う remote end steps は次である:

  1. user context id を command parameters["userContext"] とする。

  2. user context id が "default" である場合、error を error code invalid argument とともに返す。

  3. user context を、user context id で get user context したものに設定する。

  4. user context が null である場合、error を error code no such user context とともに返す。

  5. 各 top-level traversable navigable について:

    1. navigable の associated user context が user context である場合:

      1. navigable を閉じる。ただし prompting to unload しない。

  6. user context を set of user contexts から削除する。

  7. data null とともに success を返す。

7.2.4.6. browser.setClientWindowState コマンド

browser.setClientWindowState コマンドは、 client window の寸法を設定する。

コマンド型
browser.SetClientWindowState = (
    method: "browser.setClientWindowState",
    params: browser.SetClientWindowStateParameters
    )

    browser.SetClientWindowStateParameters = {
    clientWindow: browser.ClientWindow,
    (browser.ClientWindowNamedState // browser.ClientWindowRectState)
    }

    browser.ClientWindowNamedState = (
    state: "fullscreen" / "maximized" / "minimized"
    )

    browser.ClientWindowRectState = (
    state: "normal",
    ? width: js-uint,
    ? height: js-uint,
    ? x: js-int,
    ? y: js-int,
    )
戻り値型
browser.SetClientWindowStateResult = browser.ClientWindowInfo

session および command parameters を伴う remote end steps は次である:

  1. 実装が client window state の設定をまったくサポートしていない場合、 unsupported operation の error code を持つ error を返す。

  2. command parameters["clientWindow"] の client window id を持つ client window が存在する場合、client window をその client window とする。 そうでなければ、no such client window の error code を持つ error を返す。

  3. client window および command parameters["state"] で set the client window state することを試みる。

  4. command parameters["state"] が "normal" である場合:

    1. command parameters が "x" を含み、かつ実装が client windows の位置指定をサポートする場合、client window の x-coordinate を、 command parameters["x"] に可能な限り近い値に設定する。

    2. command parameters が "y" を含み、かつ実装が client windows の位置指定をサポートする場合、client window の y-coordinate を、 command parameters["y"] に可能な限り近い値に設定する。

    3. command parameters が "width" を含み、かつ実装が client windows のリサイズをサポートする場合、 client window の width を command parameters["width"] に可能な限り近い値に設定する。

    4. command parameters が "width" を含み、かつ実装が client windows のリサイズをサポートする場合、 client window の width を command parameters["width"] に可能な限り近い値に設定する。

  5. client window info を、client window で get the client window info したものとする。

  6. data client window info とともに success を返す。

注: 単純化のため、これはすべての client window 操作を 同期的なものとしてモデル化している。したがって、返される client window の寸法は、 window が新しい状態に到達した後のものになることが期待される。

7.2.4.7. browser.setDownloadBehavior コマンド

download behavior struct は、次を持つ struct である:

remote end は download behavior を持ち、これは struct であり、 default download behavior という名前の item を持つ。これは download behavior struct または null であり、さらに user context download behavior という名前の item を持つ。これは user contexts と download behavior struct の間の weak map である。

コマンド型
browser.SetDownloadBehavior = (
  method: "browser.setDownloadBehavior",
  params: browser.SetDownloadBehaviorParameters
)

browser.SetDownloadBehaviorParameters = {
  downloadBehavior: browser.DownloadBehavior / null,
  ? userContexts: [+browser.UserContext]
}

browser.DownloadBehavior = {
  (
    browser.DownloadBehaviorAllowed //
    browser.DownloadBehaviorDenied
  )
}

browser.DownloadBehaviorAllowed = (
  type: "allowed",
  destinationFolder: text
)

browser.DownloadBehaviorDenied = (
  type: "denied"
)
戻り値型
browser.SetDownloadBehaviorResult = EmptyResult
navigable が与えられたとき、 get download behavior するには:
  1. user context を navigable の associated user context とする。

  2. download behavior の user context download behavior が user context を含む場合、download behavior の user context download behavior[user context] を返す。

  3. download behavior の default download behavior を返す。

session および command parameters を伴う remote end steps は次である:

  1. command parameters["downloadBehavior"] が null である場合、 download behavior を null とする。

  2. そうでなければ:

    1. command parameters["downloadBehavior"]["type"] が "allowed" である場合、allowed を true とし、そうでなければ allowed を false とする。

    2. command parameters["downloadBehavior"] が "destinationFolder" を含む場合、destinationFolder を command parameters["downloadBehavior"]["destinationFolder"] とし、 そうでなければ destinationFolder を null とする。

    3. download behavior を、allowed が allowed に設定され、 destinationFolder が destinationFolder に設定された download behavior struct とする。

  3. 実装が要求された download behavior をサポートしていない場合、 error を error code unsupported operation とともに返す。

  4. command parameters の userContexts フィールドが存在する場合:

    1. user contexts を、 command parameters["userContexts"] で get valid user contexts することを試みた結果とする。

    2. user contexts の各 user context について:

      1. download behavior が null である場合、user context を download behavior の user context download behavior から削除する。

      2. そうでなければ、download behavior の user context download behavior[user context] を download behavior に設定する。

  5. そうでなければ、download behavior の default download behavior を download behavior に設定する。

  6. data null とともに success を返す。

7.3. browsingContext モジュール

browsingContext モジュールは、navigables に関係するコマンドおよび イベントを含む。

注: 歴史的な理由により、このモジュールは navigable ではなく browsingContext と呼ばれ、プロトコルは navigables を指すために context という用語を使用する。これは特にコマンドおよび レスポンスパラメーター内のフィールドとして用いられる。

ナビゲーションの進行状況は、次の items を持つ、 不変の struct WebDriver BiDi navigation status を用いて伝達される:

id
ナビゲーションの navigation id、または進行する前にナビゲーションが 取り消された場合は null。
status
"canceled"、 "pending"、または "complete" のいずれかであるステータスコード。
url
ナビゲーションで読み込まれている URL
suggestedFilename
ナビゲーションがダウンロードである場合は提案されるファイル名、そうでなければ null。
downloadedFilepath
ナビゲーションが完了済みのダウンロードであり、ダウンロードされたファイルが 利用可能である場合は、そのダウンロードファイルの絶対ファイルパス、そうでなければ null。
downloadResponse
ナビゲーションがダウンロードである場合は、response、 そうでなければ null。

7.3.1. 定義

remote end definition

BrowsingContextCommand = (
  browsingContext.Activate //
  browsingContext.CaptureScreenshot //
  browsingContext.Close //
  browsingContext.Create //
  browsingContext.GetTree //
  browsingContext.HandleUserPrompt //
  browsingContext.LocateNodes //
  browsingContext.Navigate //
  browsingContext.Print //
  browsingContext.Reload //
  browsingContext.SetBypassCSP //
  browsingContext.SetViewport //
  browsingContext.StartScreencast //
  browsingContext.StopScreencast //
  browsingContext.TraverseHistory
)

local end definition

BrowsingContextResult = (
  browsingContext.ActivateResult /
  browsingContext.CaptureScreenshotResult /
  browsingContext.CloseResult /
  browsingContext.CreateResult /
  browsingContext.GetTreeResult /
  browsingContext.HandleUserPromptResult /
  browsingContext.LocateNodesResult /
  browsingContext.NavigateResult /
  browsingContext.PrintResult /
  browsingContext.ReloadResult /
  browsingContext.SetBypassCSPResult /
  browsingContext.SetViewportResult /
  browsingContext.StartScreencastResult /
  browsingContext.StopScreencastResult /
  browsingContext.TraverseHistoryResult
)

BrowsingContextEvent = (
  browsingContext.ContextCreated //
  browsingContext.ContextDestroyed //
  browsingContext.DomContentLoaded //
  browsingContext.DownloadEnd //
  browsingContext.DownloadWillBegin //
  browsingContext.FragmentNavigated //
  browsingContext.HistoryUpdated //
  browsingContext.Load //
  browsingContext.NavigationAborted //
  browsingContext.NavigationCommitted //
  browsingContext.NavigationFailed //
  browsingContext.NavigationStarted //
  browsingContext.UserPromptClosed //
  browsingContext.UserPromptOpened
)

remote end は device pixel ratio overrides を持ち、これは navigables と device pixel ratio overrides の間の weak map である。 これは初期状態では空である。

注: この map は最後のセッションが終了しても クリアされない。すなわち device pixel ratio overrides はどの WebDriver セッションよりも長く存続する。

viewport dimensions は、次を持つ struct である:

viewport configuration は、次を持つ struct である:

unhandled prompt behavior struct は、次を持つ struct である:

remote end は viewport overrides map を持ち、これは user contexts と viewport configuration の間の weak map である。

remote end は locale overrides map を持ち、これは navigables または user contexts と string の間の weak map である。

screen settings は struct であり、 height という名前の item を持つ。これは integer であり、 width という名前の item を持つ。これは integer であり、 x という名前の item を持つ。これは integer であり、 y という名前の item を持つ。これは integer である。

remote end は screen settings overrides を持ち、これは struct であり、 user context screen settings という名前の item を持つ。これは user contexts と screen settings の間の weak map であり、 さらに navigable screen settings という名前の item を持つ。これは navigables と screen settings の間の weak map である。

remote end は timezone overrides map を持ち、これは navigables または user contexts と string の間の weak map である。

remote end は unhandled prompt behavior overrides map を持ち、これは user contexts と unhandled prompt behavior struct の間の weak map である。

remote end は scripting enabled overrides map を持ち、これは navigables または user contexts と boolean の間の weak map である。

リモートエンドは、ダウンロード ID マップを持つ。これは responseとダウンロード ID の間の weak map である。これは初期状態では空である。

スクリーンキャストストリームは、 トップレベル辿可能のビューポートの抽象ストリームであり、映像トラック から成り、これはトップレベル辿可能の文書のビューポートのレンダリングされた視覚出力を含み、 また任意で、トップレベル辿可能の文書の音声出力を含む 音声トラックを含む。

BiDi セッションは、スクリーンキャスト 記録マップを持つ。これはマップであり、 そのキーはUUID、値はスクリーンキャスト記録である。 これは構造体であり、 streamという名前の 項目を持ち、これはスクリーンキャストストリームであり、 pathという名前の 項目を持ち、これは文字列であり、 stateという名前の 項目を持ち、これは "recording", "stopping", "stopped" のいずれかであり、 writeErrorという名前の 項目を持ち、これは文字列または null である。

スクリーンキャスト記録 recording と mime type が与えられたとき、スクリーンキャスト記録を開始するには:
  1. 以下の手順を並列に実行する:

    1. mime typeを用いてrecordingのstreamの符号化を開始し、 符号化済みデータの連続するチャンクをバイト シーケンスとして生成する。 recordingのstateが "recording" である間、 実装定義の間隔で新しいチャンクを生成する。

    2. recordingについて生成された各チャンク bytes について、以下の手順を実行する:

      1. bytesをrecordingのpathにあるファイルに追加する。 これが失敗した場合:

        1. recordingのwriteErrorを、 書き込み失敗を説明する実装定義の文字列に設定する。

        2. recordingが与えられたとして、スクリーンキャスト記録を停止する。

スクリーンキャスト記録 recording が与えられたとき、スクリーンキャスト記録を停止するには:
  1. recordingのstateが "recording" でないなら、 戻る。

  2. recordingのstateを "stopping" に設定する。

  3. recordingについて新しいチャンクを生成することを停止し、残っている符号化済み データを最終チャンクとしてフラッシュし(スクリーンキャスト 記録を開始するの場合と同様に処理される)、 recordingのstreamからのキャプチャを停止し、 その 映像トラックと、存在する場合はその 音声トラックを解放し、その後 recordingの stateを "stopped" に設定する。

  4. recordingのstateが "stopped" になるまで待つ。

7.3.2. 型

7.3.2.1. browsingContext.BrowsingContext 型

remote end definition および local end definition

browsingContext.BrowsingContext = text;

各 navigable は、関連付けられた navigable id を持つ。 これは、その navigable を一意に識別する string である。これは navigable が作成されるときに暗黙的に設定される。関連付けられた WebDriver window handle を持つ navigables については、navigable id は window handle と同じでなければならない。

各 navigable は、associated storage partition も持つ。 これは、その navigable がデータを永続化するために使用する storage partition である。

各 navigable は、関連付けられた original opener も持つ。 これは、その navigable を開かせた navigable または null であり、初期状態では null に設定される。

navigable id が与えられたとき、 get a navigable するには:
  1. navigable id が null である場合、data null とともに success を返す。

  2. navigable id navigable id を持つ navigable が存在しない場合、 no such frame の error code を持つ error を返す

  3. navigable を、id navigable id を持つ navigable とする。

  4. data navigable とともに success を返す。

7.3.2.2. browsingContext.Info 型

local end definition

browsingContext.InfoList = [*browsingContext.Info]

browsingContext.BaseInfo = (
  children: browsingContext.InfoList / null,
  clientWindow: browser.ClientWindow,
  context: browsingContext.BrowsingContext,
  originalOpener: browsingContext.BrowsingContext / null,
  url: text,
  userContext: browser.UserContext,
  ? parent: browsingContext.BrowsingContext / null,
)

browsingContext.Info = {
  browsingContext.BaseInfo
}

browsingContext.Info 型は navigable のプロパティを表す。

navigable が与えられたとき、 get the child navigables するには:

TODO: これが文書順のリストを返すようにする

  1. child navigables を、navigable の child navigable であるすべての navigables を含む set とする。

  2. child navigables を返す。

navigable、 max depth および include parent id が与えられたとき、 get the navigable info するには:
  1. navigable id を、navigable の navigable id とする。

  2. parent navigable を navigable の parent とする。

  3. parent navigable が null でない場合、parent id を parent navigable の navigable id とする。 そうでなければ、 parent id を null とする。

  4. document を navigable の active document とする。

  5. url を、document の URL が与えられたものとして URL serializer を実行した結果とする。

    注: これは URL の fragment component を含む。

  6. child infos を null とする。

  7. max depth が null である、または max depth が 0 より大きい場合:

    1. child navigables を、navigable が与えられたものとして get the child navigables したものとする。

    2. max depth が null でない場合、child depth を max depth - 1 とし、そうでなければ null とする。

    3. child infos を空の list に設定する。

    4. child navigables の各 child navigable について:

      1. info を、 child navigable、child depth および false が与えられたものとして get the navigable info した結果とする。

      2. info を child infos に追加する

  8. user context を navigable の associated user context とする。

  9. navigable の original opener が null でない場合、 opener id を navigable の original opener の navigable id とし、 そうでなければ null とする。

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

  11. client window id を、top-level traversable に関連付けられた client window の client window id とする。

  12. navigable info を、 browsingContext.Info 生成規則に一致する map とし、context フィールドを navigable id に、include parent id が true である場合は parent フィールドを parent id に設定し、そうでなければ未設定とし、 url フィールドを url に、userContext フィールドを user context の user context id に、originalOpener フィールドを opener id に、children フィールドを child infos に、 clientWindow フィールドを client window id に設定したものとする。

  13. navigable info を返す。

navigable、request、wait condition、および任意で history handling(デフォルト: "default")と ignore cache(デフォルト: false)が 与えられたとき、await a navigation するには:
  1. navigation id を、真のランダムまたは擬似ランダムな数値に基づく UUID の文字列表現とする。

  2. navigable を resource request で navigate し、source Document として navigable の active document を用い、 navigation id navigation id および history handling behavior history handling を用いる。ignore cache が true である場合、 そのナビゲーションは HTTP cache からリソースを読み込んではならない。

    ignore cache flag がどのように機能するかを適切に指定する必要がある。これは、リソースの最初の読み込みだけが cache をバイパスするのか (すなわち、最初に cache をクリアして通常どおり進むのと同様であるか)、 または HTML parser によって直接読み込まれないリソース (例: scripts または stylesheets によって開始される読み込み)も cache をバイパスするのかを考慮する必要がある。

  3. (event received, navigation status) を、 «"navigation started", "navigation failed", "fragment navigated"» および navigation id が与えられたものとして await したものとする。

  4. Assert: navigation status の id は navigation id である。

  5. navigation status の status が "complete" である場合:

    1. body を、 browsingContext.NavigateResult 生成規則に一致する map とし、 navigation フィールドを navigation id に、url フィールドを navigation status の url が与えられたものとして URL serializer を実行した結果に設定したものとする。

    2. data body とともに success を返す。

    注: これは、そのナビゲーションが fragment の変更だけを 引き起こした場合である。

  6. navigation status の status が "canceled" である場合、 unknown error の error code を持つ error を返す。

    TODO: ここでエラーを扱うにはこれが正しい方法か?

  7. Assert: navigation status の status は "pending" であり、navigation id は null でない。

  8. wait condition が "committed" である場合、event name を "committed" とする。

  9. そうでなく、wait condition が "interactive" である場合、event name を "domContentLoaded" とする。

  10. そうでなければ、event name を "load" とする。

  11. (event received, status) を、 «event name, "download started", "navigation aborted", "navigation failed"» および navigation id が与えられたものとして await したものとする。

  12. event received が "navigation failed" である場合、 unknown error の error code を持つ error を返す。

    ここでの error により、何が失敗し、なぜ失敗したのかについて十分な情報を 表面化できているか? どの error code が望ましいか? local ends が実装定義の文字列を 解析して、実際に何が問題だったのかを把握しようとする問題は生じるか?

  13. body を、 browsingContext.NavigateResult 生成規則に一致する map とし、 navigation フィールドを status の id に、 url フィールドを status の url が与えられたものとして URL serializer を実行した結果に設定したものとする。

  14. data body とともに success を返す。

7.3.2.3. browsingContext.Locator 型

remote end definition および local end definition

browsingContext.Locator = (
   browsingContext.AccessibilityLocator /
   browsingContext.CssLocator /
   browsingContext.ContextLocator /
   browsingContext.InnerTextLocator /
   browsingContext.XPathLocator
)

browsingContext.AccessibilityLocator = {
   type: "accessibility",
   value: {
    ? name: text,
    ? role: text,
   }
}

browsingContext.CssLocator = {
   type: "css",
   value: text
}

browsingContext.ContextLocator = {
  type: "context",
  value: {
    context: browsingContext.BrowsingContext,
  }
}

browsingContext.InnerTextLocator = {
   type: "innerText",
   value: text,
   ? ignoreCase: bool
   ? matchType: "full" / "partial",
   ? maxDepth: js-uint,
}

browsingContext.XPathLocator = {
   type: "xpath",
   value: text
}

browsingContext.Locator 型は、文書内の node を特定するための strategy についての詳細を提供する。

7.3.2.4. browsingContext.Navigation 型

remote end definition および local end definition

browsingContext.Navigation = text;

browsingContext.Navigation 型は、進行中の navigation を識別する一意の string である。

TODO: HTML 仕様内の定義へリンクする。

7.3.2.5. browsingContext.Download 型

remote end 定義 および local end 定義

browsingContext.Download = text;

browsingContext.Download 型は、ダウンロードを識別する一意な文字列である。

7.3.2.6. browsingContext.NavigationInfo 型

local end 定義:

browsingContext.BaseNavigationInfo = (
  context: browsingContext.BrowsingContext,
  navigation: browsingContext.Navigation / null,
  timestamp: js-uint,
  url: text,
  ? userContext: browser.UserContext,
)

browsingContext.NavigationInfo = {
  browsingContext.BaseNavigationInfo
}

browsingContext.NavigationInfo 型は、進行中の navigation の詳細を提供する。

navigable navigable および navigation status navigation status が与えられたとき、 get the navigation info するには:
  1. navigable id を、navigable の navigable id とする。

  2. navigation id を navigation status の id とする。

  3. timestamp を、UTC での現在の日付および時刻を表す time value とする。

  4. url を navigation status の url とする。

  5. user context id を、navigable の associated user context の user context id とする。

  6. browsingContext.NavigationInfo 生成規則に一致する map を返す。 context フィールドは navigable id に、navigation フィールドは navigation id に、timestamp フィールドは timestamp に、 url フィールドは url が与えられたものとして URL serializer を実行した結果に、 userContext フィールドは user context id に設定される。

7.3.2.7. browsingContext.ReadinessState 型
browsingContext.ReadinessState = "none" / "interactive" / "complete"

browsingContext.ReadinessState 型は、ナビゲーションコマンドが戻る 文書読み込みの段階を表す。

7.3.2.8. browsingContext.UserPromptType 型

remote end 定義 および local end 定義

browsingContext.UserPromptType = "alert" / "beforeunload" / "confirm" / "prompt";

browsingContext.UserPromptType 型は、可能なユーザー プロンプト型を表す。

7.3.3. コマンド

7.3.3.1. browsingContext.activate コマンド

browsingContext.activate コマンドは、 指定された top-level traversable をアクティブ化し、フォーカスする。

コマンド型
browsingContext.Activate = (
    method: "browsingContext.activate",
    params: browsingContext.ActivateParameters
    )

    browsingContext.ActivateParameters = {
    context: browsingContext.BrowsingContext
    }
戻り値型
browsingContext.ActivateResult = EmptyResult

command parameters を伴う remote end steps は次である:

  1. navigable id を command parameters["context"] フィールドの値とする。

  2. navigable を、navigable id で get a navigable することを試みた結果とする。

  3. navigable が top-level traversable でない場合、 invalid argument の error code を持つ error を返す。

  4. navigable で activate a navigable した結果を返す。

navigable が与えられたとき、 activate a navigable するには:
  1. navigable の system visibility state が visible になるように、実装固有のステップを実行する。 これが不可能である場合、error code unsupported operation を持つ error を返す。

    注: これは、現在 visible である navigables を hidden にする副作用を持ち得る。

    注: これは、window を最小化解除すること、または system visibility state の変更に関連するその他の副作用により、 基礎となる OS 状態を変更し得る。

  2. navigable がフォーカスされていない場合、navigable に system focus を設定するための実装固有のステップを実行する。

    注: これは、他の仕様で義務付けられている場合を除き、 focused area of the document を変更しない。

  3. data null とともに success を返す。

7.3.3.2. browsingContext.captureScreenshot コマンド

browsingContext.captureScreenshot コマンドは、 指定された navigable の画像をキャプチャし、それを Base64 エンコードされた文字列として返す。

コマンド型
browsingContext.CaptureScreenshot = (
  method: "browsingContext.captureScreenshot",
  params: browsingContext.CaptureScreenshotParameters
)

browsingContext.CaptureScreenshotParameters = {
  context: browsingContext.BrowsingContext,
  ? origin: ("viewport" / "document") .default "viewport",
  ? format: browsingContext.ImageFormat,
  ? clip: browsingContext.ClipRectangle,
  ? imageSize: browsingContext.ImageSize,
}

browsingContext.ImageFormat = {
   type: text,
   ? quality: 0.0..1.0,
}

browsingContext.ImageSize = {
   ? maxWidth: (js-uint .ge 1),
   ? maxHeight: (js-uint .ge 1),
}

browsingContext.ClipRectangle = (
  browsingContext.BoxClipRectangle /
  browsingContext.ElementClipRectangle
)

browsingContext.ElementClipRectangle = {
  type: "element",
  element: script.SharedReference
}

browsingContext.BoxClipRectangle = {
   type: "box",
   x: float,
   y: float,
   width: float,
   height: float
}
戻り値型
browsingContext.CaptureScreenshotResult = {
  data: text
}
rect が与えられたとき、 normalize rect するには:

注: これは、結果の rect が正の width dimension および height dimension を持つことを保証する。

  1. x を rect の x coordinate とする。

  2. y を rect の y coordinate とする。

  3. width を rect の width dimension とする。

  4. height を rect の height dimension とする。

  5. width が 0 未満である場合、x を x + width に設定し、 その後 width を -width に設定する。

  6. height が 0 未満である場合、y を y + height に設定し、 その後 height を -height に設定する。

  7. x coordinate x、y coordinate y、width dimension width および height dimension height を持つ新しい DOMRectReadOnly を返す。

rect1 および rect2 が与えられたとき、 rectangle intersection するには
  1. rect1 を、rect1 で normalize rect したものとする。

  2. rect2 を、rect2 で normalize rect したものとする。

  3. x1_0 を rect1 の x coordinate とする。

  4. x2_0 を rect2 の x coordinate とする。

  5. x1_1 を、rect1 の x coordinate に rect1 の width dimension を加えたものとする。

  6. x2_1 を、rect2 の x coordinate に rect2 の width dimension を加えたものとする。

  7. x_0 を «x1_0, x2_0» の最大要素とする。

  8. x_1 を «x1_1, x2_1» の最小要素とする。

  9. y1_0 を rect1 の y coordinate とする。

  10. y2_0 を rect2 の y coordinate とする。

  11. y1_1 を、rect1 の y coordinate に rect1 の height dimension を加えたものとする。

  12. y2_1 を、rect2 の y coordinate に rect2 の height dimension を加えたものとする。

  13. y_0 を «y1_0, y2_0» の最大要素とする。

  14. y_1 を «y1_1, y2_1» の最小要素とする。

  15. x_1 が x_0 未満である場合、width を 0 とする。そうでなければ width を x_1 - x_0 とする。

  16. y_1 が y_0 未満である場合、height を 0 とする。そうでなければ height を y_1 - y_0 とする。

  17. x coordinate x_0、y coordinate y_0、width dimension width および height dimension height を持つ新しい DOMRectReadOnly を返す。

数値を丸めるには、 numberを与えて、次の手順を実行する:
  1. numberが有限でないか、またはnumberが整数の Numberである場合、numberを返す。

  2. number < 0.5𝔽かつnumber > +0𝔽である場合、+0𝔽を返す。

  3. number < -0𝔽かつn ≥ -0.5𝔽である場合、-0𝔽を返す。

  4. numberに最も近い整数のNumberを返す。同距離の場合は、 +∞に近いNumberを優先する。

document、rect、image sizeが与えられたとき、文書を canvas にレンダリングするには、次の手順を実行する。
  1. ratioを、documentの デフォルトビューを与えて デバイスピクセル比を決定することによって得られる値とする。

  2. framebuffer widthを、rectの幅の寸法に ratioを乗じた値とし、デバイスピクセル単位でrectの幅と一致するようにする。

  3. framebuffer heightを、rectの高さの寸法に ratioを乗じた値とし、デバイスピクセル単位でrectの高さと一致するようにする。

  4. scaleを 1 とする。

  5. image sizeが null でない場合:

    1. max widthを、存在する場合はimage sizeのmaxWidthフィールド、 そうでない場合は null とする。

    2. max heightを、存在する場合はimage sizeのmaxHeightフィールド、 そうでない場合は null とする。

    3. max widthが null でなく、max widthをframebuffer widthで除算した値 がscaleより小さい場合、scaleをmax widthを framebuffer widthで除算した値に設定する。

    4. max heightが null でなく、max heightを framebuffer heightで除算した値がscaleより小さい場合、scaleをmax heightを framebuffer heightで除算した値に設定する。

  6. scaleが 1 より小さい場合:

    1. scale widthを、framebuffer widthに scaleを乗じた値を与えて数値を丸めることによって得られる値とする。

    2. scale heightを、framebuffer heightに scaleを乗じた値を与えて数値を丸めることによって得られる値とする。

    3. paint widthを 1 とscale widthの最大値とする。

    4. paint heightを 1 とscale heightの最大値とする。

  7. そうでない場合:

    1. paint widthをframebuffer widthとする。

    2. paint heightをframebuffer heightとする。

  8. canvasを、widthが paint width、heightが paint heightである新しいHTMLCanvasElement とする。

  9. canvas contextを、canvasと null を用いて2D コンテキスト作成アルゴリズム を実行した結果とする。

  10. canvasのコンテキストモードを2Dに設定する。

  11. source xをrectのx 座標にratioを乗じた値とし、 また source yをrectのy 座標にratioを乗じた値とする。

  12. source rectangleを、その四隅が次の 4 点である矩形とする。 (source x, source y)、(source x + framebuffer width, source y)、 (source x + framebuffer width, source y + framebuffer height)、および (source x, source y + framebuffer height)。

  13. destination rectangleを、その四隅が次の 4 点である矩形とする。 (0, 0)、(paint width, 0)、(paint width, paint height)、 および (0, paint height)。

  14. source rectangleで指定された documentのフレームバッファの領域を、destination rectangleで指定された canvas contextの出力ビットマップの領域に描画することと等価な、実装固有の手順を完了する。

    destination rectangleの寸法がsource rectangleより小さい場合、 destination rectangle内のある点に描画される値は、 documentのフレームバッファのデータをフィルタリングすることによって計算される。ユーザーエージェントは 任意のフィルタリングアルゴリズム(たとえば、バイリニア補間または最近傍法)を使用してよい。 フィルタリングアルゴリズムがフレームバッファの外側にあるピクセル値を必要とする場合、 代わりに最も近い端のピクセルの値を使用しなければならない。(つまり、フィルターは "clamp-to-edge" 動作を使用する。) フィルタリングアルゴリズムがsource rectangleの外側 かつフレームバッファの内側にあるピクセル値を必要とする場合、フレームバッファの値を使用しなければならない。

  15. canvasを返す。

キャンバスをBase64 としてエンコードするには、canvasおよびformatを与えて、次の手順を実行する:
  1. formatがnullでない場合、typeをformatのtypeフィールド、 qualityをformatのqualityフィールドとする。

  2. それ以外の場合、typeを"image/png"とし、qualityをundefinedとする。

  3. fileを、canvasについて typeおよびqualityを用いたファイルとしてのビットマップのシリアル化とする。

  4. encoded stringを、fileの寛容なBase64エンコードとする。

  5. データencoded stringを伴う成功を返す。

原点の 矩形を取得するには、documentおよびoriginを与えて、次の手順を実行する:
  1. originが"viewport"である場合:

    1. viewportを、documentの視覚ビューポートとする。

    2. viewport rectを、x座標が viewportのページ左端、y座標が viewportのページ上端、幅の寸法が viewportの幅、そして高さの寸法がviewportの 高さであるDOMRectReadOnlyとする。

    3. データviewport rectを伴う成功を返す。

  2. 表明:originは"document"である。

  3. document elementを、documentの文書要素とする。

  4. document rectを、x座標が0、y座標が0、幅の寸法がdocument elementのスクロール高さ、 そして高さの寸法がdocument elementのスクロール幅であるDOMRectReadOnlyとする。

  5. データdocument rectを伴う成功を返す。

sessionおよびcommand parametersを用いるリモートエンド手順は次のとおり:

  1. navigable idを、存在する場合はcommand parametersのcontextフィールドの値、 それ以外の場合はnullとする。

  2. navigableを、navigable idを用いてナビゲーション可能を取得することを試行した 結果とする。

  3. 実装が何らかの理由でnavigableのスクリーンショットをキャプチャできない場合、 エラーをエラー コード未対応の操作とともに返す。

  4. documentを、navigableのアクティブな文書とする。

  5. documentについてアニメーションフレームコールバックを実行するアルゴリズムが 次に呼び出された直後に:

    これは、より明示的な方法で レンダリング更新アルゴリズムに統合されるべきである。[w3c/webdriver-bidi Issue #1131]

  6. originを、存在する場合はcommand parametersのcontextフィールドの値、それ以外の場合は"viewport"とする。

  7. origin rectを、originおよびdocumentを 与えて原点の 矩形を取得することを試行した結果とする。

  8. clip rectをorigin rectとする。

  9. command parametersが"clip"を含む場合:

    1. clipをcommand parameters["clip"]とする。

    2. 最初に一致する条件の下にある手順を実行する:

      clipがbrowsingContext.ElementClipRectangle 生成規則に一致する場合:
      1. environment settingsを、その 関連する大域オブジェクトの関連付けられた Documentが documentである環境設定オブジェクトとする。

      2. realmを、environment settingsのRealm実行コンテキストの Realmコンポーネントとする。

      3. elementを、clip["element"]、realm、 およびsessionを用いてリモート 参照をデシリアライズすることを試行した結果とする。

      4. elementがElement を実装していない場合、エラーをエラーコード そのような要素はないとともに返す。

      5. elementのノード文書が documentでない場合、エラーを エラーコードそのような要素はないとともに返す。

      6. viewport rectを、"viewport"およびdocumentを 与えて原点の矩形を取得することで得られる値とする。

      7. element rectを、elementについて境界ボックスを取得することで得られる値とする。

      8. clip rectを、x座標が element rect["x"] + viewport rect["x"]、 y座標がelement rect["y"] + viewport rect["y"]、幅がelement rect["width"]、 高さがelement rect["height"]であるDOMRectReadOnlyとする。

      clipがbrowsingContext.BoxClipRectangle生成規則に一致する場合:
      1. clip xを、clip["x"]にorigin rectのx座標を加えた値とする。

      2. clip yを、clip["y"]にorigin rectのy座標を加えた値とする。

      3. clip rectを、x座標がclip x、 y座標がclip y、幅がclip["width"]、高さが clip["height"]であるDOMRectReadOnlyとする。

  10. 注: これですべての座標は文書の 原点から測定される。

  11. rectを、origin rectと clip rectの矩形の交差領域とする。

  12. rectの幅の寸法が0、またはrectの高さの寸法が0である場合、 エラーコード画面をキャプチャできないを伴うエラーを返す。

  13. image sizeを、存在する場合はcommand parametersのimageSizeフィールドの値、それ以外の場合はnullとする。

  14. canvasを、document、rectおよび image sizeを用いて文書をキャンバスにレンダリングすることで得られる値とする。

  15. formatを、command parametersのformatフィールドとする。

  16. encoding resultを、canvasおよび formatを用いてキャンバスをBase64としてエンコードすることを試行した結果とする。

  17. bodyを、 browsingContext.CaptureScreenshotResult生成規則に一致するマップとし、その dataフィールドをencoding resultに設定する。

  18. データbodyを伴う成功を返す。

7.3.3.3. browsingContext.close コマンド

browsingContext.close コマンドは top-level traversable を閉じる。

コマンド型
browsingContext.Close = (
  method: "browsingContext.close",
  params: browsingContext.CloseParameters
)

browsingContext.CloseParameters = {
  context: browsingContext.BrowsingContext,
  ? promptUnload: bool .default false
}
戻り値型
browsingContext.CloseResult = EmptyResult
command parameters を伴う remote end steps は次である:
  1. navigable id を command parameters の context フィールドの値とする。

  2. prompt unload を command parameters の promptUnload フィールドの値とする。

  3. navigable を、navigable id で get a navigable することを試みた結果とする。

  4. Assert: navigable は null でない。

  5. navigable が top-level traversable でない場合、 invalid argument の error code を持つ error を返す。

  6. prompt unload が true である場合:

    1. navigable を閉じる。

  7. そうでなければ:

    1. Close navigable without prompting to unload.

  8. data null とともに success を返す。

最後の top-level traversable を閉じるときの挙動について、 未解決の議論がある。ブラウザーを閉じること、セッションを閉じること、またはこれを実装に委ねることが 期待され得る。[w3c/webdriver-bidi Issue #170]

7.3.3.4. browsingContext.create コマンド

browsingContext.create コマンドは、新しい navigable を、新しいタブまたは新しいウィンドウのいずれかに作成し、その navigable id を返す。

コマンド型
browsingContext.Create = (
  method: "browsingContext.create",
  params: browsingContext.CreateParameters
)

browsingContext.CreateType = "tab" / "window"

browsingContext.CreateParameters = {
  type: browsingContext.CreateType,
  ? referenceContext: browsingContext.BrowsingContext,
  ? background: bool .default false,
  ? userContext: browser.UserContext
}
戻り値型
browsingContext.CreateResult = {
    context: browsingContext.BrowsingContext,
    ? userContext: browser.UserContext
    }
command parameters を伴う remote end steps は次である:
  1. typeを、command parametersのtypeフィールドの値とする。

  2. reference navigable idを、存在する場合はcommand parametersの referenceContextフィールドの値、そうでなければ null とする。

  3. reference navigable idが null でない場合、reference navigableを、 reference navigable idで試行してnavigable を取得する結果とする。 そうでなければ、reference navigableを null とする。

  4. reference navigableが null でなく、かつトップレベル辿可能でない場合、 エラーを、エラー コードinvalid argumentで返す。

  5. 実装が何らかの理由で新しいトップレベル辿可能を作成できない場合、 エラーを、エラー コードunsupported operationで返す。

  6. user contextを、reference navigableが null である場合は既定のユーザーコンテキスト、 そうでなければreference navigableの関連付けられたユーザー コンテキストとする。

  7. user context idを、存在する場合はcommand parametersの userContextフィールドの値、そうでなければ null とする。

  8. user context idが null でない場合、user contextを、 user context idで試行してユーザーコンテキストを取得する結果に設定する。

  9. user contextが null である場合、エラーを、エラーコードそのようなユーザー コンテキストはないで返す。

  10. 実装が何らかの理由で、トップレベル辿可能を 関連付けられたユーザーコンテキスト user context とともに新しく作成できない場合、 エラーを、エラー コードunsupported operationで返す。

  11. traversable を、null、空文字列、 null、および false を指定して 新しいトップレベル traversable を作成する 手順を試行した結果とし、新しく作成された 関連付けられたユーザーコンテキスト を トップレベル traversable の user context に設定する。 新しい トップレベル traversable がどの OS ウィンドウに作成されるかは、 type および reference navigable に依存する:

    • typeが "tab" であり、実装が同じ OS ウィンドウ内の複数のトップレベル辿可能をサポートする場合:

      • 新しいトップレベル辿可能は、 既存の OS ウィンドウがあれば、それを再利用するべきである。

      • reference navigableが null でない場合、新しいトップレベル辿可能は、 reference navigableを含むウィンドウがあれば、それを再利用するべきである。OS ウィンドウ内の トップレベル辿可能たちに明確な順序がある場合、 新しいトップレベル辿可能は、その順序において reference navigableのトップレベル辿可能の直後にあるべきである。

    • typeが "window" であり、実装が別々の OS ウィンドウ内の複数のトップレベル辿可能をサポートする場合、作成された トップレベル辿可能は新しい OS ウィンドウ内にあるべきである。

    • そうでなければ、トップレベル辿可能がユーザーにどのように提示されるかの詳細は、 実装定義である。

  12. command parametersのbackgroundフィールドの値が false である場合:

    1. activate resultを、新しく作成されたnavigableでnavigable を有効化する結果とする。

    2. activate resultがエラーである場合、 activate resultを返す。

    注記: backgroundが true である場合、作成された navigable に対してフォーカス手順を呼び出してはならない。

  13. bodyを、contextフィールドがtraversableのnavigable IDに設定され、 userContextプロパティがtraversableの 関連付けられたユーザーコンテキストのユーザー コンテキスト IDに設定された、 browsingContext.CreateResult 生成規則に一致するマップとする。

  14. 成功をデータ body とともに返す。

7.3.3.5. browsingContext.getTree コマンド

browsingContext.getTree コマンドは、指定された親自身を含む すべての子孫 navigables の tree、または親が提供されない場合はすべての top-level contexts を返す。

コマンド型
browsingContext.GetTree = (
  method: "browsingContext.getTree",
  params: browsingContext.GetTreeParameters
)

browsingContext.GetTreeParameters = {
  ? maxDepth: js-uint,
  ? root: browsingContext.BrowsingContext,
}
戻り値型
browsingContext.GetTreeResult = {
    contexts: browsingContext.InfoList
    }
session および command parameters を伴う remote end steps は次である:
  1. root id を、command parameters に root フィールドが存在する場合は その値とし、そうでなければ null とする。

  2. max depth を、command parameters に maxDepth フィールドが存在する場合はその値とし、そうでなければ null とする。

  3. navigables を空の list とする。

  4. root id が null でない場合、 root id が与えられたものとして get a navigable することを試みた結果を navigables に追加する。 そうでなければ、すべての top-level traversables を navigables に追加する。

  5. navigables infos を空の list とする。

  6. navigables の各 navigable について:

    1. info を、 navigable、max depth、および true が与えられたものとして get the navigable info した結果とする。

    2. info を navigables infos に追加する

  7. body を、browsingContext.GetTreeResult 生成規則に一致する map とし、contexts フィールドを navigables infos に設定したものとする。

  8. data body とともに success を返す。

7.3.3.6. browsingContext.handleUserPrompt コマンド

browsingContext.handleUserPrompt コマンドは、開いている prompt を閉じられるようにする

コマンド型
browsingContext.HandleUserPrompt = (
  method: "browsingContext.handleUserPrompt",
  params: browsingContext.HandleUserPromptParameters
)

browsingContext.HandleUserPromptParameters = {
  context: browsingContext.BrowsingContext,
  ? accept: bool,
  ? userText: text,
}
戻り値型
browsingContext.HandleUserPromptResult = EmptyResult

session および command parameters を伴う remote end steps は次である:

  1. navigable id を command parameters の context フィールドの値とする。

  2. navigable を、navigable id で get a navigable することを試みた結果とする。

  3. accept を、 command parameters に accept フィールドが存在する場合はその値とし、 そうでなければ true とする。

  4. userText を、 command parameters に userText フィールドが存在する場合はその値とし、 そうでなければ空文字列とする。

  5. navigable が現在、alert の呼び出しによる simple dialog を表示している場合、 prompt を acknowledge する。

    そうでなく、navigable が現在 confirm の呼び出しによる simple dialog を表示している場合、 accept が true なら肯定的に応答し、 accept が false なら否定的に応答する。

    そうでなく、navigable が現在 prompt の呼び出しによる simple dialog を表示している場合、 accept が true なら文字列値 userText で応答し、accept が false なら中止する。

    そうでなく、navigable が現在 prompt to unload steps の一部として prompt を表示している場合、 accept が true なら navigation を確認し、そうでなければ navigation を拒否する。

    そうでなければ、no such alert の error code を持つ error を返す。

  6. data null とともに success を返す。

7.3.3.7. browsingContext.locateNodes コマンド

browsingContext.locateNodes コマンドは、指定された locator に一致するすべての nodes のリストを返す。

コマンド型
browsingContext.LocateNodes = (
  method: "browsingContext.locateNodes",
  params: browsingContext.LocateNodesParameters
)

browsingContext.LocateNodesParameters = {
   context: browsingContext.BrowsingContext,
   locator: browsingContext.Locator,
   ? maxNodeCount: (js-uint .ge 1),
   ? serializationOptions: script.SerializationOptions,
   ? startNodes: [ + script.SharedReference ]
}
戻り値型
browsingContext.LocateNodesResult = {
        nodes: [ * script.NodeRemoteValue ]
    }
与えられた navigable、context nodes、 selector、maximum returned node count、および session で locate nodes using CSS するには:
  1. returned nodes を空の list とする。

  2. parse result を、selector が与えられたものとして parse a selector した結果とする。

  3. parse result が failure である場合、invalid selector の error code を持つ error を返す。

  4. context nodes の各 context node について:

    1. elements を、 parse result および navigable の active document の root を用い、 scoping root context node を用いて match a selector against a tree した結果とする。

    2. elements 内の各 element について:

      1. element を returned nodes に追加する。

      2. maximum returned node count が null でなく、かつ returned nodes の size が maximum returned node count に等しい場合、 data returned nodes とともに success を返す。

  5. data returned nodes とともに success を返す。

navigable が与えられたとき、 locate the container element するには:
  1. returned nodes を空の list とする。

  2. navigable の container が null でない場合、 navigable の container を returned nodes に追加する。

  3. returned nodes を返す。

与えられた navigable、context nodes、 selector、および maximum returned node count で locate nodes using XPath するには:

注: XPath 仕様が保守されていない状態であるため、 このアルゴリズムは XPath DOM APIs への呼び出しを行うかのように記述されている。 しかしこれは、ECMAScript runtime を経由せずに、基礎となるアルゴリズムへ直接アクセスする 仕様内部の呼び出しと等価であると理解されるべきである。

  1. returned nodes を空の list とする。

  2. context nodes の各 context node について:

    1. evaluate result を、navigable の active document 上で、引数 selector、 context node、null、 ORDERED_NODE_SNAPSHOT_TYPE、 および null を用いて evaluate を呼び出した結果とする。 これが "SyntaxError" DOMException を投げる場合、 invalid selector の error code を持つ error を返す; そうでなく、これが他の例外を投げる場合、unknown error の error code を持つ error を返す。

    2. index を 0 とする。

    3. length を、evaluate result から snapshotLength プロパティを 取得した結果とする。

    4. index が length 未満である間、繰り返す:

      1. node を、evaluate result を this とし、index を引数として snapshotItem を呼び出した結果とする。

      2. node を returned nodes に追加する。

      3. maximum returned node count が null でなく、かつ returned nodes の size が maximum returned node count に等しい場合、 data returned nodes とともに success を返す。

      4. index を index + 1 に設定する。

  3. data returned nodes とともに success を返す。

与えられた context nodes、selector、max depth、 match type、ignore case、および maximum returned node count で locate nodes using inner text するには:
  1. selector が空文字列である場合、 invalid selector の error code を持つ error を返す。

  2. returned nodes を空の list とする。

  3. ignore case が false である場合、search text を selector とする。そうでなければ、 search text を、Unicode Default Case Conversion algorithm に従って、 selector で toUppercase した結果とする。

  4. context nodes 内の各 context node について:

    1. context node が Document または DocumentFragment を実装している場合:

      注: document または document fragment をたどるとき、document と document.documentElement で検索結果が等価になるように、 max depth は意図的に減らされない。

      1. child nodes を空の list とする。

      2. context node の children 内の各 node child について。

        1. child を child nodes に追加する。

      3. child nodes、selector、max depth、 match type、ignore case、および maximum returned node count で locate nodes using inner text することを試みた結果で returned nodes を拡張する。

    2. context node が HTMLElement を実装していない場合、continue する。

    3. node inner text を、 context node を this 値として innerText getter steps を呼び出した結果とする。

    4. ignore case が false である場合、node text を node inner text とする。そうでなければ、 node text を、Unicode Default Case Conversion algorithm に従って、 node inner text で toUppercase した結果とする。

    5. search text が node text の code point substring である場合、 次のステップを実行する:

      1. child nodes を空の list とし、 context node の children 内の各 node child について:

        1. child を child nodes に追加する。

      2. child nodes の size が 0 に等しい、または max depth が 0 に等しい場合、 次のステップを実行する:

        1. match type が "full" であり、node text が search text である場合、 context node を returned nodes に追加する。

        2. そうでなく、match type が "partial" である場合、 context node を returned nodes に追加する。

      3. そうでなければ、次のステップを実行する:

        1. max depth が null である場合、child max depth を null とし、 そうでなければ max depth - 1 とする。

        2. child node matches を、 child nodes、selector、child max depth、match type、 ignore case、および maximum returned node count で locate nodes using inner text した結果とする。

        3. child node matches の size が 0 に等しく、かつ match type が "partial" である場合、context node を returned nodes に追加する。そうでなければ、 child node matches で returned nodes を 拡張する。

  5. maximum returned node count が null でない場合、returned nodes 内で index が maximum returned node count 以上であるすべての entries を削除する。

  6. data returned nodes とともに success を返す。

与えられた context nodes、selector、 maximum returned node count、および returned nodes で collect nodes using accessibility attributes するには:
  1. returned nodes が null である場合:

    1. returned nodes を空の list に設定する。

  2. context nodes 内の各 context node について:

    1. match を true とする。

    2. context node が Element を実装している場合:

      1. selector が "role" を含む場合:

        1. role を context node の computed role とする。

        2. selector["role"] が role でない場合:

          1. match を false に設定する。

      2. selector が "name" を含む場合:

        1. name を context node の accessible name とする。

        2. selector["name"] が name でない場合:

          1. match を false に設定する。

    3. そうでなければ、match を false に設定する。

    4. match が true である場合:

      1. maximum returned node count が null でなく、かつ returned nodes の size が maximum returned node count に等しい場合、 break する。

      2. context node を returned nodes に追加する。

    5. child nodes を空の list とし、 context node の children 内の各 node child について:

      1. child が Element を実装している場合、 child を child nodes に追加する。

    6. child nodes、 selector、maximum returned node count、および returned nodes で collect nodes using accessibility attributes することを試みる。

  3. returned nodes を返す。

与えられた context nodes、selector、および maximum returned node count で locate nodes using accessibility attributes するには:
  1. selector が "role" を含まず、 かつ selector が "name" を含まない場合、 invalid selector の error code を持つ error を返す。

  2. context nodes、 selector、maximum returned node count、および null で collect nodes using accessibility attributes した結果を返す。

session および command parameters を伴う remote end steps は次である:
  1. navigable id を command parameters["context"] とする。

  2. navigable を、navigable id で get a navigable することを試みた結果とする。

  3. Assert: navigable は null でない。

  4. realm を、 navigable の navigable id および null で get a realm from a navigable することを試みた結果とする。

  5. locator を command parameters["locator"] とする。

  6. command parameters が "startNodes" を含む場合、 start nodes parameter を command parameters["startNodes"] とする。 そうでなければ、start nodes parameter を null とする。

  7. command parameters が "maxNodeCount" を含む場合、 maximum returned node count を command parameters["maxNodeCount"] とする。 そうでなければ、maximum returned node count を null とする。

  8. context nodes を空の list とする。

  9. start nodes parameter が null である場合、navigable の active document を context nodes に追加する。 そうでなければ、start nodes parameter 内の各 serialized start node について:

    1. start node を、 serialized start node、realm、および session が与えられたものとして deserialize shared reference することを試みた結果とする。

    2. start node を context nodes に追加する。

  10. context nodes の size が 0 より大きいことを Assert する。

  11. type を locator["type"] とする。

  12. 次の条件と関連するステップのリストにおいて、関連する条件が true である最初の ステップセットを実行する:

    type が文字列 "css" である
    1. selector を locator["value"] とする。

    2. result nodes を、navigable、context nodes、 selector、および maximum returned nodes が与えられたものとして locate nodes using css することを試みた結果とする。

    type が文字列 "xpath" である
    1. selector を locator["value"] とする。

    2. result nodes を、navigable、context nodes、 selector、および maximum returned nodes が与えられたものとして locate nodes using xpath することを試みた結果とする。

    type が文字列 "innerText" である
    1. selector を locator["value"] とする。

    2. locator が maxDepth を含む場合、max depth を locator["maxDepth"] とする。そうでなければ、max depth を null とする。

    3. locator が ignoreCase を含む場合、 ignore case を locator["ignoreCase"] とする。そうでなければ、ignore case を false とする。

    4. locator が matchType を含む場合、 match type を locator["matchType"] とする。そうでなければ、match type を "full" とする。

    5. result nodes を、 context nodes、selector、max depth、 match type、 ignore case および maximum returned node count が与えられたものとして locate nodes using inner text することを試みた結果とする。

    type が文字列 "accessibility" である
    1. selector を locator["value"] とする。

    2. result nodes を、 context nodes、selector、および maximum returned node count が与えられたものとして locate nodes using accessibility attributes したものとする。

    type が文字列 "context" である
    1. start nodes parameter が null でない場合、 error code "invalid argument" を持つ error を返す。

    2. selector を locator["value"] とする。

    3. context id を selector["context"] とする。

    4. child navigable を、 context id で get a navigable することを試みた結果とする。

    5. child navigable の parent が navigable でない場合、 error code "invalid argument" を持つ error を返す。

    6. result nodes を、child navigable が与えられたものとして locate the container element したものとする。

    7. Assert: result nodes 内の各 node について、 node の node navigable は navigable である。

  13. Assert: maximum returned node count は null である、または result nodes の size は maximum returned node count 以下である。

  14. command parameters が "serializationOptions" を含む場合、 serialization options を command parameters["serializationOptions"] とする。 そうでなければ、serialization options を、 フィールドを既定値に設定した script.SerializationOptions 生成規則に一致する map とする。

  15. result ownership を "none" とする。

  16. serialized nodes を空の list とする。

  17. result nodes 内の各 result node について:

    1. serialized node を、 result node、serialization options、result ownership、 serialization internal map としての新しい map、 realm および session で serialize as a remote value した結果とする。

    2. serialized node を serialized nodes に追加する。

  18. result を、 browsingContext.LocateNodesResult 生成規則に一致する map とし、nodes フィールドを serialized nodes に設定したものとする。

  19. data result とともに success を返す。

7.3.3.8. browsingContext.navigate コマンド

browsingContext.navigate コマンドは、 navigable を指定された URL へナビゲートする。

コマンド型
browsingContext.Navigate = (
  method: "browsingContext.navigate",
  params: browsingContext.NavigateParameters
)

browsingContext.NavigateParameters = {
  context: browsingContext.BrowsingContext,
  url: text,
  ? wait: browsingContext.ReadinessState,
}
戻り値型
browsingContext.NavigateResult = {
  navigation: browsingContext.Navigation / null,
  url: text,
}
session および command parameters を伴う remote end steps は次である:
  1. navigable id を command parameters の context フィールドの値とする。

  2. navigable を、navigable id で get a navigable することを試みた結果とする。

  3. Assert: navigable は null でない。

  4. wait condition を "committed" とする。

  5. command parameters が wait を含み、 かつ command parameters[wait] が "none" でない場合、 wait condition を command parameters[wait] に設定する。

  6. url を command parameters の url フィールドの値とする。

  7. document を navigable の active document とする。

  8. base を document の base URL とする。

  9. url record を、base URL base で url に URL parser を適用した結果とする。

  10. url record が failure である場合、invalid argument の error code を持つ error を返す。

  11. request を、URL が url record である新しい request とする。

  12. navigable、 request および wait condition で await a navigation した結果を返す。

7.3.3.9. browsingContext.print コマンド

browsingContext.print コマンドは、 document のページ分割された表現を作成し、それを Base64 エンコードされた文字列として表される PDF document として返す。

コマンド型
browsingContext.Print = (
  method: "browsingContext.print",
  params: browsingContext.PrintParameters
)

browsingContext.PrintParameters = {
  context: browsingContext.BrowsingContext,
  ? background: bool .default false,
  ? margin: browsingContext.PrintMarginParameters,
  ? orientation: ("portrait" / "landscape") .default "portrait",
  ? page: browsingContext.PrintPageParameters,
  ? pageRanges: [*(js-uint / text)],
  ? scale: (0.1..2.0) .default 1.0,
  ? shrinkToFit: bool .default true,
}

browsingContext.PrintMarginParameters = {
  ? bottom: (float .ge 0.0) .default 1.0,
  ? left: (float .ge 0.0) .default 1.0,
  ? right: (float .ge 0.0) .default 1.0,
  ? top: (float .ge 0.0) .default 1.0,
}

; Minimum size is 1pt x 1pt. Conversion follows from
; https://www.w3.org/TR/css3-values/#absolute-lengths
browsingContext.PrintPageParameters = {
  ? height: (float .ge 0.0352) .default 27.94,
  ? width: (float .ge 0.0352) .default 21.59,
}
戻り値型
browsingContext.PrintResult = {
  data: text
}

sessionおよびcommand parametersを伴うリモートエンド手順は次のとおりである:

  1. navigable idを、command parametersのcontextフィールドの値とする。

  2. navigableを、navigable idで試行してnavigable を取得する 結果とする。

  3. 実装が何らかの理由でnavigableのページ分割された表現を提供できない場合、 エラーを、エラーコード unsupported operationで返す。

  4. marginを、存在する場合はcommand parametersのmarginフィールドの値、そうでなければ フィールドが既定値に設定された browsingContext.PrintMarginParametersに一致する マップとする。

  5. page sizeを、存在する場合はcommand parametersのpageフィールドの値、そうでなければ フィールドが既定値に設定された browsingContext.PrintPageParametersに一致する マップとする。

注記: 最小ページサイズは 1 ポイントであり、これは 絶対長に従うと (2.54 / 72) cm である。

  1. page rangesを、存在する場合は command parametersのpageRangesフィールドの値、そうでなければ空のリストとする。

  2. documentを、navigableのアクティブ文書とする。

  3. documentに対するアニメーションフレームコールバックを実行する アルゴリズムの次の呼び出しの直後に:

    これは、より明示的な方法で レンダリング更新アルゴリズムに統合される べきである。 [w3c/webdriver-bidi 課題 #1131]

    1. pdf dataを、UA 固有の手順を実行してdocumentの ページ分割された表現を生成した結果とする。このとき、CSS のメディア型は printに設定され、PDF として符号化され、以下の用紙設定を用いる:

      プロパティ 値
      幅(cm) command parameters["orientation"] が "portrait" である場合はpage size["width"]、 そうでなければpage size["height"]
      高さ(cm) command parameters["orientation"] が "portrait" である場合はpage size["height"]、 そうでなければpage size["width"]
      上余白(cm) margin["top"]
      下余白(cm) margin["bottom"]
      左余白(cm) margin["left"]
      右余白(cm) margin["right"]

      加えて、UA は以下の整形ヒントを適用するべきである:

      command parameters["scale"] が 1と等しくない場合:
      コンテンツのサイズをcommand parameters["scale"] 倍でズームする
      command parameters["background"] が false である場合:
      背景画像の出力を抑制する
      command parameters["shrinkToFit"] が true である場合:
      コンテンツ内で指定されたページ幅を上書きし、ページ幅に合わせてコンテンツのサイズを変更する
    2. page rangesが空でない場合、 pagesを、page rangesおよびpdf dataに含まれるページ数で 試行してページ範囲をパースする結果とし、その後、1 から始まるインデックスが pagesに含まれないページをpdf dataから除去する。

    3. encoding resultを、pdf dataに対して Base64 Encodeを呼び出した結果とする。

    4. encoded dataを、encoding resultの data とする。

    5. bodyを、dataフィールドがencoded dataに設定された browsingContext.PrintResult生成規則に一致する マップとする。

    6. 成功をデータ body とともに返す。

7.3.3.10. browsingContext.reload コマンド

browsingContext.reload コマンドは navigable を再読み込みする。

コマンド型
browsingContext.Reload = (
  method: "browsingContext.reload",
  params: browsingContext.ReloadParameters
)

browsingContext.ReloadParameters = {
  context: browsingContext.BrowsingContext,
  ? ignoreCache: bool,
  ? wait: browsingContext.ReadinessState,
}
戻り値型
browsingContext.ReloadResult = browsingContext.NavigateResult
command parameters を伴う remote end steps は次である:
  1. navigable id を command parameters の context フィールドの値とする。

  2. navigable を、navigable id で get a navigable することを試みた結果とする。

  3. Assert: navigable は null でない。

  4. ignore cache を、command parameters に ignoreCache フィールドが存在する場合はその値とし、 そうでなければ false とする。

  5. wait condition を "committed" とする。

  6. command parameters が wait を含み、 かつ command parameters[wait] が "none" でない場合、 wait condition を command parameters[wait] に設定する。

  7. document を navigable の active document とする。

  8. url を document の URL とする。

  9. request を、URL が url である新しい request とする。

  10. navigable、 request、wait condition、history handling "reload"、および ignore cache ignore cache で await a navigation した結果を返す。

7.3.3.11. browsingContext.setBypassCSP コマンド

browsingContext.setBypassCSP コマンドは、 Content Security Policy の適用をバイパスできるようにする。

注: CSP bypass が有効である場合、 eval()、new Function()、inline scripts、および resource loading を通常ブロックするものを含め、 すべての CSP directives がバイパスされる。

コマンド型
browsingContext.SetBypassCSP = (
  method: "browsingContext.setBypassCSP",
  params: browsingContext.SetBypassCSPParameters
)

browsingContext.SetBypassCSPParameters = {
  bypass: true / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
戻り値型
browsingContext.SetBypassCSPResult = EmptyResult

remote end は bypass CSP configuration を持ち、これは associated type boolean を持つ WebDriver configuration である。

navigable navigable が与えられたとき、 WebDriver BiDi CSP is bypassed steps は次である:

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

  2. bypass CSP enabled を、top-level traversable についての bypass CSP configuration の get WebDriver configuration value の結果とする。

  3. Assert: bypass CSP enabled は true または unset である。

  4. bypass CSP enabled が unset である場合、false を返す。

  5. true を返す。

command parameters が与えられたときの remote end steps は次である:

  1. bypass を command parameters["bypass"] とする。

  2. bypass が null である場合、bypass を unset に設定する。

  3. command parameters について、 bypass CSP configuration bypass を store WebDriver configuration することを試みる。

  4. data null とともに success を返す。

7.3.3.12. browsingContext.setViewport コマンド

browsingContext.setViewport コマンドは、指定された top-level traversable 上の特定の viewport 特性(例: viewport width および viewport height)を変更する。

コマンド型
browsingContext.SetViewport = (
  method: "browsingContext.setViewport",
  params: browsingContext.SetViewportParameters
)

browsingContext.SetViewportParameters = {
  ? context: browsingContext.BrowsingContext,
  ? viewport: browsingContext.Viewport / null,
  ? devicePixelRatio: (float .gt 0.0) / null,
  ? userContexts: [+browser.UserContext],
}

browsingContext.Viewport = {
  width: js-uint,
  height: js-uint,
}
戻り値型
browsingContext.SetViewportResult = EmptyResult
navigable および device pixel ratio が与えられたとき、 set device pixel ratio override するには:
  1. device pixel ratio が null でない場合:

    1. 指定された navigable に現在読み込まれている document について:

      1. select an image source from a source set steps が実行されるとき、画像を選択する際に 実装の pixel density が device pixel ratio に設定されたかのように振る舞う。

      2. resolution media feature の目的では、 実装の resolution が page zoom によってスケールされた device pixel ratio dppx であるかのように振る舞う。

    2. device pixel ratio overrides[navigable] を device pixel ratio に設定する。

      注: これは § 8.3.1 Determine the device pixel ratio のパッチにより効果を持つ。

  2. そうでなければ:

    1. 指定された navigable に現在読み込まれている document について:

      1. select an image source from a source set steps が実行されるとき、 これらのステップの以前の呼び出しによって行われた変更なしに、 実装の既定の挙動を使用する。

      2. resolution media feature の目的では、 これらのステップの以前の呼び出しによって行われた変更なしに、 実装の既定の挙動を使用する。

    2. device pixel ratio overrides から navigable を削除する。

  3. 指定された navigable に現在読み込まれている document について evaluate media queries and report changes を実行する。

navigable navigable および viewport viewport が与えられたとき、 set viewport するには:
  1. viewport が null でない場合、navigable の layout viewport の width を CSS pixels における viewport の width に設定し、 navigable の layout viewport の height を CSS pixels における viewport の height に設定する。

  2. そうでなければ、navigable の layout viewport を 実装定義の既定値に設定する。

新しい navigable navigable に document を作成した後、かつ run WebDriver BiDi preload scripts algorithm が 呼び出される前:

TODO: 代わりに html spec の hook として移動する。

  1. user context を navigable の associated user context とする。

  2. navigable が top-level traversable である場合:

    1. navigable について Update geolocation override する。

    2. navigable について Update emulated forced colors theme する。

    3. screen orientation overrides map が user context を含む場合、 navigable および screen orientation overrides map[user context] で set emulated screen orientation する。

  3. viewport overrides map が user context を含む場合:

    1. navigable が top-level traversable であり、かつ viewport overrides map[user context] の viewport が null でない場合:

      1. navigable および viewport overrides map[user context] の viewport で Set viewport する。

    2. viewport overrides map[user context] の devicePixelRatio が null でない場合:

      1. navigable および viewport overrides map[user context] の devicePixelRatio で Set device pixel ratio override する。

  4. navigable について Update scrollbar type override する。

  5. テキストレイアウトモードのオーバーライドを更新する: navigable について。

command parameters を伴う remote end steps は次である:

  1. 実装が何らかの理由で、指定された command parameters を用いて layout viewport parameters を調整できない場合、 unsupported operation の error code を持つ error を返す。

  2. command parameters が "userContexts" を含み、 かつ command parameters が "context" を含む場合、 invalid argument の error code を持つ error を返す。

  3. navigables を set とする。

  4. command parameters の context フィールドが存在する場合:

    1. navigable id を command parameters の context フィールドの値とする。

    2. navigable を、 navigable id で get a navigable することを試みた結果とする。

    3. navigable が top-level traversable でない場合、 invalid argument の error code を持つ error を返す。

    4. navigable を navigables に追加する。

  5. そうでなく、command parameters の userContexts フィールドが存在する場合:

    1. user contexts を、 command parameters["userContexts"] で get valid user contexts することを試みた結果とする。

    2. user contexts の各 user context について:

      1. viewport overrides map[user context] を struct に設定する。

      2. command parameters が "viewport" を含む場合:

        1. viewport overrides map[user context] の viewport を command parameters["viewport"] に設定する。

      3. command parameters が "devicePixelRatio" を含む場合:

        1. viewport overrides map[user context] の devicePixelRatio を command parameters["devicePixelRatio"] に設定する。

      4. For each user context が associated user context である すべての top-level traversables のリストの 各 top-level traversable について:

        1. top-level traversable を navigables に追加する。

  6. そうでなければ、invalid argument の error code を持つ error を返す。

  7. command parameters が viewport フィールドを含む場合:

    1. viewport を command parameters["viewport"] とする。

    2. navigables の各 navigable について:

      1. navigable および viewport で Set viewport する。

      2. navigable の active document で CSSOM View § 13.1 Resizing viewports steps を実行する。

  8. command parameters が devicePixelRatio フィールドを含む場合:

    1. device pixel ratio を command parameters["devicePixelRatio"] とする。

    2. navigables の各 navigable について:

      1. navigable およびすべての descendant navigables について:

        1. navigable および device pixel ratio で Set device pixel ratio override する。

  9. data null とともに success を返す。

7.3.3.13. browsingContext.startScreencast コマンド

browsingContext.startScreencast コマンドは、 指定された navigable のスクリーンキャストを開始し、それをファイルに書き込む。

注記: リモートエンドは スクリーンキャストファイルを作成して書き込むが、それを削除しない。 ファイルのクリーンアップはローカルエンドに委ねられる。いくつかの構成では、これは 不可能かもしれない — たとえば、リモートエンドが ファイルシステムへの読み書きアクセス権を持つが、 ローカルエンドは読み取り専用アクセス権しか持たない場合である。

コマンド型
browsingContext.StartScreencast = (
  method: "browsingContext.startScreencast",
  params: browsingContext.StartScreencastParameters
)

browsingContext.StartScreencastParameters = {
  context: browsingContext.BrowsingContext,
  ? destinationFolder: text,
  ? mimeType: text,
  ? video: browsingContext.MediaTrackConstraints,
  ? audio: bool .default false,
}

browsingContext.MediaTrackConstraints = {
   ? width: js-uint,
   ? height: js-uint,
   ? frameRate: js-uint,
}

戻り値型
browsingContext.StartScreencastResult = {
   screencast: browsingContext.Screencast,
   path: text
}

browsingContext.Screencast = text
リモートエンド手順は、session および command parameters が与えられた場合、次のとおりである。
  1. navigable id を command parameters["context"] とする。

  2. navigable を、navigable id を用いて 試行して navigable を 取得した 結果とする。

  3. navigable が トップレベル traversable でない場合、エラーを エラーコード 無効な引数として返す。

  4. command parameters が destinationFolder フィールドを 含む場合:

    1. destination folder を command parameters["destinationFolder"] とする。

    2. destination folder entry を、 パス destination folder および ファイルシステムのルートに対応する ルートが与えられた場合に エントリーを特定する結果とする。

    3. destination folder entry が null の場合、エラーを エラーコード 無効な引数として返す。

    4. path を、記録が保存される destination folder entry 内の新しいファイルに対する 実装定義のファイルパスとする。

  5. それ以外の場合、path を、記録が保存される実装定義のファイルパスとする。

  6. command parameters が mimeType フィールドを 含む場合:

    1. mime type を command parameters["mimeType"] とする。

  7. それ以外の場合、mime type を実装定義のデフォルト形式に設定する。

  8. 実装が何らかの理由で navigable のスクリーンキャストを記録できない場合、エラーを エラー コード サポートされていない操作として返す。

  9. stream を、navigable 用の新しい スクリーンキャストストリームとし、次のように構築する:

    1. ブラウザーの 表示面、 すなわち 関連グローバルオブジェクトの 関連付けられた `Document` の navigable の ビューポートをライブキャプチャする video track を作成する。

    2. command parameters が "video" を 含む場合:

      1. video を command parameters["video"] とする。

      2. video が width を 含む場合:

        1. ユーザーエージェントは、ハードウェアの能力および指定されたその他の制約を考慮して、 幅が可能な限り video["width"] に近いメディアを取得するよう試みなければならない。

      3. video が height を 含む場合:

        1. ユーザーエージェントは、ハードウェアの能力および指定されたその他の制約を考慮して、 高さが可能な限り video["height"] に近いメディアを取得するよう試みなければならない。

      4. video が frameRate を 含む場合:

        1. ユーザーエージェントは、ハードウェアの能力および指定されたその他の制約を考慮して、 フレームレートが可能な限り video["frameRate"] に近いメディアを取得するよう試みなければならない。

    3. video track を stream[ビデオトラック] に 設定する。

    4. command parameters["audio"] が true の場合:

      1. 関連グローバルオブジェクトの 関連付けられた `Document` の navigable の アクティブな文書と、関連グローバルオブジェクトの 関連付けられた `Document` の navigable のネストされた 閲覧コンテキスト内にあるすべての アクティブな文書 によって生成される音声を合成した audio track を作成する。

      2. audio track を stream[オーディオトラック] に 設定する。

    5. 実装が stream を生成できない場合、エラーを エラーコード 不明なエラーとして返す。

  10. screencast を UUID の文字列表現とする。

  11. recording を、スクリーンキャスト記録として新たに作成し、 ストリームを stream、 パスを path、 状態を "recording"、 writeError を null とする。

  12. session の スクリーンキャスト記録マップ[screencast] を recording に設定する。

  13. recording および mime type が与えられた場合、スクリーンキャスト記録を開始する。

  14. body を、screencast フィールドが screencast に、 path フィールドが path に設定された browsingContext.StartScreencastResult に一致する新しい マップ とする。

  15. データ body とともに 成功を返す。

7.3.3.14. browsingContext.stopScreencast コマンド

browsingContext.stopScreencast コマンドは、 スクリーンキャストを停止する。

コマンド型
browsingContext.StopScreencast = (
  method: "browsingContext.stopScreencast",
  params: browsingContext.StopScreencastParameters
)

browsingContext.StopScreencastParameters = {
  screencast: browsingContext.Screencast
}
戻り値型
browsingContext.StopScreencastResult = {
   path: text,
   ? error: text
}
sessionおよびcommand parametersが与えられたときのリモートエンド手順は次のとおりである:
  1. screencastを、command parameters内の "screencast" フィールドの値とする。

  2. session の スクリーンキャスト記録マップが screencast を含まない 場合、エラーを、エラーコード そのような スクリーンキャストはないとして返す。

  3. screencast recordingを、sessionのスクリーンキャスト 記録マップ[screencast]とする。

  4. screencast recordingが与えられたとして、スクリーンキャスト記録を停止する。

  5. screencastをsessionのスクリーンキャスト記録マップから除去する。

  6. errorをscreencast recordingのwriteErrorとする。

  7. pathをscreencast recordingのpathとする。

  8. bodyを、pathフィールドがpathに設定され、 errorが null でない場合はerrorフィールドが errorに設定され、そうでなければ省略された、 browsingContext.StopScreencastResultに一致する新しいマップとする。

  9. 成功をデータ body とともに返す。

7.3.3.15. browsingContext.traverseHistory コマンド

browsingContext.traverseHistory コマンドは、 指定された navigable の履歴を delta だけ走査する。

コマンド型
browsingContext.TraverseHistory = (
  method: "browsingContext.traverseHistory",
  params: browsingContext.TraverseHistoryParameters
)

browsingContext.TraverseHistoryParameters = {
  context: browsingContext.BrowsingContext,
  delta: js-int,
}
戻り値型
browsingContext.TraverseHistoryResult = EmptyResult
command parameters を用いる リモートエンド手順は次のとおりである:
  1. navigable を、command parameters["context"] を用いて 試行して navigable を 取得する 結果とする。

  2. navigable が トップレベル traversable でない場合、エラーを、 エラーコード 無効な引数として返す。

  3. 表明:navigable は null ではない。

  4. delta を command parameters["delta"] とする。

  5. resume id を一意な文字列とする。

  6. navigable の タスクをキューに入れる。その対象は セッション履歴走査キューであり、次の手順を実行する:

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

    2. current index を、all steps 内における navigable の 現在のセッション履歴ステップのインデックスとする。

    3. target index を current index に delta を加えたものとする。

    4. all steps[target index] が存在しない場合は valid entry を false、 それ以外の場合は true とする。

    5. "check history"、resume id、および valid entry を用いて 再開する。

  7. is valid entry を、«"check history"» および resume id を用いて 待機する結果とする。

  8. is valid entry が false の場合、エラーコード エラーを そのような履歴エントリーはないとして返す。

  9. delta および navigable を用いて delta によって履歴を走査する。

    記述されているアルゴリズムには 競合状態が存在する。これは、ナビゲーションを試行する時点では、対象のセッション履歴エントリーが 存在しない可能性があるためである。履歴のナビゲーションを待機することをサポートすれば、この状況を より堅牢に処理できる。

  10. TODO: 履歴走査の完了を待機する機能をサポートする。

  11. body を、 browsingContext.TraverseHistoryResult 生成規則に一致する マップ とする。

  12. データ body とともに 成功を返す。

context および navigation status navigation status が与えられたとき、 WebDriver BiDi page show steps は次である:

`browsingContext.pageShow event` を公開したいか?その場合、 これを bfcache restore の時だけでなく、`pageshow` が発火されようとするたびに呼び出す必要があり、 また persisted status を data に追加する必要がある。

  1. navigation id を navigation status の id とする。

  2. "page show"、navigation id、および navigation status で Resume する。

context および navigation status navigation status が与えられたとき、 WebDriver BiDi pop state steps は次である:

  1. navigation id を navigation status の id とする。

  2. "pop state"、navigation id、および navigation status で Resume する。

7.3.4. イベント

7.3.4.1. browsingContext.contextCreated イベント
イベント型
browsingContext.ContextCreated = (
 method: "browsingContext.contextCreated",
 params: browsingContext.ContextCreatedParameters
)

browsingContext.ContextCreatedParameters = {
 browsingContext.BaseInfo,
 hasPlannedNavigation: bool,
}

browsingContext.ContextCreatedParameters の hasPlannedNavigation は、 browsingContext.contextCreated イベントがディスパッチされた後に navigable がナビゲーションを 実行する予定であるかどうかを示す。

session および navigable を指定して、コンテキスト作成イベントを再帰的に発行するには:

  1. session、navigable、および false を指定して、コンテキスト作成イベントを発行する。

  2. navigable の各子 navigable child について:

    1. session および child を指定して、コンテキスト作成イベントを再帰的に 発行する。

session、navigable、および has planned navigation を指定して、コンテキスト 作成イベントを発行するには:

  1. navigable、0、および true を指定して navigable 情報を取得する結果を params とする。

  2. params["hasPlannedNavigation"] を has planned navigation に設定する。

  3. 表明:params は browsingContext.ContextCreated 生成規則に一致する。

  4. params フィールドを params に設定した、 browsingContext.ContextCreated 生成規則に 一致する マップを body とする。

  5. session および body を指定して、イベントを発行する。

リモートエンドイベントトリガーは、 navigable navigable、boolean has planned navigation、および オプションの navigable opener navigable(デフォルト:null)を指定する、 WebDriver BiDi navigable が作成された手順である:

  1. navigable の 元の opener を opener navigable に設定する。

  2. navigable に対する navigable キャッシュ動作が "bypass" である場合、 navigable から発生するネットワークリクエストについて、実装固有の リソースキャッシュを無効化するための実装定義の手順を実行する。

  3. navigable を含む 集合を related navigables とする。

  4. "browsingContext.contextCreated" および related navigables を指定した、 イベントが有効になっている session の集合内の各 session について:

    1. session、navigable、および has planned navigation を指定して、コンテキスト作成イベントを発行する。

session、navigables、および include global を指定する、 リモートエンド購読手順は、購読優先度 1 で、次のとおりである:

  1. navigables 内の各 navigable について:

    1. session および navigable を指定して、コンテキスト作成イベントを再帰的に 発行する。

7.3.4.2. browsingContext.contextDestroyed イベント
イベント型
browsingContext.ContextDestroyed = (
 method: "browsingContext.contextDestroyed",
 params: browsingContext.Info
)
remote end event trigger は次である:

remote end event trigger は、 navigable navigable が与えられたときの WebDriver BiDi navigable destroyed steps である:

  1. params を、navigable、null、および true が与えられたものとして get the navigable info した結果とする。

  2. body を、 params フィールドを params に設定した、 browsingContext.ContextDestroyed 生成規則に一致する map とする。

  3. related navigables を、navigable の parent が null でない場合はそれを含む set とし、そうでなければ空の set とする。

  4. "browsingContext.contextDestroyed" および related navigables が与えられたものとして、 set of sessions for which an event is enabled 内の各 session について:

    1. session および body で Emit an event する。

    2. subscriptions to remove を空の set とする。

    3. session の subscriptions 内の各 subscription について:

      1. subscription の top-level traversable ids が navigable の navigable id を 含む場合:

        1. navigable の navigable id を subscription の top-level traversable ids から削除する。

        2. subscription の top-level traversable ids が空である場合:

          1. subscription を subscriptions to remove に追加する。

    4. subscriptions to remove を session の subscriptions から削除する。

このイベントを active documents を持つ browsing contexts に対してのみ発火すべきかは不明である。navigation によって、contexts が アクセス不能になるが、bfcache のためまだ破棄されないこともある。

7.3.4.3. browsingContext.navigationStarted イベント
イベント型
browsingContext.NavigationStarted = (
    method: "browsingContext.navigationStarted",
    params: browsingContext.NavigationInfo
    )
remote end event trigger は、 navigable navigable および navigation status navigation status が与えられたときの WebDriver BiDi navigation started steps である:
  1. params を、navigable および navigation status が与えられたものとして get the navigation info した結果とする。

  2. body を、 params フィールドを params に設定した、 browsingContext.NavigationStarted 生成規則に一致する map とする。

  3. navigation id を navigation status の id とする。

  4. related navigables を navigable を含む set とする。

  5. "navigation started"、navigation id、および navigation status で Resume する。

  6. "browsingContext.navigationStarted" および related navigables が与えられたものとして、 set of sessions for which an event is enabled 内の各 session について:

    1. session および body で Emit an event する。

7.3.4.4. browsingContext.fragmentNavigated イベント
イベント型
browsingContext.FragmentNavigated = (
    method: "browsingContext.fragmentNavigated",
    params: browsingContext.NavigationInfo
    )
remote end event trigger は、 navigable navigable および navigation status navigation status が与えられたときの WebDriver BiDi fragment navigated steps である:
  1. params を、navigable および navigation status が与えられたものとして get the navigation info した結果とする。

  2. body を、 params フィールドを params に設定した、 browsingContext.FragmentNavigated 生成規則に一致する map とする。

  3. navigation id を navigation status の id とする。

  4. related navigable を、navigable を含む set とする。

  5. "fragment navigated"、navigation id、および navigation status で Resume する。

  6. "browsingContext.fragmentNavigated" および related navigable が与えられたものとして、 set of sessions for which an event is enabled 内の各 session について:

    1. session および body で Emit an event する。

7.3.4.5. browsingContext.historyUpdated イベント
イベント型
browsingContext.HistoryUpdated = (
  method: "browsingContext.historyUpdated",
  params: browsingContext.HistoryUpdatedParameters
)

browsingContext.HistoryUpdatedParameters = {
  context: browsingContext.BrowsingContext,
  timestamp: js-uint,
  url: text,
  ? userContext: browser.UserContext
}
リモートエンドイベントトリガーは、 navigable navigable が与えられたときのWebDriver BiDi 履歴更新手順である:
  1. urlを、navigableのアクティブブラウジングコンテキストのアクティブ文書のURLが与えられたとして、URL シリアライザーを実行した結果とする。

  2. user context idを、navigableの関連付けられたユーザー コンテキストのユーザー コンテキスト IDとする。

  3. timestampを、UTC における現在の日付と時刻を表す時刻値とする。

  4. paramsを、urlフィールドがurlに設定され、 timestampフィールドがtimestampに設定され、 contextフィールドがnavigableのnavigable IDに設定され、 userContextフィールドがuser context idに設定された、 browsingContext.HistoryUpdatedParameters生成規則に一致するマップとする。

  5. bodyを、paramsフィールドがparamsに設定された browsingContext.HistoryUpdated生成規則に一致する マップとする。

  6. related browsing contextsを、navigableのアクティブブラウジングコンテキストを含む集合とする。

  7. "browsingContext.historyUpdated" と related browsing contexts が与えられたとして、 イベントが有効化されている セッションの集合内の各sessionについて:

    1. sessionおよびbodyでイベントを 発行する。

7.3.4.6. browsingContext.domContentLoaded イベント
イベント型
browsingContext.DomContentLoaded = (
    method: "browsingContext.domContentLoaded",
    params: browsingContext.NavigationInfo
    )
remote end event trigger は、 navigable navigable および navigation status navigation status が与えられたときの WebDriver BiDi DOM content loaded steps である:
  1. params を、navigable および navigation status が与えられたものとして get the navigation info した結果とする。

  2. body を、 params フィールドを params に設定した、 browsingContext.DomContentLoaded 生成規則に一致する map とする。

  3. related navigables を、navigable を含む set とする。

  4. navigation id を navigation status の id とする。

  5. "domContentLoaded"、navigation id、および navigation status で Resume する。

  6. "browsingContext.domContentLoaded" および related navigables が与えられたものとして、 set of sessions for which an event is enabled 内の各 session について:

    1. session および body で Emit an event する。

7.3.4.7. browsingContext.load イベント
イベント型
browsingContext.Load = (
    method: "browsingContext.load",
    params: browsingContext.NavigationInfo
    )
remote end event trigger は、 navigable navigable および navigation status navigation status が与えられたときの WebDriver BiDi load complete steps である:
  1. params を、navigable および navigation status が与えられたものとして get the navigation info した結果とする。

  2. body を、params フィールドを params に設定した、 browsingContext.Load 生成規則に一致する map とする。

  3. related navigables を、navigable を含む set とする。

  4. navigation id を navigation status の id とする。

  5. "load"、navigation id および navigation status で Resume する。

  6. "browsingContext.load" および related navigables が与えられたものとして、 set of sessions for which an event is enabled 内の各 session について:

    1. session および body で Emit an event する。

7.3.4.8. browsingContext.downloadWillBegin イベント
イベント型
browsingContext.DownloadWillBegin = (
 method: "browsingContext.downloadWillBegin",
 params: browsingContext.DownloadWillBeginParams
)

browsingContext.DownloadWillBeginParams = {
  download: browsingContext.Download,
  suggestedFilename: text,
  browsingContext.BaseNavigationInfo
}
リモートエンドイベントトリガーは、 navigable navigable および ナビゲーションステータス navigation status が与えられたときのWebDriver BiDi ダウンロード開始予定手順である:
  1. navigation infoを、navigableおよびnavigation statusが 与えられたとしてナビゲーション 情報を取得する結果とする。

  2. downloadを、UUIDの文字列表現とする。

  3. 設定する:ダウンロード ID マップ[navigation statusのdownloadResponse]を downloadに。

  4. paramsを、 contextフィールドがnavigation info["context"]に設定され、 navigationフィールドがnavigation info["navigation"]に設定され、 timestampフィールドが navigation info["timestamp"]に設定され、urlフィールドが navigation info["url"]に設定され、downloadフィールドが downloadに設定され、 suggestedFilenameフィールドが navigation statusのsuggestedFilenameに設定された、 browsingContext.DownloadWillBeginParams生成規則に一致するマップとする。

  5. bodyを、 paramsフィールドがparamsに設定された browsingContext.DownloadWillBegin生成規則に一致するマップとする。

  6. navigation idを、navigation statusのidとする。

  7. related navigablesを、navigableを含む集合とする。

  8. "download started"、navigation id、および navigation statusで再開する。

  9. "browsingContext.downloadWillBegin" と related navigables が与えられたとして、 イベントが有効化されている セッションの集合内の各sessionについて:

    1. sessionおよびbodyでイベントを 発行する。

  10. download behaviorを、navigableでダウンロード動作を取得する結果とする。

  11. download behaviorを返す。

7.3.4.9. browsingContext.downloadEnd イベント
イベント型
browsingContext.DownloadEnd = (
  method: "browsingContext.downloadEnd",
  params: browsingContext.DownloadEndParams
)

browsingContext.DownloadEndParams = {
  (
    browsingContext.DownloadCanceledParams //
    browsingContext.DownloadCompleteParams
  )
}

browsingContext.DownloadCanceledParams = (
  status: "canceled",
  download: browsingContext.Download,
  browsingContext.BaseNavigationInfo
)

browsingContext.DownloadCompleteParams = (
  status: "complete",
  download: browsingContext.Download,
  filepath: text / null,
  browsingContext.BaseNavigationInfo
)
リモートエンドイベントトリガーは、WebDriver BiDi ダウンロード終了手順であり、 navigable navigable および ナビゲーション ステータス navigation status が与えられる:
  1. navigation infoを、navigableおよびnavigation statusが 与えられたとしてナビゲーション 情報を取得する結果とする。

  2. 表明:navigation info["status"] は "complete" または "canceled" のいずれかに等しい。

  3. download responseを、navigation statusのdownloadResponseとする。

  4. ダウンロード ID マップがdownload responseを含む場合、downloadを ダウンロード ID マップ[download response]とし、そうでなければdownloadを UUIDの文字列表現とする。

  5. navigation info["status"] が "complete" である場合、 paramsを、downloadフィールドが downloadに設定され、filepathフィールドが navigation statusのdownloadedFilepathに設定され、 contextフィールドがnavigation info["context"]に設定され、 navigationフィールドがnavigation info["navigation"]に設定され、 timestampフィールドが navigation info["timestamp"]に設定され、urlフィールドが navigation info["url"]に設定された、 browsingContext.DownloadCompleteParams生成規則に一致するマップとする。

    注記: filepathは、 何らかの理由でファイルパスが利用できない場合、完了したダウンロードについて null になりうる。

  6. そうでなければ、paramsを、downloadフィールドが downloadに設定され、contextフィールドがnavigation info["context"]に設定され、 navigationフィールドがnavigation info["navigation"]に設定され、 timestampフィールドが navigation info["timestamp"]に設定され、urlフィールドが navigation info["url"]に設定された、 browsingContext.DownloadCanceledParams生成規則に一致するマップとする。

  7. bodyを、 paramsフィールドがparamsに設定された browsingContext.DownloadEnd生成規則に一致するマップとする。

  8. related navigablesを、navigableを含む集合とする。

  9. "browsingContext.downloadEnd" と related navigables が与えられたとして、 イベントが有効化されている セッションの集合内の各sessionについて:

    1. sessionおよびbodyでイベントを 発行する。

7.3.4.10. browsingContext.navigationAborted イベント
イベント型
browsingContext.NavigationAborted = (
    method: "browsingContext.navigationAborted",
    params: browsingContext.NavigationInfo
    )
remote end event trigger は、 navigable navigable および navigation status navigation status が与えられたときの WebDriver BiDi navigation aborted steps である:
  1. params を、navigable および navigation status が与えられたものとして get the navigation info した結果とする。

  2. body を、 params フィールドを params に設定した、 browsingContext.NavigationAborted 生成規則に一致する map とする。

  3. navigation id を navigation status の id とする。

  4. related navigables を、navigable を含む set とする。

  5. "navigation aborted"、navigation id、および navigation status で Resume する。

  6. "browsingContext.navigationAborted" および related navigables が与えられたものとして、 set of sessions for which an event is enabled 内の各 session について:

    1. session および body で Emit an event する。

7.3.4.11. browsingContext.navigationCommitted イベント
イベント型
browsingContext.NavigationCommitted = (
    method: "browsingContext.navigationCommitted",
    params: browsingContext.NavigationInfo
    )
remote end event trigger は、 navigable navigable および navigation status navigation status が与えられたときの WebDriver BiDi navigation committed steps である:
  1. params を、navigable および navigation status が与えられたものとして get the navigation info した結果とする。

  2. body を、 params フィールドを params に設定した、 browsingContext.NavigationCommitted 生成規則に一致する map とする。

  3. related navigables を、navigable を含む set とする。

  4. navigation id を navigation status の id とする。

  5. "navigation committed"、navigation id、および navigation status で Resume する。

  6. "browsingContext.navigationCommitted" および related navigables が与えられたものとして、 set of sessions for which an event is enabled 内の各 session について:

    1. session および body で Emit an event する。

7.3.4.12. browsingContext.navigationFailed イベント
イベント型
browsingContext.NavigationFailed = (
    method: "browsingContext.navigationFailed",
    params: browsingContext.NavigationInfo
    )
remote end event trigger は、 navigable navigable および navigation status navigation status が与えられたときの WebDriver BiDi navigation failed steps である:
  1. params を、navigable および navigation status が与えられたものとして get the navigation info した結果とする。

  2. body を、 params フィールドを params に設定した、 browsingContext.NavigationFailed 生成規則に一致する map とする。

  3. navigation id を navigation status の id とする。

  4. related navigables を、navigable を含む set とする。

  5. "navigation failed"、navigation id、および navigation status で Resume する。

  6. "browsingContext.navigationFailed" および related navigables が与えられたものとして、 set of sessions for which an event is enabled 内の各 session について:

    1. session および body で Emit an event する。

7.3.4.13. browsingContext.userPromptClosed イベント
イベント型
browsingContext.UserPromptClosed = (
  method: "browsingContext.userPromptClosed",
  params: browsingContext.UserPromptClosedParameters
)

browsingContext.UserPromptClosedParameters = {
  context: browsingContext.BrowsingContext,
  accepted: bool,
  type: browsingContext.UserPromptType,
  ? userContext: browser.UserContext,
  ? userText: text
}
remote end event trigger は、 Window window、文字列 type、boolean accepted、および省略可能な text user text (既定値: null)が与えられたときの WebDriver BiDi user prompt closed steps である。
  1. navigable を window の navigable とする。

  2. navigable id を navigable の navigable id とする。

  3. user context id を、navigable の associated user context の user context id とする。

  4. params を、 context フィールドを navigable id に、userContext フィールドを user context id に、accepted フィールドを accepted に、 type フィールドを type に設定し、かつ user text が null でなければ userText フィールドを user text に設定し、そうでなければ省略した、 browsingContext.UserPromptClosedParameters 生成規則に一致する map とする。

  5. body を、 params フィールドを params に設定した、 BrowsingContextUserPromptClosedEvent 生成規則に一致する map とする。

  6. related navigables を、navigable を含む set とする。

  7. "browsingContext.userPromptClosed" および related navigables が与えられたものとして、 set of sessions for which an event is enabled 内の各 session について:

    1. session および body で Emit an event する。

7.3.4.14. browsingContext.userPromptOpened イベント
イベント型
browsingContext.UserPromptOpened = (
  method: "browsingContext.userPromptOpened",
  params: browsingContext.UserPromptOpenedParameters
)

browsingContext.UserPromptOpenedParameters = {
  context: browsingContext.BrowsingContext,
  handler: session.UserPromptHandlerType,
  message: text,
  type: browsingContext.UserPromptType,
  ? userContext: browser.UserContext,
  ? defaultValue: text
}
type および navigable が与えられたとき、 get navigable’s user prompt handler するには:
  1. user context を navigable の associated user context とする。

  2. unhandled prompt behavior overrides map が user context を含む場合:

    1. unhandled prompt behavior override を unhandled prompt behavior overrides map[user context] とする。

    2. unhandled prompt behavior override[type] が null でない場合、 unhandled prompt behavior override[type] を返す。

    3. unhandled prompt behavior override["default"] が null でない場合、 unhandled prompt behavior override["default"] を返す。

  3. handler configuration を、type で get the prompt handler したものとする。

  4. handler configuration の handler を返す。

remote end event trigger は、 Window window、文字列 type、文字列 message、および省略可能な text default value (既定値: null)が与えられたときの WebDriver BiDi user prompt opened steps である。
  1. navigable を window の navigable とする。

  2. navigable id を navigable の navigable id とする。

  3. user context id を、navigable の associated user context の user context id とする。

  4. handler を、type および navigable で get navigable’s user prompt handler したものとする。

  5. params を、 context フィールドを navigable id に、userContext フィールドを user context id に、type フィールドを type に、 message フィールドを message に、defaultValue フィールドを default value が null でなければ default value に設定し、 そうでなければ省略し、 かつ handler フィールドを handler に設定した、 browsingContext.UserPromptOpenedParameters 生成規則に一致する map とする。

  6. body を、 params フィールドを params に設定した、 browsingContext.UserPromptOpened 生成規則に一致する map とする。

  7. related navigables を、navigable を含む set とする。

  8. "browsingContext.userPromptOpened" および related navigables が与えられたものとして、 set of sessions for which an event is enabled 内の各 session について:

    1. session および body で Emit an event する。

  9. handler が "ignore" である場合、handler を "none" に設定する。

  10. handler を返す。

7.4. emulation モジュール

emulation モジュールは、ブラウザー API のエミュレーションに関するコマンドおよびイベントを含む。

7.4.1. 定義

remote end definition

EmulationCommand = (
  emulation.SetForcedColorsModeThemeOverride //
  emulation.SetGeolocationOverride //
  emulation.SetLocaleOverride //
  emulation.SetMediaFeaturesOverride //
  emulation.SetNetworkConditions //
  emulation.SetScreenOrientationOverride //
  emulation.SetScreenSettingsOverride //
  emulation.SetScriptingEnabled //
  emulation.SetScrollbarTypeOverride //
  emulation.SetTextLayoutModeOverride //
  emulation.SetTimezoneOverride //
  emulation.SetTouchOverride //
  emulation.SetUserAgentOverride //
  emulation.SetViewportMetaOverride
)

EmulationResult = (
  emulation.SetForcedColorsModeThemeOverrideResult /
  emulation.SetGeolocationOverrideResult /
  emulation.SetLocaleOverrideResult /
  emulation.SetMediaFeaturesOverrideResult /
  emulation.SetScreenOrientationOverrideResult /
  emulation.SetScriptingEnabledResult /
  emulation.SetScrollbarTypeOverrideResult /
  emulation.SetTextLayoutModeOverrideResult /
  emulation.SetTimezoneOverrideResult /
  emulation.SetTouchOverrideResult /
  emulation.SetUserAgentOverrideResult /
  emulation.SetViewportMetaOverrideResult
)

BiDi セッションは、エミュレートされたユーザーエージェントを持つ。これは 構造体であり、 既定のユーザーエージェントという名前の 項目を持ち、これは文字列または null であり、 ユーザーコンテキストのユーザーエージェントという名前の 項目を持ち、これはユーザーコンテキストと 文字列の間の weak map であり、また navigable のユーザーエージェントという名前の 項目を持ち、これはnavigableと文字列の間の weak map である。

BiDi セッションは、エミュレートされた maxTouchPointsを持つ。これは構造体であり、 既定という名前の項目を持ち、これは整数または null であり、初期状態では null である; ユーザーコンテキストという名前の項目を持ち、これはユーザーコンテキストと整数の間の weak map であり、 初期状態では空である; また、navigableという名前の項目を持ち、これはnavigableと整数の間の weak map であり、初期状態では空である。

画面向き オーバーライドは、以下を持つ構造体である:

リモートエンドは、画面向きオーバーライドマップを持つ。これは ユーザーコンテキストと 画面 向きオーバーライドの間の weak map である。

7.4.2. コマンド

7.4.2.1. emulation.setForcedColorsModeThemeOverride コマンド

emulation.setForcedColorsModeThemeOverride コマンドは、指定されたトップレベル ナビゲータブルまたはユーザーコンテキストの 強制色モードのテーマ特性を変更する。

コマンド型
emulation.SetForcedColorsModeThemeOverride = (
  method: "emulation.setForcedColorsModeThemeOverride",
  params: emulation.SetForcedColorsModeThemeOverrideParameters
)

emulation.SetForcedColorsModeThemeOverrideParameters = {
  theme: emulation.ForcedColorsModeTheme / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.ForcedColorsModeTheme = "light" / "dark"
戻り値の型
emulation.SetForcedColorsModeThemeOverrideResult = EmptyResult

注記: CSS 仕様における対応する列挙型のマッピングについては、ForcedColorsModeAutomationTheme を参照されたい。

リモートエンドは、強制色モードのテーマオーバーライド 構成を持つ。これは、 WebDriver 構成であり、関連付けられた型は文字列である。

ナビゲータブル navigableについてエミュレートされた強制色テーマを更新するには、次を行う:
  1. themeを、navigableについて 強制色モードのテーマ オーバーライド構成のWebDriver 構成値を取得した結果とする。

  2. 表明: themeは"light"、"dark"、または 未設定である。

  3. themeが未設定である場合、themeを "none"に設定する。

  4. navigableおよびthemeを用いて、エミュレートされた強制色テーマデータを設定する。

command parametersを用いるリモートエンド手順は次のとおりである:

  1. themeをcommand parameters["theme"]とする。

  2. themeが null の場合、themeを未設定に設定する。

  3. 実装がthemeの設定をサポートしていない場合、エラーをエラー コード サポートされていない操作として返す。

  4. affected navigablesを、command parametersについて 強制色モードのテーマ オーバーライド構成 themeをWebDriver 構成に格納することを試行した結果とする。

  5. affected navigablesの各navigableについて:

    1. navigableについてエミュレートされた強制色 テーマを更新する。

  6. データ null とともに成功を返す。

7.4.2.2. emulation.setGeolocationOverride コマンド

emulation.setGeolocationOverrideコマンドは、 指定されたトップレベルナビゲータブルまたはユーザーコンテキストの位置情報特性を変更する。

コマンド型
emulation.SetGeolocationOverride = (
  method: "emulation.setGeolocationOverride",
  params: emulation.SetGeolocationOverrideParameters
)

emulation.SetGeolocationOverrideParameters = {
  (
    (coordinates: emulation.GeolocationCoordinates / null) //
    (error: emulation.GeolocationPositionError)
  ),
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.GeolocationCoordinates = {
   latitude: -90.0..90.0,
   longitude: -180.0..180.0,
   ? accuracy: (float .ge 0.0) .default 1.0,
   ? altitude: float / null .default null,
   ? altitudeAccuracy: (float .ge 0.0) / null .default null,
   ? heading: (0.0...360.0) / null .default null,
   ? speed: (float .ge 0.0) / null .default null,
}

emulation.GeolocationPositionError = {
   type: "positionUnavailable"
}
戻り値の型
emulation.SetGeolocationOverrideResult = EmptyResult

位置情報 オーバーライドは、次のものを持つ構造体である:

リモートエンドは、位置情報オーバーライド構成を持つ。これは、 WebDriver 構成であり、関連付けられた型は位置情報オーバーライドである。

ナビゲータブル navigableについて位置情報 オーバーライドを更新するには、次を行う:
  1. emulated position dataを、navigableについて 位置情報オーバーライド構成のWebDriver 構成値を取得した結果とする。

  2. emulated position dataが未設定である場合、emulated position dataを null に設定する。

  3. navigableおよびemulated position dataを用いて、エミュレートされた位置データを設定する。

command parametersを用いるリモートエンド手順は次のとおりである:

  1. command parameters が "coordinates" を 含み、かつ command parameters["coordinates"] が 含む "altitudeAccuracy" を含み、かつ command parameters["coordinates"] が "altitude" を 含まない 場合、エラーを エラーコード 無効な引数として返す。

  2. command parameters が "error" を 含む 場合:

    1. 表明:command parameters["error"]["type"] は "positionUnavailable" と等しい。

    2. emulated position data を、GeolocationPositionError 生成規則に一致する マップ とし、code フィールドを POSITION_UNAVAILABLE に設定し、 message フィールドを空文字列に設定する。

      注: message は Geolocation 仕様に従って実装によって無視される。

  3. それ以外の場合、emulated position data を command parameters["coordinates"] とする。

  4. emulated position data が null の場合、emulated position data を 未設定に設定する。

  5. affected navigables を、command parameters について emulated position data を 位置情報オーバーライド構成として WebDriver 構成を保存することを 試行した 結果とする。

  6. affected navigables の各 navigable について:

    1. navigable について 位置情報オーバーライドを更新する。

  7. データ null とともに 成功を返す。

7.4.2.3. emulation.setLocaleOverride コマンド

emulation.setLocaleOverrideコマンドは、 指定されたトップレベルナビゲータブルまたはユーザーコンテキストのロケールを変更する。

コマンド型
emulation.SetLocaleOverride = (
  method: "emulation.setLocaleOverride",
  params: emulation.SetLocaleOverrideParameters
)

emulation.SetLocaleOverrideParameters = {
  locale: text / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
戻り値の型
emulation.SetLocaleOverrideResult = EmptyResult

WebDriver BiDi エミュレート言語の手順は、環境設定オブジェクト environment settings が与えられた場合、次のとおりである:

  1. related navigables を、environment settings が与えられた場合に 関連する navigable を取得する結果とする。

  2. related navigables の各 navigable について:

    1. top-level traversable を navigable の トップレベル traversable とする。

    2. user context を top-level traversable の 関連付けられた ユーザーコンテキストとする。

    3. ロケールオーバーライドマップが top-level traversable を 含む場合、ロケールオーバーライドマップ[top-level traversable] を返す。

    4. ロケールオーバーライドマップが user context を 含む場合、ロケールオーバーライドマップ[user context] を返す。

  3. null を返す

command parameters を用いる リモートエンド手順は次のとおりである:

  1. command parameters が "userContexts" を 含み、 かつ command parameters が "contexts" を 含む 場合、エラーを エラー コード 無効な引数として返す。

  2. command parameters が "userContexts" を 含まず、 かつ command parameters が "contexts" を 含まない 場合、エラーを エラー コード 無効な引数として返す。

  3. emulated locale を command parameters["locale"] とする。

  4. emulated locale が null ではなく、IsStructurallyValidLanguageTag(emulated locale) が false を返す場合、エラーを エラー コード 無効な引数として返す。

  5. navigables を 集合とする。

  6. command parameters の contexts フィールドが存在する場合:

    1. navigables を、 command parameters["contexts"] を用いて 試行して ID によって有効なトップレベル traversable を取得する結果とする。

  7. それ以外の場合:

    1. 表明:command parameters の userContexts フィールドが存在する。

    2. user contexts を、 command parameters["userContexts"] を用いて 試行して 有効なユーザーコンテキストを取得する 結果とする。

    3. user contexts の各 user context について:

      1. emulated locale が null の場合、削除する:ロケールオーバーライドマップから user context を。

      2. それ以外の場合、ロケール オーバーライドマップ[user context] を emulated locale に 設定する。

      3. 各 top-level traversable について、すべての トップレベル traversable のリストのうち、その 関連付けられたユーザーコンテキストが user context であるものについて:

        1. top-level traversable を navigables に 付加する。

  8. navigables の各 navigable について:

    1. emulated locale が null の場合、削除する: ロケールオーバーライドマップから navigable を。

    2. それ以外の場合、ロケールオーバーライドマップ[navigable] を emulated locale に 設定する。

  9. データ null とともに 成功を返す。

7.4.2.4. emulation.setMediaFeaturesOverride コマンド

emulation.setMediaFeaturesOverrideコマンドは、 さまざまなメディア機能の値をオーバーライドできるようにする。

コマンド型
emulation.SetMediaFeaturesOverride = (
  method: "emulation.setMediaFeaturesOverride",
  params: emulation.SetMediaFeaturesOverrideParameters
)

emulation.SetMediaFeaturesOverrideParameters = {
  features: emulation.MediaFeatures / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.MediaFeatures = {
  ? "any-hover": "none" / "hover" / null,
  ? "any-pointer": "none" / "coarse" / "fine" / null,
  ? "color": js-uint / null,
  ? "color-gamut": "srgb" / "p3" / "rec2020" / null,
  ? "color-index": js-uint / null,
  ? "display-mode": "fullscreen" / "standalone" / "minimal-ui" / "browser" / "picture-in-picture" / null,
  ? "dynamic-range": "standard" / "high" / null,
  ? "environment-blending": "opaque" / "additive" / "subtractive" / null,
  ? "forced-colors": "none" / "active" / null,
  ? "grid": 0 / 1 / null,
  ? "horizontal-viewport-segments": js-uint / null,
  ? "hover": "none" / "hover" / null,
  ? "inverted-colors": "none" / "inverted" / null,
  ? "monochrome": js-uint / null,
  ? "nav-controls": "none" / "back" / null,
  ? "overflow-block": "none" / "scroll" / "optional-paged" / "paged" / null,
  ? "overflow-inline": "none" / "scroll" / null,
  ? "pointer": "none" / "coarse" / "fine" / null,
  ? "prefers-color-scheme": "light" / "dark" / null,
  ? "prefers-contrast": "no-preference" / "more" / "less" / "custom" / null,
  ? "prefers-reduced-data": "no-preference" / "reduce" / null,
  ? "prefers-reduced-motion": "no-preference" / "reduce" / null,
  ? "prefers-reduced-transparency": "no-preference" / "reduce" / null,
  ? "scan": "interlace" / "progressive" / null,
  ? "scripting": "none" / "initial-only" / "enabled" / null,
  ? "update": "none" / "slow" / "fast" / null,
  ? "vertical-viewport-segments": js-uint / null,
  ? "video-color-gamut": "srgb" / "p3" / "rec2020" / null,
  ? "video-dynamic-range": "standard" / "high" / null,
}

戻り値の型
emulation.SetMediaFeaturesOverrideResult = EmptyResult

リモートエンドは、メディア機能オーバーライド構成を持つ。 これは、 WebDriver 構成であり、関連付けられた型はマップである。

Document documentおよびメディア 機能名nameについてWebDriver BiDi メディア機能値を取得するには、次を行う:
  1. navigableをdocumentのノードナビゲータブルとする。

  2. media features override mapを、navigableについて メディア機能オーバーライド構成のWebDriver 構成値を取得した結果とする。

  3. media features override mapが未設定 ではなく、 media features override mapが nameを含む場合、 media features override map[name]を返す。

  4. null を返す。

command parametersを用いるリモートエンド手順は次のとおりである:

  1. media features overrideをcommand parameters["features"]とする。

  2. media features overrideが null の場合、media features overrideを 未設定に設定する。

  3. media features override mapを空のマップとする。

  4. media features overrideの各media featureについて:

    1. media features override map[media feature["name"]]を media feature["value"]に設定する。

  5. 実装がmedia features override map内のメディア機能のいずれのオーバーライドも サポートしていない場合、エラーをエラーコード サポートされていない操作として返す。

  6. affected navigablesを、command parametersについて メディア機能オーバーライド 構成 media features override mapをWebDriver 構成に格納した結果とする。

  7. affected navigablesの各navigableについて:

    1. navigableまたはその子孫ナビゲータブルに現在読み込まれている各documentについて反復する:

      1. documentについてメディアクエリを評価して 変更を報告する処理を実行する。

  8. データ null とともに成功を返す。

7.4.2.5. emulation.setNetworkConditions コマンド

emulation.setNetworkConditionsコマンドは、 指定されたブラウジングコンテキストまたはユーザー コンテキストについて特定のネットワーク条件をエミュレートする。

コマンド型
emulation.SetNetworkConditions = (
  method: "emulation.setNetworkConditions",
  params: emulation.SetNetworkConditionsParameters
)

emulation.SetNetworkConditionsParameters = {
  networkConditions: emulation.NetworkConditions / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.NetworkConditions = emulation.NetworkConditionsOffline

emulation.NetworkConditionsOffline = {
  type: "offline"
}
戻り値の型
emulation.SetNetworkConditionsResult = EmptyResult

ネットワーク 条件を適用するには:

  1. 各WebSocketオブジェクトwebSocketについて:

    1. realmをwebSocketの関連 Realmとする。

    2. environment settingsを、 Realm 実行コンテキストの Realm コンポーネントが realmである環境設定オブジェクトとする。

    3. environment settingsを用いたWebDriver BiDi ネットワークがオフラインである の結果が true の場合:

      1. webSocketのWebSocket 接続を失敗させる。

  2. 各WebTransportオブジェクトwebTransportについて:

    1. realmをwebSocketの関連 Realmとする。

    2. environment settingsを、 Realm 実行コンテキストの Realm コンポーネントが realmである環境設定オブジェクトとする。

    3. environment settingsを用いたWebDriver BiDi ネットワークが オフラインであるの結果が true の場合:

      1. webTransportについてWebTransport をクリーンアップする。

command parameters および session を用いる リモートエンド手順は次のとおりである:

  1. command parameters が 含む "userContexts" かつ command parameters が 含む "context" 場合、 エラーを エラー コード 無効な引数として返す。

  2. emulated network conditions を null とする。

  3. command parameters["networkConditions"] が null ではなく、かつ command parameters["networkConditions"]["type"] が "offline" と等しい場合、emulated network conditions を、 エミュレートされたネットワーク条件構造体の新しいものに設定し、 オフラインを true に設定する。

  4. command parameters の contexts フィールドが存在する場合:

    1. navigables を、 command parameters["contexts"] を用いて 試行して ID によって有効なトップレベル traversable を取得する結果とする。

    2. navigables の各 navigable について:

      1. emulated network conditions が null の場合、navigable を session の エミュレートされたネットワーク 条件の navigable ネットワーク条件から 削除する

      2. それ以外の場合、session の エミュレートされたネットワーク 条件の navigable ネットワーク条件[navigable] を emulated network conditions に 設定する。

  5. command parameters の userContexts フィールドが存在する場合:

    1. user contexts を、 command parameters["userContexts"] を用いて 試行して 有効なユーザーコンテキストを取得する 結果とする。

    2. user contexts の各 user context について:

      1. emulated network conditions が null の場合、user context を session の エミュレートされたネットワーク 条件の ユーザー コンテキストネットワーク条件から 削除する。

      2. それ以外の場合、session の エミュレートされたネットワーク 条件の ユーザー コンテキストネットワーク条件[user context] を emulated network conditions に 設定する。

  6. command parameters が 含まない "userContexts" かつ command parameters が 含まない "context" 場合、session の エミュレートされたネットワーク条件の デフォルトネットワーク 条件を emulated network conditions に 設定する。

  7. ネットワーク条件を適用する。

  8. データ null とともに 成功を返す。

7.4.2.6. emulation.setScreenSettingsOverride コマンド

emulation.setScreenSettingsOverrideコマンドは、 指定されたトップレベルナビゲータブルまたはユーザーコンテキストのWeb に公開される画面領域およびWeb に公開される利用可能な画面領域をエミュレートする。

コマンド型
emulation.SetScreenSettingsOverride = (
  method: "emulation.setScreenSettingsOverride",
  params: emulation.SetScreenSettingsOverrideParameters
)

emulation.ScreenArea = {
  width: js-uint,
  height: js-uint
}

emulation.SetScreenSettingsOverrideParameters = {
  screenArea: emulation.ScreenArea / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
戻り値の型
emulation.SetScreenSettingsOverrideResult = EmptyResult

WebDriver BiDi エミュレートされた利用可能な画面 領域の手順は、navigable navigable が与えられた場合、次のとおりである:

  1. top-level traversable を navigable の トップレベル traversable とする。

  2. user context を top-level traversable の 関連付けられたユーザー コンテキストとする。

  3. 画面設定オーバーライドが top-level traversable を 含む 場合、 画面設定オーバーライド[top-level traversable] を返す。

  4. 画面設定オーバーライドが user context を 含む場合、 画面設定オーバーライド[user context] を返す。

  5. null を返す

WebDriver BiDi エミュレートされた総画面領域の手順は、 navigable navigable が与えられた場合、次のとおりである:

  1. top-level traversable を navigable の トップレベル traversable とする。

  2. user context を top-level traversable の 関連付けられたユーザー コンテキストとする。

  3. 画面設定オーバーライドが top-level traversable を 含む場合、 画面設定オーバーライド[top-level traversable] を返す。

  4. 画面設定オーバーライドが user context を 含む場合、 画面設定オーバーライド[user context] を返す。

  5. null を返す

command parameters を用いる リモートエンド手順は次のとおりである:

  1. command parameters が 含む "userContexts" かつ command parameters が 含む "contexts" 場合、 エラーを エラー コード 無効な引数として返す。

  2. command parameters が 含まない "userContexts" かつ command parameters が 含まない "contexts" 場合、 エラーを エラー コード 無効な引数として返す。

  3. emulated screen area を command parameters["screenArea"] とする。

  4. emulated screen area が null でない場合:

    1. emulated screen area["x"] を 0 に 設定する。

    2. emulated screen area["y"] を 0 に 設定する。

  5. navigables を 集合とする。

  6. command parameters の contexts フィールドが存在する場合:

    1. navigables を、 command parameters["contexts"] を用いて 試行して ID によって有効なトップレベル traversable を取得する結果とする。

    2. target を navigable の画面 設定とする。

    3. navigables の各 navigable について:

      1. emulated screen area が null の場合、navigable を target から 削除する。

      2. それ以外の場合、target[navigable] を emulated screen area に 設定する。

    4. データ null とともに 成功を返す。

  7. それ以外の場合:

    1. 表明:command parameters の userContexts フィールドが存在する。

    2. user contexts を、 command parameters["userContexts"] を用いて 試行して 有効なユーザーコンテキストを取得する 結果とする。

    3. target を ユーザーコンテキストの 画面設定とする。

    4. user contexts の各 user context について:

      1. emulated screen area が null の場合、user context を target から 削除する。

      2. それ以外の場合、target[user context] を emulated screen area に 設定する。

    5. データ null とともに 成功を返す。

7.4.2.7. emulation.setScreenOrientationOverride コマンド

emulation.setScreenOrientationOverrideコマンドは、 指定されたトップレベルナビゲータブルまたはユーザー コンテキストの画面の向きをエミュレートする。

コマンド型
emulation.SetScreenOrientationOverride = (
  method: "emulation.setScreenOrientationOverride",
  params: emulation.SetScreenOrientationOverrideParameters
)

emulation.ScreenOrientationNatural = "portrait" / "landscape"
emulation.ScreenOrientationType = "portrait-primary" / "portrait-secondary" / "landscape-primary" / "landscape-secondary"

emulation.ScreenOrientation = {
  natural: emulation.ScreenOrientationNatural,
  type: emulation.ScreenOrientationType
}

emulation.SetScreenOrientationOverrideParameters = {
  screenOrientation: emulation.ScreenOrientation / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
戻り値の型
emulation.SetScreenOrientationOverrideResult = EmptyResult

navigableおよび emulated screen orientationを与えてエミュレートされた 画面の向きを設定するには:

このアルゴリズムを Screen Orientation 仕様へ移動する。

  1. emulated screen orientationが null の場合:

    1. navigableの現在の向きの角度を 実装定義のデフォルト値に設定する。

    2. navigableの現在の向きの型を 実装定義のデフォルト値に設定する。

  2. そうでなければ:

    1. emulated orientation typeを emulated screen orientation["type"]とする。

    2. emulated orientation angleを、画面の向きの値のリストで定義される、 emulated screen orientation["natural"]の向きを持つ画面における emulated orientation typeに関連付けられた角度とする。

    3. 現在の向きの角度を emulated orientation angleに設定する。

    4. 現在の向きの型を emulated orientation typeに設定する。

  3. navigableの アクティブな文書を用いて、画面の向き変更手順を実行する。

command parameters を用いる リモートエンド手順は次のとおりである:

  1. 実装が何らかの理由で、指定された command parameters を使用して 画面の向き のパラメーターを調整できない場合、エラーを エラー コード サポートされていない操作として返す。

  2. command parameters が 含む "userContexts" かつ command parameters が 含む "contexts" 場合、 エラーを エラー コード 無効な引数として返す。

  3. command parameters が 含まない "userContexts" かつ command parameters が 含まない "contexts" 場合、 エラーを エラー コード 無効な引数として返す。

  4. emulated screen orientation を command parameters["screenOrientation"] とする。

  5. navigables を 集合とする。

  6. command parameters の contexts フィールドが存在する場合:

    1. navigables を、command parameters["contexts"] を用いて 試行して ID によって有効なトップレベル traversable を取得する結果とする。

  7. それ以外の場合、command parameters の userContexts フィールドが 存在する場合:

    1. user contexts を、command parameters["userContexts"] を用いて 試行して 有効なユーザーコンテキストを取得する 結果とする。

    2. user contexts の各 user context について:

      1. emulated screen orientation が null の場合、user context を 画面の向きオーバーライド マップから 削除する。

      2. それ以外の場合、画面の向きオーバーライド マップ[user context] を emulated screen orientation に 設定する。

      3. 各 top-level traversable について、 トップレベル traversable のすべてのリストのうち、その 関連付けられたユーザーコンテキストが user context であるものについて:

        1. top-level traversable を navigables に 付加する。

  8. navigables の各 navigable について:

    1. user context を navigable の 関連付けられた ユーザーコンテキストとする。

    2. emulated screen orientation が null で、かつ 画面の向きオーバーライドマップが user context を 含む場合、navigable および 画面の向きオーバーライド マップ[user context] を用いて エミュレートされた画面の向きを設定する。

    3. それ以外の場合、navigable および emulated screen orientation を用いて エミュレートされた画面の向きを設定する。

  9. データ null とともに 成功を返す。

7.4.2.8. emulation.setUserAgentOverride コマンド

emulation.setUserAgentOverrideコマンドは、 指定されたトップレベルナビゲータブル、ユーザーコンテキスト、またはグローバルに User-Agent を変更する。

コマンド型
emulation.SetUserAgentOverride = (
  method: "emulation.setUserAgentOverride",
  params: emulation.SetUserAgentOverrideParameters
)

emulation.SetUserAgentOverrideParameters = {
  userAgent: text / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
戻り値の型
emulation.SetUserAgentOverrideResult = EmptyResult
環境設定オブジェクト environment settingsを与えたときのWebDriver BiDi エミュレート User-Agentの手順は次のとおりである:
  1. related navigablesを、 environment settingsを用いて関連する ナビゲータブルを取得した結果とする。

  2. related navigablesの各navigableについて:

    1. top-level navigableをnavigableのトップレベルナビゲータブルとする。

    2. user contextをtop-level navigableの関連付けられた ユーザーコンテキストとする。

    3. アクティブな BiDi セッション内の各sessionについて:

      1. sessionのエミュレートされたユーザーエージェントのナビゲータブルユーザー エージェントが top-level navigableを含む場合、sessionのエミュレートされたユーザーエージェントの ナビゲータブルユーザー エージェント[top-level navigable]を返す。

    4. アクティブな BiDi セッション内の各sessionについて:

      1. sessionのエミュレートされたユーザーエージェントのユーザーコンテキストユーザー エージェント がuser contextを含む場合、sessionのエミュレートされたユーザーエージェントの ユーザーコンテキストユーザー エージェント[user context]を返す。

  3. アクティブな BiDi セッション内の各sessionについて:

    1. default emulated user agentをsessionのエミュレートされたユーザーエージェントの デフォルトユーザーエージェントとする。

    2. default emulated user agentが null ではない場合、 default emulated user agentを返す。

  4. null を返す。

session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:

  1. command parameters が 含む "userContexts" かつ command parameters が 含む "contexts" 場合、 エラーを エラー コード 無効な引数として返す。

  2. emulated user agent を command parameters["userAgent"] とする。

  3. command parameters が 含む "contexts" 場合:

    1. navigables を、command parameters["contexts"] を用いて 試行して ID によって有効なトップレベル traversable を取得する結果とする。

    2. navigables の各 navigable について:

      1. emulated user agent が null の場合、navigable を session の エミュレートされたユーザーエージェントの navigable ユーザー エージェントから 削除する。

      2. それ以外の場合、session の エミュレートされたユーザーエージェントの navigable ユーザー エージェント[navigable] を emulated user agent に 設定する。

    3. データ null とともに 成功を返す。

  4. command parameters が 含む "userContexts" 場合:

    1. user contexts を、command parameters["userContexts"] を用いて 試行して 有効なユーザーコンテキストを取得する 結果とする。

    2. user contexts の各 user context について:

      1. emulated user agent が null の場合、user context を session の エミュレートされたユーザーエージェントの ユーザーコンテキストのユーザー エージェントから 削除する。

      2. それ以外の場合、session の エミュレートされたユーザーエージェントの ユーザーコンテキストのユーザー エージェント[user context] を emulated user agent に 設定する。

    3. データ null とともに 成功を返す。

  5. session の エミュレートされたユーザー エージェントの デフォルトユーザーエージェントを emulated user agent に 設定する。

  6. データ null とともに 成功を返す。

7.4.2.9. emulation.setViewportMetaOverride コマンド

emulation.setViewportMetaOverrideコマンドは、 ブラウザーが <meta name=viewport>タグを尊重するかどうかを変更する。

コマンド型
emulation.SetViewportMetaOverride = (
  method: "emulation.setViewportMetaOverride",
  params: emulation.SetViewportMetaOverrideParameters
)

emulation.SetViewportMetaOverrideParameters = {
  viewportMeta: true / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
戻り値の型
emulation.SetViewportMetaOverrideResult = EmptyResult

リモートエンドは、viewport meta オーバーライド構成を持つ。 これは、 WebDriver 構成であり、関連付けられた型は boolean である。

Document documentを与えたときの WebDriver BiDi viewport meta 状態の手順は次のとおりである:

  1. navigableをdocumentのノードナビゲータブルとする。

  2. viewport meta overrideを、navigableについて viewport meta オーバーライド構成のWebDriver 構成値を取得した結果とする。

  3. viewport meta overrideが未設定である場合、null を返す。

  4. viewport meta overrideを返す。

command parametersを与えたときのリモートエンド手順は次のとおりである:

  1. viewport meta overrideをcommand parameters["viewportMeta"]とする。

  2. viewport meta overrideが null の場合、viewport meta overrideを 未設定に設定する。

  3. affected navigablesを、command parametersについて viewport meta オーバーライド構成 viewport meta overrideをWebDriver 構成に格納することを試行した結果とする。

  4. affected navigablesの各navigableについて、指定された navigableに現在読み込まれている文書に対してメディアクエリを評価して変更を 報告する処理を実行する。

  5. データ null とともに成功を返す。

7.4.2.10. emulation.setScriptingEnabled コマンド

emulation.setScriptingEnabledコマンドは、 Web ページ上で JavaScript を無効化することをエミュレートする。

コマンド型
emulation.SetScriptingEnabled = (
  method: "emulation.setScriptingEnabled",
  params: emulation.SetScriptingEnabledParameters
)

emulation.SetScriptingEnabledParameters = {
  enabled: false / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
戻り値の型
emulation.SetScriptingEnabledResult = EmptyResult

注記: 無効化された Javascript のエミュレーションのみが サポートされる。

環境設定オブジェクト settingsを与えたときの WebDriver BiDi スクリプティングが有効である手順は次のとおりである:
  1. navigableを、settingsの関連グローバルオブジェクトの 関連付けられたDocumentのノードナビゲータブルとする。

  2. top-level traversableをnavigableのトップレベルナビゲータブルとする。

  3. スクリプティング有効化オーバーライドマップが top-level traversableを含む場合、 スクリプティング有効化オーバーライド マップ[top-level traversable]を返す

  4. user contextをtop-level traversableの関連付けられたユーザー コンテキストとする。

  5. スクリプティング有効化オーバーライドマップが user contextを含む場合、 スクリプティング有効化オーバーライドマップ[user context]を返す。

  6. true を返す。

command parameters を用いる リモートエンド手順は次のとおりである:

  1. command parameters が 含む "userContexts" かつ command parameters が 含む "contexts" 場合、 エラーを エラー コード 無効な引数として返す。

  2. command parameters が 含まない "userContexts" かつ command parameters が 含まない "contexts" 場合、 エラーを エラー コード 無効な引数として返す。

  3. emulated scripting enabled status を command parameters["enabled"] とする。

  4. command parameters の contexts フィールドが存在する場合:

    1. navigables を、command parameters["contexts"] を用いて 試行して ID によって有効なトップレベル traversable を取得する結果とする。

    2. navigables の各 navigable について:

      1. emulated scripting enabled status が null の場合、navigable を スクリプティング有効化オーバーライド マップから 削除する。

      2. それ以外の場合、スクリプティング有効化オーバーライド マップ[navigable] を emulated scripting enabled status に 設定する。

  5. command parameters の userContexts フィールドが存在する場合:

    1. user contexts を、command parameters["userContexts"] を用いて 試行して 有効なユーザーコンテキストを取得する 結果とする。

    2. user contexts の各 user context について:

      1. emulated scripting enabled status が null の場合、user context を スクリプティング有効化オーバーライド マップから 削除する。

      2. それ以外の場合、スクリプティング有効化オーバーライド マップ[user context] を emulated scripting enabled status に 設定する。

  6. データ null とともに 成功を返す。

7.4.2.11. emulation.setScrollbarTypeOverride コマンド

emulation.setScrollbarTypeOverrideコマンドは、 指定されたトップレベルナビゲータブル、ユーザーコンテキスト、またはグローバルに スクロールバーの型を変更する。

コマンド型
emulation.SetScrollbarTypeOverride = (
  method: "emulation.setScrollbarTypeOverride",
  params: emulation.SetScrollbarTypeOverrideParameters
)

emulation.SetScrollbarTypeOverrideParameters = {
  scrollbarType: "classic" / "overlay" / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
戻り値の型
emulation.SetScrollbarTypeOverrideResult = EmptyResult

リモートエンドは、スクロールバー型オーバーライド構成を持つ。 これは、 WebDriver 構成であり、関連付けられた型は文字列である。

ナビゲータブル navigableについてスクロールバー 型オーバーライドを更新するには、次を行う:
  1. scrollbar type overrideを、navigableについて スクロールバー型オーバーライド構成のWebDriver 構成値を取得した結果とする。

  2. 表明: scrollbar type overrideは"classic"、 "overlay"、または 未設定である。

  3. scrollbar type overrideが"classic"である場合、 navigableのアクティブな文書がクラシックスクロールバーを使用するように実装定義の手順を実行し、返る。

  4. scrollbar type overrideが"overlay"である場合、 navigableのアクティブな文書がオーバーレイスクロールバーを使用するように実装定義の 手順を実行し、返る。

  5. 表明: scrollbar type overrideは未設定である。

  6. navigableのアクティブな文書が、 実装定義のデフォルトスクロールバー型を 使用するように、実装定義の手順を実行する。

command parameters が与えられた場合の リモートエンド手順は次のとおりである:

  1. scrollbar type override を command parameters["scrollbarType"] とする。

  2. scrollbar type override が null の場合、scrollbar type override を 未設定に設定する。

  3. 実装が scrollbar type override の設定をサポートしていない場合、エラー を エラーコード サポートされていない操作として返す。

  4. affected navigables を、command parameters について scrollbar type override を スクロールバー種別オーバーライド 構成として 試行して WebDriver 構成を保存する結果とする。

  5. affected navigables の各 navigable について:

    1. navigable について スクロールバー種別オーバーライドを更新する。

  6. データ null とともに 成功を返す。

7.4.2.12. emulation.setTextLayoutModeOverride コマンド

emulation.setTextLayoutModeOverride コマンドは、 指定されたトップレベル traversable、ユーザーコンテキスト、またはグローバルにおけるテキストレイアウトモードを変更する。

コマンド型
emulation.SetTextLayoutModeOverride = (
  method: "emulation.setTextLayoutModeOverride",
  params: emulation.SetTextLayoutModeOverrideParameters
)

emulation.SetTextLayoutModeOverrideParameters = {
  textLayoutMode: emulation.TextLayoutMode / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.TextLayoutMode = "mobile"
戻り値の型
emulation.SetTextLayoutModeOverrideResult = EmptyResult

リモートエンドは、テキストレイアウトモードオーバーライド 構成を持ち、これは WebDriver 構成であり、関連付けられた型は文字列である。

テキスト レイアウトモードオーバーライドを更新するには、navigable navigable について、次を行う:

注: テキストレイアウトモード "mobile" は、 テキストの自動サイズ調整(フォント インフレーション)を有効にする。これは主にモバイルデバイスで、小さなビューポートに収める際に テキストブロックの可読性を高めるために使用されるアルゴリズムである。これにより、 ユーザーがズームインしなくてもコンテンツを読みやすい状態に保てる。この 動作は多くの場合、text-size-adjust CSS プロパティによって制御される。 [CSS-SIZE-ADJUST-1] を参照。

  1. text layout mode override を、navigable について テキストレイアウトモードオーバーライド 構成の WebDriver 構成値を取得する結果とする。

  2. 表明:text layout mode override は "mobile" または 未設定である。

  3. text layout mode override が "mobile" の場合、実装定義の手順を実行して、 navigable の アクティブな文書が "mobile" テキストレイアウト モードを使用するようにする。

  4. それ以外の場合、実装定義の手順を実行して、 navigable の アクティブな文書が 実装定義のデフォルトテキストレイアウトモードを使用するようにする。

command parameters が与えられた場合の リモートエンド手順は次のとおりである:

  1. text layout mode override を command parameters["textLayoutMode"] とする。

  2. text layout mode override が null の場合、text layout mode override を 未設定に設定する。

  3. text layout mode override が 未設定 ではなく、かつ実装が テキストレイアウトモードオーバーライドの設定をサポートしていない場合、エラーを、エラーコード サポートされていない操作として返す。

  4. affected navigables を、command parameters について text layout mode override を テキストレイアウトモードオーバーライド 構成として 試行して WebDriver 構成を保存する結果とする。

  5. affected navigables の各 navigable について:

    1. navigable について テキストレイアウトモードオーバーライドを更新する。

  6. データ null とともに 成功を返す。

7.4.2.13. emulation.setTimezoneOverride コマンド

emulation.setTimezoneOverride コマンドは、指定された トップレベル traversable またはユーザーコンテキストのタイムゾーンを変更する。

コマンド型
emulation.SetTimezoneOverride = (
  method: "emulation.setTimezoneOverride",
  params: emulation.SetTimezoneOverrideParameters
)

emulation.SetTimezoneOverrideParameters = {
  timezone: text / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
戻り値の型
emulation.SetTimezoneOverrideResult = EmptyResult
SystemTimeZoneIdentifier アルゴリズムは実装定義である。 WebDriver-BiDi の リモートエンドは、次の 手順を実行する実装を持たなければならない:
  1. emulated timezone を null とする。

  2. realm を 現在の Realm Record とする。

  3. environment settings を、その Realm 実行コンテキストの Realm コンポーネントが realm である 環境設定オブジェクトとする。

  4. related navigables を、environment settings が与えられた場合に 関連する navigable を取得する結果とする。

  5. related navigables の各 navigable について:

    1. top-level traversable を navigable の トップレベル traversable とする。

    2. user context を top-level traversable の 関連付けられた ユーザーコンテキストとする。

    3. タイムゾーンオーバーライドマップが top-level traversable を 含む場合、emulated timezone を タイムゾーンオーバーライドマップ[top-level traversable] に設定する。

    4. それ以外の場合、タイムゾーンオーバーライドマップが 含む user context を含む場合、emulated timezone を タイムゾーンオーバーライドマップ[user context] に設定する。

  6. emulated timezone が null でない場合、emulated timezone を返す。

  7. SystemTimeZoneIdentifier 仕様の要件に従った 実装定義の手順の結果を返す。

command parameters を用いる リモートエンド手順は次のとおりである:

  1. command parameters が 含む "userContexts" かつ command parameters が 含む "contexts" 場合、 エラーを エラー コード 無効な引数として返す。

  2. command parameters が 含まない "userContexts" かつ command parameters が 含まない "contexts" 場合、 エラーを エラー コード 無効な引数として返す。

  3. emulated timezone を command parameters["timezone"] とする。

  4. emulated timezone が null でなく、かつ IsTimeZoneOffsetString(emulated timezone) が false を返し、かつ AvailableNamedTimeZoneIdentifiers が emulated timezone を 含まない 場合、エラーを エラーコード 無効な引数として返す。

  5. navigables を 集合とする。

  6. command parameters の contexts フィールドが存在する場合:

    1. navigables を、command parameters["contexts"] を用いて 試行して ID によって有効なトップレベル traversable を取得する結果とする。

  7. それ以外の場合:

    1. 表明:command parameters の userContexts フィールドが存在する。

    2. user contexts を、command parameters["userContexts"] を用いて 試行して 有効なユーザーコンテキストを取得する 結果とする。

    3. user contexts の各 user context について:

      1. emulated timezone が null の場合、user context を タイムゾーンオーバーライドマップから 削除する。

      2. それ以外の場合、タイムゾーン オーバーライドマップ[user context] を emulated timezone に 設定する。

      3. 各 top-level traversable について、 トップレベル traversable のすべてのリストのうち、その 関連付けられたユーザーコンテキストが user context であるものについて:

        1. top-level traversable を navigables に 付加する。

  8. navigables の各 navigable について:

    1. emulated timezone が null の場合、navigable を タイムゾーンオーバーライドマップから 削除する。

    2. それ以外の場合、タイムゾーン オーバーライドマップ[navigable] を emulated timezone に 設定する。

  9. データ null とともに 成功を返す。

7.4.2.14. emulation.setTouchOverride コマンド

emulation.setTouchOverride コマンドは、Web ページ上で 有効なタッチ入力をエミュレートする。

コマンド型
emulation.SetTouchOverride = (
  method: "emulation.setTouchOverride",
  params: emulation.SetTouchOverrideParameters
)

emulation.SetTouchOverrideParameters = {
  maxTouchPoints: (js-uint .ge 1) / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
戻り値の型
emulation.SetTouchOverrideResult = EmptyResult
WebDriver BiDi エミュレートされた最大タッチポイント数の手順は、 環境設定オブジェクト environment settings が与えられた場合、次のとおりである:
  1. related navigables を、environment settings を用いて 関連する navigable を取得する結果とする。

  2. related navigables の各 navigable について:

    1. top-level navigable を navigable の トップレベル traversable とする。

    2. user context を top-level navigable の 関連付けられた ユーザーコンテキストとする。

    3. アクティブな BiDi セッション内の各 session について:

      1. session の エミュレートされた maxTouchPoints の navigables が top-level navigable を含む場合、 session の エミュレートされた maxTouchPoints の navigables[top-level navigable] を返す。

    4. アクティブな BiDi セッション内の各 session について:

      1. session の エミュレートされた maxTouchPoints の ユーザーコンテキスト が user context を含む場合、session の エミュレートされた maxTouchPoints の ユーザー コンテキスト[user context] を返す。

  3. アクティブな BiDi セッション内の各 session について:

    1. emulated maxTouchPoints を session の エミュレートされた maxTouchPoints の デフォルトとする。

    2. emulated maxTouchPoints が null でない場合、emulated maxTouchPoints を返す。

  4. null を返す。

session および command parameters を用いる リモートエンド手順は次のとおりである:

注: 従来の 従来のタッチイベント API を公開する仕組みがあり、 一部の既存の Web コンテンツでは、ユーザーエージェントがタッチ対応の「モバイル」デバイスであることを示すシグナルとして依然として使用されることがある。API は従来のものであるが、ユーザーエージェントは 実装定義の手順を実行して、 エミュレートされた maxTouchPoints の状態を 従来のタッチイベント API を公開する際に考慮してもよい。

  1. command parameters が 含む "userContexts" かつ command parameters が "contexts" を 含む場合、エラーを エラー コード 無効な引数として返す。

  2. maxTouchPoints を command parameters["maxTouchPoints"] とする。

  3. command parameters の contexts フィールドが存在する場合:

    1. navigables を、command parameters["contexts"] を用いて 試行して ID によって有効なトップレベル traversable を取得する結果とする。

    2. navigables の各 navigable について:

      1. maxTouchPoints が null の場合、navigable を session の エミュレートされた maxTouchPoints の navigablesから 削除する。

      2. それ以外の場合、session の エミュレートされた maxTouchPoints の navigables[navigable] を maxTouchPoints に 設定する。

    3. データ null とともに 成功を返す。

  4. command parameters の userContexts フィールドが存在する場合:

    1. user contexts を、command parameters["userContexts"] を用いて 試行して 有効なユーザーコンテキストを取得する結果とする。

    2. user contexts の各 user context について:

      1. maxTouchPoints が null の場合、user context を session の エミュレートされた maxTouchPoints の ユーザーコンテキストから 削除する。

      2. それ以外の場合、session の エミュレートされた maxTouchPoints の ユーザー コンテキスト[user context] を maxTouchPoints に 設定する。

    3. データ null とともに 成功を返す。

  5. session の エミュレートされた maxTouchPoints の デフォルト を maxTouchPoints に設定する。

  6. データ null とともに 成功を返す。

7.5. network モジュール

network モジュールは、ネットワークリクエストに関係するコマンドとイベントを 含む。

7.5.1. 定義

remote end definition

NetworkCommand = (
  network.AddDataCollector //
  network.AddIntercept //
  network.ContinueRequest //
  network.ContinueResponse //
  network.ContinueWithAuth //
  network.DisownData //
  network.FailRequest //
  network.GetData //
  network.ProvideResponse //
  network.RemoveDataCollector //
  network.RemoveIntercept //
  network.SetCacheBehavior //
  network.SetExtraHeaders
)

local end definition

NetworkResult = (
  network.AddDataCollectorResult /
  network.AddInterceptResult /
  network.ContinueRequestResult /
  network.ContinueResponseResult /
  network.ContinueWithAuthResult /
  network.DisownDataResult /
  network.FailRequestResult /
  network.GetDataResult /
  network.ProvideResponseResult /
  network.RemoveDataCollectorResult /
  network.RemoveInterceptResult /
  network.SetCacheBehaviorResult /
  network.SetExtraHeadersResult
)

NetworkEvent = (
    network.AuthRequired //
    network.BeforeRequestSent //
    network.FetchError //
    network.ResponseCompleted //
    network.ResponseStarted
)

A リモートエンドは、リクエスト送信前マップを持ち、これは初期状態では 空のマップである。これは、 network.beforeRequestSent イベントがすでに送信されたネットワークイベントを追跡するために使用される。

A リモートエンドは、文字列であるデフォルトのキャッシュ動作を持つ。これは 初期状態では "default" である。

A リモートエンドは、navigable キャッシュ動作マップを持ち、これは トップレベル traversableとキャッシュ 動作を表す文字列との間の弱いマップである。これは初期状態では空である。

BiDi セッションは、追加ヘッダーを持ち、これは 構造体であり、 項目としてデフォルト ヘッダーという名前のものを持つ。これはヘッダー リスト(初期状態では空の ヘッダーリストに設定される)であり、さらに項目として ユーザーコンテキストヘッダーという名前のものを持ち、これは ユーザーコンテキストとヘッダーリストとの間の弱いマップであり、さらに項目として navigable ヘッダーという名前のものを持ち、これは navigableとヘッダー リストとの間の弱いマップである。

7.5.2. ネットワークデータ収集

ネットワークデータは、以下を持つ構造体である:

collectorは、以下を持つ構造体である:

注記: 最大 エンコード済み項目サイズは項目(レスポンスまたはリクエスト)ごとの上限を定義し、 特定の collector によって収集されるサイズを制限しない。収集されるすべてのリソースの総サイズは 最大総収集サイズによって制限される。

BiDi セッションは、ネットワークコレクター を持つ。これは、 network.Collector とコレクターとの間のマップである。これは 初期状態では空である。

リモートエンドは、ネットワークデータのリストである収集済みネットワークデータを持つ。これは初期状態では 空である。

リモートエンドは、最大総収集サイズを持つ。これは、 収集済みネットワークデータにネットワークデータを収集するために割り当てられたサイズを表す js-uint である。その 値は実装定義である。

注記: これにより、実装はリソース使用量の 制限を設定できる。 その制限は十分に大きく、ウェブページで使用される画像やフォントなど、 ブラウザーによって完全にデコードされ処理されるデータを収集できるとユーザーが期待できるものとされる。

request が与えられたとき、get navigable for request するには:
  1. navigable を null とする。

  2. request の client が environment settings object である場合:

    1. environment settings を request の client とする

    2. environment settings の global object が active window である navigable が存在する場合、 navigable をその navigable に設定する。

  3. navigable を返す。

collector および navigable が与えられたとき、 match collector for navigable するには:
  1. collector の contexts が空でない場合:

    1. collector の contexts が navigable の navigable id を含む場合、true を返す。

    2. そうでなければ、false を返す。

  2. collector の user contexts が空でない場合:

    1. user context を navigable の associated user context とする。

    2. collector の user contexts が user context の user context id を含む場合、true を返す。

    3. そうでなければ、false を返す。

  3. true を返す。

request request が与えられたときの WebDriver BiDi clone network request body steps は次である:
  1. request の body が null である場合、戻る。

  2. active BiDi sessions 内の各 session について:

    1. session の network collectors が空でない場合:

      1. collected data を、 network data とし、 bytes を null に設定し、 cloned body を request の body の clone に設定し、 collectors を空の list に設定し、 pending を true に設定し、 request を request の request id に設定し、 size を null に設定し、 type を "request" に設定したものとする。

      2. collected data を collected network data に追加する。

      3. 戻る。

request および response body が与えられたときの WebDriver BiDi clone network response body steps は次である:
  1. response body が null である場合、戻る。

  2. active BiDi sessions 内の各 session について:

    1. session の network collectors が空でない場合:

      1. collected data を、 network data とし、 bytes を null に設定し、 cloned body を response body の clone に設定し、 collectors を空の list に設定し、 pending を true に設定し、 request を request の request id に設定し、 size を null に設定し、 type を "response" に設定したものとする。

      2. collected data を collected network data に追加する。

      3. 戻る。

request id および data type が与えられたとき、 get collected data するには。
  1. collected network data の各 collected data について:

    1. collected data の request が request id であり、 かつ collected data の type が data type である場合、 collected data を返す。

  2. null を返す。

request が与えられたとき、 maybe abort network response body collection するには:
  1. collected data を、request の request id および "response" で get collected data したものとする。

  2. collected data が null である場合、戻る。

  3. collected data の pending を false に設定する。

  4. "network data collected" および (request の request id, "response") で Resume する。

request が与えられたとき、 maybe collect network request body するには:
  1. collected data を、request の request id および "request" で get collected data したものとする。

  2. collected data が null である場合、戻る。

    注: これは、request が作成されたときに collectors が設定されておらず、 WebDriver BiDi clone network request body が対応する body を clone しない場合に起こり得る。 または、そもそも body が null であった場合にも起こり得る。

  3. request、collected data、null、および "request" で Maybe collect network data する。

request および response が与えられたとき、 maybe collect network response body するには:
  1. response の status が redirect status である場合、戻る。

    注: redirects については、最終 response body のみが保存される。

  2. collected data を、request の request id および "response" で get collected data したものとする。

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

    注: これは、response が作成されたときに collectors が設定されておらず、 WebDriver BiDi clone network response body が対応する body を clone しない場合に起こり得る。 または、そもそも body が null であった場合にも起こり得る。

  4. size を、response の response body info の encoded size とする。

    注: fetch stream から取得される bytes は decoded data に対応するが、size limits を計算するためには encoded (network) size が使用される、 という不一致がある。実装は、getData で clients に返される data が decoded data と同一である限り、 decoded data を保存するよりも少ない size を使用する storage model を採用してもよい。 storage と performance の潜在的な tradeoff は実装次第である。

  5. request、collected data、size および "response" で Maybe collect network data する。

request request、 network data collected data、js-uint size および network.DataType data type が与えられたとき、 maybe collect network data するには:
  1. collected data の pending を false に設定する。

  2. navigable を、 request で get navigable for request したものとする。

  3. navigable が null である場合:

    1. collected data を collected network data から削除する。

    2. "network data collected" および (request の request id, data type) で Resume する。

    3. 戻る。

    これは navigable に関係しない data の収集を防ぐ。 collector configuration に照らして確認するために navigable を取得する必要はまだあるが、 ここで null を受け入れることもできる。

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

  5. collectors を空の list とする。

  6. active BiDi sessions 内の各 session について:

    1. session の network collectors 内の各 collector について:

      1. collector の data types が data type を含み、かつ collector および top-level navigable で match collector for navigable した場合:

        1. collector を collectors に追加する。

  7. collectors が空である場合:

    1. collected data を collected network data から削除する。

    2. "network data collected" および (request の request id, data type) で Resume する。

    3. 戻る。

  8. bytes を null とする。

  9. nullOrBytes が与えられたときの processBody を、このステップとする:

    1. nullOrBytes が null でない場合:

      1. bytes を、 nullOrBytes で serialize protocol bytes した結果に設定する。

      2. size が null である場合、size を bytes の length に設定する。

  10. processBodyError を、このステップとする: 何もしない。

  11. processBody および processBodyError が与えられたものとして、collected data の cloned body を Fully read する。

  12. bytes が null でない場合:

    1. collectors 内の各 collector について:

      1. size が collector の max encoded item size 以下である場合、 collector の collector を collected data の collectors に追加する。

    2. collected data の collectors が空でない場合:

      1. size が与えられたものとして Allocate size to record data する。

      2. collected data の bytes を bytes に設定する。

      3. collected data の size を size に設定する。

    3. そうでなければ、collected data を collected network data から削除する。

  13. "network data collected" および (request の request id, data type) で Resume する。

size が与えられたとき、allocate size to record data するには:
  1. available size を max total collected size とする。

  2. already collected data を空の list とする。

  3. collected network data 内の各 collected data について:

    1. collected data の bytes が null でない場合:

      1. available size を collected data の size だけ減らす。

      2. collected data を already collected data に追加する

  4. size が available size より大きい場合:

    1. already collected data 内の各 collected data について:

      1. available size を collected data の size だけ増やす。

      2. collected data の bytes field を null に設定する。

      3. collected data の size field を null に設定する。

      4. available size が size 以上である場合、戻る。

collected data および collector id が与えられたとき、 remove collector from data するには:
  1. collected data の collectors が collector id を含む場合:

    1. collector id を collected data の collectors から削除する。

    2. collected data の collectors が空である場合:

      1. collected data を collected network data から削除する。

7.5.3. ネットワークインターセプト

ネットワークインターセプト は、リモートエンドがネットワークリクエストおよびレスポンスをインターセプトし、 変更できるようにするための仕組みである。

BiDi セッションは、インターセプトマップを持つ。これは、 インターセプト ID と、アクティブなネットワークインターセプトのプロパティを定義する url patterns、 phases、およびcontextsフィールドを持つ構造体との間のマップ である。これは初期状態では空である。

BiDi セッションは、ブロックされたリクエスト マップを持ち、現在アクティブにブロックされている リクエストを追跡するために使用される。これは、リクエスト ID と、request、phase、および responseフィールドを持つ構造体 との間のマップである。これは初期状態では空である。

session、event、request、および navigable idが与えられたとき、ネットワーク インターセプトを取得するには:

  1. session interceptsを、sessionのインターセプトマップとする。

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

  3. 最初に一致する条件の下の手順を実行する:

    event is "network.beforeRequestSent"
    phaseを "beforeRequestSent" に設定する。
    event is "network.responseStarted"
    phaseを "responseStarted" に設定する。
    event is "network.authRequired"
    phaseを "authRequired" に設定する。
    event is "network.responseCompleted"
    interceptsを返す。
  4. urlを、requestの URLでURL シリアライザーを実行した結果とする。

  5. session interceptsの各intercept id → interceptについて:

    1. interceptのcontextsが null でない場合:

      1. interceptのcontextsがnavigable idを含まない場合:

        1. 続行する。

    2. interceptのphasesがphaseを含む場合:

      1. url patternsを、interceptのurl patternsとする。

      2. url patternsが空である場合:

        1. intercept idを interceptsに付加する。

        2. 続行する。

      3. url patterns内の各url patternについて:

        1. url patternおよびurlでURL パターンに一致する場合:

          1. intercept idをinterceptsに付加する。

          2. 中断する。

  6. interceptsを返す。

レスポンスを 更新するには、session、command および command parameters が与えられた場合、次を行う:
  1. blocked requests を session の ブロックされたリクエストマップとする。

  2. request id を command parameters["request"] とする。

  3. blocked requests が request id を 含まない 場合、 エラーを エラー コード そのようなリクエストはないとして返す。

  4. (request, phase, response) を blocked requests[request id] とする。

  5. phase が "beforeRequestSent" で、かつ command が "continueResponse" の場合、エラーを エラーコード "invalid argument" として返す。

    TODO: 別のエラーを検討する

  6. response が null の場合:

    1. 表明:phase は "beforeRequestSent" である。

    2. response を新しい レスポンスに設定する。

  7. command parameters が "statusCode" を 含む場合:

    1. responses の ステータスを command parameters["statusCode"] に設定する。

  8. command parameters が "reasonPhrase" を 含む場合:

    1. responses の ステータスメッセージを、 command parameters["reasonPhrase"] を用いて UTF-8 エンコードしたものに設定する。

  9. command parameters が "headers" を 含む場合:

    1. headers を、command parameters["headers"] を用いて 試行して ヘッダーリストを作成する結果とする。

    2. response の ヘッダーリストを headers に設定する。

  10. command parameters が "cookies" を 含む場合:

    1. command parameters が "headers" を 含む場合、headers を response の ヘッダーリストとする。

      それ以外の場合:

      1. headers を空の ヘッダーリストとする。

      2. response の ヘッダーリスト内の各 header について:

        1. name を header の名前とする。

        2. name を バイト小文字化したものが `set-cookie` でない場合:

          1. header を headers に付加する

    2. command parameters["cookies"] 内の各 cookie について:

      1. header value を、cookie を用いて set-cookie ヘッダーをシリアル化する 結果とする。

      2. (`Set-Cookie`, header value) を headers に付加する。

      3. response の ヘッダーリストを headers に設定する。

  11. command parameters が "credentials" を 含む場合:

    これには 認証をキャンセルする方法がない。

    1. credentials を command parameters["credentials"] とする。

    2. 表明:credentials["type"] は "password" である。

    3. response の認証資格情報を (credentials["username"], credentials["password"]) に設定する

  12. response を返す

7.5.4. 型

7.5.4.1. network.AuthChallenge 型
network.AuthChallenge = {
  scheme: text,
  realm: text,
}

response が与えられたとき、extract challenges するには:

realm 以外の parameters も含めるべきか?

  1. response の status が 401 である場合、header name を `WWW-Authenticate` とする。そうでなく、response の status が 407 である場合、 header name を `Proxy-Authenticate` とする。そうでなければ null を返す。

  2. challenges を新しい list とする。

  3. response の header list 内の各 (name, value) について:

    Fetch と同様に、 複数 headers、parsing issues などを処理する正しい方法であるかどうかは不明である。

    1. name が header name に対する byte-case-insensitive match である場合:

      1. header challenges を、value を challenges の list に parse した結果とする。各 challenge は scheme および parameters の list からなり、 各 parameter は tuple (name, value) であり、[RFC9110] の規則に従う。

      2. header challenges 内の各 header challenge について:

        1. scheme を header challenge の scheme とする。

        2. realm を空文字列とする。

        3. header challenge の parameters 内の各 (param name, param value) について:

          1. param name が `realm` と等しい場合、 realm を param value で UTF-8 decode した結果とする。

        4. challenge を、 scheme field を scheme に設定し、 realm field を realm に設定した、 network.AuthChallenge production に一致する新しい map とする。

      3. challenge を challenges に追加する。

  4. challenges を返す。

7.5.4.2. network.AuthCredentials 型
network.AuthCredentials = {
  type: "password",
  username: text,
  password: text,
}

network.AuthCredentials 型は、authorization credentials に対する request への response を表す。

7.5.4.3. network.BaseParameters 型
network.BaseParameters = (
    context: browsingContext.BrowsingContext / null,
    isBlocked: bool,
    navigation: browsingContext.Navigation / null,
    redirectCount: js-uint,
    request: network.RequestData,
    timestamp: js-uint,
    ? userContext: browser.UserContext / null,
    ? intercepts: [+network.Intercept]
)

network.BaseParameters 型は、すべての network events に共通する data を表す抽象型である。

context に加えて、 request を開始した document node の `sharedId` を含めることを検討する。

session、event、および request が与えられたとき、 process a network event するには:
  1. request data を、request で get the request data した結果とする。

  2. navigation を request の navigation id とする。

  3. navigable id を null とする。

  4. top-level navigable id を null とする。

  5. user context id を null とする。

  6. request の client が environment settings object である場合:

    1. environment settings を request の client とする。

    2. environment settings の global object が active window である navigable が存在する場合、navigable id をその navigable の navigable id に設定し、top-level navigable id をその navigable の top-level traversable の navigable id に設定し、 user context id をその navigable の associated user context の user context id に設定する。

  7. intercepts を、 session、event、request、および top-level navigable id で get the network intercepts した結果とする。

  8. redirect count を request の redirect count とする。

  9. timestamp を、UTC における現在の日付と時刻を表す time value とする。

  10. intercepts が空でない場合、 is blocked を true とし、そうでなければ is blocked を false とする。

  11. params を、network.BaseParameters production に一致する map とし、 request field を request data に設定し、 navigation field を navigation に設定し、context field を navigable id に設定し、userContext field を user context id に設定し、timestamp field を timestamp に設定し、 redirectCount field を redirect count に設定し、 isBlocked field を is blocked に設定し、is blocked が true である場合は intercepts field を intercepts に設定し、そうでなければ省略する。

  12. params を返す

7.5.4.4. network.BytesValue 型
network.BytesValue = network.StringValue / network.Base64Value;

network.StringValue = {
  type: "string",
  value: text,
}

network.Base64Value = {
  type: "base64",
  value: text,
}

network.BytesValue 型は、network を通じて送信される binary data を表す。 valid UTF-8 は network.StringValue 型で表され、 その他の data は Base64-encoded form として network.Base64Value で表される。

protocol bytes が与えられたとき、deserialize protocol bytes するには:

注: これは network.BytesValue として encode された bytes を受け取り、 byte sequence を返す。

  1. protocol bytes が network.StringValue production に一致する場合、 bytes を、protocol bytes["value"] で UTF-8 encode した結果とする。

  2. そうでなく、protocol bytes が network.Base64Value production に一致する場合、bytes を、protocol bytes["value"] で forgiving-base64 decode した結果とする。

  3. bytes を返す。

bytesが与えられたとき、プロトコル バイトを直列化するには:

注記: これはバイト列を受け取り、 network.BytesValueを返す。

  1. textを、bytesをBOM なしで UTF-8 デコードし、失敗する ことによって得られる結果とする。

  2. textが失敗である場合、 network.Base64Value生成規則に一致し、valueが bytesを寛容な base64 エンコードしたものに設定されたマップを返す。

  3. network.StringValue生成規則に一致し、valueがtextに設定されたマップを返す。

7.5.4.5. network.Collector 型

リモートエンド定義 および ローカルエンド定義

network.Collector = text

network.Collector 型は、collectorの ID を表す。

7.5.4.6. network.CollectorType 型

リモートエンド定義 および ローカルエンド定義

network.CollectorType = "blob"

注記: 将来的には、ストリームを介して指定された collector により 収集されたデータを読み取りたいクライアント向けに、"stream" collector 型もサポートする可能性がある。

network.CollectorType 型は、追加できるデータ collector のさまざまな型を表す。

リモートエンド定義 および ローカルエンド定義

network.SameSite = "strict" / "lax" / "none" / "default"


network.Cookie = {
    name: text,
    value: network.BytesValue,
    domain: text,
    path: text,
    size: js-uint,
    httpOnly: bool,
    secure: bool,
    sameSite: network.SameSite,
    ? expiry: js-uint,
    Extensible,
}

network.Cookie 型は Cookie を表す。

stored cookieが与えられたとき、Cookie を直列化する には:
  1. nameを、stored cookieの name フィールドでUTF-8 decodeした結果とする。

  2. valueを、stored cookieの value でプロトコルバイトを直列化する結果とする。

  3. domainを、stored cookieの domain フィールドとする。

  4. pathを、stored cookieの path フィールドとする。

  5. expiryを、stored cookieの expiry-time フィールドが設定されている場合は unix タイムスタンプとして表したもの、そうでなければ null とする。

  6. sizeを、stored cookieを Cookieヘッダー内で表されるものとして直列化した結果のバイト長とする。

  7. http onlyを、stored cookieの http-only-flag が true であれば true、 そうでなければ false とする。

  8. secureを、stored cookieの secure-only-flag が true であれば true、 そうでなければ false とする。

  9. same siteを、stored cookieの same-site-flag が "None" であれば "none"、"Lax" であれば "lax"、 "Strict" であれば "strict"、 "Default" であれば "default" とする

  10. network.Cookie生成規則に一致するマップを返す。 そのnameフィールドはnameに、valueフィールドは valueに、domainフィールドはdomainに、 pathフィールドはpathに、expiryフィールドは expiryが null でなければexpiryに設定され、そうでなければ省略され、 sizeフィールドはsizeに、httpOnlyフィールドはhttp onlyに、 secureフィールドはsecureに、そしてsameSite フィールドはsame siteに設定される。

7.5.4.8. network.CookieHeader 型

リモートエンド定義

network.CookieHeader = {
    name: text,
    value: network.BytesValue,
}

network.CookieHeader 型は、Cookieリクエストヘッダー内にある Cookie データの部分集合を表す。

protocol cookieが与えられたとき、Cookie ヘッダーを直列化するには:
  1. nameを、protocol cookie["name"]をUTF-8 encodeしたものとする。

  2. valueを、protocol cookie["value"]でプロトコルバイトを逆直列化する結果とする。

  3. header valueを、name、 `=`、およびvalueを連結して形成されるバイト列とする

  4. header valueを返す。

7.5.4.9. network.DataType 型

リモートエンド定義 および ローカルエンド定義

network.DataType = "request" / "response"

network.DataType 型は、収集できるネットワークデータのさまざまな型を表す。

7.5.4.10. network.FetchTimingInfo 型

リモートエンド定義 および ローカルエンド定義

network.FetchTimingInfo = {
    timeOrigin: float,
    requestTime: float,
    redirectStart: float,
    redirectEnd: float,
    fetchStart: float,
    dnsStart: float,
    dnsEnd: float,
    connectStart: float,
    connectEnd: float,
    tlsStart: float,

    requestStart: float,
    responseStart: float,

    responseEnd: float,
}

network.FetchTimingInfo 型は、requestの clientのtime originを基準とした、リクエストの各部分の時刻を表す。

requestが与えられたとき、fetch タイミングを取得するには:
  1. globalを、requestのclientとする。

  2. globalが null である場合、すべてのフィールドが 0 に設定された network.FetchTimingInfo生成規則に一致するマップを返す。

  3. time originを、globalでtime origin timestamp を取得する結果とする。

  4. timingsを、requestのfetch timing infoとする。

  5. connection timingを、timingsのfinal connection timing infoが null でなければそれとし、そうでなければ新しいconnection timing infoとする。

  6. request timeを、timingsのstart timeおよびglobalが与えられたとして fetch timestamp を変換する結果とする。

  7. redirect startを、timingsの redirect start timeおよび globalが与えられたとしてfetch timestamp を変換する結果とする。

  8. redirect endを、timingsのredirect end timeおよび globalが与えられたとしてfetch timestamp を変換する結果とする。

  9. fetch startを、timingsの post-redirect start timeおよび globalが与えられたとしてfetch timestamp を変換する結果とする。

  10. DNS startを、connection timingの domain lookup start time およびglobalが与えられたとしてfetch timestamp を変換する結果とする。

  11. DNS endを、connection timingの domain lookup end timeおよび globalが与えられたとしてfetch timestamp を変換する結果とする。

  12. TLS startを、connection timingの secure connection start timeおよびglobalが与えられたとしてfetch timestamp を変換する結果とする。

  13. connect startを、connection timingのconnection start timeおよび globalが与えられたとしてfetch timestamp を変換する結果とする。

  14. connect endを、connection timingの connection end timeおよび globalが与えられたとしてfetch timestamp を変換する結果とする。

  15. request startを、timingsのfinal network-request start timeおよびglobalが与えられたとしてfetch timestamp を変換する結果とする。

  16. response startを、timingsのfinal network-response start timeおよびglobalが与えられたとしてfetch timestamp を変換する結果とする。

  17. response endを、timingsの end timeおよびglobalが与えられたとしてfetch timestamp を変換する結果とする。

  18. timeOriginフィールドがtime originに、 requestTimeフィールドがrequest timeに、 redirectStartフィールドがredirect startに、 redirectEndフィールドがredirect endに、 fetchStartフィールドがfetch startに、 dnsStartフィールドがDNS startに、dnsEnd フィールドがDNS endに、connectStartフィールドがconnect startに、connectEndフィールドがconnect endに、 tlsStartフィールドがTLS startに、 requestStartフィールドがrequest startに、 responseStartフィールドがresponse startに、そして responseEndフィールドがresponse endに設定された、 network.FetchTimingInfo生成規則に一致するマップを返す。

TODO: service worker フィールドを追加する

7.5.4.11. network.Header 型

リモートエンド定義 および ローカルエンド定義

network.Header = {
  name: text,
  value: network.BytesValue,
}

network.Header 型は単一のリクエストヘッダーを表す。

name bytesおよびvalue bytesが与えられたとき、ヘッダーを直列化する には:
  1. nameを、name bytesでUTF-8 decodeした結果とする。

    表明:ヘッダー名は ASCII のみに制約されているため、これは失敗しない。

  2. valueを、value bytesでプロトコルバイトを直列化する結果とする。

  3. nameフィールドがnameに、valueフィールドが valueに設定された、network.Header生成規則に一致するマップを返す。

protocol headerが与えられたとき、ヘッダーを 逆直列化するには:
  1. nameを、protocol header["name"]をUTF-8 encodeしたものとする。

  2. valueを、protocol header["value"]でプロトコルバイトを逆直列化する結果とする。

  3. header (name, value) を返す。

protocol headers が与えられた場合に ヘッダー リストを作成するには:
  1. headers を空の ヘッダーリストとする。

  2. protocol headers 内の各 header について:

    1. deserialized header を、header を用いて ヘッダーをデシリアライズする結果とする。

    2. deserialized header の名前が フィールド名トークン 生成規則に一致しない場合、エラーを エラーコード "invalid argument" として返す。

    3. deserialized header の値が ヘッダー 値 生成規則に一致しない場合、エラーを エラーコード "invalid argument" として返す。

    4. deserialized header を headers に付加する。

  3. データ headers とともに 成功を返す

7.5.4.12. network.Initiator 型

リモートエンド定義 および ローカルエンド定義

network.Initiator = {
    ? columnNumber: js-uint,
    ? lineNumber: js-uint,
    ? request: network.Request,
    ? stackTrace: script.StackTrace,
    ? type: "parser" / "script" / "preflight" / "other"
}

network.Initiator 型は、ネットワークリクエストの発生源を表す。

注記: typeフィールドは後方互換性のために 定義に含まれているが、initiator を取得する手順によって設定されることはなくなっており、 この仕様の将来の改訂で削除される予定である。その使用は network.RequestData上のinitiatorTypeおよびdestinationに 置き換えられることが期待される。

注記: requestフィールドは後方互換性のために 定義に含まれているが、initiator を取得する手順によって設定されることはなくなっており、 この仕様の将来の改訂で削除される予定である。 network.Initiatorは、同じリクエスト ID も含む network.BeforeRequestSentParametersに含まれるため、 この情報は冗長である。§ 7.5.4.3 network.BaseParameters 型を参照。

requestが与えられたとき、initiator を取得する には:
  1. requestのinitiator typeが "fetch" または "xmlhttprequest" である場合:

    1. stack traceを現在のスタックトレースとする。

    2. stack traceのサイズが 1 以上である場合、 line numberをstack trace[0]の lineNumberフィールドの値とし、column numberを stack trace[0]のcolumnNumberフィールドの値とする。そうでなければ、 line numberおよびcolumn numberを 0 とする。

    そうでなければ、stack trace、column number、およびline numberをすべて null とする。

    TODO: Chrome は、parser により挿入されたリソースについて、現在の parser 位置を column number / line number として含める。

  2. network.Initiator生成規則に一致するマップを返す。 そのcolumnNumberフィールドはcolumn numberが null でなければ設定され、 そうでなければ省略される。lineNumberフィールドはline numberが null でなければ設定され、そうでなければ省略され、stackTraceフィールドは stack traceが null でなければ設定され、そうでなければ省略される。

7.5.4.13. network.Intercept 型

リモートエンド定義 および ローカルエンド定義

network.Intercept = text

network.Intercept 型は、ネットワークインターセプトの ID を表す。

7.5.4.14. network.Request 型

リモートエンド定義 および ローカルエンド定義

network.Request = text;

各ネットワークリクエストは、関連付けられたリクエスト IDを持つ。これは、そのリクエストを一意に識別する 文字列である。リダイレクトの結果生じるリクエストの識別子は、それを開始したリクエストのものと一致する。

7.5.4.15. network.RequestData 型

リモートエンド定義 および ローカルエンド定義

network.RequestData = {
    request: network.Request,
    url: text,
    method: text,
    headers: [*network.Header],
    cookies: [*network.Cookie],
    headersSize: js-uint,
    bodySize: js-uint / null,
    destination: text,
    initiatorType: text / null,
    timings: network.FetchTimingInfo,
}

network.RequestData 型は、進行中のネットワークリクエストを表す。

requestが与えられたとき、リクエスト データを取得するには:

  1. request idを、request のリクエスト IDとする。

  2. urlを、requestの URLでURL シリアライザーを実行した結果とする。

  3. methodを、requestのmethodとする。

  4. body sizeを null とする。

  5. bodyを、request のbodyとする。

  6. bodyがバイト列である場合、 body sizeをその列の長さに設定する。そうでなく、bodyがbodyである場合、 body sizeをその body の長さに設定する。

  7. headers sizeを、[HTTP11]により義務付けられるように直列化されたときの、 requestのheaders listのバイト単位のサイズとする。

    注記: ヘッダー圧縮を許可するプロトコルでは、 これはネットワーク上で送信されたヘッダーの圧縮後サイズである。

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

  9. cookiesを空のリストとする。

  10. requestのheaders list内の各(name, value)について:

    1. nameおよび valueでヘッダーを直列化する結果をheadersに付加する。

    2. nameが "Cookie" とバイト大小無視一致する場合:

      1. requestに含まれる、ユーザーエージェントのCookie ストア内の各cookieについて:

        注記: [COOKIES]は、ストア内のどの Cookie が リクエストに含まれうるかについていくつかの基本要件を定義するが、ユーザーエージェントは 追加の制約を課してもよい。

        1. cookieが与えられたとしてCookie を直列化する結果を cookiesに付加する。

  11. destinationを、requestのdestinationとする。

  12. initiator typeを、requestのinitiator typeとする。

  13. timingsを、requestでfetch タイミングを取得する結果とする。

  14. network.RequestData生成規則に一致するマップを返す。 そのrequestフィールドはrequest idに、urlフィールドは urlに、methodフィールドはmethodに、 headersフィールドはheadersに、cookiesフィールドは cookiesに、headersSizeフィールドはheaders sizeに、 bodySizeフィールドはbody sizeに、destination フィールドはdestinationに、initiatorTypeフィールドは initiator typeに、そしてtimingsフィールドはtimingsに設定される。

7.5.4.16. network.ResponseContent 型

リモートエンド定義 および ローカルエンド定義

network.ResponseContent = {
    size: js-uint
}

network.ResponseContent 型は、ネットワークリクエストに対するデコード済みレスポンスを表す。

responseが与えられたとき、レスポンス content 情報を取得するには:
  1. sizeフィールドがresponseのresponse body infoのdecoded sizeに設定された、 network.ResponseContent生成規則に一致する新しいマップを返す

7.5.4.17. network.ResponseData 型

リモートエンド定義 および ローカルエンド定義

network.ResponseData = {
    url: text,
    protocol: text,
    status: js-uint,
    statusText: text,
    fromCache: bool,
    headers: [*network.Header],
    mimeType: text,
    bytesReceived: js-uint,
    headersSize: js-uint / null,
    bodySize: js-uint / null,
    content: network.ResponseContent,
    ?authChallenges: [*network.AuthChallenge],
}

network.ResponseData 型は、ネットワークリクエストに対するレスポンスを表す。

responseが与えられたとき、protocol を取得するには:

  1. protocolを空文字列とする。

  2. responseのfinal connection timing infoが null でない場合、protocolを responseのfinal connection timing infoのALPN negotiated protocolに設定する。

  3. protocolが空文字列であるか、"unknown" に等しい場合:

    1. protocolを、responseのurlのschemeに設定する

    2. protocolが "http" または "https" のいずれかに等しく、かつresponseに関連付けられた HTTP Response がある場合。

      注記: [FETCH]は、 HTTP ネットワークレスポンスと response オブジェクトとの関係について明確ではない。

      1. http versionを、HTTP Response の Status line の HTTP-version [HTTP11]とする。

      2. http versionが "HTTP/" で始まる場合:

        1. versionを、http versionの 5 から http versionの長さまでのコード単位部分文字列とする。

        2. versionが "0.9" である場合、protocolを "http/0.9" に設定し、そうでなくversionが "1.0" である場合、 protocolを "http/1.0" に設定し、そうでなく versionが "1.1" である場合、protocolを "http/1.1" に設定する。

  4. protocolを返す。

responseが与えられたとき、レスポンス データを取得するには:
  1. urlを、responseの URLでURL シリアライザーを実行した結果とする。

  2. protocolを、responseが与えられたとしてprotocol を取得する結果に設定する。

  3. statusを、responseのstatusとする。

  4. status textを、responseのstatus messageとする。

  5. responseのcache stateが "local" である場合、 from cacheを true とし、そうでなければ false とする。

  6. headersを空のリストとする。

  7. mime typeを、responseについての計算済み MIME 型のessenceとする。

    注記: これは、ブラウザーが実際に使用している MIME 型であり、 たとえ[MIMESNIFF]仕様の正確なアルゴリズムに従っていなくても同様である。

  8. responseのheaders list内の各(name, value)について:

    1. nameおよび valueでヘッダーを直列化する結果をheadersに付加する。

  9. bytes receivedを、responseに関連付けられた HTTP レスポンスの一部として送信された総バイト数とする。

  10. headers sizeを、HTTP レスポンスのヘッダー フィールドセクションの一部として送信されたバイト数とする。

  11. body sizeを、responseのresponse body infoのencoded sizeとする。

  12. contentを、responseでレスポンス content 情報を取得する結果とする。

  13. auth challengesを、responseでchallenge を抽出する結果とする。

  14. network.ResponseData生成規則に一致するマップを返す。 そのurlフィールドはurlに、protocolフィールドは protocolに、statusフィールドはstatusに、 statusTextフィールドはstatus textに、 fromCacheフィールドはfrom cacheに、headers フィールドはheadersに、mimeTypeフィールドはmime typeに、 bytesReceivedフィールドはbytes receivedに、 headersSizeフィールドはheaders sizeに、 bodySizeフィールドはbody sizeに、content フィールドはcontentに設定され、authChallengesフィールドは auth challengesが null でなければauth challengesに設定され、そうでなければ省略される。

7.5.4.18. network.SetCookieHeader 型

Remote end definition

network.SetCookieHeader = {
    name: text,
    value: network.BytesValue,
    ? domain: text,
    ? httpOnly: bool,
    ? expiry: text,
    ? maxAge: js-int,
    ? path: text,
    ? sameSite: network.SameSite,
    ? secure: bool,
}

network.SetCookieHeader は、 Set-Cookie response header 内の data を表す。

integer である input が与えられたとき、serialize an integer するには:

注: これは input の最短表現を decimal digits の string として生成する。

  1. serialized を空文字列とする。

  2. value を input とする。

  3. value が 0 より大きい間:

    1. x を value を 10 で割ったものとする。

    2. most significant digits を x の integer part とする。

    3. y を most significant digits に 10 を掛けたものとする。

    4. least significant digit を value - y とする。

    5. Assert: least significant digit は 0 から 9 までの範囲の integer (両端を含む)である。

    6. codepoint を、value が U+0030 DIGIT ZERO の value + least significant digit である code point とする。

    7. codepoint を serialized の先頭に付加する。

    8. value を most significant digits に設定する。

  4. serialized を返す。

protocol cookie が与えられたときに set-cookie ヘッダーを直列化するには:
  1. name を protocol cookie["name"] を UTF-8 エンコードしたものとする。

  2. value を protocol cookie["value"] を用いて プロトコルバイトをデシリアライズする結果とする。

  3. header value を、name、 `=`、および value を連結して形成される バイト シーケンスとする。

  4. protocol cookie が "expiry" を 含む 場合:

    1. attribute を `;Expires=` とする

    2. protocol cookie["expiry"] を UTF-8 エンコードしたものを attribute に付加する。

    3. attribute を header value に付加する。

  5. protocol cookie が "maxAge" を 含む 場合:

    1. attribute を `;Max-Age=` とする

    2. max age string を protocol cookie["maxAge"] を 整数をシリアル化する結果とする。

    3. max age string を UTF-8 エンコードしたものを attribute に付加する。

    4. attribute を header value に付加する。

  6. protocol cookie が "domain" を 含む 場合:

    1. attribute を `;Domain=` とする

    2. protocol cookie["domain"] を UTF-8 エンコードしたものを attribute に付加する。

    3. attribute を header value に付加する。

  7. protocol cookie が "path" を 含む 場合:

    1. attribute を `;Path=` とする

    2. protocol cookie["path"] を UTF-8 エンコードしたものを attribute に付加する。

    3. attribute を header value に付加する。

  8. protocol cookie が "secure" を 含み、かつ protocol cookie["secure"] が true の場合:

    1. `;Secure` を header value に付加する。

  9. protocol cookie が "httpOnly" を 含み、かつ protocol cookie["httpOnly"] が true の場合:

    1. `;HttpOnly` を header value に付加する。

  10. protocol cookie が "sameSite" を 含む 場合:

    1. attribute を `;SameSite=` とする

    2. protocol cookie["sameSite"] を UTF-8 エンコードしたものを attribute に付加する。

    3. attribute を header value に付加する。

  11. header value を返す。

7.5.4.19. network.UrlPattern 型

Remote end definition

network.UrlPattern = (
  network.UrlPatternPattern /
  network.UrlPatternString
)

network.UrlPatternPattern = {
    type: "pattern",
    ?protocol: text,
    ?hostname: text,
    ?port: text,
    ?pathname: text,
    ?search: text,
}


network.UrlPatternString = {
    type: "string",
    pattern: text,
}

network.UrlPattern は、network intercepts の request URL を照合するために使用される pattern を表す。

URL が network.UrlPattern に対して照合されるとき、URL は parse され、各 component は、存在する場合、pattern 内の対応する field と 等価性で比較される。pattern にない fields は常に一致する。

注: この構文は将来の拡張性を 念頭に置いて設計されている。特に、この構文は [URLPattern] 仕様で特別に扱われる文字を禁止する。これらは U+005C (\) 文字を前置することで escape できる。

pattern が与えられた場合に URL パターンのエスケープを解除するには
  1. forbidden characters を、コードポイント «U+0028 ((), U+0029 ()), U+002A (*), U+007B ({), U+007D (})» の 集合とする。

  2. result を空文字列とする。

  3. is escaped character を false とする。

  4. pattern 内の各 codepoint について:

    1. is escaped character が false の場合:

      1. forbidden characters が codepoint を 含む場合、エラー を エラーコード 無効な引数として返す。

      2. codepoint が U+005C (\) の場合:

        1. is escaped character を true に設定する。

        2. 続行する。

    2. codepoint を result に付加する。

    3. is escaped character を false に設定する。

  5. データ result とともに 成功を返す。

pattern が与えられた場合に URL パターンを解析するには:
  1. has protocol を true とする。

  2. has hostname を true とする。

  3. has port を true とする。

  4. has pathname を true とする。

  5. has search を true とする。

  6. pattern が network.UrlPatternPattern 生成規則に一致する場合:

    1. pattern url を空文字列とする。

    2. pattern が "protocol" を 含む場合:

      1. pattern["protocol"] が空文字列の場合、エラー を エラーコード 無効な引数として返す。

      2. protocol を、pattern["protocol"] を用いて 試行して URL パターンのエスケープを解除する結果とする。

      3. protocol 内の各 codepoint について:

        1. codepoint が ASCII 英数字でなく、かつ «U+002B (+), U+002D (-), U+002E (.)» が codepoint を 含まない場合:

          1. エラーを エラーコード 無効な 引数として返す。

      4. protocol を pattern url に付加する。

    3. それ以外の場合:

      1. has protocol を false に設定する。

      2. "http" を pattern url に付加する。

    4. scheme を、pattern url を ASCII 小文字化したものとする。

    5. ":" を pattern url に付加する。

    6. scheme が 特殊である場合、 "//" を pattern url に付加する。

    7. pattern が "hostname" を 含む場合:

      1. pattern["hostname"] が空文字列の場合、エラー を エラーコード 無効な引数として返す。

      2. scheme が "file" の場合、エラーを エラーコード 無効な引数として返す。

      3. hostname を、pattern["hostname"] を用いて 試行して URL パターンのエスケープを解除する結果とする。

      4. inside brackets を false とする。

      5. hostname 内の各 codepoint について:

        1. «U+002F (/), U+003F (?), U+0023 (#)» が codepoint を 含む 場合:

          1. エラーを エラーコード 無効な引数として返す。

        2. inside brackets が false で、かつ codepoint が U+003A (:) の場合:

          1. エラーを エラーコード 無効な引数として返す。

        3. codepoint が U+005B ([) の場合、inside brackets を true に設定する。

        4. codepoint が U+005D (]) の場合、inside brackets を false に設定する。

      6. hostname を pattern url に付加する。

    8. それ以外の場合:

      1. scheme が "file" でない場合、 "placeholder" を pattern url に付加する。

      2. has hostname を false に設定する。

    9. pattern が "port" を 含む場合:

      1. pattern["port"] が空文字列の場合、エラー を エラーコード 無効な引数として返す。

      2. port を、pattern["port"] を用いて 試行して URL パターンのエスケープを解除する結果とする。

      3. ":" を pattern url に付加する。

      4. port 内の各 codepoint について:

        1. codepoint が ASCII 数字でない場合:

          1. エラーを エラーコード 無効な引数として返す。

      5. port を pattern url に付加する。

    10. それ以外の場合:

      1. has port を false に設定する。

    11. pattern が "pathname" を 含む場合:

      1. pathname を、 pattern["pathname"] を用いて 試行して URL パターンのエスケープを解除する結果とする。

      2. pathname が U+002F (/) で 始まらない場合、 "/" を pattern url に付加する。

      3. pathname 内の各 codepoint について:

        1. «U+003F (?), U+0023 (#)» が codepoint を 含む 場合:

          1. エラーを エラーコード 無効な引数として返す。

      4. pathname を pattern url に付加する。

    12. それ以外の場合:

      1. has pathname を false に設定する。

    13. pattern が "search" を 含む場合:

      1. search を、 pattern["search"] を用いて 試行して URL パターンのエスケープを解除する結果とする。

      2. search が U+003F (?) で 始まらない場合、 "?" を pattern url に付加する。

      3. search 内の各 codepoint について:

        1. codepoint が U+0023 (#) の場合:

          1. エラーを エラーコード 無効な引数として返す。

      4. search を pattern url に付加する。

    14. それ以外の場合:

      1. has search を false に設定する。

  7. それ以外の場合、pattern が network.UrlPatternString 生成規則に一致する場合:

    1. pattern url を、pattern["pattern"] を用いて 試行して URL パターンのエスケープを解除する結果とする。

  8. url を pattern url を 解析する結果とする。

  9. url が失敗の場合、エラーを エラーコード 無効な引数として返す。

  10. parsed を、次のフィールドを持つ構造体とする:

    protocol
    has protocol が true の場合は url の スキーム、それ以外の場合は null。
    hostname
    has hostname が true の場合は url の ホスト、それ以外の場合は null。
    port
    1. has port が false の場合:

      1. null。

    2. それ以外の場合:

      1. url の スキームが 特殊であり、かつ url の スキームの デフォルトポートが null でなく、かつ url の ポートが null であるか、 スキームの デフォルトポートと等しい場合:

        1. 空文字列。

      2. それ以外の場合、url の ポートが null でない場合:

        1. url の ポートを用いて 整数をシリアル化する。

      3. それ以外の場合:

        1. null。

    pathname
    1. has pathname が false の場合:

      1. null。

    2. それ以外の場合:

      1. url の パスが空文字列ではなく、かつ 空でない場合は、 url を用いて URL パスシリアライザーを実行した結果、 それ以外の場合は null。

    search
    1. has search が false の場合:

      1. null。

    2. それ以外の場合:

      1. url の クエリが null の場合は空文字列、 それ以外の場合は url の クエリ。

  11. データ parsed とともに 成功を返す。

url patternおよびurl stringが与えられたとき、URL パターンに一致する には:
  1. urlを、url stringを解析する結果とする。

  2. url patternの protocol が null でなく、かつurlの schemeに等しくない場合、false を返す。

  3. url patternの hostname が null でなく、かつurlの hostに等しくない場合、false を返す。

  4. url patternの port が null でない場合:

    1. portを null とする。

    2. urlのschemeが特別であり、かつurlの schemeの既定 ポートが null でなく、かつurlのportが null であるか、schemeの既定 ポートに等しい場合:

      1. portを空文字列に設定する。

    3. そうでなく、urlのportが null でない場合:

      1. portを、urlのportで整数を直列化する結果に設定する。

    4. url patternの port がportに等しくない場合、false を返す。

  5. url patternの pathname が null でなく、かつurlで URL path serializerを実行した結果に等しくない場合、false を返す。

  6. url patternの search が null でない場合:

    1. url queryを、urlのqueryとする。

    2. url queryが null である場合、url queryを空文字列に設定する。

    3. url patternの search がurl queryに等しくない場合、false を返す。

  7. true を返す。

7.5.5. コマンド

7.5.5.1. network.addDataCollector コマンド

network.addDataCollector は collector を追加する。

コマンド型
network.AddDataCollector = (
  method: "network.addDataCollector",
  params: network.AddDataCollectorParameters
)

network.AddDataCollectorParameters = {
  dataTypes: [+network.DataType],
  maxEncodedDataSize: js-uint,
  ? collectorType: network.CollectorType .default "blob",
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
返却型
network.AddDataCollectorResult = {
  collector: network.Collector
}
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. collector id を UUID の文字列表現とする。

  2. input context ids を空の 集合とする。

  3. command parameters の contexts フィールドが存在する場合、 input context ids を command parameters[contexts] を用いて 集合を作成する 結果に設定する。

  4. data types を command parameters["dataTypes"] を用いて 集合を作成する 結果とする。

  5. max encoded item size を command parameters ["maxEncodedDataSize"] とする。

    注: maxEncodedDataSize パラメーターは エンコードされた項目の最大サイズを表し、 指定されたコレクターによって収集される各リクエストのサイズを制限するものであり、 コレクター全体の収集サイズを制限するものではない。

    注: 実装によって サポートされるエンコーディングが異なる可能性があり、その結果、 エンコード後のサイズもブラウザー間で異なる可能性がある。したがって、同じデータコレクター 構成でも、一部のネットワークデータが エンコードされた項目の最大サイズに収まるのは、 一部の実装だけである場合がある。

  6. collector type を command parameters ["collectorType"] とする。

  7. input user context ids を空の 集合とする。

  8. command parameters の userContexts フィールドが存在する場合、 input user context ids を command parameters[userContexts] を用いて 集合を作成する 結果に設定する。

  9. input user context ids が空でなく、かつ input context ids も 空でない場合、エラーを エラー コード 無効な引数として返す。

  10. max encoded item size が 0、または max encoded item size が 収集可能な合計最大サイズより大きい場合、エラーを エラー コード 無効な引数として返す。

  11. input context ids が 空でない場合:

    1. navigables を、input context ids を用いて 試行して ID によって有効な navigable を取得する 結果とする。

    2. navigables 内の各 navigable について:

      1. navigable が トップレベル traversable でない場合、エラー を エラーコード 無効な引数として返す。

  12. それ以外の場合、input user context ids が 空でない場合:

    1. input user context ids の各 user context id について 反復する:

      1. user context を user context id を用いて ユーザーコンテキストを取得する結果とする。

      2. user context が null の場合、エラーを エラーコード そのようなユーザーコンテキストはないとして返す。

  13. collector を コレクターとし、 エンコードされた項目の最大サイズフィールドを max encoded item size に設定し、 データ型フィールドを data types に設定し、 コレクターフィールドを collector id に設定し、 コレクター型フィールドを collector type に設定し、 コンテキストフィールドを input context ids に設定し、 ユーザーコンテキストフィールドを input user context ids に設定する。

  14. session の ネットワークコレクター[collector id] を collector に設定する。

  15. collector フィールドを collector id に設定した network.AddDataCollectorResult 生成規則に一致する新しい マップを返す。

7.5.5.2. network.addIntercept コマンド

network.addIntercept command は network intercept を追加する。

コマンド型
network.AddIntercept = (
  method: "network.addIntercept",
  params: network.AddInterceptParameters
)

network.AddInterceptParameters = {
  phases: [+network.InterceptPhase],
  ? contexts: [+browsingContext.BrowsingContext],
  ? urlPatterns: [*network.UrlPattern],
}

network.InterceptPhase = "beforeRequestSent" / "responseStarted" /
                         "authRequired"
返却型
network.AddInterceptResult = {
    intercept: network.Intercept
    }
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. intercept を UUID の文字列表現とする。

  2. url patterns を、command parameters の urlPatterns フィールドが存在する場合はその値、それ以外の場合は空の リストとする。

  3. navigables を null とする。

  4. command parameters の contexts フィールドが存在する場合:

    1. navigables を空の 集合に設定する。

    2. command parameters["contexts"] の各 navigable id について

      1. navigable を、navigable id を用いて 試行して navigable を取得する 結果とする。

      2. navigable が トップレベル traversable でない場合、エラー を エラーコード 無効な引数として返す。

      3. navigable を navigables に付加する。

    3. navigables が空の 集合の場合、エラーを エラーコード 無効な引数として返す。

  5. intercept map を session の インターセプトマップとする。

  6. parsed patterns を空の リストとする。

  7. url patterns 内の各 url pattern について:

    1. parsed を、url pattern を用いて 試行して URL パターンを解析する結果とする。

    2. parsed を parsed patterns に 付加する。

  8. intercept map[intercept] を、url patterns が parsed patterns、phases が command parameters["phases"]、browsingContexts が navigables である構造体に設定する。

  9. intercept フィールドが intercept に設定された network.AddInterceptResult 生成規則に一致する新しい マップを返す。

7.5.5.3. network.continueRequest コマンド

network.continueRequestコマンドは、ネットワークインターセプトによりブロックされたリクエストを 続行する。

コマンド型
network.ContinueRequest = (
  method: "network.continueRequest",
  params: network.ContinueRequestParameters
)

network.ContinueRequestParameters = {
  request: network.Request,
  ?body: network.BytesValue,
  ?cookies: [*network.CookieHeader],
  ?headers: [*network.Header],
  ?method: text,
  ?url: text,
}
戻り値型
network.ContinueRequestResult = EmptyResult
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. blocked requests を session の ブロックされたリクエストマップとする。

  2. request id を command parameters["request"] とする。

  3. blocked requests が request id を 含まない 場合、 エラーを エラー コード そのようなリクエストはないとして返す。

  4. (request, phase, response) を blocked requests[request id] とする。

  5. phase が "beforeRequestSent" でない場合、エラー を エラーコード 無効な引数として返す。

    "request already sent" エラーを検討する。

  6. command parameters が "url" を 含む 場合:

    1. url record を、基底 URL を null として、command parameters["url"] に URL パーサーを適用した結果とする。

    2. url record が失敗の場合、エラーを エラーコード 無効な引数として返す。

      TODO: ここでも再開すべきか?

    3. request の url を url record とする。

  7. command parameters が "method" を 含む 場合:

    1. method を command parameters["method"] とする。

    2. method が メソッドトークン生成規則に一致しない場合、エラー を エラーコード "invalid argument" として返す。

    3. request の メソッドを method とする。

  8. command parameters が "headers" を 含む 場合:

    1. headers を空の ヘッダーリストとする。

    2. command parameters["headers"] 内の各 header について:

      1. deserialized header を header を用いて ヘッダーを デシリアライズする結果とする。

      2. deserialized header の名前が フィールド名トークン 生成規則に一致しない場合、エラーを エラーコード "invalid argument" として返す。

      3. deserialized header の値が ヘッダー値 生成規則に一致しない場合、エラーを エラーコード "invalid argument" として返す。

      4. deserialized header を headers に付加する。

    3. request の ヘッダーリストを headers に設定する。

  9. command parameters が "cookies" を 含む 場合:

    1. cookie header を空の バイト シーケンスとする。

    2. command parameters["cookies"] 内の各 cookie について:

      1. cookie header が空でない場合、`;` を cookie header に付加する。

      2. cookie を用いて cookie ヘッダーをシリアル化する結果を cookie header に付加する。

    3. found cookie header を false とする。

    4. request の ヘッダーリスト内の各 header について:

      1. name を header の名前とする。

      2. name を バイト小文字化したものが `cookie` の場合:

        1. header の値を cookie header に設定する。

        2. found cookie header を true に設定する。

        3. 中断する。

    5. found cookie header が false の場合:

      1. ヘッダー (`Cookie`, cookie header) を request の ヘッダーリストに付加する。

  10. command parameters が "body" を 含む 場合:

    1. body を command parameters["body"] を用いて プロトコルバイトをデシリアライズする結果とする。

    2. request の 本体を body に設定する。

  11. "continue request"、request id、および (null, "incomplete") を用いて 再開する。

  12. データ null とともに 成功を返す。

7.5.5.4. network.continueResponse コマンド

network.continueResponseコマンドは、ネットワークインターセプトによりブロックされた レスポンスを続行する。これは、responseStartedフェーズで呼び出すことができ、 レスポンスの status および headers を変更しつつ、ネットワークレスポンス body は引き続き提供する。

コマンド型
network.ContinueResponse = (
  method: "network.continueResponse",
  params: network.ContinueResponseParameters
)

network.ContinueResponseParameters = {
  request: network.Request,
  ?cookies: [*network.SetCookieHeader]
  ?credentials: network.AuthCredentials,
  ?headers: [*network.Header],
  ?reasonPhrase: text,
  ?statusCode: js-uint,
}
戻り値型
network.ContinueResponseResult = EmptyResult
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. request id を command parameters["request"] とする。

  2. response を、session、"continueResponse" および command parameters を用いて 試行して レスポンスを 更新する結果とする。

  3. "continue request"、request id、および (response, "incomplete") を用いて 再開する。

  4. データ null とともに 成功を返す。

7.5.5.5. network.continueWithAuth コマンド

network.continueWithAuth command は、 authRequired phase で network intercept によって block されている response を続行する。

コマンド型
network.ContinueWithAuth = (
    method: "network.continueWithAuth",
    params: network.ContinueWithAuthParameters
    )

    network.ContinueWithAuthParameters = {
    request: network.Request,
    (network.ContinueWithAuthCredentials // network.ContinueWithAuthNoCredentials)
    }

    network.ContinueWithAuthCredentials = (
    action: "provideCredentials", 
    credentials: network.AuthCredentials
    )

    network.ContinueWithAuthNoCredentials = (
    action: "default" / "cancel"
    )
返却型
network.ContinueWithAuthResult = EmptyResult
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. blocked requests を session の ブロックされたリクエストマップとする。

  2. request id を command parameters["request"] とする。

  3. blocked requests が request id を 含まない 場合、 エラーを エラー コード そのようなリクエストはないとして返す。

  4. (request, phase, response) を blocked requests[request id] とする。

  5. phase が "authRequired" でない場合、エラー を エラーコード 無効な引数として返す。

  6. command parameters "action" が "cancel" の場合、 response の認証資格情報を "cancelled" に設定する。

  7. command parameters "action" が "provideCredentials" の場合:

    1. credentials を command parameters["credentials"] とする。

    2. 表明:credentials["type"] は "password" である。

    3. response の認証資格情報を (credentials["username"], credentials["password"]) に設定する

  8. "continue request"、request id、および (response, "incomplete") を用いて 再開する。

  9. データ null とともに 成功を返す。

7.5.5.6. network.disownData コマンド

network.disownDataコマンドは、指定されたcollectorについて、収集されたネットワークデータを解放する。

コマンド型
network.DisownData = (
  method: "network.disownData",
  params: network.DisownDataParameters
)

network.DisownDataParameters = {
  dataType: network.DataType,
  collector: network.Collector,
  request: network.Request,
}
戻り値型
network.DisownDataResult = EmptyResult
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. data type を command parameters 内の "dataType" フィールドの値とする。

  2. collector id を command parameters 内の "collector" フィールドの値とする。

  3. request id を command parameters 内の "request" フィールドの値とする。

  4. collectors を session の ネットワークコレクターとする。

  5. collectors が collector id を 含まない 場合、 エラーを エラー コード そのようなネットワークコレクターはないとして返す。

  6. collected data を、request id および data type を用いて 収集済みデータを取得する結果とする。

  7. collected data が null の場合、エラーを エラーコード そのようなネットワーク データはないとして返す。

  8. collected data および collector id を用いて データからコレクターを削除する。

  9. データ null とともに 成功を返す。

7.5.5.7. network.failRequest コマンド

network.failRequestコマンドは、ネットワークインターセプトによりブロックされた fetch を失敗させる。

コマンド型
network.FailRequest = (
  method: "network.failRequest",
  params: network.FailRequestParameters
)

network.FailRequestParameters = {
  request: network.Request,
}
戻り値型
network.FailRequestResult = EmptyResult
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. blocked requests を session の ブロックされたリクエストマップとする。

  2. request id を command parameters["request"] とする。

  3. blocked requests が request id を 含まない 場合、 エラーを エラー コード そのようなリクエストはないとして返す。

  4. (request, phase, response) を blocked requests[request id] とする。

  5. phase が "authRequired" の場合、エラー を エラーコード 無効な引数として返す。

  6. response を新しい ネットワークエラーとする。

    エラーの 正確な種類を設定できるようにする [Issue #508]

  7. "continue request"、request id、および (response, "complete") を用いて 再開する。

  8. データ null とともに 成功を返す。

7.5.5.8. network.getData コマンド

network.getDataコマンドは、利用可能であれば ネットワークデータを取得する。

コマンド型
network.GetData = (
  method: "network.getData",
  params: network.GetDataParameters
)

network.GetDataParameters = {
  dataType: network.DataType,
  ? collector: network.Collector,
  ? disown: bool .default false,
  request: network.Request,
}
戻り値型
network.GetDataResult = {
  bytes: network.BytesValue,
}
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. data type を command parameters["dataType"] とする。

  2. request id を command parameters["request"] とする。

  3. collector id を null とする。

  4. command parameters が "collector" を 含む 場合:

    1. collectors を session の ネットワークコレクターとする。

    2. collectors が collector id を 含まない場合、 エラーを エラーコード そのようなネットワークコレクターはないとして返す。

    3. collector id を command parameters["collector"] に設定する。

  5. disown を command parameters["disown"] とする。

  6. disown が true で、かつ collector id が null の場合、エラー を エラーコード 無効な引数として返す。

  7. collected data を、request id および data type が与えられた場合に 収集済みデータを取得する結果とする。

  8. collected data が null の場合:

    1. エラーを エラーコード そのような ネットワークデータはないとして返す。

  9. collected data の 保留中が true の場合:

    1. "network data collected" および (request id, data type) を用いて 待機する。

  10. collector id が null でなく、かつ collected data の コレクター が collector id を 含まない場合:

    1. エラーを エラーコード そのような ネットワークデータはないとして返す。

  11. bytes を collected data の バイトとする。

  12. bytes が null の場合、

    1. エラーを エラーコード 利用できないネットワークデータとして返す。

  13. body を、bytes フィールドが bytes に設定された network.GetDataResult 生成規則に一致する マップ とする。

  14. disown が true の場合、collected data および collector id を用いて データからコレクターを削除する。

  15. データ body とともに 成功を返す。

7.5.5.9. network.provideResponse コマンド

network.provideResponse コマンドは、 network intercept によってブロックされた request を、完全な response を提供することにより継続する。

注: これは、request が通常の request ライフサイクルを通過し、それに伴って他のイベントを発行することを防がない。

コマンド型
network.ProvideResponse = (
  method: "network.provideResponse",
  params: network.ProvideResponseParameters
)

network.ProvideResponseParameters = {
  request: network.Request,
  ?body: network.BytesValue,
  ?cookies: [*network.SetCookieHeader],
  ?headers: [*network.Header],
  ?reasonPhrase: text,
  ?statusCode: js-uint,
}
戻り値型
network.ProvideResponseResult = EmptyResult
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. request id を command parameters["request"] とする。

  2. response を、session、"provideResponse"、および command parameters を用いて 試行して レスポンスを 更新する結果とする。

  3. command parameters が "body" を 含む 場合:

    1. body を command parameters["body"] を用いて プロトコルバイトをデシリアライズする結果とする。

    2. response の 本体を、body を 本体として扱ったものに設定する。

  4. "continue request"、request id、および (response,"complete") を用いて 再開する。

  5. データ null とともに 成功を返す。

7.5.5.10. network.removeDataCollector コマンド

network.removeDataCollector コマンドは collector を削除する。

コマンド型
network.RemoveDataCollector = (
    method: "network.removeDataCollector",
    params: network.RemoveDataCollectorParameters
    )

    network.RemoveDataCollectorParameters = {
    collector: network.Collector
    }
戻り値型
network.RemoveDataCollectorResult = EmptyResult
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. collector id を command parameters 内の "collector" フィールドの値とする。

  2. collectors を session の ネットワークコレクターとする。

  3. collectors が collector id を 含まない 場合、 エラーを エラー コード そのようなネットワークコレクターはないとして返す。

  4. collector id を session の ネットワーク コレクターから 削除する。

  5. 収集済みネットワークデータ内の各 collected data について、 collected data および collector id を用いて データからコレクター を削除する。

  6. データ null とともに 成功を返す。

7.5.5.11. network.removeIntercept コマンド

network.removeInterceptコマンドは、ネットワークインターセプトを除去する。

コマンド型
network.RemoveIntercept = (
  method: "network.removeIntercept",
  params: network.RemoveInterceptParameters
)

network.RemoveInterceptParameters = {
  intercept: network.Intercept
}
戻り値型
network.RemoveInterceptResult = EmptyResult
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. intercept を command parameters 内の "intercept" フィールドの値とする。

  2. intercept map を session の インターセプトマップとする。

  3. intercept map が intercept を 含まない 場合、 エラーを エラー コード そのようなインターセプトはないとして返す。

  4. intercept map から intercept を 削除する。

注: インターセプトを削除しても、このインターセプトによって すでにブロックされているリクエストには影響しない。影響を受けるのは、将来のリクエストまたは既存の リクエストの将来のフェーズのみである。

  1. データ null とともに 成功を返す。

7.5.5.12. network.setCacheBehavior コマンド

network.setCacheBehaviorコマンドは、 特定のリクエストについてネットワークキャッシュ挙動を構成する。

コマンド型
network.SetCacheBehavior = (
  method: "network.setCacheBehavior",
  params: network.SetCacheBehaviorParameters
)

network.SetCacheBehaviorParameters = {
  cacheBehavior: "default" / "bypass",
  ? contexts: [+browsingContext.BrowsingContext]
}
戻り値型
network.SetCacheBehaviorResult = EmptyResult
WebDriver BiDi キャッシュ動作の手順は、リクエスト request が与えられた場合、次のとおりである:
  1. navigable を null とする。

  2. request の クライアントが 環境設定オブジェクトである場合:

    1. environment settings を request の クライアントとする。

    2. navigable で、その アクティブなウィンドウが environment settings の グローバルオブジェクトであるものが存在する場合、 navigable をその navigable の トップレベル traversable に設定する。

  3. navigable が null でなく、かつ navigable キャッシュ動作マップが navigable を 含む 場合、navigable キャッシュ動作 マップ[navigable] を返す。

  4. デフォルトのキャッシュ動作を返す。

navigable キャッシュ 動作の手順は、navigable が与えられた場合、次のとおりである:
  1. top-level navigable を navigable の トップレベル traversable とする。

  2. navigable キャッシュ動作マップが top-level navigable を 含む場合、 navigable キャッシュ動作マップ[top-level navigable] を返す。

  3. デフォルトのキャッシュ動作を返す。

session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. behavior を command parameters["cacheBehavior"] とする。

  2. command parameters が "contexts" を 含まない 場合:

    1. デフォルトのキャッシュ動作を behavior に設定する。

    2. navigable キャッシュ動作マップを クリアする。

    3. behavior の値に応じて切り替える:

      "bypass"
      実装固有のリソースキャッシュを無効にするための実装定義の手順を実行する。
      "default"
      現在の リモートエンド構成で通常有効になっている、 実装固有のリソースキャッシュを有効にするための実装定義の手順を実行する。
    4. データ null とともに 成功を返す。

  3. navigables を空の 集合とする。

  4. command parameters["contexts"] の各 navigable id について:

    1. context を、navigable id を用いて 試行して navigable を取得する 結果とする。

    2. context が トップレベル閲覧コンテキストでない場合、エラー を エラーコード 無効な引数として返す。

    3. context を navigables に 付加する。

  5. navigables 内の各 navigable について:

    1. navigable キャッシュ動作マップが navigable を 含み、かつ navigable キャッシュ動作 マップ[navigable] が behavior と等しい場合、 続行する。

    2. behavior の値に応じて切り替える:

      "bypass"
      navigable が トップレベル閲覧コンテキストである 任意の閲覧コンテキストから発生するネットワークリクエストについて、実装固有の リソースキャッシュを無効にするための実装定義の手順を実行する。
      "default"
      navigable が トップレベル閲覧コンテキストである 任意の閲覧コンテキストから発生するネットワークリクエストについて、現在の リモートエンド構成で通常有効になっている 実装固有のリソースキャッシュを有効にするための実装定義の手順を実行する。
    3. behavior が デフォルトのキャッシュ動作と等しい場合:

      1. navigable キャッシュ動作マップ が navigable を 含む場合、 navigable キャッシュ動作 マップ[navigable] を 削除する。

    4. それ以外の場合:

      1. navigable キャッシュ動作 マップ[navigable] を behavior に設定する。

  6. データ null とともに 成功を返す。

7.5.5.13. network.setExtraHeaders コマンド

network.setExtraHeadersコマンドは、 既存のリクエストヘッダーを拡張または上書きするヘッダーの指定を可能にする。

コマンド型
network.SetExtraHeaders = (
  method: "network.setExtraHeaders",
  params: network.SetExtraHeadersParameters
)

network.SetExtraHeadersParameters = {
  headers: [*network.Header]
  ? contexts: [+browsingContext.BrowsingContext]
  ? userContexts: [+browser.UserContext]
}
戻り値型
network.SetExtraHeadersResult = EmptyResult
requestおよびheadersが与えられたとき、ヘッダーを更新するには:
  1. request headersを、requestのヘッダーリストとする。

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

    1. request headers内のheaderを設定する。

      注記: これは常に既存の値があればそれを 上書きする。特に、既存の `Set-Cookie` ヘッダーに Cookie を付加するものではない。

session、request、およびrelated navigablesを与えてリクエスト ヘッダーを更新するには、次を行う:
  1. 表明: related navigablesのサイズは 0 または 1 である。

    注記: これは、複数の ナビゲータブルに関連付けられたワーカーでは機能しないことを意味する。その場合、どの順序でヘッダーをオーバーライドするかは不明である。

  2. requestおよびsessionの 追加 ヘッダーのデフォルトヘッダーを用いて、ヘッダーを更新する

  3. user context headersをsessionの追加ヘッダーの ユーザーコンテキストヘッダーとする。

  4. related navigables内の各navigableについて:

    1. user contextをnavigableの関連付けられた ユーザーコンテキストとする。

    2. user context headersがuser contextを含む場合、 requestおよび user context headers[user context]を用いてヘッダーを 更新する

  5. navigable headersをsessionの追加ヘッダーの ナビゲータブルヘッダーとする。

  6. related navigables内の各navigableについて:

    1. top-level traversableをnavigableの トップレベルナビゲータブルとする。

    2. navigable headersがtop-level traversableを含む場合、 requestおよびnavigable headers[top-level traversable]を用いてヘッダーを 更新する。

session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. command parameters が 含む "userContexts" かつ command parameters が 含む "contexts" 場合、 エラーを エラー コード 無効な引数として返す。

  2. headers を、command parameters["headers"] を用いて 試行して ヘッダーリストを作成する結果とする。

  3. command parameters が 含む "userContexts" 場合:

    1. user contexts を空の リストとする。

    2. command parameters["userContexts"] 内の各 user context id について:

      1. user context を user context id を用いて ユーザーコンテキストを取得する結果とする。

      2. user context が null の場合、エラーを エラーコード そのようなユーザーコンテキストはないとして返す。

      3. user context を user contexts に 付加する。

    3. target を session の 追加ヘッダーの ユーザーコンテキストヘッダー とする

    4. user contexts 内の各 user context について:

      1. target[user context] を headers に設定する。

    5. データ null とともに 成功を返す。

  4. command parameters が 含む "contexts" 場合:

    1. navigables を、command parameters["contexts"] を用いて 試行して ID によって有効なトップレベル traversable を取得する結果とする。

    2. target を session の 追加ヘッダーの navigable ヘッダー とする

    3. navigables 内の各 navigable について:

      1. target[navigable] を headers に設定する。

    4. データ null とともに 成功を返す。

  5. session の 追加ヘッダーの デフォルトヘッダーを headers に設定する。

  6. データ null とともに 成功を返す。

7.5.6. イベント

7.5.6.1. network.authRequired イベント
イベント型
network.AuthRequired = (
    method: "network.authRequired",
    params: network.AuthRequiredParameters
    )

    network.AuthRequiredParameters = {
    network.BaseParameters,
    response: network.ResponseData
    }

このイベントは、ユーザーエージェントが認可資格情報の入力を求めようとしているときに 発火される。

リモートエンドイベントトリガーは、request request およびresponse responseが与えられたときのWebDriver BiDi 認証要求 手順である:
  1. redirect countを、requestのredirect countとする。

  2. 表明:before request sent マップ[request]は redirect countに等しい。

    注記: これは、すべての呼び出し側が これらの手順の前に、requestでWebDriver BiDi before request sent手順が 呼び出されることを保証する必要があることを意味する。

  3. requestのclientが null でない場合、related navigablesを、requestの clientで関連 navigable を取得する結果とする。そうでなければ、related navigables を空の 集合とする。

  4. "network.authRequired" およびrelated navigablesが与えられたときの、イベントが有効なセッションの集合 内の各sessionについて:

    1. paramsを、session、 "network.authRequired"、およびrequestでネットワークイベントを処理する結果とする。

    2. response dataを、responseでレスポンス データを取得する結果とする。

    3. 表明:response dataは "authChallenges"を含む。

    4. paramsのresponseフィールドをresponse dataに設定する。

    5. 表明:paramsは network.AuthRequiredParameters 生成規則に一致する。

    6. bodyを、paramsフィールドがparamsに設定された、 network.AuthRequired生成規則に一致するマップとする。

    7. sessionおよびbodyでイベントを 発出する。

    8. params["isBlocked"]が true である場合:

      1. blocked requestsを、sessionのブロックされた リクエストマップとする。

      2. request idを、requestのリクエスト IDとする。

      3. blocked requests[request id]を(request, "authRequired", response)に設定する。

      4. «"continue request"» およびrequest idで待機する。

      5. blocked requests[request id]を除去する。

7.5.6.2. network.beforeRequestSent イベント
イベント型
network.BeforeRequestSent = (
    method: "network.beforeRequestSent",
    params: network.BeforeRequestSentParameters
    )

    network.BeforeRequestSentParameters = {
    network.BaseParameters,
    ? initiator: network.Initiator,
    }

このイベントは、リクエストが(ネットワーク経由で、または serviceworker やローカルキャッシュによって 処理される前に)送信される前に発火される。

request および user context が与えられたとき、request originates in user context かどうかを確認する手順は:
  1. settings を request の client とする。

  2. related navigables を、settings で get related navigables したものとする。

  3. related navigables 内の navigable について:

    1. navigable の associated user context が user context である場合、true を返す。

  4. false を返す。

related navigablesを与えてエミュレートされたネットワーク条件を取得する手順は 次のとおりである:
  1. related navigablesの各navigableについて:

    1. top-level traversableをnavigableのトップレベルナビゲータブルとする。

    2. user contextをtop-level traversableの関連付けられた ユーザーコンテキストとする。

    3. アクティブな BiDi セッション内の各sessionについて:

      1. sessionのエミュレートされたネットワーク 条件の ナビゲータブル ネットワーク条件が top-level traversableを含む場合、 sessionの エミュレートされたネットワーク 条件の ナビゲータブル ネットワーク条件[top-level traversable]を返す。

    4. アクティブな BiDi セッション内の各sessionについて:

      1. sessionのエミュレートされたネットワーク 条件の ユーザー コンテキストネットワーク条件が user contextを含む場合、 sessionの エミュレートされたネットワーク 条件の ユーザー コンテキストネットワーク条件[user context]を返す。

    5. アクティブな BiDi セッション内の各sessionについて:

      1. sessionのエミュレートされたネットワーク 条件の デフォルト ネットワーク条件が null ではない場合、 sessionのエミュレートされたネットワーク 条件の デフォルト ネットワーク条件を返す。

  2. null を返す。

環境設定オブジェクト settingsを与えたときの WebDriver BiDi ネットワークがオフラインである手順は次のとおりである:
  1. navigableをsettingsの関連グローバルオブジェクトの 関連付けられたDocumentのノードナビゲータブルとする。

  2. emulated network conditionsを、 [navigable]を用いてエミュレートされたネットワーク条件を取得した結果とする。

  3. emulated network conditionsが null ではなく、かつemulated network conditionsの オフラインが true の場合、true を返す。

  4. false を返す。

リクエスト requestを与えたときのリモートエンドイベントトリガーは、WebDriver BiDi リクエスト送信前手順である:
  1. ユーザーコンテキストの集合内の各user contextについて:

    1. requestおよび user contextを用いたリクエストがユーザーコンテキストで発生する手順が true を返す場合:

      1. アクティブな BiDi セッション内の各sessionについて:

        注記: user contextは複数の ユーザー コンテキストから安全でない証明書の受け入れオーバーライドへのマップに含まれることはない。

        1. sessionのユーザー コンテキストから安全でない証明書の受け入れオーバーライドへのマップが user contextを含む場合:

          1. accept insecure certificatesを sessionの ユーザー コンテキストから安全でない証明書の受け入れオーバーライドへの マップ[user context]とする。

          2. accept insecure certificatesが true の場合:

            1. エンドポイントノードが 安全でない TLS 接続の受け入れをサポートすることを表明する。

            2. requestについて基本証明書 処理手順を実行するとき、 手順 a と、その他の実装定義の証明書検証手順をスキップする。

          3. そうでなければ、requestについて基本証明書処理 手順を実行するとき、 その他の実装定義の証明書検証手順とともにすべての手順を実行する。

        注記: user contextは複数の ユーザーコンテキストからプロキシ 構成へのマップに含まれることはない。

        1. sessionのユーザーコンテキスト からプロキシ構成へのマップが user contextを含む場合:

          1. proxy configurationをsessionの ユーザー コンテキストからプロキシ構成へのマップ[user context]とする。

          2. requestが proxy configurationによって定義されたプロキシ設定を使用することを保証するため、実装定義の手順を実行する。

            注記: 設定はユーザーコンテキストの作成時に検証されるため、この時点では有効であるとみなされる。プロキシへのアクセス時に発生するエラーは、 リクエストを処理するときに ネットワークエラーとして報告される。

  2. requestを用いてネットワークリクエストボディを収集する可能性がある。

  3. リクエスト送信前マップが requestを含まない場合、リクエスト送信前マップ[request]を 新しい集合に設定する。

  4. redirect countをrequestのリダイレクト回数とする。

  5. redirect countをリクエスト送信前マップ[request]に追加する。

  6. requestのクライアントが null ではない場合、related navigablesを requestのクライアントを用いて関連するナビゲータブルを取得した結果とする。そうでなければ、related navigablesを空の 集合とする。

  7. responseを null とする。

  8. response statusを"incomplete"とする。

  9. アクティブな BiDi セッション内の各sessionについて:

    1. session、request、および related navigablesを用いてリクエストヘッダーを更新する。

  10. "network.beforeRequestSent"およびrelated navigablesを与えたときのイベントが有効になっているセッションの 集合内の各sessionについて:

    1. paramsを、session、 "network.beforeRequestSent"、およびrequestを用いてネットワーク イベントを処理した結果とする。

    2. initiatorを、requestを用いてイニシエーターを取得した結果とする。

    3. initiatorが空ではない場合、paramsの initiatorフィールドをinitiatorに設定する。

    4. 表明: paramsは network.BeforeRequestSentParameters 生成規則に一致する。

    5. bodyを、network.BeforeRequestSent 生成規則に一致し、paramsフィールドがparamsに設定されたマップとする。

    6. sessionおよびbodyを用いてイベントを 発行する。

    7. params["isBlocked"]が true の場合:

      1. blocked requestsをsessionのブロックされた リクエストマップとする。

      2. request idをrequestのリクエスト IDとする。

      3. blocked requests[request id]を(request, "beforeRequestSent", null)に設定する。

      4. (response, status)を、«"continue request"»およびrequestのリクエスト IDを用いて待機した結果とする。

      5. statusが"complete"である場合、response statusを statusに設定する。

      6. blocked requests[request id]を削除する。

      注記: 待機中は、リクエストのそれ以上の 処理は行われない。

  11. emulated network conditionsを、 related navigablesを用いてエミュレートされたネットワーク条件を取得した結果とする。

  12. emulated network conditionsが null ではなく、かつ emulated network conditionsのオフラインが true の場合、(ネットワークエラー, "complete")を返す。

  13. (response, response status)を返す。

Fetch の "HTTP-network-or-cache fetch" アルゴリズムで戻り値を 尊重する。

7.5.6.3. network.fetchError イベント
イベント型
network.FetchError = (
  method: "network.fetchError",
  params: network.FetchErrorParameters
 )

network.FetchErrorParameters = {
  network.BaseParameters,
  errorText: text,
}

このイベントは、ネットワークリクエストがエラーで終了したときに発火される。

remote end event trigger は、request request が与えられたときの WebDriver BiDi fetch error 手順である:
  1. before request sent map[request] が request の redirect count を含まない場合、request で WebDriver BiDi before request sent 手順を実行する。

    注: これにより、呼び出し元がすべてのエラーパスで WebDriver BiDi before request sent 手順を明示的に呼び出す必要なく、network.fetchError の前に network.beforeRequestSent が常に発火され得ることが保証される。

  2. request の client が null でない場合、related navigables を request の client で get related navigables した結果とする。そうでなければ related navigables を空の set とする。

  3. request で Maybe abort network response body collection する。

  4. "network.fetchError" および related navigables が与えられたときの、 set of sessions for which an event is enabled 内の各 session について:

    1. params を、session、 "network.fetchError"、および request で process a network event した結果とする。

    2. params の errorText フィールドを、リクエストを中止させたエラーを説明する 実装定義の文字列に設定する。

    3. Assert: params は network.FetchErrorParameters production に一致する。

    4. body を、params フィールドを params に設定した、 network.FetchError production に一致する map とする。

    5. session および body で Emit an event する。

7.5.6.4. network.responseCompleted イベント
イベント型
network.ResponseCompleted = (
    method: "network.responseCompleted",
    params: network.ResponseCompletedParameters
    )

    network.ResponseCompletedParameters = {
    network.BaseParameters,
    response: network.ResponseData,
    }

このイベントは、完全なレスポンスボディが受信された後に発火される。

remote end event trigger は、request request および response response が与えられたときの WebDriver BiDi response completed 手順である:
  1. redirect count を request の redirect count とする。

  2. Assert: before request sent map[request] は redirect count を含む。

    注: これは、すべての呼び出し元が、これらの手順の前に WebDriver BiDi before request sent 手順が request で呼び出されることを保証する必要があることを意味する。

  3. request の client が null でない場合、related navigables を request の client で get related navigables した結果とする。そうでなければ related navigables を空の set とする。

  4. request および response で Maybe collect network response body する。

  5. sessions を、"network.responseCompleted" および related navigables が与えられたときの set of sessions for which an event is enabled とする。

  6. sessions 内の各 session について:

    1. params を、session、 "network.responseCompleted"、および request で process a network event した結果とする。

    2. Assert: params["isBlocked"] は false である。

    3. response data を、response で get the response data した結果とする。

    4. params の response フィールドを response data に設定する。

    5. Assert: params は network.ResponseCompletedParameters production に一致する。

    6. body を、params フィールドを params に設定した、 network.ResponseCompleted production に一致する map とする。

    7. session および body で Emit an event する。

7.5.6.5. network.responseStarted イベント
イベント型
network.ResponseStarted = (
    method: "network.responseStarted",
    params: network.ResponseStartedParameters
    )

    network.ResponseStartedParameters = {
    network.BaseParameters,
    response: network.ResponseData,
    }

このイベントは、レスポンスヘッダーが受信された後、ただし body が完了する前に発火される。

remote end event trigger は、request request および response response が与えられたときの WebDriver BiDi response started 手順である:
  1. redirect count を request の redirect count とする。

  2. Assert: before request sent map[request] は redirect count と等しい。

    注: これは、すべての呼び出し元が、これらの手順の前に WebDriver BiDi before request sent 手順が request で呼び出されることを保証する必要があることを意味する。

  3. request の client が null でない場合、related navigables を request の client で get related navigables した結果とする。そうでなければ related navigables を空の set とする。

  4. response status を "incomplete" とする。

  5. sessions を、"network.responseStarted" および related navigables が与えられたときの set of sessions for which an event is enabled とする。

  6. sessions 内の各 session について:

    1. params を、session、 "network.responseStarted"、および request で process a network event した結果とする。

    2. response data を、response で get the response data した結果とする。

    3. params の response フィールドを response data に設定する。

    4. Assert: params は network.ResponseStartedParameters production に一致する。

    5. body を、params フィールドを params に設定した、 network.ResponseStarted production に一致する map とする。

    6. session および body で Emit an event する。

    7. params["isBlocked"] が true の場合:

      1. blocked requests を session の blocked request map とする。

      2. request id を request の request id とする。

      3. blocked requests[request id] を (request, "beforeRequestSent", response) に設定する。

      4. (response, status) を、 «"continue request"» および request id で await したものとする。

      5. status が "complete" の場合、response status を status に設定する。

      6. blocked requests[request id] を Remove する。

  7. (response, response status) を返す。

7.6. script モジュール

script モジュールは、script レルムおよび実行に関連するコマンドとイベントを含む。

7.6.1. 定義

Remote end definition

ScriptCommand = (
  script.AddPreloadScript //
  script.CallFunction //
  script.Disown //
  script.Evaluate //
  script.GetRealms //
  script.RemovePreloadScript
)

local end definition

ScriptResult = (
  script.AddPreloadScriptResult /
  script.CallFunctionResult /
  script.DisownResult /
  script.EvaluateResult /
  script.GetRealmsResult /
  script.RemovePreloadScriptResult
)

ScriptEvent = (
  script.Message //
  script.RealmCreated //
  script.RealmDestroyed
)

7.6.2. プリロードスクリプト

プリロードスクリプトは、新しいWindowの作成時に実行されるものであり、 author 定義のスクリプトが実行される前に実行される。

TODO: これを他の種類のレルム内のスクリプトにも拡張する。

BiDi セッションはプリロードスクリプトマップを持ち、 これはマップであり、 そのキーはUUIDで、その値は、文字列である function declarationという名前の項目、 リストであるargumentsという名前の項目、 リストまたは null であるcontextsという名前の項目、 文字列または null であるsandboxという名前の項目、 および集合である user contextsという名前の項目を持つ構造体である。

注記: プリロードスクリプトの実行が、構文エラーまたは 実行時例外のために失敗した場合、その実行が行われていたレルムで [ECMAScript]例外が報告され、他のプリロードスクリプトは通常どおり実行される。

environment settingsが与えられたとき、WebDriver BiDi プリロードスクリプトを実行するには:
  1. documentを、environment settingsの関連大域オブジェクトの 関連付けられたDocumentとする。

  2. navigableを、documentのnavigableとする。

  3. user contextを、navigableの関連付けられたユーザー コンテキストとする。

  4. user context idを、user contextのユーザー コンテキスト IDとする。

  5. アクティブ BiDi セッション内の各sessionについて:

    1. sessionのプリロードスクリプトマップの 値内の各preload scriptについて:

      1. preload scriptのuser contextsのサイズがゼロでない場合:

        1. preload scriptのuser contextsがuser context idを含まない場合、 続行する。

      2. preload scriptのcontextsが null でない場合:

        1. navigable idを、navigableのトップレベル辿可能の id とする。

        2. preload scriptのcontextsがnavigable idを含まない場合、 続行する。

      3. preload scriptのsandboxが null でない場合、 realmを、preload scriptのsandboxおよび navigableでsandbox レルムを取得または作成する 結果とする。そうでなければ、realmをenvironment settingsの レルム実行コンテキストの Realm component とする。

      4. exception reporting globalを、environment settingsの レルム実行コンテキストの Realm component の大域オブジェクトとする。

      5. argumentsを、preload scriptのargumentsとする。

      6. deserialized argumentsを空のリストとする。

      7. arguments内の各argumentについて:

        1. channelを、session、realm、および argumentでチャネルを作成する結果とする。

        2. channelをdeserialized argumentsに付加する。

      8. base URLを、environment settingsのAPI 基底 URLとする。

      9. optionsを、既定のスクリプトフェッチオプションとする。

      10. function declarationを、preload scriptの function declarationとする。

      11. function body evaluation statusを、 function declaration、 environment settings、base URL、およびoptionsで 関数本体を評価する結果とする。

      12. function body evaluation statusがabrupt completionである場合、 function body evaluation status.[[Value]]により与えられる例外を、 exception reporting globalについて 報告する。

      13. function objectを、function body evaluation status.[[Value]]とする。

      14. IsCallable(function object)が falseである場合:

        1. errorを、 realm内の新しいTypeErrorオブジェクトとする。

        2. exception reporting globalについて errorを例外として報告する。

      15. environment settingsでスクリプトを実行する準備をする。

      16. evaluation statusを Call(function object, null, deserialized arguments)に設定する。

      17. environment settingsでスクリプト実行後の後始末をする。

      18. evaluation statusがabrupt completionである場合、 evaluation status.[[Value]]により与えられる例外を、 exception reporting globalについて 報告する。

7.6.3. 型

7.6.3.1. script.Channel 型

リモートエンド定義 およびローカルエンド定義

script.Channel = text;

script.Channel 型は、リモートエンドから ローカルエンドへカスタムメッセージを送信するために使用される、 特定のチャネルの ID を表す。

7.6.3.2. script.ChannelValue 型

リモートエンド定義

script.ChannelValue = {
  type: "channel",
  value: script.ChannelProperties,
}

script.ChannelProperties = {
  channel: script.Channel,
  ? serializationOptions: script.SerializationOptions,
  ? ownership: script.ResultOwnership,
}

script.ChannelValue型は、 リモートエンドからローカルエンドへ メッセージを送信する関数へ逆直列化できるArgumentValueを表す。

session、realm および protocol value が与えられたときに create a channel するには:

  1. channel properties を protocol value["value"] とする。

  2. steps を、引数 message が与えられたときの次の手順とする:

    1. current realm を current Realm Record とする。

    2. session、current realm、channel properties および message で Emit a script message する。

  3. CreateBuiltinFunction(steps, 1, "", « », realm) を返す。

7.6.3.3. script.EvaluationResult 型

リモートエンド定義 およびローカルエンド定義

script.EvaluationResult = (
  script.EvaluationResultSuccess /
  script.EvaluationResultException
)

script.EvaluationResultSuccess = {
  type: "success",
  result: script.RemoteValue,
  realm: script.Realm
}

script.EvaluationResultException = {
  type: "exception",
  exceptionDetails: script.ExceptionDetails
  realm: script.Realm
}

script.EvaluationResult 型は、コマンドの戻り値を示す。 このコマンドはスクリプトを実行する。script.EvaluationResultSuccess バリアントが使用されるのは、 スクリプトが正常に完了する場合であり、 script.EvaluationResultException バリアントが使用されるのは、スクリプトが 例外をスローして完了する場合である。

7.6.3.4. script.ExceptionDetails 型

リモートエンド定義 およびローカルエンド定義

script.ExceptionDetails = {
  columnNumber: js-uint,
  exception: script.RemoteValue,
  lineNumber: js-uint,
  stackTrace: script.StackTrace,
  text: text,
}

script.ExceptionDetails型は JavaScript 例外を表す。

realm、完了レコード record、ownership type、およびsessionを与えて例外 詳細を取得するには:

  1. 表明: record.[[Type]]はthrowである。

  2. textを、recordによって表されるエラーの実装定義のテキスト記述とする。

    TODO: ここでの要件をより厳密にすること。おそらく人々は regex や、それと同程度に不適切な何かを使って このデータを解析しようとするだろう。

  3. serialization optionsを、 script.SerializationOptions生成規則に一致し、フィールドが それぞれのデフォルト値に設定されたマップとする。

  4. exceptionを、 record.[[Value]]、serialization options、ownership type、 シリアライズ内部マップとして新しいマップ、realm、および sessionを用いてリモート値として シリアライズすることによって得られる結果とする。

  5. stack traceを、recordを与えたときの例外のスタックトレースとする。

  6. stack traceのサイズが 1 以上である場合、line numberを stack trace[0]内のlineNumberフィールドの値とし、column numberを stack trace[0]内のcolumnNumberフィールドの値とする。そうでなければ、 line numberおよびcolumn numberを 0 とする。

  7. exception detailsを、 script.ExceptionDetails生成規則に一致し、text フィールドがtextに、exceptionフィールドがexceptionに、 lineNumberフィールドがline numberに、 columnNumberフィールドがcolumn numberに、かつ stackTraceフィールドがstack traceに設定されたマップとする。

  8. exception detailsを返す。

7.6.3.5. script.Handle 型

リモートエンド定義 およびローカルエンド定義

script.Handle = text;

script.Handle型は、ECMAScript ランタイムに所有されるオブジェクトへのハンドルを表す。 このハンドルは特定のRealm内でのみ有効である。

各 ECMAScript Realmには、対応するハンドルオブジェクトマップがある。これは ハンドル ID からそれに対応するオブジェクトへの強いマップである。

7.6.3.6. script.InternalId 型

リモートエンド定義 およびローカルエンド定義

script.InternalId = text;

script.InternalId型は、 直列化中に以前に直列化された script.RemoteValueの ID を表す。

7.6.3.7. script.LocalValue 型

リモートエンド定義

script.LocalValue = (
  script.RemoteReference /
  script.PrimitiveProtocolValue /
  script.ChannelValue /
  script.ArrayLocalValue /
  { script.DateLocalValue } /
  script.MapLocalValue /
  script.ObjectLocalValue /
  { script.RegExpLocalValue } /
  script.SetLocalValue
)

script.ListLocalValue = [*script.LocalValue];

script.ArrayLocalValue = {
  type: "array",
  value: script.ListLocalValue,
}

script.DateLocalValue = (
  type: "date",
  value: text
)

script.MappingLocalValue = [*[(script.LocalValue / text), script.LocalValue]];

script.MapLocalValue = {
  type: "map",
  value: script.MappingLocalValue,
}

script.ObjectLocalValue = {
  type: "object",
  value: script.MappingLocalValue,
}

script.RegExpValue = {
  pattern: text,
  ? flags: text,
}

script.RegExpLocalValue = (
  type: "regexp",
  value: script.RegExpValue,
)

script.SetLocalValue = {
  type: "set",
  value: script.ListLocalValue,
}

script.LocalValue 型は、ECMAScript へ逆直列化できる値を表す。これには、プリミティブ値および非プリミティブ値の 両方に加え、リモート参照および チャネルが含まれる。

serialized key-value list、realm および session が与えられた場合に キーと値の リストをデシリアライズするには:

  1. deserialized key-value list を新しいリストとする。

  2. serialized key-value list 内の各 serialized key-value について:

    1. serialized key-value の サイズが 2 でない場合、 エラーを エラーコード 無効な引数として返す。

    2. serialized key を serialized key-value[0] とする。

    3. serialized key が string である場合、 deserialized key を serialized key とする。

    4. それ以外の場合、deserialized key を、serialized key、realm および session を用いて 試行して ローカル値をデシリアライズする結果とする。

    5. serialized value を serialized key-value[1] とする。

    6. deserialized value を、serialized value、realm および session が与えられた場合に 試行して ローカル値をデシリアライズする 結果とする。

    7. CreateArrayFromList(«deserialized key, deserialized value») を deserialized key-value list に付加する。

  3. データ deserialized key-value list とともに 成功を返す。

serialized value list、realm および session が与えられた場合に 値の リストをデシリアライズするには:

  1. deserialized values を新しいリストとする。

  2. serialized value list 内の各 serialized value について:

    1. deserialized value を、serialized value、realm および session が与えられた場合に 試行して ローカル値をデシリアライズする 結果とする。

    2. deserialized value を deserialized values に付加する;

  3. データ deserialized values とともに 成功を返す。

local protocol value、realm および session が与えられた場合に ローカル 値をデシリアライズするには:

  1. local protocol value が script.RemoteReference 生成規則に一致する場合、指定された local protocol value、realm および session の リモート参照をデシリアライズする結果を返す。

  2. local protocol value が script.PrimitiveProtocolValue 生成規則に一致する場合、 local protocol value を用いて プリミティブプロトコル値をデシリアライズする 結果を返す。

  3. local protocol value が script.ChannelValue 生成規則に一致する場合、 session、realm および local protocol value を用いて チャネルを 作成する結果を返す。

  4. type を local protocol value の type フィールドの値とし、そのようなフィールドが 存在しない場合は undefined とする。

  5. value を local protocol value の value フィールドの値とし、そのようなフィールドが存在しない 場合は undefined とする。

  6. 次の条件とそれに対応する手順のリストにおいて、 対応する条件が true となる最初の手順の組を実行する:

    type が文字列 "array" である
    1. deserialized value list を、value、realm および session が与えられた場合に 試行して 値リストをデシリアライズする 結果とする。

    2. データ CreateArrayFromList(deserialized value list) とともに 成功を返す。

    type が文字列 "date" である
    1. value が 日時文字列形式に一致しない場合、 エラーを エラーコード 無効な引数として返す。

    2. date result を Construct(Date, value) とする。

    3. 表明:date result は 突然の 完了ではない。

    4. データ date result とともに 成功を返す。

    type が文字列 "map" である
    1. deserialized key-value list を、value、realm および session を用いて 試行して キーと値のリストをデシリアライズする結果とする。

    2. iterable を CreateArrayFromList(deserialized key-value list) とする

    3. データ Map(iterable) とともに 成功を返す。

    type が文字列 "object" である
    1. deserialized key-value list を、value、realm および session を用いて 試行して キーと値のリストをデシリアライズする結果とする。

    2. iterable を CreateArrayFromList(deserialized key-value list) とする

    3. データ Object.fromEntries(iterable) とともに 成功を返す。

    type が文字列 "regexp" である
    1. pattern を local protocol value の pattern フィールドの値とする。

    2. flags を local protocol value の flags フィールドの値とし、そのようなフィールドが存在しない場合は undefined とする。

    3. regex_result を Regexp(pattern, flags) とする。これが例外をスローした場合、エラー を エラーコード 無効な引数として返す。

    4. データ regex_result とともに 成功を返す。

    type が文字列 "set" である
    1. deserialized value list を、value、realm および session が与えられた場合に 試行して 値リストをデシリアライズする 結果とする。

    2. iterable を CreateArrayFromList(deserialized key-value list) とする

    3. データ Set オブジェクト(iterable) とともに 成功を返す。

    それ以外
    エラーを エラーコード 無効な引数として返す。
7.6.3.8. script.PreloadScript 型

リモートエンド定義 およびローカルエンド定義

script.PreloadScript = text;

script.PreloadScript型は、realm 作成時に実行されるスクリプトへのハンドルを表す。

7.6.3.9. script.Realm 型

リモートエンド定義 およびローカルエンド定義

script.Realm = text;

各 Realm には、関連付けられた Realm ID があり、これはその Realm を一意に 識別する文字列である。これは Realm が作成されるときに暗黙的に設定される。

Realm の Realm ID は不透明であり、 ハンドルオブジェクトマップ内の対応するグローバルオブジェクトのハンドル ID、または該当する場合には、任意の navigable の navigable ID から導出可能であってはならない。

注: これは、異なる ID 間の 実装固有の関係にユーザーが依存しないようにするためである。

realm id が与えられた場合に Realm を取得するには:
  1. realm id が null の場合、データ null とともに 成功 を返す。

  2. ID が realm id である Realm が存在しない場合、 エラーを エラー コード そのようなフレームはないとして返す

  3. realm を、ID が realm id である Realm とする。

  4. データ realm とともに 成功を返す

これには誤った エラーコードが使用されている

7.6.3.10. script.PrimitiveProtocolValue 型

リモートエンド定義 およびローカルエンド定義

script.PrimitiveProtocolValue = (
  script.UndefinedValue /
  script.NullValue /
  script.StringValue /
  script.NumberValue /
  script.BooleanValue /
  script.BigIntValue
)

script.UndefinedValue = {
  type: "undefined",
}

script.NullValue = {
  type: "null",
}

script.StringValue = {
  type: "string",
  value: text,
}

script.SpecialNumber = "NaN" / "-0" / "Infinity" / "-Infinity";

script.NumberValue = {
  type: "number",
  value: number / script.SpecialNumber,
}

script.BooleanValue = {
  type: "boolean",
  value: bool,
}

script.BigIntValue = {
  type: "bigint",
  value: text,
}

script.PrimitiveProtocolValueは、参照によってではなく、 値によってのみ表現できる値を表す。

valueを与えてプリミティブプロトコル値をシリアライズするには:

  1. remote valueを undefined とする。

  2. 以下の条件とそれに対応する手順のリストにおいて、対応する条件が true である最初の 手順の組があれば、それを実行する:

    Type(value)が undefined である
    remote valueを、ローカルエンド定義内の script.UndefinedValue 生成規則に一致するマップとする。
    Type(value)が Null である
    remote valueを、ローカルエンド定義内の script.NullValue 生成規則に一致するマップとする。
    Type(value)が String である
    remote valueを、ローカルエンド定義内の script.StringValue 生成規則に一致し、value プロパティがvalueに設定されたマップとする。

    これは 単独サロゲートを処理しない

    Type(value)が Number である
    1. valueの値に応じて分岐する:

      NaN
      serializedを"NaN"とする
      -0
      serializedを"-0"とする
      Infinity
      serializedを"Infinity"とする
      -Infinity
      serializedを"-Infinity"とする
      それ以外:
      serializedをvalueとする
    2. remote valueを、ローカルエンド定義内の script.NumberValue 生成規則に一致し、value プロパティがserializedに設定されたマップとする。

    Type(value)が Boolean である
    remote valueを、ローカルエンド定義内の script.BooleanValue 生成規則に一致し、value プロパティがvalueに設定されたマップとする。
    Type(value)が BigInt である
    remote valueを、ローカルエンド定義内の script.BigIntValue 生成規則に一致し、value プロパティがvalueに対してToString 操作を実行した結果に設定されたマップとする。
  3. remote valueを返す

primitive protocol valueを与えてプリミティブプロトコル値をデシリアライズするには:

  1. type を primitive protocol value の type フィールドの値とする。

  2. value を undefined とする。

  3. primitive protocol value が value フィールドを持つ場合:

    1. value を primitive protocol value の value フィールドの値とする。

  4. 次の条件とそれに対応する手順のリストにおいて、対応する条件が true となる最初の手順の組を実行する:

    type が文字列 "undefined" である
    データ undefined とともに 成功を返す。
    type が文字列 "null" である
    データ null とともに 成功を返す。
    type が文字列 "string" である
    データ value とともに 成功を返す。
    type が文字列 "number" である
    1. Type(value) が Number の場合、データ value とともに 成功を返す。

    2. 表明:Type(value) は String である。

    3. value が文字列 "NaN" の場合、データ NaN とともに 成功を返す。

    4. number_result を StringToNumber(value) とする。

    5. number_result が NaN の場合、エラーを エラーコード 無効な引数として返す

    6. データ number_result とともに 成功を返す。

    type が文字列 "boolean" である
    データ value とともに 成功を返す。
    type が文字列 "bigint" である
    1. bigint_result を StringToBigInt(value) とする。

    2. bigint_result が undefined の場合、エラーを エラーコード 無効な引数として返す

    3. データ bigint_result とともに 成功を返す。

  5. エラーを エラー コード 無効な引数として返す

7.6.3.11. script.RealmInfo 型

ローカルエンド定義

script.RealmInfo = (
  script.WindowRealmInfo /
  script.DedicatedWorkerRealmInfo /
  script.SharedWorkerRealmInfo /
  script.ServiceWorkerRealmInfo /
  script.WorkerRealmInfo /
  script.PaintWorkletRealmInfo /
  script.AudioWorkletRealmInfo /
  script.WorkletRealmInfo
)

script.BaseRealmInfo = (
  realm: script.Realm,
  origin: text
)

script.WindowRealmInfo = {
  script.BaseRealmInfo,
  type: "window",
  context: browsingContext.BrowsingContext,
  ? userContext: browser.UserContext,
  ? sandbox: text
}

script.DedicatedWorkerRealmInfo = {
  script.BaseRealmInfo,
  type: "dedicated-worker",
  owners: [script.Realm]
}

script.SharedWorkerRealmInfo = {
  script.BaseRealmInfo,
  type: "shared-worker"
}

script.ServiceWorkerRealmInfo = {
  script.BaseRealmInfo,
  type: "service-worker"
}

script.WorkerRealmInfo = {
  script.BaseRealmInfo,
  type: "worker"
}

script.PaintWorkletRealmInfo = {
  script.BaseRealmInfo,
  type: "paint-worklet"
}

script.AudioWorkletRealmInfo = {
  script.BaseRealmInfo,
  type: "audio-worklet"
}

script.WorkletRealmInfo = {
  script.BaseRealmInfo,
  type: "worklet"
}

注記: script.RealmInfo 変種とscript.RealmTypeの値の間には 1:1 の関係がある。

script.RealmInfo型は realm のプロパティを表す。

与えられたrealmを用いてナビゲータブルを取得するには:
  1. global objectをrealmのグローバルオブジェクトとする。

  2. global objectを、global objectをアンラップしたものとする。

  3. global objectがWindow オブジェクトでない場合、nullを返す。

  4. documentを、global objectのラップされたWindowの 関連付けられたDocumentとする。

  5. documentのノードナビゲータブルを返す。

与えられたglobal objectを用いてワーカーの 所有者を取得するには:
  1. 表明: global objectはWorkerGlobalScope オブジェクトである。

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

  3. global objectに関連付けられた所有者集合内の各ownerについて:

    1. owner environment settingsをownerの関連設定オブジェクトとする。

    2. owner realm infoを、 owner environment settingsを与えてRealm 情報を取得した結果とする。

    3. owner realm infoが null の場合、続行する。

    4. owner realm info["id"]をownersに付加する。

  4. ownersを返す。

environment settingsを与えてRealm 情報を取得するには:
  1. realmをenvironment settingsのRealm 実行コンテキストの Realm コンポーネントとする。

  2. realm idをrealmのRealm IDとする。

  3. originを、environment settingsのoriginを与えたときのオリジンのシリアライズとする。

  4. global objectをenvironment settingsによって指定されたグローバルオブジェクトとする

  5. 最初に一致する条件の手順を実行する:

    global objectがWindow オブジェクトである
    1. documentをenvironment settingsの関連グローバルオブジェクトの 関連付けられたDocumentとする。

    2. navigableをdocumentのノードナビゲータブルとする。

    3. navigableが null の場合、null を返す。

    4. navigable idをnavigableのナビゲータブル IDとする。

    5. user context idを、 navigableの関連付けられたユーザーコンテキストのユーザーコンテキスト IDとする

    6. realm infoを、 script.WindowRealmInfo生成規則に一致し、 realmフィールドがrealm idに、origin フィールドがoriginに、contextフィールドが navigable idに、かつ userContextフィールドがuser context idに設定されたマップとする。

    global objectがSandboxWindowProxy オブジェクトである
    TODO: これがサンドボックスを処理するための適切な定式化であるかは不明である。
    1. documentをglobal objectのラップされたWindowの 関連付けられたDocumentとする。

    2. navigableをdocumentのノードナビゲータブルとする。

    3. navigableが null の場合、null を返す。

    4. navigable idをnavigableのナビゲータブル IDとする。

    5. user context idを、 navigableの関連付けられたユーザーコンテキストのユーザーコンテキスト IDとする

    6. sandbox nameを、 realmを与えてサンドボックス名を 取得した結果とする。

    7. 表明: sandbox nameは null ではない。

    8. realm infoを、 script.WindowRealmInfo生成規則に一致し、 realmフィールドがrealm idに、origin フィールドがoriginに、contextフィールドが navigable idに、 userContextフィールドがuser context idに、かつ sandboxフィールドがsandbox nameに設定されたマップとする。

    global objectがDedicatedWorkerGlobalScope オブジェクトである
    1. ownersを、global objectを与えてワーカーの 所有者を取得した結果とする。

    2. 表明: ownersは正確に 1 個の項目を持つ。

    3. realm infoを、 script.DedicatedWorkerRealmInfo生成規則に一致し、 realmフィールドがrealm idに、originフィールドが originに、かつownersフィールドが ownersに設定されたマップとする。

    global objectがSharedWorkerGlobalScope オブジェクトである
    1. realm infoを、 script.SharedWorkerRealmInfo生成規則に一致し、 realmフィールドがrealm idに、かつ originフィールドが originに設定されたマップとする。

    global objectがServiceWorkerGlobalScope オブジェクトである
    1. realm infoを、 script.ServiceWorkerRealmInfo生成規則に一致し、 realmフィールドがrealm idに、かつ originフィールドが originに設定されたマップとする。

    global objectがWorkerGlobalScope オブジェクトである
    1. realm infoを、 script.WorkerRealmInfo生成規則に一致し、 realmフィールドがrealm idに、かつorigin フィールドがoriginに設定されたマップとする。

    global objectがPaintWorkletGlobalScope オブジェクトである
    1. realm infoを、 script.PaintWorkletRealmInfo生成規則に一致し、 realmフィールドがrealm idに、かつorigin フィールドがoriginに設定されたマップとする。

    global objectがAudioWorkletGlobalScope オブジェクトである
    1. realm infoを、 script.AudioWorkletRealmInfo生成規則に一致し、 realmフィールドがrealm idに、かつorigin フィールドがoriginに設定されたマップとする。

    global objectがWorkletGlobalScope オブジェクトである
    1. realm infoを、 script.WorkletRealmInfo生成規則に一致し、 realmフィールドがrealm idに、かつorigin フィールドがoriginに設定されたマップとする。

    それ以外:
    1. realm infoを null とする。

  6. realm infoを返す

注記: この仕様の将来のバリエーションでも、 "-"で分割した後の型名の最後の構成要素が、WorkerGlobalScopeを実装するグローバルでは 常に"worker"となり、 WorkletGlobalScopeを実装するグローバルでは "worklet"となるという不変条件を維持する。

7.6.3.12. script.RealmType 型

リモートエンド定義 およびローカルエンド定義

script.RealmType = "window" / "dedicated-worker" / "shared-worker" / "service-worker" /
                   "worker" / "paint-worklet" / "audio-worklet" / "worklet"

script.RealmType型は、Realm のさまざまな型を表す。

7.6.3.13. script.RemoteReference 型

リモートエンド定義

script.RemoteReference = (
  script.SharedReference /
  script.RemoteObjectReference
)

script.SharedReference = {
   sharedId: script.SharedId

   ? handle: script.Handle,
   Extensible
}

script.RemoteObjectReference = {
   handle: script.Handle,

   ? sharedId: script.SharedId
   Extensible
}

script.RemoteReference 型は、与えられたRealm内の ハンドルオブジェクトマップに存在する ECMAScript オブジェクトへのリモート参照を表す script.RemoteObjectReference、またはnodeへの参照を表す script.SharedReferenceのいずれかである。

"stale object reference" の場合を扱う。

注記: 提供された参照が handleと sharedIdの両方を持つ場合、アルゴリズムはhandleを無視し、 sharedIdのみを尊重する。

remote reference、realmおよび sessionが与えられたとき、リモート参照を逆直列化するには:
  1. remote referenceがscript.RemoteReference生成規則に一致することを表明する。

  2. remote referenceがscript.SharedReference生成規則に一致する場合、 remote reference、realmおよびsessionで共有参照を逆直列化する結果を返す。

  3. remote referenceおよび realmでリモートオブジェクト参照を逆直列化する結果を返す。

remote object reference および realm が与えられた場合に リモートオブジェクト参照をデシリアライズするには:
  1. handle id を remote object reference の handle フィールドの値とする。

  2. handle map を realm の ハンドルオブジェクトマップとする

  3. handle map が handle id を含まない場合、エラーを エラーコード そのようなハンドルはないとして返す。

  4. データ handle map[handle id] とともに 成功を返す。

shared reference、realm および session が与えられた場合に 共有 参照をデシリアライズするには:
  1. 表明:shared reference は script.SharedReference 生成規則に一致する。

  2. navigable を realm を用いて navigable を取得する結果とする。

  3. navigable が null の場合、エラーを エラーコード そのような ノードはないとして返す。

    注: これは Realm が Window グローバルでない場合に発生する。

  4. shared id を shared reference の sharedId フィールドの値とする。

  5. node を、session、 navigable および shared id を用いて 試行して ノードを取得する結果とする。

  6. node が null の場合、エラーを エラーコード そのような ノードはないとして返す。

  7. environment settings を、その Realm 実行コンテキストの Realm コンポーネントが realm である 環境設定オブジェクトとする。

  8. node の ノード文書の オリジンが、environment settings の オリジンと 同一オリジンドメインでない場合、エラーを エラー コード そのようなノードはないとして返す。

    注: これにより、WebDriver-BiDi を使用して、 本来スクリプトアクセスを許可しない Realm 間でオブジェクトを 渡すことができないようにする。

  9. realm global object を realm の グローバルオブジェクトとする。

  10. realm global object が SandboxWindowProxy オブジェクトである場合、 node を realm 内で node をラップする SandboxProxy に設定する。

  11. データ node とともに 成功を返す。

7.6.3.14. script.RemoteValue 型

リモートエンド定義 およびローカルエンド定義

script.RemoteValue = (
  script.PrimitiveProtocolValue /
  script.SymbolRemoteValue /
  script.ArrayRemoteValue /
  script.ObjectRemoteValue /
  script.FunctionRemoteValue /
  script.RegExpRemoteValue /
  script.DateRemoteValue /
  script.MapRemoteValue /
  script.SetRemoteValue /
  script.WeakMapRemoteValue /
  script.WeakSetRemoteValue /
  script.GeneratorRemoteValue /
  script.ErrorRemoteValue /
  script.ProxyRemoteValue /
  script.PromiseRemoteValue /
  script.TypedArrayRemoteValue /
  script.ArrayBufferRemoteValue /
  script.NodeListRemoteValue /
  script.HTMLCollectionRemoteValue /
  script.NodeRemoteValue /
  script.WindowProxyRemoteValue
)

script.ListRemoteValue = [*script.RemoteValue];

script.MappingRemoteValue = [*[(script.RemoteValue / text), script.RemoteValue]];

script.SymbolRemoteValue = {
  type: "symbol",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ArrayRemoteValue = {
  type: "array",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue,
}

script.ObjectRemoteValue = {
  type: "object",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.MappingRemoteValue,
}

script.FunctionRemoteValue = {
  type: "function",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.RegExpRemoteValue = {
  script.RegExpLocalValue,
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.DateRemoteValue = {
  script.DateLocalValue,
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.MapRemoteValue = {
  type: "map",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.MappingRemoteValue,
}

script.SetRemoteValue = {
  type: "set",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue
}

script.WeakMapRemoteValue = {
  type: "weakmap",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.WeakSetRemoteValue = {
  type: "weakset",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.GeneratorRemoteValue = {
  type: "generator",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ErrorRemoteValue = {
  type: "error",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ProxyRemoteValue = {
  type: "proxy",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.PromiseRemoteValue = {
  type: "promise",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.TypedArrayRemoteValue = {
  type: "typedarray",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ArrayBufferRemoteValue = {
  type: "arraybuffer",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.NodeListRemoteValue = {
  type: "nodelist",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue,
}

script.HTMLCollectionRemoteValue = {
  type: "htmlcollection",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue,
}

script.NodeRemoteValue = {
  type: "node",
  ? sharedId: script.SharedId,
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.NodeProperties,
}

script.NodeProperties = {
  nodeType: js-uint,
  childNodeCount: js-uint,
  ? attributes: {*text => text},
  ? children: [*script.NodeRemoteValue],
  ? localName: text,
  ? mode: "open" / "closed",
  ? namespaceURI: text,
  ? nodeValue: text,
  ? shadowRoot: script.NodeRemoteValue / null,
}

script.WindowProxyRemoteValue = {
  type: "window",
  value: script.WindowProxyProperties,
  ? handle: script.Handle,
  ? internalId: script.InternalId
}

script.WindowProxyProperties = {
  context: browsingContext.BrowsingContext
}

WASM 型を追加する?

WindowProxy は Node と 同様のスタイルで属性を持つべきか?

String / Number / などの wrapper object を特別に扱う?

ECMAScript runtime からアクセス可能な値は mirror object により表され、script.RemoteValue として指定される。値の型は type プロパティで指定される。JSON で表現可能な primitive value の場合、これは value プロパティに値を含む。JSON で表現できない primitive の場合、 value プロパティは値の文字列表現を 含む。

非 primitive object については、handle プロパティが存在する場合、 その object への一意な文字列 handle を含む。handle は各 serialization ごとに一意である。remote end は、対応する handle を持つ object を、 その handle で script.disown が呼び出されるか、 realm 自身が破棄されることになるまで(例: navigation によって)生存させ続ける。

一部の非 primitive 型について、value プロパティは ECMAScript object 内のデータの表現を含む。container 型では、これはさらに script.RemoteValue instance を含むことができる。 value プロパティは、重複 object、すなわちその object が現在の script.RemoteValue 内ですでに serialize されている場合、おそらく cycle の一部として、 または最大 serialization depth に到達した場合、null になり得るか、省略され得る。

同じ script.RemoteValue 内に重複 object がある場合、 値は remote value のうち 1 つに対してのみ提供される一方で、 ECMAScript object ごとに一意な internalId は、与えられた serialization におけるすべての重複 object に対して提供される。

Node も script.RemoteValue instance により表される。これらは value プロパティに node の部分的な serialization を持つ。

mirror objects の lifecycle を再検討する。

注: mirror object は runtime 内で元の object を 生存させ続けない。object が runtime 内で破棄された場合、その後に protocol を介してそれへアクセスしようとすると error になる。

realm, ownership type および object が与えられたときに object の handle を取得するには:
  1. ownership type が "none" と等しい場合、null を返す。

  2. handle id を、object のための新しい一意な文字列 handle とする。

  3. handle map を realm の handle object map とする

  4. handle map[handle id] を object に設定する。

  5. 結果として handle id を返す。

node および session が与えられたときに node の shared id を取得する には:
  1. node を unwrapped node とする。

  2. node が Node を実装しない場合、 null を返す。

  3. navigable を node の node navigable とする。

  4. navigable が null の場合、null を返す。

  5. session, navigable および node で get or create a node reference した結果を返す。

serialization internal map, remote value および object が与えられたときに 必要なら internal ids を設定する には:
  1. serialization internal map が object を含まない場合、 serialization internal map[object] を remote value に設定する。

  2. そうでなければ、次の手順を実行する:

    1. previously serialized remote value を serialization internal map[object] とする。

    2. previously serialized remote value が internalId フィールドを持たない場合、次の手順を実行する:

      1. internal id を、真にランダム、または疑似ランダムな数に基づく UUID の文字列表現とする。

      2. previously serialized remote value の internalId フィールドを internal id に設定する。

    3. remote value の internalId フィールドを、 previously serialized remote value 内の internalId フィールドに設定する。

value、serialization options、 ownership type、serialization internal map、realmおよび sessionが与えられたとき、リモート値として 直列化するには:

  1. remote valueを、 valueが与えられたときのプリミティブプロトコル値を直列化する結果とする。

  2. remote valueが undefined でない場合、remote valueを返す。

  3. handle idを、realm、 ownership type およびvalueでオブジェクトのハンドルとする。

  4. ownership typeを "none" に設定する。

  5. valueが serialization internal map内にある場合はknown objectをtrueとし、 そうでなければfalseとする。

  6. 以下の条件とそれに関連付けられた手順のリストにおいて、 関連付けられた条件が true である最初の手順群を実行する:

    Type(value) is Symbol
    remote valueを、ローカルエンド定義内の script.SymbolRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。
    IsArray(value)
    remote valueを、 session、 script.ArrayRemoteValue、handle id、known object、 value、 serialization options、ownership type、serialization internal map、 realm、およびsessionでArray-like として直列化する結果とする。
    IsRegExp(value)
    1. patternを、Get(value, "source")のToStringとする。

    2. flagsを、Get(value, "flags")のToStringとする。

    3. serializedを、 ローカルエンド定義内の script.RegExpValue生成規則に一致し、 patternプロパティが patternに、flagsプロパティが flagsに設定されたマップとする。

    4. remote valueを、 ローカルエンド定義内の script.RegExpRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略され、 valueプロパティがserializedに設定されたマップとする。

    value has a [[DateValue]] internal slot.
    1. serializedをCall(Date.prototype.toISOString, value)に設定する。

    2. 表明:serializedはthrow completionでない。

    3. remote valueを、 ローカルエンド定義内の script.DateRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略され、 value がserializedに設定されたマップとする。

    value has a [[MapData]] internal slot
    1. remote valueを、 ローカルエンド定義内の script.MapRemoteValue 生成規則に一致し、 handleプロパティが、handle idが null でなければそれに設定され、 そうでなければ省略されたマップとする。

    2. serialization internal map、 remote valueおよびvalueで必要なら内部 ID を設定する。

    3. serializedを null とする。

    4. known objectがfalseであり、かつserialization options["maxObjectDepth"]が 0 でない場合、次の手順を実行する:

      1. serializedを、 CreateMapIterator(value, key+value)、serialization options、 ownership type、serialization internal map、 realm、およびsessionでマッピングとして直列化する結果とする。

    5. serializedが null でない場合、remote valueのvalueフィールドを serializedに設定する。

    value has a [[SetData]] internal slot
    1. remote valueを、 ローカルエンド定義内の script.SetRemoteValue 生成規則に一致し、 handleプロパティが、handle idが null でなければそれに設定され、 そうでなければ省略されたマップとする。

    2. serialization internal map、 remote valueおよびvalueで必要なら内部 ID を設定する。

    3. serializedを null とする。

    4. known objectがfalseであり、かつserialization options["maxObjectDepth"]が 0 でない場合、次の手順を実行する:

      1. serializedを、 CreateSetIterator(value, value)、serialization options、 ownership type、serialization internal map、 realm、および sessionでリストとして直列化する結果とする。

    5. serializedが null でない場合、remote valueのvalueフィールドを serializedに設定する。

    value has a [[WeakMapData]] internal slot
    remote valueを、ローカルエンド定義内の script.WeakMapRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。
    value has a [[WeakSetData]] internal slot
    remote valueを、ローカルエンド定義内の script.WeakSetRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。
    value has a [[GeneratorState]] internal slot or [[AsyncGeneratorState]] internal slot
    remote valueを、ローカルエンド定義内の script.GeneratorRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。
    value has an [[ErrorData]] internal slot
    remote valueを、ローカルエンド定義内の script.ErrorRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。
    value has a [[ProxyHandler]] internal slot and a [[ProxyTarget]] internal slot
    remote valueを、ローカルエンド定義内の script.ProxyRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。
    IsPromise(value)
    remote valueを、ローカルエンド定義内の script.PromiseRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。
    value has a [[TypedArrayName]] internal slot
    remote valueを、ローカルエンド定義内の script.TypedArrayRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。
    value has an [[ArrayBufferData]] internal slot
    remote valueを、ローカルエンド定義内の script.ArrayBufferRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。
    value is a platform object that implements NodeList
    remote valueを、 script.NodeListRemoteValue、handle id、known object、 value、 serialization options、ownership type、serialization internal map、 realm、およびsessionでArray-like として直列化する結果とする。
    value is a platform object that implements HTMLCollection
    remote valueを、 script.HTMLCollectionRemoteValue、handle id、known object、value、 serialization options、ownership type、known object、 serialization internal map、 realm、およびsessionでArray-like として直列化する結果とする。
    value is a platform object that implements Node
    1. shared idを、valueおよびsessionでnode の shared id を取得する結果とする。

    2. remote valueを、 ローカルエンド定義内の script.NodeRemoteValue 生成規則に一致し、sharedId プロパティが、shared idが null でなければそれに設定され、そうでなければ省略され、 handleプロパティが、handle idが null でなければそれに設定され、 そうでなければ省略されたマップとする。

    3. serialization internal map、 remote valueおよびvalueで必要なら内部 ID を設定する。

    4. serializedを null とする。

    5. known objectがfalseである場合、次の手順を実行する:

      1. serializedをマップとする。

      2. serialized["nodeType"]をGet(value, "nodeType")に設定する。

      3. node valueをGet(value, "nodeValue")に設定する。

      4. node valueが null でない場合、 serialized["nodeValue"]をnode valueに設定する。

      5. valueがElement またはAttrを実装する場合:

        1. serialized["localName"]をGet(value, "localName")に設定する。

        2. serialized["namespaceURI"]をGet(value, "namespaceURI")に設定する

      6. child node countを、valueのchildrenのサイズとする。

      7. serialized["childNodeCount"]をchild node countに設定する。

      8. serialization options["maxDomDepth"]が 0 に等しい場合、またはvalueがShadowRootを実装し、 かつserialization options["includeShadowTree"]が "none" である場合、 またはserialization options["includeShadowTree"] が "open" であり、かつvalueのmodeが "closed" である場合、childrenを null とする。

        そうでなければ、childrenを空の リストとし、valueの children内の各 node childについて:

        1. child serialization optionsを、 serialization optionsの複製とする。

        2. child serialization options["maxDomDepth"]が null でない場合、child serialization options["maxDomDepth"]をchild serialization options["maxDomDepth"] - 1 に設定する。

        3. serializedを、 child、child serialization options、 ownership type、 serialization internal map、realm、および sessionでリモート値として 直列化する結果とする。

        4. serializedをchildrenに付加する。

      9. childrenが null でない場合、 serialized["children"]をchildrenに設定する。

      10. valueがElementを実装する場合:

        1. attributesを新しいマップとする。

        2. valueの属性リスト内の各attributeについて:

          1. nameを、attributeの修飾 名とする

          2. valueを、attributeの値とする。

          3. attributes[name]を valueに設定する

        3. serialized["attributes"]を attributesに設定する。

        4. shadow rootを、valueのshadow rootとする。

        5. shadow rootが null である場合、serialized shadowを null とする。 そうでなければ、次のサブ手順を実行する:

          1. serialized shadowを、 shadow root、 serialization options、ownership type、serialization internal map、 realm、およびsessionで リモート値として 直列化する結果とする。

        6. serialized["shadowRoot"]を serialized shadowに設定する。

      11. valueがShadowRootを実装する場合、 serialized["mode"] をvalueのmodeに設定する。

    6. serializedが null でない場合、remote valueのvalueフィールドを serializedに設定する。

    value is a platform object that implements WindowProxy
    1. windowを、valueの [[WindowProxy]] internal slotの値とする。

    2. navigableを、windowのnavigableとする。

    3. navigable idを、navigableのnavigable IDとする。

    4. serializedを、ローカルエンド定義内の script.WindowProxyProperties生成規則に一致し、 contextプロパティがnavigable idに設定されたマップとする。

    5. remote valueを、 ローカルエンド定義内の script.WindowProxyRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略され、 valueプロパティがserializedに設定されたマップとする。

    value is a platform object
    1. remote valueを、ローカルエンド定義内の script.ObjectRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。
    IsCallable(value)
    remote valueを、ローカルエンド定義内の script.FunctionRemoteValue 生成規則に一致し、handle プロパティが、handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。
    Otherwise:
    1. 表明:Type(value) は Object である

    2. remote valueを、 ローカルエンド定義内の script.ObjectRemoteValue生成規則に一致し、 handleプロパティが handle idが null でなければそれに設定され、そうでなければ省略されたマップとする。

    3. serialization internal map、 remote valueおよびvalueで必要なら内部 ID を設定する。

    4. serializedを null とする。

    5. known objectがfalseであり、かつserialization options["maxObjectDepth"]が 0 でない場合、次の手順を実行する:

      1. serializedを、 EnumerableOwnPropertyNames(value, key+value)、serialization options、 ownership type、serialization internal map、 realm、およびsessionでマッピングとして直列化する結果とする。

    6. serializedが null でない場合、remote valueのvalueフィールドを serializedに設定する。

  7. remote valueを返す

children と子 node は異なるものである。childNodeCountは childNodesを参照するべきか、またはchildrenCountに改名されるべきである。

production, handle id, known object, value, serialization options, ownership type, serialization internal map, realm, および session が与えられたときに Array-like を serialize する には:
  1. remote value を production に一致する map とし、 handle property は handle id が null でない場合はそれに設定し、そうでなければ 省略する。

  2. serialization internal map, remote value および value で Set internal ids if needed する。

  3. known object が false で、かつ serialization options["maxObjectDepth"] が 0 でない場合:

    1. serialized を、 CreateArrayIterator(value, value), serialization options, ownership type, serialization internal map, realm, および session で serialize as a list した結果とする。

    2. serialized が null でない場合、remote value の value フィールドを serialized に設定する。

  4. remote value を返す

iterable, serialization options, ownership type, serialization internal map, realm, および session が与えられたときに list として serialize する には:
  1. serialization options["maxObjectDepth"] が null でない場合、 assert: serialization options["maxObjectDepth"] は 0 より大きい。

  2. serialized を新しい list とする。

  3. IteratorToList(GetIterator(iterable, sync)) 内の各 child value について:

    1. child serialization options を serialization options の clone とする。

    2. child serialization options["maxObjectDepth"] が null でない場合、child serialization options["maxObjectDepth"] を child serialization options["maxObjectDepth"] - 1 に設定する。

    3. serialized child を、 child value, child serialization options, ownership type, serialization internal map, realm, および session で serialize as a remote value した結果とする。

    4. serialized child を serialized に append する。

  4. serialized を返す

iterable, serialization options, ownership type, serialization internal map, realm, および session が与えられたときに mapping として serialize する には:

  1. serialization options["maxObjectDepth"] が null でない場合、 assert: serialization options["maxObjectDepth"] は 0 より大きい。

  2. serialized を新しい list とする。

  3. IteratorToList(GetIterator(iterable, sync)) 内の item について:

    1. Assert: IsArray(item)

    2. property を CreateListFromArrayLike(item) とする

    3. Assert: property は size 2 の list である

    4. key を property[0] とし、value を property[1] とする

    5. child serialization options を serialization options の clone とする。

    6. child serialization options["maxObjectDepth"] が null でない場合、child serialization options["maxObjectDepth"] を child serialization options["maxObjectDepth"] - 1 に設定する。

    7. Type(key) が String である場合、serialized key を child key とし、 そうでなければ serialized key を、 child key, child serialization options, ownership type, serialization internal map, realm, および session で serialize as a remote value した結果とする。

    8. serialized value を、 value, child serialization options, ownership type, serialization internal map, realm, および session で serialize as a remote value した結果とする。

    9. serialized child を («serialized key, serialized value») とする。

    10. serialized child を serialized に append する。

  4. serialized を返す

7.6.3.15. script.ResultOwnership 型
script.ResultOwnership = "root" / "none"

script.ResultOwnership は、serialized value ownership がどのように扱われるかを指定する。

7.6.3.16. script.SerializationOptions 型

リモートエンド定義

script.SerializationOptions = {
  ? maxDomDepth: (js-uint / null) .default 0,
  ? maxObjectDepth: (js-uint / null) .default null,
  ? includeShadowTree: ("none" / "open" / "all") .default "none",
}

script.SerializationOptionsは、ECMAScript オブジェクトをどのように 直列化するかを指定できるようにする。

7.6.3.17. script.SharedId 型

リモートエンド定義 およびローカルエンド定義

script.SharedId = text;

script.SharedId型は、任意の realm(Sandbox Realmを含む)で 使用可能な DOM Nodeへの参照を表す。

7.6.3.18. script.StackFrame 型

リモートエンド定義 およびローカルエンド定義

script.StackFrame = {
  columnNumber: js-uint,
  functionName: text,
  lineNumber: js-uint,
  url: text,
}

スタックトレース内のフレームは、StackFrame オブジェクトにより表される。これは、スクリプトの URL を表すurlプロパティ、 実行中の関数の名前を表すfunctionNameプロパティ、および 実行されたコードの行番号と列番号を表すlineNumberおよびcolumnNumber プロパティを持つ。

7.6.3.19. script.StackTrace 型

リモートエンド定義 およびローカルエンド定義

script.StackTrace = {
  callFrames: [*script.StackFrame],
}

script.StackTrace型は、スクリプト実行中のある時点における JavaScript スタックを表す。

注記: スタックフレームのリストを取得する方法、および そのリストのプロパティの詳細は十分に規定されていないため、ここでの詳細は実装定義である。

実装は、スタック フレームのリストを生成できるものと仮定される。これは、JavaScript 呼び出しスタック内の各項目に 1 つのエントリを持つリストであり、最も新しいものから始まる。 各エントリは、スクリプト script内の文または式の実行に対応する単一のスタック フレームであり、次のフィールドを含む:

script url
scriptを含むリソースの URL
function
実行中の関数の名前
line number
scriptを含むリソースの先頭を基準とした、 実行されたコードの 0 始まりの行番号。
column number
scriptを含むリソース内の行の開始位置を基準とした、 実行されたコードの 0 始まりの列番号。

スタックフレームのリストstackで、スタックトレースを 構築するには:

  1. call framesを新しいリストとする。

  2. stack内の各スタックフレーム frameについて、 最も最近実行されたフレームから始めて、次の手順を実行する:

    1. urlを、frameのscript urlの URLが与えられたときにURL シリアライザーを実行した結果とする。

    2. frame infoを、 urlフィールドがurlに、 functionNameフィールドがframeのfunctionに、 lineNumberフィールドがframeのline numberに、 columnNumberフィールドがframeの column numberに設定された、 script.StackFrame生成規則に一致する新しいマップとする。

  3. frame infoをcall framesに付加する。

  4. stack traceを、 callFramesプロパティがcall framesに設定された、 script.StackTrace生成規則に一致する新しいマップとする。

  5. stack traceを返す。

現在のスタック トレースは、実行中の 実行コンテキストのコールスタックを表すスタック フレームのリストが与えられたときのスタックトレースを構築する結果である。

例外、または型 throwのCompletion Recordである exceptionによる例外の スタックトレースは、次により与えられる:

  1. exceptionが例外として投げられた値である場合、record を、exceptionを投げるために作成されたCompletion Recordとする。そうでなければ、 recordをexceptionとする。

  2. stackを、 recordが作成された時点の実行に対応するスタックフレームのリストとする。

  3. stackが与えられたときのスタックトレースを構築する結果を返す。

7.6.3.20. script.Source 型

ローカルエンド定義

script.Source = {
  realm: script.Realm,
  ? context: browsingContext.BrowsingContext,
  ? userContext: browser.UserContext
}

script.Source型は、スクリプト関連イベントが発生した script.Realmと、任意のbrowsingContext.BrowsingContextおよび関連する browser.UserContextを表す。

source realmを与えてソースを取得するには:
  1. realmをsource realmのRealm IDとする。

  2. environment settingsを、環境設定オブジェクトで、その Realm 実行コンテキストの Realm コンポーネントが source realmであるものとする。

  3. environment settingsが関連付けられたDocumentを持つ場合:

    1. documentを environment settings の関連付けられたDocumentとする。

    2. navigableをdocumentのノードナビゲータブルとする。

    3. navigable idを、navigableが null でない場合の navigableのナビゲータブル IDとする。

    4. user context idを、 navigableの関連付けられたユーザーコンテキストのユーザーコンテキスト IDとする。

    そうでなければ、navigableを null とする。

  4. sourceを、 script.Source生成規則に一致し、realm フィールドがrealmに設定され、contextフィールドが navigableが null でない場合はnavigable idに設定され、そうでなければ未設定であり、 かつuserContextフィールドがuser context idに設定されるのは |navigable が null でない場合であり、そうでなければ未設定であるマップとする。

  5. sourceを返す。

7.6.3.21. script.Target 型

リモートエンド定義

script.RealmTarget = {
  realm: script.Realm
}

script.ContextTarget = {
  context: browsingContext.BrowsingContext,
  ? sandbox: text
}

script.Target = (
  script.ContextTarget /
  script.RealmTarget
)

script.Target型は、 script.RealmまたはbrowsingContext.BrowsingContextのいずれかである値を表す。 これは、navigable 識別子が、その navigable のアクティブ文書に関連付けられた realm の代わりになる場合に有用である。

navigable id および sandbox が与えられた場合に navigable から Realm を取得するには:
  1. navigable を、navigable id を用いて 試行して navigable を 取得する 結果とする。

  2. sandbox が null または空文字列の場合:

    1. document を navigable の アクティブな文書とする。

    2. environment settings を、その 関連グローバルオブジェクトの 関連付けられた Document が document である 環境設定オブジェクトとする。

    3. realm を environment settings の Realm 実行コンテキストの Realm コンポーネントとする。

  3. それ以外の場合:realm を、sandbox および navigable が与えられた場合に 試行して サンドボックス Realm を取得または作成する結果とする。

  4. データ realm とともに 成功を返す

これには誤った エラーコードが使用されている

target が与えられた場合に ターゲットから Realm を取得するには:
  1. target が script.ContextTarget 生成規則に一致する場合:

    1. sandbox を null とする。

    2. target が "sandbox" を 含む場合、 sandbox を target["sandbox"] に設定する。

    3. realm を、target["context"] および sandbox を用いて navigable から Realm を取得する結果とする。

  2. それ以外の場合:

    1. 表明:target は script.RealmTarget 生成規則に一致する。

    2. realm id を target の realm フィールドの値とする。

    3. realm を、realm id が与えられた場合に Realm を取得する結果とする。

  3. データ realm とともに 成功を返す

これには誤った エラーコードが使用されている

7.6.4. コマンド

7.6.4.1. script.addPreloadScript コマンド

script.addPreloadScriptコマンドは、プリロードスクリプトを追加する。

コマンド型
script.AddPreloadScript = (
  method: "script.addPreloadScript",
  params: script.AddPreloadScriptParameters
)

script.AddPreloadScriptParameters = {
  functionDeclaration: text,
  ? arguments: [*script.ChannelValue],
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
  ? sandbox: text
}
戻り値型
script.AddPreloadScriptResult = {
  script: script.PreloadScript
}
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. command parameters が 含む "userContexts" かつ command parameters が 含む "contexts" 場合、 エラーを エラー コード 無効な引数として返す。

  2. function declaration を command parameters の functionDeclaration フィールドとする。

  3. arguments を、command parameters の arguments フィールドが存在する場合はその値、それ以外の場合は空の リストとする。

  4. user contexts を 集合とする。

  5. navigables を null とする。

  6. command parameters の contexts フィールドが存在する場合:

    1. navigables を空の 集合に設定する。

    2. command parameters["contexts"] の各 navigable id について

      1. navigable を、navigable id を用いて 試行して navigable を取得する 結果とする。

      2. navigable が トップレベル traversable でない場合、エラーを エラーコード 無効な引数として返す。

      3. navigable を navigables に付加する。

  7. それ以外の場合、command parameters が userContexts を 含む 場合:

    1. user contexts を command parameters["userContexts"] を用いて 集合を作成する結果に設定する。

    2. user contexts の各 user context id について:

      1. user context を user context id を用いて ユーザーコンテキストを取得する結果に設定する。

      2. user context が null の場合、エラーを エラーコード そのようなユーザーコンテキストはないとして返す。

  8. sandbox を、command parameters 内の "sandbox" フィールドが存在する場合はその値、それ以外の場合は null とする。

  9. script を UUID の文字列表現とする。

  10. preload script map を session の プリロードスクリプトマップとする。

  11. preload script map[script] を、 function declaration が function declaration、 arguments が arguments、 contexts が navigables、 sandbox が sandbox、および user contexts が user contexts である構造体に設定する。

  12. script フィールドが script に設定された script.AddPreloadScriptResult に一致する新しい マップを返す。

7.6.4.2. script.disown コマンド

script.disownコマンドは、与えられたハンドルの所有を放棄する。 これは、他のハンドルや強い ECMAScript 参照が存在し得るため、 ハンドルされたオブジェクトがガベージコレクトされることを保証しない。

コマンド型
script.Disown = (
  method: "script.disown",
  params: script.DisownParameters
)

script.DisownParameters = {
  handles: [*script.Handle]
  target: script.Target;
}
戻り値型
script.DisownResult = EmptyResult
command parameters を用いる リモートエンド手順は次のとおりである:
  1. realm を、command parameters の target フィールドの値が与えられた場合に 試行して ターゲットから Realm を取得する 結果とする。

  2. handles を command parameters の handles フィールドの値とする。

  3. handles の各 handle id について:

    1. handle map を realm の ハンドルオブジェクトマップとする

    2. handle map が handle id を含む場合、handle id を handle map から削除する。

  4. データ null とともに 成功を返す。

7.6.4.3. script.callFunction コマンド

script.callFunctionコマンドは、与えられた realm 内で、 提供された関数を与えられた引数で呼び出す。

RealmInfoは realm または navigable のいずれかであり得る。

注記: functionDeclaration内のアロー関数の場合、 this引数は関数のthis束縛に影響しない。

コマンド型
script.CallFunction = (
  method: "script.callFunction",
  params: script.CallFunctionParameters
)

script.CallFunctionParameters = {
  functionDeclaration: text,
  awaitPromise: bool,
  target: script.Target,
  ? arguments: [*script.LocalValue],
  ? resultOwnership: script.ResultOwnership,
  ? serializationOptions: script.SerializationOptions,
  ? this: script.LocalValue,
  ? userActivation: bool .default false,
}
戻り値型
script.CallFunctionResult = script.EvaluationResult

TODO: script.evaluate で説明されているように、 timeout 引数を追加する。

realm、serialized arguments list および session が与えられた場合に 引数を デシリアライズするには:

  1. deserialized arguments list を空の リストとする。

  2. serialized arguments list の各 serialized argument について:

    1. deserialized argument を、serialized argument、realm および session が与えられた場合に 試行して ローカル値をデシリアライズする 結果とする。

    2. deserialized argument を deserialized arguments list に付加する。

  3. データ deserialized arguments list とともに 成功を返す。

function declaration、 environment settings、base URL、および options が与えられた場合に 関数本体を 評価するには:

注: function declaration は 括弧で囲まれて評価される。

  1. bypassDisabledScripting を true とする。

  2. parenthesized function declaration を «"(", function declaration, ")"» を 連結する 結果とする。

  3. function script を、 parenthesized function declaration、environment settings、base URL、 options および bypassDisabledScripting を用いて クラシックスクリプトを作成する結果とする。

  4. environment settings を用いて スクリプトを実行する準備をする。

  5. function body evaluation status を ScriptEvaluation(function script のレコード) とする。

  6. environment settings を用いて スクリプト実行後にクリーンアップする。

  7. function body evaluation status を返す。

session および command parameters を用いる リモートエンド手順は次のとおりである:

  1. realm を、command parameters の target フィールドの値が与えられた場合に 試行して ターゲットから Realm を取得する 結果とする。

  2. realm id を realm の Realm ID とする。

  3. environment settings を、その Realm 実行コンテキストの Realm コンポーネントが realm である 環境設定オブジェクトとする。

  4. command arguments を command parameters の arguments フィールドの値とする。

  5. deserialized arguments を空の リストとする。

  6. command arguments が null でない場合、deserialized arguments を、 realm、command arguments および session が与えられた場合に 試行して 引数をデシリアライズする結果に設定する。

  7. this parameter を command parameters の this フィールドの値とする。

  8. this object を null とする。

  9. this parameter が null でない場合、this object を、this parameter、realm および session が与えられた場合に 試行して ローカル値をデシリアライズする結果に設定する。

  10. function declaration を command parameters の functionDeclaration フィールドの値とする。

  11. await promise を command parameters の awaitPromise フィールドの値とする。

  12. serialization options を command parameters の serializationOptions フィールドが存在する場合はその値、 それ以外の場合は各フィールドがデフォルト値に設定された script.SerializationOptions 生成規則に一致する マップとする。

  13. result ownership を command parameters の resultOwnership フィールドが存在する場合はその値、それ以外の場合は none とする。

  14. base URL を environment settings の API 基底 URL とする。

  15. options を デフォルトのスクリプトフェッチオプションとする。

  16. function body evaluation status を、 function declaration、 environment settings、base URL、および options を用いて 関数本体を評価する結果とする。

  17. function body evaluation status.[[Type]] が throw の場合:

    1. exception details を、realm、function body evaluation status、result ownership および session が与えられた場合の 例外の 詳細を取得する結果とする。

    2. exceptionDetails フィールドが exception details に設定された script.EvaluationResultException 生成規則に一致する新しい マップを返す。

  18. function object を function body evaluation status.[[Value]] とする。

  19. IsCallable(function object) が false の場合:

    1. エラーを エラーコード 無効な引数として返す

  20. command parameters["userActivation"] が true の場合、アクティベーション通知手順を実行する。

  21. environment settings を用いて スクリプトを実行する準備をする。

  22. evaluation status を Call(function object, this object, deserialized arguments) に設定する。

  23. evaluation status.[[Type]] が normal で、await promise が true で、かつ IsPromise(evaluation status.[[Value]]) の場合:

    1. evaluation status を Await(evaluation status.[[Value]]) に設定する。

  24. environment settings を用いて スクリプト実行後にクリーンアップする。

  25. evaluation status.[[Type]] が throw の場合:

    1. exception details を、realm、evaluation status、result ownership および session が与えられた場合の 例外の 詳細を取得する結果とする。

    2. exceptionDetails フィールドが exception details に設定された script.EvaluationResultException 生成規則に一致する新しい マップを返す。

  26. 表明:evaluation status.[[Type]] は normal である。

  27. result を、 evaluation status.[[Value]]、serialization options、result ownership、 シリアル化内部マップとしての新しい マップ、realm および session を用いて リモート値として シリアル化する結果とする。

  28. realm フィールドが realm id に、 result フィールドが result に設定された script.EvaluationResultSuccess 生成規則に一致する新しい マップを返す。

7.6.4.4. script.evaluate コマンド

script.evaluate コマンドは、与えられた realm 内で提供された script を evaluate する。便宜上、realm の代わりに navigable を提供でき、 その場合に使用される realm は browsing context の active document の realm である。

この method は、提供された script を実行した値を返す。ただし、それが promise を返し、awaitPromise が true である場合は、その promise の resolved value が 返される。

コマンド型
script.Evaluate = (
  method: "script.evaluate",
  params: script.EvaluateParameters
)

script.EvaluateParameters = {
  expression: text,
  target: script.Target,
  awaitPromise: bool,
  ? resultOwnership: script.ResultOwnership,
  ? serializationOptions: script.SerializationOptions,
  ? userActivation: bool .default false,
}
返却型
script.EvaluateResult = script.EvaluationResult

TODO: timeout argument を追加する。これがどのように機能すべきかは完全には明確でない。 Chrome では timeout は promise resolve step には適用されないように見えるが、 それはおそらく clients が望むものではない。

リモートエンド手順は、sessionおよびcommand parametersを与えたとき、次のとおりである:

  1. realmを、command parametersのtargetフィールドの値を与えて試行してターゲットから Realm を取得する 結果とする。

  2. realm idをrealmのRealm IDとする。

  3. environment settingsを、その Realm 実行コンテキストの Realm コンポーネントが realmである環境設定オブジェクトとする。

  4. sourceをcommand parametersのexpressionフィールドの値とする。

  5. await promiseを command parametersのawaitPromiseフィールドの値とする。

  6. serialization optionsを、存在する場合は command parametersのserializationOptionsフィールドの値とし、 そうでなければ、script.SerializationOptions 生成規則に一致し、フィールドがそれぞれのデフォルト値に設定されたマップとする。

  7. result ownershipを、存在する場合はcommand parametersのresultOwnershipフィールドの値とし、 そうでなければnoneとする。

  8. optionsをデフォルトのスクリプトフェッチオプションとする。

  9. base URLをenvironment settingsのAPI ベース URLとする。

  10. bypassDisabledScriptingを true とする。

  11. scriptを、source、 environment settings、base URL、optionsおよび bypassDisabledScriptingを用いてクラシックスクリプトを作成する結果とする。

  12. command parameters["userActivation"]が true の場合、アクティベーション通知手順を実行する。

  13. environment settingsを用いてスクリプトを実行する準備をする。

  14. evaluation statusをScriptEvaluation(scriptの レコード)に設定する。

  15. evaluation status.[[Type]]がnormalであり、await promiseが true であり、かつIsPromise(evaluation status.[[Value]])である場合:

    1. evaluation statusをAwait(evaluation status.[[Value]])に設定する。

  16. environment settingsを用いてスクリプト実行後の後処理を行う。

  17. evaluation status.[[Type]]がthrowである場合:

    1. exception detailsを、 realm、evaluation status、result ownershipおよび sessionを用いて例外 詳細を取得する結果とする。

    2. script.EvaluationResultException 生成規則に一致し、realmフィールドがrealm idに設定され、かつ exceptionDetailsフィールドがexception detailsに設定された新しいマップを返す。

  18. 表明: evaluation status.[[Type]]はnormalである。

  19. resultを、 evaluation status.[[Value]]、serialization options、result ownership、 シリアライズ内部マップとしての新しいマップ、realmおよび sessionを用いてリモート値として シリアライズする結果とする。

  20. script.EvaluationResultSuccess 生成規則に一致し、realmフィールドがrealm idに設定され、かつ resultフィールドがresultに設定された新しいマップを返す。

7.6.4.5. script.getRealms コマンド

script.getRealms コマンドは、すべての Realm のリストを返し、オプションで特定の型の Realm、または navigable の アクティブな文書に関連付けられた Realm に絞り込むことができる。

コマンド型
script.GetRealms = (
  method: "script.getRealms",
  params: script.GetRealmsParameters
)

script.GetRealmsParameters = {
  ? context: browsingContext.BrowsingContext,
  ? type: script.RealmType,
}
戻り値の型
script.GetRealmsResult = {
  realms: [*script.RealmInfo]
}
session および command parameters を用いる リモートエンド手順は次のとおりである:
  1. environment settings を、環境設定オブジェクトのうち、 実行準備完了フラグが設定されているものすべての リストとする。

  2. command parameters が context を含む場合:

    1. navigable を、command parameters["context"] を用いて 試行して navigable を取得する 結果とする。

    2. document を navigable の アクティブな文書とする。

    3. navigable environment settings を リストとする。

    4. environment settings の各 settings について:

      1. 次の条件のいずれかが成立する場合:

        settings を navigable environment settings に付加する。

    5. environment settings を navigable environment settings に設定する。

  3. realms をリストとする。

  4. environment settings の各 settings について:

    1. realm info を、settings が与えられた場合に Realm 情報を取得する 結果とする。

    2. command parameters が type を含み、かつ realm info["type"] が command parameters["type"] と等しくない場合、続行する。

    3. realm info が null でない場合、realm info を realms に付加する。

  5. body を、realms フィールドが realms に設定された script.GetRealmsResult 生成規則に一致する マップ とする。

  6. データ body とともに 成功を返す。

これを拡張して、 例えばネストされた Worker の Realm の親も許可するか? またはすべての祖先 Worker を取得するか。

単なる リテラル一致よりも高度なフィルターシステムが必要になる可能性がある。

7.6.4.6. script.removePreloadScript コマンド

script.removePreloadScript コマンドは、 プリロードスクリプトを削除する。

コマンド型
script.RemovePreloadScript = (
  method: "script.removePreloadScript",
  params: script.RemovePreloadScriptParameters
)

script.RemovePreloadScriptParameters = {
  script: script.PreloadScript
}
戻り値の型
script.RemovePreloadScriptResult = EmptyResult
session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:
  1. script を command parameters 内の "script" フィールドの値とする。

  2. preload script map を session の プリロードスクリプトマップとする。

  3. preload script map が script を 含まない 場合、 エラーを エラー コード そのようなスクリプトはないとして返す。

  4. preload script map から script を 削除する。

  5. null を返す

7.6.5. イベント

7.6.5.1. script.message イベント
イベント型
script.Message = (
  method: "script.message",
  params: script.MessageParameters
 )

script.MessageParameters = {
  channel: script.Channel,
  data: script.RemoteValue,
  source: script.Source,
}
リモートエンドイベントトリガーは、session、realm、channel properties、および message が与えられた場合の、スクリプト メッセージを発行する手順である:
  1. environment settings を、その Realm 実行コンテキストの Realm コンポーネントが realm である 環境設定オブジェクトとする。

  2. related navigables を、environment settings が与えられた場合に 関連する navigable を取得する結果とする。

  3. session、"script.message" および related navigables が与えられた場合に イベントが 有効である場合:

    1. channel properties が "serializationOptions" を 含む場合、serialization options を channel properties の serializationOptions フィールドの値とする。それ以外の場合、serialization options を、各 フィールドがデフォルト値に設定された script.SerializationOptions 生成規則に一致する マップ とする。

    2. channel properties が "ownership" を 含む場合、 ownership type を channel properties["ownership"] とする。 それ以外の場合、 ownership type を "none" とする。

    3. data を、 message、serialization options、ownership type、シリアル化 内部マップとしての新しい マップ、および realm が与えられた場合に リモート値としてシリアル化する結果とする。

    4. source を、realm を用いて ソースを取得する結果とする。

    5. params を、 channel フィールドが channel properties["channel"] に、 data フィールドが data に、source フィールドが source に設定された script.MessageParameters 生成規則に一致する マップとする。

    6. body を、params フィールドが params に設定された script.Message 生成規則に一致する マップとする。

    7. session および body を用いて イベントを 発行する。

7.6.5.2. script.realmCreated イベント
イベント型
script.RealmCreated = (
 method: "script.realmCreated",
 params: script.RealmInfo
)
リモートエンドイベントトリガーは次である:

ウィンドウ環境設定 オブジェクトを設定する、ワーカー環境設定 オブジェクトを設定する、またはワークレット環境設定 オブジェクトを設定するアルゴリズムのいずれかが呼び出されたとき、設定 オブジェクトを返す直前に:

  1. environment settingsを、新しく作成された環境設定オブジェクトとする。

  2. realm infoを、environment settingsを与えてRealm 情報を取得する結果とする。

  3. realm infoが null の場合、返る。

  4. related navigablesを、environment settingsを与えて関連する ナビゲータブルを取得する結果とする。

  5. bodyを、script.RealmCreated 生成規則に一致し、paramsフィールドがrealm infoに設定されたマップとする。

  6. "script.realmCreated"およびrelated navigablesを与えたときのイベントが有効になっている セッションの集合内の各sessionについて:

    1. sessionおよびbodyを用いてイベントを 発行する。

session、navigablesおよびinclude globalを与えたとき、リモートエンド購読手順は購読優先度 2 であり、次のとおりである:

  1. environment settingsを、実行準備完了フラグが設定されているすべての環境設定オブジェクトのリストとする。

  2. environment settingsの各settingsについて:

    1. related navigablesを新しい集合とする。

    2. settingsの 関連グローバルオブジェクトの関連付けられたDocumentがDocumentである場合:

      1. navigableをsettingsの関連グローバルオブジェクトの 関連付けられた Documentの ノードナビゲータブルとする。

      2. navigableが null の場合、続行する。

      3. top-level traversibleをnavigableのトップレベルナビゲータブルとする。

      4. top-level traversibleがnavigables内にない場合、続行する。

      5. top-level traversibleをrelated navigablesに付加する。

      そうでなければ、include globalが false の場合、続行する。

    3. realm infoを、settingsを与えてRealm 情報を取得する 結果とする。

    4. realm infoが null の場合、続行する。

    5. bodyを、script.RealmCreated 生成規則に一致し、paramsフィールドがrealm infoに設定されたマップとする。

    6. session、 "script.realmCreated"およびrelated navigablesを与えたときにイベントが 有効である場合:

      1. sessionおよびbodyを用いてイベントを 発行する。

ここでの順序は より明確に定義すべきか?

7.6.5.3. script.realmDestroyed イベント
イベント型
script.RealmDestroyed = (
  method: "script.realmDestroyed",
  params: script.RealmDestroyedParameters
)

script.RealmDestroyedParameters = {
  realm: script.Realm
}

リモートエンドイベントトリガーは次である:
documentを用いて、次の文書のアンロード時クリーンアップ手順を定義する:
  1. related navigablesを空の集合とする。

  2. documentのナビゲーション可能をrelated navigablesに付加する。

  3. documentのワークレット大域スコープ内の各worklet global scopeについて:

    1. realmを、worklet global scopeの関連するRealmとする。

    2. realm idを、realmのRealm IDとする。

    3. paramsを、 script.RealmDestroyedParameters 生成規則に一致するマップとし、realmフィールドをrealm idに設定する。

    4. bodyを、script.RealmDestroyed 生成規則に一致するマップとし、paramsフィールドをparamsに設定する。

    5. "script.realmDestroyed"およびrelated navigablesを与えたときの、イベントが有効になっている セッションの集合内の各sessionについて:

      1. sessionおよびbodyを用いてイベントを 発行する。

  4. environment settingsを、その 関連する大域オブジェクトの関連付けられたDocumentが documentである環境設定オブジェクトとする。

  5. realmを、environment settingsのRealm実行コンテキストのRealmコンポーネントとする。

  6. realm idを、realmのRealm IDとする。

  7. paramsを、 script.RealmDestroyedParameters生成規則に一致するマップとし、 realmフィールドをrealm idに設定する。

  8. bodyを、script.RealmDestroyed 生成規則に一致するマップとし、 paramsフィールドをparamsに設定する。

  9. "script.realmDestroyed"およびrelated navigablesを与えたときの、イベントが有効になっている セッションの集合内の各sessionについて:

    1. sessionおよびbodyを用いてイベントを 発行する。

ワーカーイベントループ event loopが破棄されるたびに、ワーカーが ライフサイクルの終端に達したためであるか、またはワーカーを終了するアルゴリズムによって途中で終了したためであるかにかかわらず:

  1. environment settingsを、event loopが担当イベントループである環境設定オブジェクトとする。

  2. related navigablesを、environment settingsを与えて関連する ナビゲーション可能を取得することで得られる結果とする。

  3. realmを、environment settingsの環境設定オブジェクトの Realmとする。

  4. realm idを、realmのRealm IDとする。

  5. paramsを、script.RealmDestroyedParameters 生成規則に一致するマップとし、 realmフィールドをrealm idに設定する。

  6. bodyを、script.RealmDestroyed 生成規則に一致するマップとし、 paramsフィールドをparamsに設定する。

  7. "script.realmDestroyed"およびrelated navigablesを与えたときの、イベントが有効になっている セッションの集合内の各sessionについて:

    1. sessionおよびbodyを用いてイベントを 発行する。

7.7. storage モジュール

storageモジュールは、ストレージに関連する機能および イベントを含む。

ストレージパーティションは、 ユーザーエージェントがCookieやローカルストレージなどの永続データを 編成できる名前空間である。

ストレージパーティション キーは、マップであり、ストレージパーティションを一意に識別する。

7.7.1. 定義

リモートエンド定義

StorageCommand = (
  storage.DeleteCookies //
  storage.GetCookies //
  storage.SetCookie
)

ローカルエンド定義

StorageResult = (
  storage.DeleteCookiesResult /
  storage.GetCookiesResult /
  storage.SetCookieResult
)

7.7.2. 型

7.7.2.1. storage.PartitionKey 型

ローカルエンド定義

storage.PartitionKey = {
  ? userContext: text,
  ? sourceOrigin: text,
  Extensible,
}

storage.PartitionKey型は、ストレージパーティションキーを表す。

次の標準ストレージパーティションキー属性の表は、 よく知られた意味を持つ属性を列挙し、リモートエンドが サポートすることを選択できる。実装は追加の拡張ストレージパーティションキー属性を定義してもよい。

属性 定義
"userContext" ユーザーコンテキスト ID
"sourceOrigin" ストレージパーティションにアクセスできるリソースのorigin の直列化

リモートエンドは、任意の数の拡張ストレージパーティションキー 属性をサポートしてもよい。他の実装との競合を避けるため、これらの 属性は、ベンダーおよびユーザーエージェントの一意な識別子で始まり、 その後に U+003A (:) が続かなければならない。

リモートエンドは、0 個以上のエントリーを含むストレージ パーティション キー属性のデフォルト値のマップを持つ。各キーは、 ストレージパーティション キーが標準ストレージパーティションに対応する場合は、標準ストレージパーティションキー 属性の表のメンバーでなければならず、対応しない場合は 拡張ストレージパーティションキー属性 でなければならない。また、その値は、 ユーザーが明示的な値を提供しない場合に使用される、そのパーティションキーのデフォルト値を表す。正確なエントリーは 実装定義であり、実装が採用するストレージパーティショニングによって決定される。

リモートエンドは、0 個以上のエントリーを含む必須パーティションキー 属性のリストを持つ。各キーは、 ストレージパーティション キーが標準ストレージパーティションに対応する場合は、標準ストレージパーティションキー 属性の表のメンバーでなければならず、対応しない場合は 拡張ストレージパーティションキー属性 でなければならない。正確な エントリーは実装定義であり、実装が採用するストレージ パーティショニングによって決定される。このリストには、デフォルトが利用できないパーティション キーのみが含まれる。そのため、このリストは、ストレージパーティション キー属性のデフォルト値のキーといかなる エントリーも共有してはならない。

filter が与えられた場合に フィルターを デシリアライズするには:
  1. deserialized filter を空の マップとする。

  2. filter 内の各 name → value について:

    1. deserialized name を、Cookie 変換用の表において JSON キー name に対応するフィールド名とする。

    2. name が "value" の場合、deserialized value を value を用いて プロトコルバイトをデシリアライズする結果に設定し、 それ以外の場合、deserialized value を value とする。

    3. deserialized filter[deserialized name] を deserialized value に 設定する。

  3. deserialized filter を返す。

partition spec が与えられた場合に ストレージ パーティション仕様を展開するには:
  1. partition spec が null の場合:

    1. partition spec を空の マップに設定する。

  2. それ以外の場合、partition spec["type"] が "context" の場合:

    1. navigable を、partition spec["context"] が与えられた場合に 試行して navigable を 取得する結果とする。

    2. partition key を navigable の 関連付けられたストレージパーティションの キーとする。

    3. データ partition key とともに 成功を返す。

  3. partition key を空の マップとする。

  4. ストレージ パーティションキー属性のデフォルト値内の各 name → default value について:

    1. value を、partition spec[name] が 存在する場合はその値、それ以外の場合は default value とする。

    2. partition key[name] を value に 設定する。

  5. リモートエンドの 必須パーティションキー属性内の各 name について:

    1. partition spec[name] が 存在する場合:

      1. partition key][name] を partition spec[name] に 設定する。

    2. それ以外の場合:

      1. エラーを エラーコード 指定不足のストレージ パーティションとして返す。

  6. データ partition key とともに 成功を返す。

storage partition key が与えられた場合に Cookie ストアを取得するには:
  1. storage partition key が既存の ストレージパーティションを一意に識別する場合:

    1. store を、その ストレージパーティションの Cookie ストアとする。

    2. データ store とともに 成功を返す。

  2. エラーを エラー コード そのようなストレージパーティションはないとして返す。

stored cookie および filter が与えられた場合に Cookie を照合するには:
  1. filter 内の各 name → value について:

    1. stored cookie[name] が value と等しくない場合:

      1. false を返す。

  2. true を返す。

cookie store および filter が与えられた場合に 一致する Cookie を取得するには:
  1. cookies を新しいリストとする。

  2. deserialized filter を、filter を用いて フィルターをデシリアライズする結果に設定する。

  3. cookie store 内の各 stored cookie について:

    1. stored cookie および deserialized filter を用いて Cookie を 照合する結果が true の場合:

      1. stored cookie を cookies に付加する。

  4. cookies を返す。

7.7.3. コマンド

7.7.3.1. storage.getCookies コマンド

storage.getCookiesコマンドは、提供された一連のパラメーターと一致する 0 個以上のCookieを 取得する。

コマンド型
storage.GetCookies = (
  method: "storage.getCookies",
  params: storage.GetCookiesParameters
)


storage.CookieFilter = {
  ? name: text,
  ? value: network.BytesValue,
  ? domain: text,
  ? path: text,
  ? size: js-uint,
  ? httpOnly: bool,
  ? secure: bool,
  ? sameSite: network.SameSite,
  ? expiry: js-uint,
  Extensible,
}

storage.BrowsingContextPartitionDescriptor = {
  type: "context",
  context: browsingContext.BrowsingContext
}

storage.StorageKeyPartitionDescriptor = {
  type: "storageKey",
  ? userContext: text,
  ? sourceOrigin: text,
  Extensible,
}

storage.PartitionDescriptor = (
  storage.BrowsingContextPartitionDescriptor /
  storage.StorageKeyPartitionDescriptor
)

storage.GetCookiesParameters = {
  ? filter: storage.CookieFilter,
  ? partition: storage.PartitionDescriptor,
}
戻り値型
storage.GetCookiesResult = {
  cookies: [*network.Cookie],
  partitionKey: storage.PartitionKey,
}
session および command parameters を用いる リモートエンド手順は次のとおりである:
  1. filter を、command parameters の filter フィールドが存在する場合はその値、 存在しない場合は空の マップとする。

  2. partition spec を、 command parameters の partition フィールドが存在する場合はその値、存在しない場合は null とする。

  3. partition key を、partition spec を用いて 試行して ストレージパーティション仕様を展開する結果とする。

  4. store を、partition key を用いて 試行して Cookie ストアを取得する結果とする。

  5. cookies を、store および filter を用いて 一致する Cookie を取得する結果とする。

  6. serialized cookies を新しいリストとする。

  7. cookies 内の各 cookie について:

    1. serialized cookie を、cookie が与えられた場合に Cookie をシリアル化する結果とする。

    2. serialized cookie を serialized cookies に付加する。

  8. body を、cookies フィールドが serialized cookies に、 partitionKey フィールドが partition key に設定された storage.GetCookiesResult 生成規則に一致する マップ とする。

  9. データ body とともに 成功を返す。

7.7.3.2. storage.setCookie コマンド

storage.setCookieコマンドは、Cookie ストア内に新しいCookieを作成し、 [COOKIES]に従って一致する そのストア内の任意の Cookie を置き換える。

コマンド型
storage.SetCookie = (
  method: "storage.setCookie",
  params: storage.SetCookieParameters,
)


storage.PartialCookie = {
  name: text,
  value: network.BytesValue,
  domain: text,
  ? path: text,
  ? httpOnly: bool,
  ? secure: bool,
  ? sameSite: network.SameSite,
  ? expiry: js-uint,
  Extensible,
}

storage.SetCookieParameters = {
  cookie: storage.PartialCookie,
  ? partition: storage.PartitionDescriptor,
}
戻り値型
storage.SetCookieResult = {
  partitionKey: storage.PartitionKey
}
session および command parameters を用いる リモートエンド手順は次のとおりである:
  1. cookie spec を command parameters の cookie フィールドの値とする。

  2. partition spec を、 command parameters の partition フィールドが存在する場合はその値、存在しない場合は null とする。

  3. partition key を、partition spec を用いて 試行して ストレージパーティション仕様を展開する結果とする。

  4. store を、partition key を用いて 試行して Cookie ストアを取得する結果とする。

  5. deserialized value を、 cookie spec["value"] を用いて プロトコルバイトをデシリアライズする結果とする。

  6. store に、Cookie 名 cookie spec["name"]、 Cookie 値 deserialized value、Cookie ドメイン cookie spec["domain"]、および Cookie 変換用の表に列挙されている 次の Cookie 概念の属性値リストを使用して、Cookie を作成する:

    Cookie パス

    cookie spec["path"] が存在する場合はその値、それ以外の場合は "/"。

    Cookie の secure-only

    cookie spec["secure"] が存在する場合はその値、それ以外の場合は false。

    Cookie の HTTP-only

    cookie spec["httpOnly"] が存在する場合はその値、それ以外の場合は false。

    Cookie の有効期限

    cookie spec["expiry"] が存在する場合はその値、それ以外の場合は、これがセッション Cookie であることを示すため 未設定のままにする。

    注: Cookie の有効期限値は、 Cookie の有効期間制限に従って、リモートエンドによって制限される場合がある。

    Cookie の same-site

    cookie spec["sameSite"] が存在する場合はその値、それ以外の場合は、same-site ポリシーが定義されていないことを示すため 未設定のままにする。

    この手順が Cookie ストアに Cookie を挿入せずに中止された場合、 エラーを エラー コード Cookie を設定できないとして返す。

  7. body を、partitionKey フィールドが partition key に設定された storage.SetCookieResult 生成規則に一致する マップ とする。

  8. データ body とともに 成功を返す。

7.7.3.3. storage.deleteCookies コマンド

storage.deleteCookiesコマンドは、提供された一連の パラメーターと一致する 0 個以上のCookieを除去する。

コマンド型
storage.DeleteCookies = (
  method: "storage.deleteCookies",
  params: storage.DeleteCookiesParameters,
)

storage.DeleteCookiesParameters = {
  ? filter: storage.CookieFilter,
  ? partition: storage.PartitionDescriptor,
}
戻り値型
storage.DeleteCookiesResult = {
  partitionKey: storage.PartitionKey
}
session および command parameters を用いる リモートエンド手順は次のとおりである:
  1. filter を command parameters の filter フィールドが存在する場合はその値、 存在しない場合は空の マップとする。

  2. partition spec を command parameters の partition フィールドが存在する場合はその値、存在しない場合は null とする。

  3. partition key を、partition spec を用いて 試行して ストレージパーティション仕様を展開する結果とする。

  4. store を、partition key を用いて 試行して Cookie ストアを取得する結果とする。

  5. cookies を、store および filter を用いて 一致する Cookie を取得する結果とする。

  6. cookies 内の各 cookie について:

    1. cookie を store から削除する。

  7. body を、partitionKey フィールドが partition key に設定された storage.DeleteCookiesResult 生成規則に一致する マップ とする。

  8. データ body とともに 成功を返す。

7.8. log モジュール

logモジュールは、ログ記録に関連する機能およびイベントを含む。

BiDi セッションは、ログイベントバッファを持つ。これは、 navigable IDから、そのコンテキストでまだ 発火されていないログイベントのリストへのマップである。ユーザーエージェントは、このバッファに最大サイズを課してもよい。ただし、 イベント A と B が同じコンテキスト内で発生し、A が B より前に発生し、かつ両方がバッファに追加された場合、 B のエントリは A のエントリより先に除去されてはならないという条件に従う。

session、navigablesおよびeventが与えられたとき、ログイベントを バッファするには:

  1. bufferを、sessionのログイベントバッファとする。

  2. navigable idsを新しいリストとする。

  3. navigablesの各navigableについて:

    1. navigableのnavigable IDを navigable idsに付加する。

  4. navigable ids内の各navigable idについて:

    1. other navigablesを空のリストとする

    2. navigable ids内の各other idについて:

    3. other idがnavigable idと等しくない場合、other idをother navigablesに付加する。

    4. bufferがnavigable idを含まない場合、 buffer[navigable id]を新しいリストとする。

    5. (event, other navigables)を buffer[navigable id]に付加する。

注記: 各イベントが 1 回だけ発火されるようにするため、 ここで他の navigable を保存する。実際には、これは複数の navigable と関連付けられ得る worker にのみ関係する。

これを browsing context またはトップレベル辿可能のどちらに キー付けするべきか? 違いは、イベントがフレーム内で発生し、その後ローカルエンドがトップレベル navigable のログイベントを購読する前に そのフレームがナビゲートされた場合に何が起こるかにある。

7.8.1. 定義

ローカルエンド定義

LogEvent = (
  log.EntryAdded
)

7.8.2. 型

7.8.2.1. log.LogEntry

ローカルエンド定義

log.Level = "debug" / "info" / "warn" / "error"

log.Entry = (
  log.GenericLogEntry /
  log.ConsoleLogEntry /
  log.JavascriptLogEntry
)

log.BaseLogEntry = (
  level: log.Level,
  source: script.Source,
  text: text / null,
  timestamp: js-uint,
  ? stackTrace: script.StackTrace,
)

log.GenericLogEntry = {
  log.BaseLogEntry,
  type: text,
}

log.ConsoleLogEntry = {
  log.BaseLogEntry,
  type: "console",
  method: text,
  args: [*script.RemoteValue],
}

log.JavascriptLogEntry = {
  log.BaseLogEntry,
  type: "javascript",
}

各ログイベントはlog.Entryオブジェクトにより表される。これは、 追加されたログエントリの型を表すtypeプロパティ、重大度を表す levelプロパティ、ログエントリの発生源を表すsource プロパティ、ログメッセージ文字列そのものを持つtextプロパティ、および ログエントリが生成された時刻に対応するtimestampプロパティを持つ。 log.Entryの特定の変種は、異なる発生源からのログを表すために使用され、 エントリ型に固有の追加フィールドを提供する。

7.8.3. イベント

7.8.3.1. log.entryAdded イベント
イベント型
log.EntryAdded = (
 method: "log.entryAdded",
 params: log.Entry,
)

リモートエンドイベントトリガーは次である:

次のコンソール 手順をmethod、args、および optionsを用いて定義する:

  1. アクティブな BiDi セッション内の各sessionについて:

    1. methodが"error"または"assert"である場合、 levelを "error"とする。methodが"debug"または "trace"である場合、 levelを"debug"とする。methodが "warn"である場合、 levelを"warn"とする。そうでなければlevelを "info"とする。

    2. timestampを、UTC での現在の 日付と時刻を表す時間値とする。

    3. textを空文字列とする。

    4. Type(args[0])が String であり、かつargs[0]が 書式指定子を含む場合、formatted argsをFormatter(args)とする。そうでなければ、 formatted argsをargsとする。

      注記: Formatter 操作は Console 仕様で十分に定義されておらず、 書式設定は異なる実装間で一貫しない場合がある。

    5. formatted args内の各argについて:

      1. argがargs内の最初のエントリーでない場合、U+0020 SPACE をtextに付加する。

      2. argがプリミティブ ECMAScript 値である場合、ToString(arg)を textに付加する。そうでなければ、実装定義の文字列を textに付加する。

    6. realmを現在の Realm RecordのRealm IDとする。

    7. serialized argsを新しいリストとする。

    8. serialization optionsを、 script.SerializationOptions生成規則に一致し、フィールドが それぞれのデフォルト値に設定されたマップとする。

    9. argsの各argについて:

      1. serialized argを、 値としてarg、serialization options、所有権タイプとしてnone、 シリアライズ内部マップとして新しいマップ、 realmおよび sessionを用いてリモート値としてシリアライズする結果とする。

      2. serialized argをserialized argsに追加する。

    10. sourceを、現在の Realm Recordを与えてソースを取得する結果とする。

    11. stackを現在のスタックトレースとする。

    12. entryを、log.ConsoleLogEntry 生成規則に一致し、 levelフィールドがlevelに、text フィールドがtextに、timestampフィールドが timestampに、 stackTraceフィールドがstackに、methodフィールドが methodに、 sourceフィールドがsourceに、 かつargsフィールドがserialized argsに設定されたマップとする。

    13. bodyを、log.EntryAdded 生成規則に一致し、 paramsフィールドがentryに設定されたマップとする。

    14. settingsを現在の設定オブジェクトとする

    15. related navigablesを、settingsを与えて関連する ナビゲータブルを取得する結果とする。

    16. session、"log.entryAdded"および related navigablesを用いてイベントが 有効である場合、sessionおよび bodyを用いてイベントを発行する。

      そうでなければ、session、 related browsing contexts、およびbodyを用いてログイベントをバッファリングする。

引数script、 line number、column number、messageおよび handledを用いて、次のエラー報告手順を定義する:

  1. handledが true の場合、返る。

  2. settingsをscriptの設定オブジェクトとする。

  3. timestampを、UTC での現在の日付 と時刻を表す時間値とする。

  4. stackを、報告されているエラーに対応する 例外を用いた例外のスタックトレースとする。

  5. sourceを、現在の Realm Recordを与えてソースを取得する結果とする。

  6. entryを、log.JavascriptLogEntry生成規則に一致し、 levelが"error"に、textが messageに、sourceがsourceに、timestampが timestampに設定され、かつstackTraceフィールドがstackに設定されたマップとする。

  7. bodyを、log.EntryAdded生成規則に一致し、 paramsフィールドがentryに設定されたマップとする。

  8. related navigablesを、settingsを与えて関連する ナビゲータブルを取得する結果とする。

  9. アクティブな BiDi セッション内の各sessionについて:

    1. session、"log.entryAdded"および related navigablesを用いてイベントが 有効である場合、sessionおよび bodyを用いてイベントを発行する。

      そうでなければ、session、 related browsing contexts、およびbodyを用いてログイベントをバッファリングする。

ロギングを 必要とするものはさらに多数ある。CDP には LogEntryAdded の型として xml、 javascript、network、storage、appcache、rendering、security、deprecation、 worker、violation、intervention、recommendation、other がある。これらは、異なるメソッドで表現される js 例外および Console API の型に加えて存在する。

実装定義のログ型を許可する

session、navigablesおよびinclude globalを与えたときのリモートエンド購読手順は、購読優先度 10 であり、次のとおりである:

  1. sessionのログイベント バッファ内の各navigable id → eventsについて:

    1. maybe contextを、navigable idを与えてナビゲータブルを取得した結果とする。

    2. maybe contextがエラーである場合、 navigable idをログイベントバッファから削除して続行する。

    3. navigableをmaybe contextのデータとする

    4. top level navigableをnavigableのトップレベルナビゲータブルとする。

    5. include globalが true であり、かつtop level navigableが navigables内にない場合、 またはinclude globalが false であり、かつtop level navigableが navigables内にある場合:

      1. events内の各(event, other navigables)について:

        1. sessionおよびeventを用いてイベントを発行する。

        2. other navigables内の各other context idについて:

          1. ログイベントバッファが other context idを含む場合、eventを ログイベント バッファ[other context id]から削除する。

7.9. input モジュール

inputモジュールは、 シミュレートされたユーザー入力のための機能を含む。

7.9.1. 定義

リモートエンド定義

InputCommand = (
  input.PerformActions //
  input.ReleaseActions //
  input.SetFiles
)
InputResult = (
  input.PerformActionsResult /
  input.ReleaseActionsResult /
  input.SetFilesResult
)

ローカルエンド定義

InputEvent = (
  input.FileDialogOpened
)

7.9.2. 型

7.9.2.1. input.ElementOrigin

input.ElementOrigin型は、座標原点として使用されるElementを表す。

input.ElementOrigin = {
  type: "element",
  element: script.SharedReference
}
objectが与えられたときのis input.ElementOrigin手順は次のとおりである:
  1. objectがinput.ElementOrigin 生成規則に一致するマップである場合、 true を返す。

  2. false を返す。

input.ElementOrigin から Element を取得する 手順は、session が与えられた場合、次のとおりである:
  1. origin および navigable が与えられた場合、次の手順を返す:

    1. 表明:origin は input.ElementOrigin に一致する。

    2. document を navigable の アクティブな文書とする。

    3. reference を origin["element"] とする

    4. environment settings を、その 関連グローバルオブジェクトの 関連付けられた Document が document である 環境設定オブジェクトとする。

    5. realm を environment settings の Realm 実行コンテキストの Realm コンポーネントとする。

    6. element を、reference、realm、および session を用いて 試行 して リモート参照をデシリアライズする 結果とする。

    7. element が Element を実装していない場合、エラーを エラーコード そのような要素はないとして返す。

    8. データ element とともに 成功を返す。

7.9.3. コマンド

7.9.3.1. input.performActions コマンド

input.performActions コマンドは、 指定された user input actions の sequence を実行する。

注: このコマンドの動作の詳細な説明については、 actions section of [WEBDRIVER] を参照すること。

コマンド型
input.PerformActions = (
  method: "input.performActions",
  params: input.PerformActionsParameters
)

input.PerformActionsParameters = {
  context: browsingContext.BrowsingContext,
  actions: [*input.SourceActions]
}

input.SourceActions = (
  input.NoneSourceActions /
  input.KeySourceActions /
  input.PointerSourceActions /
  input.WheelSourceActions
)

input.NoneSourceActions = {
  type: "none",
  id: text,
  actions: [*input.NoneSourceAction]
}

input.NoneSourceAction = input.PauseAction

input.KeySourceActions = {
  type: "key",
  id: text,
  actions: [*input.KeySourceAction]
}

input.KeySourceAction = (
  input.PauseAction /
  input.KeyDownAction /
  input.KeyUpAction
)

input.PointerSourceActions = {
  type: "pointer",
  id: text,
  ? parameters: input.PointerParameters,
  actions: [*input.PointerSourceAction]
}

input.PointerType = "mouse" / "pen" / "touch"

input.PointerParameters = {
  ? pointerType: input.PointerType .default "mouse"
}

input.PointerSourceAction = (
  input.PauseAction /
  input.PointerDownAction /
  input.PointerUpAction /
  input.PointerMoveAction
)

input.WheelSourceActions = {
  type: "wheel",
  id: text,
  actions: [*input.WheelSourceAction]
}

input.WheelSourceAction = (
  input.PauseAction /
  input.WheelScrollAction
)

input.PauseAction = {
  type: "pause",
  ? duration: js-uint
}

input.KeyDownAction = {
  type: "keyDown",
  value: text
}

input.KeyUpAction = {
  type: "keyUp",
  value: text
}

input.PointerUpAction = {
  type: "pointerUp",
  button: js-uint,
}

input.PointerDownAction = {
  type: "pointerDown",
  button: js-uint,
  input.PointerCommonProperties
}

input.PointerMoveAction = {
  type: "pointerMove",
  x: float,
  y: float,
  ? duration: js-uint,
  ? origin: input.Origin,
  input.PointerCommonProperties
}

input.WheelScrollAction = {
  type: "scroll",
  x: js-int,
  y: js-int,
  deltaX: js-int,
  deltaY: js-int,
  ? duration: js-uint,
  ? origin: input.Origin .default "viewport",
}

input.PointerCommonProperties = (
  ? width: js-uint,
  ? height: js-uint,
  ? pressure: (0.0..1.0),
  ? tangentialPressure: (-1.0..1.0),
  ? twist: (0..359),
  ; 0 .. Math.PI / 2
  ? altitudeAngle: (0.0..1.5707963267948966),
  ; 0 .. 2 * Math.PI
  ? azimuthAngle: (0.0..6.283185307179586),
)

input.Origin = "viewport" / "pointer" / input.ElementOrigin
返却型
input.PerformActionsResult = EmptyResult

session および command parameters を用いる リモートエンド手順は次のとおりである:

  1. navigable id を command parameters の context フィールドの値とする。

  2. navigable を、navigable id を用いて 試行して navigable を 取得する 結果とする。

  3. input state を、session および navigable の トップレベル traversable を用いて 入力状態を取得する結果とする。

  4. actions options を新しい アクションオプションとし、要素オリジンである手順を input.ElementOrigin であるに設定し、 要素オリジンを取得する手順を、session が与えられた場合の input.ElementOrigin から Element を取得する 手順の結果に設定する。

  5. actions by tick を、input state、command parameters、および actions options を用いて アクションシーケンスを抽出することを試行した結果とする。

  6. input state、 actions by tick、 navigable、および actions options を用いて 試行して アクションをディスパッチする。

  7. データ null とともに 成功を返す。

7.9.3.2. input.releaseActions コマンド

input.releaseActionsコマンドは、現在のセッションに関連付けられた入力 状態をリセットする。

コマンド型
input.ReleaseActions = (
  method: "input.releaseActions",
  params: input.ReleaseActionsParameters
)

input.ReleaseActionsParameters = {
  context: browsingContext.BrowsingContext,
}
戻り値型
input.ReleaseActionsResult = EmptyResult

session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:

  1. navigable id を command parameters の context フィールドの値とする。

  2. navigable を、navigable id を用いて 試行して navigable を 取得する 結果とする。

  3. top-level traversable を navigable の トップレベル traversable とする。

  4. input state を、session および top-level traversable を用いて 入力状態を取得する結果とする。

  5. actions options を新しい アクションオプションとし、要素オリジンである手順を input.ElementOrigin であるに設定し、 要素オリジンを取得する手順を、session が与えられた場合の input.ElementOrigin から Element を取得する 手順に設定する。

  6. undo actions を input state の 入力キャンセルリストを逆順にしたものとする。

  7. undo actions、0、navigable、および actions options を用いて 試行して tick アクションをディスパッチする。

  8. session および top-level traversable を用いて 入力状態をリセットする。

  9. データ null とともに 成功を返す。

7.9.3.3. input.setFiles コマンド

input.setFilesコマンドは、与えられた file型のinput要素のfilesプロパティを ファイルパスの集合に設定する。

コマンド型
input.SetFiles = (
  method: "input.setFiles",
  params: input.SetFilesParameters
)

input.SetFilesParameters = {
  context: browsingContext.BrowsingContext,
  element: script.SharedReference,
  files: [*text]
}
戻り値型
input.SetFilesResult = EmptyResult

session および command parameters が与えられた場合の リモートエンド手順は次のとおりである:

  1. navigable id を command parameters["context"] フィールドの値とする。

  2. navigable を、navigable id を用いて 試行して navigable を 取得する結果とする。

  3. document を navigable の アクティブな文書とする。

  4. environment settings を、その 関連グローバルオブジェクトの 関連付けられた Document が document である 環境設定オブジェクトとする。

  5. realm を environment settings の Realm 実行コンテキストの Realm コンポーネントとする。

  6. element を、command parameters["element"]、realm、および session を用いて 試行して リモート参照をデシリアライズする 結果とする。

  7. element が Element を実装していない場合、 エラーを エラー コード そのような要素はないとして返す。

  8. element が HTMLInputElement を実装していない、element の type が ファイルアップロード状態でない、または element が 無効である場合、 エラーを エラー コード ファイル入力を設定できないとして返す。

  9. files の サイズが 1 より大きく、かつ element の multiple 属性が設定されていない場合、エラーを エラーコード ファイル入力を設定できないとして返す。

  10. files を command parameters["files"] フィールドの値とする。

  11. selected files を element の 選択されたファイルとする。

  12. files と selected files の 共通部分の サイズが selected files の サイズと等しく、かつ files の サイズとも等しい場合、element が与えられた場合に ユーザーインタラクションタスクソース上で 要素タスクをキューに入れ、element において cancel という名前のイベントを発火し、 bubbles 属性を true に初期化する。

    注: ブラウザーでのキャンセルは通常、 ファイル選択の変更によって決定される。つまり、変更がない場合は "cancel" イベントが送信される。

  13. それ以外の場合、files をユーザーの選択として element の ファイル選択を更新する。

  14. 何らかの理由で、リモートエンドが element の 選択されたファイルを files で指定されたパスのファイルに設定できない場合、 エラーコード サポートされていない操作でエラーを返す。

    注: 例えば、リモートエンドは 現在ファイルシステム上に存在しないファイルを 選択されたファイルとして設定できない場合がある。

  15. データ null とともに 成功を返す。

7.9.4. イベント

7.9.4.1. input.fileDialogOpened イベント
イベント型
input.FileDialogOpened = (
   method: "input.fileDialogOpened",
   params: input.FileDialogInfo
)

input.FileDialogInfo = {
   context: browsingContext.BrowsingContext,
   ? userContext: browser.UserContext,
   ? element: script.SharedReference,
   multiple: bool,
}

WebDriver BiDi ファイルピッカーオプションは、multipleという名前の項目を持つ構造体であり、 これは真偽値である。

リモートエンドイベントトリガーは、 要素 element および オプションの WebDriver BiDi ファイルピッカーオプション file picker options(デフォルト:null)が与えられた場合の、WebDriver BiDi ファイルダイアログが開かれた手順である:

注: 他のユーザープロンプトハンドラーとは異なり、デフォルトの 動作ではファイルダイアログを 開くことが許可される。

  1. navigable を、element の ノード文書の navigable とする。

  2. navigable id を navigable の navigable ID とする。

  3. user context id を、navigable の 関連付けられたユーザー コンテキストの ユーザー コンテキスト ID とする。

  4. multiple を false とする。

  5. element が null でなく、かつ element の multiple 属性が設定されている場合、 multiple を true に設定する。

  6. file picker options が null でなく、かつ file picker options の multiple が true の場合、 multiple を true に設定する。

  7. related navigables を、navigable を含む 集合 とする。

  8. "input.fileDialogOpened" および related navigables が与えられた場合の イベントが有効であるセッションの 集合内の各 session について:

    1. params を、context フィールドが navigable id に、 userContext フィールドが user context id に、 multiple フィールドが multiple に設定された input.FileDialogInfo 生成規則に一致する マップとする。

    2. element が null でない場合:

      1. shared id を、element および session を用いて ノードの 共有 ID を取得する結果とする。

      2. params["element"] を shared id に設定する。

    3. body を、params フィールドが params に設定された input.fileDialogOpened 生成規則に一致する マップとする。

    4. session および body を用いて イベントを 発行する。

  9. dismissed を false とする。

  10. アクティブな BiDi セッション内の各 session について:

    1. user prompt handler を session の ユーザープロンプトハンドラーとする。

    2. user prompt handler が null でない場合:

    3. 表明:user prompt handler は マップである。

    4. user prompt handler が "file" を 含む場合:

      1. user prompt handler["file"] が "ignore" と等しくない場合、dismissed を true に設定する。

    5. それ以外の場合、user prompt handler が "default" を 含み、かつ user prompt handler["default"] が "ignore" と等しくない場合、dismissed を true に設定する。

  11. dismissed を返す。

7.10. webExtension モジュール

webExtension モジュールは、web extensions の管理およびそれらとの interaction のための機能を含む。

7.10.1. 定義

リモートエンド定義

WebExtensionCommand = (
  webExtension.Install //
  webExtension.Uninstall
)

ローカルエンド定義

WebExtensionResult = (
  webExtension.InstallResult /
  webExtension.UninstallResult
)

7.10.2. 型

7.10.2.1. webExtension.Extension 型
webExtension.Extension = text

webExtension.Extension型は、リモートエンド内の Web 拡張機能 ID を表す。

7.10.3. コマンド

7.10.3.1. webExtension.install コマンド

The webExtension.install コマンドは、リモートエンドに Web 拡張機能をインストールする。

コマンド型
webExtension.Install = (
   method: "webExtension.install",
   params: webExtension.InstallParameters
)

webExtension.InstallParameters = {
   extensionData: webExtension.ExtensionData,
}

webExtension.ExtensionData = (
   webExtension.ExtensionArchivePath /
   webExtension.ExtensionBase64Encoded /
   webExtension.ExtensionPath
)

webExtension.ExtensionPath = {
   type: "path",
   path: text,
}

webExtension.ExtensionArchivePath = {
   type: "archivePath",
   path: text,
}

webExtension.ExtensionBase64Encoded = {
   type: "base64",
   value: text,
}
戻り値の型
webExtension.InstallResult = {
  extension: webExtension.Extension
}
bytes が与えられた場合に zip アーカイブを展開するには:
  1. zip 圧縮アルゴリズムを使用して bytes をデコードするための実装定義の手順を実行する。 TODO: zip デコードについて、より適切な参照を見つける。

  2. 前の手順が失敗した場合(例えば、bytes が有効な zip 圧縮 データを表していなかったため)、エラーコード 無効な Web 拡張機能で エラーを返す。それ以外の場合、entry を、展開されたファイルシステムエントリーを含む ディレクトリエントリー とする。

  3. entry を返す。

extension data spec が与えられた場合に Web 拡張機能データ仕様を展開するには:
  1. type を extension data spec["type"] とする。

  2. type を使用した Web 拡張機能のインストールがサポートされていない場合、エラーを エラー コード サポートされていない操作として返す。

  3. 次の条件とそれに対応する手順のリストにおいて、 対応する条件が true となる最初の手順の組を実行する:

    type が文字列 "path" である
    1. path を extension data spec["path"] とする。

    2. locator を、パス path と、ファイル システムのルートに対応する ルートを持つ ディレクトリロケーターとする。

    3. entry を、locator が与えられた場合に エントリーを特定する結果とする。

    type が文字列 "archivePath" である
    1. archive path を extension data spec["path"] とする。

    2. locator を、パス archive path と、ファイル システムのルートに対応する ルートを持つ ファイルロケーターとする。

    3. archive entry を、locator が与えられた場合に エントリーを特定する結果とする。

    4. archive entry が null の場合、null を返す。

    5. bytes を archive entry の バイナリデータとする。

    6. entry を、bytes が与えられた場合に 試行して zip アーカイブを展開する結果とする。

    type が文字列 "base64" である
    1. bytes を extension data spec["value"] を 寛容な base64 デコード した結果とする。

    2. bytes が失敗の場合、null を返す。

    3. entry を、bytes が与えられた場合に 試行して zip アーカイブを展開する結果とする。

  4. entry を返す。

command parameters を用いる リモートエンド手順は次のとおりである:
  1. Web 拡張機能のインストールがサポートされていない場合、エラー コード サポートされていない操作で エラーを返す。

  2. extension data spec を command parameters["extensionData"] とする。

  3. extension directory entry を、extension data spec を用いて 試行して Web 拡張機能データ仕様を展開する結果とする。

  4. extension directory entry が null の場合、エラーを エラーコード 無効な Web 拡張機能として返す。

  5. extension directory entry から Web 拡張機能をインストールするための実装定義の手順を実行する。これが失敗した場合、エラーを エラーコード 無効な Web 拡張機能として返す。それ以外の場合、extension id を新しく インストールされた Web 拡張機能の一意な識別子とする。

  6. result を、 extension フィールドが extension id に設定された webExtension.InstallResult 生成規則に一致する マップ とする。

  7. データ result とともに 成功を返す。

注記: ブラウザーは既定で Web 拡張機能を一時的にのみ インストールする場合があるため、 次回終了時に自動的にアンインストールされることがある。

7.10.3.2. webExtension.uninstall コマンド

webExtension.uninstall コマンドは、 リモートエンドの Web 拡張機能をアンインストールする。

コマンド型
webExtension.Uninstall = (
   method: "webExtension.uninstall",
   params: webExtension.UninstallParameters
)

webExtension.UninstallParameters = {
   extension: webExtension.Extension,
}
戻り値の型
webExtension.UninstallResult = EmptyResult
command parameters を用いる リモートエンド手順は次のとおりである:
  1. extension を command parameters["extension"] とする。

  2. リモートエンドに ID が extension と等しい Web 拡張機能がない場合、エラーを エラーコード そのような Web 拡張機能はないとして返す。

  3. リモートエンドから Web 拡張機能を削除するための実装定義の手順を実行する。これが失敗した場合、エラーを エラーコード 不明なエラーとして返す。

  4. データ null とともに 成功を返す。

8. 他の仕様へのパッチ

この仕様は、必要な integration points を提供するため、外部仕様へのいくつかの変更を必要とする。 これらの patches は standards process の一部として他の仕様へ commit されるものと想定される。

8.1. HTML

report an error algorithm は、末尾に追加の step を加えて変更される:

  1. 外部仕様で定義された任意の error reporting steps を、script, line, col, message, および error が handled であれば true、そうでなければ false とともに呼び出す。

8.2. Console

他の仕様は console steps を定義できる。

  1. Printer operation が arguments name, printerArgs および options(argument が提供されない場合は undefined) とともに呼び出される時点で、外部仕様で定義された任意の console steps を arguments name, printerArgs, および options とともに呼び出す。

8.3. CSS

8.3.1. デバイスピクセル比を決定する

determine the device pixel ratio algorithm の先頭に、 次の steps を挿入する:

  1. デバイスピクセル比オーバーライドがwindowのナビゲータブルを含む場合、デバイスピクセル 比オーバーライド[windowのナビゲータブル]を返す。

8.3.2. メディアクエリの評価

https://github.com/w3c/csswg-drafts/pull/13549 がマージされた後に削除する。

[メディア 特性を評価するアルゴリズムは、WebDriver BiDi オーバーライドをサポートするように変更される。「指定されたメディア特性を評価した結果を結果とする」という手順を次に置き換える:

与えられたDocument document内のメディア 特性 media featureを評価した結果を取得するには:
  1. media feature nameをmedia featureのmf-nameとする。

  2. emulated valueを、 documentおよびmedia feature nameに対するWebDriver BiDi メディア特性値を取得した結果とする。

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

  4. そうでなければ、指定されたmedia featureを評価した結果を返す。

8.3.3. viewport meta 要素

https://github.com/w3c/csswg-drafts/pull/13548 がマージされた後に削除する。

[CSS-VIEWPORT-1]仕様の「Viewport meta element」節は、 WebDriver BiDi viewport meta 状態を検証するように変更される。

`viewport` meta 要素の ノード文書を与えたWebDriver BiDi viewport meta 状態が true の場合、ユーザーエージェントは`viewport` meta 要素を使用しなければならない。

そうでなければ、ユーザーエージェントは`viewport` meta 要素を使用してもよい。

9. 付録

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

9.1. 外部仕様

注: この list は網羅的ではなく、最新でない可能性がある。

次の外部仕様は、追加の WebDriver BiDi modules を定義する:

  1. Digital Credentials API

  2. Permissions

  3. nav-speculation

  4. User-Agent Client Hints

  5. Web Bluetooth

索引

この仕様で定義される用語

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

参考文献

規範的参考文献

[ACCNAME-1.1]
Joanmarie Diggs; Bryan Garaventa; Michael Cooper. アクセシブルな 名前および説明の計算 1.1. URL: https://w3c.github.io/accname/
[CONSOLE]
Dominic Farolino; Robert Kowalski; Terin Stock. Console 標準. Living Standard. URL: https://console.spec.whatwg.org/
[COOKIES]
A. Barth. HTTP状態管理メカニズム. 2011年4月. Proposed Standard. URL: https://httpwg.org/specs/rfc6265.html
[CORE-AAM-1.1]
Joanmarie Diggs; et al. コアアクセシビリティAPIマッピング 1.1. URL: https://w3c.github.io/core-aam/
[CSS-COLOR-ADJUST-1]
Elika Etemad; et al. CSS色調整 モジュール レベル1. URL: https://drafts.csswg.org/css-color-adjust-1/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSSオーバーフローモジュール レベル3. URL: https://drafts.csswg.org/css-overflow-3/
[CSS-PAINT-API-1]
Ian Kilpatrick; Dean Jackson. CSS描画 API レベル1. URL: https://drafts.css-houdini.org/css-paint-api-1/
[CSS-VIEWPORT-1]
Florian Rivoal; Emilio Cobos Álvarez. CSS ビューポート モジュール レベル 1. URL: https://drafts.csswg.org/css-viewport/
[CSS2]
Bert Bos; et al. カスケーディング・スタイル・シート レベル2 改訂1 (CSS 2.1) 仕様. URL: https://drafts.csswg.org/css2/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View モジュール. URL: https://drafts.csswg.org/cssom-view/
[DOM]
Anne van Kesteren. DOM標準. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMA-402]
ECMAScript国際化API仕様. URL: https://tc39.es/ecma402/
[ECMAScript]
ECMAScript言語仕様. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. Encoding標準. Living Standard. URL: https://encoding.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch標準. Living Standard. URL: https://fetch.spec.whatwg.org/
[FS]
Austin Sullivan. File System標準. Living Standard. URL: https://fs.spec.whatwg.org/
[FULLSCREEN]
Philip Jägenstedt. Fullscreen API標準. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[GEOLOCATION]
Marcos Caceres; Reilly Grant. Geolocation. URL: https://w3c.github.io/geolocation/
[GEOMETRY-1]
Sebastian Zartner; Yehonatan Daniv. Geometry Interfaces モジュール レベル1. URL: https://drafts.csswg.org/geometry/
[HR-TIME-3]
Yoav Weiss. 高精度時間. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML標準. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. Living Standard. URL: https://infra.spec.whatwg.org/
[MEDIAQUERIES-5]
Tab Atkins Jr.; ほか。 メディアクエリ レベル 5。URL: https://drafts.csswg.org/mediaqueries-5/
[MIMESNIFF]
Gordon P. Hemsley. MIME Sniffing標準. Living Standard. URL: https://mimesniff.spec.whatwg.org/
[RESOURCE-TIMING]
Yoav Weiss; Noam Rosenthal. Resource Timing. URL: https://w3c.github.io/resource-timing/
[RFC4648]
S. Josefsson. Base16、Base32、およびBase64データ エンコーディング. 2006年10月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc4648/
[RFC5280]
D. Cooper; et al. Internet X.509公開鍵 基盤証明書および証明書失効リスト(CRL)プロファイル. 2008年5月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc5280/
[RFC6455]
I. Fette; A. Melnikov. WebSocket プロトコル. 2011年12月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc6455/
[RFC8610]
H. Birkholz; C. Vigano; C. Bormann. Concise Data Definition Language(CDDL):Concise Binary Object Representation (CBOR)およびJSONデータ構造を表現するための記法規約. 2019年6月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc8610/
[RFC9110]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP Semantics. 2022年6月. Internet Standard. URL: https://httpwg.org/specs/rfc9110.html
[RFC9562]
K. Davis; B. Peabody; P. Leach. Universally Unique IDentifiers(UUID). 2024年5月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc9562/
[SCREEN-CAPTURE]
Jan-Ivar Bruaroey; Elad Alon. 画面 キャプチャ. URL: https://w3c.github.io/mediacapture-screen-share/
[SCREEN-ORIENTATION]
Marcos Caceres; Léonie Watson. 画面の 向き. URL: https://w3c.github.io/screen-orientation/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. セレクター レベル 4. URL: https://drafts.csswg.org/selectors/
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers Nightly. URL: https://w3c.github.io/ServiceWorker/
[UNICODE]
Unicode標準. URL: https://www.unicode.org/versions/latest/
[URL]
Anne van Kesteren. URL標準. Living Standard. URL: https://url.spec.whatwg.org/
[WEBAUDIO-1.0]
Paul Adenot; Hongchan Choi. Web Audio API. URL: https://webaudio.github.io/web-audio-api/
[WEBDRIVER]
Simon Stewart; David Burns. WebDriver. URL: https://w3c.github.io/webdriver/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL標準. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBSOCKETS]
Adam Rice. WebSockets標準. Living Standard. URL: https://websockets.spec.whatwg.org/
[WEBTRANSPORT]
Jan-Ivar Bruaroey; Victor Vasiliev; Nidhi Jaju. WebTransport. URL: https://w3c.github.io/webtransport/

非規範的参考文献

[CSS-SIZE-ADJUST-1]
CSS モバイルテキストサイズ調整モジュール Level 1. 編集者草案. URL: https://drafts.csswg.org/css-size-adjust-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. URL: https://drafts.csswg.org/css-values-3/
[HTTP11]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP/1.1. 2022 年 6 月. Internet Standard. URL: https://httpwg.org/specs/rfc9112.html
[JSON-RPC]
JSON-RPC Working Group. JSON-RPC 2.0 Specification. 2013 年 1 月 4 日. URL: https://www.jsonrpc.org/specification
[RFC6265BIS]
Cookies: HTTP State Management Mechanism. Editor's Draft. URL: https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis
[TOUCH-EVENTS]
Doug Schepers; et al. Touch Events. URL: https://w3c.github.io/touch-events/
[URLPattern]
Ben Kelly; Jeremy Roman; 宍戸俊哉 (Shunya Shishido). URL Pattern Standard. Living Standard. URL: https://urlpattern.spec.whatwg.org/

CDDL 索引

リモートエンド定義

Command = {
  id: js-uint,
  CommandData,
  Extensible,
}

CommandData = (
  BrowserCommand //
  BrowsingContextCommand //
  EmulationCommand //
  InputCommand //
  NetworkCommand //
  ScriptCommand //
  SessionCommand //
  StorageCommand //
  WebExtensionCommand
)

EmptyParams = {
   Extensible
}

Extensible = (*text => any)

js-int = -9007199254740991..9007199254740991
js-uint = 0..9007199254740991

SessionCommand = (
  session.End //
  session.New //
  session.Status //
  session.Subscribe //
  session.Unsubscribe
)

session.CapabilitiesRequest = {
  ? alwaysMatch: session.CapabilityRequest,
  ? firstMatch: [*session.CapabilityRequest]
}

session.CapabilityRequest = {
  ? acceptInsecureCerts: bool,
  ? browserName: text,
  ? browserVersion: text,
  ? platformName: text,
  ? proxy: session.ProxyConfiguration,
  ? unhandledPromptBehavior: session.UserPromptHandler,
  Extensible
}

session.CapabilityResponse = {
  acceptInsecureCerts: bool,
  browserName: text,
  browserVersion: text,
  platformName: text,
  setWindowRect: bool,
  userAgent: text,
  ? proxy: session.ProxyConfiguration,
  ? unhandledPromptBehavior: session.UserPromptHandler,
  ? webSocketUrl: text,
  Extensible
}

session.ProxyConfiguration = {
   session.AutodetectProxyConfiguration //
   session.DirectProxyConfiguration //
   session.ManualProxyConfiguration //
   session.PacProxyConfiguration //
   session.SystemProxyConfiguration
}

session.AutodetectProxyConfiguration = (
   proxyType: "autodetect",
   Extensible
)

session.DirectProxyConfiguration = (
   proxyType: "direct",
   Extensible
)

session.ManualProxyConfiguration = (
   proxyType: "manual",
   ? httpProxy: text,
   ? sslProxy: text,
   ? session.SocksProxyConfiguration,
   ? noProxy: [*text],
   Extensible
)

session.SocksProxyConfiguration = (
   socksProxy: text,
   socksVersion: 0..255,
)

session.PacProxyConfiguration = (
   proxyType: "pac",
   proxyAutoconfigUrl: text,
   Extensible
)

session.SystemProxyConfiguration = (
   proxyType: "system",
   Extensible
)


session.UserPromptHandler = {
  ? alert: session.UserPromptHandlerType,
  ? beforeUnload: session.UserPromptHandlerType,
  ? confirm: session.UserPromptHandlerType,
  ? default: session.UserPromptHandlerType,
  ? file: session.UserPromptHandlerType,
  ? prompt: session.UserPromptHandlerType,
}

session.UserPromptHandlerType = "accept" / "dismiss" / "ignore";

session.Subscription = text

session.SubscribeParameters = {
  events: [+text],
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

session.UnsubscribeByIDRequest = {
  subscriptions: [+session.Subscription],
}

session.UnsubscribeByAttributesRequest = {
  events: [+text],
}

session.Status = (
  method: "session.status",
  params: EmptyParams,
)

session.New = (
  method: "session.new",
  params: session.NewParameters
)

session.NewParameters = {
  capabilities: session.CapabilitiesRequest
}

session.End = (
  method: "session.end",
  params: EmptyParams
)


session.Subscribe = (
  method: "session.subscribe",
  params: session.SubscribeParameters
)

session.Unsubscribe = (
  method: "session.unsubscribe",
  params: session.UnsubscribeParameters,
)

session.UnsubscribeParameters = session.UnsubscribeByAttributesRequest / session.UnsubscribeByIDRequest

BrowserCommand = (
  browser.Close //
  browser.CreateUserContext //
  browser.GetClientWindows //
  browser.GetUserContexts //
  browser.RemoveUserContext //
  browser.SetClientWindowState //
  browser.SetDownloadBehavior
)

browser.ClientWindow = text;

browser.ClientWindowInfo = {
  active: bool,
  clientWindow: browser.ClientWindow,
  height: js-uint,
  state: "fullscreen" / "maximized" / "minimized" / "normal",
  width: js-uint,
  x: js-int,
  y: js-int,
}

browser.UserContext = text;

browser.UserContextInfo = {
  userContext: browser.UserContext
}

browser.Close = (
  method: "browser.close",
  params: EmptyParams,
)

browser.CreateUserContext = (
  method: "browser.createUserContext",
  params: browser.CreateUserContextParameters,
)

browser.CreateUserContextParameters = {
  ? acceptInsecureCerts: bool,
  ? proxy: session.ProxyConfiguration,
  ? unhandledPromptBehavior: session.UserPromptHandler
}

browser.GetClientWindows = (
  method: "browser.getClientWindows",
  params: EmptyParams,
)

browser.GetUserContexts = (
  method: "browser.getUserContexts",
  params: EmptyParams,
)

browser.RemoveUserContext = (
  method: "browser.removeUserContext",
  params: browser.RemoveUserContextParameters
)

browser.RemoveUserContextParameters = {
  userContext: browser.UserContext
}

browser.SetClientWindowState = (
  method: "browser.setClientWindowState",
  params: browser.SetClientWindowStateParameters
)

browser.SetClientWindowStateParameters = {
  clientWindow: browser.ClientWindow,
  (browser.ClientWindowNamedState // browser.ClientWindowRectState)
}

browser.ClientWindowNamedState = (
  state: "fullscreen" / "maximized" / "minimized"
)

browser.ClientWindowRectState = (
  state: "normal",
  ? width: js-uint,
  ? height: js-uint,
  ? x: js-int,
  ? y: js-int,
)

browser.SetDownloadBehavior = (
  method: "browser.setDownloadBehavior",
  params: browser.SetDownloadBehaviorParameters
)

browser.SetDownloadBehaviorParameters = {
  downloadBehavior: browser.DownloadBehavior / null,
  ? userContexts: [+browser.UserContext]
}

browser.DownloadBehavior = {
  (
    browser.DownloadBehaviorAllowed //
    browser.DownloadBehaviorDenied
  )
}

browser.DownloadBehaviorAllowed = (
  type: "allowed",
  destinationFolder: text
)

browser.DownloadBehaviorDenied = (
  type: "denied"
)

BrowsingContextCommand = (
  browsingContext.Activate //
  browsingContext.CaptureScreenshot //
  browsingContext.Close //
  browsingContext.Create //
  browsingContext.GetTree //
  browsingContext.HandleUserPrompt //
  browsingContext.LocateNodes //
  browsingContext.Navigate //
  browsingContext.Print //
  browsingContext.Reload //
  browsingContext.SetBypassCSP //
  browsingContext.SetViewport //
  browsingContext.StartScreencast //
  browsingContext.StopScreencast //
  browsingContext.TraverseHistory
)

browsingContext.BrowsingContext = text;

browsingContext.Locator = (
   browsingContext.AccessibilityLocator /
   browsingContext.CssLocator /
   browsingContext.ContextLocator /
   browsingContext.InnerTextLocator /
   browsingContext.XPathLocator
)

browsingContext.AccessibilityLocator = {
   type: "accessibility",
   value: {
    ? name: text,
    ? role: text,
   }
}

browsingContext.CssLocator = {
   type: "css",
   value: text
}

browsingContext.ContextLocator = {
  type: "context",
  value: {
    context: browsingContext.BrowsingContext,
  }
}

browsingContext.InnerTextLocator = {
   type: "innerText",
   value: text,
   ? ignoreCase: bool
   ? matchType: "full" / "partial",
   ? maxDepth: js-uint,
}

browsingContext.XPathLocator = {
   type: "xpath",
   value: text
}

browsingContext.Navigation = text;

browsingContext.Download = text;

browsingContext.ReadinessState = "none" / "interactive" / "complete"

browsingContext.UserPromptType = "alert" / "beforeunload" / "confirm" / "prompt";

browsingContext.Activate = (
  method: "browsingContext.activate",
  params: browsingContext.ActivateParameters
)

browsingContext.ActivateParameters = {
  context: browsingContext.BrowsingContext
}

browsingContext.CaptureScreenshot = (
  method: "browsingContext.captureScreenshot",
  params: browsingContext.CaptureScreenshotParameters
)

browsingContext.CaptureScreenshotParameters = {
  context: browsingContext.BrowsingContext,
  ? origin: ("viewport" / "document") .default "viewport",
  ? format: browsingContext.ImageFormat,
  ? clip: browsingContext.ClipRectangle,
  ? imageSize: browsingContext.ImageSize,
}

browsingContext.ImageFormat = {
   type: text,
   ? quality: 0.0..1.0,
}

browsingContext.ImageSize = {
   ? maxWidth: (js-uint .ge 1),
   ? maxHeight: (js-uint .ge 1),
}

browsingContext.ClipRectangle = (
  browsingContext.BoxClipRectangle /
  browsingContext.ElementClipRectangle
)

browsingContext.ElementClipRectangle = {
  type: "element",
  element: script.SharedReference
}

browsingContext.BoxClipRectangle = {
   type: "box",
   x: float,
   y: float,
   width: float,
   height: float
}

browsingContext.Close = (
  method: "browsingContext.close",
  params: browsingContext.CloseParameters
)

browsingContext.CloseParameters = {
  context: browsingContext.BrowsingContext,
  ? promptUnload: bool .default false
}

browsingContext.Create = (
  method: "browsingContext.create",
  params: browsingContext.CreateParameters
)

browsingContext.CreateType = "tab" / "window"

browsingContext.CreateParameters = {
  type: browsingContext.CreateType,
  ? referenceContext: browsingContext.BrowsingContext,
  ? background: bool .default false,
  ? userContext: browser.UserContext
}

browsingContext.GetTree = (
  method: "browsingContext.getTree",
  params: browsingContext.GetTreeParameters
)

browsingContext.GetTreeParameters = {
  ? maxDepth: js-uint,
  ? root: browsingContext.BrowsingContext,
}

browsingContext.HandleUserPrompt = (
  method: "browsingContext.handleUserPrompt",
  params: browsingContext.HandleUserPromptParameters
)

browsingContext.HandleUserPromptParameters = {
  context: browsingContext.BrowsingContext,
  ? accept: bool,
  ? userText: text,
}

browsingContext.LocateNodes = (
  method: "browsingContext.locateNodes",
  params: browsingContext.LocateNodesParameters
)

browsingContext.LocateNodesParameters = {
   context: browsingContext.BrowsingContext,
   locator: browsingContext.Locator,
   ? maxNodeCount: (js-uint .ge 1),
   ? serializationOptions: script.SerializationOptions,
   ? startNodes: [ + script.SharedReference ]
}

browsingContext.Navigate = (
  method: "browsingContext.navigate",
  params: browsingContext.NavigateParameters
)

browsingContext.NavigateParameters = {
  context: browsingContext.BrowsingContext,
  url: text,
  ? wait: browsingContext.ReadinessState,
}

browsingContext.Print = (
  method: "browsingContext.print",
  params: browsingContext.PrintParameters
)

browsingContext.PrintParameters = {
  context: browsingContext.BrowsingContext,
  ? background: bool .default false,
  ? margin: browsingContext.PrintMarginParameters,
  ? orientation: ("portrait" / "landscape") .default "portrait",
  ? page: browsingContext.PrintPageParameters,
  ? pageRanges: [*(js-uint / text)],
  ? scale: (0.1..2.0) .default 1.0,
  ? shrinkToFit: bool .default true,
}

browsingContext.PrintMarginParameters = {
  ? bottom: (float .ge 0.0) .default 1.0,
  ? left: (float .ge 0.0) .default 1.0,
  ? right: (float .ge 0.0) .default 1.0,
  ? top: (float .ge 0.0) .default 1.0,
}

; Minimum size is 1pt x 1pt. Conversion follows from
; https://www.w3.org/TR/css3-values/#absolute-lengths
browsingContext.PrintPageParameters = {
  ? height: (float .ge 0.0352) .default 27.94,
  ? width: (float .ge 0.0352) .default 21.59,
}

browsingContext.Reload = (
  method: "browsingContext.reload",
  params: browsingContext.ReloadParameters
)

browsingContext.ReloadParameters = {
  context: browsingContext.BrowsingContext,
  ? ignoreCache: bool,
  ? wait: browsingContext.ReadinessState,
}

browsingContext.SetBypassCSP = (
  method: "browsingContext.setBypassCSP",
  params: browsingContext.SetBypassCSPParameters
)

browsingContext.SetBypassCSPParameters = {
  bypass: true / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

browsingContext.SetViewport = (
  method: "browsingContext.setViewport",
  params: browsingContext.SetViewportParameters
)

browsingContext.SetViewportParameters = {
  ? context: browsingContext.BrowsingContext,
  ? viewport: browsingContext.Viewport / null,
  ? devicePixelRatio: (float .gt 0.0) / null,
  ? userContexts: [+browser.UserContext],
}

browsingContext.Viewport = {
  width: js-uint,
  height: js-uint,
}

browsingContext.StartScreencast = (
  method: "browsingContext.startScreencast",
  params: browsingContext.StartScreencastParameters
)

browsingContext.StartScreencastParameters = {
  context: browsingContext.BrowsingContext,
  ? destinationFolder: text,
  ? mimeType: text,
  ? video: browsingContext.MediaTrackConstraints,
  ? audio: bool .default false,
}

browsingContext.MediaTrackConstraints = {
   ? width: js-uint,
   ? height: js-uint,
   ? frameRate: js-uint,
}


browsingContext.Screencast = text

browsingContext.StopScreencast = (
  method: "browsingContext.stopScreencast",
  params: browsingContext.StopScreencastParameters
)

browsingContext.StopScreencastParameters = {
  screencast: browsingContext.Screencast
}

browsingContext.TraverseHistory = (
  method: "browsingContext.traverseHistory",
  params: browsingContext.TraverseHistoryParameters
)

browsingContext.TraverseHistoryParameters = {
  context: browsingContext.BrowsingContext,
  delta: js-int,
}

EmulationCommand = (
  emulation.SetForcedColorsModeThemeOverride //
  emulation.SetGeolocationOverride //
  emulation.SetLocaleOverride //
  emulation.SetMediaFeaturesOverride //
  emulation.SetNetworkConditions //
  emulation.SetScreenOrientationOverride //
  emulation.SetScreenSettingsOverride //
  emulation.SetScriptingEnabled //
  emulation.SetScrollbarTypeOverride //
  emulation.SetTextLayoutModeOverride //
  emulation.SetTimezoneOverride //
  emulation.SetTouchOverride //
  emulation.SetUserAgentOverride //
  emulation.SetViewportMetaOverride
)


emulation.SetForcedColorsModeThemeOverride = (
  method: "emulation.setForcedColorsModeThemeOverride",
  params: emulation.SetForcedColorsModeThemeOverrideParameters
)

emulation.SetForcedColorsModeThemeOverrideParameters = {
  theme: emulation.ForcedColorsModeTheme / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.ForcedColorsModeTheme = "light" / "dark"

emulation.SetGeolocationOverride = (
  method: "emulation.setGeolocationOverride",
  params: emulation.SetGeolocationOverrideParameters
)

emulation.SetGeolocationOverrideParameters = {
  (
    (coordinates: emulation.GeolocationCoordinates / null) //
    (error: emulation.GeolocationPositionError)
  ),
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.GeolocationCoordinates = {
   latitude: -90.0..90.0,
   longitude: -180.0..180.0,
   ? accuracy: (float .ge 0.0) .default 1.0,
   ? altitude: float / null .default null,
   ? altitudeAccuracy: (float .ge 0.0) / null .default null,
   ? heading: (0.0...360.0) / null .default null,
   ? speed: (float .ge 0.0) / null .default null,
}

emulation.GeolocationPositionError = {
   type: "positionUnavailable"
}

emulation.SetLocaleOverride = (
  method: "emulation.setLocaleOverride",
  params: emulation.SetLocaleOverrideParameters
)

emulation.SetLocaleOverrideParameters = {
  locale: text / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.SetMediaFeaturesOverride = (
  method: "emulation.setMediaFeaturesOverride",
  params: emulation.SetMediaFeaturesOverrideParameters
)

emulation.SetMediaFeaturesOverrideParameters = {
  features: emulation.MediaFeatures / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.MediaFeatures = {
  ? "any-hover": "none" / "hover" / null,
  ? "any-pointer": "none" / "coarse" / "fine" / null,
  ? "color": js-uint / null,
  ? "color-gamut": "srgb" / "p3" / "rec2020" / null,
  ? "color-index": js-uint / null,
  ? "display-mode": "fullscreen" / "standalone" / "minimal-ui" / "browser" / "picture-in-picture" / null,
  ? "dynamic-range": "standard" / "high" / null,
  ? "environment-blending": "opaque" / "additive" / "subtractive" / null,
  ? "forced-colors": "none" / "active" / null,
  ? "grid": 0 / 1 / null,
  ? "horizontal-viewport-segments": js-uint / null,
  ? "hover": "none" / "hover" / null,
  ? "inverted-colors": "none" / "inverted" / null,
  ? "monochrome": js-uint / null,
  ? "nav-controls": "none" / "back" / null,
  ? "overflow-block": "none" / "scroll" / "optional-paged" / "paged" / null,
  ? "overflow-inline": "none" / "scroll" / null,
  ? "pointer": "none" / "coarse" / "fine" / null,
  ? "prefers-color-scheme": "light" / "dark" / null,
  ? "prefers-contrast": "no-preference" / "more" / "less" / "custom" / null,
  ? "prefers-reduced-data": "no-preference" / "reduce" / null,
  ? "prefers-reduced-motion": "no-preference" / "reduce" / null,
  ? "prefers-reduced-transparency": "no-preference" / "reduce" / null,
  ? "scan": "interlace" / "progressive" / null,
  ? "scripting": "none" / "initial-only" / "enabled" / null,
  ? "update": "none" / "slow" / "fast" / null,
  ? "vertical-viewport-segments": js-uint / null,
  ? "video-color-gamut": "srgb" / "p3" / "rec2020" / null,
  ? "video-dynamic-range": "standard" / "high" / null,
}


emulation.SetNetworkConditions = (
  method: "emulation.setNetworkConditions",
  params: emulation.SetNetworkConditionsParameters
)

emulation.SetNetworkConditionsParameters = {
  networkConditions: emulation.NetworkConditions / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.NetworkConditions = emulation.NetworkConditionsOffline

emulation.NetworkConditionsOffline = {
  type: "offline"
}

emulation.SetScreenSettingsOverride = (
  method: "emulation.setScreenSettingsOverride",
  params: emulation.SetScreenSettingsOverrideParameters
)

emulation.ScreenArea = {
  width: js-uint,
  height: js-uint
}

emulation.SetScreenSettingsOverrideParameters = {
  screenArea: emulation.ScreenArea / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.SetScreenOrientationOverride = (
  method: "emulation.setScreenOrientationOverride",
  params: emulation.SetScreenOrientationOverrideParameters
)

emulation.ScreenOrientationNatural = "portrait" / "landscape"
emulation.ScreenOrientationType = "portrait-primary" / "portrait-secondary" / "landscape-primary" / "landscape-secondary"

emulation.ScreenOrientation = {
  natural: emulation.ScreenOrientationNatural,
  type: emulation.ScreenOrientationType
}

emulation.SetScreenOrientationOverrideParameters = {
  screenOrientation: emulation.ScreenOrientation / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.SetUserAgentOverride = (
  method: "emulation.setUserAgentOverride",
  params: emulation.SetUserAgentOverrideParameters
)

emulation.SetUserAgentOverrideParameters = {
  userAgent: text / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.SetViewportMetaOverride = (
  method: "emulation.setViewportMetaOverride",
  params: emulation.SetViewportMetaOverrideParameters
)

emulation.SetViewportMetaOverrideParameters = {
  viewportMeta: true / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.SetScriptingEnabled = (
  method: "emulation.setScriptingEnabled",
  params: emulation.SetScriptingEnabledParameters
)

emulation.SetScriptingEnabledParameters = {
  enabled: false / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.SetScrollbarTypeOverride = (
  method: "emulation.setScrollbarTypeOverride",
  params: emulation.SetScrollbarTypeOverrideParameters
)

emulation.SetScrollbarTypeOverrideParameters = {
  scrollbarType: "classic" / "overlay" / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.SetTextLayoutModeOverride = (
  method: "emulation.setTextLayoutModeOverride",
  params: emulation.SetTextLayoutModeOverrideParameters
)

emulation.SetTextLayoutModeOverrideParameters = {
  textLayoutMode: emulation.TextLayoutMode / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.TextLayoutMode = "mobile"

emulation.SetTimezoneOverride = (
  method: "emulation.setTimezoneOverride",
  params: emulation.SetTimezoneOverrideParameters
)

emulation.SetTimezoneOverrideParameters = {
  timezone: text / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

emulation.SetTouchOverride = (
  method: "emulation.setTouchOverride",
  params: emulation.SetTouchOverrideParameters
)

emulation.SetTouchOverrideParameters = {
  maxTouchPoints: (js-uint .ge 1) / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

NetworkCommand = (
  network.AddDataCollector //
  network.AddIntercept //
  network.ContinueRequest //
  network.ContinueResponse //
  network.ContinueWithAuth //
  network.DisownData //
  network.FailRequest //
  network.GetData //
  network.ProvideResponse //
  network.RemoveDataCollector //
  network.RemoveIntercept //
  network.SetCacheBehavior //
  network.SetExtraHeaders
)


network.AuthCredentials = {
  type: "password",
  username: text,
  password: text,
}

network.BytesValue = network.StringValue / network.Base64Value;

network.StringValue = {
  type: "string",
  value: text,
}

network.Base64Value = {
  type: "base64",
  value: text,
}

network.Collector = text

network.CollectorType = "blob"

network.SameSite = "strict" / "lax" / "none" / "default"


network.Cookie = {
    name: text,
    value: network.BytesValue,
    domain: text,
    path: text,
    size: js-uint,
    httpOnly: bool,
    secure: bool,
    sameSite: network.SameSite,
    ? expiry: js-uint,
    Extensible,
}

network.CookieHeader = {
    name: text,
    value: network.BytesValue,
}

network.DataType = "request" / "response"

network.Header = {
  name: text,
  value: network.BytesValue,
}

network.Intercept = text

network.Request = text;

network.SetCookieHeader = {
    name: text,
    value: network.BytesValue,
    ? domain: text,
    ? httpOnly: bool,
    ? expiry: text,
    ? maxAge: js-int,
    ? path: text,
    ? sameSite: network.SameSite,
    ? secure: bool,
}

network.UrlPattern = (
  network.UrlPatternPattern /
  network.UrlPatternString
)

network.UrlPatternPattern = {
    type: "pattern",
    ?protocol: text,
    ?hostname: text,
    ?port: text,
    ?pathname: text,
    ?search: text,
}


network.UrlPatternString = {
    type: "string",
    pattern: text,
}


network.AddDataCollector = (
  method: "network.addDataCollector",
  params: network.AddDataCollectorParameters
)

network.AddDataCollectorParameters = {
  dataTypes: [+network.DataType],
  maxEncodedDataSize: js-uint,
  ? collectorType: network.CollectorType .default "blob",
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}

network.AddIntercept = (
  method: "network.addIntercept",
  params: network.AddInterceptParameters
)

network.AddInterceptParameters = {
  phases: [+network.InterceptPhase],
  ? contexts: [+browsingContext.BrowsingContext],
  ? urlPatterns: [*network.UrlPattern],
}

network.InterceptPhase = "beforeRequestSent" / "responseStarted" /
                         "authRequired"

network.ContinueRequest = (
  method: "network.continueRequest",
  params: network.ContinueRequestParameters
)

network.ContinueRequestParameters = {
  request: network.Request,
  ?body: network.BytesValue,
  ?cookies: [*network.CookieHeader],
  ?headers: [*network.Header],
  ?method: text,
  ?url: text,
}

network.ContinueResponse = (
  method: "network.continueResponse",
  params: network.ContinueResponseParameters
)

network.ContinueResponseParameters = {
  request: network.Request,
  ?cookies: [*network.SetCookieHeader]
  ?credentials: network.AuthCredentials,
  ?headers: [*network.Header],
  ?reasonPhrase: text,
  ?statusCode: js-uint,
}

network.ContinueWithAuth = (
  method: "network.continueWithAuth",
  params: network.ContinueWithAuthParameters
)

network.ContinueWithAuthParameters = {
  request: network.Request,
  (network.ContinueWithAuthCredentials // network.ContinueWithAuthNoCredentials)
}

network.ContinueWithAuthCredentials = (
  action: "provideCredentials", 
  credentials: network.AuthCredentials
)

network.ContinueWithAuthNoCredentials = (
  action: "default" / "cancel"
)

network.DisownData = (
  method: "network.disownData",
  params: network.DisownDataParameters
)

network.DisownDataParameters = {
  dataType: network.DataType,
  collector: network.Collector,
  request: network.Request,
}

network.FailRequest = (
  method: "network.failRequest",
  params: network.FailRequestParameters
)

network.FailRequestParameters = {
  request: network.Request,
}

network.GetData = (
  method: "network.getData",
  params: network.GetDataParameters
)

network.GetDataParameters = {
  dataType: network.DataType,
  ? collector: network.Collector,
  ? disown: bool .default false,
  request: network.Request,
}

network.ProvideResponse = (
  method: "network.provideResponse",
  params: network.ProvideResponseParameters
)

network.ProvideResponseParameters = {
  request: network.Request,
  ?body: network.BytesValue,
  ?cookies: [*network.SetCookieHeader],
  ?headers: [*network.Header],
  ?reasonPhrase: text,
  ?statusCode: js-uint,
}

network.RemoveDataCollector = (
  method: "network.removeDataCollector",
  params: network.RemoveDataCollectorParameters
)

network.RemoveDataCollectorParameters = {
  collector: network.Collector
}

network.RemoveIntercept = (
  method: "network.removeIntercept",
  params: network.RemoveInterceptParameters
)

network.RemoveInterceptParameters = {
  intercept: network.Intercept
}

network.SetCacheBehavior = (
  method: "network.setCacheBehavior",
  params: network.SetCacheBehaviorParameters
)

network.SetCacheBehaviorParameters = {
  cacheBehavior: "default" / "bypass",
  ? contexts: [+browsingContext.BrowsingContext]
}

network.SetExtraHeaders = (
  method: "network.setExtraHeaders",
  params: network.SetExtraHeadersParameters
)

network.SetExtraHeadersParameters = {
  headers: [*network.Header]
  ? contexts: [+browsingContext.BrowsingContext]
  ? userContexts: [+browser.UserContext]
}

ScriptCommand = (
  script.AddPreloadScript //
  script.CallFunction //
  script.Disown //
  script.Evaluate //
  script.GetRealms //
  script.RemovePreloadScript
)

script.Channel = text;

script.ChannelValue = {
  type: "channel",
  value: script.ChannelProperties,
}

script.ChannelProperties = {
  channel: script.Channel,
  ? serializationOptions: script.SerializationOptions,
  ? ownership: script.ResultOwnership,
}

script.EvaluationResult = (
  script.EvaluationResultSuccess /
  script.EvaluationResultException
)

script.EvaluationResultSuccess = {
  type: "success",
  result: script.RemoteValue,
  realm: script.Realm
}

script.EvaluationResultException = {
  type: "exception",
  exceptionDetails: script.ExceptionDetails
  realm: script.Realm
}

script.ExceptionDetails = {
  columnNumber: js-uint,
  exception: script.RemoteValue,
  lineNumber: js-uint,
  stackTrace: script.StackTrace,
  text: text,
}

script.Handle = text;

script.InternalId = text;

script.LocalValue = (
  script.RemoteReference /
  script.PrimitiveProtocolValue /
  script.ChannelValue /
  script.ArrayLocalValue /
  { script.DateLocalValue } /
  script.MapLocalValue /
  script.ObjectLocalValue /
  { script.RegExpLocalValue } /
  script.SetLocalValue
)

script.ListLocalValue = [*script.LocalValue];

script.ArrayLocalValue = {
  type: "array",
  value: script.ListLocalValue,
}

script.DateLocalValue = (
  type: "date",
  value: text
)

script.MappingLocalValue = [*[(script.LocalValue / text), script.LocalValue]];

script.MapLocalValue = {
  type: "map",
  value: script.MappingLocalValue,
}

script.ObjectLocalValue = {
  type: "object",
  value: script.MappingLocalValue,
}

script.RegExpValue = {
  pattern: text,
  ? flags: text,
}

script.RegExpLocalValue = (
  type: "regexp",
  value: script.RegExpValue,
)

script.SetLocalValue = {
  type: "set",
  value: script.ListLocalValue,
}

script.PreloadScript = text;

script.Realm = text;

script.PrimitiveProtocolValue = (
  script.UndefinedValue /
  script.NullValue /
  script.StringValue /
  script.NumberValue /
  script.BooleanValue /
  script.BigIntValue
)

script.UndefinedValue = {
  type: "undefined",
}

script.NullValue = {
  type: "null",
}

script.StringValue = {
  type: "string",
  value: text,
}

script.SpecialNumber = "NaN" / "-0" / "Infinity" / "-Infinity";

script.NumberValue = {
  type: "number",
  value: number / script.SpecialNumber,
}

script.BooleanValue = {
  type: "boolean",
  value: bool,
}

script.BigIntValue = {
  type: "bigint",
  value: text,
}

script.RealmType = "window" / "dedicated-worker" / "shared-worker" / "service-worker" /
                   "worker" / "paint-worklet" / "audio-worklet" / "worklet"

script.RemoteReference = (
  script.SharedReference /
  script.RemoteObjectReference
)

script.SharedReference = {
   sharedId: script.SharedId

   ? handle: script.Handle,
   Extensible
}

script.RemoteObjectReference = {
   handle: script.Handle,

   ? sharedId: script.SharedId
   Extensible
}

script.RemoteValue = (
  script.PrimitiveProtocolValue /
  script.SymbolRemoteValue /
  script.ArrayRemoteValue /
  script.ObjectRemoteValue /
  script.FunctionRemoteValue /
  script.RegExpRemoteValue /
  script.DateRemoteValue /
  script.MapRemoteValue /
  script.SetRemoteValue /
  script.WeakMapRemoteValue /
  script.WeakSetRemoteValue /
  script.GeneratorRemoteValue /
  script.ErrorRemoteValue /
  script.ProxyRemoteValue /
  script.PromiseRemoteValue /
  script.TypedArrayRemoteValue /
  script.ArrayBufferRemoteValue /
  script.NodeListRemoteValue /
  script.HTMLCollectionRemoteValue /
  script.NodeRemoteValue /
  script.WindowProxyRemoteValue
)

script.ListRemoteValue = [*script.RemoteValue];

script.MappingRemoteValue = [*[(script.RemoteValue / text), script.RemoteValue]];

script.SymbolRemoteValue = {
  type: "symbol",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ArrayRemoteValue = {
  type: "array",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue,
}

script.ObjectRemoteValue = {
  type: "object",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.MappingRemoteValue,
}

script.FunctionRemoteValue = {
  type: "function",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.RegExpRemoteValue = {
  script.RegExpLocalValue,
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.DateRemoteValue = {
  script.DateLocalValue,
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.MapRemoteValue = {
  type: "map",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.MappingRemoteValue,
}

script.SetRemoteValue = {
  type: "set",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue
}

script.WeakMapRemoteValue = {
  type: "weakmap",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.WeakSetRemoteValue = {
  type: "weakset",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.GeneratorRemoteValue = {
  type: "generator",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ErrorRemoteValue = {
  type: "error",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ProxyRemoteValue = {
  type: "proxy",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.PromiseRemoteValue = {
  type: "promise",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.TypedArrayRemoteValue = {
  type: "typedarray",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ArrayBufferRemoteValue = {
  type: "arraybuffer",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.NodeListRemoteValue = {
  type: "nodelist",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue,
}

script.HTMLCollectionRemoteValue = {
  type: "htmlcollection",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue,
}

script.NodeRemoteValue = {
  type: "node",
  ? sharedId: script.SharedId,
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.NodeProperties,
}

script.NodeProperties = {
  nodeType: js-uint,
  childNodeCount: js-uint,
  ? attributes: {*text => text},
  ? children: [*script.NodeRemoteValue],
  ? localName: text,
  ? mode: "open" / "closed",
  ? namespaceURI: text,
  ? nodeValue: text,
  ? shadowRoot: script.NodeRemoteValue / null,
}

script.WindowProxyRemoteValue = {
  type: "window",
  value: script.WindowProxyProperties,
  ? handle: script.Handle,
  ? internalId: script.InternalId
}

script.WindowProxyProperties = {
  context: browsingContext.BrowsingContext
}

script.ResultOwnership = "root" / "none"

script.SerializationOptions = {
  ? maxDomDepth: (js-uint / null) .default 0,
  ? maxObjectDepth: (js-uint / null) .default null,
  ? includeShadowTree: ("none" / "open" / "all") .default "none",
}

script.SharedId = text;

script.StackFrame = {
  columnNumber: js-uint,
  functionName: text,
  lineNumber: js-uint,
  url: text,
}

script.StackTrace = {
  callFrames: [*script.StackFrame],
}

script.RealmTarget = {
  realm: script.Realm
}

script.ContextTarget = {
  context: browsingContext.BrowsingContext,
  ? sandbox: text
}

script.Target = (
  script.ContextTarget /
  script.RealmTarget
)

script.AddPreloadScript = (
  method: "script.addPreloadScript",
  params: script.AddPreloadScriptParameters
)

script.AddPreloadScriptParameters = {
  functionDeclaration: text,
  ? arguments: [*script.ChannelValue],
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
  ? sandbox: text
}

script.Disown = (
  method: "script.disown",
  params: script.DisownParameters
)

script.DisownParameters = {
  handles: [*script.Handle]
  target: script.Target;
}

script.CallFunction = (
  method: "script.callFunction",
  params: script.CallFunctionParameters
)

script.CallFunctionParameters = {
  functionDeclaration: text,
  awaitPromise: bool,
  target: script.Target,
  ? arguments: [*script.LocalValue],
  ? resultOwnership: script.ResultOwnership,
  ? serializationOptions: script.SerializationOptions,
  ? this: script.LocalValue,
  ? userActivation: bool .default false,
}

script.Evaluate = (
  method: "script.evaluate",
  params: script.EvaluateParameters
)

script.EvaluateParameters = {
  expression: text,
  target: script.Target,
  awaitPromise: bool,
  ? resultOwnership: script.ResultOwnership,
  ? serializationOptions: script.SerializationOptions,
  ? userActivation: bool .default false,
}

script.GetRealms = (
  method: "script.getRealms",
  params: script.GetRealmsParameters
)

script.GetRealmsParameters = {
  ? context: browsingContext.BrowsingContext,
  ? type: script.RealmType,
}

script.RemovePreloadScript = (
  method: "script.removePreloadScript",
  params: script.RemovePreloadScriptParameters
)

script.RemovePreloadScriptParameters = {
  script: script.PreloadScript
}

StorageCommand = (
  storage.DeleteCookies //
  storage.GetCookies //
  storage.SetCookie
)

storage.PartitionKey = {
  ? userContext: text,
  ? sourceOrigin: text,
  Extensible,
}

storage.GetCookies = (
  method: "storage.getCookies",
  params: storage.GetCookiesParameters
)


storage.CookieFilter = {
  ? name: text,
  ? value: network.BytesValue,
  ? domain: text,
  ? path: text,
  ? size: js-uint,
  ? httpOnly: bool,
  ? secure: bool,
  ? sameSite: network.SameSite,
  ? expiry: js-uint,
  Extensible,
}

storage.BrowsingContextPartitionDescriptor = {
  type: "context",
  context: browsingContext.BrowsingContext
}

storage.StorageKeyPartitionDescriptor = {
  type: "storageKey",
  ? userContext: text,
  ? sourceOrigin: text,
  Extensible,
}

storage.PartitionDescriptor = (
  storage.BrowsingContextPartitionDescriptor /
  storage.StorageKeyPartitionDescriptor
)

storage.GetCookiesParameters = {
  ? filter: storage.CookieFilter,
  ? partition: storage.PartitionDescriptor,
}

storage.SetCookie = (
  method: "storage.setCookie",
  params: storage.SetCookieParameters,
)


storage.PartialCookie = {
  name: text,
  value: network.BytesValue,
  domain: text,
  ? path: text,
  ? httpOnly: bool,
  ? secure: bool,
  ? sameSite: network.SameSite,
  ? expiry: js-uint,
  Extensible,
}

storage.SetCookieParameters = {
  cookie: storage.PartialCookie,
  ? partition: storage.PartitionDescriptor,
}

storage.DeleteCookies = (
  method: "storage.deleteCookies",
  params: storage.DeleteCookiesParameters,
)

storage.DeleteCookiesParameters = {
  ? filter: storage.CookieFilter,
  ? partition: storage.PartitionDescriptor,
}

InputCommand = (
  input.PerformActions //
  input.ReleaseActions //
  input.SetFiles
)

input.ElementOrigin = {
  type: "element",
  element: script.SharedReference
}

input.PerformActions = (
  method: "input.performActions",
  params: input.PerformActionsParameters
)

input.PerformActionsParameters = {
  context: browsingContext.BrowsingContext,
  actions: [*input.SourceActions]
}

input.SourceActions = (
  input.NoneSourceActions /
  input.KeySourceActions /
  input.PointerSourceActions /
  input.WheelSourceActions
)

input.NoneSourceActions = {
  type: "none",
  id: text,
  actions: [*input.NoneSourceAction]
}

input.NoneSourceAction = input.PauseAction

input.KeySourceActions = {
  type: "key",
  id: text,
  actions: [*input.KeySourceAction]
}

input.KeySourceAction = (
  input.PauseAction /
  input.KeyDownAction /
  input.KeyUpAction
)

input.PointerSourceActions = {
  type: "pointer",
  id: text,
  ? parameters: input.PointerParameters,
  actions: [*input.PointerSourceAction]
}

input.PointerType = "mouse" / "pen" / "touch"

input.PointerParameters = {
  ? pointerType: input.PointerType .default "mouse"
}

input.PointerSourceAction = (
  input.PauseAction /
  input.PointerDownAction /
  input.PointerUpAction /
  input.PointerMoveAction
)

input.WheelSourceActions = {
  type: "wheel",
  id: text,
  actions: [*input.WheelSourceAction]
}

input.WheelSourceAction = (
  input.PauseAction /
  input.WheelScrollAction
)

input.PauseAction = {
  type: "pause",
  ? duration: js-uint
}

input.KeyDownAction = {
  type: "keyDown",
  value: text
}

input.KeyUpAction = {
  type: "keyUp",
  value: text
}

input.PointerUpAction = {
  type: "pointerUp",
  button: js-uint,
}

input.PointerDownAction = {
  type: "pointerDown",
  button: js-uint,
  input.PointerCommonProperties
}

input.PointerMoveAction = {
  type: "pointerMove",
  x: float,
  y: float,
  ? duration: js-uint,
  ? origin: input.Origin,
  input.PointerCommonProperties
}

input.WheelScrollAction = {
  type: "scroll",
  x: js-int,
  y: js-int,
  deltaX: js-int,
  deltaY: js-int,
  ? duration: js-uint,
  ? origin: input.Origin .default "viewport",
}

input.PointerCommonProperties = (
  ? width: js-uint,
  ? height: js-uint,
  ? pressure: (0.0..1.0),
  ? tangentialPressure: (-1.0..1.0),
  ? twist: (0..359),
  ; 0 .. Math.PI / 2
  ? altitudeAngle: (0.0..1.5707963267948966),
  ; 0 .. 2 * Math.PI
  ? azimuthAngle: (0.0..6.283185307179586),
)

input.Origin = "viewport" / "pointer" / input.ElementOrigin

input.ReleaseActions = (
  method: "input.releaseActions",
  params: input.ReleaseActionsParameters
)

input.ReleaseActionsParameters = {
  context: browsingContext.BrowsingContext,
}

input.SetFiles = (
  method: "input.setFiles",
  params: input.SetFilesParameters
)

input.SetFilesParameters = {
  context: browsingContext.BrowsingContext,
  element: script.SharedReference,
  files: [*text]
}

WebExtensionCommand = (
  webExtension.Install //
  webExtension.Uninstall
)

webExtension.Extension = text

webExtension.Install = (
   method: "webExtension.install",
   params: webExtension.InstallParameters
)

webExtension.InstallParameters = {
   extensionData: webExtension.ExtensionData,
}

webExtension.ExtensionData = (
   webExtension.ExtensionArchivePath /
   webExtension.ExtensionBase64Encoded /
   webExtension.ExtensionPath
)

webExtension.ExtensionPath = {
   type: "path",
   path: text,
}

webExtension.ExtensionArchivePath = {
   type: "archivePath",
   path: text,
}

webExtension.ExtensionBase64Encoded = {
   type: "base64",
   value: text,
}

webExtension.Uninstall = (
   method: "webExtension.uninstall",
   params: webExtension.UninstallParameters
)

webExtension.UninstallParameters = {
   extension: webExtension.Extension,
}

ローカルエンド定義

Message = (
  CommandResponse /
  ErrorResponse /
  Event
)

CommandResponse = {
  type: "success",
  id: js-uint,
  result: ResultData,
  Extensible
}

ErrorResponse = {
  type: "error",
  id: js-uint / null,
  error: ErrorCode,
  message: text,
  ? stacktrace: text,
  Extensible
}

ResultData = (
  BrowserResult /
  BrowsingContextResult /
  EmulationResult /
  InputResult /
  NetworkResult /
  ScriptResult /
  SessionResult /
  StorageResult /
  WebExtensionResult
)

EmptyResult = {
  Extensible
}

Event = {
  type: "event",
  EventData,
  Extensible
}

EventData = (
  BrowsingContextEvent //
  InputEvent //
  LogEvent //
  NetworkEvent //
  ScriptEvent
)

Extensible = (*text => any)

js-int = -9007199254740991..9007199254740991
js-uint = 0..9007199254740991

ErrorCode = "invalid argument" /
            "invalid selector" /
            "invalid session id" /
            "invalid web extension" /
            "move target out of bounds" /
            "no such alert" /
            "no such network collector" /
            "no such element" /
            "no such frame" /
            "no such handle" /
            "no such history entry" /
            "no such intercept" /
            "no such network data" /
            "no such node" /
            "no such request" /
            "no such screencast" /
            "no such script" /
            "no such storage partition" /
            "no such user context" /
            "no such web extension" /
            "session not created" /
            "unable to capture screen" /
            "unable to close browser" /
            "unable to set cookie" /
            "unable to set file input" /
            "unavailable network data" /
            "underspecified storage partition" /
            "unknown command" /
            "unknown error" /
            "unsupported operation"

SessionResult = (
  session.EndResult /
  session.NewResult /
  session.StatusResult /
  session.SubscribeResult /
  session.UnsubscribeResult
)

session.CapabilitiesRequest = {
  ? alwaysMatch: session.CapabilityRequest,
  ? firstMatch: [*session.CapabilityRequest]
}

session.CapabilityRequest = {
  ? acceptInsecureCerts: bool,
  ? browserName: text,
  ? browserVersion: text,
  ? platformName: text,
  ? proxy: session.ProxyConfiguration,
  ? unhandledPromptBehavior: session.UserPromptHandler,
  Extensible
}

session.CapabilityResponse = {
  acceptInsecureCerts: bool,
  browserName: text,
  browserVersion: text,
  platformName: text,
  setWindowRect: bool,
  userAgent: text,
  ? proxy: session.ProxyConfiguration,
  ? unhandledPromptBehavior: session.UserPromptHandler,
  ? webSocketUrl: text,
  Extensible
}

session.ProxyConfiguration = {
   session.AutodetectProxyConfiguration //
   session.DirectProxyConfiguration //
   session.ManualProxyConfiguration //
   session.PacProxyConfiguration //
   session.SystemProxyConfiguration
}

session.AutodetectProxyConfiguration = (
   proxyType: "autodetect",
   Extensible
)

session.DirectProxyConfiguration = (
   proxyType: "direct",
   Extensible
)

session.ManualProxyConfiguration = (
   proxyType: "manual",
   ? httpProxy: text,
   ? sslProxy: text,
   ? session.SocksProxyConfiguration,
   ? noProxy: [*text],
   Extensible
)

session.SocksProxyConfiguration = (
   socksProxy: text,
   socksVersion: 0..255,
)

session.PacProxyConfiguration = (
   proxyType: "pac",
   proxyAutoconfigUrl: text,
   Extensible
)

session.SystemProxyConfiguration = (
   proxyType: "system",
   Extensible
)


session.UserPromptHandler = {
  ? alert: session.UserPromptHandlerType,
  ? beforeUnload: session.UserPromptHandlerType,
  ? confirm: session.UserPromptHandlerType,
  ? default: session.UserPromptHandlerType,
  ? file: session.UserPromptHandlerType,
  ? prompt: session.UserPromptHandlerType,
}

session.UserPromptHandlerType = "accept" / "dismiss" / "ignore";

session.Subscription = text

session.StatusResult = {
  ready: bool,
  message: text,
}

session.NewResult = {
  sessionId: text,
  capabilities: session.CapabilityResponse
}

session.EndResult = EmptyResult

session.SubscribeResult = {
  subscription: session.Subscription,
}

session.UnsubscribeResult = EmptyResult

BrowserResult = (
  browser.CloseResult /
  browser.CreateUserContextResult /
  browser.GetClientWindowsResult /
  browser.GetUserContextsResult /
  browser.RemoveUserContextResult /
  browser.SetClientWindowStateResult /
  browser.SetDownloadBehaviorResult
)

browser.ClientWindow = text;

browser.ClientWindowInfo = {
  active: bool,
  clientWindow: browser.ClientWindow,
  height: js-uint,
  state: "fullscreen" / "maximized" / "minimized" / "normal",
  width: js-uint,
  x: js-int,
  y: js-int,
}

browser.UserContext = text;

browser.UserContextInfo = {
  userContext: browser.UserContext
}

browser.CloseResult = EmptyResult

browser.CreateUserContextResult = browser.UserContextInfo

browser.GetClientWindowsResult = {
  clientWindows: [ * browser.ClientWindowInfo]
}

browser.GetUserContextsResult = {
  userContexts: [ + browser.UserContextInfo]
}

browser.RemoveUserContextResult = EmptyResult

browser.SetClientWindowStateResult = browser.ClientWindowInfo

browser.SetDownloadBehaviorResult = EmptyResult

BrowsingContextResult = (
  browsingContext.ActivateResult /
  browsingContext.CaptureScreenshotResult /
  browsingContext.CloseResult /
  browsingContext.CreateResult /
  browsingContext.GetTreeResult /
  browsingContext.HandleUserPromptResult /
  browsingContext.LocateNodesResult /
  browsingContext.NavigateResult /
  browsingContext.PrintResult /
  browsingContext.ReloadResult /
  browsingContext.SetBypassCSPResult /
  browsingContext.SetViewportResult /
  browsingContext.StartScreencastResult /
  browsingContext.StopScreencastResult /
  browsingContext.TraverseHistoryResult
)

BrowsingContextEvent = (
  browsingContext.ContextCreated //
  browsingContext.ContextDestroyed //
  browsingContext.DomContentLoaded //
  browsingContext.DownloadEnd //
  browsingContext.DownloadWillBegin //
  browsingContext.FragmentNavigated //
  browsingContext.HistoryUpdated //
  browsingContext.Load //
  browsingContext.NavigationAborted //
  browsingContext.NavigationCommitted //
  browsingContext.NavigationFailed //
  browsingContext.NavigationStarted //
  browsingContext.UserPromptClosed //
  browsingContext.UserPromptOpened
)

browsingContext.BrowsingContext = text;

browsingContext.InfoList = [*browsingContext.Info]

browsingContext.BaseInfo = (
  children: browsingContext.InfoList / null,
  clientWindow: browser.ClientWindow,
  context: browsingContext.BrowsingContext,
  originalOpener: browsingContext.BrowsingContext / null,
  url: text,
  userContext: browser.UserContext,
  ? parent: browsingContext.BrowsingContext / null,
)

browsingContext.Info = {
  browsingContext.BaseInfo
}

browsingContext.Locator = (
   browsingContext.AccessibilityLocator /
   browsingContext.CssLocator /
   browsingContext.ContextLocator /
   browsingContext.InnerTextLocator /
   browsingContext.XPathLocator
)

browsingContext.AccessibilityLocator = {
   type: "accessibility",
   value: {
    ? name: text,
    ? role: text,
   }
}

browsingContext.CssLocator = {
   type: "css",
   value: text
}

browsingContext.ContextLocator = {
  type: "context",
  value: {
    context: browsingContext.BrowsingContext,
  }
}

browsingContext.InnerTextLocator = {
   type: "innerText",
   value: text,
   ? ignoreCase: bool
   ? matchType: "full" / "partial",
   ? maxDepth: js-uint,
}

browsingContext.XPathLocator = {
   type: "xpath",
   value: text
}

browsingContext.Navigation = text;

browsingContext.Download = text;

browsingContext.BaseNavigationInfo = (
  context: browsingContext.BrowsingContext,
  navigation: browsingContext.Navigation / null,
  timestamp: js-uint,
  url: text,
  ? userContext: browser.UserContext,
)

browsingContext.NavigationInfo = {
  browsingContext.BaseNavigationInfo
}

browsingContext.UserPromptType = "alert" / "beforeunload" / "confirm" / "prompt";

browsingContext.ActivateResult = EmptyResult

browsingContext.CaptureScreenshotResult = {
  data: text
}

browsingContext.CloseResult = EmptyResult

browsingContext.CreateResult = {
  context: browsingContext.BrowsingContext,
  ? userContext: browser.UserContext
}

browsingContext.GetTreeResult = {
  contexts: browsingContext.InfoList
}

browsingContext.HandleUserPromptResult = EmptyResult

browsingContext.LocateNodesResult = {
    nodes: [ * script.NodeRemoteValue ]
}

browsingContext.NavigateResult = {
  navigation: browsingContext.Navigation / null,
  url: text,
}

browsingContext.PrintResult = {
  data: text
}

browsingContext.ReloadResult = browsingContext.NavigateResult

browsingContext.SetBypassCSPResult = EmptyResult

browsingContext.SetViewportResult = EmptyResult

browsingContext.StartScreencastResult = {
   screencast: browsingContext.Screencast,
   path: text
}


browsingContext.Screencast = text

browsingContext.StopScreencastResult = {
   path: text,
   ? error: text
}

browsingContext.TraverseHistoryResult = EmptyResult

browsingContext.ContextCreated = (
 method: "browsingContext.contextCreated",
 params: browsingContext.ContextCreatedParameters
)

browsingContext.ContextCreatedParameters = {
 browsingContext.BaseInfo,
 hasPlannedNavigation: bool,
}

browsingContext.ContextDestroyed = (
 method: "browsingContext.contextDestroyed",
 params: browsingContext.Info
)

browsingContext.NavigationStarted = (
 method: "browsingContext.navigationStarted",
 params: browsingContext.NavigationInfo
)

browsingContext.FragmentNavigated = (
 method: "browsingContext.fragmentNavigated",
 params: browsingContext.NavigationInfo
)

browsingContext.HistoryUpdated = (
  method: "browsingContext.historyUpdated",
  params: browsingContext.HistoryUpdatedParameters
)

browsingContext.HistoryUpdatedParameters = {
  context: browsingContext.BrowsingContext,
  timestamp: js-uint,
  url: text,
  ? userContext: browser.UserContext
}

browsingContext.DomContentLoaded = (
 method: "browsingContext.domContentLoaded",
 params: browsingContext.NavigationInfo
)

browsingContext.Load = (
 method: "browsingContext.load",
 params: browsingContext.NavigationInfo
)

browsingContext.DownloadWillBegin = (
 method: "browsingContext.downloadWillBegin",
 params: browsingContext.DownloadWillBeginParams
)

browsingContext.DownloadWillBeginParams = {
  download: browsingContext.Download,
  suggestedFilename: text,
  browsingContext.BaseNavigationInfo
}

browsingContext.DownloadEnd = (
  method: "browsingContext.downloadEnd",
  params: browsingContext.DownloadEndParams
)

browsingContext.DownloadEndParams = {
  (
    browsingContext.DownloadCanceledParams //
    browsingContext.DownloadCompleteParams
  )
}

browsingContext.DownloadCanceledParams = (
  status: "canceled",
  download: browsingContext.Download,
  browsingContext.BaseNavigationInfo
)

browsingContext.DownloadCompleteParams = (
  status: "complete",
  download: browsingContext.Download,
  filepath: text / null,
  browsingContext.BaseNavigationInfo
)

browsingContext.NavigationAborted = (
 method: "browsingContext.navigationAborted",
 params: browsingContext.NavigationInfo
)

browsingContext.NavigationCommitted = (
 method: "browsingContext.navigationCommitted",
 params: browsingContext.NavigationInfo
)

browsingContext.NavigationFailed = (
 method: "browsingContext.navigationFailed",
 params: browsingContext.NavigationInfo
)

browsingContext.UserPromptClosed = (
  method: "browsingContext.userPromptClosed",
  params: browsingContext.UserPromptClosedParameters
)

browsingContext.UserPromptClosedParameters = {
  context: browsingContext.BrowsingContext,
  accepted: bool,
  type: browsingContext.UserPromptType,
  ? userContext: browser.UserContext,
  ? userText: text
}

browsingContext.UserPromptOpened = (
  method: "browsingContext.userPromptOpened",
  params: browsingContext.UserPromptOpenedParameters
)

browsingContext.UserPromptOpenedParameters = {
  context: browsingContext.BrowsingContext,
  handler: session.UserPromptHandlerType,
  message: text,
  type: browsingContext.UserPromptType,
  ? userContext: browser.UserContext,
  ? defaultValue: text
}

EmulationResult = (
  emulation.SetForcedColorsModeThemeOverrideResult /
  emulation.SetGeolocationOverrideResult /
  emulation.SetLocaleOverrideResult /
  emulation.SetMediaFeaturesOverrideResult /
  emulation.SetScreenOrientationOverrideResult /
  emulation.SetScriptingEnabledResult /
  emulation.SetScrollbarTypeOverrideResult /
  emulation.SetTextLayoutModeOverrideResult /
  emulation.SetTimezoneOverrideResult /
  emulation.SetTouchOverrideResult /
  emulation.SetUserAgentOverrideResult /
  emulation.SetViewportMetaOverrideResult
)

emulation.SetForcedColorsModeThemeOverrideResult = EmptyResult

emulation.SetGeolocationOverrideResult = EmptyResult

emulation.SetLocaleOverrideResult = EmptyResult

emulation.SetMediaFeaturesOverrideResult = EmptyResult

emulation.SetNetworkConditionsResult = EmptyResult

emulation.SetScreenSettingsOverrideResult = EmptyResult

emulation.SetScreenOrientationOverrideResult = EmptyResult

emulation.SetUserAgentOverrideResult = EmptyResult

emulation.SetViewportMetaOverrideResult = EmptyResult

emulation.SetScriptingEnabledResult = EmptyResult

emulation.SetScrollbarTypeOverrideResult = EmptyResult

emulation.SetTextLayoutModeOverrideResult = EmptyResult

emulation.SetTimezoneOverrideResult = EmptyResult

emulation.SetTouchOverrideResult = EmptyResult

NetworkResult = (
  network.AddDataCollectorResult /
  network.AddInterceptResult /
  network.ContinueRequestResult /
  network.ContinueResponseResult /
  network.ContinueWithAuthResult /
  network.DisownDataResult /
  network.FailRequestResult /
  network.GetDataResult /
  network.ProvideResponseResult /
  network.RemoveDataCollectorResult /
  network.RemoveInterceptResult /
  network.SetCacheBehaviorResult /
  network.SetExtraHeadersResult
)

NetworkEvent = (
    network.AuthRequired //
    network.BeforeRequestSent //
    network.FetchError //
    network.ResponseCompleted //
    network.ResponseStarted
)


network.AuthChallenge = {
  scheme: text,
  realm: text,
}

network.BaseParameters = (
    context: browsingContext.BrowsingContext / null,
    isBlocked: bool,
    navigation: browsingContext.Navigation / null,
    redirectCount: js-uint,
    request: network.RequestData,
    timestamp: js-uint,
    ? userContext: browser.UserContext / null,
    ? intercepts: [+network.Intercept]
)

network.BytesValue = network.StringValue / network.Base64Value;

network.StringValue = {
  type: "string",
  value: text,
}

network.Base64Value = {
  type: "base64",
  value: text,
}

network.Collector = text

network.CollectorType = "blob"

network.SameSite = "strict" / "lax" / "none" / "default"


network.Cookie = {
    name: text,
    value: network.BytesValue,
    domain: text,
    path: text,
    size: js-uint,
    httpOnly: bool,
    secure: bool,
    sameSite: network.SameSite,
    ? expiry: js-uint,
    Extensible,
}

network.DataType = "request" / "response"

network.FetchTimingInfo = {
    timeOrigin: float,
    requestTime: float,
    redirectStart: float,
    redirectEnd: float,
    fetchStart: float,
    dnsStart: float,
    dnsEnd: float,
    connectStart: float,
    connectEnd: float,
    tlsStart: float,

    requestStart: float,
    responseStart: float,

    responseEnd: float,
}

network.Header = {
  name: text,
  value: network.BytesValue,
}

network.Initiator = {
    ? columnNumber: js-uint,
    ? lineNumber: js-uint,
    ? request: network.Request,
    ? stackTrace: script.StackTrace,
    ? type: "parser" / "script" / "preflight" / "other"
}

network.Intercept = text

network.Request = text;

network.RequestData = {
    request: network.Request,
    url: text,
    method: text,
    headers: [*network.Header],
    cookies: [*network.Cookie],
    headersSize: js-uint,
    bodySize: js-uint / null,
    destination: text,
    initiatorType: text / null,
    timings: network.FetchTimingInfo,
}

network.ResponseContent = {
    size: js-uint
}

network.ResponseData = {
    url: text,
    protocol: text,
    status: js-uint,
    statusText: text,
    fromCache: bool,
    headers: [*network.Header],
    mimeType: text,
    bytesReceived: js-uint,
    headersSize: js-uint / null,
    bodySize: js-uint / null,
    content: network.ResponseContent,
    ?authChallenges: [*network.AuthChallenge],
}

network.AddDataCollectorResult = {
  collector: network.Collector
}

network.AddInterceptResult = {
  intercept: network.Intercept
}

network.ContinueRequestResult = EmptyResult

network.ContinueResponseResult = EmptyResult

network.ContinueWithAuthResult = EmptyResult

network.DisownDataResult = EmptyResult

network.FailRequestResult = EmptyResult

network.GetDataResult = {
  bytes: network.BytesValue,
}

network.ProvideResponseResult = EmptyResult

network.RemoveDataCollectorResult = EmptyResult

network.RemoveInterceptResult = EmptyResult

network.SetCacheBehaviorResult = EmptyResult

network.SetExtraHeadersResult = EmptyResult

network.AuthRequired = (
  method: "network.authRequired",
  params: network.AuthRequiredParameters
)

network.AuthRequiredParameters = {
  network.BaseParameters,
  response: network.ResponseData
}

network.BeforeRequestSent = (
  method: "network.beforeRequestSent",
  params: network.BeforeRequestSentParameters
 )

network.BeforeRequestSentParameters = {
  network.BaseParameters,
  ? initiator: network.Initiator,
}

network.FetchError = (
  method: "network.fetchError",
  params: network.FetchErrorParameters
 )

network.FetchErrorParameters = {
  network.BaseParameters,
  errorText: text,
}

network.ResponseCompleted = (
  method: "network.responseCompleted",
  params: network.ResponseCompletedParameters
 )

network.ResponseCompletedParameters = {
  network.BaseParameters,
  response: network.ResponseData,
}

network.ResponseStarted = (
  method: "network.responseStarted",
  params: network.ResponseStartedParameters
 )

network.ResponseStartedParameters = {
  network.BaseParameters,
  response: network.ResponseData,
}

ScriptResult = (
  script.AddPreloadScriptResult /
  script.CallFunctionResult /
  script.DisownResult /
  script.EvaluateResult /
  script.GetRealmsResult /
  script.RemovePreloadScriptResult
)

ScriptEvent = (
  script.Message //
  script.RealmCreated //
  script.RealmDestroyed
)

script.Channel = text;

script.ChannelValue = {
  type: "channel",
  value: script.ChannelProperties,
}

script.ChannelProperties = {
  channel: script.Channel,
  ? serializationOptions: script.SerializationOptions,
  ? ownership: script.ResultOwnership,
}

script.EvaluationResult = (
  script.EvaluationResultSuccess /
  script.EvaluationResultException
)

script.EvaluationResultSuccess = {
  type: "success",
  result: script.RemoteValue,
  realm: script.Realm
}

script.EvaluationResultException = {
  type: "exception",
  exceptionDetails: script.ExceptionDetails
  realm: script.Realm
}

script.ExceptionDetails = {
  columnNumber: js-uint,
  exception: script.RemoteValue,
  lineNumber: js-uint,
  stackTrace: script.StackTrace,
  text: text,
}

script.Handle = text;

script.InternalId = text;

script.LocalValue = (
  script.RemoteReference /
  script.PrimitiveProtocolValue /
  script.ChannelValue /
  script.ArrayLocalValue /
  { script.DateLocalValue } /
  script.MapLocalValue /
  script.ObjectLocalValue /
  { script.RegExpLocalValue } /
  script.SetLocalValue
)

script.ListLocalValue = [*script.LocalValue];

script.ArrayLocalValue = {
  type: "array",
  value: script.ListLocalValue,
}

script.DateLocalValue = (
  type: "date",
  value: text
)

script.MappingLocalValue = [*[(script.LocalValue / text), script.LocalValue]];

script.MapLocalValue = {
  type: "map",
  value: script.MappingLocalValue,
}

script.ObjectLocalValue = {
  type: "object",
  value: script.MappingLocalValue,
}

script.RegExpValue = {
  pattern: text,
  ? flags: text,
}

script.RegExpLocalValue = (
  type: "regexp",
  value: script.RegExpValue,
)

script.SetLocalValue = {
  type: "set",
  value: script.ListLocalValue,
}

script.PreloadScript = text;

script.Realm = text;

script.PrimitiveProtocolValue = (
  script.UndefinedValue /
  script.NullValue /
  script.StringValue /
  script.NumberValue /
  script.BooleanValue /
  script.BigIntValue
)

script.UndefinedValue = {
  type: "undefined",
}

script.NullValue = {
  type: "null",
}

script.StringValue = {
  type: "string",
  value: text,
}

script.SpecialNumber = "NaN" / "-0" / "Infinity" / "-Infinity";

script.NumberValue = {
  type: "number",
  value: number / script.SpecialNumber,
}

script.BooleanValue = {
  type: "boolean",
  value: bool,
}

script.BigIntValue = {
  type: "bigint",
  value: text,
}

script.RealmInfo = (
  script.WindowRealmInfo /
  script.DedicatedWorkerRealmInfo /
  script.SharedWorkerRealmInfo /
  script.ServiceWorkerRealmInfo /
  script.WorkerRealmInfo /
  script.PaintWorkletRealmInfo /
  script.AudioWorkletRealmInfo /
  script.WorkletRealmInfo
)

script.BaseRealmInfo = (
  realm: script.Realm,
  origin: text
)

script.WindowRealmInfo = {
  script.BaseRealmInfo,
  type: "window",
  context: browsingContext.BrowsingContext,
  ? userContext: browser.UserContext,
  ? sandbox: text
}

script.DedicatedWorkerRealmInfo = {
  script.BaseRealmInfo,
  type: "dedicated-worker",
  owners: [script.Realm]
}

script.SharedWorkerRealmInfo = {
  script.BaseRealmInfo,
  type: "shared-worker"
}

script.ServiceWorkerRealmInfo = {
  script.BaseRealmInfo,
  type: "service-worker"
}

script.WorkerRealmInfo = {
  script.BaseRealmInfo,
  type: "worker"
}

script.PaintWorkletRealmInfo = {
  script.BaseRealmInfo,
  type: "paint-worklet"
}

script.AudioWorkletRealmInfo = {
  script.BaseRealmInfo,
  type: "audio-worklet"
}

script.WorkletRealmInfo = {
  script.BaseRealmInfo,
  type: "worklet"
}

script.RealmType = "window" / "dedicated-worker" / "shared-worker" / "service-worker" /
                   "worker" / "paint-worklet" / "audio-worklet" / "worklet"

script.RemoteReference = (
  script.SharedReference /
  script.RemoteObjectReference
)

script.SharedReference = {
   sharedId: script.SharedId

   ? handle: script.Handle,
   Extensible
}

script.RemoteObjectReference = {
   handle: script.Handle,

   ? sharedId: script.SharedId
   Extensible
}

script.RemoteValue = (
  script.PrimitiveProtocolValue /
  script.SymbolRemoteValue /
  script.ArrayRemoteValue /
  script.ObjectRemoteValue /
  script.FunctionRemoteValue /
  script.RegExpRemoteValue /
  script.DateRemoteValue /
  script.MapRemoteValue /
  script.SetRemoteValue /
  script.WeakMapRemoteValue /
  script.WeakSetRemoteValue /
  script.GeneratorRemoteValue /
  script.ErrorRemoteValue /
  script.ProxyRemoteValue /
  script.PromiseRemoteValue /
  script.TypedArrayRemoteValue /
  script.ArrayBufferRemoteValue /
  script.NodeListRemoteValue /
  script.HTMLCollectionRemoteValue /
  script.NodeRemoteValue /
  script.WindowProxyRemoteValue
)

script.ListRemoteValue = [*script.RemoteValue];

script.MappingRemoteValue = [*[(script.RemoteValue / text), script.RemoteValue]];

script.SymbolRemoteValue = {
  type: "symbol",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ArrayRemoteValue = {
  type: "array",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue,
}

script.ObjectRemoteValue = {
  type: "object",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.MappingRemoteValue,
}

script.FunctionRemoteValue = {
  type: "function",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.RegExpRemoteValue = {
  script.RegExpLocalValue,
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.DateRemoteValue = {
  script.DateLocalValue,
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.MapRemoteValue = {
  type: "map",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.MappingRemoteValue,
}

script.SetRemoteValue = {
  type: "set",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue
}

script.WeakMapRemoteValue = {
  type: "weakmap",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.WeakSetRemoteValue = {
  type: "weakset",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.GeneratorRemoteValue = {
  type: "generator",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ErrorRemoteValue = {
  type: "error",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ProxyRemoteValue = {
  type: "proxy",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.PromiseRemoteValue = {
  type: "promise",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.TypedArrayRemoteValue = {
  type: "typedarray",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.ArrayBufferRemoteValue = {
  type: "arraybuffer",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
}

script.NodeListRemoteValue = {
  type: "nodelist",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue,
}

script.HTMLCollectionRemoteValue = {
  type: "htmlcollection",
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.ListRemoteValue,
}

script.NodeRemoteValue = {
  type: "node",
  ? sharedId: script.SharedId,
  ? handle: script.Handle,
  ? internalId: script.InternalId,
  ? value: script.NodeProperties,
}

script.NodeProperties = {
  nodeType: js-uint,
  childNodeCount: js-uint,
  ? attributes: {*text => text},
  ? children: [*script.NodeRemoteValue],
  ? localName: text,
  ? mode: "open" / "closed",
  ? namespaceURI: text,
  ? nodeValue: text,
  ? shadowRoot: script.NodeRemoteValue / null,
}

script.WindowProxyRemoteValue = {
  type: "window",
  value: script.WindowProxyProperties,
  ? handle: script.Handle,
  ? internalId: script.InternalId
}

script.WindowProxyProperties = {
  context: browsingContext.BrowsingContext
}

script.ResultOwnership = "root" / "none"

script.SerializationOptions = {
  ? maxDomDepth: (js-uint / null) .default 0,
  ? maxObjectDepth: (js-uint / null) .default null,
  ? includeShadowTree: ("none" / "open" / "all") .default "none",
}

script.SharedId = text;

script.StackFrame = {
  columnNumber: js-uint,
  functionName: text,
  lineNumber: js-uint,
  url: text,
}

script.StackTrace = {
  callFrames: [*script.StackFrame],
}

script.Source = {
  realm: script.Realm,
  ? context: browsingContext.BrowsingContext,
  ? userContext: browser.UserContext
}

script.AddPreloadScriptResult = {
  script: script.PreloadScript
}

script.DisownResult = EmptyResult

script.CallFunctionResult = script.EvaluationResult

script.EvaluateResult = script.EvaluationResult

script.GetRealmsResult = {
  realms: [*script.RealmInfo]
}

script.RemovePreloadScriptResult = EmptyResult

script.Message = (
  method: "script.message",
  params: script.MessageParameters
 )

script.MessageParameters = {
  channel: script.Channel,
  data: script.RemoteValue,
  source: script.Source,
}

script.RealmCreated = (
 method: "script.realmCreated",
 params: script.RealmInfo
)

script.RealmDestroyed = (
  method: "script.realmDestroyed",
  params: script.RealmDestroyedParameters
)

script.RealmDestroyedParameters = {
  realm: script.Realm
}


StorageResult = (
  storage.DeleteCookiesResult /
  storage.GetCookiesResult /
  storage.SetCookieResult
)

storage.PartitionKey = {
  ? userContext: text,
  ? sourceOrigin: text,
  Extensible,
}

storage.GetCookiesResult = {
  cookies: [*network.Cookie],
  partitionKey: storage.PartitionKey,
}

storage.SetCookieResult = {
  partitionKey: storage.PartitionKey
}

storage.DeleteCookiesResult = {
  partitionKey: storage.PartitionKey
}

LogEvent = (
  log.EntryAdded
)

log.Level = "debug" / "info" / "warn" / "error"

log.Entry = (
  log.GenericLogEntry /
  log.ConsoleLogEntry /
  log.JavascriptLogEntry
)

log.BaseLogEntry = (
  level: log.Level,
  source: script.Source,
  text: text / null,
  timestamp: js-uint,
  ? stackTrace: script.StackTrace,
)

log.GenericLogEntry = {
  log.BaseLogEntry,
  type: text,
}

log.ConsoleLogEntry = {
  log.BaseLogEntry,
  type: "console",
  method: text,
  args: [*script.RemoteValue],
}

log.JavascriptLogEntry = {
  log.BaseLogEntry,
  type: "javascript",
}

log.EntryAdded = (
 method: "log.entryAdded",
 params: log.Entry,
)

InputResult = (
  input.PerformActionsResult /
  input.ReleaseActionsResult /
  input.SetFilesResult
)

InputEvent = (
  input.FileDialogOpened
)

input.PerformActionsResult = EmptyResult

input.ReleaseActionsResult = EmptyResult

input.SetFilesResult = EmptyResult

input.FileDialogOpened = (
   method: "input.fileDialogOpened",
   params: input.FileDialogInfo
)

input.FileDialogInfo = {
   context: browsingContext.BrowsingContext,
   ? userContext: browser.UserContext,
   ? element: script.SharedReference,
   multiple: bool,
}

WebExtensionResult = (
  webExtension.InstallResult /
  webExtension.UninstallResult
)

webExtension.Extension = text

webExtension.InstallResult = {
  extension: webExtension.Extension
}

webExtension.UninstallResult = EmptyResult

課題索引

この「イベントを待機する」という処理には、もっと良い仕組みがあるはずだ。 ↵
これがイベントループ上の他のどのタスクよりも前に実行されることを保証するため、 microtask のようなものを用意すべきか? ↵
これは付録にすべきか? ↵
単一のセッションに対して 1 つを超える接続をサポートするか? ↵
UTF-8 エラーにどのステータスコード が使用されるかを定義しているものがないように見える。 ↵
UA が必要に応じてリスナーを閉じられるようにするため、 セッション終了処理にフックする必要がある。 ↵
サンドボックス Realm の作成を定義する。これは SandboxWindowProxy でラップされた window を返すことになる。 ↵
SandboxProxy がどのように機能するかを詳細に定義する ↵
これがどのように機能するかを定義する。 ↵
ユーザーコンテキストの概念やストレージとの相互作用を正式に定義する方法として、 これが最善であるかは不明確である。 ↵
null でない opener を持つトップレベル ナビゲータブルは、 その opener と同じ関連付けられたユーザーコンテキストを持つと 規定すべきか? 既存の実装がこれを強制しているか確認する必要がある。 ↵
これはかなり不正確な表現だが、 意図としては、接続のシャットダウンを開始する前にコマンドへのレスポンスを送信する ということが明確であることを願う。 ↵
これは Realm でも機能するよう一般化する必要がある。 ↵
これは Realm でも機能するよう一般化する必要がある。 ↵
ignore cache フラグがどのように機能するかを適切に規定する。これには、 リソースの最初の読み込みだけがキャッシュをバイパスするのか (つまり、最初にキャッシュをクリアして通常どおり処理を進めるようなものか)、 それとも HTML パーサーによって直接読み込まれないリソース (例: スクリプトやスタイルシートによって開始される読み込み)もキャッシュをバイパスするのかを考慮する必要がある。 ↵
ここでエラーによって、何が失敗し、その理由が何かについて 十分な情報を公開しているだろうか?どのエラーコードにするか? ローカルエンドが実装定義の文字列を解析して、 実際に何が問題だったかを特定することにならないだろうか? ↵
これは更新 レンダリングアルゴリズムに、より明示的な方法で統合すべきである。 [w3c/webdriver-bidi Issue #1131] ↵
最後のトップレベル ナビゲータブルを閉じる際の動作について、未解決の議論がある。ブラウザーを閉じる、 セッションを閉じる、またはこれを実装に委ねることが考えられる。 [w3c/webdriver-bidi Issue #170] ↵
これは更新 レンダリングアルゴリズムに、より明示的な方法で統合すべきである。 [w3c/webdriver-bidi Issue #1131] ↵
記述されているアルゴリズムには競合状態がある。なぜなら、 ターゲットへのナビゲーションを試みる時点では、セッション履歴エントリーが 存在しない可能性があるためである。履歴のナビゲーションを待機する機能をサポートすれば、 これをより堅牢に処理できる。 ↵
`browsingContext.pageShow` イベントを公開するか?その場合、 bfcache の復元時だけでなく、`pageshow` が発行されるたびにこれを 呼び出す必要があり、さらに persisted 状態をデータに追加する必要がある。 ↵
アクティブな文書を持つ閲覧 コンテキストについてのみ、このイベントを発火すべきかどうかは不明である。ナビゲーションによってコンテキストが アクセス不能になる場合もあるが、bfcache のためまだ破棄されていないことがある。 ↵
このアルゴリズムを画面向き仕様へ移動する。 ↵
これはナビゲータブルに関連しないデータが収集されることを防ぐ。 コレクター構成と照合するためにナビゲータブルを取得する必要は依然としてあるが、 ここでは null も受け入れられる可能性がある。 ↵
これには認証をキャンセルする方法がない。 ↵
Realm 以外のパラメーターも含めるべきか? ↵
Fetch と同様に、複数の ヘッダーやパースの問題などを処理する方法として、これが正しいかは不明である。 ↵
コンテキストに加えて、リクエストを開始した文書ノードの `sharedId` を 含めることを検討する。 ↵
「request already sent」エラーを検討する。 ↵
正確な種類のエラーを設定できるようにする [Issue #508] ↵
Fetch の「HTTP-network-or-cache fetch」アルゴリズムの戻り値を尊重する。 ↵
これは誤ったエラーコードを使用している ↵
これは単独サロゲートを処理しない ↵
「stale object reference」の場合を処理する。 ↵
WASM 型を追加するか? ↵
WindowProxy は Node と同様の形式で属性を取得すべきか? ↵
String / Number / などのラッパーオブジェクトを特別に処理するか? ↵
ミラーオブジェクトのライフサイクルを再検討する。 ↵
children と子ノードは異なるものである。childNodeCount は childNodes を参照するか、または childrenCount に名前を変更すべきである。 ↵
これは誤ったエラーコードを使用している ↵
これは誤ったエラーコードを使用している ↵
TODO: script.evaluate で説明されているように timeout 引数を追加する。 ↵
これを拡張して、ネストされたワーカーなどに対して Realm の親も許可するか?または、すべての祖先 ワーカーを取得する。 ↵
単なる リテラル一致よりも高度なフィルターシステムが必要になるかもしれない。 ↵
ここでの順序をより明確に定義すべきか? ↵
これを閲覧コンテキストとトップレベルナビゲータブルのどちらをキーにすべきか? 違いは、フレーム内でイベントが発生し、そのフレームが ローカルエンドがトップレベルナビゲータブルのログイベントを購読する前にナビゲートされた 場合に何が起こるかにある。 ↵
ロギングを必要とするものはさらに多数ある。CDP には LogEntryAdded の型として xml、 javascript、network、storage、appcache、rendering、security、deprecation、 worker、violation、intervention、recommendation、other がある。これらは、 異なるメソッドで表現される js 例外および console API の型に加えて存在する。 ↵
実装定義のログ型を許可する ↵
https://github.com/w3c/csswg-drafts/pull/13549 がマージされた後に削除する。 ↵
https://github.com/w3c/csswg-drafts/pull/13548 がマージされた後に削除する。 ↵