WebDriver BiDi

W3C 작업 초안,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-webdriver-bidi-20260511/
최신 공개 버전:
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
위키:
W3C WebDriver 위키

초록

이 문서는 사용자 에이전트를 원격 제어하기 위한 메커니즘인 양방향 WebDriver 프로토콜을 정의한다.

이 문서의 상태

이 절은 이 문서가 공개된 시점의 상태를 설명한다. 현재 W3C 공개 문서 및 이 기술 보고서의 최신 개정판 목록은 W3C 표준 및 초안 색인에서 찾을 수 있다.

이 명세에 관한 논의에는 GitHub 이슈가 권장된다. 또는 Browser Testing and Tools Working Group의 메일링 리스트인 public-browser-tools-testing@w3.org로 의견을 보낼 수 있다 (아카이브).

이 문서는 Browser Testing and Tools Working GroupRecommendation 트랙을 사용하여 작업 초안으로 공개하였다.

작업 초안으로 공개되었다고 해서 W3C와 그 회원들의 승인을 의미하지는 않는다.

이 문서는 초안 문서이며 언제든지 다른 문서에 의해 갱신, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성하였다. W3C는 그룹의 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지하며, 해당 페이지에는 특허 공개 방법에 관한 지침도 포함되어 있다. 개인이 필수 청구항을 포함한다고 믿는 특허에 대해 실제 지식을 가진 경우, 그 개인은 W3C 특허 정책 제6절에 따라 해당 정보를 공개해야 한다.

이 문서는 2025년 8월 18일 W3C Process Document의 적용을 받는다.

1. 소개

이 절은 비규범적이다.

WebDriver는 사용자 에이전트의 내부 상태 조사 및 원격 제어를 위한 프로토콜을 정의한다. 이 명세는 양방향 통신을 도입하여 WebDriver를 확장한다. WebDriver의 엄격한 명령/응답 형식 대신, 이를 통해 이벤트가 사용자 에이전트에서 제어 소프트웨어로 스트리밍될 수 있으므로, 브라우저 DOM의 이벤트 기반 특성에 더 잘 부합한다.

2. 인프라스트럭처

이 명세는 Infra Standard에 의존한다. [INFRA]

네트워크 프로토콜 메시지는 CDDL을 사용하여 정의한다. [RFC8610]

이 명세는 대기 큐를 정의한다.

이 "이벤트 대기" 작업을 수행하는 더 나은 메커니즘이 분명히 있을 것이다.

병렬로 실행 중인 알고리즘 algorithm이 이벤트 집합 eventsresume id대기할 때:

  1. algorithm의 실행을 일시 중지한다.

  2. 단언: 대기 큐resume id를 포함하지 않는다.

  3. 대기 큐[resume id]를 (events, algorithm)으로 설정한다.

주어진 name, idparameters재개하려면:
  1. 대기 큐id를 포함하지 않으면, 반환한다.

  2. (events, algorithm)을 대기 큐[id]로 둔다.

  3. events의 각 event에 대해:

    1. eventname과 같으면:

      1. 대기 큐에서 id를 제거한다.

      2. algorithm의 단계들을 일시 중지된 지점부터 계속 실행하며, nameparameters대기의 결과로 전달한다.

        이것이 이벤트 루프의 다른 어떤 작업보다 먼저 실행되도록 보장하기 위해 마이크로태스크 같은 것이 있어야 하는가?

WebDriver 구성은 다음을 가진 구조체이다:

WebDriver 구성은 타입인 연관 타입을 가진다.

WebDriver 구성은 그 구성의 연관 타입인 타입을 가진 값이거나 설정되지 않음이다.

설정되지 않음은 특정 구성 이 설정되지 않았음을 나타내는 값이다.

참고: 이 알고리즘은 주어진 navigable에 대한 WebDriver 구성에 접근할 수 있게 하며, navigables의 값을 확인한 다음, user contexts를 확인하고 마지막으로 global을 확인한다. 구성이 설정되어 있지 않으면 설정되지 않음을 반환한다.

WebDriver 구성 configurationnavigable navigable에 대한 WebDriver 구성 값 가져오기를 하려면:

  1. top-level traversablenavigable최상위 traversable로 둔다.

  2. configurationnavigablestop-level traversable포함하면:

    1. navigable configuration valueconfigurationnavigables[top-level traversable]로 둔다.

    2. navigable configuration value설정되지 않음이 아니면, navigable configuration value를 반환한다.

  3. user contextnavigable연관된 사용자 컨텍스트로 둔다.

  4. configurationuser contextsuser context포함하면:

    1. user context configuration valueconfigurationuser contexts[user context]로 둔다.

    2. user context configuration value설정되지 않음이 아니면, user context configuration value를 반환한다.

  5. configurationglobal을 반환한다.

참고: 이는 target별로 WebDriver 구성을 저장하기 위한 일반 알고리즘이다. targetnavigable, 사용자 컨텍스트 중 하나일 수 있으며, target이 null이거나 생략된 경우 전역으로 저장한다.

제공되지 않은 경우 null인 선택적 targetWebDriver 구성 configuration value저장하려면, 여기서 targetnavigable, 사용자 컨텍스트 또는 null이다:

  1. target이 null이면, configurationglobalvalue로 설정한다.

  2. target사용자 컨텍스트이면, configurationuser contexts[target]를 value로 설정한다.

  3. targetnavigable이면, configurationnavigables[target]를 value로 설정한다.

참고: 이 일반 알고리즘은 command parameters에 "userContexts"와 "contexts"가 있는지에 따라 WebDriver 구성global, user contexts, 또는 navigables에 저장한다. 이 매개변수들은 서로 배타적이다. 둘 다 제공되지 않으면, 구성은 전역으로 저장된다.

주어진 command parameters에 대해 WebDriver 구성 configuration valueWebDriver 구성 저장하려면:

  1. command parameters가 "userContexts"를 포함하고 command parameters가 "contexts"를 포함하면, 오류를 반환하되, 오류 코드invalid argument로 한다.

  2. affected navigables를 빈 집합으로 둔다.

  3. command parameters가 "contexts"를 포함하면:

    1. navigablescommand parameters["contexts"]를 사용하여 id로 유효한 최상위 traversable 가져오기시도한 결과로 둔다.

    2. navigables의 각 navigable에 대해:

      1. navigableaffected navigables추가한다.

      2. configurationvaluenavigable저장한다.

  4. 그렇지 않고, command parameters가 "userContexts"를 포함하면:

    1. user contextscommand parameters["userContexts"]를 사용하여 유효한 사용자 컨텍스트 가져오기시도한 결과로 둔다.

    2. user contexts의 각 user context에 대해:

      1. top-level traversable에 대해, 그 연관된 사용자 컨텍스트user context인 모든 최상위 traversable의 목록에서:

        1. top-level traversableaffected navigables추가한다.

      2. configurationvalueuser context저장한다.

  5. 그렇지 않으면:

    1. 모든 최상위 traversable의 각 top-level traversable에 대해, top-level traversableaffected navigables추가한다.

    2. configurationvalue저장한다.

  6. affected navigables를 반환한다.

3. 프로토콜

이 절은 WebDriver BiDi 프로토콜의 기본 개념을 정의한다. 이러한 용어는 전송 계층에서의 표현과는 구별된다.

이 프로토콜은 CDDL 정의를 사용하여 정의한다. 구현자의 편의를 위해 두 개의 별도 CDDL 정의를 정의한다. 즉, 로컬 끝에서 생성되고 원격 끝에서 소비되는 메시지의 형식을 정의하는 원격 끝 정의와, 원격 끝에서 생성되고 로컬 끝에서 소비되는 메시지의 형식을 정의하는 로컬 끝 정의이다.

3.1. 정의

이것은 부록이어야 하는가?

이 절은 원격 끝 정의로컬 끝 정의의 초기 내용을 제공한다. 이들은 명세의 나머지 부분에서 정의된 정의 조각들에 의해 보강된다.

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
)

원격 끝 정의로컬 끝 정의

Extensible = (*text => any)

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

3.2. 세션

WebDriver BiDi는 WebDriver세션 개념을 확장한다.

세션은 별도로 명시하지 않는 한 false인 BiDi 플래그를 가진다.

BiDi 세션세션이며, 그 BiDi 플래그가 true로 설정되어 있다.

활성 BiDi 세션의 목록은 다음으로 주어진다:
  1. BiDi sessions를 새 목록으로 둔다.

  2. 활성 세션의 각 session에 대해:

    1. sessionBiDi 세션이면, sessionBiDi sessions에 추가한다.

  3. BiDi sessions를 반환한다.

3.3. 모듈

WebDriver BiDi 프로토콜은 모듈로 구성된다.

모듈은 사용자 에이전트의 특정 측면과 관련된 명령이벤트의 모음을 나타낸다. 예를 들어, 모듈은 DOM을 검사하고 조작하는 기능이나 스크립트 실행 기능을 포함할 수 있다.

각 모듈은 문자열인 모듈 이름을 가진다. 모듈에 정의된 명령과 이벤트의 명령 이름이벤트 이름모듈 이름으로 시작하고 그 뒤에 마침표 "."가 온다.

명령을 포함하는 모듈은 원격 끝 정의 조각을 정의한다. 이 조각은 모듈의 명령에 대해 CommandData 그룹에 선택지를 제공하며, 추가 정의 속성도 정의할 수 있다. 또한 모듈의 명령 결과에 대해 ResultData 그룹에 추가 선택지를 제공하는 로컬 끝 정의 조각을 정의할 수도 있다.

이벤트를 포함하는 모듈은 모듈의 이벤트에 대해 Event 그룹의 선택지인 로컬 끝 정의 조각을 정의한다.

구현은 확장 모듈을 정의할 수 있다. 이러한 모듈은 단일 콜론 ":" 문자를 포함하는 모듈 이름을 가져야 한다. 콜론 앞부분은 접두사이며, 이는 일반적으로 주어진 구현에 특화된 모든 확장 모듈에서 동일하고, 주어진 구현에 대해 고유해야 한다.

다른 명세는 프로토콜을 확장하는 자체 WebDriver-BiDi 모듈을 정의할 수 있다. 그러한 모듈은 콜론(:) 문자를 포함하는 이름을 가져서는 안 되며, 해당 문자를 포함하는 명령 이름, 이벤트 이름, 또는 속성 이름을 정의해서도 안 된다.

외부 명세의 저자는 기존 모듈을 확장하기보다 새 모듈을 추가하는 것이 권장된다. 기존 모듈을 확장하고자 하는 경우에는, 해당 확장을 원래 모듈 정의를 포함하는 명세에 직접 통합하는 것이 바람직하다.

3.4. 명령

명령은 비동기 동작으로, 로컬 끝에서 요청하고 원격 끝에서 실행되며, 그 결과로 결과 또는 오류가 로컬 끝에 반환된다. 여러 명령은 동시에 실행될 수 있으며, 명령은 잠재적으로 오래 실행될 수 있다. 그 결과, 명령은 순서와 다르게 완료될 수 있다.

명령은 다음으로 정의된다:

활성 세션 없이 실행될 수 있는 명령은 정적 명령이다. 정의에서 명시하지 않는 한 명령은 정적 명령이 아니다.

명령이 로컬 끝에서 전송될 때, 명령은 명령 id를 가진다. 이는 특정 명령의 응답을 식별하기 위해 로컬 끝이 사용하는 식별자이다. 원격 끝의 관점에서 이 식별자는 불투명하며, 명령을 식별하기 위해 내부적으로 사용할 수 없다.

참고: 이는 명령 id가 전적으로 로컬 끝에 의해 제어되고, 세션 과정에서 반드시 고유한 것은 아니기 때문이다. 예를 들어 모든 응답을 무시하는 로컬 끝은 각 명령에 동일한 명령 id를 사용할 수 있다.

모든 명령 이름의 집합은 정의된 모든 명령 이름을 포함하는 집합이며, 확장 모듈에 속한 것도 포함한다.

3.5. 오류

WebDriver BiDi는 WebDriver오류 코드 집합을 다음 추가 코드로 확장한다:

invalid web extension
유효하지 않은 웹 확장을 설치하려고 했다.
no such client window
알 수 없는 클라이언트 창과 상호작용하려고 했다.
no such handle
알 수 없는 RemoteObjectReference를 역직렬화하려고 했다.
no such history entry
알 수 없는 세션 히스토리 항목으로 이동하려고 했다.
no such network collector
알 수 없는 컬렉터를 제거하려고 했다.
no such intercept
알 수 없는 네트워크 인터셉트를 제거하려고 했다.
no such network data
알 수 없는 네트워크 데이터를 참조하려고 했다.
no such node
알 수 없는 SharedReference를 역직렬화하려고 했다.
no such request
알 수 없는 요청을 계속하려고 했다.
no such script
알 수 없는 프리로드 스크립트를 제거하려고 했다.
no such storage partition
존재하지 않는 저장소 파티션의 데이터에 접근하려고 했다.
no such user context
알 수 없는 사용자 컨텍스트를 참조하려고 했다.
no such web extension
알 수 없는 웹 확장을 참조하려고 했다.
unable to close browser
브라우저를 닫으려고 했지만 실패했다.
unable to set 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 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. 이벤트

이벤트원격 끝에서 로컬 끝으로 전송되는 알림으로, 원격 끝에서 관심 있는 일이 발생했음을 알린다.

BiDi 세션구독목록구독을 가진다.

BiDi 세션로컬 끝에 발급되었지만 아직 구독 해제되지 않은 모든 구독 id집합알려진 구독 id를 가진다.

구독구조체이며, 구독 id(문자열), 이벤트 이름(이벤트 이름의 집합), 최상위 traversable id(최상위 traversable ID의 집합) 및 사용자 컨텍스트 id(사용자 컨텍스트 ID의 집합)로 구성된다.

구독 subscriptionsubscription최상위 traversable id가 빈 집합이고 subscription사용자 컨텍스트 id가 빈 집합이면 전역이다.

event namenavigables가 주어졌을 때 이벤트가 활성화된 세션의 집합은 다음과 같다:

  1. sessions를 새 집합으로 둔다.

  2. 활성 BiDi 세션의 각 session에 대해:

    1. session, event namenavigables이벤트가 활성화되어 있으면, sessionsessions에 추가한다.

  3. sessions를 반환한다.

주어진 session, event namenavigables에 대해 이벤트가 활성화되어 있는지 결정하려면:

참고: 공유 워커는 여러 컨텍스트와 연관될 수 있으므로, navigables는 집합이다.

  1. top-level traversablesnavigables최상위 traversable 가져오기를 수행한 결과로 둔다.

  2. session구독에 있는 각 subscription에 대해:

    1. subscription이벤트 이름event name포함하지 않으면, 계속한다.

    2. subscription전역이면 true를 반환한다.

    3. 사용자 컨텍스트 id가 비어 있지 않으면:

      1. top-level traversables의 각 navigable에 대해:

        1. subscription사용자 컨텍스트 idnavigable연관된 사용자 컨텍스트사용자 컨텍스트 id포함하면, true를 반환한다.

    4. 그렇지 않으면:

      1. subscription top-level traversablessubscription최상위 traversable idid로 navigable 가져오기를 수행한 결과로 둔다.

      2. top-level traversablessubscription top-level traversables교집합비어 있지 않으면 true를 반환한다.

  3. false를 반환한다.

event namesession이 주어졌을 때 이벤트가 활성화된 최상위 traversable의 집합은 다음과 같다:

  1. result를 새 집합으로 둔다.

  2. session구독에 있는 각 subscription에 대해:

    1. subscription이벤트 이름event name포함하지 않으면, 계속한다.

    2. subscription전역이면:

      1. 원격 끝의 최상위 traversable에 있는 각 traversable에 대해:

        1. traversableresult추가한다.

      2. 중단한다.

    3. 그렇지 않고, 사용자 컨텍스트 id가 비어 있지 않으면:

      1. 원격 끝의 최상위 traversable에 있는 각 traversable에 대해:

        1. subscription사용자 컨텍스트 idtraversable연관된 사용자 컨텍스트사용자 컨텍스트 id포함하면, traversableresult추가한다.

    4. 그렇지 않으면:

      1. top-level traversablessubscription최상위 traversable idid로 navigable 가져오기를 수행한 결과로 둔다.

      2. top-level traversables의 각 항목을 result추가한다.

  3. result를 반환한다.

주어진 name에 대해 이벤트 이름 집합 얻기를 하려면:
  1. events를 빈 집합으로 둔다.

  2. name이 U+002E(마침표)를 포함하면:

    1. name이 이벤트의 이벤트 이름이면, nameevents에 추가하고 데이터 events와 함께 성공을 반환한다.

    2. 오류를 반환하되, 오류 코드invalid argument로 한다.

  3. 그렇지 않으면 name은 모듈의 모든 이벤트를 나타내는 것으로 해석된다. name모듈 이름이 아니면, 오류를 반환하되, 오류 코드invalid argument로 한다.

  4. 이름이 name인 모듈의 각 이벤트에 대한 이벤트 이름events에 추가한다.

  5. 데이터 events와 함께 성공을 반환한다.

4. 전송

메시지 전송은 WebSocket 프로토콜을 사용하여 제공된다. [RFC6455]

참고: WebSocket 프로토콜의 용어로는, 로컬 끝이 클라이언트이고 원격 끝이 서버 / 원격 호스트이다.

참고: 명령이벤트를 메시지로 인코딩하는 방식은 JSON-RPC와 유사하지만, 이 명세는 이를 규범적으로 참조하지 않는다. [JSON-RPC] 대신 원격 끝에 대한 규범적 요구사항은 정밀한 처리 모델로 주어지며, 로컬 끝에 대해서는 규범적 요구사항이 주어지지 않는다.

WebSocket 리스너는 들어오는 WebSocket 연결을 받아들일 수 있는 네트워크 엔드포인트이다.

WebSocket 리스너호스트, 포트, 보안 플래그, 그리고 WebSocket 리소스 목록을 가진다.

WebSocket 리스너 listener가 생성될 때, 원격 끝listener호스트포트로 주어진 호스트와 포트에서 WebSocket 연결 수신을 시작해야 한다. listener보안 플래그가 설정되어 있으면, listener에서 수립된 연결은 TLS로 암호화되어야 한다.

원격 끝집합WebSocket 리스너활성 리스너를 가지며, 이는 처음에 비어 있다.

원격 끝집합세션과 연결되지 않은 WebSocket 연결을 가지며, 이는 처음에 비어 있다.

WebSocket 연결WebSocket 프로토콜의 요구사항을 따르는 네트워크 연결이다

BiDi 세션은 그 원소가 WebSocket 연결집합세션 WebSocket 연결을 가진다. 이는 처음에 비어 있다.

BiDi 세션 sessionsession세션 WebSocket 연결connection을 포함하면 connection연결되어 있다.

참고:WebSocket 연결은 최대 하나의 BiDi 세션과 연결된다.

클라이언트가 WebSocket 연결을 수립하여 활성 리스너 집합 중 하나인 listener에 연결할 때, 구현은 WebSocket 서버 측 요구사항에 따라 진행해야 하며, 들어오는 연결을 수락할지 결정할 때 다음 단계를 실행한다:

  1. resource name클라이언트의 opening handshake 읽기에서 얻은 리소스 이름으로 둔다. resource namelistenerWebSocket 리소스 목록에 없으면, 이 단계의 실행을 중지하고 요청된 서비스를 사용할 수 없는 것처럼 동작한다.

  2. resource name이 바이트 문자열 "/session"이고, 구현이 BiDi 전용 세션을 지원하면:

    1. 연결을 수락할지 결정하기 위해 구현 정의의 다른 단계를 실행하고, 수락하지 않으면 이 단계의 실행을 중지하고 요청된 서비스를 사용할 수 없는 것처럼 동작한다.

    2. 연결을 세션과 연결되지 않은 WebSocket 연결에 추가한다.

    3. 반환한다.

  3. resource name으로 WebSocket 리소스에 대한 세션 ID 가져오기를 수행하고, session id를 그 값으로 둔다. session id가 null이면 이 단계의 실행을 중지하고 요청된 서비스를 사용할 수 없는 것처럼 동작한다.

  4. 활성 세션 목록에 session id를 그 세션 ID로 가지는 세션이 있으면, session을 그 세션으로 둔다. 그렇지 않으면 이 단계의 실행을 중지하고 요청된 서비스를 사용할 수 없는 것처럼 동작한다.

  5. 연결을 수락할지 결정하기 위해 구현 정의의 다른 단계를 실행하고, 수락하지 않으면 이 단계의 실행을 중지하고 요청된 서비스를 사용할 수 없는 것처럼 동작한다.

  6. 그렇지 않으면 connectionsession세션 WebSocket 연결에 추가하고, 서버가 들어오는 연결을 수락하기로 선택할 때의 WebSocket 서버 측 요구사항으로 진행한다.

하나의 세션에 대해 둘 이상의 연결을 지원하는가?

WebSocket 메시지가 수신되었을 때, 타입 type 및 데이터 data를 가진 WebSocket 연결 connection에 대해, 원격 끝connection, type, data가 주어졌을 때 들어오는 메시지 처리를 해야 한다.

WebSocket closing handshake가 시작될 때 또는 WebSocket 연결이 닫힐 때, WebSocket 연결 connection에 대해, 원격 끝connection이 주어졌을 때 연결 닫힘 처리를 해야 한다.

참고: closing handshake 없이 WebSocket 연결이 닫힐 수 있으므로 두 조건이 모두 필요하다.

세션 session이 주어졌을 때 WebSocket 리소스 이름 구성을 하려면:

  1. session이 null이면, "/session"을 반환한다

  2. 문자열 "/session/"과 session세션 ID를 연결한 결과를 반환한다.

WebSocket 리스너 listener세션 session이 주어졌을 때 WebSocket URL 구성을 하려면:

  1. resource namesession으로 WebSocket 리소스 이름 구성을 수행한 결과로 둔다.

  2. WebSocket URI를 반환한다. 이는 호스트를 listener호스트로, 포트를 listener포트로, 경로를 resource name으로 설정하여 구성하며, listener보안 플래그가 설정되어 있으면 wss-URI 구성을 따르고, 그렇지 않으면 ws-URL 구성을 따른다.

resource name이 주어졌을 때 WebSocket 리소스에 대한 세션 ID 가져오기를 하려면:

  1. resource name이 바이트 문자열 "/session/"으로 시작하지 않으면 null을 반환한다.

  2. session idresource name에서 "/session/" 접두사 뒤의 바이트로 둔다.

  3. session idUUID의 문자열 표현이 아니면 null을 반환한다.

  4. session id를 반환한다.

세션 session이 주어졌을 때 WebSocket 연결 수신 시작을 하려면:
  1. 활성 리스너원격 끝이 재사용하고자 하는 기존 WebSocket 리스너가 있으면, listener를 그 리스너로 둔다. 그렇지 않으면 listener구현 정의 호스트, 포트, 보안 플래그, 그리고 빈 WebSocket 리소스 목록을 가진 새 WebSocket 리스너로 둔다.

  2. resource namesession으로 WebSocket 리소스 이름 구성을 수행한 결과로 둔다.

  3. resource namelistenerWebSocket 리소스 목록에 추가한다.

  4. listener원격 끝활성 리스너추가한다.

  5. listener를 반환한다.

참고: 여러 세션을 처리하는 중개 노드는 하나 또는 여러 WebSocket 리스너를 사용할 수 있다. WebDriver엔드포인트 노드가 한 번에 최대 하나의 세션을 지원한다고 정의하므로, 단일 리스너만 가질 것으로 예상된다.

참고: 엔드포인트 노드의 경우 위 단계의 호스트는 일반적으로 "localhost"이다.

WebSocket 연결 connection, 타입 type, 데이터 data가 주어졌을 때 들어오는 메시지 처리를 하려면:
  1. typetext가 아니면, connection, null 및 invalid argument가 주어졌을 때 오류 응답 전송을 하고, 마지막으로 반환한다.

  2. 단언: data스칼라 값 문자열이다. 그렇지 않으면 WebSocket의 UTF-8로 인코딩된 데이터의 오류 처리가 이미 WebSocket 연결을 실패시켰을 것이기 때문이다.

    UTF-8 오류에 어떤 상태 코드를 사용하는지는 아무것도 정의하지 않는 듯하다.

  3. connection연결된 BiDi 세션이 있으면, session을 그 세션으로 둔다. 그렇지 않고 connection세션과 연결되지 않은 WebSocket 연결에 있으면, session을 null로 둔다. 그렇지 않으면 반환한다.

  4. parseddata가 주어졌을 때 JSON을 Infra 값으로 파싱한 결과로 둔다. 이것이 예외를 던지면, connection, null 및 invalid argument가 주어졌을 때 오류 응답 전송을 하고, 마지막으로 반환한다.

  5. session이 null이 아니고 활성 세션에 없으면 반환한다.

  6. parsed원격 끝 정의와 대조한다. 이것이 일치하면:

    1. matched를 일치한 데이터를 나타내는 으로 둔다.

    2. 단언: matched는 "id", "method" 및 "params"를 포함한다.

    3. command idmatched["id"]로 둔다.

    4. methodmatched["method"]로 둔다

    5. commandmethod라는 명령 이름을 가진 명령으로 둔다.

    6. session이 null이고 command정적 명령이 아니면, connection, command id, 그리고 invalid session id가 주어졌을 때 오류 응답 전송을 하고 반환한다.

    7. 다음 단계를 병렬로 실행한다:

      1. resultsession명령 매개변수 matched["params"]가 주어졌을 때 command원격 끝 단계를 실행한 결과로 둔다.

      2. result오류이면, connection, command id, 그리고 result오류 코드가 주어졌을 때 오류 응답 전송을 하고, 마지막으로 반환한다.

      3. valueresult의 데이터로 둔다.

      4. 단언: valuemethod라는 명령 이름을 가진 명령에 대응하는 결과 타입의 정의와 일치한다.

      5. method가 "session.new"이면, session활성 세션 목록에서 그 세션 IDvalue의 "sessionId" 속성과 같은 항목으로 두고, connectionsession세션 WebSocket 연결추가하며, connection세션과 연결되지 않은 WebSocket 연결에서 제거한다.

      6. response로컬 끝 정의CommandResponse 생성규칙과 일치하는 새 으로 둔다. 이때 id 필드는 command id로 설정하고 value 필드는 value로 설정한다.

      7. serializedresponse가 주어졌을 때 infra 값을 JSON 바이트로 직렬화한 결과로 둔다.

      8. serialized로 구성된 WebSocket 메시지를 전송하되, connection을 통해 전송한다.

  7. 그렇지 않으면:

    1. command id를 null로 둔다.

    2. parsed이고 parsed["id"]가 존재하며 0 이상의 정수이면, command id를 그 정수로 설정한다.

    3. error codeinvalid argument로 둔다.

    4. parsed이고 parsed["method"]가 존재하며 문자열이지만, parsed["method"]가 모든 명령 이름의 집합에 없으면, error codeunknown command로 설정한다.

    5. connection, command id, 그리고 error code가 주어졌을 때 오류 응답 전송을 한다.

settings 객체 settings가 주어졌을 때 관련 navigable 가져오기를 하려면:

  1. related navigables를 빈 집합으로 둔다.

  2. settings관련 전역 객체Window이면:

    1. navigable관련 전역 객체연관된 Documentnode navigable로 둔다.

    2. navigable이 null이 아니면, navigablerelated navigables에 추가한다.

  3. 그렇지 않고 settings로 지정된 전역 객체WorkerGlobalScope이면, 그 전역 객체소유자 집합의 각 owner에 대해:

    1. navigable을 null로 둔다.

    2. ownerDocument이면, navigableownernode navigable로 설정한다.

    3. navigable이 null이 아니면, navigablerelated navigables에 추가한다.

  4. related navigables를 반환한다.

컨텍스트 id의 목록 navigable ids가 주어졌을 때 id로 navigable 가져오기를 하려면:

  1. result를 빈 집합으로 둔다.

  2. navigable ids의 각 navigable id에 대해:

    1. 그러한 navigable이 존재하면 navigable을 id가 navigable idnavigable로 두고, 그렇지 않으면 null로 둔다.

    2. navigable이 null이 아니면 navigableresult추가한다.

  3. result를 반환한다.

navigable목록 navigables가 주어졌을 때 최상위 traversable 가져오기를 하려면:

  1. result를 빈 집합으로 둔다.

  2. navigables의 각 navigable에 대해:

    1. navigable최상위 traversableresult추가한다.

  3. result를 반환한다.

컨텍스트 id의 목록 navigable ids가 주어졌을 때 id로 유효한 navigable 가져오기를 하려면:

  1. result를 빈 집합으로 둔다.

  2. navigable ids의 각 navigable id에 대해:

    1. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

    2. navigableresult추가한다.

  3. 데이터 result와 함께 성공을 반환한다.

컨텍스트 id의 목록 navigable ids가 주어졌을 때 id로 유효한 최상위 traversable 가져오기를 하려면:

  1. result를 빈 집합으로 둔다.

  2. navigable ids의 각 navigable id에 대해:

    1. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

    2. navigable최상위 traversable이 아니면, 오류를 반환하되 오류 코드invalid argument로 한다.

    3. navigableresult추가한다.

  3. 데이터 result와 함께 성공을 반환한다.

sessionbody가 주어졌을 때 이벤트 방출을 하려면:
  1. 단언: bodyEvent 생성규칙과 일치한다.

  2. serializedbody가 주어졌을 때 infra 값을 JSON 바이트로 직렬화한 결과로 둔다.

  3. session세션 WebSocket 연결에 있는 각 connection에 대해:

    1. serialized로 구성된 WebSocket 메시지를 전송하되, connection을 통해 전송한다.

WebSocket 연결 connection, command id, 그리고 error code가 주어졌을 때 오류 응답 전송을 하려면:
  1. error data로컬 끝 정의ErrorResponse 생성규칙과 일치하는 새 으로 둔다. 이때 id 필드는 command id로 설정하고, error 필드는 error code로 설정하며, message 필드는 발생한 오류에 대한 사람이 읽을 수 있는 정의를 포함하는 구현 정의 문자열로 설정하고, stacktrace 필드는 오류가 발생한 시점의 활성 스택 프레임에 대한 스택 추적 보고서를 포함하는 구현 정의 문자열로 선택적으로 설정한다.

  2. responseerror data가 주어졌을 때 infra 값을 JSON 바이트로 직렬화한 결과로 둔다.

    참고: command id는 null일 수 있으며, 이 경우 id 필드도 response에서 생략되지 않고 null로 설정된다.

  3. response로 구성된 WebSocket 메시지를 전송하되, connection을 통해 전송한다.

WebSocket 연결 connection이 주어졌을 때 연결 닫힘 처리를 하려면:

  1. connection연결된 BiDi 세션이 있으면:

    1. sessionconnection연결된 BiDi 세션으로 둔다.

    2. connectionsession세션 WebSocket 연결에서 제거한다.

  2. 그렇지 않고, 세션과 연결되지 않은 WebSocket 연결connection포함하면, connection을 그 집합에서 제거한다.

참고: 이는 어떤 세션도 종료하지 않는다.

UA가 원할 경우 리스너를 닫을 수 있도록 세션 종료에 연결해야 한다.

session이 주어졌을 때 WebSocket 연결 닫기를 하려면:

  1. session세션 WebSocket 연결에 있는 각 connection에 대해:

    1. connection으로 WebSocket closing handshake를 시작한다.

      참고: 이는 connection에 대해 연결 닫힘 처리 단계가 실행되도록 하며, 이 단계는 connection과 관련된 리소스를 정리한다.

4.1. 연결 수립

WebDriver 클라이언트는 값이 true인 WebSocket URL 기능을 요청하여 양방향 연결을 선택한다.

이 명세에서 정의하는 WebDriver 새 세션 알고리즘은 매개변수 session, capabilities, flags에 대해 다음과 같다:
  1. flags가 "bidi"를 포함하면 반환한다.

  2. webSocketUrlcapabilities에서 "webSocketUrl"이라는 이름의 속성 가져오기를 수행한 결과로 둔다.

  3. webSocketUrl이 undefined이면 반환한다.

  4. 단언: webSocketUrl은 true이다.

  5. listenersession이 주어졌을 때 WebSocket 연결 수신 시작을 수행한 결과로 둔다.

  6. webSocketUrllistenersession으로 WebSocket URL 구성을 수행한 결과로 설정한다.

  7. capabilities에 "webSocketUrl"이라는 이름의 속성 설정을 하여 webSocketUrl로 설정한다.

  8. sessionBiDi 플래그를 true로 설정한다.

  9. "bidi"를 flags에 추가한다.

구현은 클라이언트가 BiDi 세션이면서 HTTP 세션이 아닌 세션을 수립할 수도 있게 해야 한다. 이 경우 WebSocket 서버의 URL은 대역 외로 전달된다. 이를 허용하는 구현은 BiDi 전용 세션을 지원한다. 그러한 구현이 WebDriver 세션을 시작하는 요청을 받아들일 준비가 된 시점에, 다음을 해야 한다:

  1. null이 주어졌을 때 WebSocket 연결 수신 시작을 한다.

5. 샌드박스화된 스크립트 실행

자동화 도구의 일반적인 요구사항은 문서의 DOM에 접근할 수 있지만, 해당 문서를 포함하는 navigable에서 실행 중인 스크립트가 DOM API에 적용한 변경에 관한 정보는 갖지 않는 스크립트를 실행하는 것이다.

BiDi 세션샌드박스 맵을 가지며, 이는 키가 Window 객체이고, 값이 문자열과 SandboxWindowProxy 객체 사이의 맵인 약한 맵이다.

참고: 여기서의 샌드박스 정의는 기존 구현의 동작을 성문화하려는 시도이다. 이는 이전에 명세에서 내부적인 것으로 간주되던 구현의 일부, 특히 플랫폼 객체의 내부 상태(일반적으로 브라우저 엔진의 주 구현 언어에서 네이티브 객체로 구현됨)와 ECMAScript에서 보이는 상태 사이의 구별을 드러낸다. 기존 샌드박스 구현은 엔진의 낮은 수준에서 이루어지기 때문에, 구현들이 명세의 모든 세부사항으로 수렴하는 것은 느린 과정일 수 있다. 그동안 구현자는 명세와의 차이에 대한 자세한 문서를 제공하는 것이 권장되며, 이 기능의 사용자는 샌드박스에서 실행되는 스크립트가 모든 구현에서 작동하는지 명시적으로 테스트하는 것이 권장된다.

5.1. 샌드박스 렐름

각 샌드박스는 고유한 ECMAScript Realm이다. 그러나 샌드박스 렐름은 Window 렐름에 있는 플랫폼 객체에 SandboxProxy 객체를 통해 접근할 수 있게 한다.

namenavigable이 주어졌을 때 샌드박스 렐름 가져오기 또는 생성을 하려면:
  1. name이 빈 문자열이면, 오류를 반환하되 오류 코드invalid argument로 한다.

  2. windownavigable활성 window로 둔다.

  3. 샌드박스 맵window를 포함하지 않으면, 샌드박스 맵[window]을 새 으로 설정한다.

  4. sandboxes샌드박스 맵[window]로 둔다.

  5. sandboxesname을 포함하지 않으면, sandboxes[name]을 navigable샌드박스 렐름 생성을 수행한 결과로 설정한다.

  6. 데이터 sandboxes[name]와 함께 성공을 반환한다.

window샌드박스 렐름 생성을 하려면:

샌드박스 렐름의 생성을 정의한다. 이는 window를 래핑하는 SandboxWindowProxy를 반환하게 된다.

target realm이 주어졌을 때 샌드박스 이름 가져오기를 하려면:

  1. realms maps값 가져오기샌드박스 맵에 수행한 결과로 둔다.

  2. realms maps의 각 realms map에 대해:

    1. realms map의 각 namerealm에 대해:

      1. realmtarget realm이면, name을 반환한다.

  3. null을 반환한다.

5.2. 샌드박스 프록시 객체

SandboxProxy 객체는 다른 렐름의 객체에 대한 샌드박스화된 접근을 중재하는 이국적 객체이다. 샌드박스 프록시 객체는 다음 제한을 강제하도록 설계되어 있다:

SandboxProxy 인터페이스 객체는 없다.

SandboxProxy가 어떻게 동작하는지 자세히 정의한다

object래핑 해제된 것을 얻으려면:
  1. objectSandboxProxy 또는 SandboxWindowProxy인 동안, object를 그것의 래핑된 객체로 설정한다.

  2. object를 반환한다.

5.3. SandboxWindowProxy

SandboxWindowProxyWindow 객체가 SandboxProxy 객체로 래핑된 것을 나타내는 이국적 객체이다. 이는 Window 전역에서 해당 데이터에 대한 샌드박스화된 접근을 제공한다.

이것이 어떻게 동작하는지 정의한다.

6. 사용자 컨텍스트

사용자 컨텍스트원격 끝 내의 0개 이상의 최상위 traversable 모음을 나타낸다. 각 사용자 컨텍스트는 연관된 저장소 파티션을 가지므로, 원격 끝 데이터는 서로 다른 사용자 컨텍스트 사이에서 공유되지 않는다.

이것이 사용자 컨텍스트 개념이나 저장소와의 상호작용을 형식적으로 정의하는 최선의 방법인지 불분명하다.

참고: Infra 명세는 "user agent"라는 용어를 사용자 컨텍스트와 같은 개념을 지칭하는 데 사용한다. 그러나 이는 여러 사용자 컨텍스트를 가진 전체 웹 클라이언트를 의미하는 "user agent"라는 용어의 사용과 호환되지 않는다. 이 차이는 웹 콘텐츠에는 보이지 않지만, WebDriver를 통해 관찰되므로, 여기서는 이 용어 사용을 피한다.

사용자 컨텍스트사용자 컨텍스트 id를 가지며, 이는 사용자 컨텍스트 생성 시 설정되는 고유한 문자열이다.

navigable연관된 사용자 컨텍스트를 가지며, 이는 사용자 컨텍스트이다.

최상위 traversable이 생성될 때, 그 연관된 사용자 컨텍스트사용자 컨텍스트 집합의 한 사용자 컨텍스트로 설정된다.

참고: 어떤 경우에는 최상위 traversable이 생성될 때 사용자 컨텍스트가 명세에 의해 설정된다. 그러나 그러한 요구사항이 없는 경우, 연관된 사용자 컨텍스트최상위 traversable에 대해 구현 정의이다.

null이 아닌 opener를 가진 최상위 traversable이 opener와 동일한 연관된 사용자 컨텍스트를 가진다고 명시해야 하는가? 기존 구현이 이를 강제하는지 확인해야 한다.

자식 navigable연관된 사용자 컨텍스트는 그것의 부모연관된 사용자 컨텍스트이다.

어떤 사용자 컨텍스트가 어떠한 최상위 traversable연관된 사용자 컨텍스트도 아니면, 이는 빈 사용자 컨텍스트이다.

기본 사용자 컨텍스트사용자 컨텍스트이며, 사용자 컨텍스트 id"default"이다.

구현은 사용자 컨텍스트 집합을 가지며, 이는 사용자 컨텍스트집합이다. 처음에는 기본 사용자 컨텍스트를 포함한다.

구현은 예를 들어 사용자 동작에 대한 응답으로 언제든지 새 사용자 컨텍스트사용자 컨텍스트 집합추가할 수 있다.

참고: 여기서 "언제든지"는 구현 시작 중도 포함하므로, 주어진 구현은 항상 사용자 컨텍스트 집합에 여러 항목을 가질 수 있다.

구현은 기본 사용자 컨텍스트를 제외하고, 빈 사용자 컨텍스트를 언제든지 사용자 컨텍스트 집합에서 제거할 수 있다. 그러나 그러한 사용자 컨텍스트를 제거해야 하는 것은 아니다. 사용자 컨텍스트빈 사용자 컨텍스트가 아니면 사용자 컨텍스트 집합에서 제거되어서는 안 된다.

BiDi 세션사용자 컨텍스트에서 안전하지 않은 인증서 허용 재정의로의 맵을 가지며, 이는 사용자 컨텍스트와 boolean 사이의 이다.

BiDi 세션사용자 컨텍스트에서 프록시 구성으로의 맵을 가지며, 이는 사용자 컨텍스트프록시 구성 사이의 이다.

에뮬레이트된 네트워크 조건 구조체는 다음을 가진 구조체이다:

BiDi 세션에뮬레이트된 네트워크 조건을 가지며, 이는 구조체로, 에뮬레이트된 네트워크 조건 구조체 또는 null인 기본 네트워크 조건이라는 이름의 항목, 사용자 컨텍스트에뮬레이트된 네트워크 조건 구조체 사이의 약한 맵인 사용자 컨텍스트 네트워크 조건이라는 이름의 항목, 그리고 navigable에뮬레이트된 네트워크 조건 구조체 사이의 약한 맵인 navigable 네트워크 조건이라는 이름의 항목을 가진다.

사용자 컨텍스트사용자 컨텍스트 집합에서 제거되면, 사용자 컨텍스트 구독 제거를 한다.

사용자 컨텍스트 구독 제거를 하려면:

  1. 활성 세션의 각 session에 대해:

    1. subscriptions to remove집합으로 둔다.

    2. session구독에 있는 각 subscription에 대해:

      1. subscription사용자 컨텍스트 idnavigable연관된 사용자 컨텍스트사용자 컨텍스트 id포함하면:

        1. navigable연관된 사용자 컨텍스트사용자 컨텍스트 idsubscription사용자 컨텍스트 id에서 제거한다.

        2. subscription사용자 컨텍스트 id가 비어 있으면:

          1. subscriptionsubscriptions to remove추가한다.

    3. subscriptions to removesession구독에서 제거한다.

user context id가 주어졌을 때 사용자 컨텍스트 가져오기를 하려면:
  1. 사용자 컨텍스트 집합의 각 user context에 대해:

  2. user context사용자 컨텍스트 iduser context id와 같으면:

    1. user context를 반환한다.

  3. null을 반환한다.

user context ids가 주어졌을 때 유효한 사용자 컨텍스트 가져오기를 하려면:

  1. result를 빈 집합으로 둔다.

  2. user context ids의 각 user context id에 대해:

    1. user contextuser context id사용자 컨텍스트 가져오기를 수행한 결과로 설정한다.

    2. user context가 null이면, 오류를 반환하되 오류 코드no such user context로 한다.

    3. user contextresult추가한다.

  3. result를 반환한다.

7. 모듈

7.1. session 모듈

session 모듈은 원격 끝의 상태를 모니터링하기 위한 명령 및 이벤트를 포함한다.

7.1.1. 정의

원격 끝 정의

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

로컬 끝 정의

SessionResult = (
  session.EndResult /
  session.NewResult /
  session.StatusResult /
  session.SubscribeResult /
  session.UnsubscribeResult
)
session이 주어졌을 때 세션 종료를 하려면:
  1. session활성 세션에서 제거한다.

  2. 활성 세션비어 있으면, webdriver-active 플래그를 false로 설정한다.

session이 주어졌을 때 세션 정리를 하려면:

  1. session으로 WebSocket 연결 닫기를 한다.

  2. 사용자 컨텍스트 집합의 각 user context에 대해:

    1. session사용자 컨텍스트에서 안전하지 않은 인증서 허용 재정의로의 맵[user context]를 제거한다.

    2. session사용자 컨텍스트에서 프록시 구성으로의 맵[user context]를 제거한다.

  3. session차단된 요청 맵에 있는 각 request id → (request, phase, response)에 대해:

    1. "continue request", request id 및 (response, "incomplete")로 재개한다.

  4. session네트워크 컬렉터에 있는 각 collector에 대해:

    1. collector idcollector컬렉터로 둔다.

    2. 수집된 네트워크 데이터의 각 collected data에 대해, collected datacollector id데이터에서 컬렉터 제거를 한다.

  5. 활성 세션비어 있으면, 원격 끝 상태 정리를 한다.

  6. 구현별 정리 단계를 수행한다.

원격 끝 상태 정리를 하려면.
  1. before request sent 맵비운다.

  2. 기본 캐시 동작을 "default"로 설정한다.

  3. navigable 캐시 동작 맵비운다.

  4. 현재 원격 끝 구성에서 일반적으로 활성화되는 구현별 리소스 캐시를 활성화하기 위해 구현 정의 단계를 수행한다.

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"
값 타입: boolean
설명: 현재 세션의 양방향 연결 지원을 정의한다.
"webSocketUrl" 기능에 대한 추가 기능 역직렬화 알고리즘은 매개변수 value에 대해 다음과 같다:
  1. value가 boolean이 아니면, 오류를 반환하되, 코드invalid argument로 한다.

  2. 데이터 value와 함께 성공을 반환한다.

"webSocketUrl" 기능에 대한 일치한 기능 직렬화 알고리즘은 매개변수 value에 대해 다음과 같다:
  1. value가 false이면, 데이터 null과 함께 성공을 반환한다.

  2. 데이터 true와 함께 성공을 반환한다.

7.1.2.3. 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.4. 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.5. session.UserPromptHandlerType 타입

원격 끝 정의로컬 끝 정의

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

session.UserPromptHandlerType 타입은 사용자 프롬프트 핸들러의 동작을 나타낸다.

7.1.2.6. session.Subscription 타입
session.Subscription = text

session.Subscription 타입은 고유한 구독 식별자를 나타낸다.

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

session.SubscribeParameters 타입은 특정 이벤트 집합을 구독하기 위한 요청을 나타낸다.

7.1.2.8. session.UnsubscribeByIDRequest 타입
session.UnsubscribeByIDRequest = {
  subscriptions: [+session.Subscription],
}

session.UnsubscribeByIDRequest 타입은 구독 ID로 식별된 이벤트 구독을 제거하기 위한 요청을 나타낸다.

7.1.2.9. session.UnsubscribeByAttributesRequest 타입
session.UnsubscribeByAttributesRequest = {
  events: [+text],
}

session.UnsubscribeByAttributesRequest 타입은 구독 속성을 사용하여 구독 해제하기 위한 요청을 나타낸다.

7.1.3. 명령

7.1.3.1. session.status 명령

session.status 명령은 원격 끝이 새 세션을 만들 수 있는 상태인지에 관한 정보를 반환하지만, 추가로 구현에 특화된 임의의 메타 정보를 포함할 수도 있다.

이는 정적 명령이다.

명령 타입
session.Status = (
  method: "session.status",
  params: EmptyParams,
)
반환 타입
session.StatusResult = {
  ready: bool,
  message: text,
}

sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:

  1. body를 다음 속성을 가진 새 으로 둔다:

    "ready"
    원격 끝준비 상태.
    "message"
    원격 끝준비 상태를 설명하는 구현 정의 문자열.
  2. 데이터 body와 함께 성공을 반환한다

7.1.3.2. session.new 명령

session.new 명령은 새 BiDi 세션을 만들 수 있게 한다.

참고: 이 방식으로 생성된 세션은 HTTP를 통해 접근할 수 없다.

이는 정적 명령이다.

명령 타입
session.New = (
  method: "session.new",
  params: session.NewParameters
)

session.NewParameters = {
  capabilities: session.CapabilitiesRequest
}
반환 타입
session.NewResult = {
  sessionId: text,
  capabilities: {
    acceptInsecureCerts: bool,
    browserName: text,
    browserVersion: text,
    platformName: text,
    setWindowRect: bool,
    userAgent: text,
    ? proxy: session.ProxyConfiguration,
    ? unhandledPromptBehavior: session.UserPromptHandler,
    ? webSocketUrl: text,
    Extensible
  }
}

sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:

  1. session이 null이 아니면, 오류 코드 session not created오류를 반환한다.

  2. 어떤 이유로든 구현이 새 세션을 시작할 수 없으면, 오류 코드 session not created오류를 반환한다.

  3. flags를 "bidi"를 포함하는 집합으로 둔다.

  4. capabilities jsoncommand parametersflags기능 처리시도한 결과로 둔다.

  5. capabilitiescapabilities json으로 JSON 파생 JavaScript 값을 Infra 값으로 변환한 결과로 둔다.

  6. sessioncapabilitiesflags세션 생성시도한 결과로 둔다.

  7. sessionBiDi 플래그를 true로 설정한다.

    참고: 이 세션에 대한 연결은 호출자에 의해 현재 연결로 설정된다.

  8. bodysession.NewResult 생성규칙과 일치하는 새 으로 둔다. 이때 sessionId 필드는 session세션 ID로 설정하고, capabilities 필드는 capabilities로 설정한다.

  9. 데이터 body와 함께 성공을 반환한다.

7.1.3.3. session.end 명령

session.end 명령은 현재 세션을 종료한다.

명령 타입
session.End = (
  method: "session.end",
  params: EmptyParams
)

반환 타입
session.EndResult = EmptyResult

sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:

  1. session으로 세션 종료를 한다.

  2. 데이터 null과 함께 성공을 반환하고, 병렬로 다음 단계를 실행한다:

    1. 이 명령에 대한 응답으로 WebSocket 메시지 전송 단계가 호출될 때까지 기다린다.

      이는 다소 부정확한 표현이지만, 의도는 연결 종료를 시작하기 전에 명령에 대한 응답을 전송한다는 점이 명확하기를 바란다.

    2. session으로 세션 정리를 한다.

7.1.3.4. session.subscribe 명령

session.subscribe 명령은 특정 이벤트를 전역으로 또는 navigable 집합에 대해 활성화한다.

이는 realm에도 동작하도록 일반화되어야 한다.

명령 타입
session.Subscribe = (
  method: "session.subscribe",
  params: session.SubscribeParameters
)
반환 타입
session.SubscribeResult = {
  subscription: session.Subscription,
}
sessioncommand parameters원격 끝 단계는 다음과 같다:
  1. event names를 빈 집합으로 둔다.

  2. command parameters["events"]의 각 항목 name에 대해, event namesevent namesname으로 이벤트 이름 집합 얻기시도한 결과의 합집합으로 둔다.

  3. input user context idscommand parameters[userContexts]로 집합 생성을 수행한 결과로 둔다.

  4. input context idscommand parameters[contexts]로 집합 생성을 수행한 결과로 둔다.

  5. input user context ids가 비어 있지 않고 input context ids도 비어 있지 않으면, 오류를 반환하되, 오류 코드invalid argument로 한다.

  6. subscription navigables집합으로 둔다.

  7. top-level traversable context ids집합으로 둔다.

  8. input context ids가 비어 있지 않으면:

    1. navigablesinput context idsid로 유효한 navigable 가져오기시도한 결과로 둔다.

    2. subscription navigablesnavigables최상위 traversable 가져오기를 수행한 결과로 설정한다.

    3. subscription navigables의 각 navigable에 대해:

      1. navigablenavigable idtop-level traversable context ids추가한다.

  9. 그렇지 않고, input user context ids가 비어 있지 않으면:

    1. input user context ids의 각 user context id에 대해:

      1. user contextuser context id사용자 컨텍스트 가져오기를 수행한 결과로 둔다.

      2. user context가 null이면, 오류를 반환하되, 오류 코드no such user context로 한다.

      3. 연관된 사용자 컨텍스트user context인 모든 최상위 traversable의 목록에 있는 각 top-level traversable에 대해:

        1. top-level traversablesubscription navigables추가한다.

  10. 그렇지 않으면, subscription navigables원격 끝의 모든 최상위 traversable집합으로 설정한다.

  11. subscription구독으로 둔다. 이때 구독 idUUID의 문자열 표현으로 설정하고, 이벤트 이름event names로 설정하며, 최상위 traversable idtop-level traversable context ids로 설정하고 사용자 컨텍스트 idinput user context ids로 설정한다.

  12. subscribe step events를 새 으로 둔다.

  13. event names의 각 event name에 대해:

    1. event name이라는 이벤트 이름을 가진 이벤트원격 끝 구독 단계를 정의하지 않으면, 계속한다;

    2. existing navigablessessionevent name으로 이벤트가 활성화된 최상위 traversable의 집합을 수행한 결과로 둔다.

    3. subscribe step events[event name]을 subscription navigablesexisting navigables차집합으로 설정한다.

  14. subscriptionsession구독에 추가한다.

  15. subscription구독 idsession알려진 구독 id에 추가한다.

  16. 키가 event name oneevent name two인 두 항목이 주어졌을 때, 다음 less than 알고리즘을 사용하여 subscribe step events오름차순으로 정렬한다:

    1. event one을 이름이 event name one이벤트로 둔다

    2. event two를 이름이 event name two이벤트로 둔다

    3. event one구독 우선순위event two의 구독 우선순위보다 작으면 true를 반환하고, 그렇지 않으면 false를 반환한다.

  17. subscription전역이면 include global을 true로 두고, 그렇지 않으면 include global을 false로 둔다.

  18. subscribe step events의 각 event namenavigables에 대해:

    1. event name이라는 이벤트 이름을 가진 이벤트에 대한 원격 끝 구독 단계session, navigablesinclude global이 주어졌을 때 실행한다.

  19. bodysession.SubscribeResult 생성규칙과 일치하는 새 으로 둔다. 이때 subscription 필드는 subscription구독 id로 설정한다.

  20. 데이터 body와 함께 성공을 반환한다.

7.1.3.5. session.unsubscribe 명령

session.unsubscribe 명령은 이벤트를 전역으로 또는 navigable 집합에 대해 비활성화한다.

이는 realm에도 동작하도록 일반화되어야 한다.

명령 타입
session.Unsubscribe = (
  method: "session.unsubscribe",
  params: session.UnsubscribeParameters,
)

session.UnsubscribeParameters = session.UnsubscribeByAttributesRequest / session.UnsubscribeByIDRequest
반환 타입
session.UnsubscribeResult = EmptyResult
sessioncommand parameters원격 끝 단계는 다음과 같다:
  1. command parameters가 "subscriptions"를 포함하지 않으면:

    참고: 이 조건은 command parameters가 session.UnsubscribeByAttributesRequest 생성규칙과 일치함을 의미한다.

    1. event names를 빈 집합으로 둔다.

    2. command parameters["events"]의 각 항목 name에 대해, event namesevent namesname으로 이벤트 이름 집합 얻기시도한 결과의 합집합으로 둔다.

    3. new subscriptions목록으로 둔다.

    4. matched events집합으로 둔다.

    5. session구독의 각 subscription에 대해:

      1. subscription이벤트 이름event names교집합이 빈 집합이면:

        1. subscriptionnew subscriptions추가한다.

        2. 계속한다.

      2. subscription전역이 아니면:

        1. subscriptionnew subscriptions추가한다.

        2. 계속한다.

      3. subscription event namessubscription이벤트 이름복제로 둔다.

      4. event names의 각 event name에 대해:

        1. subscription event namesevent name포함하면:

          1. event namematched events추가한다.

          2. event namesubscription event names에서 제거한다.

      5. subscription event names가 비어 있지 않으면:

        1. cloned subscription구독으로 둔다. 이때 구독 idsubscription구독 id로 설정하고, 이벤트 이름subscription event names를 포함하는 새 집합으로 설정한다.

        2. cloned subscriptionnew subscriptions추가한다.

    6. matched eventsevent names같지 않으면, 오류를 반환하되 오류 코드invalid argument로 한다.

    7. session구독new subscriptions로 설정한다.

  2. 그렇지 않으면:

    1. subscriptionscommand parameters[subscriptions]로 집합 생성을 수행한 결과로 둔다.

    2. unknown subscription idssubscriptionssession알려진 구독 id차집합으로 둔다.

    3. unknown subscription ids가 비어 있지 않으면:

      1. 오류를 반환하되, 오류 코드invalid argument로 한다.

    4. subscriptions to remove를 빈 집합으로 둔다.

    5. session구독에 있는 각 subscription에 대해:

      1. subscriptionssubscription구독 id포함하면:

        1. subscriptionsubscriptions to remove추가한다.

    6. session알려진 구독 idsession알려진 구독 idsubscriptions차집합으로 설정한다.

    7. subscriptions to remove의 각 항목을 session구독에서 제거한다.

  3. 데이터 null과 함께 성공을 반환한다.

7.2. browser 모듈

browser 모듈은 원격 끝 브라우저 프로세스를 관리하기 위한 명령을 포함한다.

7.2.1. 정의

원격 끝 정의

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

로컬 끝 정의

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

7.2.2.

최상위 traversable은 하나의 클라이언트 창과 연관되며, 이는 해당 최상위 traversable활성 문서를 렌더링하는 데 사용될 뷰포트를 포함하는 직사각형 영역을 나타낸다. 이는 그 가시성 상태가 "visible"일 때 적용되며, traversable 표시와 관련된 브라우저별 사용자 인터페이스 요소 (예: URL 바, 도구 모음, 또는 OS 창 장식)도 포함한다.

클라이언트 창은 그 창을 고유하게 식별하는 문자열인 클라이언트 창 id를 가진다.

클라이언트 창x 좌표를 가지며, 이는 웹에 노출된 화면 영역의 왼쪽 가장자리와 창의 왼쪽 가장자리 사이의 CSS 픽셀 수이거나, 특정 창에 대해 그것이 의미가 없으면 0이다.

클라이언트 창y 좌표를 가지며, 이는 웹에 노출된 화면 영역의 위쪽 가장자리와 창의 위쪽 가장자리 사이의 CSS 픽셀 수이거나, 특정 창에 대해 그것이 의미가 없으면 0이다.

클라이언트 창너비를 가지며, 이는 창 직사각형의 너비를 CSS 픽셀 단위로 나타낸다.

클라이언트 창높이를 가지며, 이는 창 직사각형의 높이를 CSS 픽셀 단위로 나타낸다.

window클라이언트 창 최대화를 하려면 구현은 플랫폼의 window 최대화 개념에 해당하는 단계를 수행하거나, windowx 좌표가 가능한 한 0에 가깝고, 그 y 좌표가 가능한 한 0에 가까우며, 그 너비웹에 노출된 화면 영역의 너비에 가능한 한 가깝고, 그 높이웹에 노출된 화면 영역의 높이에 가능한 한 가깝도록 window의 위치를 지정해야 한다. 이 옵션 중 하나가 지원되면 클라이언트 창 최대화가 지원됨이다.

window클라이언트 창 최소화를 하려면 구현은 플랫폼의 window 최소화 개념에 해당하는 단계를 수행하거나, 그렇지 않으면 window를 숨겨 window와 연관된 최상위 traversable의 모든 활성 문서가시성 상태 "hidden"을 가지며, window너비높이가 둘 다 가능한 한 0에 가깝도록 해야 한다. 이 옵션 중 하나가 지원되면 클라이언트 창 최소화가 지원됨이다.

window클라이언트 창 복원을 하려면 구현은 그것이 플랫폼 정의의 최대화 상태도, 플랫폼 정의의 최소화 상태도 아니며, window와 연관된 하나 이상의 최상위 traversable이 있는 경우 그중 적어도 하나가 "visible" 상태의 활성 문서를 가지도록 보장해야 한다. 이것이 지원되면 클라이언트 창 복원이 지원됨이다.

window가 주어졌을 때 클라이언트 창 상태 가져오기를 하려면:

  1. documents를 빈 목록으로 둔다.

  2. visible documents를 빈 목록으로 둔다.

  3. 최상위 traversable traversable에 대해:

    1. traversable클라이언트 창window가 아니면 계속한다.

    2. documenttraversable활성 문서로 둔다.

    3. documentdocuments추가한다.

    4. document가시성 상태가 "visible"이면, documentvisible documents추가한다.

  4. visible documents의 각 document에 대해:

    1. documentfullscreen 요소가 null이 아니면 "fullscreen"을 반환한다.

  5. visible documents비어 있고 documents비어 있지 않으면, 또는 window가 그 밖에 OS별 최소화 상태이면, "minimized"를 반환한다.

    참고: 이는 일반적으로, 하지만 반드시 그런 것은 아니지만, window너비높이가 0과 같음을 의미한다.

  6. window가 OS별 최대화 상태이면 "maximized"를 반환한다.

    참고: 이는 일반적으로, 하지만 반드시 그런 것은 아니지만, window너비웹에 노출된 화면 영역의 너비와 같고 window높이웹에 노출된 화면 영역의 높이와 같음을 의미한다.

  7. "normal"을 반환한다.

windowstate가 주어졌을 때 클라이언트 창 상태 설정을 하려면:

  1. current statewindow클라이언트 창 상태 가져오기를 수행한 결과로 둔다.

  2. current state가 "fullscreen", "maximized" 또는 "minimized"이고 state와 같으면, 데이터 null과 함께 성공을 반환한다.

  3. 다음 조건과 연관된 단계의 목록에서, 연관된 조건이 true인 첫 번째 단계 집합을 실행한다:

    "fullscreen"
    fullscreen이 지원됨이 아니면, 오류를 반환하되 오류 코드unsupported operation으로 한다.
    "normal"
    window에 대해 클라이언트 창 복원이 지원됨이 아니면, 오류를 반환하되 오류 코드unsupported operation으로 한다.
    "maximize"
    window에 대해 클라이언트 창 최대화가 지원됨이 아니면, 오류를 반환하되 오류 코드unsupported operation으로 한다.
    "minimize"
    window에 대해 클라이언트 창 최소화가 지원됨이 아니면, 오류를 반환하되 오류 코드unsupported operation으로 한다.
  4. documents를 빈 목록으로 둔다.

  5. 최상위 traversable traversable에 대해:

    1. traversable의 연관된 클라이언트 창window가 아니면 계속한다.

    2. documenttraversable활성 문서로 둔다.

    3. documentdocuments에 추가한다.

  6. documents비어 있으면, 오류를 반환하되 오류 코드no such client window로 한다.

  7. current state가 "fullscreen"이면:

    1. documents의 각 document에 대해:

      1. documentfullscreen 완전 종료를 한다.

        참고: 이는 fullscreen이 아닌 창의 문서에 대해서는 아무 작업도 하지 않는다.

  8. current state가 "maximized" 또는 "minimized"이면:

    1. window클라이언트 창 복원한다.

  9. state의 값에 따라 전환한다:

    "fullscreen"
    1. documents의 각 document에 대해:

      1. document가시성 상태가 "visible"이면, documentdocument 요소요소를 fullscreen으로 만들기를 한다.

      2. 중단한다.

    "maximize"
    1. window클라이언트 창 최대화한다.
    "minimize"
    1. window클라이언트 창 최소화한다.
  10. 데이터 null과 함께 성공을 반환한다.

7.2.3. 타입

7.2.3.1. browser.ClientWindow 타입
browser.ClientWindow = text;

browser.ClientWindow클라이언트 창을 고유하게 식별한다.

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가 주어졌을 때 클라이언트 창 정보 가져오기를 하려면:
  1. client window idclient window에 대한 클라이언트 창 id로 둔다.

  2. stateclient window클라이언트 창 상태 가져오기를 수행한 결과로 둔다.

  3. client window가 운영체제로부터 전달되는 키보드 입력을 받을 수 있으면 active를 true로 두고, 그렇지 않으면 active를 false로 둔다.

    참고: 이는 최상위 traversable 중 그 클라이언트 창client window인 것이 시스템 포커스를 가진다는 의미일 수 있으며, 또는 브라우저 자체의 사용자 인터페이스가 현재 포커스를 가진다는 의미일 수도 있다.

  4. client window infoclientWindow 필드는 client window id로, state 필드는 state로, x 필드는 client windowx 좌표로, y 필드는 client windowy 좌표로, width 필드는 client window너비로, height 필드는 client window높이로, 그리고 active 필드는 active로 설정한 browser.ClientWindowsInfo 생성규칙과 일치하는 으로 둔다.

  5. client window info를 반환한다

7.2.3.3. browser.UserContext 타입
browser.UserContext = text;

browser.UserContext사용자 컨텍스트를 고유하게 식별한다.

7.2.3.4. browser.UserContextInfo 타입
browser.UserContextInfo = {
  userContext: browser.UserContext
}

browser.UserContextInfo 타입은 사용자 컨텍스트의 속성을 나타낸다.

7.2.4. 명령

7.2.4.1. browser.close 명령

browser.close 명령은 모든 WebDriver 세션을 종료하고 원격 브라우저 인스턴스의 자동화 상태를 정리한다.

명령 타입
browser.Close = (
  method: "browser.close",
  params: EmptyParams,
)
반환 타입
browser.CloseResult = EmptyResult
sessioncommand parameters원격 끝 단계는 다음과 같다:
  1. session으로 세션 종료를 한다.

  2. 활성 세션비어 있지 않으면, 구현은 unable to close browser 오류 코드오류를 반환할 수 있으며, 그 후 다음 단계를 병렬로 실행한다:

    1. 이 명령에 대한 응답으로 WebSocket 메시지 전송 단계가 호출될 때까지 기다린다.

    2. session으로 세션 정리를 한다.

    참고: 브라우저가 여러 자동화 세션을 가진 경우의 동작은 현재 지정되어 있지 않다. 어느 세션이든 브라우저를 닫을 수 있을 수도 있고, 실제로는 마지막으로 열린 세션만 브라우저를 닫을 수 있을 수도 있으며, 또는 처음 시작된 세션만 그럴 수도 있다. 이 동작은 이 명세의 향후 버전에서 완전히 지정될 수 있다.

  3. 활성 세션의 각 active session에 대해:

    1. active session으로 세션 종료를 한다.

    2. active session으로 세션 정리를 한다

  4. 데이터 null과 함께 성공을 반환하고, 다음 단계를 병렬로 실행한다.

    1. 이 명령에 대한 응답으로 WebSocket 메시지 전송 단계가 호출될 때까지 기다린다.

    2. session으로 세션 정리를 한다.

    3. 최상위 traversable언로드 프롬프트 없이 닫는다.

    4. 자동화 중인 원격 끝과 관련된 리소스를 정리하기 위해 구현 정의 단계를 수행한다.

      참고: 예를 들어 여기에는 자동화 중인 브라우저와 관련된 OS 수준 프로세스를 깨끗하게 종료하거나, 원격 끝이 자동화 중에 생성한 사용자 프로필 데이터 같은 임시 상태를 제거하거나, WebSocket 리스너를 종료하는 것이 포함될 수 있다. 브라우저와 운영체제 간의 차이 때문에, 여기서 로컬 끝이 의존할 수 있는 정확한 불변 조건을 자세히 지정하는 것은 불가능하다.

7.2.4.2. browser.createUserContext 명령

browser.createUserContext 명령은 사용자 컨텍스트를 생성한다.

명령 타입
browser.CreateUserContext = (
  method: "browser.createUserContext",
  params: browser.CreateUserContextParameters,
)

browser.CreateUserContextParameters = {
  ? acceptInsecureCerts: bool,
  ? proxy: session.ProxyConfiguration,
  ? unhandledPromptBehavior: session.UserPromptHandler
}
반환 타입
browser.CreateUserContextResult = browser.UserContextInfo

sessioncommand parameters원격 끝 단계는 다음과 같다:

  1. user context를 새 사용자 컨텍스트로 둔다.

  2. command parameters가 "acceptInsecureCerts"를 포함하면:

    참고: "acceptInsecureCerts"가 설정되면, 안전하지 않은 TLS 허용 플래그의 동작을 재정의한다.

    1. acceptInsecureCertscommand parameters["acceptInsecureCerts"]로 둔다:

    2. acceptInsecureCerts가 true이고 엔드포인트 노드가 안전하지 않은 TLS 연결 허용을 지원하지 않으면, 오류를 반환하되 오류 코드unsupported operation으로 한다.

    3. session사용자 컨텍스트에서 안전하지 않은 인증서 허용 재정의로의 맵[user context]을 acceptInsecureCerts설정한다.

  3. command parameters가 "unhandledPromptBehavior"를 포함하면, 처리되지 않은 프롬프트 동작 재정의 맵[user context]을 command parameters["unhandledPromptBehavior"]로 설정한다.

  4. command parameters가 "proxy"를 포함하면:

    1. proxy configurationcommand parameters["proxy"]로 둔다.

    2. 원격 끝사용자 컨텍스트별 프록시 설정을 구성할 수 없거나, proxy configuration으로 프록시를 구성할 수 없으면, 오류를 반환하되 오류 코드unsupported operation으로 한다.

    3. session사용자 컨텍스트에서 프록시 구성으로의 맵[user context]을 proxy configuration으로 설정한다.

  5. user context사용자 컨텍스트 집합추가한다.

  6. user context infouserContext 필드가 user context사용자 컨텍스트 id로 설정된 browser.UserContextInfo 생성규칙과 일치하는 으로 둔다.

  7. 데이터 user context info와 함께 성공을 반환한다.

7.2.4.3. browser.getClientWindows 명령

browser.getClientWindows 명령은 클라이언트 창의 목록을 반환한다.

명령 타입
browser.GetClientWindows = (
  method: "browser.getClientWindows",
  params: EmptyParams,
)
반환 타입
browser.GetClientWindowsResult = {
  clientWindows: [ * browser.ClientWindowInfo]
}

원격 끝 단계는 다음과 같다:

  1. client window ids를 빈 집합으로 둔다.

  2. client windows를 빈 목록으로 둔다.

  3. 최상위 traversable traversable에 대해:

    1. client windowtraversable의 연관된 클라이언트 창으로 둔다

    2. client window idclient window에 대한 클라이언트 창 id로 둔다.

    3. client window idsclient window id포함하면 계속한다.

    4. client window idclient window ids추가한다.

    5. client window infoclient window클라이언트 창 정보 가져오기를 수행한 결과로 둔다.

    6. client window infoclient windows추가한다.

  4. resultclientWindows 필드가 client windows로 설정된 browser.GetClientWindowsResult 생성규칙과 일치하는 으로 둔다.

  5. 데이터 result와 함께 성공을 반환한다.

7.2.4.4. browser.getUserContexts 명령

browser.getUserContexts 명령은 사용자 컨텍스트의 목록을 반환한다.

명령 타입
browser.GetUserContexts = (
  method: "browser.getUserContexts",
  params: EmptyParams,
)
반환 타입
browser.GetUserContextsResult = {
  userContexts: [ + browser.UserContextInfo]
}

원격 끝 단계는 다음과 같다:

  1. user contexts를 빈 목록으로 둔다.

  2. 사용자 컨텍스트 집합의 각 user context에 대해:

    1. user context infouserContext 필드가 user context사용자 컨텍스트 id로 설정된 browser.UserContextInfo 생성규칙과 일치하는 으로 둔다.

    2. user context infouser contexts추가한다.

  3. resultuserContexts 필드가 user contexts로 설정된 browser.GetUserContextsResult 생성규칙과 일치하는 으로 둔다.

  4. 데이터 result와 함께 성공을 반환한다.

7.2.4.5. browser.removeUserContext 명령

browser.removeUserContext 명령은 beforeunload 핸들러를 실행하지 않고 사용자 컨텍스트와 그 안의 모든 navigable을 닫는다.

명령 타입
browser.RemoveUserContext = (
  method: "browser.removeUserContext",
  params: browser.RemoveUserContextParameters
)

browser.RemoveUserContextParameters = {
  userContext: browser.UserContext
}
반환 타입
browser.RemoveUserContextResult = EmptyResult

command parameters원격 끝 단계는 다음과 같다:

  1. user context idcommand parameters["userContext"]로 둔다.

  2. user context id"default"이면, 오류를 반환하되 오류 코드invalid argument로 한다.

  3. user contextuser context id사용자 컨텍스트 가져오기를 수행한 결과로 설정한다.

  4. user context가 null이면, 오류를 반환하되 오류 코드no such user context로 한다.

  5. 최상위 traversable navigable에 대해:

    1. navigable연관된 사용자 컨텍스트user context이면:

      1. navigable언로드 프롬프트 없이 닫는다.

  6. user context사용자 컨텍스트 집합에서 제거한다.

  7. 데이터 null과 함께 성공을 반환한다.

7.2.4.6. browser.setClientWindowState 명령

browser.setClientWindowState 명령은 클라이언트 창의 치수를 설정한다.

명령 타입
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

sessioncommand parameters원격 끝 단계는 다음과 같다:

  1. 구현이 클라이언트 창 상태 설정을 전혀 지원하지 않으면, 오류를 반환하되 오류 코드unsupported operation으로 한다.

  2. command parameters["clientWindow"]를 클라이언트 창 id로 가지는 클라이언트 창이 있으면, client window를 그 클라이언트 창으로 둔다. 그렇지 않으면 오류를 반환하되 오류 코드no such client window로 한다.

  3. client windowcommand parameters["state"]로 시도하여 클라이언트 창 상태 설정을 수행한다.

  4. command parameters["state"]가 "normal"이면:

    1. command parameters가 "x"를 포함하고 구현이 클라이언트 창 위치 지정을 지원하면, client windowx 좌표command parameters["x"]에 가능한 한 가까운 값으로 설정한다.

    2. command parameters가 "y"를 포함하고 구현이 클라이언트 창 위치 지정을 지원하면, client windowy 좌표command parameters["y"]에 가능한 한 가까운 값으로 설정한다.

    3. command parameters가 "width"를 포함하고 구현이 클라이언트 창 크기 조정을 지원하면, client window너비command parameters["width"]에 가능한 한 가까운 값으로 설정한다.

    4. command parameters가 "width"를 포함하고 구현이 클라이언트 창 크기 조정을 지원하면, client window너비command parameters["width"]에 가능한 한 가까운 값으로 설정한다.

  5. client window infoclient window클라이언트 창 정보 가져오기를 수행한 결과로 둔다.

  6. 데이터 client window info와 함께 성공을 반환한다.

참고: 단순화를 위해 이는 모든 클라이언트 창 조작을 동기적으로 모델링한다. 따라서 반환된 클라이언트 창 치수는 창이 새 상태에 도달한 뒤의 값일 것으로 예상된다.

7.2.4.7. browser.setDownloadBehavior 명령

다운로드 동작 구조체는 다음을 가진 구조체이다:

원격 끝다운로드 동작을 가지며, 이는 구조체로서 다운로드 동작 구조체 또는 null인 기본 다운로드 동작이라는 이름의 항목과, 사용자 컨텍스트다운로드 동작 구조체 사이의 약한 맵인 사용자 컨텍스트 다운로드 동작이라는 이름의 항목을 가진다.

명령 타입
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이 주어졌을 때 다운로드 동작 가져오기를 하려면:
  1. user contextnavigable연관된 사용자 컨텍스트로 둔다.

  2. 다운로드 동작사용자 컨텍스트 다운로드 동작user context포함하면, 다운로드 동작사용자 컨텍스트 다운로드 동작[user context]을 반환한다.

  3. 다운로드 동작기본 다운로드 동작을 반환한다.

sessioncommand parameters원격 끝 단계는 다음과 같다:

  1. command parameters["downloadBehavior"]가 null이면, download behavior를 null로 둔다.

  2. 그렇지 않으면:

    1. command parameters["downloadBehavior"]["type"]이 "allowed"이면 allowed를 true로 두고, 그렇지 않으면 allowed를 false로 둔다.

    2. command parameters["downloadBehavior"]가 "destinationFolder"를 포함하면, destinationFoldercommand parameters["downloadBehavior"]["destinationFolder"]로 두고, 그렇지 않으면 destinationFolder를 null로 둔다.

    3. download behaviorallowedallowed로 설정되고 destinationFolderdestinationFolder로 설정된 다운로드 동작 구조체로 둔다.

  3. 구현이 요구된 download behavior를 지원하지 않으면, 오류를 반환하되 오류 코드unsupported operation으로 한다.

  4. command parametersuserContexts 필드가 있으면:

    1. user contextscommand parameters["userContexts"]로 유효한 사용자 컨텍스트 가져오기시도한 결과로 둔다.

    2. user contexts의 각 user context에 대해:

      1. download behavior가 null이면, 다운로드 동작사용자 컨텍스트 다운로드 동작에서 user context제거한다.

      2. 그렇지 않으면, 다운로드 동작사용자 컨텍스트 다운로드 동작[user context]을 download behavior설정한다.

  5. 그렇지 않으면, 다운로드 동작기본 다운로드 동작download behavior로 설정한다.

  6. 데이터 null과 함께 성공을 반환한다.

7.3. browsingContext 모듈

browsingContext 모듈은 navigable과 관련된 명령 및 이벤트를 포함한다.

참고: 역사적인 이유로 이 모듈은 navigable이 아니라 browsingContext라고 불리며, 프로토콜은 navigable을 지칭하기 위해 context라는 용어를 사용한다. 특히 명령 및 응답 매개변수의 필드에서 그렇게 사용된다.

탐색 진행 상황은 불변 구조체 WebDriver BiDi 탐색 상태를 사용하여 전달되며, 이는 다음 항목을 가진다:

id
탐색에 대한 탐색 id, 또는 탐색이 진행되기 전에 취소된 경우 null.
status
"canceled", "pending", 또는 "complete" 중 하나인 상태 코드.
url
탐색에서 로드 중인 URL
suggestedFilename
탐색이 다운로드이면 제안된 파일 이름, 그렇지 않으면 null.
downloadedFilepath
탐색이 완료된 다운로드이고 다운로드된 파일을 사용할 수 있으면 다운로드된 파일의 절대 파일 경로, 그렇지 않으면 null.

7.3.1. 정의

원격 끝 정의

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.TraverseHistory
)

로컬 끝 정의

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.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
)

원격 끝device pixel ratio 재정의를 가지며, 이는 navigable과 device pixel ratio 재정의 사이의 약한 맵이다. 이는 처음에 비어 있다.

참고: 이 맵은 마지막 세션이 종료될 때 비워지지 않는다. 즉 device pixel ratio 재정의는 어떤 WebDriver 세션보다 오래 지속된다.

뷰포트 치수는 다음을 가진 구조체이다:

뷰포트 구성은 다음을 가진 구조체이다:

처리되지 않은 프롬프트 동작 구조체는 다음을 가진 구조체이다:

원격 끝뷰포트 재정의 맵을 가지며, 이는 사용자 컨텍스트뷰포트 구성 사이의 약한 맵이다.

원격 끝로케일 재정의 맵을 가지며, 이는 navigable 또는 사용자 컨텍스트와 문자열 사이의 약한 맵이다.

화면 설정은 정수인 height라는 이름의 항목, 정수인 width라는 이름의 항목, 정수인 x라는 이름의 항목, 정수인 y라는 이름의 항목을 가진 구조체이다.

원격 끝화면 설정 재정의를 가지며, 이는 구조체로서 사용자 컨텍스트화면 설정 사이의 약한 맵인 사용자 컨텍스트 화면 설정이라는 이름의 항목과, navigable화면 설정 사이의 약한 맵인 navigable 화면 설정이라는 이름의 항목을 가진다.

원격 끝시간대 재정의 맵을 가지며, 이는 navigable 또는 사용자 컨텍스트와 문자열 사이의 약한 맵이다.

원격 끝처리되지 않은 프롬프트 동작 재정의 맵을 가지며, 이는 사용자 컨텍스트처리되지 않은 프롬프트 동작 구조체 사이의 약한 맵이다.

원격 끝스크립팅 활성화 재정의 맵을 가지며, 이는 navigable 또는 사용자 컨텍스트와 boolean 사이의 약한 맵이다.

7.3.2. 타입

7.3.2.1. browsingContext.BrowsingContext 타입

원격 끝 정의로컬 끝 정의

browsingContext.BrowsingContext = text;

navigable은 연관된 navigable id를 가지며, 이는 해당 navigable을 고유하게 식별하는 문자열이다. 이는 navigable이 생성될 때 암묵적으로 설정된다. 연관된 WebDriver 창 핸들을 가진 navigable의 경우, navigable id창 핸들과 같아야 한다.

navigable은 또한 연관된 저장소 파티션을 가지며, 이는 데이터를 지속시키기 위해 사용하는 저장소 파티션이다.

navigable은 또한 연관된 원래 opener를 가지며, 이는 해당 navigable이 열리도록 한 navigable 또는 null이고, 처음에는 null로 설정된다.

navigable id가 주어졌을 때 navigable 가져오기를 하려면:
  1. navigable id가 null이면, 데이터 null과 함께 성공을 반환한다.

  2. navigable idnavigable id인 navigable이 없으면 오류를 반환하되 오류 코드no such frame으로 한다.

  3. navigable을 id가 navigable idnavigable로 둔다.

  4. 데이터 navigable과 함께 성공을 반환한다.

7.3.2.2. browsingContext.Info 타입

로컬 끝 정의

browsingContext.InfoList = [*browsingContext.Info]

browsingContext.Info = {
  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 타입은 navigable의 속성을 나타낸다.

navigable이 주어졌을 때 자식 navigable 가져오기를 하려면:

TODO: 이를 문서 순서의 목록을 반환하도록 만든다

  1. child navigablesnavigable자식 navigable인 모든 navigable을 포함하는 집합으로 둔다.

  2. child navigables를 반환한다.

navigable, max depthinclude parent id가 주어졌을 때 navigable 정보 가져오기를 하려면:
  1. navigable idnavigable에 대한 navigable id로 둔다.

  2. parent navigablenavigable부모로 둔다.

  3. parent navigable이 null이 아니면 parent idparent navigablenavigable id로 둔다. 그렇지 않으면 parent id를 null로 둔다.

  4. documentnavigable활성 문서로 둔다.

  5. urldocumentURL이 주어졌을 때 URL 직렬화기를 실행한 결과로 둔다.

    참고: 이는 URL의 fragment 컴포넌트를 포함한다.

  6. child infos를 null로 둔다.

  7. max depth가 null이거나 max depth가 0보다 크면:

    1. child navigablesnavigable이 주어졌을 때 자식 navigable 가져오기를 수행한 결과로 둔다.

    2. max depth가 null이 아니면 child depthmax depth - 1로, 그렇지 않으면 null로 둔다.

    3. child infos를 빈 목록으로 설정한다.

    4. child navigables의 각 child navigable에 대해:

      1. infochild navigable, child depth, false가 주어졌을 때 navigable 정보 가져오기를 수행한 결과로 둔다.

      2. infochild infos에 추가한다

  8. user contextnavigable연관된 사용자 컨텍스트로 둔다.

  9. navigable원래 opener가 null이 아니면 opener idnavigable원래 opener에 대한 navigable id로 두고, 그렇지 않으면 null로 둔다.

  10. top-level traversablenavigable최상위 traversable로 둔다.

  11. client window idtop-level traversable의 연관된 클라이언트 창에 대한 클라이언트 창 id로 둔다.

  12. navigable infocontext 필드는 navigable id로, include parent idtrue이면 parent 필드는 parent id로 설정하고 그렇지 않으면 설정하지 않으며, url 필드는 url로, userContext 필드는 user context사용자 컨텍스트 id로, originalOpener 필드는 opener id로, children 필드는 child infos로, 그리고 clientWindow 필드는 client window id로 설정한 browsingContext.Info 생성규칙과 일치하는 으로 둔다.

  13. navigable info를 반환한다.

navigable, request, wait condition, 그리고 선택적으로 history handling(기본값: "default") 및 ignore cache(기본값: false)가 주어졌을 때 탐색 대기를 하려면:
  1. navigation id를 진정한 난수 또는 의사 난수에 기반한 UUID의 문자열 표현으로 둔다.

  2. navigable을 리소스 request탐색하되, navigable활성 문서를 소스 Document로 사용하고, 탐색 id navigation id히스토리 처리 동작 history handling을 사용한다. ignore cache가 true이면, 탐색은 HTTP 캐시에서 리소스를 로드해서는 안 된다.

    ignore cache 플래그가 어떻게 동작하는지 정확히 지정한다. 이는 리소스의 첫 번째 로드만 캐시를 우회하는지(즉, 처음에 캐시를 비우고 일반적으로 진행하는 것과 같은지), 또는 HTML 파서가 직접 로드하지 않은 리소스(예: 스크립트나 스타일시트에 의해 시작된 로드)도 캐시를 우회하는지 고려해야 한다.

  3. (event received, navigation status)를 «"navigation started", "navigation failed", "fragment navigated"» 및 navigation id가 주어졌을 때 대기한 결과로 둔다.

  4. 단언: navigation statusidnavigation id이다.

  5. navigation statusstatus가 "complete"이면:

    1. bodynavigation 필드는 navigation id로 설정하고, url 필드는 navigation statusurl이 주어졌을 때 URL 직렬화기를 수행한 결과로 설정한 browsingContext.NavigateResult 생성규칙과 일치하는 으로 둔다.

    2. 데이터 body와 함께 성공을 반환한다.

    참고: 이는 탐색이 fragment 변경만 일으킨 경우이다.

  6. navigation statusstatus가 "canceled"이면 오류를 반환하되 오류 코드unknown error로 한다.

    TODO: 여기서 오류를 처리하는 올바른 방식인가?

  7. 단언: navigation statusstatus는 "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가 주어졌을 때 대기한 결과로 둔다.

  12. event received가 "navigation failed"이면 오류를 반환하되 오류 코드unknown error로 한다.

    무엇이 왜 실패했는지에 대한 충분한 정보를 여기서 오류로 드러내고 있는가? 어떤 오류 코드를 원하는가? 로컬 끝이 실제로 무엇이 잘못되었는지 알아내기 위해 구현 정의 문자열을 파싱하는 문제가 생길 수 있는가?

  13. bodynavigation 필드는 status의 id로 설정하고, url 필드는 status의 url이 주어졌을 때 URL 직렬화기를 수행한 결과로 설정한 browsingContext.NavigateResult 생성규칙과 일치하는 으로 둔다.

  14. 데이터 body와 함께 성공을 반환한다.

7.3.2.3. browsingContext.Locator 타입

원격 끝 정의로컬 끝 정의

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 타입은 문서에서 노드를 찾기 위한 전략에 대한 세부사항을 제공한다.

7.3.2.4. browsingContext.Navigation 타입

원격 끝 정의로컬 끝 정의

browsingContext.Navigation = text;

browsingContext.Navigation 타입은 진행 중인 탐색을 식별하는 고유한 문자열이다.

TODO: HTML 명세의 정의에 링크한다.

7.3.2.5. browsingContext.NavigationInfo 타입

로컬 끝 정의:

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

browsingContext.NavigationInfo = {
  browsingContext.BaseNavigationInfo
}

browsingContext.NavigationInfo 타입은 진행 중인 탐색의 세부사항을 제공한다.

navigable navigable탐색 상태 navigation status가 주어졌을 때 탐색 정보 가져오기를 하려면:
  1. navigable idnavigable에 대한 navigable id로 둔다.

  2. navigation idnavigation statusid로 둔다.

  3. timestamp를 현재 날짜와 시간을 UTC로 나타내는 시간 값으로 둔다.

  4. urlnavigation statusurl로 둔다.

  5. user context idnavigable연관된 사용자 컨텍스트사용자 컨텍스트 id로 둔다.

  6. context 필드는 navigable id로, navigation 필드는 navigation id로, timestamp 필드는 timestamp로, url 필드는 url이 주어졌을 때 URL 직렬화기를 수행한 결과로, 그리고 userContext 필드는 user context id로 설정한 browsingContext.NavigationInfo 생성규칙과 일치하는 을 반환한다.

7.3.2.6. browsingContext.ReadinessState 타입
browsingContext.ReadinessState = "none" / "interactive" / "complete"

browsingContext.ReadinessState 타입은 탐색 명령이 반환될 문서 로딩의 단계를 나타낸다.

7.3.2.7. browsingContext.UserPromptType 타입

원격 끝 정의로컬 끝 정의

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

browsingContext.UserPromptType 타입은 가능한 사용자 프롬프트 타입을 나타낸다.

7.3.3. 명령

7.3.3.1. browsingContext.activate 명령

browsingContext.activate 명령은 주어진 최상위 traversable을 활성화하고 포커스한다.

명령 타입
browsingContext.Activate = (
  method: "browsingContext.activate",
  params: browsingContext.ActivateParameters
)

browsingContext.ActivateParameters = {
  context: browsingContext.BrowsingContext
}
반환 타입
browsingContext.ActivateResult = EmptyResult

command parameters원격 끝 단계는 다음과 같다:

  1. navigable idcommand parameters["context"] 필드의 값으로 둔다.

  2. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

  3. navigable최상위 traversable이 아니면, 오류를 반환하되 오류 코드invalid argument로 한다.

  4. navigablenavigable 활성화를 수행한 결과를 반환한다.

navigable이 주어졌을 때 navigable 활성화를 하려면:
  1. navigable시스템 가시성 상태visible이 되도록 구현별 단계를 실행한다. 이것이 가능하지 않으면, 오류 코드 unsupported operation오류를 반환한다.

    참고: 이는 현재 visiblenavigablehidden으로 만드는 부작용을 가질 수 있다.

    참고: 이는 창의 최소화 상태를 해제하거나 시스템 가시성 상태 변경과 관련된 다른 부작용을 일으켜 기본 OS 상태를 변경할 수 있다.

  2. 포커스되어 있지 않으면 navigable시스템 포커스를 설정하기 위해 구현별 단계를 실행한다.

    참고: 이는 다른 명세가 요구하는 경우를 제외하고 문서의 포커스된 영역을 변경하지 않는다.

  3. 데이터 null과 함께 성공을 반환한다.

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,
}

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

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가 주어졌을 때 rect 정규화를 하려면:

참고: 이는 결과 rect가 양의 너비 치수높이 치수를 가지도록 보장한다.

  1. xrectx 좌표로 둔다.

  2. yrecty 좌표로 둔다.

  3. widthrect너비 치수로 둔다.

  4. heightrect높이 치수로 둔다.

  5. width가 0보다 작으면, xx + width로 설정한 다음 width를 -width로 설정한다.

  6. height가 0보다 작으면, yy + height로 설정한 다음 height를 -height로 설정한다.

  7. x 좌표x, y 좌표y, 너비 치수width, 높이 치수height인 새 DOMRectReadOnly를 반환한다.

rect1rect2가 주어졌을 때 직사각형 교차를 하려면
  1. rect1rect1rect 정규화를 수행한 결과로 둔다.

  2. rect2rect2rect 정규화를 수행한 결과로 둔다.

  3. x1_0rect1x 좌표로 둔다.

  4. x2_0rect2x 좌표로 둔다.

  5. x1_1rect1x 좌표rect1너비 치수를 더한 값으로 둔다.

  6. x2_1rect2x 좌표rect2너비 치수를 더한 값으로 둔다.

  7. x_0를 «x1_0, x2_0»의 최댓값으로 둔다.

  8. x_1를 «x1_1, x2_1»의 최솟값으로 둔다.

  9. y1_0rect1y 좌표로 둔다.

  10. y2_0rect2y 좌표로 둔다.

  11. y1_1rect1y 좌표rect1높이 치수를 더한 값으로 둔다.

  12. y2_1rect2y 좌표rect2높이 치수를 더한 값으로 둔다.

  13. y_0를 «y1_0, y2_0»의 최댓값으로 둔다.

  14. y_1를 «y1_1, y2_1»의 최솟값으로 둔다.

  15. x_1x_0보다 작으면, width를 0으로 둔다. 그렇지 않으면 widthx_1 - x_0으로 둔다.

  16. y_1y_0보다 작으면, height를 0으로 둔다. 그렇지 않으면 heighty_1 - y_0으로 둔다.

  17. x 좌표x_0, y 좌표y_0, 너비 치수width, 높이 치수height인 새 DOMRectReadOnly를 반환한다.

documentrect가 주어졌을 때 문서를 canvas로 렌더링하려면:
  1. ratiodocumentdefault view가 주어졌을 때 device pixel ratio 결정을 수행한 결과로 둔다.

  2. paint widthrect너비 치수ratio를 곱하고 가장 가까운 정수로 반올림한 값으로 둔다. 이는 장치 픽셀에서 rect의 너비와 일치하도록 하기 위함이다.

  3. paint heightrect높이 치수ratio를 곱하고 가장 가까운 정수로 반올림한 값으로 둔다. 이는 장치 픽셀에서 rect의 높이와 일치하도록 하기 위함이다.

  4. canvasHTMLCanvasElement인 새 객체로 두고, widthpaint width, heightpaint height로 한다.

  5. canvas contextcanvas 및 null로 2D context 생성 알고리즘을 실행한 결과로 둔다.

  6. canvascontext mode2D로 설정한다.

  7. rect가 덮는 document의 영역을 나타내는 framebuffer의 영역을 canvas context에 그리는 것과 동등한 구현별 단계를 완료한다. 이때 framebuffer의 각 픽셀은 canvas context의 픽셀에 대응하며, 뷰포트 좌표에서 (rectx 좌표, recty 좌표)는 canvas context의 (0,0)에 대응하고, (rectx 좌표 + rect너비 치수, recty 좌표 + rect높이 치수)는 (paint width, paint height)에 대응한다.

  8. canvas를 반환한다.

canvasformat이 주어졌을 때 canvas를 Base64로 인코딩하려면:
  1. format이 null이 아니면, typeformattype 필드로 두고, qualityformatquality 필드로 둔다.

  2. 그렇지 않으면, type을 "image/png"로 두고 qualityundefined로 둔다.

  3. filecanvas에 대해 typequality비트맵을 파일로 직렬화한 것으로 둔다.

  4. encoded stringfileforgiving-base64 인코딩으로 둔다.

  5. 데이터 encoded string과 함께 성공을 반환한다.

documentorigin이 주어졌을 때 원점 직사각형 가져오기를 하려면:
  1. origin"viewport"이면:

    1. viewportdocumentvisual viewport로 둔다.

    2. x 좌표viewport page left, y 좌표viewport page top, 너비 치수viewport width, 그리고 높이 치수viewport height인 DOMRectReadOnlyviewport rect로 둔다.

    3. 데이터 viewport rect와 함께 성공을 반환한다.

  2. 단언: origin"document"이다.

  3. document elementdocument에 대한 document 요소로 둔다.

  4. x 좌표가 0, y 좌표가 0, 너비 치수document element scroll height, 그리고 높이 치수document element scroll widthDOMRectReadOnlydocument rect로 둔다.

  5. 데이터 document rect와 함께 성공을 반환한다.

sessioncommand parameters원격 끝 단계는 다음과 같다:

  1. navigable idcommand parameterscontext 필드가 있으면 그 값으로, 그렇지 않으면 null로 둔다.

  2. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

  3. 구현이 어떤 이유로든 navigable의 스크린샷을 캡처할 수 없으면 오류를 반환하되 오류 코드unsupported operation으로 한다.

  4. documentnavigable활성 문서로 둔다.

  5. document에 대해 다음번 애니메이션 프레임 콜백 실행 알고리즘 호출 직후:

    이는 렌더링 갱신 알고리즘에 더 명시적인 방식으로 통합되어야 한다.

  6. origincommand parameterscontext 필드가 있으면 그 값으로, 그렇지 않으면 "viewport"로 둔다.

  7. origin rectorigindocument가 주어졌을 때 원점 직사각형 가져오기시도한 결과로 둔다.

  8. clip rectorigin rect로 둔다.

  9. command parameters가 "clip"을 포함하면:

    1. clipcommand parameters["clip"]로 둔다.

    2. 처음 일치하는 조건 아래의 단계를 실행한다:

      clipbrowsingContext.ElementClipRectangle 생성규칙과 일치함:
      1. environment settings관련 전역 객체연관된 Documentdocument환경 설정 객체로 둔다.

      2. realmenvironment settings렐름 실행 컨텍스트의 Realm 컴포넌트로 둔다.

      3. elementclip["element"], realmsession으로 원격 참조 역직렬화시도한 결과로 둔다.

      4. elementElement를 구현하지 않으면 오류를 반환하되 오류 코드no such element로 한다.

      5. element노드 문서document가 아니면, 오류를 반환하되 오류 코드no such element로 한다.

      6. viewport rect를 "viewport" 및 document가 주어졌을 때 원점 직사각형 가져오기를 수행한 결과로 둔다.

      7. element rectelement에 대해 경계 상자 가져오기를 수행한 결과로 둔다.

      8. x 좌표element rect["x"] + viewport rect["x"], y 좌표element rect["y"] + viewport rect["y"], width가 element rect["width"], 그리고 height가 element rect["height"]인 DOMRectReadOnlyclip rect로 둔다.

      clipbrowsingContext.BoxClipRectangle 생성규칙과 일치함:
      1. clip xclip["x"]에 origin rectx 좌표를 더한 값으로 둔다.

      2. clip yclip["y"]에 origin recty 좌표를 더한 값으로 둔다.

      3. x 좌표clip x, y 좌표clip y, width가 clip["width"], 그리고 height가 clip["height"]인 DOMRectReadOnlyclip rect로 둔다.

  10. 참고: 이제 모든 좌표는 문서의 원점으로부터 측정된다.

  11. rectorigin rectclip rect직사각형 교차로 둔다.

  12. rect너비 치수가 0이거나 rect높이 치수가 0이면, 오류 코드 unable to capture screen오류를 반환한다.

  13. canvasdocumentrect문서를 canvas로 렌더링을 수행한 결과로 둔다.

  14. formatcommand parametersformat 필드로 둔다.

  15. encoding resultcanvasformatcanvas를 Base64로 인코딩시도한 결과로 둔다.

  16. bodydata 필드가 encoding result로 설정된 browsingContext.CaptureScreenshotResult 생성규칙과 일치하는 으로 둔다.

  17. 데이터 body와 함께 성공을 반환한다.

7.3.3.3. browsingContext.close 명령

browsingContext.close 명령은 최상위 traversable을 닫는다.

명령 타입
browsingContext.Close = (
  method: "browsingContext.close",
  params: browsingContext.CloseParameters
)

browsingContext.CloseParameters = {
  context: browsingContext.BrowsingContext,
  ? promptUnload: bool .default false
}
반환 타입
browsingContext.CloseResult = EmptyResult
command parameters원격 끝 단계는 다음과 같다:
  1. navigable idcommand parameterscontext 필드 값으로 둔다.

  2. prompt unloadcommand parameterspromptUnload 필드 값으로 둔다.

  3. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

  4. 단언: navigable은 null이 아니다.

  5. navigable최상위 traversable이 아니면, 오류를 반환하되 오류 코드invalid argument로 한다.

  6. prompt unload가 true이면:

    1. navigable닫는다.

  7. 그렇지 않으면:

    1. 언로드 프롬프트 없이 navigable닫는다.

  8. 데이터 null과 함께 성공을 반환한다.

마지막 최상위 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원격 끝 단계는 다음과 같다:
  1. typecommand parameterstype 필드 값으로 둔다.

  2. reference navigable idcommand parametersreferenceContext 필드 값으로 두되, 있으면 그 값으로, 그렇지 않으면 null로 둔다.

  3. reference navigable id가 null이 아니면, reference navigablereference navigable idnavigable 가져오기시도한 결과로 둔다. 그렇지 않으면 reference navigable을 null로 둔다.

  4. reference navigable이 null이 아니고 최상위 traversable이 아니면, 오류를 반환하되 오류 코드invalid argument로 한다.

  5. 구현이 어떤 이유로든 새 최상위 traversable을 만들 수 없으면 오류를 반환하되 오류 코드unsupported operation으로 한다.

  6. user context를, reference navigable이 null이면 기본 사용자 컨텍스트로 두고, 그렇지 않으면 reference navigable연관된 사용자 컨텍스트로 둔다.

  7. user context idcommand parametersuserContext 필드 값으로 두되, 있으면 그 값으로, 그렇지 않으면 null로 둔다.

  8. user context id가 null이 아니면, user contextuser context id사용자 컨텍스트 가져오기시도한 결과로 설정한다.

  9. user context가 null이면, 오류를 반환하되 오류 코드no such user context로 한다.

  10. 구현이 어떤 이유로든 연관된 사용자 컨텍스트 user context를 가진 새 최상위 traversable을 만들 수 없으면, 오류를 반환하되 오류 코드unsupported operation으로 한다.

  11. traversable을 null과 빈 문자열로 새 최상위 traversable 생성 단계를 시도하고, 새로 생성된 최상위 traversable연관된 사용자 컨텍스트user context로 설정한 결과로 둔다. 새 최상위 traversable이 어느 OS 창에 생성되는지는 typereference navigable에 따라 달라진다:

  12. command parametersbackground 필드 값이 false이면:

    1. activate result를 새로 생성된 navigablenavigable 활성화를 수행한 결과로 둔다.

    2. activate result오류이면, activate result를 반환한다.

    참고: background가 true이면 생성된 navigable에 대해 포커싱 단계를 호출하지 않는다.

  13. bodycontext 필드는 traversablenavigable id로 설정하고, userContext 속성은 traversable연관된 사용자 컨텍스트사용자 컨텍스트 id로 설정한 browsingContext.CreateResult 생성규칙과 일치하는 으로 둔다.

  14. 데이터 body와 함께 성공을 반환한다.

7.3.3.5. browsingContext.getTree 명령

browsingContext.getTree 명령은 주어진 부모 자체를 포함한 모든 자손 navigable의 트리, 또는 부모가 제공되지 않은 경우 모든 최상위 context를 반환한다.

명령 타입
browsingContext.GetTree = (
  method: "browsingContext.getTree",
  params: browsingContext.GetTreeParameters
)

browsingContext.GetTreeParameters = {
  ? maxDepth: js-uint,
  ? root: browsingContext.BrowsingContext,
}
반환 타입
browsingContext.GetTreeResult = {
  contexts: browsingContext.InfoList
}
sessioncommand parameters원격 끝 단계는 다음과 같다:
  1. root idcommand parametersroot 필드 값으로 두되, 있으면 그 값으로, 그렇지 않으면 null로 둔다.

  2. max depthcommand parametersmaxDepth 필드 값으로 두되, 있으면 그 값으로, 그렇지 않으면 null로 둔다.

  3. navigables를 빈 목록으로 둔다.

  4. root id가 null이 아니면, root id가 주어졌을 때 navigable 가져오기시도한 결과를 navigables에 추가한다. 그렇지 않으면 모든 최상위 traversablenavigables에 추가한다.

  5. navigables infos를 빈 목록으로 둔다.

  6. navigables의 각 navigable에 대해:

    1. infonavigable, max depth, true가 주어졌을 때 navigable 정보 가져오기를 수행한 결과로 둔다.

    2. infonavigables infos에 추가한다

  7. bodycontexts 필드가 navigables infos로 설정된 browsingContext.GetTreeResult 생성규칙과 일치하는 으로 둔다.

  8. 데이터 body와 함께 성공을 반환한다.

7.3.3.6. browsingContext.handleUserPrompt 명령

browsingContext.handleUserPrompt 명령은 열린 프롬프트를 닫을 수 있게 한다

명령 타입
browsingContext.HandleUserPrompt = (
  method: "browsingContext.handleUserPrompt",
  params: browsingContext.HandleUserPromptParameters
)

browsingContext.HandleUserPromptParameters = {
  context: browsingContext.BrowsingContext,
  ? accept: bool,
  ? userText: text,
}
반환 타입
browsingContext.HandleUserPromptResult = EmptyResult

sessioncommand parameters원격 끝 단계는 다음과 같다:

  1. navigable idcommand parameterscontext 필드 값으로 둔다.

  2. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

  3. acceptcommand parametersaccept 필드 값으로 두되, 있으면 그 값으로, 그렇지 않으면 true로 둔다.

  4. userTextcommand parametersuserText 필드 값으로 두되, 있으면 그 값으로, 그렇지 않으면 빈 문자열로 둔다.

  5. navigable이 현재 alert 호출에서 온 단순 대화상자를 표시 중이면 프롬프트를 확인한다.

    그렇지 않고 navigable이 현재 confirm 호출에서 온 단순 대화상자를 표시 중이면, accept가 true일 때 긍정적으로 응답하고, accept가 false일 때 부정적으로 응답한다.

    그렇지 않고 navigable이 현재 prompt 호출에서 온 단순 대화상자를 표시 중이면, accept가 true일 때 문자열 값 userText로 응답하고, accept가 false일 때 중단한다.

    그렇지 않고, navigable이 현재 언로드 프롬프트 단계의 일부로 프롬프트를 표시 중이면, accept가 true일 때 탐색을 확인하고, 그렇지 않으면 탐색을 거부한다.

    그렇지 않으면 오류를 반환하되 오류 코드no such alert로 한다.

  6. 데이터 null과 함께 성공을 반환한다.

7.3.3.7. browsingContext.locateNodes 명령

browsingContext.locateNodes 명령은 지정된 locator와 일치하는 모든 노드의 목록을 반환한다.

명령 타입
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, sessionCSS를 사용하여 노드 찾기를 하려면:
  1. returned nodes를 빈 목록으로 둔다.

  2. parse resultselector가 주어졌을 때 selector 파싱을 수행한 결과로 둔다.

  3. parse result가 실패이면, 오류를 반환하되 오류 코드invalid selector로 한다.

  4. context nodes의 각 context node에 대해:

    1. elementsparse resultnavigable활성 문서루트scoping root context node를 사용하여 selector를 트리와 대조한 결과로 둔다.

    2. elements의 각 element에 대해:

      1. elementreturned nodes추가한다.

      2. maximum returned node count가 null이 아니고 returned nodes크기maximum returned node count와 같으면, 데이터 returned nodes와 함께 성공을 반환한다.

  5. 데이터 returned nodes와 함께 성공을 반환한다.

navigable이 주어졌을 때 컨테이너 요소 찾기를 하려면:
  1. returned nodes를 빈 목록으로 둔다.

  2. navigable컨테이너가 null이 아니면, navigable컨테이너returned nodes에 추가한다.

  3. returned nodes를 반환한다.

주어진 navigable, context nodes, selector, maximum returned node countXPath를 사용하여 노드 찾기를 하려면:

참고: XPath 명세가 유지보수되지 않는 상태이므로 이 알고리즘은 XPath DOM API를 호출하는 것처럼 표현되어 있다. 그러나 이는 ECMAScript 런타임을 거치지 않고 기반 알고리즘에 직접 접근하는 명세 내부 호출과 동등한 것으로 이해해야 한다.

  1. returned nodes를 빈 목록으로 둔다.

  2. context nodes의 각 context node에 대해:

    1. evaluate resultnavigable활성 문서에서, 인수 selector, context node, null, ORDERED_NODE_SNAPSHOT_TYPE, null로 evaluate를 호출한 결과로 둔다. 이것이 "SyntaxError" DOMException을 던지면, 오류를 반환하되 오류 코드invalid selector로 한다; 그렇지 않고, 이것이 다른 예외를 던지면 오류를 반환하되 오류 코드unknown error로 한다.

    2. index를 0으로 둔다.

    3. lengthevaluate result에서 snapshotLength 속성을 가져온 결과로 둔다.

    4. indexlength보다 작은 동안 반복한다:

      1. nodeevaluate result를 this로, index를 인수로 하여 snapshotItem을 호출한 결과로 둔다.

      2. nodereturned nodes추가한다.

      3. maximum returned node count가 null이 아니고 returned nodes크기maximum returned node count와 같으면, 데이터 returned nodes와 함께 성공을 반환한다.

      4. indexindex + 1로 설정한다.

  3. 데이터 returned nodes와 함께 성공을 반환한다.

주어진 context nodes, selector, max depth, match type, ignore case, maximum returned node countinner text를 사용하여 노드 찾기를 하려면:
  1. selector가 빈 문자열이면, 오류를 반환하되 오류 코드invalid selector로 한다.

  2. returned nodes를 빈 목록으로 둔다.

  3. ignore case가 false이면, search textselector로 둔다. 그렇지 않으면, search textselector에 대해 Unicode Default Case Conversion 알고리즘에 따라 toUppercase를 수행한 결과로 둔다.

  4. context nodes의 각 context node에 대해:

    1. context nodeDocument 또는 DocumentFragment를 구현하면:

      참고: 문서 또는 문서 fragment를 순회할 때, documentdocument.documentElement로 검색한 결과가 같아지도록 max depth는 의도적으로 감소시키지 않는다.

      1. child nodes를 빈 목록으로 둔다.

      2. context node자식에 있는 각 노드 child에 대해.

        1. childchild nodes추가한다.

      3. returned nodeschild nodes, selector, max depth, match type, ignore case, maximum returned node countinner text를 사용하여 노드 찾기시도한 결과로 확장한다.

    2. context nodeHTMLElement를 구현하지 않으면 계속한다.

    3. node inner textcontext nodethis 값으로 하여 innerText getter 단계를 호출한 결과로 둔다.

    4. ignore case가 false이면, node textnode inner text로 둔다. 그렇지 않으면, node textnode inner text에 대해 Unicode Default Case Conversion 알고리즘에 따라 toUppercase를 수행한 결과로 둔다.

    5. search textnode text코드 포인트 부분 문자열이면, 다음 단계를 수행한다:

      1. child nodes를 빈 목록으로 두고, context node자식에 있는 각 노드 child에 대해:

        1. childchild nodes추가한다.

      2. child nodes크기가 0과 같거나 max depth가 0과 같으면, 다음 단계를 수행한다:

        1. match type"full"이고 node textsearch text같으면, context nodereturned nodes추가한다.

        2. 그렇지 않고, match type"partial"이면, context nodereturned nodes추가한다.

      3. 그렇지 않으면, 다음 단계를 수행한다:

        1. max depth가 null이면 child max depth를 null로, 그렇지 않으면 max depth - 1로 둔다.

        2. child node matcheschild nodes, selector, child max depth , match type, ignore case, maximum returned node countinner text를 사용하여 노드 찾기를 수행한 결과로 둔다.

        3. child node matches크기가 0과 같고 match type"partial"이면 context nodereturned nodes에 추가한다. 그렇지 않으면, returned nodeschild node matches확장한다.

  5. maximum returned node count가 null이 아니면, returned nodes에서 인덱스가 maximum returned node count 이상인 모든 항목을 제거한다.

  6. 데이터 returned nodes와 함께 성공을 반환한다.

주어진 context nodes, selector, maximum returned node count, returned nodes접근성 속성을 사용하여 노드 수집을 하려면:
  1. returned nodes가 null이면:

    1. returned nodes를 빈 목록으로 설정한다.

  2. context nodes의 각 context node에 대해:

    1. match를 true로 둔다.

    2. context nodeElement를 구현하면:

      1. selector가 "role"를 포함하면:

        1. rolecontext node계산된 역할로 둔다.

        2. selector["role"]가 role같지 않으면:

          1. match를 false로 설정한다.

      2. selector가 "name"을 포함하면:

        1. namecontext node접근 가능한 이름으로 둔다.

        2. selector["name"]이 name같지 않으면:

          1. match를 false로 설정한다.

    3. 그렇지 않으면, match를 false로 설정한다.

    4. match가 true이면:

      1. maximum returned node count가 null이 아니고 returned nodes크기maximum returned node count와 같으면, 중단한다.

      2. context nodereturned nodes추가한다.

    5. child nodes를 빈 목록으로 두고, context node자식에 있는 각 노드 child에 대해:

      1. childElement를 구현하면, childchild nodes추가한다.

    6. child nodes, selector, maximum returned node count, returned nodes접근성 속성을 사용하여 노드 수집시도한다.

  3. returned nodes를 반환한다.

주어진 context nodes, selector, maximum returned node count접근성 속성을 사용하여 노드 찾기를 하려면:
  1. selector가 "role"을 포함하지 않고 selector가 "name"을 포함하지 않으면, 오류를 반환하되 오류 코드invalid selector로 한다.

  2. context nodes, selector, maximum returned node count, null로 접근성 속성을 사용하여 노드 수집을 수행한 결과를 반환한다.

sessioncommand parameters원격 끝 단계는 다음과 같다:
  1. navigable idcommand parameters["context"]로 둔다.

  2. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

  3. 단언: navigable은 null이 아니다.

  4. realmnavigablenavigable id와 null로 navigable에서 realm 가져오기시도한 결과로 둔다.

  5. locatorcommand parameters["locator"]로 둔다.

  6. command parameters가 "startNodes"를 포함하면, start nodes parametercommand parameters["startNodes"]로 둔다. 그렇지 않으면 start nodes parameter를 null로 둔다.

  7. command parameters가 "maxNodeCount"를 포함하면, maximum returned node countcommand parameters["maxNodeCount"]로 둔다. 그렇지 않으면 maximum returned node count를 null로 둔다.

  8. context nodes를 빈 목록으로 둔다.

  9. start nodes parameter가 null이면, navigable활성 문서context nodes추가한다. 그렇지 않으면, start nodes parameter의 각 serialized start node에 대해:

    1. start nodeserialized start node, realm, session가 주어졌을 때 공유 참조 역직렬화시도한 결과로 둔다.

    2. start nodecontext nodes추가한다.

  10. context nodes크기가 0보다 크다고 단언한다.

  11. typelocator["type"]로 둔다.

  12. 다음 조건 및 관련 단계 목록에서, 관련 조건이 true인 첫 번째 단계 집합을 실행한다:

    type이 문자열 "css"인 경우
    1. selectorlocator["value"]로 둔다.

    2. result nodesnavigable, context nodes, selector, maximum returned nodes가 주어졌을 때 css를 사용하여 노드 찾기시도한 결과로 둔다.

    type이 문자열 "xpath"인 경우
    1. selectorlocator["value"]로 둔다.

    2. result nodesnavigable, context nodes, selector, maximum returned nodes가 주어졌을 때 xpath를 사용하여 노드 찾기시도한 결과로 둔다.

    type이 문자열 "innerText"인 경우
    1. selectorlocator["value"]로 둔다.

    2. locatormaxDepth포함하면, max depthlocator["maxDepth"]로 둔다. 그렇지 않으면 max depth를 null로 둔다.

    3. locatorignoreCase포함하면, ignore caselocator["ignoreCase"]로 둔다. 그렇지 않으면 ignore case를 false로 둔다.

    4. locatormatchType포함하면, match typelocator["matchType"]로 둔다. 그렇지 않으면 match type를 "full"로 둔다.

    5. result nodescontext nodes, selector, max depth, match type, ignore case, maximum returned node count가 주어졌을 때 inner text를 사용하여 노드 찾기시도한 결과로 둔다.

    type이 문자열 "accessibility"인 경우
    1. selectorlocator["value"]로 둔다.

    2. result nodescontext nodes, selector, maximum returned node count가 주어졌을 때 접근성 속성을 사용하여 노드 찾기를 수행한 결과로 둔다.

    type이 문자열 "context"인 경우
    1. start nodes parameter가 null이 아니면, 오류를 반환하되 오류 코드는 "invalid argument"로 한다.

    2. selectorlocator["value"]로 둔다.

    3. context idselector["context"]로 둔다.

    4. child navigablecontext idnavigable 가져오기시도한 결과로 둔다.

    5. child navigable부모navigable이 아니면, 오류를 반환하되 오류 코드는 "invalid argument"로 한다.

    6. result nodeschild navigable이 주어졌을 때 컨테이너 요소 찾기를 수행한 결과로 둔다.

    7. 단언: result nodes의 각 node에 대해, node노드 navigablenavigable이다.

  13. 단언: maximum returned node count는 null이거나 result nodes크기maximum returned node count 이하이다.

  14. command parameters가 "serializationOptions"를 포함하면, serialization optionscommand parameters["serializationOptions"]로 둔다. 그렇지 않으면, serialization options를 필드가 기본값으로 설정된 script.SerializationOptions 생성규칙과 일치하는 으로 둔다.

  15. result ownership을 "none"으로 둔다.

  16. serialized nodes를 빈 목록으로 둔다.

  17. result nodes의 각 result node에 대해:

    1. serialized noderesult node, serialization options, result ownership, 직렬화 내부 맵으로서 새 , realm, sessionremote value로 직렬화를 수행한 결과로 둔다.

    2. serialized nodeserialized nodes추가한다.

  18. resultnodes 필드가 serialized nodes로 설정된 browsingContext.LocateNodesResult 생성규칙과 일치하는 으로 둔다.

  19. 데이터 result와 함께 성공을 반환한다.

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,
}
sessioncommand parameters원격 끝 단계는 다음과 같다:
  1. navigable idcommand parameterscontext 필드 값으로 둔다.

  2. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

  3. 단언: navigable은 null이 아니다.

  4. wait condition을 "committed"로 둔다.

  5. command parameterswait포함하고 command parameters[wait]가 "none"이 아니면, wait conditioncommand parameters[wait]로 설정한다.

  6. urlcommand parametersurl 필드 값으로 둔다.

  7. documentnavigable활성 문서로 둔다.

  8. basedocumentbase URL로 둔다.

  9. url recordurlbase URL baseURL 파서를 적용한 결과로 둔다.

  10. url record가 실패이면, 오류를 반환하되 오류 코드invalid argument로 한다.

  11. request를 URL이 url record인 새 요청으로 둔다.

  12. navigable, request, wait condition으로 탐색 대기를 수행한 결과를 반환한다.

7.3.3.9. browsingContext.print 명령

browsingContext.print 명령은 문서의 페이지화된 표현을 만들고, 이를 Base64로 인코딩된 문자열로 표현된 PDF 문서로 반환한다.

명령 타입
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
}

sessioncommand parameters원격 끝 단계는 다음과 같다:

  1. navigable idcommand parameterscontext 필드 값으로 둔다.

  2. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

  3. 구현이 어떤 이유로든 navigable의 페이지화된 표현을 제공할 수 없으면 오류를 반환하되 오류 코드unsupported operation으로 한다.

  4. margincommand parametersmargin 필드 값으로 두되, 있으면 그 값으로, 그렇지 않으면 필드가 기본값으로 설정된 browsingContext.PrintMarginParameters와 일치하는 으로 둔다.

  5. page sizecommand parameterspage 필드 값으로 두되, 있으면 그 값으로, 그렇지 않으면 필드가 기본값으로 설정된 browsingContext.PrintPageParameters와 일치하는 으로 둔다.

참고: 최소 페이지 크기는 1 포인트이며, 이는 절대 길이에 따라 (2.54 / 72) cm이다.

  1. page rangescommand parameterspageRanges 필드 값으로 두되, 있으면 그 값으로, 그렇지 않으면 빈 목록으로 둔다.

  2. documentnavigable활성 문서로 둔다.

  3. document에 대해 다음번 애니메이션 프레임 콜백 실행 알고리즘 호출 직후:

    이는 렌더링 갱신 알고리즘에 더 명시적인 방식으로 통합되어야 한다.

    1. CSS media typeprint로 설정하고, 다음 용지 설정으로 PDF로 인코딩된 document의 페이지화된 표현을 생성하는 UA별 단계를 수행한 결과를 pdf data로 둔다:

      속성
      cm 단위 너비 page size["width"] if command parameters["orientation"] is "portrait" otherwise page size["height"]
      cm 단위 높이 page size["height"] if command parameters["orientation"] is "portrait" otherwise page size["width"]
      위쪽 여백, cm 단위 margin["top"]
      아래쪽 여백, cm 단위 margin["bottom"]
      왼쪽 여백, cm 단위 margin["left"]
      오른쪽 여백, cm 단위 margin["right"]

      추가로, UA는 다음 formatting hint를 적용해야 한다:

      command parameters["scale"]가 1과 같지 않으면:
      콘텐츠의 크기를 command parameters["scale"] 배율만큼 확대/축소한다
      command parameters["background"]가 false이면:
      배경 이미지의 출력을 억제한다
      command parameters["shrinkToFit"]가 true이면:
      콘텐츠에 지정된 페이지 너비를 재정의하여 콘텐츠를 페이지 너비에 맞게 크기 조정한다
    2. page ranges비어 있지 않으면, pagespage rangespdf data에 포함된 페이지 수로 페이지 범위 파싱시도한 결과로 두고, 1부터 시작하는 인덱스가 pages에 포함되지 않은 모든 페이지를 pdf data에서 제거한다.

    3. encoding resultpdf data에 대해 Base64 Encode를 호출한 결과로 둔다.

    4. encoded dataencoding result의 data로 둔다.

    5. bodydata 필드가 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원격 끝 단계는 다음과 같다:
  1. navigable idcommand parameterscontext 필드 값으로 둔다.

  2. navigablenavigable id시도하여 navigable 가져오기를 수행한 결과로 둔다.

  3. 단언: navigable은 null이 아니다.

  4. ignore cachecommand parametersignoreCache 필드 값이 있으면 그 값으로, 그렇지 않으면 false로 둔다.

  5. wait condition을 "committed"로 둔다.

  6. command parameters포함하는 wait가 있고 command parameters[wait]가 "none"이 아니면, wait conditioncommand parameters[wait]로 설정한다.

  7. documentnavigable활성 문서로 둔다.

  8. urldocumentURL로 둔다.

  9. request를 URL이 url인 새 요청으로 둔다.

  10. navigable, request, wait condition, history handling "reload", 그리고 ignore cache ignore cache탐색 대기를 수행한 결과를 반환한다.

7.3.3.11. browsingContext.setBypassCSP 명령

browsingContext.setBypassCSP 명령은 Content Security Policy 적용을 우회할 수 있게 한다.

참고: CSP 우회가 활성화되면, eval(), new Function(), 인라인 스크립트 및 리소스 로딩을 일반적으로 차단하는 지시자를 포함하여 모든 CSP 지시자가 우회된다.

명령 타입
browsingContext.SetBypassCSP = (
  method: "browsingContext.setBypassCSP",
  params: browsingContext.SetBypassCSPParameters
)

browsingContext.SetBypassCSPParameters = {
  bypass: true / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
반환 타입
browsingContext.SetBypassCSPResult = EmptyResult

원격 끝CSP 우회 구성을 가지며, 이는 WebDriver 구성으로서 연관 타입 boolean을 가진다.

navigable navigable이 주어졌을 때 WebDriver BiDi CSP가 우회되는지 단계는 다음과 같다:

  1. top-level traversablenavigable최상위 traversable로 둔다.

  2. bypass CSP enabledtop-level traversable에 대한 CSP 우회 구성WebDriver 구성 값 가져오기 결과로 둔다.

  3. 단언: bypass CSP enabledtrue 또는 unset이다.

  4. bypass CSP enabledunset이면 false를 반환한다.

  5. true를 반환한다.

command parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:

  1. bypasscommand parameters["bypass"]로 둔다.

  2. bypass가 null이면, bypassunset으로 설정한다.

  3. command parameters에 대해 CSP 우회 구성 bypassWebDriver 구성 저장시도한다.

  4. 데이터 null과 함께 성공을 반환한다.

7.3.3.12. browsingContext.setViewport 명령

browsingContext.setViewport 명령은 주어진 최상위 traversable의 특정 뷰포트 특성(예: 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
navigabledevice pixel ratio가 주어졌을 때 device pixel ratio 재정의 설정을 하려면:
  1. device pixel ratio가 null이 아니면:

    1. 지정된 navigable에 현재 로드된 문서에 대해:

      1. source set에서 이미지 소스 선택 단계가 실행될 때, 이미지를 선택할 때 구현의 픽셀 밀도가 device pixel ratio로 설정된 것처럼 동작한다.

      2. resolution media feature의 목적상, 구현의 해상도가 페이지 줌으로 스케일된 device pixel ratio dppx인 것처럼 동작한다.

    2. 설정한다. device pixel ratio overrides[navigable]를 device pixel ratio로 설정한다.

      참고: 이는 § 8.3.1 Device pixel ratio 결정의 패치 때문에 효과를 가진다.

  2. 그렇지 않으면:

    1. 지정된 navigable에 현재 로드된 문서에 대해:

      1. source set에서 이미지 소스 선택 단계가 실행될 때, 이전의 이 단계 호출로 이루어진 변경 없이 구현의 기본 동작을 사용한다.

      2. resolution media feature의 목적상, 이전의 이 단계 호출로 이루어진 변경 없이 구현의 기본 동작을 사용한다.

    2. 제거한다. navigabledevice pixel ratio overrides에서 제거한다.

  3. 지정된 navigable에 현재 로드된 문서에 대해 media query 평가 및 변경 보고를 실행한다.

navigable navigableviewport viewport가 주어졌을 때 viewport 설정을 하려면:
  1. viewport가 null이 아니면, navigablelayout viewport의 너비를 CSS 픽셀 단위인 viewportwidth로 설정하고, navigablelayout viewport의 높이를 CSS 픽셀 단위인 viewportheight로 설정한다.

  2. 그렇지 않으면, navigablelayout viewport를 구현 정의 기본값으로 설정한다.

navigable navigable 안에 문서를 생성한 뒤, WebDriver BiDi 프리로드 스크립트 실행 알고리즘이 호출되기 전에:

TODO: 대신 이를 html 명세의 훅으로 이동한다.

  1. user contextnavigable연관된 사용자 컨텍스트로 둔다.

  2. navigable최상위 traversable이면:

    1. navigable에 대해 geolocation 재정의 갱신을 한다.

    2. navigable에 대해 에뮬레이트된 forced colors 테마 갱신을 한다.

    3. screen orientation overrides mapuser context포함하면, navigablescreen orientation overrides map[user context]으로 에뮬레이트된 화면 방향 설정을 한다.

  3. viewport overrides mapuser context포함하면:

    1. navigable최상위 traversable이고 viewport overrides map[user context]의 viewport가 null이 아니면:

      1. navigableviewport overrides map[user context]의 viewportviewport 설정을 한다.

    2. viewport overrides map[user context]의 devicePixelRatio가 null이 아니면:

      1. navigableviewport overrides map[user context]의 devicePixelRatiodevice pixel ratio 재정의 설정을 한다.

  4. navigable에 대해 scrollbar type 재정의 갱신을 한다.

command parameters원격 끝 단계는 다음과 같다:

  1. 구현이 어떤 이유로든 주어진 command parameterslayout viewport 매개변수를 조정할 수 없으면, 오류를 반환하되 오류 코드unsupported operation으로 한다.

  2. command parameters가 "userContexts"를 포함하고 command parameters가 "context"를 포함하면, 오류를 반환하되 오류 코드invalid argument로 한다.

  3. navigables집합으로 둔다.

  4. command parameterscontext 필드가 있으면:

    1. navigable idcommand parameterscontext 필드 값으로 둔다.

    2. navigablenavigable id시도하여 navigable 가져오기를 수행한 결과로 둔다.

    3. navigable최상위 traversable이 아니면, 오류를 반환하되 오류 코드invalid argument로 한다.

    4. navigablenavigables추가한다.

  5. 그렇지 않고, command parametersuserContexts 필드가 있으면:

    1. user contextscommand parameters["userContexts"]로 시도하여 유효한 사용자 컨텍스트 가져오기를 수행한 결과로 둔다.

    2. user contexts의 각 user context에 대해:

      1. 설정한다. viewport overrides map[user context]을 구조체로 설정한다.

      2. command parameters가 "viewport"를 포함하면:

        1. viewport overrides map[user context]의 viewportcommand parameters["viewport"]로 설정한다.

      3. command parameters가 "devicePixelRatio"를 포함하면:

        1. viewport overrides map[user context]의 devicePixelRatiocommand parameters["devicePixelRatio"]로 설정한다.

      4. 최상위 traversable 중 그 연관된 사용자 컨텍스트user context인 모든 목록의 top-level traversable에 대해:

        1. top-level traversablenavigables추가한다.

  6. 그렇지 않으면, 오류를 반환하되 오류 코드invalid argument로 한다.

  7. command parametersviewport 필드를 포함하면:

    1. viewportcommand parameters["viewport"]로 둔다.

    2. navigables의 각 navigable에 대해:

      1. navigableviewportviewport 설정을 한다.

      2. navigable활성 문서CSSOM View § 13.1 Resizing viewports 단계를 실행한다.

  8. command parametersdevicePixelRatio 필드를 포함하면:

    1. device pixel ratiocommand parameters["devicePixelRatio"]로 둔다.

    2. navigables의 각 navigable에 대해:

      1. navigable 및 모든 자손 navigable에 대해:

        1. navigabledevice pixel ratiodevice pixel ratio 재정의 설정을 한다.

  9. 데이터 null과 함께 성공을 반환한다.

7.3.3.13. 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. navigablecommand parameters["context"]로 시도하여 navigable 가져오기를 수행한 결과로 둔다.

  2. navigable최상위 traversable이 아니면, 오류를 반환하되 오류 코드invalid argument로 한다.

  3. 단언: navigable은 null이 아니다.

  4. deltacommand parameters["delta"]로 둔다.

  5. resume id를 고유한 문자열로 둔다.

  6. navigablesession history traversal queue에 다음 단계를 실행하는 태스크를 큐에 넣는다:

    1. all stepsnavigable에 대해 사용된 모든 이력 단계 가져오기를 수행한 결과로 둔다.

    2. current indexall steps 안에서 navigable현재 session history step의 인덱스로 둔다.

    3. target indexcurrent indexdelta의 합으로 둔다.

    4. all steps[target index]가 존재하지 않으면 valid entry를 false로, 그렇지 않으면 true로 둔다.

    5. "check history", resume id, 그리고 valid entry재개한다.

  7. is valid entry를 «"check history"» 및 resume idawait한 결과로 둔다.

  8. is valid entry가 false이면, 오류 코드 no such history entry오류를 반환한다.

  9. deltanavigable이 주어졌을 때 delta만큼 이력 순회를 한다.

    작성된 알고리즘에는 경합 조건이 있다. 대상 session history entry로 탐색하려 할 때는 이미 그것이 존재하지 않을 수 있기 때문이다. 이력 탐색 대기를 지원하게 되면 이를 더 견고하게 처리할 수 있다.

  10. TODO: 이력 순회가 완료될 때까지 기다리는 것을 지원한다.

  11. bodybrowsingContext.TraverseHistoryResult 생성규칙과 일치하는 으로 둔다.

  12. 데이터 body와 함께 성공을 반환한다.

contextnavigation status navigation status가 주어졌을 때 WebDriver BiDi page show 단계는 다음과 같다:

`browsingContext.pageShow 이벤트를 노출할 것인가? 이 경우 이를 bfcache 복원 시뿐 아니라 `pageshow`가 방출될 때마다 호출해야 하며, persisted 상태도 데이터에 추가해야 한다.

  1. navigation idnavigation statusid로 둔다.

  2. "page show", navigation id, 그리고 navigation status재개한다.

contextnavigation status navigation status가 주어졌을 때 WebDriver BiDi pop state 단계는 다음과 같다:

  1. navigation idnavigation statusid로 둔다.

  2. "pop state", navigation id, 그리고 navigation status재개한다.

7.3.4. 이벤트

7.3.4.1. browsingContext.contextCreated 이벤트
이벤트 타입
browsingContext.ContextCreated = (
 method: "browsingContext.contextCreated",
 params: browsingContext.Info
)

sessionnavigable이 주어졌을 때 context created 이벤트를 재귀적으로 방출하려면:

  1. sessionnavigablecontext created 이벤트 방출을 한다.

  2. navigable의 각 자식 navigable child에 대해:

    1. sessionchild가 주어졌을 때 context created 이벤트를 재귀적으로 방출한다.

sessionnavigable이 주어졌을 때 context created 이벤트 방출을 하려면:

  1. paramsnavigable, 0, true가 주어졌을 때 navigable 정보 가져오기를 수행한 결과로 둔다.

  2. bodybrowsingContext.ContextCreated 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  3. sessionbody이벤트 방출을 한다.

원격 끝 이벤트 트리거navigable navigablenavigable opener navigable이 주어졌을 때의 WebDriver BiDi navigable created 단계이다:

  1. opener navigable이 제공되면, navigable원래 openeropener navigable로 설정한다.

  2. navigablenavigable 캐시 동작이 "bypass"이면, navigable에서 발생한 네트워크 요청에 대한 구현별 리소스 캐시를 비활성화하기 위한 구현 정의 단계를 수행한다.

  3. related navigablesnavigable을 포함하는 집합으로 둔다.

  4. "browsingContext.contextCreated" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionnavigable가 주어졌을 때 context created 이벤트 방출을 한다.

session, navigablesinclude global이 주어졌을 때 구독 우선순위 1을 가지는 원격 끝 구독 단계는 다음과 같다:

  1. navigables 안의 각 navigable에 대해:

    1. sessionnavigable가 주어졌을 때 context created 이벤트를 재귀적으로 방출한다.

7.3.4.2. browsingContext.contextDestroyed 이벤트
이벤트 타입
browsingContext.ContextDestroyed = (
 method: "browsingContext.contextDestroyed",
 params: browsingContext.Info
)
원격 끝 이벤트 트리거는 다음과 같다:

원격 끝 이벤트 트리거navigable navigable이 주어졌을 때의 WebDriver BiDi navigable destroyed 단계이다:

  1. paramsnavigable, null, true가 주어졌을 때 navigable 정보 가져오기를 수행한 결과로 둔다.

  2. bodybrowsingContext.ContextDestroyed 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  3. related navigablesnavigable부모가 null이 아니면 그것을 포함하는 집합으로, 그렇지 않으면 빈 집합으로 둔다.

  4. "browsingContext.contextDestroyed" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

    2. subscriptions to remove집합으로 둔다.

    3. session구독에 있는 각 subscription에 대해:

      1. subscription최상위 traversable idnavigablenavigable id포함하면;

        1. navigablenavigable idsubscription최상위 traversable id에서 제거한다.

        2. subscription최상위 traversable id가 비어 있으면:

          1. subscriptionsubscriptions to remove추가한다.

    4. subscriptions to removesession구독에서 제거한다.

이 이벤트를 활성 문서를 가진 browsing context에 대해서만 발생시켜야 하는지는 명확하지 않다. 탐색은 context가 접근 불가능해지게 할 수도 있지만, bfcache 때문에 아직 폐기되지 않을 수도 있다.

7.3.4.3. browsingContext.navigationStarted 이벤트
이벤트 타입
browsingContext.NavigationStarted = (
 method: "browsingContext.navigationStarted",
 params: browsingContext.NavigationInfo
)
원격 끝 이벤트 트리거navigable navigablenavigation status navigation status가 주어졌을 때의 WebDriver BiDi navigation started 단계이다:
  1. paramsnavigablenavigation status가 주어졌을 때 navigation 정보 가져오기를 수행한 결과로 둔다.

  2. bodybrowsingContext.NavigationStarted 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  3. navigation idnavigation statusid로 둔다.

  4. related navigablesnavigable을 포함하는 집합으로 둔다.

  5. "navigation started", navigation id, 그리고 navigation status재개한다.

  6. "browsingContext.navigationStarted" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

7.3.4.4. browsingContext.fragmentNavigated 이벤트
이벤트 타입
browsingContext.FragmentNavigated = (
 method: "browsingContext.fragmentNavigated",
 params: browsingContext.NavigationInfo
)
원격 끝 이벤트 트리거navigable navigablenavigation status navigation status가 주어졌을 때의 WebDriver BiDi fragment navigated 단계이다:
  1. paramsnavigablenavigation status가 주어졌을 때 navigation 정보 가져오기를 수행한 결과로 둔다.

  2. bodybrowsingContext.FragmentNavigated 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  3. navigation idnavigation statusid로 둔다.

  4. related navigablenavigable을 포함하는 집합으로 둔다.

  5. "fragment navigated", navigation id, 그리고 navigation status재개한다.

  6. "browsingContext.fragmentNavigated" 및 related navigable가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

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 history updated 단계이다:
  1. urlnavigable활성 browsing context활성 문서URL이 주어졌을 때 URL 직렬화기를 실행한 결과로 둔다.

  2. user context idnavigable연관된 사용자 컨텍스트사용자 컨텍스트 id로 둔다.

  3. timestamp를 현재 날짜와 시간을 UTC로 나타내는 시간 값으로 둔다.

  4. paramsbrowsingContext.HistoryUpdatedParameters 생성규칙과 일치하는 으로 두고, url 필드를 url로 설정하고, timestamp 필드를 timestamp로 설정하고, context 필드를 navigablenavigable id로 설정하고 userContext 필드를 user context id로 설정한다.

  5. bodybrowsingContext.HistoryUpdated 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  6. related browsing contextsnavigable활성 browsing context를 포함하는 집합으로 둔다.

  7. "browsingContext.historyUpdated" 및 related browsing contexts가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

7.3.4.6. browsingContext.domContentLoaded 이벤트
이벤트 타입
browsingContext.DomContentLoaded = (
 method: "browsingContext.domContentLoaded",
 params: browsingContext.NavigationInfo
)
원격 끝 이벤트 트리거navigable navigablenavigation status navigation status가 주어졌을 때의 WebDriver BiDi DOM content loaded 단계이다:
  1. paramsnavigablenavigation status가 주어졌을 때 navigation 정보 가져오기를 수행한 결과로 둔다.

  2. bodybrowsingContext.DomContentLoaded 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  3. related navigablesnavigable을 포함하는 집합으로 둔다.

  4. navigation idnavigation statusid로 둔다.

  5. "domContentLoaded", navigation id, 그리고 navigation status재개한다.

  6. "browsingContext.domContentLoaded" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

7.3.4.7. browsingContext.load 이벤트
이벤트 타입
browsingContext.Load = (
 method: "browsingContext.load",
 params: browsingContext.NavigationInfo
)
원격 끝 이벤트 트리거navigable navigablenavigation status navigation status가 주어졌을 때의 WebDriver BiDi load complete 단계이다:
  1. paramsnavigablenavigation status가 주어졌을 때 navigation 정보 가져오기를 수행한 결과로 둔다.

  2. bodybrowsingContext.Load 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  3. related navigablesnavigable을 포함하는 집합으로 둔다.

  4. navigation idnavigation statusid로 둔다.

  5. "load", navigation idnavigation status재개한다.

  6. "browsingContext.load" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

7.3.4.8. browsingContext.downloadWillBegin 이벤트
이벤트 타입
browsingContext.DownloadWillBegin = (
 method: "browsingContext.downloadWillBegin",
 params: browsingContext.DownloadWillBeginParams
)

browsingContext.DownloadWillBeginParams = {
  suggestedFilename: text,
  browsingContext.BaseNavigationInfo
}
원격 끝 이벤트 트리거navigable navigablenavigation status navigation status가 주어졌을 때의 WebDriver BiDi download will begin 단계이다:
  1. navigation infonavigablenavigation status가 주어졌을 때 navigation 정보 가져오기를 수행한 결과로 둔다.

  2. paramsbrowsingContext.DownloadWillBeginParams 생성규칙과 일치하는 으로 두고, context 필드를 navigation info["context"]로 설정하고, navigation 필드를 navigation info["navigation"]로 설정하고, timestamp 필드를 navigation info["timestamp"]로 설정하고, url 필드를 navigation info["url"]로 설정하고 suggestedFilename 필드를 navigation statussuggestedFilename으로 설정한다.

  3. bodybrowsingContext.DownloadWillBegin 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  4. navigation idnavigation statusid로 둔다.

  5. related navigablesnavigable을 포함하는 집합으로 둔다.

  6. "download started", navigation id, 그리고 navigation status재개한다.

  7. "browsingContext.downloadWillBegin" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

  8. download behaviornavigabledownload behavior 가져오기를 수행한 결과로 둔다.

  9. 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",
  browsingContext.BaseNavigationInfo
)

browsingContext.DownloadCompleteParams = (
  status: "complete",
  filepath: text / null,
  browsingContext.BaseNavigationInfo
)
원격 끝 이벤트 트리거navigable navigablenavigation status navigation status가 주어졌을 때의 WebDriver BiDi download end 단계이다:
  1. navigation infonavigablenavigation status가 주어졌을 때 navigation 정보 가져오기를 수행한 결과로 둔다.

  2. navigation info["status"]가 "complete" 또는 "canceled"와 같다고 단언한다.

  3. navigation info["status"]가 "complete"이면, paramsbrowsingContext.DownloadCompleteParams 생성규칙과 일치하는 으로 두고, filepath 필드를 navigation statusdownloadedFilepath로 설정하고, context 필드를 navigation info["context"]로 설정하고, navigation 필드를 navigation info["navigation"]로 설정하고, timestamp 필드를 navigation info["timestamp"]로 설정하고, url 필드를 navigation info["url"]로 설정한다.

    참고: 어떤 이유로든 filepath를 사용할 수 없는 경우, 완료된 다운로드에 대해 filepath는 null일 수 있다.

  4. 그렇지 않으면, paramsbrowsingContext.DownloadCanceledParams 생성규칙과 일치하는 으로 두고, context 필드를 navigation info["context"]로 설정하고, navigation 필드를 navigation info["navigation"]로 설정하고, timestamp 필드를 navigation info["timestamp"]로 설정하고, url 필드를 navigation info["url"]로 설정한다.

  5. bodybrowsingContext.DownloadEnd 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  6. related navigablesnavigable을 포함하는 집합으로 둔다.

  7. "browsingContext.downloadEnd" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

7.3.4.10. browsingContext.navigationAborted 이벤트
이벤트 타입
browsingContext.NavigationAborted = (
 method: "browsingContext.navigationAborted",
 params: browsingContext.NavigationInfo
)
원격 끝 이벤트 트리거navigable navigablenavigation status navigation status가 주어졌을 때의 WebDriver BiDi navigation aborted 단계이다:
  1. paramsnavigablenavigation status가 주어졌을 때 navigation 정보 가져오기를 수행한 결과로 둔다.

  2. bodybrowsingContext.NavigationAborted 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  3. navigation idnavigation statusid로 둔다.

  4. related navigablesnavigable을 포함하는 집합으로 둔다.

  5. "navigation aborted", navigation id, 그리고 navigation status재개한다.

  6. "browsingContext.navigationAborted" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

7.3.4.11. browsingContext.navigationCommitted 이벤트
이벤트 타입
browsingContext.NavigationCommitted = (
 method: "browsingContext.navigationCommitted",
 params: browsingContext.NavigationInfo
)
원격 끝 이벤트 트리거navigable navigablenavigation status navigation status가 주어졌을 때의 WebDriver BiDi navigation committed 단계이다:
  1. paramsnavigablenavigation status가 주어졌을 때 navigation 정보 가져오기를 수행한 결과로 둔다.

  2. bodybrowsingContext.NavigationCommitted 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  3. related navigablesnavigable을 포함하는 집합으로 둔다.

  4. navigation idnavigation statusid로 둔다.

  5. "navigation committed", navigation id, 그리고 navigation status재개한다.

  6. "browsingContext.navigationCommitted" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

7.3.4.12. browsingContext.navigationFailed 이벤트
이벤트 타입
browsingContext.NavigationFailed = (
 method: "browsingContext.navigationFailed",
 params: browsingContext.NavigationInfo
)
원격 끝 이벤트 트리거navigable navigablenavigation status navigation status가 주어졌을 때의 WebDriver BiDi navigation failed 단계이다:
  1. paramsnavigablenavigation status가 주어졌을 때 navigation 정보 가져오기를 수행한 결과로 둔다.

  2. bodybrowsingContext.NavigationFailed 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  3. navigation idnavigation statusid로 둔다.

  4. related navigablesnavigable을 포함하는 집합으로 둔다.

  5. "navigation failed", navigation id, 그리고 navigation status재개한다.

  6. "browsingContext.navigationFailed" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

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
}
원격 끝 이벤트 트리거Window window, 문자열 type, boolean accepted 및 선택적 text user text (기본값: null)가 주어졌을 때의 WebDriver BiDi user prompt closed 단계이다.
  1. navigablewindownavigable로 둔다.

  2. navigable idnavigable에 대한 navigable id로 둔다.

  3. user context idnavigable연관된 사용자 컨텍스트사용자 컨텍스트 id로 둔다.

  4. paramsbrowsingContext.UserPromptClosedParameters 생성규칙과 일치하는 으로 두고, context 필드를 navigable id로 설정하고, userContext 필드를 user context id로 설정하고, accepted 필드를 accepted로 설정하고, type 필드를 type로 설정하고, user text가 null이 아니면 userText 필드를 user text로 설정하며, 그렇지 않으면 생략한다.

  5. bodyBrowsingContextUserPromptClosedEvent 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  6. related navigablesnavigable을 포함하는 집합으로 둔다.

  7. "browsingContext.userPromptClosed" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

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
}
typenavigable이 주어졌을 때 navigable의 사용자 프롬프트 핸들러 가져오기를 하려면:
  1. user contextnavigable연관된 사용자 컨텍스트로 둔다.

  2. 처리되지 않은 프롬프트 동작 재정의 맵user context포함하면:

    1. unhandled prompt behavior override처리되지 않은 프롬프트 동작 재정의 맵[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 configurationtype으로 프롬프트 핸들러 가져오기를 수행한 결과로 둔다.

  4. handler configurationhandler를 반환한다.

원격 끝 이벤트 트리거Window window, 문자열 type, 문자열 message, 및 선택적 text default value (기본값: null)가 주어졌을 때의 WebDriver BiDi user prompt opened 단계이다.
  1. navigablewindownavigable로 둔다.

  2. navigable idnavigable에 대한 navigable id로 둔다.

  3. user context idnavigable연관된 사용자 컨텍스트사용자 컨텍스트 id로 둔다.

  4. handlertypenavigablenavigable의 사용자 프롬프트 핸들러 가져오기를 수행한 결과로 둔다.

  5. paramsbrowsingContext.UserPromptOpenedParameters 생성규칙과 일치하는 으로 두고, context 필드를 navigable id로 설정하고, userContext 필드를 user context id로 설정하고, type 필드를 type로 설정하고, message 필드를 message로 설정하고, default value가 null이 아니면 defaultValue 필드를 default value로 설정하며, 그렇지 않으면 생략하고, handler 필드를 handler로 설정한다.

  6. bodybrowsingContext.UserPromptOpened 생성규칙과 일치하는 으로 두고, params 필드를 params로 설정한다.

  7. related navigablesnavigable을 포함하는 집합으로 둔다.

  8. "browsingContext.userPromptOpened" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. sessionbody이벤트 방출을 한다.

  9. handler가 "ignore"이면, handler를 "none"으로 설정한다.

  10. handler를 반환한다.

7.4. emulation 모듈

emulation 모듈은 브라우저 API의 에뮬레이션과 관련된 명령 및 이벤트를 포함한다.

7.4.1. 정의

원격 끝 정의

EmulationCommand = (
  emulation.SetForcedColorsModeThemeOverride //
  emulation.SetGeolocationOverride //
  emulation.SetLocaleOverride //
  emulation.SetNetworkConditions //
  emulation.SetScreenOrientationOverride //
  emulation.SetScreenSettingsOverride //
  emulation.SetScriptingEnabled //
  emulation.SetScrollbarTypeOverride //
  emulation.SetTimezoneOverride //
  emulation.SetTouchOverride //
  emulation.SetUserAgentOverride
)

EmulationResult = (
  emulation.SetForcedColorsModeThemeOverrideResult /
  emulation.SetGeolocationOverrideResult /
  emulation.SetLocaleOverrideResult /
  emulation.SetScreenOrientationOverrideResult /
  emulation.SetScriptingEnabledResult /
  emulation.SetScrollbarTypeOverrideResult /
  emulation.SetTimezoneOverrideResult /
  emulation.SetTouchOverrideResult /
  emulation.SetUserAgentOverrideResult
)

BiDi 세션에뮬레이트된 user agent를 가지며, 이는 구조체이고 기본 user agent라는 이름의 항목을 가지며, 이는 문자열 또는 null이고, 사용자 컨텍스트 user agent라는 이름의 항목을 가지며, 이는 사용자 컨텍스트와 문자열 사이의 weak map이고, navigable user agent라는 이름의 항목을 가지며, 이는 navigable와 문자열 사이의 weak map이다.

BiDi 세션에뮬레이트된 maxTouchPoints를 가지며, 이는 구조체이고, default라는 이름의 항목을 가지며, 이는 정수 또는 null이고 처음에는 null이다; user contexts라는 이름의 항목을 가지며, 이는 사용자 컨텍스트와 정수 사이의 weak map이고, 처음에는 비어 있다; 그리고 navigables라는 이름의 항목을 가지며, 이는 navigable와 정수 사이의 weak map이고, 처음에는 비어 있다.

screen orientation 재정의는 다음을 가지는 구조체이다:

원격 끝screen orientation overrides map을 가지며, 이는 사용자 컨텍스트screen orientation 재정의 사이의 weak map이다.

7.4.2. 명령

7.4.2.1. emulation.setForcedColorsModeThemeOverride 명령

emulation.setForcedColorsModeThemeOverride 명령은 주어진 최상위 traversable 또는 사용자 컨텍스트에서 forced colors 모드 테마 특성을 수정한다.

명령 타입
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 명세에서 대응되는 enum 매핑은 ForcedColorsModeAutomationTheme를 참조한다.

원격 끝forced colors 모드 테마 재정의 구성을 가지며, 이는 WebDriver 구성으로서 연관 타입 string을 가진다.

navigable navigable에 대해 에뮬레이트된 forced colors 테마 갱신을 하려면:
  1. themenavigable에 대한 forced colors 모드 테마 재정의 구성WebDriver 구성 값 가져오기 결과로 둔다.

  2. 단언: theme는 "light", "dark" 또는 unset이다.

  3. themeunset이면, theme를 "none"으로 설정한다.

  4. navigabletheme에뮬레이트된 forced colors 테마 데이터 설정을 한다.

command parameters원격 끝 단계는 다음과 같다:

  1. themecommand parameters["theme"]로 둔다.

  2. theme가 null이면, themeunset으로 설정한다.

  3. 구현이 theme 설정을 지원하지 않으면, 오류를 반환하되 오류 코드unsupported operation으로 한다.

  4. affected navigablescommand parameters에 대해 forced colors 모드 테마 재정의 구성 themeWebDriver 구성 저장시도한 결과로 둔다.

  5. affected navigables의 각 navigable에 대해:

    1. navigable에 대해 에뮬레이트된 forced colors 테마 갱신을 한다.

  6. 데이터 null과 함께 성공을 반환한다.

7.4.2.2. emulation.setGeolocationOverride 명령

emulation.setGeolocationOverride 명령은 주어진 최상위 traversable 또는 사용자 컨텍스트에서 geolocation 특성을 수정한다.

명령 타입
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

geolocation 재정의는 다음을 가지는 구조체이다:

원격 끝geolocation 재정의 구성을 가지며, 이는 WebDriver 구성으로서 연관 타입 geolocation 재정의를 가진다.

navigable navigable에 대해 geolocation 재정의 갱신을 하려면:
  1. emulated position datanavigable에 대한 geolocation 재정의 구성WebDriver 구성 값 가져오기 결과로 둔다.

  2. emulated position dataunset이면, emulated position data를 null로 설정한다.

  3. navigableemulated position data에뮬레이트된 위치 데이터 설정을 한다.

command parameters원격 끝 단계는 다음과 같다:

  1. command parameters가 "coordinates"를 포함하고 command parameters["coordinates"]가 "altitudeAccuracy"를 포함하며 command parameters["coordinates"]가 "altitude"를 포함하지 않으면, 오류를 반환하되 오류 코드invalid argument로 한다.

  2. command parameters가 "error"를 포함하면:

    1. command parameters["error"]["type"]이 "positionUnavailable"와 같다고 단언한다.

    2. emulated position dataGeolocationPositionError 생성규칙과 일치하는 으로 두고, code 필드를 POSITION_UNAVAILABLE로 설정하고 message 필드를 빈 문자열로 설정한다.

      참고: message는 geolocation 명세에 따라 구현에서 무시된다.

  3. 그렇지 않으면, emulated position datacommand parameters["coordinates"]로 둔다.

  4. emulated position data가 null이면, emulated position dataunset으로 설정한다.

  5. affected navigablescommand parameters에 대해 geolocation 재정의 구성 emulated position dataWebDriver 구성 저장시도한 결과로 둔다.

  6. affected navigables의 각 navigable에 대해:

    1. navigable에 대해 geolocation 재정의 갱신을 한다.

  7. 데이터 null과 함께 성공을 반환한다.

7.4.2.3. emulation.setLocaleOverride 명령

emulation.setLocaleOverride 명령은 주어진 최상위 traversable 또는 사용자 컨텍스트의 locale을 수정한다.

명령 타입
emulation.SetLocaleOverride = (
  method: "emulation.setLocaleOverride",
  params: emulation.SetLocaleOverrideParameters
)

emulation.SetLocaleOverrideParameters = {
  locale: text / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
반환 타입
emulation.SetLocaleOverrideResult = EmptyResult

환경 설정 객체 environment settings가 주어졌을 때 WebDriver BiDi 에뮬레이트된 언어 단계는 다음과 같다:

  1. related navigablesenvironment settings가 주어졌을 때 관련 navigable 가져오기를 수행한 결과로 둔다.

  2. related navigables의 각 navigable에 대해:

    1. top-level traversablenavigable최상위 traversable로 둔다.

    2. user contexttop-level traversable연관된 사용자 컨텍스트로 둔다.

    3. locale overrides maptop-level traversable포함하면, locale overrides map[top-level traversable]를 반환한다.

    4. locale overrides mapuser context포함하면, locale overrides map[user context]를 반환한다.

  3. null을 반환한다

command parameters원격 끝 단계는 다음과 같다:

  1. command parameters가 "userContexts"를 포함하고 command parameters가 "contexts"를 포함하면, 오류를 반환하되 오류 코드invalid argument로 한다.

  2. command parameters가 "userContexts"를 포함하지 않고 command parameters가 "contexts"를 포함하지 않으면, 오류를 반환하되 오류 코드invalid argument로 한다.

  3. emulated localecommand parameters["locale"]로 둔다.

  4. emulated locale이 null이 아니고 IsStructurallyValidLanguageTag(emulated locale)가 false를 반환하면, 오류를 반환하되 오류 코드invalid argument로 한다.

  5. navigables집합으로 둔다.

  6. command parameterscontexts 필드가 있으면:

    1. navigablescommand parameters["contexts"]로 id로 유효한 최상위 traversable 가져오기시도한 결과로 둔다.

  7. 그렇지 않으면:

    1. command parametersuserContexts 필드가 있다고 단언한다.

    2. user contextscommand parameters["userContexts"]로 유효한 사용자 컨텍스트 가져오기시도한 결과로 둔다.

    3. user contexts의 각 user context에 대해:

      1. emulated locale이 null이면, user contextlocale overrides map에서 제거한다.

      2. 그렇지 않으면, locale overrides map[user context]을 emulated locale설정한다.

      3. 최상위 traversable 중 그 연관된 사용자 컨텍스트user context인 모든 목록의 top-level traversable에 대해:

        1. top-level traversablenavigables추가한다.

  8. navigables의 각 navigable에 대해:

    1. emulated locale이 null이면, navigablelocale overrides map에서 제거한다.

    2. 그렇지 않으면, locale overrides map[navigable]을 emulated locale설정한다.

  9. 데이터 null과 함께 성공을 반환한다.

7.4.2.4. 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. realmwebSocket관련 Realm으로 둔다.

    2. environment settings를 그 realm 실행 컨텍스트의 Realm 컴포넌트가 realm환경 설정 객체로 둔다.

    3. environment settingsWebDriver BiDi 네트워크가 오프라인인지를 수행한 결과가 true이면:

      1. webSocket에 대해 WebSocket 연결 실패 처리를 한다.

  2. WebTransport 객체 webTransport에 대해:

    1. realmwebSocket관련 Realm으로 둔다.

    2. environment settings를 그 realm 실행 컨텍스트의 Realm 컴포넌트가 realm환경 설정 객체로 둔다.

    3. environment settingsWebDriver BiDi 네트워크가 오프라인인지를 수행한 결과가 true이면:

      1. webTransport에 대해 WebTransport 정리를 한다.

command parameterssession원격 끝 단계는 다음과 같다:

  1. command parameters가 "userContexts"를 포함하고 command parameters가 "context"를 포함하면, 오류를 반환하되 오류 코드invalid argument로 한다.

  2. emulated network conditions를 null로 둔다.

  3. command parameters["networkConditions"]가 null이 아니고 command parameters["networkConditions"]["type"]이 "offline"와 같으면, emulated network conditionsoffline이 true로 설정된 새 에뮬레이트된 네트워크 조건 구조체로 설정한다.

  4. command parameterscontexts 필드가 있으면:

    1. navigablescommand parameters["contexts"]로 id로 유효한 최상위 traversable 가져오기시도한 결과로 둔다.

    2. navigables의 각 navigable에 대해:

      1. emulated network conditions가 null이면, navigablesession에뮬레이트된 네트워크 조건navigable network conditions에서 제거한다

      2. 그렇지 않으면, session에뮬레이트된 네트워크 조건navigable network conditions[navigable]을 emulated network conditions설정한다.

  5. command parametersuserContexts 필드가 있으면:

    1. user contextscommand parameters["userContexts"]로 유효한 사용자 컨텍스트 가져오기시도한 결과로 둔다.

    2. user contexts의 각 user context에 대해:

      1. emulated network conditions가 null이면, user contextsession에뮬레이트된 네트워크 조건user context network conditions에서 제거한다.

      2. 그렇지 않으면, session에뮬레이트된 네트워크 조건user context network conditions[user context]을 emulated network conditions설정한다.

  6. command parameters가 "userContexts"를 포함하지 않고 command parameters가 "context"를 포함하지 않으면, session에뮬레이트된 네트워크 조건default network conditionsemulated network conditions설정한다.

  7. 네트워크 조건 적용을 한다.

  8. 데이터 null과 함께 성공을 반환한다.

7.4.2.5. emulation.setScreenSettingsOverride 명령

emulation.setScreenSettingsOverride 명령은 주어진 최상위 traversable 또는 사용자 컨텍스트의 웹에 노출된 화면 영역웹에 노출된 사용 가능한 화면 영역을 에뮬레이트한다.

명령 타입
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

navigable navigable이 주어졌을 때의 WebDriver BiDi 에뮬레이트된 사용 가능한 화면 영역 단계는 다음과 같다:

  1. top-level traversablenavigable최상위 traversable로 둔다.

  2. user contexttop-level traversable연관된 사용자 컨텍스트로 둔다.

  3. screen settings overridestop-level traversable포함하면, screen settings overrides[top-level traversable]를 반환한다.

  4. screen settings overridesuser context포함하면, screen settings overrides[user context]를 반환한다.

  5. null을 반환한다

navigable navigable이 주어졌을 때의 WebDriver BiDi 에뮬레이트된 전체 화면 영역 단계는 다음과 같다:

  1. top-level traversablenavigable최상위 traversable로 둔다.

  2. user contexttop-level traversable연관된 사용자 컨텍스트로 둔다.

  3. screen settings overridestop-level traversable포함하면, screen settings overrides[top-level traversable]를 반환한다.

  4. screen settings overridesuser context포함하면, screen settings overrides[user context]를 반환한다.

  5. null을 반환한다

command parameters원격 끝 단계는 다음과 같다:

  1. command parameters가 "userContexts"를 포함하고 command parameters가 "contexts"를 포함하면, 오류를 반환하되 오류 코드invalid argument로 한다.

  2. command parameters가 "userContexts"를 포함하지 않고 command parameters가 "contexts"를 포함하지 않으면, 오류를 반환하되 오류 코드invalid argument로 한다.

  3. emulated screen areacommand parameters["screenArea"]로 둔다.

  4. emulated screen area가 null이 아니면:

    1. emulated screen area["x"]를 0으로 설정한다.

    2. emulated screen area["y"]를 0으로 설정한다.

  5. navigables집합으로 둔다.

  6. command parameterscontexts 필드가 있으면:

    1. navigablescommand parameters["contexts"]로 id로 유효한 최상위 traversable 가져오기시도한 결과로 둔다.

    2. targetnavigable 화면 설정으로 둔다.

    3. navigables의 각 navigable에 대해:

      1. emulated screen area가 null이면, navigabletarget에서 제거한다.

      2. 그렇지 않으면, target[navigable]을 emulated screen area설정한다.

    4. 데이터 null과 함께 성공을 반환한다.

  7. 그렇지 않으면:

    1. command parametersuserContexts 필드가 있다고 단언한다.

    2. user contextscommand parameters["userContexts"]로 유효한 사용자 컨텍스트 가져오기시도한 결과로 둔다.

    3. target사용자 컨텍스트 화면 설정으로 둔다.

    4. user contexts의 각 user context에 대해:

      1. emulated screen area가 null이면, user contexttarget에서 제거한다.

      2. 그렇지 않으면, target[user context]를 emulated screen area설정한다.

    5. 데이터 null과 함께 성공을 반환한다.

7.4.2.6. emulation.setScreenOrientationOverride 명령

emulation.setScreenOrientationOverride 명령은 주어진 최상위 traversable 또는 사용자 컨텍스트의 screen orientation을 에뮬레이트한다.

명령 타입
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

navigableemulated screen orientation이 주어졌을 때 에뮬레이트된 screen orientation 설정을 하려면:

이 알고리즘을 screen orientation 명세로 옮긴다.

  1. emulated screen orientation이 null이면:

    1. navigable현재 orientation angle을 구현 정의 기본값으로 설정한다.

    2. navigable현재 orientation type을 구현 정의 기본값으로 설정한다.

  2. 그렇지 않으면:

    1. emulated orientation typeemulated screen orientation["type"]으로 둔다.

    2. emulated orientation anglescreen orientation 값 목록에서 정의된 대로, emulated screen orientation["natural"] orientations를 가진 화면에 대해 emulated orientation type에 연관된 각도로 둔다.

    3. 현재 orientation angleemulated orientation angle로 설정한다.

    4. 현재 orientation typeemulated orientation type으로 설정한다.

  3. navigable활성 문서screen orientation 변경 단계를 실행한다.

command parameters원격 끝 단계는 다음과 같다:

  1. 구현이 어떤 이유로든 주어진 command parametersscreen orientations 매개변수를 조정할 수 없으면, 오류를 반환하되 오류 코드unsupported operation으로 한다.

  2. command parameters가 "userContexts"를 포함하고 command parameters가 "contexts"를 포함하면, 오류를 반환하되 오류 코드invalid argument로 한다.

  3. command parameters가 "userContexts"를 포함하지 않고 command parameters가 "contexts"를 포함하지 않으면, 오류를 반환하되 오류 코드invalid argument로 한다.

  4. emulated screen orientationcommand parameters["screenOrientation"]로 둔다.

  5. navigables집합으로 둔다.

  6. command parameterscontexts 필드가 있으면:

    1. navigablescommand parameters["contexts"]로 id로 유효한 최상위 traversable 가져오기시도한 결과로 둔다.

  7. 그렇지 않고, command parametersuserContexts 필드가 있으면:

    1. user contextscommand parameters["userContexts"]로 유효한 사용자 컨텍스트 가져오기시도한 결과로 둔다.

    2. user contexts의 각 user context에 대해:

      1. emulated screen orientation이 null이면, user contextscreen orientation overrides map에서 제거한다.

      2. 그렇지 않으면, screen orientation overrides map[user context]을 emulated screen orientation으로 설정한다.

      3. 최상위 traversable 중 그 연관된 사용자 컨텍스트user context인 모든 목록의 top-level traversable에 대해:

        1. top-level traversablenavigables추가한다.

  8. navigables의 각 navigable에 대해:

    1. user contextnavigable연관된 사용자 컨텍스트로 둔다.

    2. emulated screen orientation이 null이고 screen orientation overrides mapuser context포함하면, navigablescreen orientation overrides map[user context]로 에뮬레이트된 screen orientation 설정을 한다.

    3. 그렇지 않으면, navigableemulated screen orientation으로 에뮬레이트된 screen orientation 설정을 한다.

  9. 데이터 null과 함께 성공을 반환한다.

7.4.2.7. emulation.setUserAgentOverride 명령

emulation.setUserAgentOverride 명령은 주어진 최상위 traversable, 사용자 컨텍스트 또는 전역의 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 navigablesenvironment settings관련 navigable 가져오기를 수행한 결과로 둔다.

  2. related navigables의 각 navigable에 대해:

    1. top-level navigablenavigable최상위 traversable로 둔다.

    2. user contexttop-level navigable연관된 사용자 컨텍스트로 둔다.

    3. 활성 BiDi 세션 안의 각 session에 대해:

      1. session에뮬레이트된 user agentnavigable user agenttop-level navigable를 포함하면, session에뮬레이트된 user agentnavigable user agent[top-level navigable]를 반환한다.

    4. 활성 BiDi 세션 안의 각 session에 대해:

      1. session에뮬레이트된 user agent사용자 컨텍스트 user agentuser context를 포함하면, session에뮬레이트된 user agent사용자 컨텍스트 user agent[user context]를 반환한다.

  3. 활성 BiDi 세션 안의 각 session에 대해:

    1. default emulated user agentsession에뮬레이트된 user agent기본 user agent로 둔다.

    2. default emulated user agent가 null이 아니면, default emulated user agent를 반환한다.

  4. null을 반환한다.

sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:

  1. command parameters가 "userContexts"를 포함하고 command parameters가 "contexts"를 포함하면, 오류를 반환하되 오류 코드invalid argument로 한다.

  2. emulated user agentcommand parameters["userAgent"]로 둔다.

  3. command parameters가 "contexts"를 포함하면:

    1. navigablescommand parameters["contexts"]로 id로 유효한 최상위 traversable 가져오기시도한 결과로 둔다.

    2. navigables의 각 navigable에 대해:

      1. emulated user agent가 null이면, navigablesession에뮬레이트된 user agentnavigable user agent에서 제거한다.

      2. 그렇지 않으면, session에뮬레이트된 user agentnavigable user agent[navigable]을 emulated user agent설정한다.

    3. 데이터 null과 함께 성공을 반환한다.

  4. command parameters가 "userContexts"를 포함하면:

    1. user contextscommand parameters["userContexts"]로 유효한 사용자 컨텍스트 가져오기시도한 결과로 둔다.

    2. user contexts의 각 user context에 대해:

      1. emulated user agent가 null이면, user contextsession에뮬레이트된 user agent사용자 컨텍스트 user agent에서 제거한다.

      2. 그렇지 않으면, session에뮬레이트된 user agent사용자 컨텍스트 user agent[user context]을 emulated user agent설정한다.

    3. 데이터 null과 함께 성공을 반환한다.

  5. session에뮬레이트된 user agent기본 user agentemulated user agent설정한다.

  6. 데이터 null과 함께 성공을 반환한다.

7.4.2.8. emulation.setScriptingEnabled 명령

emulation.setScriptingEnabled 명령은 웹 페이지에서 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. navigablesettings관련 전역 객체연관된 Document노드 navigable로 둔다.

  2. top-level traversablenavigable최상위 traversable로 둔다.

  3. scripting enabled overrides maptop-level traversable를 포함하면, scripting enabled overrides map[top-level traversable]를 반환한다

  4. user contexttop-level traversable연관된 사용자 컨텍스트로 둔다.

  5. scripting enabled overrides mapuser context를 포함하면, scripting enabled overrides map[user context]를 반환한다.

  6. true를 반환한다.

command parameters원격 끝 단계는 다음과 같다:

  1. command parameters가 "userContexts"를 포함하고 command parameters가 "contexts"를 포함하면, 오류를 반환하되 오류 코드invalid argument로 한다.

  2. command parameters가 "userContexts"를 포함하지 않고 command parameters가 "contexts"를 포함하지 않으면, 오류를 반환하되 오류 코드invalid argument로 한다.

  3. emulated scripting enabled statuscommand parameters["enabled"]로 둔다.

  4. command parameterscontexts 필드가 있으면:

    1. navigablescommand parameters["contexts"]로 id로 유효한 최상위 traversable 가져오기시도한 결과로 둔다.

    2. navigables의 각 navigable에 대해:

      1. emulated scripting enabled status가 null이면, navigablescripting enabled overrides map에서 제거한다.

      2. 그렇지 않으면, scripting enabled overrides map[navigable]을 emulated scripting enabled status설정한다.

  5. command parametersuserContexts 필드가 있으면:

    1. user contextscommand parameters["userContexts"]로 유효한 사용자 컨텍스트 가져오기시도한 결과로 둔다.

    2. user contexts의 각 user context에 대해:

      1. emulated scripting enabled status가 null이면, user contextscripting enabled overrides map에서 제거한다.

      2. 그렇지 않으면 scripting enabled overrides map[user context]을 emulated scripting enabled status설정한다.

  6. 데이터 null과 함께 성공을 반환한다.

7.4.2.9. emulation.setScrollbarTypeOverride 명령

emulation.setScrollbarTypeOverride 명령은 주어진 최상위 traversable, 사용자 컨텍스트 또는 전역의 scrollbar type을 수정한다.

명령 타입
emulation.SetScrollbarTypeOverride = (
  method: "emulation.setScrollbarTypeOverride",
  params: emulation.SetScrollbarTypeOverrideParameters
)

emulation.SetScrollbarTypeOverrideParameters = {
  scrollbarType: "classic" / "overlay" / null,
  ? contexts: [+browsingContext.BrowsingContext],
  ? userContexts: [+browser.UserContext],
}
반환 타입
emulation.SetScrollbarTypeOverrideResult = EmptyResult

원격 끝scrollbar type 재정의 구성을 가지며, 이는 WebDriver 구성으로서 연관 타입 string을 가진다.

navigable navigable에 대해 scrollbar type 재정의 갱신을 하려면:
  1. scrollbar type overridenavigable에 대한 scrollbar type 재정의 구성WebDriver 구성 값 가져오기 결과로 둔다.

  2. 단언: scrollbar type override는 "classic", "overlay" 또는 unset이다.

  3. scrollbar type override가 "classic"이면, navigable활성 문서classic scrollbars를 사용하도록 구현 정의 단계를 실행하고 반환한다.

  4. scrollbar type override가 "overlay"이면, navigable활성 문서overlay scrollbars를 사용하도록 구현 정의 단계를 실행하고 반환한다.

  5. 단언: scrollbar type overrideunset이다.

  6. navigable활성 문서구현 정의 기본 scrollbar type을 사용하도록 구현 정의 단계를 실행한다.

command parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:

  1. scrollbar type overridecommand parameters["scrollbarType"]로 둔다.

  2. scrollbar type override가 null이면, scrollbar type overrideunset으로 설정한다.

  3. 구현이 scrollbar type override 설정을 지원하지 않으면, 오류를 반환하되 오류 코드unsupported operation으로 한다.

  4. affected navigablescommand parameters에 대해 scrollbar type 재정의 구성 scrollbar type overrideWebDriver 구성 저장시도한 결과로 둔다.

  5. affected navigables의 각 navigable에 대해:

    1. navigable에 대해 scrollbar type 재정의 갱신을 한다.

  6. 데이터 null과 함께 성공을 반환한다.

7.4.2.10. emulation.setTimezoneOverride 명령

emulation.setTimezoneOverride 명령은 주어진 최상위 traversable 또는 사용자 컨텍스트의 timezone을 수정한다.

명령 타입
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 navigablesenvironment settings가 주어졌을 때 관련 navigable 가져오기를 수행한 결과로 둔다.

  5. related navigables의 각 navigable에 대해:

    1. top-level traversablenavigable최상위 traversable로 둔다.

    2. user contexttop-level traversable연관된 사용자 컨텍스트로 둔다.

    3. timezone overrides maptop-level traversable포함하면, emulated timezonetimezone overrides map[top-level traversable]로 설정한다.

    4. 그렇지 않고, timezone overrides mapuser context포함하면, emulated timezonetimezone overrides map[user context]로 설정한다.

  6. emulated timezone이 null이 아니면, emulated timezone을 반환한다.

  7. SystemTimeZoneIdentifier 명세의 요구사항에 따른 구현 정의 단계의 결과를 반환한다.

command parameters원격 끝 단계는 다음과 같다:

  1. command parameters가 "userContexts"를 포함하고 command parameters가 "contexts"를 포함하면, 오류를 반환하되 오류 코드invalid argument로 한다.

  2. command parameters가 "userContexts"를 포함하지 않고 command parameters가 "contexts"를 포함하지 않으면, 오류를 반환하되 오류 코드invalid argument로 한다.

  3. emulated timezonecommand parameters["timezone"]로 둔다.

  4. emulated timezone이 null이 아니고 IsTimeZoneOffsetString(emulated timezone)가 false를 반환하고 AvailableNamedTimeZoneIdentifiersemulated timezone포함하지 않으면, 오류를 반환하되 오류 코드invalid argument로 한다.

  5. navigables집합으로 둔다.

  6. command parameterscontexts 필드가 있으면:

    1. navigablescommand parameters["contexts"]로 id로 유효한 최상위 traversable 가져오기시도한 결과로 둔다.

  7. 그렇지 않으면:

    1. command parametersuserContexts 필드가 있다고 단언한다.

    2. user contextscommand parameters["userContexts"]로 유효한 사용자 컨텍스트 가져오기시도한 결과로 둔다.

    3. user contexts의 각 user context에 대해:

      1. emulated timezone이 null이면, user contexttimezone overrides map에서 제거한다.

      2. 그렇지 않으면, timezone overrides map[user context]을 emulated timezone설정한다.

      3. 최상위 traversable 중 그 연관된 사용자 컨텍스트user context인 모든 목록의 top-level traversable에 대해:

        1. top-level traversablenavigables추가한다.

  8. navigables의 각 navigable에 대해:

    1. emulated timezone이 null이면, navigabletimezone overrides map에서 제거한다.

    2. 그렇지 않으면, timezone overrides map[navigable]을 emulated timezone설정한다.

  9. 데이터 null과 함께 성공을 반환한다.

7.4.2.11. emulation.setTouchOverride 명령

emulation.setTouchOverride 명령은 웹 페이지에서 touch 입력 활성화를 에뮬레이트한다.

명령 타입
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
환경 설정 객체 environment settings가 주어졌을 때 WebDriver BiDi 에뮬레이트된 max touch points 단계는 다음과 같다:
  1. related navigablesenvironment settings관련 navigable 가져오기를 수행한 결과로 둔다.

  2. related navigables의 각 navigable에 대해:

    1. top-level navigablenavigable최상위 traversable로 둔다.

    2. user contexttop-level navigable연관된 사용자 컨텍스트로 둔다.

    3. 활성 BiDi 세션 안의 각 session에 대해:

      1. session에뮬레이트된 maxTouchPointsnavigablestop-level navigable를 포함하면, session에뮬레이트된 maxTouchPointsnavigables[top-level navigable]를 반환한다.

    4. 활성 BiDi 세션 안의 각 session에 대해:

      1. session에뮬레이트된 maxTouchPointsuser contextsuser context를 포함하면, session에뮬레이트된 maxTouchPointsuser contexts[user context]를 반환한다.

  3. 활성 BiDi 세션 안의 각 session에 대해:

    1. emulated maxTouchPointssession에뮬레이트된 maxTouchPointsdefault로 둔다.

    2. emulated maxTouchPoints가 null이 아니면, emulated maxTouchPoints를 반환한다.

  4. null을 반환한다.

sessioncommand parameters원격 끝 단계는 다음과 같다:

참고: 레거시 레거시 touch event API 노출이 있으며, 이는 일부 기존 웹 콘텐츠에서 user agent가 touch가 활성화된 "mobile" 장치라는 신호로 여전히 사용될 수 있다. API가 레거시이더라도, user agent는 레거시 touch event API 노출에서 에뮬레이트된 maxTouchPoints 상태를 존중하기 위해 구현 정의 단계를 실행할 수 있다.

  1. command parameters가 "userContexts"를 포함하고 command parameters가 "contexts"를 포함하면, 오류를 반환하되 오류 코드invalid argument로 한다.

  2. maxTouchPointscommand parameters["maxTouchPoints"]로 둔다.

  3. command parameterscontexts 필드가 있으면:

    1. navigablescommand parameters["contexts"]로 id로 유효한 최상위 traversable 가져오기시도한 결과로 둔다.

    2. navigables의 각 navigable에 대해:

      1. maxTouchPoints가 null이면, navigablesession에뮬레이트된 maxTouchPointsnavigables에서 제거한다.

      2. 그렇지 않으면, session에뮬레이트된 maxTouchPointsnavigables[navigable]을 maxTouchPoints설정한다.

    3. 데이터 null과 함께 성공을 반환한다.

  4. command parametersuserContexts 필드가 있으면:

    1. user contextscommand parameters["userContexts"]로 유효한 사용자 컨텍스트 가져오기시도한 결과로 둔다.

    2. user contexts의 각 user context에 대해:

      1. maxTouchPoints가 null이면, user contextsession에뮬레이트된 maxTouchPointsuser contexts에서 제거한다.

      2. 그렇지 않으면 session에뮬레이트된 maxTouchPointsuser contexts[user context]를 maxTouchPoints설정한다.

    3. 데이터 null과 함께 성공을 반환한다.

  5. session에뮬레이트된 maxTouchPointsdefaultmaxTouchPoints로 설정한다.

  6. 데이터 null과 함께 성공을 반환한다.

7.5. network 모듈

network 모듈은 네트워크 요청과 관련된 명령 및 이벤트를 포함한다.

7.5.1. 정의

원격 끝 정의

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
)

로컬 끝 정의

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
)

원격 끝before request sent map을 가지며, 이는 처음에는 빈 맵이다. 이는 이미 network.beforeRequestSent 이벤트가 전송된 네트워크 이벤트를 추적하는 데 사용된다.

원격 끝기본 캐시 동작을 가지며, 이는 문자열이다. 이는 처음에는 "default"이다.

원격 끝navigable 캐시 동작 맵을 가지며, 이는 캐시 동작을 나타내는 문자열과 최상위 traversable 사이의 weak map이다. 이는 처음에는 비어 있다.

BiDi 세션extra headers를 가지며, 이는 구조체로서 기본 헤더라는 이름의 항목을 가지며, 이는 헤더 목록이고(처음에는 빈 헤더 목록으로 설정됨), 사용자 컨텍스트 헤더라는 이름의 항목을 가지며, 이는 사용자 컨텍스트헤더 목록 사이의 weak map이고, navigable 헤더라는 이름의 항목을 가지며, 이는 navigable헤더 목록 사이의 weak map이다.

7.5.2. 네트워크 데이터 수집

네트워크 데이터는 다음을 가지는 구조체이다:

collector는 다음을 가지는 구조체이다:

참고: max encoded item size는 항목(응답 또는 요청)별 제한을 정의하며, 특정 collector가 수집하는 크기를 제한하지 않는다. 수집된 모든 리소스의 총 크기는 max total collected size에 의해 제한된다.

BiDi 세션network collectors를 가지며, 이는 network.Collectorcollector 사이의 이다. 이는 처음에는 비어 있다.

원격 끝수집된 네트워크 데이터를 가지며, 이는 네트워크 데이터의 목록이다. 이는 처음에는 비어 있다.

원격 끝max total collected size를 가지며, 이는 수집된 네트워크 데이터 안의 네트워크 데이터를 수집하기 위해 할당된 크기를 나타내는 js-uint이다. 그 값은 구현 정의이다.

참고: 이는 구현이 리소스 사용량 제한을 설정할 수 있게 한다. 제한은 사용자가 웹 페이지에서 사용되는 이미지와 글꼴처럼, 브라우저가 완전히 디코딩하고 처리하는 데이터를 수집할 수 있다고 의존할 수 있을 만큼 충분히 클 것으로 기대된다.

request가 주어졌을 때 request에 대한 navigable 가져오기를 하려면:
  1. navigable을 null로 둔다.

  2. requestclient환경 설정 객체이면:

    1. environment settingsrequestclient로 둔다

    2. 활성 windowenvironment settings전역 객체navigable이 있으면, navigable을 그 navigable로 설정한다.

  3. navigable을 반환한다.

collectornavigable이 주어졌을 때 navigable에 대해 collector 일치를 하려면:
  1. collectorcontexts비어 있지 않으면:

    1. collectorcontextsnavigablenavigable id포함하면 true를 반환한다.

    2. 그렇지 않으면, false를 반환한다.

  2. collectoruser contexts비어 있지 않으면:

    1. user contextnavigable연관된 사용자 컨텍스트로 둔다.

    2. collectoruser contextsuser context사용자 컨텍스트 id포함하면 true를 반환한다.

    3. 그렇지 않으면, false를 반환한다.

  3. true를 반환한다.

request request가 주어졌을 때 WebDriver BiDi 네트워크 request body 복제 단계는 다음과 같다:
  1. requestbody가 null이면, 반환한다.

  2. 활성 BiDi 세션 안의 각 session에 대해:

    1. sessionnetwork collectors비어 있지 않으면:

      1. collected data네트워크 데이터로 두고, bytes는 null로 설정하고, 복제된 bodyrequestbodyclone으로 설정하고, collectors는 빈 목록으로 설정하고, pending은 true로 설정하고, requestrequestrequest id로 설정하고, size는 null로 설정하고, type은 "request"로 설정한다.

      2. collected data수집된 네트워크 데이터추가한다.

      3. 반환한다.

requestresponse body가 주어졌을 때 WebDriver BiDi 네트워크 response body 복제 단계는 다음과 같다:
  1. response body가 null이면, 반환한다.

  2. 활성 BiDi 세션 안의 각 session에 대해:

    1. sessionnetwork collectors비어 있지 않으면:

      1. collected data네트워크 데이터로 두고, bytes는 null로 설정하고, 복제된 bodyresponse bodyclone으로 설정하고, collectors는 빈 목록으로 설정하고, pending은 true로 설정하고, requestrequestrequest id로 설정하고, size는 null로 설정하고, type은 "response"로 설정한다.

      2. collected data수집된 네트워크 데이터추가한다.

      3. 반환한다.

request iddata type이 주어졌을 때 수집된 데이터 가져오기를 하려면.
  1. 수집된 네트워크 데이터의 각 collected data에 대해:

    1. collected datarequestrequest id이고 collected datatypedata type이면, collected data를 반환한다.

  2. null을 반환한다.

request가 주어졌을 때 네트워크 response body 수집 중단 여부 처리를 하려면:
  1. collected datarequestrequest id 및 "response"로 수집된 데이터 가져오기를 수행한 결과로 둔다.

  2. collected data가 null이면, 반환한다.

  3. collected datapending을 false로 설정한다.

  4. "network data collected" 및 (requestrequest id, "response")로 재개한다.

request가 주어졌을 때 네트워크 request body 수집 여부 처리를 하려면:
  1. collected datarequestrequest id 및 "request"로 수집된 데이터 가져오기를 수행한 결과로 둔다.

  2. collected data가 null이면, 반환한다.

    참고: 이는 요청이 생성될 때 collector가 설정되어 있지 않고 WebDriver BiDi 네트워크 request body 복제가 대응하는 body를 복제하지 않은 경우 발생할 수 있다. 또는 처음부터 body가 null인 경우에도 발생할 수 있다.

  3. request, collected data, null 및 "request"로 네트워크 데이터 수집 여부 처리를 한다.

requestresponse가 주어졌을 때 네트워크 response body 수집 여부 처리를 하려면:
  1. responsestatusredirect status이면, 반환한다.

    참고: 리디렉션의 경우 최종 응답 body만 저장된다.

  2. collected datarequestrequest id 및 "response"로 수집된 데이터 가져오기를 수행한 결과로 둔다.

  3. collected data가 null이면, 반환한다.

    참고: 이는 응답이 생성될 때 collector가 설정되어 있지 않고 WebDriver BiDi 네트워크 response body 복제가 대응하는 body를 복제하지 않은 경우 발생할 수 있다. 또는 처음부터 body가 null인 경우에도 발생할 수 있다.

  4. sizeresponseresponse body infoencoded size로 둔다.

    참고: fetch 스트림에서 검색된 bytes가 디코딩된 데이터에 해당한다는 사실과, 크기 제한을 계산하기 위해 인코딩된(네트워크) 크기가 사용된다는 사실 사이에는 불일치가 있다. 구현은 getData에서 클라이언트에 반환되는 데이터가 디코딩된 데이터와 동일하기만 하다면, 디코딩된 데이터를 저장하는 것보다 더 적은 크기를 사용하는 저장 모델을 사용할 수 있다. 저장소와 성능 사이의 잠재적 절충은 구현에 달려 있다.

  5. request, collected data, size 및 "response"로 네트워크 데이터 수집 여부 처리를 한다.

request request, 네트워크 데이터 collected data, js-uint sizenetwork.DataType data type이 주어졌을 때 네트워크 데이터 수집 여부 처리를 하려면:
  1. collected datapending을 false로 설정한다.

  2. navigablerequestrequest에 대한 navigable 가져오기를 수행한 결과로 둔다.

  3. navigable이 null이면:

    1. collected data수집된 네트워크 데이터에서 제거한다.

    2. "network data collected" 및 (requestrequest id, data type)로 재개한다.

    3. 반환한다.

    이는 navigable과 관련되지 않은 데이터 수집을 방지한다. collector 구성을 확인하려면 여전히 navigable을 검색해야 하지만, 여기서 null도 허용할 수 있다.

  4. top-level navigablenavigable최상위 traversable로 둔다.

  5. collectors를 빈 목록으로 둔다.

  6. 활성 BiDi 세션 안의 각 session에 대해:

    1. sessionnetwork collectors 안의 각 collector에 대해:

      1. collectordata typesdata type포함하고, collectortop-level navigablenavigable에 대해 collector 일치를 수행한 결과가 true이면:

        1. collectorcollectors추가한다.

  7. collectors비어 있으면:

    1. collected data수집된 네트워크 데이터에서 제거한다.

    2. "network data collected" 및 (requestrequest id, data type)로 재개한다.

    3. 반환한다.

  8. bytes를 null로 둔다.

  9. nullOrBytes가 주어졌을 때의 processBody를 이 단계로 둔다:

    1. nullOrBytes가 null이 아니면:

      1. bytesnullOrBytes프로토콜 bytes 직렬화를 수행한 결과로 설정한다.

      2. size가 null이면, sizebytes길이로 설정한다.

  10. processBodyError를 이 단계로 둔다: 아무것도 하지 않는다.

  11. processBodyprocessBodyError가 주어졌을 때 collected data복제된 body완전히 읽는다.

  12. bytes가 null이 아니면:

    1. collectors 안의 각 collector에 대해:

      1. sizecollectormax encoded item size보다 작거나 같으면, collectorcollectorcollected datacollectors추가한다.

    2. collected datacollectors비어 있지 않으면:

      1. size가 주어졌을 때 데이터 기록을 위한 크기 할당을 한다.

      2. collected databytesbytes로 설정한다.

      3. collected datasizesize로 설정한다.

    3. 그렇지 않으면, collected data수집된 네트워크 데이터에서 제거한다.

  13. "network data collected" 및 (requestrequest id, data type)로 재개한다.

size가 주어졌을 때 데이터 기록을 위한 크기 할당을 하려면:
  1. available sizemax total collected size로 둔다.

  2. already collected data를 빈 목록으로 둔다.

  3. 수집된 네트워크 데이터 안의 각 collected data에 대해:

    1. collected databytes가 null이 아니면:

      1. available sizecollected datasize만큼 감소시킨다.

      2. collected dataalready collected data추가한다

  4. sizeavailable size보다 크면:

    1. already collected data 안의 각 collected data에 대해:

      1. available sizecollected datasize만큼 증가시킨다.

      2. collected databytes 필드를 null로 설정한다.

      3. collected datasize 필드를 null로 설정한다.

      4. available sizesize보다 크거나 같으면, 반환한다.

collected datacollector id가 주어졌을 때 데이터에서 collector 제거를 하려면:
  1. collected datacollectorscollector id포함하면:

    1. collector idcollected datacollectors에서 제거한다.

    2. collected datacollectors비어 있으면:

      1. collected data수집된 네트워크 데이터에서 제거한다.

7.5.3. 네트워크 인터셉트

network intercept는 원격 끝이 네트워크 요청과 응답을 인터셉트하고 수정할 수 있게 하는 메커니즘이다.

BiDi 세션intercept map을 가지며, 이는 활성 network intercept의 속성을 정의하는 필드 url patterns, phases, contexts를 가진 구조체와 intercept id 사이의 이다. 이는 처음에는 비어 있다.

BiDi 세션blocked request map을 가지며, 이는 활발하게 차단되고 있는 요청을 추적하는 데 사용된다. 이는 request id와, 필드 request, phase, response를 가진 구조체 사이의 이다. 이는 처음에는 비어 있다.

session, event, request, 및 navigable id가 주어졌을 때 network intercept 가져오기를 하려면:

  1. session interceptssessionintercept map으로 둔다.

  2. intercepts를 빈 목록으로 둔다.

  3. 첫 번째로 일치하는 조건 아래의 단계를 실행한다:

    event가 "network.beforeRequestSent"인 경우
    phase를 "beforeRequestSent"로 설정한다.
    event가 "network.responseStarted"인 경우
    phase를 "responseStarted"로 설정한다.
    event가 "network.authRequired"인 경우
    phase를 "authRequired"로 설정한다.
    event가 "network.responseCompleted"인 경우
    intercepts를 반환한다.
  4. urlrequestURLURL 직렬화기를 실행한 결과로 둔다.

  5. session intercepts의 각 intercept idintercept에 대해:

    1. interceptcontexts가 null이 아니면:

      1. interceptcontextsnavigable id포함하지 않으면:

        1. 계속한다.

    2. interceptphasesphase포함하면:

      1. url patternsintercepturl patterns로 둔다.

      2. url patterns비어 있으면:

        1. intercept idintercepts추가한다.

        2. 계속한다.

      3. url patterns 안의 각 url pattern에 대해:

        1. url patternurlURL pattern 일치를 수행한 결과가 true이면:

          1. intercept idintercepts추가한다.

          2. 중단한다.

  6. intercepts를 반환한다.

session, commandcommand parameters가 주어졌을 때 응답 갱신을 하려면:
  1. blocked requestssessionblocked request map으로 둔다.

  2. request idcommand parameters["request"]로 둔다.

  3. blocked requestsrequest id포함하지 않으면 오류 코드 no such request오류를 반환한다.

  4. (request, phase, response)를 blocked requests[request id]로 둔다.

  5. phase가 "beforeRequestSent"이고 command가 "continueResponse"이면, 오류 코드 "invalid argument"인 오류를 반환한다.

    TODO: 다른 오류를 고려한다

  6. response가 null이면:

    1. 단언: phase는 "beforeRequestSent"이다.

    2. response를 새 response로 설정한다.

  7. command parameters가 "statusCode"를 포함하면:

    1. responsesstatuscommand parameters["statusCode"]로 설정한다.

  8. command parameters가 "reasonPhrase"를 포함하면:

    1. responsesstatus messagecommand parameters["reasonPhrase"]로 UTF-8 encode를 수행한 결과로 설정한다.

  9. command parameters가 "headers"를 포함하면:

    1. headerscommand parameters["headers"]로 headers list 생성시도한 결과로 둔다.

    2. responseheader listheaders로 설정한다.

  10. command parameters가 "cookies"를 포함하면:

    1. command parameters가 "headers"를 포함하면, headersresponseheader list로 둔다.

      그렇지 않으면:

      1. headers를 빈 header list로 둔다.

      2. responseheaders list 안의 각 header에 대해:

        1. nameheader의 name으로 둔다.

        2. namebyte-lowercase한 결과가 `set-cookie`가 아니면:

          1. headerheaders에 추가한다

    2. command parameters["cookies"] 안의 각 cookie에 대해:

      1. header valuecookieset-cookie header 직렬화를 수행한 결과로 둔다.

      2. (`Set-Cookie`, header value)를 headers에 추가한다.

      3. responseheader listheaders로 설정한다.

  11. command parameters가 "credentials"를 포함하면:

    이는 auth를 취소할 방법을 가지지 않는다.

    1. credentialscommand parameters["credentials"]로 둔다.

    2. 단언: credentials["type"]은 "password"이다.

    3. response의 authentication credentials를 (credentials["username"], credentials["password"])로 설정한다

  12. response를 반환한다

7.5.4. 타입

7.5.4.1. network.AuthChallenge 타입
network.AuthChallenge = {
  scheme: text,
  realm: text,
}

response가 주어졌을 때 challenges 추출을 하려면:

realm 이외의 매개변수를 포함해야 하는가?

  1. responsestatus가 401이면 header name을 `WWW-Authenticate`로 둔다. 그렇지 않고 responsestatus가 407이면 header name을 `Proxy-Authenticate`로 둔다. 그렇지 않으면 null을 반환한다.

  2. challenges를 새 목록으로 둔다.

  3. responseheader list 안의 각 (name, value)에 대해:

    Fetch에서처럼, 이것이 여러 header, 파싱 문제 등을 처리하는 올바른 방식인지 명확하지 않다.

    1. nameheader name에 대해 byte-case-insensitive 일치이면:

      1. header challengesvalue를 파싱하여, 각각 scheme과 매개변수 목록으로 이루어진 challenges의 목록으로 만든 결과로 둔다. 각 매개변수는 [RFC9110]의 규칙에 따라 튜플 (name, value)이다.

      2. header challenges 안의 각 header challenge에 대해:

        1. schemeheader challenge의 scheme으로 둔다.

        2. realm을 빈 문자열로 둔다.

        3. header challenge의 parameters 안의 각 (param name, param value)에 대해:

          1. param name이 `realm`과 같으면 realmparam valueUTF-8 decode한 결과로 둔다.

        4. challengenetwork.AuthChallenge production과 일치하는 새 으로 두고, scheme 필드는 scheme으로 설정하고 realm 필드는 realm으로 설정한다.

      3. challengechallenges추가한다.

  4. challenges를 반환한다.

7.5.4.2. network.AuthCredentials 타입
network.AuthCredentials = {
  type: "password",
  username: text,
  password: text,
}

network.AuthCredentials 타입은 authorization credentials 요청에 대한 응답을 나타낸다.

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 타입은 모든 네트워크 이벤트에 공통인 데이터를 나타내는 추상 타입이다.

context에 더해 요청을 시작한 document 노드의 `sharedId`를 포함하는 것을 고려한다.

session, event, 및 request가 주어졌을 때 네트워크 이벤트 처리를 하려면:
  1. request datarequestrequest data 가져오기를 수행한 결과로 둔다.

  2. navigationrequestnavigation id로 둔다.

  3. navigable id를 null로 둔다.

  4. top-level navigable id를 null로 둔다.

  5. user context id를 null로 둔다.

  6. requestclient환경 설정 객체이면:

    1. environment settingsrequestclient로 둔다.

    2. 활성 windowenvironment settings전역 객체navigable이 있으면, navigable id를 그 navigable의 navigable id로 설정하고, top-level navigable id를 그 navigable의 최상위 traversablenavigable id로 설정하고, user context id를 그 navigable의 연관된 사용자 컨텍스트사용자 컨텍스트 id로 설정한다.

  7. interceptssession, event, request, 및 top-level navigable idnetwork intercept 가져오기를 수행한 결과로 둔다.

  8. redirect countrequestredirect count로 둔다.

  9. timestamp를 UTC에서 현재 날짜와 시간을 나타내는 time value로 둔다.

  10. intercepts비어 있지 않으면 is blocked를 true로 두고, 그렇지 않으면 is blocked를 false로 둔다.

  11. paramsnetwork.BaseParameters production과 일치하는 으로 두고, request 필드는 request data로 설정하고, navigation 필드는 navigation으로 설정하고, context 필드는 navigable id로 설정하고, userContext 필드는 user context id로 설정하고, timestamp 필드는 timestamp로 설정하고, redirectCount 필드는 redirect count로 설정하고, isBlocked 필드는 is blocked로 설정하고, intercepts 필드는 is blocked가 true이면 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 타입은 네트워크를 통해 전송되는 바이너리 데이터를 나타낸다. 유효한 UTF-8은 network.StringValue 타입으로 표현되고, 그 외의 데이터는 Base64로 인코딩된 형식인 network.Base64Value로 표현된다.

protocol bytes가 주어졌을 때 프로토콜 bytes 역직렬화를 하려면:

참고: 이는 network.BytesValue로 인코딩된 bytes를 받아 byte sequence를 반환한다.

  1. protocol bytesnetwork.StringValue production과 일치하면, bytesprotocol bytes["value"]를 UTF-8 encode한 결과로 둔다.

  2. 그렇지 않고 protocol bytesnetwork.Base64Value production과 일치하면, bytesprotocol bytes["value"]를 forgiving-base64 decode한 결과로 둔다.

  3. bytes를 반환한다.

bytes가 주어졌을 때 프로토콜 bytes 직렬화를 하려면:

참고: 이는 byte sequence를 받아 network.BytesValue를 반환한다.

  1. textbytesBOM 없이 UTF-8 decode하거나 실패한 결과로 둔다.

  2. text가 failure이면, network.Base64Value production과 일치하는 을 반환하되, valuebytesforgiving-base64 encode한 결과로 설정한다.

  3. network.StringValue production과 일치하는 을 반환하되, valuetext로 설정한다.

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 타입은 쿠키를 나타낸다.

stored cookie가 주어졌을 때 쿠키 직렬화를 하려면:
  1. namestored cookie의 name field로 UTF-8 decode를 수행한 결과로 둔다.

  2. valuestored cookie의 value로 프로토콜 bytes 직렬화를 수행한 결과로 둔다.

  3. domainstored cookie의 domain field로 둔다.

  4. pathstored cookie의 path field로 둔다.

  5. expirystored cookie의 expiry-time field를 unix timestamp로 나타낸 값으로 두되, 설정되어 있지 않으면 null로 둔다.

  6. sizestored cookieCookie header에서 표현되는 방식대로 직렬화한 결과의 byte length로 둔다.

  7. stored cookie의 http-only-flag가 true이면 http only를 true로 두고, 그렇지 않으면 false로 둔다.

  8. stored cookie의 secure-only-flag가 true이면 secure를 true로 두고, 그렇지 않으면 false로 둔다.

  9. stored cookie의 same-site-flag가 "None"이면 same site를 "none"으로 두고, "Lax"이면 "lax"로, "Strict"이면 "strict"로, 또는 "Default"이면 "default"로 둔다

  10. network.Cookie production과 일치하는 맵을 반환하되, 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 request header 안에 있는 쿠키 데이터의 하위 집합을 나타낸다.

protocol cookie가 주어졌을 때 cookie header 직렬화를 하려면:
  1. nameprotocol cookie["name"]를 UTF-8 encode한 결과로 둔다.

  2. valueprotocol cookie["value"]로 프로토콜 bytes 역직렬화를 수행한 결과로 둔다.

  3. header valuename, `=`, 및 value를 연결하여 형성된 byte sequence로 둔다

  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 타입은 requestclienttime origin에 상대적인, 요청의 각 부분의 시간을 나타낸다.

request가 주어졌을 때 fetch timings 가져오기를 하려면:
  1. globalrequestclient로 둔다.

  2. global이 null이면, 모든 필드가 0으로 설정된 network.FetchTimingInfo production과 일치하는 맵을 반환한다.

  3. time originglobaltime origin timestamp 가져오기를 수행한 결과로 둔다.

  4. timingsrequestfetch timing info로 둔다.

  5. connection timingtimingsfinal connection timing info가 null이 아니면 그 값으로 두고, 그렇지 않으면 새 connection timing info로 둔다.

  6. request timetimingsstart timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  7. redirect starttimingsredirect start timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  8. redirect endtimingsredirect end timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  9. fetch starttimingspost-redirect start timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  10. DNS startconnection timingdomain lookup start timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  11. DNS endconnection timingdomain lookup end timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  12. TLS startconnection timingsecure connection start timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  13. connect startconnection timingconnection start timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  14. connect endconnection timingconnection end timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  15. request starttimingsfinal network-request start timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  16. response starttimingsfinal network-response start timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  17. response endtimingsend timeglobal이 주어졌을 때 fetch timestamp 변환을 수행한 결과로 둔다.

  18. network.FetchTimingInfo production과 일치하는 을 반환하되, 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로 설정한다.

TODO: service worker 필드를 추가한다

7.5.4.11. network.Header 타입

원격 끝 정의로컬 끝 정의

network.Header = {
  name: text,
  value: network.BytesValue,
}

network.Header 타입은 단일 request header를 나타낸다.

name bytesvalue bytes가 주어졌을 때 header 직렬화를 하려면:
  1. namename bytesUTF-8 decode를 수행한 결과로 둔다.

    단언: header 이름은 ASCII 전용으로 제한되므로 이는 실패할 수 없다.

  2. valuevalue bytes프로토콜 bytes 직렬화를 수행한 결과로 둔다.

  3. network.Header production과 일치하는 맵을 반환하되, name 필드는 name으로 설정하고, value 필드는 value로 설정한다.

protocol header가 주어졌을 때 header 역직렬화를 하려면:
  1. nameprotocol header["name"]를 UTF-8 encode한 결과로 둔다.

  2. valueprotocol header["value"]로 프로토콜 bytes 역직렬화를 수행한 결과로 둔다.

  3. header (name, value)를 반환한다.

protocol headers가 주어졌을 때 headers list 생성을 하려면:
  1. headers를 빈 header list로 둔다.

  2. protocol headers 안의 각 header에 대해:

    1. deserialized headerheaderheader 역직렬화를 수행한 결과로 둔다.

    2. deserialized header의 name이 field-name token production과 일치하지 않으면, "invalid argument"인 오류 코드를 가진 오류를 반환한다.

    3. deserialized header의 value가 header value production과 일치하지 않으면, "invalid argument"인 오류 코드를 가진 오류를 반환한다.

    4. deserialized headerheaders에 추가한다.

  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.RequestDatainitiatorTypedestination으로 대체될 것으로 예상된다.

참고: request 필드는 하위 호환성을 위해 정의에 포함되어 있지만, 더 이상 initiator 가져오기 단계에서 설정되지 않으며, 이 명세의 향후 개정에서 제거될 것이다. network.Initiator는 동일한 request id도 포함하는 network.BeforeRequestSentParameters에 포함되어 있으므로, 이 정보는 중복된다. § 7.5.4.3 network.BaseParameters 타입을 보라.

request가 주어졌을 때 initiator 가져오기를 하려면:
  1. requestinitiator type이 "fetch" 또는 "xmlhttprequest"이면:

    1. stack tracecurrent stack trace로 둔다.

    2. stack trace의 크기가 1 이상이면 line numberstack trace[0] 안의 lineNumber 필드 값으로 두고, column numberstack trace[0] 안의 columnNumber 필드 값으로 둔다. 그렇지 않으면 line numbercolumn number를 0으로 둔다.

    그렇지 않으면, stack trace, column number, 및 line number를 모두 null로 둔다.

    TODO: Chrome은 parser-inserted 리소스에 대해 현재 parser 위치를 column number / line number로 포함한다.

  2. network.Initiator production과 일치하는 을 반환하되, columnNumber 필드는 column number가 null이 아니면 그 값으로 설정하거나 그렇지 않으면 생략하고, lineNumber 필드는 line number가 null이 아니면 그 값으로 설정하거나 그렇지 않으면 생략하고, stackTrace 필드는 stack trace가 null이 아니면 그 값으로 설정하거나 그렇지 않으면 생략한다.

7.5.4.13. network.Intercept 타입

원격 끝 정의로컬 끝 정의

network.Intercept = text

network.Intercept 타입은 network intercept의 id를 나타낸다.

7.5.4.14. network.Request 타입

원격 끝 정의로컬 끝 정의

network.Request = text;

각 네트워크 요청은 연관된 request 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가 주어졌을 때 request data 가져오기를 하려면:

  1. request id를 request의 request id로 둔다.

  2. urlrequestURLURL 직렬화기를 실행한 결과로 둔다.

  3. methodrequestmethod로 둔다.

  4. body size를 null로 둔다.

  5. body를 request의 body로 둔다.

  6. bodybyte sequence이면, body size를 그 sequence의 length로 설정한다. 그렇지 않고 bodybody이면 body size를 그 body의 length로 설정한다.

  7. headers sizerequestheaders list[HTTP11]에서 요구하는 대로 직렬화되었을 때의 byte 크기로 둔다.

    참고: header 압축을 허용하는 프로토콜의 경우, 이는 네트워크를 통해 전송된 headers의 압축된 크기이다.

  8. headers를 빈 목록으로 둔다.

  9. cookies를 빈 목록으로 둔다.

  10. requestheaders list 안의 각 (name, value)에 대해:

    1. namevalueheader 직렬화를 수행한 결과를 headers에 추가한다.

    2. name이 "Cookie"에 대해 byte-case-insensitive 일치이면:

      1. request에 포함되는 사용자 에이전트의 cookie store 안의 각 cookie에 대해:

        참고: [COOKIES]는 store 안의 어떤 쿠키가 요청에 포함될 수 있는지에 대한 몇 가지 기준 요구사항을 정의하지만, 사용자 에이전트는 추가 제약을 부과해도 된다.

        1. cookie가 주어졌을 때 쿠키 직렬화를 수행한 결과를 cookies에 추가한다.

  11. destinationrequestdestination으로 둔다.

  12. initiator typerequestinitiator type으로 둔다.

  13. timingsrequestfetch timings 가져오기를 수행한 결과로 둔다.

  14. network.RequestData production과 일치하는 맵을 반환하되, 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가 주어졌을 때 response content info 가져오기를 하려면.
  1. network.ResponseContent production과 일치하는 새 맵을 반환하되, size 필드는 responseresponse body infodecoded size로 설정한다

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. responsefinal connection timing info가 null이 아니면, protocolresponsefinal connection timing infoALPN negotiated protocol로 설정한다.

  3. protocol이 빈 문자열이거나 "unknown"과 같으면:

    1. protocolresponseurlscheme으로 설정한다

    2. protocol이 "http" 또는 "https" 중 하나와 같고 response가 연관된 HTTP Response를 가지면.

      참고: [FETCH]는 HTTP network response와 response 객체 사이의 관계에 대해 명확하지 않다.

      1. http version을 HTTP Response의 Status line의 HTTP-version [HTTP11]로 둔다.

      2. http version이 "HTTP/"로 시작하면:

        1. version을 5에서 http versionlength까지의 http versioncode unit substring으로 둔다.

        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가 주어졌을 때 response data 가져오기를 하려면:
  1. urlresponseURLURL 직렬화기를 실행한 결과로 둔다.

  2. protocolresponse가 주어졌을 때 protocol 가져오기를 수행한 결과로 설정한다.

  3. statusresponsestatus로 둔다.

  4. status textresponsestatus message로 둔다.

  5. responsecache state가 "local"이면 from cache를 true로 두고, 그렇지 않으면 false로 둔다.

  6. headers를 빈 목록으로 둔다.

  7. mime typeresponse에 대한 computed mime typeessence로 둔다.

    참고: 이는 브라우저가 실제로 사용 중인 MIME 타입으로, [MIMESNIFF] 명세의 정확한 알고리즘을 따르지 않더라도 그러하다.

  8. responseheaders list 안의 각 (name, value)에 대해:

    1. namevalueheader 직렬화를 수행한 결과를 headers에 추가한다.

  9. bytes receivedresponse와 연관된 HTTP 응답의 일부로 전송된 byte의 총 수로 둔다.

  10. headers size를 HTTP 응답의 header fields section의 일부로 전송된 byte 수로 둔다.

  11. body sizeresponseresponse body infoencoded size로 둔다.

  12. contentresponseresponse content info 가져오기를 수행한 결과로 둔다.

  13. auth challengesresponsechallenges 추출을 수행한 결과로 둔다.

  14. network.ResponseData production과 일치하는 을 반환하되, 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 타입

원격 끝 정의

network.SetCookieHeader = {
    name: text,
    value: network.BytesValue,
    ? domain: text,
    ? httpOnly: bool,
    ? expiry: text,
    ? maxAge: js-int,
    ? path: text,
    ? sameSite: network.SameSite,
    ? secure: bool,
}

network.SetCookieHeaderSet-Cookie response header 안의 데이터를 나타낸다.

정수인 input이 주어졌을 때 정수 직렬화를 하려면:

참고: 이는 input을 십진 숫자의 문자열로 나타내는 가장 짧은 표현을 만든다.

  1. serialized를 빈 문자열로 둔다.

  2. valueinput으로 둔다.

  3. value가 0보다 큰 동안:

    1. xvalue를 10으로 나눈 값으로 둔다.

    2. most significant digitsx의 정수 부분으로 둔다.

    3. ymost significant digits에 10을 곱한 값으로 둔다.

    4. least significant digitvalue - y로 둔다.

    5. 단언: least significant digit는 0부터 9까지의 범위에 있는 정수이다. 양 끝값을 포함한다.

    6. codepoint를 그 value가 U+0030 DIGIT ZERO의 value + least significant digitcode point로 둔다.

    7. codepointserialized 앞에 추가한다.

    8. valuemost significant digits로 설정한다.

  4. serialized를 반환한다.

protocol cookie가 주어졌을 때 set-cookie header 직렬화를 하려면:
  1. nameprotocol cookie["name"]를 UTF-8 encode한 결과로 둔다.

  2. valueprotocol cookie["value"]로 프로토콜 bytes 역직렬화를 수행한 결과로 둔다.

  3. header valuename, `=`, 및 value를 연결하여 형성된 byte sequence로 둔다.

  4. protocol cookie가 "expiry"를 포함하면:

    1. attribute를 `;Expires=`로 둔다

    2. protocol cookie["expiry"]를 UTF-8 encode한 결과를 attribute에 추가한다.

    3. attributeheader value에 추가한다.

  5. protocol cookie가 "maxAge"를 포함하면:

    1. attribute를 `;Max-Age=`로 둔다

    2. max age stringprotocol cookie["maxAge"]로 정수 직렬화를 수행한 결과로 둔다.

    3. max age stringUTF-8 encode한 결과를 attribute에 추가한다.

    4. attributeheader value에 추가한다.

  6. protocol cookie가 "domain"을 포함하면:

    1. attribute를 `;Domain=`으로 둔다

    2. protocol cookie["domain"]을 UTF-8 encode한 결과를 attribute에 추가한다.

    3. attributeheader value에 추가한다.

  7. protocol cookie가 "path"를 포함하면:

    1. attribute를 `;Path=`로 둔다

    2. protocol cookie["path"]를 UTF-8 encode한 결과를 attribute에 추가한다.

    3. attributeheader 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 encode한 결과를 attribute에 추가한다.

    3. attributeheader value에 추가한다.

  11. header value를 반환한다.

7.5.4.19. network.UrlPattern 타입

원격 끝 정의

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.UrlPatternnetwork intercept에 대해 request URL을 일치시키는 데 사용되는 pattern을 나타낸다.

URL이 network.UrlPattern과 일치되는 경우 URL은 파싱되고, 각 컴포넌트는 pattern 안의 대응하는 필드가 존재하면 그 필드와 동등한지 비교된다. pattern에서 누락된 필드는 항상 일치한다.

참고: 이 구문은 향후 확장성을 염두에 두고 설계되었다. 특히 이 구문은 [URLPattern] 명세에서 특별하게 취급되는 문자를 금지한다. 이러한 문자는 앞에 U+005C (\) 문자를 붙여 이스케이프할 수 있다.

pattern이 주어졌을 때 URL pattern 이스케이프 해제를 하려면
  1. forbidden characters를 codepoints «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 characterscodepoint포함하면, 오류 코드 invalid argument오류를 반환한다.

      2. codepoint가 U+005C (\)이면:

        1. is escaped character를 true로 설정한다.

        2. 계속한다.

    2. codepoint를 result에 추가한다.

    3. is escaped character를 false로 설정한다.

  5. 데이터 result와 함께 성공을 반환한다.

pattern이 주어졌을 때 URL pattern 파싱을 하려면:
  1. has protocol을 true로 둔다.

  2. has hostname을 true로 둔다.

  3. has port를 true로 둔다.

  4. has pathname을 true로 둔다.

  5. has search를 true로 둔다.

  6. patternnetwork.UrlPatternPattern production과 일치하면:

    1. pattern url을 빈 문자열로 둔다.

    2. pattern이 "protocol"을 포함하면:

      1. pattern["protocol"]이 빈 문자열이면, 오류 코드 invalid argument오류를 반환한다.

      2. protocolpattern["protocol"]로 URL Pattern 이스케이프 해제시도한 결과로 둔다.

      3. protocol 안의 각 codepoint에 대해:

        1. codepointASCII alphanumeric이 아니고 «U+002B (+), U+002D (-), U+002E (.)»가 codepoint포함하지 않으면:

          1. 오류 코드 invalid argument인 오류를 반환한다.

      4. protocolpattern url에 추가한다.

    3. 그렇지 않으면:

      1. has protocol을 false로 설정한다.

      2. "http"를 pattern url에 추가한다.

    4. schemepattern urlASCII lowercase를 수행한 결과로 둔다.

    5. ":"를 pattern url에 추가한다.

    6. scheme특수하면, "//"를 pattern url에 추가한다.

    7. pattern이 "hostname"을 포함하면:

      1. pattern["hostname"]이 빈 문자열이면, 오류 코드 invalid argument오류를 반환한다.

      2. scheme이 "file"이면 오류 코드 invalid argument오류를 반환한다.

      3. hostnamepattern["hostname"]로 URL Pattern 이스케이프 해제시도한 결과로 둔다.

      4. inside brackets를 false로 둔다.

      5. hostname 안의 각 codepoint에 대해:

        1. «U+002F (/), U+003F (?), U+0023 (#)»가 codepoint포함하면:

          1. 오류 코드 invalid argument오류를 반환한다.

        2. inside brackets가 false이고 codepoint가 U+003A (:)이면:

          1. 오류 코드 invalid argument오류를 반환한다.

        3. codepoint가 U+005B ([)이면, inside brackets를 true로 설정한다.

        4. codepoint가 U+005D (])이면, inside brackets를 false로 설정한다.

      6. hostnamepattern url에 추가한다.

    8. 그렇지 않으면:

      1. scheme이 "file"이 아니면, "placeholder"를 pattern url에 추가한다.

      2. has hostname을 false로 설정한다.

    9. pattern이 "port"를 포함하면:

      1. pattern["port"]가 빈 문자열이면, 오류 코드 invalid argument오류를 반환한다.

      2. portpattern["port"]로 URL Pattern 이스케이프 해제시도한 결과로 둔다.

      3. ":"를 pattern url에 추가한다.

      4. port 안의 각 codepoint에 대해:

        1. codepointASCII digit가 아니면:

          1. 오류 코드 invalid argument오류를 반환한다.

      5. portpattern url에 추가한다.

    10. 그렇지 않으면:

      1. has port를 false로 설정한다.

    11. pattern이 "pathname"을 포함하면:

      1. pathnamepattern["pathname"]로 URL Pattern 이스케이프 해제시도한 결과로 둔다.

      2. pathname이 U+002F (/)로 시작하지 않으면 "/"를 pattern url에 추가한다.

      3. pathname 안의 각 codepoint에 대해:

        1. «U+003F (?), U+0023 (#)»가 codepoint포함하면:

          1. 오류 코드 invalid argument오류를 반환한다.

      4. pathnamepattern url에 추가한다.

    12. 그렇지 않으면:

      1. has pathname을 false로 설정한다.

    13. pattern이 "search"를 포함하면:

      1. searchpattern["search"]로 URL pattern 이스케이프 해제시도한 결과로 둔다.

      2. search가 U+003F (?)로 시작하지 않으면 "?"를 pattern url에 추가한다.

      3. search 안의 각 codepoint에 대해:

        1. codepoint가 U+0023 (#)이면:

          1. 오류 코드 invalid argument오류를 반환한다.

      4. searchpattern url에 추가한다.

    14. 그렇지 않으면:

      1. has search를 false로 설정한다.

  7. 그렇지 않고 patternnetwork.UrlPatternString production과 일치하면:

    1. pattern urlpattern["pattern"]로 URL pattern 이스케이프 해제시도한 결과로 둔다.

  8. urlpattern url파싱한 결과로 둔다.

  9. url이 failure이면, 오류 코드 invalid argument오류를 반환한다.

  10. parsed를 다음 필드를 가진 구조체로 둔다:

    protocol
    has protocol이 true이면 urlscheme, 그렇지 않으면 null.
    hostname
    has hostname이 true이면 urlhost, 그렇지 않으면 null.
    port
    1. has port가 false이면:

      1. null.

    2. 그렇지 않으면:

      1. urlscheme특수하고, urlschemedefault port가 null이 아니며, urlport가 null이거나 schemedefault port와 같으면:

        1. 빈 문자열.

      2. 그렇지 않고, urlport가 null이 아니면:

        1. urlport정수 직렬화를 수행한 결과.

      3. 그렇지 않으면:

        1. null.

    pathname
    1. has pathname이 false이면:

      1. null.

    2. 그렇지 않으면:

      1. urlpath가 빈 문자열이 아니고 비어 있지 않으면 urlURL path serializer를 실행한 결과, 그렇지 않으면 null.

    search
    1. has search가 false이면:

      1. null.

    2. 그렇지 않으면:

      1. urlquery가 null이면 빈 문자열, 그렇지 않으면 urlquery.

  11. 데이터 parsed와 함께 성공을 반환한다.

url patternurl string이 주어졌을 때 URL pattern 일치를 수행하려면:
  1. urlurl string파싱한 결과로 둔다.

  2. url pattern의 protocol이 null이 아니고 urlscheme과 같지 않으면 false를 반환한다.

  3. url pattern의 hostname이 null이 아니고 urlhost와 같지 않으면 false를 반환한다.

  4. url pattern의 port가 null이 아니면:

    1. port를 null로 둔다.

    2. urlscheme특수하고, urlschemedefault port가 null이 아니며, urlport가 null이거나 schemedefault port와 같으면:

      1. port를 빈 문자열로 설정한다.

    3. 그렇지 않고, urlport가 null이 아니면:

      1. porturlport정수 직렬화를 수행한 결과로 설정한다.

    4. url pattern의 port가 port와 같지 않으면 false를 반환한다.

  5. url pattern의 pathname이 null이 아니고 urlURL path serializer를 실행한 결과와 같지 않으면 false를 반환한다.

  6. url pattern의 search가 null이 아니면:

    1. url queryurlquery로 둔다.

    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.addDataCollectorcollector를 추가한다.

명령 타입
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
}
sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:
  1. collector idUUID의 문자열 표현으로 둔다.

  2. input context ids를 빈 집합으로 둔다.

  3. command parameterscontexts 필드가 존재하면, input context idscommand parameters[contexts]로 집합 생성한 값으로 설정한다.

  4. data typescommand parameters["dataTypes"]로 집합 생성한 값으로 둔다.

  5. max encoded item sizecommand parameters ["maxEncodedDataSize"]로 둔다.

    참고: maxEncodedDataSize 매개변수는 max encoded item size를 나타내며, 전체 collector가 수집한 크기가 아니라 주어진 collector가 수집하는 각 요청의 크기를 제한한다.

    참고: 서로 다른 구현은 서로 다른 인코딩을 지원할 수 있으며, 이는 브라우저마다 인코딩된 크기가 다를 수 있음을 의미한다. 따라서 동일한 data collector 구성에 대해서도 일부 network data는 특정 구현에서만 max encoded item size에 들어맞을 수 있다.

  6. collector typecommand parameters ["collectorType"]로 둔다.

  7. input user context ids를 빈 집합으로 둔다.

  8. command parametersuserContexts 필드가 존재하면, input user context idscommand parameters[userContexts]로 집합 생성한 값으로 설정한다.

  9. input user context ids가 비어 있지 않고 input context ids도 비어 있지 않으면, 오류 코드 invalid argument오류를 반환한다.

  10. max encoded item size가 0이거나 max encoded item sizemax total collected size보다 크면, 오류 코드 invalid argument오류를 반환한다.

  11. input context ids비어 있지 않으면:

    1. navigablesinput context idsid로 유효한 navigable 가져오기시도한 결과로 둔다.

    2. navigables 안의 각 navigable에 대해:

      1. navigable최상위 traversable이 아니면, 오류 코드 invalid argument오류를 반환한다.

  12. 그렇지 않고 input user context ids비어 있지 않으면:

    1. input user context ids의 각 user context id에 대해:

      1. user contextuser context id사용자 컨텍스트 가져오기를 수행한 결과로 둔다.

      2. user context가 null이면, 오류 코드 no such user context오류를 반환한다.

  13. collectormax encoded item size 필드가 max encoded item size로 설정되고, data types 필드가 data types로 설정되고, collector 필드가 collector id로 설정되고, collector type 필드가 collector type으로 설정되고, contexts 필드가 input context ids로 설정되고, user contexts 필드가 input user context ids로 설정된 collector로 둔다.

  14. sessionnetwork collectors[collector id]를 collector로 설정한다.

  15. network.AddDataCollectorResult production과 일치하는 새 을 반환하되, collector 필드는 collector id로 설정한다.

7.5.5.2. network.addIntercept 명령

network.addIntercept 명령은 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
}
sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:
  1. interceptUUID의 문자열 표현으로 둔다.

  2. url patternscommand parametersurlPatterns 필드가 존재하면 그 필드로 두고, 그렇지 않으면 빈 목록으로 둔다.

  3. navigables를 null로 둔다.

  4. command parameterscontexts 필드가 존재하면:

    1. navigables를 빈 집합으로 설정한다.

    2. command parameters["contexts"]의 각 navigable id에 대해

      1. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

      2. navigable최상위 traversable이 아니면, 오류 코드 invalid argument오류를 반환한다.

      3. navigablenavigables에 추가한다.

    3. navigables가 빈 집합이면, 오류 코드 invalid argument오류를 반환한다.

  5. intercept mapsessionintercept map으로 둔다.

  6. parsed patterns를 빈 목록으로 둔다.

  7. url patterns 안의 각 url pattern에 대해:

    1. parsedurl pattern으로 URL pattern 파싱시도한 결과로 둔다.

    2. parsedparsed patterns추가한다.

  8. intercept map[intercept]를 url patterns parsed patterns, phases command parameters["phases"], 및 browsingContexts navigables를 가진 구조체로 설정한다.

  9. network.AddInterceptResult production과 일치하는 새 을 반환하되, intercept 필드는 intercept로 설정한다.

7.5.5.3. network.continueRequest 명령

network.continueRequest 명령은 network intercept에 의해 차단된 요청을 계속한다.

명령 타입
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
sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:
  1. blocked requestssessionblocked request map으로 둔다.

  2. request idcommand parameters["request"]로 둔다.

  3. blocked requestsrequest id포함하지 않으면, 오류 코드 no such request오류를 반환한다.

  4. (request, phase, response)를 blocked requests[request id]로 둔다.

  5. phase가 "beforeRequestSent"가 아니면, 오류 코드 invalid argument오류를 반환한다.

    "request already sent" 오류를 고려한다.

  6. command parameters가 "url"을 포함하면:

    1. url recordbase URL null과 함께 command parameters["url"]에 URL parser를 적용한 결과로 둔다.

    2. url record가 failure이면, 오류 코드 invalid argument오류를 반환한다.

      TODO: 여기서도 resume해야 하는가?

    3. requesturlurl record로 둔다.

  7. command parameters가 "method"를 포함하면:

    1. methodcommand parameters["method"]로 둔다.

    2. methodmethod token production과 일치하지 않으면, 오류 코드 "invalid argument"인 오류를 반환한다.

    3. requestmethodmethod로 둔다.

  8. command parameters가 "headers"를 포함하면:

    1. headers를 빈 header list로 둔다.

    2. command parameters["headers"] 안의 header에 대해:

      1. deserialized headerheaderheader 역직렬화를 수행한 결과로 둔다.

      2. deserialized header의 name이 field-name token production과 일치하지 않으면, 오류 코드 "invalid argument"인 오류를 반환한다.

      3. deserialized header의 value가 header value production과 일치하지 않으면, 오류 코드 "invalid argument"인 오류를 반환한다.

      4. deserialized headerheaders에 추가한다.

    3. requestheaders listheaders로 설정한다.

  9. command parameters가 "cookies"를 포함하면:

    1. cookie header를 빈 byte sequence로 둔다.

    2. command parameters["cookies"] 안의 각 cookie에 대해:

      1. cookie header가 비어 있지 않으면, `;`를 cookie header에 추가한다.

      2. cookiecookie header 직렬화를 수행한 결과를 cookie header에 추가한다.

    3. found cookie header를 false로 둔다.

    4. requestheaders list 안의 각 header에 대해:

      1. nameheader의 name으로 둔다.

      2. namebyte-lowercase한 값이 `cookie`이면:

        1. header의 value를 cookie header로 설정한다.

        2. found cookie header를 true로 설정한다.

        3. 중단한다.

    5. found cookie header가 false이면:

      1. header (`Cookie`, cookie header)를 requestheaders list에 추가한다.

  10. command parameters가 "body"를 포함하면:

    1. bodycommand parameters["body"]로 프로토콜 bytes 역직렬화를 수행한 결과로 둔다.

    2. requestbodybody로 설정한다.

  11. "continue request", request id, 및 (null, "incomplete")로 재개한다.

  12. 데이터 null과 함께 성공을 반환한다.

7.5.5.4. network.continueResponse 명령

network.continueResponse 명령은 network intercept에 의해 차단된 response를 계속한다. 이는 responseStarted 단계에서 호출되어 response의 status 및 headers를 수정하되, 여전히 network response 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
sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:
  1. request idcommand parameters["request"]로 둔다.

  2. responsesession, "continueResponse" 및 command parametersresponse 업데이트시도한 결과로 둔다.

  3. "continue request", request id, 및 (response, "incomplete")로 재개한다.

  4. 데이터 null과 함께 성공을 반환한다.

7.5.5.5. network.continueWithAuth 명령

network.continueWithAuth 명령은 authRequired 단계에서 network intercept에 의해 차단된 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
sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:
  1. blocked requestssessionblocked request map으로 둔다.

  2. request idcommand parameters["request"]로 둔다.

  3. blocked requestsrequest id포함하지 않으면, 오류 코드 no such request오류를 반환한다.

  4. (request, phase, response)를 blocked requests[request id]로 둔다.

  5. phase가 "authRequired"가 아니면, 오류 코드 invalid argument오류를 반환한다.

  6. command parameters "action"이 "cancel"이면, response의 authentication credentials를 "cancelled"로 설정한다.

  7. command parameters "action"이 "provideCredentials"이면:

    1. credentialscommand parameters["credentials"]로 둔다.

    2. 단언: credentials["type"]는 "password"이다.

    3. response의 authentication credentials를 (credentials["username"], credentials["password"])로 설정한다

  8. "continue request", request id, 및 (response, "incomplete")로 재개한다.

  9. 데이터 null과 함께 성공을 반환한다.

7.5.5.6. network.disownData 명령

network.disownData 명령은 주어진 collector에 대해 수집된 network data를 해제한다.

명령 타입
network.DisownData = (
  method: "network.disownData",
  params: network.DisownDataParameters
)

network.DisownDataParameters = {
  dataType: network.DataType,
  collector: network.Collector,
  request: network.Request,
}
반환 타입
network.DisownDataResult = EmptyResult
sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:
  1. data typecommand parameters의 "dataType" 필드 값으로 둔다.

  2. collector idcommand parameters의 "collector" 필드 값으로 둔다.

  3. request idcommand parameters의 "request" 필드 값으로 둔다.

  4. collectorssessionnetwork collectors로 둔다.

  5. collectorscollector id포함하지 않으면, 오류 코드 no such network collector오류를 반환한다.

  6. collected datarequest iddata type으로 수집된 데이터 가져오기를 수행한 결과로 둔다.

  7. collected data가 null이면, 오류 코드 no such network data오류를 반환한다.

  8. collected datacollector iddata에서 collector 제거를 수행한다.

  9. 데이터 null과 함께 성공을 반환한다.

7.5.5.7. network.failRequest 명령

network.failRequest 명령은 network intercept에 의해 차단된 fetch를 실패시킨다.

명령 타입
network.FailRequest = (
  method: "network.failRequest",
  params: network.FailRequestParameters
)

network.FailRequestParameters = {
  request: network.Request,
}
반환 타입
network.FailRequestResult = EmptyResult
sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:
  1. blocked requestssessionblocked request map으로 둔다.

  2. request idcommand parameters["request"]로 둔다.

  3. blocked requestsrequest id포함하지 않으면, 오류 코드 no such request오류를 반환한다.

  4. (request, phase, response)를 blocked requests[request id]로 둔다.

  5. phase가 "authRequired"이면, 오류 코드 invalid argument오류를 반환한다.

  6. response를 새 network error로 둔다.

    정확한 오류 종류를 설정할 수 있도록 허용한다 [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,
}
sessioncommand parameters가 주어진 원격 끝 단계는 다음과 같다:
  1. data typecommand parameters["dataType"]로 둔다.

  2. request idcommand parameters["request"]로 둔다.

  3. collector id를 null로 둔다.

  4. command parameters가 "collector"를 포함하면:

    1. collectorssessionnetwork collectors로 둔다.

    2. collectorscollector id포함하지 않으면, 오류오류 코드 no such network collector와 함께 반환한다.

    3. collector idcommand parameters["collector"]로 설정한다.

  5. disowncommand parameters["disown"]로 둔다.

  6. disown이 true이고 collector id가 null이면, 오류오류 코드 invalid argument와 함께 반환한다.

  7. collected datarequest iddata type이 주어진 get collected data로 둔다.

  8. collected data가 null이면:

    1. 오류오류 코드 no such network data와 함께 반환한다.

  9. collected datapending이 true이면:

    1. "network data collected" 및 (request id, data type)으로 대기한다.

  10. collector id가 null이 아니고 collected datacollectorscollector id포함하지 않으면:

    1. 오류오류 코드 no such network data와 함께 반환한다.

  11. bytescollected databytes로 둔다.

  12. bytes가 null이면,

    1. 오류오류 코드 unavailable network data와 함께 반환한다.

  13. bodynetwork.GetDataResult 생성과 일치하는 으로 두고, bytes 필드를 bytes로 설정한다.

  14. disown이 true이면, collected datacollector idremove collector from data를 수행한다.

  15. 성공을 데이터 body와 함께 반환한다.

7.5.5.9. network.provideResponse 명령

network.provideResponse 명령은 완전한 응답을 제공하여, 네트워크 인터셉트에 의해 차단된 요청을 계속한다.

참고: 이는 요청이 일반 요청 생명주기를 거쳐 진행되는 것을 막지 않으며, 따라서 진행됨에 따라 다른 이벤트를 방출한다.

명령 타입
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
sessioncommand parameters가 주어진 원격 끝 단계는 다음과 같다:
  1. request idcommand parameters["request"]로 둔다.

  2. responsesession, "provideResponse", 및 command parametersupdate the response시도한 결과로 둔다.

  3. command parameters가 "body"를 포함하면:

    1. bodycommand parameters["body"]로 deserialize protocol bytes한 것으로 둔다.

    2. responsebodybody as a body로 설정한다.

  4. "continue request", request id, 및 (response,"complete")로 재개한다.

  5. 성공을 데이터 null과 함께 반환한다.

7.5.5.10. network.removeDataCollector 명령

network.removeDataCollector 명령은 컬렉터를 제거한다.

명령 타입
network.RemoveDataCollector = (
  method: "network.removeDataCollector",
  params: network.RemoveDataCollectorParameters
)

network.RemoveDataCollectorParameters = {
  collector: network.Collector
}
반환 타입
network.RemoveDataCollectorResult = EmptyResult
sessioncommand parameters가 주어진 원격 끝 단계는 다음과 같다:
  1. collector idcommand parameters의 "collector" 필드 값으로 둔다.

  2. collectorssessionnetwork collectors로 둔다.

  3. collectorscollector id포함하지 않으면, 오류오류 코드 no such network collector와 함께 반환한다.

  4. sessionnetwork collectors에서 collector id제거한다.

  5. collected network data 내의 각 collected data에 대해, collected datacollector idremove collector from data를 수행한다.

  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
sessioncommand parameters가 주어진 원격 끝 단계는 다음과 같다:
  1. interceptcommand parameters의 "intercept" 필드 값으로 둔다.

  2. intercept mapsessionintercept map으로 둔다.

  3. intercept mapintercept포함하지 않으면, 오류오류 코드 no such 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
요청 request가 주어진 WebDriver BiDi cache behavior 단계는 다음과 같다:
  1. navigable을 null로 둔다.

  2. requestclient환경 설정 객체이면:

    1. environment settingsrequestclient로 둔다.

    2. navigable 중에서 그 active windowenvironment settings전역 객체인 것이 있으면, navigable을 그 navigable의 최상위 traversable로 설정한다.

  3. navigable이 null이 아니고 navigable cache behavior mapnavigable포함하면, navigable cache behavior map[navigable]을 반환한다.

  4. default cache behavior를 반환한다.

navigable이 주어진 navigable cache behavior 단계는 다음과 같다:
  1. top-level navigablenavigable최상위 traversable로 둔다.

  2. navigable cache behavior maptop-level navigable포함하면, navigable cache behavior map[top-level navigable]을 반환한다.

  3. default cache behavior를 반환한다.

sessioncommand parameters가 주어진 원격 끝 단계는 다음과 같다:
  1. behaviorcommand parameters["cacheBehavior"]로 둔다.

  2. command parameters가 "contexts"를 포함하지 않으면:

    1. default cache behaviorbehavior로 설정한다.

    2. navigable cache behavior map지운다.

    3. behavior의 값을 기준으로 전환한다:

      "bypass"
      구현별 리소스 캐시를 비활성화하기 위한 구현 정의 단계를 수행한다.
      "default"
      현재 원격 끝 구성에서 일반적으로 활성화되는 구현별 리소스 캐시를 활성화하기 위한 구현 정의 단계를 수행한다.
    4. 성공을 데이터 null과 함께 반환한다.

  3. navigables를 빈 집합으로 둔다.

  4. command parameters["contexts"]의 각 navigable id에 대해:

    1. contextnavigable idget a navigable시도한 결과로 둔다.

    2. context최상위 브라우징 컨텍스트가 아니면, 오류오류 코드 invalid argument와 함께 반환한다.

    3. contextnavigables추가한다.

  5. navigables 내의 각 navigable에 대해:

    1. navigable cache behavior mapnavigable포함하고, navigable cache behavior map[navigable]이 behavior와 같으면 계속한다.

    2. behavior의 값을 기준으로 전환한다:

      "bypass"
      navigable최상위 브라우징 컨텍스트인 모든 브라우징 컨텍스트에서 비롯된 네트워크 요청에 대해, 구현별 리소스 캐시를 비활성화하기 위한 구현 정의 단계를 수행한다.
      "default"
      navigable최상위 브라우징 컨텍스트인 모든 브라우징 컨텍스트에서 비롯된 네트워크 요청에 대해, 현재 원격 끝 구성에서 일반적으로 활성화되는 구현별 리소스 캐시를 활성화하기 위한 구현 정의 단계를 수행한다.
    3. behaviordefault cache behavior와 같으면:

      1. navigable cache behavior mapnavigable포함하면, navigable cache behavior map[navigable]을 제거한다.

    4. 그렇지 않으면:

      1. navigable cache behavior map[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
requestheaders가 주어졌을 때 헤더를 업데이트하려면:
  1. request headersrequestheader list로 둔다.

  2. headers 내의 각 header에 대해:

    1. request headers 내에 header설정한다.

      참고: 이는 값이 이미 있는 경우 항상 기존 값을 덮어쓴다. 특히 기존 `Set-Cookie` 헤더에 쿠키를 추가하지 않는다.

session, request, 및 related navigables가 주어졌을 때 요청 헤더를 업데이트하려면:
  1. Assert: related navigablessize는 0 또는 1이다.

    참고: 이는 여러 navigable과 연관된 worker에 대해서는 동작하지 않음을 의미한다. 이 경우 어떤 순서로 헤더를 재정의해야 하는지 명확하지 않다.

  2. requestsessionextra headersdefault headers헤더 업데이트를 수행한다

  3. user context headerssessionextra headersuser context headers로 둔다.

  4. related navigables 내의 navigable에 대해:

    1. user contextnavigable연관된 사용자 컨텍스트로 둔다.

    2. user context headersuser context포함하면, requestuser context headers[user context]로 헤더 업데이트를 수행한다

  5. navigable headerssessionextra headersnavigable headers로 둔다.

  6. related navigables 내의 navigable에 대해:

    1. top-level traversablenavigable최상위 traversable로 둔다.

    2. navigable headerstop-level traversable를 포함하면, requestnavigable headers[top-level traversable]로 헤더 업데이트를 수행한다.

sessioncommand parameters가 주어진 원격 끝 단계는 다음과 같다:
  1. command parameters가 "userContexts"를 포함하고, command parameters가 "contexts"를 포함하면, 오류오류 코드 invalid argument와 함께 반환한다.

  2. headerscommand parameters["headers"]로 create a headers list시도한 결과로 둔다.

  3. command parameters가 "userContexts"를 포함하면:

    1. user contexts를 빈 목록으로 둔다.

    2. command parameters["userContexts"] 내의 user context id에 대해:

      1. user contextuser context idget user context한 것으로 둔다.

      2. user context가 null이면, 오류오류 코드 no such user context와 함께 반환한다.

      3. user contextuser contexts추가한다.

    3. targetsessionextra headersuser context headers로 둔다

    4. user contexts 내의 user context에 대해:

      1. target[user context]를 headers로 설정한다.

    5. 성공을 데이터 null과 함께 반환한다.

  4. command parameters가 "contexts"를 포함하면:

    1. navigablescommand parameters["contexts"]로 get valid top-level traversables by ids시도한 결과로 둔다.

    2. targetsessionextra headersnavigable headers로 둔다

    3. navigables 내의 navigable에 대해:

      1. target[navigable]를 headers로 설정한다.

    4. 성공을 데이터 null과 함께 반환한다.

  5. sessionextra headersdefault headersheaders로 설정한다.

  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응답 response가 주어졌을 때의 WebDriver BiDi 인증 필요 단계이다:
  1. redirect countrequest리다이렉트 횟수로 둔다.

  2. Assert: before request sent 맵[request]은 redirect count와 같다.

    참고: 이는 모든 호출자가 이 단계를 실행하기 전에 WebDriver BiDi before request sent 단계가 request로 호출되도록 보장해야 함을 의미한다.

  3. request클라이언트가 null이 아니면, related navigablesrequest클라이언트관련 navigable 가져오기를 수행한 결과로 둔다. 그렇지 않으면 related navigables를 빈 집합으로 둔다.

  4. "network.authRequired"와 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합의 각 session에 대해:

    1. paramssession, "network.authRequired", 그리고 request네트워크 이벤트 처리를 수행한 결과로 둔다.

    2. response dataresponse응답 데이터 가져오기를 수행한 결과로 둔다.

    3. Assert: response data포함한다 "authChallenge".

    4. paramsresponse 필드를 response data로 설정한다.

    5. Assert: paramsnetwork.AuthRequiredParameters 산출식과 일치한다.

    6. bodyparams 필드가 params로 설정된, network.AuthRequired 산출식과 일치하는 맵으로 둔다.

    7. sessionbody이벤트를 방출한다.

    8. params["isBlocked"]가 true이면:

      1. blocked requestssession차단된 요청 맵으로 둔다.

      2. request idrequestrequest id로 둔다.

      3. blocked requests[request id]를 (request, "authRequired", response)로 설정한다.

      4. «"continue request"» 및 request idAwait한다.

      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 또는 로컬 캐시에서 처리되기 전)에 방출된다.

requestuser context가 주어졌을 때 요청이 사용자 컨텍스트에서 비롯되는지 확인하는 단계는 다음과 같다:
  1. settingsrequest클라이언트로 둔다.

  2. related navigablessettings관련 navigable 가져오기를 수행한 결과로 둔다.

  3. related navigables의 각 navigable에 대해:

    1. navigable연관된 사용자 컨텍스트user context이면 true를 반환한다.

  4. false를 반환한다.

related navigables가 주어졌을 때 에뮬레이트된 네트워크 조건 가져오기 단계는 다음과 같다:
  1. related navigables의 각 navigable에 대해:

    1. top-level traversablenavigable최상위 traversable로 둔다.

    2. user contexttop-level traversable연관된 사용자 컨텍스트로 둔다.

    3. 활성 BiDi 세션의 각 session에 대해:

      1. session에뮬레이트된 네트워크 조건navigable 네트워크 조건top-level traversable포함하면, session에뮬레이트된 네트워크 조건navigable 네트워크 조건[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. navigablesettings관련 전역 객체연관된 Document노드 navigable로 둔다.

  2. emulated network conditions를 [navigable]로 에뮬레이트된 네트워크 조건 가져오기를 수행한 결과로 둔다.

  3. emulated network conditions가 null이 아니고 emulated network conditionsoffline이 true이면 true를 반환한다.

  4. false를 반환한다.

원격 끝 이벤트 트리거요청 request가 주어졌을 때의 WebDriver BiDi before request sent 단계이다:
  1. 사용자 컨텍스트 집합의 각 user context에 대해:

    1. requestuser context요청이 사용자 컨텍스트에서 비롯되는지 단계가 true를 반환하면:

      1. 활성 BiDi 세션의 각 session에 대해:

        참고: user context는 둘 이상의 사용자 컨텍스트에서 안전하지 않은 인증서 허용 재정의 맵에 포함될 수 없다.

        1. session사용자 컨텍스트에서 안전하지 않은 인증서 허용 재정의 맵user context포함하면:

          1. accept insecure certificatessession사용자 컨텍스트에서 안전하지 않은 인증서 허용 재정의 맵[user context]으로 둔다.

          2. accept insecure certificates가 true이면:

            1. Assert 엔드포인트 노드가 안전하지 않은 TLS 연결 허용을 지원한다.

            2. request에 대해 Basic Certificate Processing 단계를 실행할 때, 단계 a와 그 밖의 구현 정의 인증서 검증 단계를 건너뛴다.

          3. 그렇지 않으면, request에 대해 Basic Certificate Processing 단계를 실행할 때 모든 단계와 그 밖의 구현 정의 인증서 검증 단계를 수행한다.

        참고: user context는 둘 이상의 사용자 컨텍스트에서 프록시 구성 맵에 포함될 수 없다.

        1. session사용자 컨텍스트에서 프록시 구성 맵user context포함하면:

          1. proxy configurationsession사용자 컨텍스트에서 프록시 구성 맵[user context]으로 둔다.

          2. requestproxy configuration에 정의된 프록시 설정을 사용하도록 구현 정의 단계를 수행한다.

            참고: 이 설정은 사용자 컨텍스트가 생성될 때 검증되므로 이 단계에서는 유효한 것으로 가정한다. 프록시에 접근할 때 발생하는 오류는 요청을 처리할 때 네트워크 오류로 보고된다.

  2. request네트워크 요청 본문 수집 가능 시 수집을 수행한다.

  3. before request sent 맵request를 포함하지 않으면, before request sent 맵[request]을 새 집합으로 설정한다.

  4. redirect countrequest리다이렉트 횟수로 둔다.

  5. redirect countbefore request sent 맵[request]에 추가한다.

  6. request클라이언트가 null이 아니면, related navigablesrequest클라이언트관련 navigable 가져오기를 수행한 결과로 둔다. 그렇지 않으면 related navigables를 빈 집합으로 둔다.

  7. response를 null로 둔다.

  8. response status를 "incomplete"로 둔다.

  9. 활성 BiDi 세션의 각 session에 대해:

    1. session, requestrelated navigables요청 헤더 업데이트를 수행한다.

  10. "network.beforeRequestSent"와 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합의 각 session에 대해:

    1. paramssession, "network.beforeRequestSent", 그리고 request네트워크 이벤트 처리를 수행한 결과로 둔다.

    2. initiatorrequestinitiator 가져오기를 수행한 결과로 둔다.

    3. initiator비어 있지 않으면, paramsinitiator 필드를 initiator로 설정한다.

    4. Assert: paramsnetwork.BeforeRequestSentParameters 산출식과 일치한다.

    5. bodyparams 필드가 params로 설정된, network.BeforeRequestSent 산출식과 일치하는 맵으로 둔다.

    6. sessionbody이벤트를 방출한다.

    7. params["isBlocked"]가 true이면:

      1. blocked requestssession차단된 요청 맵으로 둔다.

      2. request idrequestrequest id로 둔다.

      3. blocked requests[request id]를 (request, "beforeRequestSent", null)로 설정한다.

      4. (response, status)를 «"continue request"» 및 requestrequest idawait한 결과로 둔다.

      5. status가 "complete"이면 response statusstatus로 설정한다.

      6. blocked requests[request id]를 제거한다.

      참고: 대기하는 동안 요청의 추가 처리는 발생하지 않는다.

  11. emulated network conditionsrelated navigables에뮬레이트된 네트워크 조건 가져오기를 수행한 결과로 둔다.

  12. emulated network conditions가 null이 아니고 emulated network conditionsoffline이 true이면, (network error, "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,
}

이 이벤트는 네트워크 요청이 오류로 종료될 때 방출된다.

원격 끝 이벤트 트리거요청 request가 주어졌을 때의 WebDriver BiDi fetch error 단계이다:
  1. before request sent 맵[request]가 request리다이렉트 횟수를 포함하지 않으면, requestWebDriver BiDi before request sent 단계를 실행한다.

    참고: 이는 호출자가 모든 오류 경로에서 WebDriver BiDi before request sent 단계를 명시적으로 호출할 필요 없이, network.fetchError 전에 network.beforeRequestSent가 항상 방출될 수 있도록 보장한다.

  2. request클라이언트가 null이 아니면, related navigablesrequest클라이언트관련 navigable 가져오기를 수행한 결과로 둔다. 그렇지 않으면 related navigables를 빈 집합으로 둔다.

  3. request네트워크 응답 본문 수집 가능 시 중단을 수행한다.

  4. "network.fetchError" 및 related navigables가 주어졌을 때 이벤트가 활성화된 세션 집합의 각 session에 대해:

    1. paramssession, "network.fetchError", 및 request네트워크 이벤트 처리를 수행한 결과로 둔다.

    2. paramserrorText 필드를, 요청이 중단되게 한 오류를 설명하는 구현 정의 문자열로 설정한다.

    3. 단언: paramsnetwork.FetchErrorParameters 생성규칙과 일치한다.

    4. bodyparams 필드가 params로 설정된, network.FetchError 생성규칙과 일치하는 맵으로 둔다.

    5. sessionbody이벤트를 방출한다.

7.5.6.4. network.responseCompleted 이벤트
이벤트 타입
network.ResponseCompleted = (
  method: "network.responseCompleted",
  params: network.ResponseCompletedParameters
 )

network.ResponseCompletedParameters = {
  network.BaseParameters,
  response: network.ResponseData,
}

이 이벤트는 전체 응답 본문이 수신된 후 방출된다.

원격 끝 이벤트 트리거요청 request응답 response가 주어졌을 때의 WebDriver BiDi response completed 단계이다:
  1. redirect countrequest리다이렉트 횟수로 둔다.

  2. 단언: before request sent 맵[request]이 redirect count를 포함한다.

    참고: 이는 모든 호출자가 이 단계 전에 requestWebDriver BiDi before request sent 단계를 호출하도록 보장해야 함을 의미한다.

  3. request클라이언트가 null이 아니면, related navigablesrequest클라이언트관련 navigable 가져오기를 수행한 결과로 둔다. 그렇지 않으면 related navigables를 빈 집합으로 둔다.

  4. requestresponse네트워크 응답 본문 수집 가능 시 수집을 수행한다.

  5. sessions를 "network.responseCompleted" 및 related navigables가 주어졌을 때의 이벤트가 활성화된 세션 집합으로 둔다.

  6. sessions의 각 session에 대해:

    1. paramssession, "network.responseCompleted", 및 request네트워크 이벤트 처리를 수행한 결과로 둔다.

    2. 단언: params["isBlocked"]는 false이다.

    3. response dataresponse응답 데이터 가져오기를 수행한 결과로 둔다.

    4. paramsresponse 필드를 response data로 설정한다.

    5. 단언: paramsnetwork.ResponseCompletedParameters 생성규칙과 일치한다.

    6. bodyparams 필드가 params로 설정된, network.ResponseCompleted 생성규칙과 일치하는 맵으로 둔다.

    7. sessionbody이벤트를 방출한다.

7.5.6.5. network.responseStarted 이벤트
이벤트 타입
network.ResponseStarted = (
  method: "network.responseStarted",
  params: network.ResponseStartedParameters
 )

network.ResponseStartedParameters = {
  network.BaseParameters,
  response: network.ResponseData,
}

이 이벤트는 응답 헤더가 수신된 후, 본문이 완료되기 전에 방출된다.

원격 끝 이벤트 트리거요청 request응답 response가 주어졌을 때의 WebDriver BiDi response started 단계이다:
  1. redirect countrequest리다이렉트 횟수로 둔다.

  2. 단언: before request sent 맵[request]은 redirect count와 같다.

    참고: 이는 모든 호출자가 이 단계 전에 requestWebDriver BiDi before request sent 단계를 호출하도록 보장해야 함을 의미한다.

  3. request클라이언트가 null이 아니면, related navigablesrequest클라이언트관련 navigable 가져오기를 수행한 결과로 둔다. 그렇지 않으면 related navigables를 빈 집합으로 둔다.

  4. response status를 "incomplete"로 둔다.

  5. sessions를 "network.responseStarted" 및 related navigables가 주어졌을 때의 이벤트가 활성화된 세션 집합으로 둔다.

  6. sessions의 각 session에 대해:

    1. paramssession, "network.responseStarted", 및 request네트워크 이벤트 처리를 수행한 결과로 둔다.

    2. response dataresponse응답 데이터 가져오기를 수행한 결과로 둔다.

    3. paramsresponse 필드를 response data로 설정한다.

    4. 단언: paramsnetwork.ResponseStartedParameters 생성규칙과 일치한다.

    5. bodyparams 필드가 params로 설정된, network.ResponseStarted 생성규칙과 일치하는 맵으로 둔다.

    6. sessionbody이벤트를 방출한다.

    7. params["isBlocked"]가 true이면:

      1. blocked requestssession차단된 요청 맵으로 둔다.

      2. request idrequestrequest id로 둔다.

      3. blocked requests[request id]를 (request, "beforeRequestSent", response)로 설정한다.

      4. (response, status)를 «"continue request"» 및 request idawait한 결과로 둔다.

      5. status가 "complete"이면 response statusstatus로 설정한다.

      6. blocked requests[request id]를 제거한다.

  7. (response, response status)를 반환한다.

7.6. script 모듈

script 모듈은 script realm 및 실행과 관련된 명령 및 이벤트를 포함한다.

7.6.1. 정의

원격 끝 정의

ScriptCommand = (
  script.AddPreloadScript //
  script.CallFunction //
  script.Disown //
  script.Evaluate //
  script.GetRealms //
  script.RemovePreloadScript
)

로컬 끝 정의

ScriptResult = (
  script.AddPreloadScriptResult /
  script.CallFunctionResult /
  script.DisownResult /
  script.EvaluateResult /
  script.GetRealmsResult /
  script.RemovePreloadScriptResult
)

ScriptEvent = (
  script.Message //
  script.RealmCreated //
  script.RealmDestroyed
)

7.6.2. 프리로드 스크립트

프리로드 스크립트는 작성자가 정의한 스크립트가 실행되기 전에, 새 Window가 생성될 때 실행되는 스크립트이다.

TODO: 이를 다른 종류의 realm 안의 스크립트로 확장한다.

BiDi 세션프리로드 스크립트 맵을 가진다. 이는 키가 UUID이고 값이 구조체이다. 해당 구조체는 문자열인 function declaration이라는 이름의 항목, 목록인 arguments라는 이름의 항목, 목록 또는 null인 contexts라는 이름의 항목, 문자열 또는 null인 sandbox라는 이름의 항목, 그리고 집합user contexts라는 이름의 항목을 가진다.

참고: 프리로드 스크립트 실행이 구문 오류 또는 런타임 예외로 인해 실패하면, 해당 스크립트가 실행되던 realm에서 [ECMAScript] 예외가 보고되고, 다른 프리로드 스크립트는 정상적으로 실행된다.

environment settings가 주어졌을 때 WebDriver BiDi 프리로드 스크립트 실행 방법은 다음과 같다:
  1. documentenvironment settings관련 전역 객체연관된 Document로 둔다.

  2. navigabledocumentnavigable로 둔다.

  3. user contextnavigable연관된 사용자 컨텍스트로 둔다.

  4. user context iduser context사용자 컨텍스트 id로 둔다.

  5. 활성 BiDi 세션의 각 session에 대해:

    1. session프리로드 스크립트 맵 안의 각 preload script에 대해:

      1. preload scriptuser contexts크기가 0이 아니면:

        1. preload scriptuser contextsuser context id포함하지 않으면, 계속한다.

      2. preload scriptcontexts가 null이 아니면:

        1. navigable idnavigable최상위 traversable의 id로 둔다.

        2. preload scriptcontextsnavigable id포함하지 않으면, 계속한다.

      3. preload scriptsandbox가 null이 아니면, realmpreload scriptsandboxnavigable샌드박스 realm 가져오기 또는 생성을 수행한 결과로 둔다. 그렇지 않으면 realmenvironment settingsRealm 실행 컨텍스트의 Realm 컴포넌트로 둔다.

      4. exception reporting globalenvironment settingsRealm 실행 컨텍스트의 Realm 컴포넌트의 전역 객체로 둔다.

      5. argumentspreload scriptarguments로 둔다.

      6. deserialized arguments를 빈 목록으로 둔다.

      7. arguments의 각 argument에 대해:

        1. channelsession, realmargument채널 생성을 수행한 결과로 둔다.

        2. channeldeserialized arguments에 추가한다.

      8. base URLenvironment settingsAPI base URL로 둔다.

      9. options기본 스크립트 fetch 옵션으로 둔다.

      10. function declarationpreload scriptfunction declaration으로 둔다.

      11. function body evaluation statusfunction declaration, environment settings, base URL, 및 options함수 본문 평가를 수행한 결과로 둔다.

      12. function body evaluation statusabrupt completion이면, function body evaluation status.[[Value]]에 의해 주어진 예외를 exception reporting global에 대해 예외 보고한다.

      13. function objectfunction body evaluation status.[[Value]]로 둔다.

      14. IsCallable(function object)이 false이면:

        1. errorrealm 안의 새 TypeError 객체로 둔다.

        2. exception reporting global에 대해 error예외 보고한다.

      15. environment settings스크립트 실행 준비를 수행한다.

      16. evaluation statusCall(function object, null, deserialized arguments)로 설정한다.

      17. environment settings스크립트 실행 후 정리를 수행한다.

      18. evaluation statusabrupt 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, realmprotocol value가 주어졌을 때 채널을 생성하려면:

  1. channel propertiesprotocol value["value"]로 둔다.

  2. steps를 인수 message가 주어졌을 때의 다음 단계로 둔다:

    1. current realm현재 Realm Record로 둔다.

    2. session, current realm, channel propertiesmessage스크립트 메시지를 방출한다.

  3. CreateBuiltinFunction(steps, 1, "", « », realm)를 반환한다.

7.6.3.3. script.EvaluateResult 타입

원격 끝 정의로컬 끝 정의

script.EvaluateResult = (
  script.EvaluateResultSuccess /
  script.EvaluateResultException
)

script.EvaluateResultSuccess = {
  type: "success",
  result: script.RemoteValue,
  realm: script.Realm
}

script.EvaluateResultException = {
  type: "exception",
  exceptionDetails: script.ExceptionDetails
  realm: script.Realm
}

script.EvaluateResult 타입은 스크립트를 실행하는 명령의 반환값을 나타낸다. script.EvaluateResultSuccess 변형은 스크립트가 정상적으로 완료된 경우에 사용되고, script.EvaluateResultException 변형은 스크립트가 던져진 예외로 완료된 경우에 사용된다.

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, completion record record, ownership typesession이 주어졌을 때 예외 상세정보 가져오기:

  1. 단언: record.[[Type]]은 throw이다.

  2. textrecord가 나타내는 오류에 대한 구현 정의 텍스트 설명으로 둔다.

    TODO: 여기의 요구사항을 더 엄격하게 만든다. 사람들은 아마 이 데이터를 정규식 같은 똑같이 나쁜 것으로 파싱하려 할 것이다.

  3. serialization options를 각 필드가 해당 기본값으로 설정된 script.SerializationOptions 생성규칙과 일치하는 으로 둔다.

  4. exceptionrecord.[[Value]], serialization options, ownership type, serialization internal map으로서의 새 , realmsession으로 원격 값으로 직렬화를 수행한 결과로 둔다.

  5. stack tracerecord가 주어졌을 때의 예외에 대한 스택 추적으로 둔다.

  6. stack trace의 크기가 1 이상이면, line numberstack trace[0] 안의 lineNumber 필드 값으로 두고, column numberstack trace[0]의 columnNumber 필드 값으로 둔다. 그렇지 않으면 line numbercolumn number를 0으로 둔다.

  7. exception detailstext 필드가 text로 설정되고, exception 필드가 exception으로 설정되고, lineNumber 필드가 line number로 설정되고, columnNumber 필드가 column number로 설정되고, stackTrace 필드가 stack trace로 설정된, script.ExceptionDetails 생성규칙과 일치하는 으로 둔다.

  8. exception details를 반환한다.

7.6.3.5. script.Handle 타입

원격 끝 정의로컬 끝 정의

script.Handle = text;

script.Handle 타입은 ECMAScript 런타임이 소유한 객체에 대한 핸들을 나타낸다. 이 핸들은 특정 Realm 안에서만 유효하다.

각 ECMAScript Realm은 대응하는 핸들 객체 맵을 가진다. 이는 핸들 id에서 해당 객체로 가는 strong 이다.

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, realmsession이 주어졌을 때 키-값 목록 역직렬화:

  1. deserialized key-value list를 새 목록으로 둔다.

  2. serialized key-value list 안의 각 serialized key-value에 대해:

    1. serialized key-value크기가 2가 아니면, errorerror code invalid argument와 함께 반환한다.

    2. serialized keyserialized key-value[0]으로 둔다.

    3. serialized keystring이면, deserialized keyserialized key로 둔다.

    4. 그렇지 않으면 deserialized keyserialized key, realmsession로컬 값 역직렬화를 수행하도록 시도한 결과로 둔다.

    5. serialized valueserialized key-value[1]로 둔다.

    6. deserialized valueserialized value, realmsession가 주어졌을 때 로컬 값 역직렬화를 수행하도록 시도한 결과로 둔다.

    7. CreateArrayFromListdeserialized key, deserialized value»)를 deserialized key-value list에 추가한다.

  3. success를 데이터 deserialized key-value list와 함께 반환한다.

serialized value list, realmsession이 주어졌을 때 값 목록 역직렬화:

  1. deserialized values를 새 목록으로 둔다.

  2. serialized value list 안의 각 serialized value에 대해:

    1. deserialized valueserialized value, realmsession이 주어졌을 때 로컬 값 역직렬화를 수행하도록 시도한 결과로 둔다.

    2. deserialized valuedeserialized values에 추가한다;

  3. success를 데이터 deserialized values와 함께 반환한다.

local protocol value, realmsession이 주어졌을 때 로컬 값 역직렬화:

  1. local protocol valuescript.RemoteReference 생성규칙과 일치하면, 주어진 local protocol value, realmsession원격 참조 역직렬화를 반환한다.

  2. local protocol valuescript.PrimitiveProtocolValue 생성규칙과 일치하면, local protocol value원시 프로토콜 값 역직렬화를 수행한 결과를 반환한다.

  3. local protocol valuescript.ChannelValue 생성규칙과 일치하면, session, realmlocal protocol value채널 생성을 수행한 결과를 반환한다.

  4. typelocal protocol valuetype 필드 값으로 두거나, 그런 필드가 없으면 undefined로 둔다.

  5. valuelocal protocol valuevalue 필드 값으로 두거나, 그런 필드가 없으면 undefined로 둔다.

  6. 다음 조건 및 연관된 단계 목록에서, 연관 조건이 true인 첫 번째 단계 집합을 실행한다:

    type이 문자열 "array"인 경우
    1. deserialized value listvalue, realmsession이 주어졌을 때 값 목록 역직렬화를 수행하도록 시도한 결과로 둔다.

    2. success를 데이터 CreateArrayFromList(deserialized value list)와 함께 반환한다.

    type이 문자열 "date"인 경우
    1. valueDate Time String Format과 일치하지 않으면, errorerror code invalid argument와 함께 반환한다.

    2. date resultConstruct(Date, value)로 둔다.

    3. 단언: date resultabrupt completion이 아니다.

    4. success를 데이터 date result와 함께 반환한다.

    type이 문자열 "map"인 경우
    1. deserialized key-value listvalue, realmsession키-값 목록 역직렬화를 수행하도록 시도한 결과로 둔다.

    2. iterableCreateArrayFromList(deserialized key-value list)로 둔다

    3. success를 데이터 Map(iterable)와 함께 반환한다.

    type이 문자열 "object"인 경우
    1. deserialized key-value listvalue, realmsession키-값 목록 역직렬화를 수행하도록 시도한 결과로 둔다.

    2. iterableCreateArrayFromList(deserialized key-value list)로 둔다

    3. success를 데이터 Object.fromEntries(iterable)와 함께 반환한다.

    type이 문자열 "regexp"인 경우
    1. patternlocal protocol valuepattern 필드 값으로 둔다.

    2. flagslocal protocol valueflags 필드 값으로 두거나, 그런 필드가 없으면 undefined로 둔다.

    3. regex_resultRegexp(pattern, flags)로 둔다. 이것이 예외를 던지면, errorerror code invalid argument와 함께 반환한다.

    4. success를 데이터 regex_result와 함께 반환한다.

    type이 문자열 "set"인 경우
    1. deserialized value listvalue, realmsession이 주어졌을 때 값 목록 역직렬화를 수행하도록 시도한 결과로 둔다.

    2. iterableCreateArrayFromList(deserialized key-value list)로 둔다

    3. success를 데이터 Set object(iterable)와 함께 반환한다.

    그 외의 경우
    errorerror code invalid argument와 함께 반환한다.
7.6.3.8. script.PreloadScript 타입

원격 끝 정의로컬 끝 정의

script.PreloadScript = text;

script.PreloadScript 타입은 렐름 생성 시 실행될 스크립트에 대한 핸들을 나타낸다.

7.6.3.9. script.Realm 타입

원격 끝 정의로컬 끝 정의

script.Realm = text;

렐름에는 그 렐름을 고유하게 식별하는 문자열인 연관된 realm id가 있다. 이는 렐름이 생성될 때 암묵적으로 설정된다.

렐름에 대한 realm id는 불투명하며, handle object map 안의 해당 전역 객체의 핸들 id에서 파생될 수 없어야 하고, 관련되는 경우 어떤 navigablenavigable id에서도 파생될 수 없어야 한다.

참고: 이는 사용자가 서로 다른 id 사이의 구현별 관계에 의존하지 않도록 보장하기 위한 것이다.

주어진 realm id렐름을 가져오기:
  1. realm id가 null이면, 데이터 null과 함께 성공을 반환한다.

  2. idrealm id렐름이 없으면 오류오류 코드 no such frame와 함께 반환한다

  3. realmidrealm id렐름으로 둔다.

  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로 설정된 으로 둔다.

    이는 lone surrogate를 처리하지 않는다

    Type(value)이 Number인 경우
    1. value의 값에 따라 전환한다:

      NaN
      serialized"NaN"으로 둔다
      -0
      serialized"-0"으로 둔다
      Infinity
      serialized"Infinity"로 둔다
      -Infinity
      serialized"-Infinity"로 둔다
      그 외의 경우:
      serializedvalue로 둔다
    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. typeprimitive protocol valuetype 필드 값으로 둔다.

  2. value를 undefined로 둔다.

  3. primitive protocol valuevalue 필드가 있으면:

    1. valueprimitive protocol valuevalue 필드 값으로 둔다.

  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_resultStringToNumber(value)로 둔다.

    5. number_result가 NaN이면, 오류오류 코드 invalid argument와 함께 반환한다

    6. 데이터 number_result와 함께 성공을 반환한다.

    type이 문자열 "boolean"인 경우
    데이터 value와 함께 성공을 반환한다.
    type이 문자열 "bigint"인 경우
    1. bigint_resultStringToBigInt(value)로 둔다.

    2. bigint_result가 undefined이면, 오류오류 코드 invalid argument와 함께 반환한다

    3. 데이터 bigint_result와 함께 성공을 반환한다.

  5. 오류오류 코드 invalid argument와 함께 반환한다

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으로 navigable 가져오기:
  1. global objectrealm전역 객체로 둔다.

  2. global objectunwrapped global object로 둔다.

  3. global objectWindow 객체가 아니면, null을 반환한다.

  4. documentglobal object의 래핑된 Window연관된 Document로 둔다.

  5. documentnode navigable을 반환한다.

주어진 global objectworker의 소유자 가져오기:
  1. 단언: global objectWorkerGlobalScope 객체이다.

  2. owners를 빈 목록으로 둔다.

  3. global object의 연관된 owner set 안의 각 owner에 대해:

    1. owner environment settingsowner관련 설정 객체로 둔다.

    2. owner realm info를 주어진 owner environment settingsrealm info 가져오기의 결과로 둔다.

    3. owner realm info가 null이면, 계속한다.

    4. owner realm info["id"]를 owners에 추가한다.

  4. owners를 반환한다.

주어진 environment settingsrealm info 가져오기:
  1. realmenvironment settingsrealm 실행 컨텍스트의 Realm 컴포넌트로 둔다.

  2. realm idrealm에 대한 realm id로 둔다.

  3. originenvironment settingsorigin가 주어졌을 때의 출처의 직렬화로 둔다.

  4. global objectenvironment settings가 지정하는 전역 객체로 둔다

  5. 처음 일치하는 조건 아래의 단계를 실행한다:

    global objectWindow 객체인 경우
    1. documentenvironment settings관련 전역 객체연관된 Document로 둔다.

    2. navigabledocumentnode navigable로 둔다.

    3. navigable이 null이면, null을 반환한다.

    4. navigable idnavigable에 대한 navigable id로 둔다.

    5. user context idnavigable연관된 사용자 컨텍스트user context id로 둔다

    6. realm inforealm 필드가 realm id로 설정되고, origin 필드가 origin으로 설정되고, context 필드가 navigable id로 설정되며 userContext 필드가 user context id로 설정된, script.WindowRealmInfo 생성규칙과 일치하는 으로 둔다.

    global objectSandboxWindowProxy 객체인 경우
    TODO: 이것이 샌드박스를 처리하기 위한 올바른 표현인지 명확하지 않다.
    1. documentglobal object의 래핑된 Window연관된 Document로 둔다.

    2. navigabledocumentnode navigable로 둔다.

    3. navigable가 null이면, null을 반환한다.

    4. navigable idnavigable에 대한 navigable id로 둔다.

    5. user context idnavigable연관된 사용자 컨텍스트user context id로 둔다

    6. sandbox namerealm이 주어졌을 때 샌드박스 이름 가져오기의 결과로 둔다.

    7. 단언: sandbox name은 null이 아니다.

    8. realm inforealm 필드가 realm id로 설정되고, origin 필드가 origin으로 설정되고, context 필드가 navigable id로 설정되고, userContext 필드가 user context id로 설정되며, sandbox 필드가 sandbox name으로 설정된, script.WindowRealmInfo 생성규칙과 일치하는 으로 둔다.

    global objectDedicatedWorkerGlobalScope 객체인 경우
    1. ownersglobal object가 주어졌을 때 worker의 소유자 가져오기의 결과로 둔다.

    2. 단언: owners는 정확히 하나의 항목을 가진다.

    3. realm inforealm 필드가 realm id로 설정되고, origin 필드가 origin으로 설정되며, owners 필드가 owners로 설정된, script.DedicatedWorkerRealmInfo 생성규칙과 일치하는 으로 둔다.

    global objectSharedWorkerGlobalScope 객체인 경우
    1. realm inforealm 필드가 realm id로 설정되고, origin 필드가 origin으로 설정된, script.SharedWorkerRealmInfo 생성규칙과 일치하는 으로 둔다.

    global objectServiceWorkerGlobalScope 객체인 경우
    1. realm inforealm 필드가 realm id로 설정되고, origin 필드가 origin으로 설정된, script.ServiceWorkerRealmInfo 생성규칙과 일치하는 으로 둔다.

    global objectWorkerGlobalScope 객체인 경우
    1. realm inforealm 필드가 realm id로 설정되고, origin 필드가 origin으로 설정된, script.WorkerRealmInfo 생성규칙과 일치하는 으로 둔다.

    global objectPaintWorkletGlobalScope 객체인 경우
    1. realm inforealm 필드가 realm id로 설정되고, origin 필드가 origin으로 설정된, script.PaintWorkletRealmInfo 생성규칙과 일치하는 으로 둔다.

    global objectAudioWorkletGlobalScope 객체인 경우
    1. realm inforealm 필드가 realm id로 설정되고, origin 필드가 origin으로 설정된, script.AudioWorkletRealmInfo 생성규칙과 일치하는 으로 둔다.

    global objectWorkletGlobalScope 객체인 경우
    1. realm inforealm 필드가 realm id로 설정되고, origin 필드가 origin으로 설정된, script.WorkletRealmInfo 생성규칙과 일치하는 으로 둔다.

    그 외의 경우:
    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 타입은 주어진 Realmhandle object map 안의 기존 ECMAScript 객체에 대한 원격 참조를 나타내는 script.RemoteObjectReference이거나, 노드에 대한 참조를 나타내는 script.SharedReference이다.

"stale object reference" 경우를 처리한다.

참고: 제공된 참조가 handlesharedId를 모두 가지는 경우, 알고리즘은 handle을 무시하고 sharedId만 따른다.

remote reference, realmsession이 주어졌을 때 remote reference 역직렬화:
  1. remote referencescript.RemoteReference 생성규칙과 일치한다고 단언한다.

  2. remote referencescript.SharedReference 생성규칙과 일치하면, remote reference, realmsession으로 shared reference 역직렬화를 반환한다.

  3. remote referencerealm으로 remote object reference 역직렬화를 반환한다.

remote object referencerealm이 주어졌을 때 remote object reference 역직렬화:
  1. handle idremote object referencehandle 필드 값으로 둔다.

  2. handle maprealmhandle object map으로 둔다

  3. handle maphandle id를 포함하지 않으면, 오류오류 코드 no such handle와 함께 반환한다.

  4. 데이터 handle map[handle id]와 함께 성공을 반환한다.

shared reference, realmsession이 주어졌을 때 shared reference 역직렬화:
  1. shared referencescript.SharedReference 생성규칙과 일치한다고 단언한다.

  2. navigablerealm으로 navigable 가져오기로 둔다.

  3. navigablenull이면, 오류오류 코드 no such node와 함께 반환한다.

    참고: 이는 realm이 Window 전역이 아닐 때 발생한다.

  4. shared idshared referencesharedId 필드 값으로 둔다.

  5. nodesession, navigableshared id노드 가져오기시도한 결과로 둔다.

  6. nodenull이면, 오류오류 코드 no such node와 함께 반환한다.

  7. environment settingsrealm 실행 컨텍스트의 Realm 컴포넌트가 realm환경 설정 객체로 둔다.

  8. node노드 문서originenvironment settingsoriginsame origin domain이 아니면 오류오류 코드 no such node와 함께 반환한다.

    참고: 이는 WebDriver-BiDi가 달리 스크립트 접근을 허용하지 않는 realm 사이에서 객체를 전달하는 데 사용될 수 없도록 보장한다.

  9. realm global objectrealm전역 객체로 둔다.

  10. realm global objectSandboxWindowProxy 객체이면, noderealm에서 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 / 등 래퍼 객체를 특별히 처리할 것인가?

ECMAScript 런타임에서 접근 가능한 값은 script.RemoteValue로 지정되는 미러 객체로 표현된다. 값의 타입은 type 속성에 지정된다. JSON으로 표현 가능한 원시 값의 경우, 이는 값을 value 속성에 포함한다. JSON으로 표현할 수 없는 원시 값의 경우, value 속성은 값의 문자열 표현을 포함한다.

원시 객체가 아닌 객체의 경우, handle 속성이 존재하면 객체에 대한 고유한 문자열 핸들을 포함한다. 핸들은 각 직렬화마다 고유하다. 원격 끝은 대응하는 핸들이 있는 객체를, 해당 핸들로 script.disown이 호출되거나 realm 자체가 버려질 때까지 (예: 탐색으로 인해) 살아 있게 유지한다.

일부 비원시 타입의 경우, value 속성은 ECMAScript 객체 안의 데이터 표현을 포함한다. 컨테이너 타입의 경우 이는 추가적인 script.RemoteValue 인스턴스를 포함할 수 있다. 객체가 중복 객체인 경우, 즉 현재 script.RemoteValue 안에서 객체가 이미 직렬화되었거나, 아마도 순환의 일부로 직렬화되었거나, 또는 최대 직렬화 깊이에 도달한 경우에는 value 속성이 null이거나 생략될 수 있다.

동일한 script.RemoteValue 안에 중복 객체가 있는 경우, 값은 원격 값 중 하나에만 제공되며, 지정된 직렬화에서 중복 객체 모두에는 ECMAScript 객체마다 고유한 internalId가 제공된다.

노드script.RemoteValue 인스턴스로 표현된다. 이들은 value 속성에 노드의 부분 직렬화를 가진다.

미러 객체의 생명주기를 재고한다.

참고: 미러 객체는 원본 객체를 런타임에서 살아 있게 유지하지 않는다. 런타임에서 객체가 버려지면, 프로토콜을 통해 그 객체에 접근하려는 이후의 시도는 오류가 된다.

realm, ownership typeobject가 주어졌을 때 객체에 대한 핸들을 얻으려면:
  1. ownership type이 "none"과 같으면, null을 반환한다.

  2. handle idobject에 대한 새롭고 고유한 문자열 핸들로 둔다.

  3. handle maprealmhandle object map으로 둔다

  4. handle map[handle id]를 object로 설정한다.

  5. handle id를 결과로 반환한다.

nodesession이 주어졌을 때 노드에 대한 shared id 가져오기:
  1. nodeunwrapped node로 둔다.

  2. nodeNode를 구현하지 않으면, null을 반환한다.

  3. navigablenodenode navigable로 둔다.

  4. navigable이 null이면, null을 반환한다.

  5. session, navigablenode노드 참조 가져오기 또는 생성을 반환한다.

serialization internal map, remote valueobject가 주어졌을 때 필요한 경우 internal id 설정:
  1. serialization internal mapobject를 포함하지 않으면, serialization internal map[object]를 remote value로 설정한다.

  2. 그렇지 않으면, 다음 단계를 실행한다:

    1. previously serialized remote valueserialization internal map[object]로 둔다.

    2. previously serialized remote valueinternalId 필드가 없으면, 다음 단계를 실행한다:

      1. internal id를 진정한 난수 또는 의사 난수를 기반으로 한 UUID의 문자열 표현으로 둔다.

      2. previously serialized remote valueinternalId 필드를 internal id로 설정한다.

    3. remote valueinternalId 필드를 previously serialized remote value 안의 internalId 필드로 설정한다.

value, serialization options, ownership type, serialization internal map, realmsession이 주어졌을 때 remote value로 직렬화하려면:

  1. remote valuevalue가 주어졌을 때 primitive protocol value 직렬화의 결과로 둔다.

  2. remote value가 undefined가 아니면, remote value를 반환한다.

  3. handle idrealm, ownership typevalue객체에 대한 핸들로 둔다.

  4. ownership type을 "none"으로 설정한다.

  5. known objectvalueserialization internal map 안에 있으면 true, 그렇지 않으면 false로 둔다.

  6. 다음 조건과 관련 단계의 목록에서, 관련 조건이 참인 첫 번째 단계 집합을 실행한다:

    Type(value) is Symbol
    remote value로컬 끝 정의 안의 script.SymbolRemoteValue 생성규칙과 일치하는 으로 두며, handle 속성은 handle id가 null이 아니면 그것으로 설정하고, 그렇지 않으면 생략한다.
    IsArray(value)
    remote valuesession, script.ArrayRemoteValue, handle id, known object, value, serialization options, ownership type, serialization internal map, realm, 및 session으로 Array-like 직렬화한 것으로 둔다.
    IsRegExp(value)
    1. patternGet(value, "source")의 ToString으로 둔다.

    2. flagsGet(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. serializedDate.prototype.toISOStringvalue에 대해 Call한 것으로 설정한다.

    2. 단언: serializedthrow completion이 아니다.

    3. remote value로컬 끝 정의 안의 script.DateRemoteValue 생성규칙과 일치하는 으로 두며, handle 속성은 handle id가 null이 아니면 그것으로 설정하고, 그렇지 않으면 생략하며, 값은 serialized로 설정한다.

    value has a [[MapData]] internal slot
    1. remote value로컬 끝 정의 안의 script.MapRemoteValue 생성규칙과 일치하는 으로 두며, handle 속성은 handle id가 null이 아니면 그것으로 설정하고, 그렇지 않으면 생략한다.

    2. serialization internal map, remote valuevalue필요한 경우 internal id 설정을 수행한다.

    3. serialized를 null로 둔다.

    4. known objectfalse이고, serialization options["maxObjectDepth"]가 0이 아니면, 다음 단계를 실행한다:

      1. serializedCreateMapIterator(value, key+value), serialization options, ownership type, serialization internal map, realm, 및 session으로 mapping으로 직렬화한 결과로 둔다.

    5. serialized가 null이 아니면, remote valuevalue 필드를 serialized로 설정한다.

    value has a [[SetData]] internal slot
    1. remote value로컬 끝 정의 안의 script.SetRemoteValue 생성규칙과 일치하는 으로 두며, handle 속성은 handle id가 null이 아니면 그것으로 설정하고, 그렇지 않으면 생략한다.

    2. serialization internal map, remote valuevalue필요한 경우 internal id 설정을 수행한다.

    3. serialized를 null로 둔다.

    4. known objectfalse이고, serialization options["maxObjectDepth"]가 0이 아니면, 다음 단계를 실행한다:

      1. serializedCreateSetIterator(value, value), serialization options, ownership type, serialization internal map, realm, 및 session으로 list로 직렬화한 결과로 둔다.

    5. serialized가 null이 아니면, remote valuevalue 필드를 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 valuescript.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 valuescript.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 idvaluesession으로 노드에 대한 shared id 가져오기로 둔다.

    2. remote value로컬 끝 정의 안의 script.NodeRemoteValue 생성규칙과 일치하는 으로 두며, sharedId 속성은 shared id가 null이 아니면 그것으로 설정하고, 그렇지 않으면 생략하며, handle 속성은 handle id가 null이 아니면 그것으로 설정하고, 그렇지 않으면 생략한다.

    3. serialization internal map, remote valuevalue필요한 경우 internal id 설정을 수행한다.

    4. serialized를 null로 둔다.

    5. known objectfalse이면, 다음 단계를 실행한다:

      1. serialized를 새 으로 둔다.

      2. serialized["nodeType"]를 Get(value, "nodeType")으로 설정한다.

      3. node valueGet(value, "nodeValue")로 설정한다.

      4. node value가 null이 아니면 serialized["nodeValue"]를 node value로 설정한다.

      5. valueElement 또는 Attr를 구현하면:

        1. serialized["localName"]를 Get(value, "localName")으로 설정한다.

        2. serialized["namespaceURI"]를 Get(value, "namespaceURI")로 설정한다

      6. child node countvalue자식크기로 둔다.

      7. serialized["childNodeCount"]를 child node count로 설정한다.

      8. serialization options["maxDomDepth"]가 0과 같거나, 또는 valueShadowRoot를 구현하고 serialization options["includeShadowTree"]가 "none"이거나, 또는 serialization options["includeShadowTree"]가 "open"이고 valuemode가 "closed"이면, children을 null로 둔다.

        그렇지 않으면, children을 빈 목록으로 두고, value자식 안의 각 노드 child에 대해:

        1. child serialization optionsserialization options클론으로 둔다.

        2. child serialization options["maxDomDepth"]가 null이 아니면, child serialization options["maxDomDepth"]를 child serialization options["maxDomDepth"] - 1로 설정한다.

        3. serializedchild, child serialization options, ownership type, serialization internal map, realm, 및 session으로 remote value로 직렬화한 결과로 둔다.

        4. serializedchildren에 추가한다.

      9. children이 null이 아니면, serialized["children"]를 children으로 설정한다.

      10. valueElement를 구현하면:

        1. attributes를 새 으로 둔다.

        2. value속성 목록 안의 각 attribute에 대해:

          1. nameattributequalified name으로 둔다

          2. valueattribute으로 둔다.

          3. attributes[name]를 value로 설정한다

        3. serialized["attributes"]를 attributes로 설정한다.

        4. shadow rootvalueshadow root로 둔다.

        5. shadow root가 null이면, serialized shadow를 null로 둔다. 그렇지 않으면 다음 하위 단계를 실행한다:

          1. serialized shadowshadow root, serialization options, ownership type, serialization internal map, realm, 및 session으로 remote value로 직렬화한 결과로 둔다.

        6. serialized["shadowRoot"]를 serialized shadow로 설정한다.

      11. valueShadowRoot를 구현하면, serialized["mode"]를 valuemode로 설정한다.

    6. serialized가 null이 아니면, remote valuevalue 필드를 serialized로 설정한다.

    value is a platform object that implements WindowProxy
    1. windowvalue의 [[WindowProxy]] internal slot 값으로 둔다.

    2. navigablewindownavigable로 둔다.

    3. navigable idnavigable에 대한 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이 아니면 그것으로 설정하고, 그렇지 않으면 생략한다.
    그 외:
    1. 단언: Type(value) is Object

    2. remote value로컬 끝 정의 안의 script.ObjectRemoteValue 생성규칙과 일치하는 으로 두며, handle 속성은 handle id가 null이 아니면 그것으로 설정하고, 그렇지 않으면 생략한다.

    3. serialization internal map, remote valuevalue필요한 경우 internal id 설정을 수행한다.

    4. serialized를 null로 둔다.

    5. known objectfalse이고, serialization options["maxObjectDepth"]가 0이 아니면, 다음 단계를 실행한다:

      1. serializedEnumerableOwnPropertyNames(value, key+value), serialization options, ownership type, serialization internal map, realm, 및 session으로 mapping으로 직렬화한 결과로 둔다.

    6. serialized가 null이 아니면, remote valuevalue 필드를 serialized로 설정한다.

  7. remote value를 반환한다

children과 자식 노드는 서로 다른 것이다. childNodeCountchildNodes를 참조해야 하거나, childrenCount로 이름이 바뀌어야 한다.

production, handle id, known object, value, serialization options, ownership type, serialization internal map, realm, 및 session이 주어졌을 때 Array-like 직렬화:
  1. remote valueproduction과 일치하는 으로 두며, handle 속성은 handle id가 null이 아니면 그것으로 설정하고, 그렇지 않으면 생략한다.

  2. serialization internal map, remote valuevalue필요한 경우 internal id 설정을 수행한다.

  3. known objectfalse이고, serialization options["maxObjectDepth"]가 0이 아니면:

    1. serializedCreateArrayIterator(value, value), serialization options, ownership type, serialization internal map, realm, 및 session으로 list로 직렬화한 결과로 둔다.

    2. serialized가 null이 아니면, remote valuevalue 필드를 serialized로 설정한다.

  4. remote value를 반환한다

iterable, serialization options, ownership type, serialization internal map, realm, 및 session이 주어졌을 때 list로 직렬화:
  1. serialization options["maxObjectDepth"]가 null이 아니면, 단언: serialization options["maxObjectDepth"]는 0보다 크다.

  2. serialized를 새 목록으로 둔다.

  3. GetIterator(iterable, sync)의 IteratorToList 안의 각 child value에 대해:

    1. child serialization optionsserialization options클론으로 둔다.

    2. child serialization options["maxObjectDepth"]가 null이 아니면, child serialization options["maxObjectDepth"]를 child serialization options["maxObjectDepth"] - 1로 설정한다.

    3. serialized childchild value, child serialization options, ownership type, serialization internal map, realm, 및 session으로 remote value로 직렬화한 결과로 둔다.

    4. serialized childserialized에 추가한다.

  4. serialized를 반환한다

iterable, serialization options, ownership type, serialization internal map, realm, 및 session이 주어졌을 때 mapping으로 직렬화하려면:

  1. serialization options["maxObjectDepth"]가 null이 아니면, 단언: serialization options["maxObjectDepth"]는 0보다 크다.

  2. serialized를 새 목록으로 둔다.

  3. GetIterator(iterable, sync)의 IteratorToList 안의 item에 대해:

    1. 단언: IsArray(item)

    2. propertyCreateListFromArrayLike(item)로 둔다

    3. 단언: property크기 2의 목록이다

    4. keyproperty[0]으로 두고, valueproperty[1]로 둔다

    5. child serialization optionsserialization options클론으로 둔다.

    6. child serialization options["maxObjectDepth"]가 null이 아니면, child serialization options["maxObjectDepth"]를 child serialization options["maxObjectDepth"] - 1로 설정한다.

    7. Type(key)이 String이면, serialized keychild key로 두고, 그렇지 않으면 serialized keychild key, child serialization options, ownership type, serialization internal map, realm, 및 session으로 remote value로 직렬화한 결과로 둔다.

    8. serialized valuevalue, child serialization options, ownership type, serialization internal map, realm, 및 session으로 remote value로 직렬화한 결과로 둔다.

    9. serialized child를 («serialized key, serialized value»)로 둔다.

    10. serialized childserialized에 추가한다.

  4. serialized를 반환한다

7.6.3.15. script.ResultOwnership 타입
script.ResultOwnership = "root" / "none"

script.ResultOwnership은 직렬화된 값의 소유권이 어떻게 처리될지를 지정한다.

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(샌드박스 렐름 포함)에서 사용할 수 있는 DOM Node에 대한 참조를 나타낸다.

7.6.3.18. script.StackFrame 타입

원격 끝 정의로컬 끝 정의

script.StackFrame = {
  columnNumber: js-uint,
  functionName: text,
  lineNumber: js-uint,
  url: text,
}

스택 추적 안의 프레임은 StackFrame 객체로 표현된다. 이는 스크립트의 URL을 나타내는 url 속성, 실행 중인 함수의 이름을 나타내는 functionName 속성, 그리고 실행된 코드의 행 번호와 열 번호를 나타내는 lineNumbercolumnNumber 속성을 가진다.

7.6.3.19. script.StackTrace 타입

원격 끝 정의로컬 끝 정의

script.StackTrace = {
  callFrames: [*script.StackFrame],
}

script.StackTrace 타입은 스크립트 실행의 특정 지점에서의 javascript 스택을 나타낸다.

참고: 스택 프레임 목록을 가져오는 방법과 그 목록의 속성에 관한 세부 사항은 충분히 명시되어 있지 않으므로, 여기의 세부 사항은 구현 정의이다.

구현이 스택 프레임 목록을 생성할 수 있다고 가정한다. 이는 가장 최근의 것부터 시작하여 javascript 호출 스택의 각 항목마다 하나의 항목을 가지는 목록이다. 각 항목은 스크립트 script 안의 문 또는 표현식 실행에 대응하는 단일 스택 프레임이며, 다음 필드를 포함한다:

script url
script를 포함하는 리소스의 url
function
실행 중인 함수의 이름
line number
script를 포함하는 리소스의 맨 위를 기준으로 한, 실행된 코드의 0부터 시작하는 행 번호.
column number
script를 포함하는 리소스 안의 행 시작을 기준으로 한, 실행된 코드의 0부터 시작하는 열 번호.

스택 프레임 목록 stack으로 스택 추적 구성을 하려면:

  1. call frames를 새 목록으로 둔다.

  2. stack 안의 각 스택 프레임 frame에 대해, 가장 최근에 실행된 프레임부터 시작하여 다음 단계를 실행한다:

    1. urlframescript urlURL이 주어졌을 때 URL 직렬화기를 실행한 결과로 둔다.

    2. frame infoscript.StackFrame 생성규칙과 일치하는 새 으로 두며, url 필드는 url로, functionName 필드는 framefunction으로, lineNumber 필드는 frameline number로, columnNumber 필드는 framecolumn number로 설정한다.

  3. frame infocall frames에 추가한다.

  4. stack tracescript.StackTrace 생성규칙과 일치하는 새 으로 두며, callFrames 속성은 call frames로 설정한다.

  5. stack trace를 반환한다.

현재 스택 추적실행 중인 실행 컨텍스트의 callstack을 나타내는 스택 프레임 목록이 주어졌을 때 스택 추적 구성의 결과이다.

예외, 또는 throw 타입의 Completion Record, exception에 대한 예외에 대한 스택 추적은 다음으로 주어진다:

  1. exception이 예외로 throw된 값이면, recordexception을 throw하기 위해 생성된 Completion Record로 둔다. 그렇지 않으면 recordexception으로 둔다.

  2. stackrecord가 생성된 지점에서의 실행에 대응하는 스택 프레임 목록으로 둔다.

  3. stack이 주어졌을 때 스택 추적 구성을 반환한다.

7.6.3.20. script.Source 타입

로컬 끝 정의

script.Source = {
  realm: script.Realm,
  ? context: browsingContext.BrowsingContext,
  ? userContext: browser.UserContext
}

script.Source 타입은 스크립트 관련 이벤트가 발생한 선택적 browsingContext.BrowsingContext 및 관련 browser.UserContext를 가진 script.Realm을 나타낸다.

source realm이 주어졌을 때 소스 가져오기:
  1. realmsource realm에 대한 realm id로 둔다.

  2. environment settingsrealm 실행 컨텍스트의 Realm 컴포넌트가 source realmenvironment settings object로 둔다.

  3. environment settings연관된 Document를 가지면:

    1. document를 environment settings의 연관된 Document로 둔다.

    2. navigabledocumentnode navigable로 둔다.

    3. navigable idnavigable이 null이 아니면 navigable에 대한 navigable id로 둔다.

    4. user context idnavigable연관된 사용자 컨텍스트user context id로 둔다.

    그렇지 않으면 navigable을 null로 둔다.

  4. sourcescript.Source 생성규칙과 일치하는 으로 두며, realm 필드는 realm로 설정하고, context 필드는 navigable이 null이 아니면 navigable id로 설정하거나 그렇지 않으면 설정하지 않고, userContext 필드는 |navigable이 null이 아니면 user context id로 설정하거나 그렇지 않으면 설정하지 않는다.

  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 idsandbox가 주어졌을 때 navigable에서 realm 가져오기:
  1. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

  2. sandbox가 null이거나 빈 문자열이면:

    1. documentnavigable활성 문서로 둔다.

    2. environment settings관련 전역 객체연관된 Documentdocumentenvironment settings object로 둔다.

    3. realmenvironment settingsrealm 실행 컨텍스트의 Realm 컴포넌트로 둔다.

  3. 그렇지 않으면: realmsandboxnavigable이 주어졌을 때 샌드박스 realm 가져오기 또는 생성시도한 결과로 둔다.

  4. 데이터 realm과 함께 success를 반환한다

이것은 잘못된 오류 코드를 가진다

target이 주어졌을 때 target에서 realm 가져오기:
  1. targetscript.ContextTarget 생성규칙과 일치하면:

    1. sandbox를 null로 둔다.

    2. target이 "sandbox"를 포함하면, sandboxtarget["sandbox"]로 설정한다.

    3. realmtarget["context"] 및 sandboxnavigable에서 realm 가져오기로 둔다.

  2. 그렇지 않으면:

    1. 단언: targetscript.RealmTarget 생성규칙과 일치한다.

    2. realm idtargetrealm 필드 값으로 둔다.

    3. realmrealm id가 주어졌을 때 realm 가져오기로 둔다.

  3. 데이터 realm과 함께 success를 반환한다

이것은 잘못된 오류 코드를 가진다

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
}
sessioncommand parameters가 주어진 원격 끝 단계는 다음과 같다:
  1. command parameters가 "userContexts"를 포함하고 command parameters가 "contexts"를 포함하면, invalid argument error code와 함께 error를 반환한다.

  2. function declarationcommand parametersfunctionDeclaration 필드로 둔다.

  3. arguments를 존재하면 command parametersarguments 필드로 두고, 그렇지 않으면 빈 목록으로 둔다.

  4. user contexts집합으로 둔다.

  5. navigables를 null로 둔다.

  6. command parameterscontexts 필드가 존재하면:

    1. navigables를 빈 집합으로 설정한다.

    2. command parameters["contexts"]의 각 navigable id에 대해

      1. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

      2. navigable최상위 traversable이 아니면, invalid argument error code와 함께 error를 반환한다.

      3. navigablenavigables에 추가한다.

  7. 그렇지 않고, command parametersuserContexts포함하면:

    1. user contextscommand parameters["userContexts"]로 집합 생성한 것으로 설정한다.

    2. user contexts의 각 user context id에 대해:

      1. user contextuser context id사용자 컨텍스트 가져오기한 것으로 설정한다.

      2. user context가 null이면, no such user context error code와 함께 error를 반환한다.

  8. sandboxcommand parameters 안의 "sandbox" 필드 값으로 두고, 존재하지 않으면 null로 둔다.

  9. scriptUUID의 문자열 표현으로 둔다.

  10. preload script mapsession프리로드 스크립트 맵으로 둔다.

  11. preload script map[script]를 function declaration function declaration, arguments arguments, contexts navigables, sandbox sandbox, 및 user contexts user contexts를 가진 struct로 설정한다.

  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. realmcommand parameterstarget 필드 값이 주어졌을 때 target에서 realm 가져오기시도한 결과로 둔다.

  2. handlescommand parametershandles 필드 값으로 둔다.

  3. handles의 각 handle id에 대해:

    1. handle maprealmhandle object map으로 둔다

    2. handle maphandle id를 포함하면, handle map에서 handle id를 제거한다.

  4. 데이터 null과 함께 success를 반환한다.

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.EvaluateResult

TODO: script.evaluate에서 설명한 timeout 인수를 추가한다.

realm, serialized arguments listsession이 주어졌을 때 인수 역직렬화:

  1. deserialized arguments list를 빈 목록으로 둔다.

  2. serialized arguments list의 각 serialized argument에 대해:

    1. deserialized argumentserialized argument, realmsession가 주어졌을 때 local value 역직렬화시도한 결과로 둔다.

    2. deserialized argumentdeserialized arguments list에 추가한다.

  3. 데이터 deserialized arguments list와 함께 success를 반환한다.

function declaration, environment settings, base URL, 및 options가 주어졌을 때 함수 본문 평가:

참고: function declaration는 괄호로 감싸져 평가된다.

  1. bypassDisabledScripting을 true로 둔다.

  2. parenthesized function declaration를 «"(", function declaration, ")"»의 연결로 둔다

  3. function scriptparenthesized function declaration, environment settings, base URL, optionsbypassDisabledScriptingclassic script 생성의 결과로 둔다.

  4. environment settings스크립트 실행 준비를 수행한다.

  5. function body evaluation statusScriptEvaluation(function script의 record)로 둔다.

  6. environment settings스크립트 실행 후 정리를 수행한다.

  7. function body evaluation status를 반환한다.

sessioncommand parameters를 사용한 원격 끝 단계는 다음과 같다:

  1. realmcommand parameterstarget 필드 값이 주어졌을 때 target에서 realm 가져오기시도한 결과로 둔다.

  2. realm idrealmrealm id로 둔다.

  3. environment settingsrealm 실행 컨텍스트의 Realm 컴포넌트가 realmenvironment settings object로 둔다.

  4. command argumentscommand parametersarguments 필드 값으로 둔다.

  5. deserialized arguments를 빈 목록으로 둔다.

  6. command arguments가 null이 아니면, deserialized argumentsrealm, command argumentssession이 주어졌을 때 인수 역직렬화시도한 결과로 설정한다.

  7. this parametercommand parametersthis 필드 값으로 둔다.

  8. this object를 null로 둔다.

  9. this parameter가 null이 아니면, this objectthis parameter, realmsession가 주어졌을 때 local value 역직렬화시도한 결과로 설정한다.

  10. function declarationcommand parametersfunctionDeclaration 필드 값으로 둔다.

  11. await promisecommand parametersawaitPromise 필드 값으로 둔다.

  12. serialization options를 존재하면 command parametersserializationOptions 필드 값으로 두고, 그렇지 않으면 필드가 기본값으로 설정된 script.SerializationOptions 생성규칙과 일치하는 으로 둔다.

  13. result ownership을 존재하면 command parametersresultOwnership 필드 값으로 두고, 그렇지 않으면 none으로 둔다.

  14. base URLenvironment settingsAPI base URL로 둔다.

  15. options기본 스크립트 fetch 옵션으로 둔다.

  16. function body evaluation statusfunction declaration, environment settings, base URL, 및 options함수 본문 평가의 결과로 둔다.

  17. function body evaluation status.[[Type]]이 throw이면:

    1. exception detailsrealm, function body evaluation status, result ownershipsession이 주어졌을 때 예외 세부 정보 가져오기의 결과로 둔다.

    2. exceptionDetails 필드가 exception details로 설정된 script.EvaluateResultException 생성규칙과 일치하는 새 을 반환한다.

  18. function objectfunction body evaluation status.[[Value]]로 둔다.

  19. IsCallable(function object)이 false이면:

    1. invalid argument error code와 함께 error를 반환한다

  20. command parameters["userActivation"]이 true이면, 활성화 알림 단계를 실행한다.

  21. environment settings스크립트 실행 준비를 수행한다.

  22. evaluation statusCall(function object, this object, deserialized arguments)로 설정한다.

  23. evaluation status.[[Type]]이 normal이고, await promisetrue이며, IsPromise(evaluation status.[[Value]])이면:

    1. evaluation statusAwait(evaluation status.[[Value]])로 설정한다.

  24. environment settings스크립트 실행 후 정리를 수행한다.

  25. evaluation status.[[Type]]이 throw이면:

    1. exception detailsrealm, evaluation status, result ownershipsession이 주어졌을 때 예외 세부 정보 가져오기의 결과로 둔다.

    2. exceptionDetails 필드가 exception details로 설정된 script.EvaluateResultException 생성규칙과 일치하는 새 을 반환한다.

  26. 단언: evaluation status.[[Type]]은 normal이다.

  27. resultevaluation status.[[Value]], serialization options, result ownership, serialization internal map으로서의 새 , realmsessionremote value로 직렬화한 결과로 둔다.

  28. realm 필드가 realm id로 설정되고 result 필드가 result로 설정된 script.EvaluateResultSuccess 생성규칙과 일치하는 새 을 반환한다.

7.6.4.4. script.evaluate 명령

script.evaluate 명령은 지정된 realm에서 제공된 스크립트를 평가한다. 편의를 위해 realm 대신 navigable을 제공할 수 있으며, 이 경우 사용되는 realm은 브라우징 컨텍스트의 활성 문서의 realm이다.

이 메서드는 제공된 스크립트를 실행한 값을 반환한다. 단, 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

TODO: timeout 인수를 추가한다. 이것이 어떻게 동작해야 하는지는 완전히 명확하지 않다. Chrome에서는 timeout이 promise resolve 단계에는 적용되지 않는 것처럼 보이지만, 이는 클라이언트가 원하는 것은 아닐 가능성이 높다.

sessioncommand parameters가 주어진 원격 끝 단계는 다음과 같다:

  1. realmcommand parameterstarget 필드 값이 주어졌을 때 target에서 realm 가져오기시도한 결과로 둔다.

  2. realm idrealmrealm id로 둔다.

  3. environment settingsrealm 실행 컨텍스트의 Realm 컴포넌트가 realmenvironment settings object로 둔다.

  4. sourcecommand parametersexpression 필드 값으로 둔다.

  5. await promisecommand parametersawaitPromise 필드 값으로 둔다.

  6. serialization options를 존재하면 command parametersserializationOptions 필드 값으로 두고, 그렇지 않으면 필드가 기본값으로 설정된 script.SerializationOptions 생성규칙과 일치하는 으로 둔다.

  7. result ownership을 존재하면 command parametersresultOwnership 필드 값으로 두고, 그렇지 않으면 none으로 둔다.

  8. options기본 스크립트 fetch 옵션으로 둔다.

  9. base URLenvironment settingsAPI base URL로 둔다.

  10. bypassDisabledScripting을 true로 둔다.

  11. scriptsource, environment settings, base URL, optionsbypassDisabledScriptingclassic script 생성한 결과로 둔다.

  12. command parameters["userActivation"]이 true이면, 활성화 알림 단계를 실행한다.

  13. environment settings스크립트 실행 준비를 수행한다.

  14. evaluation statusScriptEvaluation(script의 record)로 설정한다.

  15. evaluation status.[[Type]]이 normal이고, await promise가 true이며, IsPromise(evaluation status.[[Value]])이면:

    1. evaluation statusAwait(evaluation status.[[Value]])로 설정한다.

  16. environment settings스크립트 실행 후 정리를 수행한다.

  17. evaluation status.[[Type]]이 throw이면:

    1. exception detailsrealm, evaluation status, result ownershipsession예외 세부 정보 가져오기의 결과로 둔다.

    2. realm 필드가 realm id로 설정되고, exceptionDetails 필드가 exception details로 설정된 script.EvaluateResultException 생성규칙과 일치하는 새 을 반환한다.

  18. 단언: evaluation status.[[Type]]은 normal이다.

  19. resultevaluation status.[[Value]], serialization options, result ownership, serialization internal map으로서의 새 , realmsessionremote value로 직렬화한 결과로 둔다.

  20. realm 필드가 realm id로 설정되고 result 필드가 result로 설정된 script.EvaluateResultSuccess 생성규칙과 일치하는 새 을 반환한다.

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]
}
sessioncommand parameters를 사용한 원격 끝 단계는 다음과 같다:
  1. environment settingsexecution ready flag가 설정된 모든 environment settings object목록으로 둔다.

  2. command parameterscontext를 포함하면:

    1. navigablecommand parameters["context"]로 navigable 가져오기시도한 결과로 둔다.

    2. documentnavigable활성 문서로 둔다.

    3. navigable environment settings목록으로 둔다.

    4. environment settings의 각 settings에 대해:

      1. 다음 조건 중 하나라도 성립하면:

        settingsnavigable environment settings에 추가한다.

    5. environment settingsnavigable environment settings로 설정한다.

  3. realms를 목록으로 둔다.

  4. environment settings의 각 settings에 대해:

    1. realm infosettings가 주어졌을 때 realm info 가져오기의 결과로 둔다.

    2. command parameterstype을 포함하고 realm info["type"]이 command parameters["type"]와 같지 않으면 계속한다.

    3. realm info가 null이 아니면, realm inforealms에 추가한다.

  5. bodyrealms 필드가 realms로 설정된 script.GetRealmsResult 생성규칙과 일치하는 으로 둔다.

  6. 데이터 body와 함께 success를 반환한다.

중첩 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
sessioncommand parameters가 주어진 원격 끝 단계는 다음과 같다:
  1. scriptcommand parameters 안의 "script" 필드 값으로 둔다.

  2. preload script mapsession프리로드 스크립트 맵으로 둔다.

  3. preload script mapscript포함하지 않으면, no such script error code와 함께 error를 반환한다.

  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가 주어진 script 메시지 방출 단계이다:
  1. environment settingsrealm 실행 컨텍스트의 Realm 컴포넌트가 realmenvironment settings object로 둔다.

  2. related navigablesenvironment settings가 주어졌을 때 관련 navigable 가져오기의 결과로 둔다.

  3. session, "script.message" 및 related navigables가 주어졌을 때 event가 활성화되어 있음이면:

    1. channel properties가 "serializationOptions"를 포함하면, serialization optionschannel propertiesserializationOptions 필드 값으로 둔다. 그렇지 않으면 serialization options를 필드가 기본값으로 설정된 script.SerializationOptions 생성규칙과 일치하는 으로 둔다.

    2. channel properties가 "ownership"를 포함하면, ownership typechannel properties["ownership"]로 둔다. 그렇지 않으면 ownership type을 "none"으로 둔다.

    3. datamessage, serialization options, ownership type, serialization internal map으로서의 새 realm이 주어졌을 때 remote value로 직렬화한 결과로 둔다.

    4. sourcerealm소스 가져오기한 것으로 둔다.

    5. paramsscript.MessageParameters 생성규칙과 일치하는 으로 두며, channel 필드는 channel properties["channel"]로, data 필드는 data로, source 필드는 source로 설정한다.

    6. bodyparams 필드가 params로 설정된 script.Message 생성규칙과 일치하는 으로 둔다.

    7. sessionbody이벤트를 방출한다.

7.6.5.2. script.realmCreated 이벤트
이벤트 타입
script.RealmCreated = (
 method: "script.realmCreated",
 params: script.RealmInfo
)
원격 끝 이벤트 트리거는 다음과 같다:

window environment settings object 설정, worker environment settings object 설정 또는 worklet environment settings object 설정 알고리즘 중 하나가 호출될 때, settings object를 반환하기 직전에:

  1. environment settings를 새로 생성된 environment settings object로 둔다.

  2. realm infoenvironment settings가 주어졌을 때 realm info 가져오기의 결과로 둔다.

  3. realm info가 null이면 반환한다.

  4. related navigablesenvironment settings가 주어졌을 때 관련 navigable 가져오기의 결과로 둔다.

  5. bodyparams 필드가 realm info로 설정된 script.RealmCreated 생성규칙과 일치하는 으로 둔다.

  6. "script.realmCreated" 및 related navigables가 주어진 event가 활성화된 세션의 집합 안의 각 session에 대해:

    1. sessionbody이벤트를 방출한다.

구독 우선순위 2를 가진 원격 끝 구독 단계session, navigablesinclude global이 주어졌을 때 다음과 같다:

  1. environment settingsexecution ready flag가 설정된 모든 environment settings object의 목록으로 둔다.

  2. environment settings의 각 settings에 대해:

    1. related navigables를 새 집합으로 둔다.

    2. settings관련 전역 객체연관된 DocumentDocument이면:

      1. navigablesettings관련 전역 객체연관된 Documentnode navigable로 둔다.

      2. navigable이 null이면 계속한다.

      3. top-level traversiblenavigabletop-level traversable로 둔다.

      4. top-level traversiblenavigables 안에 없으면 계속한다.

      5. top-level traversiblerelated navigables에 추가한다.

      그렇지 않고, include global이 false이면 계속한다.

    3. realm infosettings가 주어졌을 때 realm info 가져오기의 결과로 둔다.

    4. realm info가 null이면 계속한다.

    5. bodyparams 필드가 realm info로 설정된 script.RealmCreated 생성규칙과 일치하는 으로 둔다.

    6. session, "script.realmCreated" 및 related navigables가 주어졌을 때 event가 활성화되어 있음이면:

      1. sessionbody이벤트를 방출한다.

여기의 순서를 더 잘 정의해야 하는가?

7.6.5.3. script.realmDestroyed 이벤트
이벤트 타입
script.RealmDestroyed = (
  method: "script.realmDestroyed",
  params: script.RealmDestroyedParameters
)

script.RealmDestroyedParameters = {
  realm: script.Realm
}

원격 끝 이벤트 트리거는 다음과 같다:
document를 사용하여 다음 unloading document cleanup steps를 정의한다:
  1. related navigables를 빈 집합으로 둔다.

  2. documentnavigablerelated navigables에 추가한다.

  3. documentworklet global scopes 안의 각 worklet global scope에 대해:

    1. realmworklet global scope관련 Realm으로 둔다.

    2. realm idrealm에 대한 realm id로 둔다.

    3. paramsrealm 필드가 realm id로 설정된 script.RealmDestroyedParameters 생성규칙과 일치하는 으로 둔다.

    4. bodyparams 필드가 params로 설정된 script.RealmDestroyed 생성규칙과 일치하는 으로 둔다.

    5. "script.realmDestroyed" 및 related navigables가 주어진 event가 활성화된 세션의 집합 안의 각 session에 대해:

      1. sessionbody이벤트를 방출한다.

  4. environment settings관련 전역 객체연관된 Documentdocumentenvironment settings object로 둔다.

  5. realmenvironment settingsrealm 실행 컨텍스트의 Realm 컴포넌트로 둔다.

  6. realm idrealm에 대한 realm id로 둔다.

  7. paramsrealm 필드가 realm id로 설정된 script.RealmDestroyedParameters 생성규칙과 일치하는 으로 둔다.

  8. bodyparams 필드가 params로 설정된 script.RealmDestroyed 생성규칙과 일치하는 으로 둔다.

  9. "script.realmDestroyed" 및 related navigables가 주어진 event가 활성화된 세션의 집합 안의 각 session에 대해:

    1. sessionbody이벤트를 방출한다.

worker event loop event loop가, worker가 생명주기의 끝에 도달했기 때문이든 worker 종료 알고리즘을 통해 조기에 종료되었기 때문이든 파괴될 때마다:

  1. environment settingsevent loopresponsible event loopenvironment settings object로 둔다.

  2. related navigablesenvironment settings가 주어졌을 때 관련 navigable 가져오기의 결과로 둔다.

  3. realmenvironment settingsenvironment settings object의 Realm으로 둔다.

  4. realm idrealm에 대한 realm id로 둔다.

  5. paramsrealm 필드가 realm id로 설정된 script.RealmDestroyedParameters 생성규칙과 일치하는 으로 둔다.

  6. bodyparams 필드가 params로 설정된 script.RealmDestroyed 생성규칙과 일치하는 으로 둔다.

7.7. storage 모듈

storage 모듈은 저장소와 관련된 기능 및 이벤트를 포함한다.

storage partition은 사용자 에이전트가 쿠키 및 local storage 같은 영속 데이터를 조직할 수 있는 이름공간이다.

storage partition keystorage partition을 고유하게 식별하는 이다.

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 타입은 storage partition key를 나타낸다.

다음 표준 storage partition key 속성 표원격 끝이 지원하기로 선택할 수 있는, 잘 알려진 의미를 가진 속성들을 열거한다. 구현은 추가 확장 storage partition key 속성을 정의할 수 있다.

속성 정의
"userContext" 사용자 컨텍스트 id
"sourceOrigin" storage partition에 접근할 수 있는 리소스의 origin 직렬화

원격 끝은 임의 개수의 확장 storage partition key 속성을 지원할 수 있다. 다른 구현과의 충돌을 피하기 위해, 이러한 속성은 벤더 및 사용자 에이전트에 대한 고유 식별자로 시작하고 그 뒤에 U+003A (:)가 와야 한다.

원격 끝은 0개 이상의 엔트리를 포함하는 storage partition key 속성의 기본값에 대한 을 가진다. 각 키는 storage partition key가 표준 storage partition에 대응하는 경우 표준 storage partition key 속성 표의 구성원이어야 하며, 그렇지 않은 경우 확장 storage partition key 속성이어야 한다. 값은 사용자가 명시적 값을 제공하지 않을 때 사용될 해당 partition key의 기본값을 나타낸다. 정확한 엔트리는 구현 정의이며 구현이 채택한 storage partitioning에 의해 결정된다.

원격 끝은 0개 이상의 엔트리를 포함하는 필수 partition key 속성목록을 가진다. 각 키는 storage partition key가 표준 storage partition에 대응하는 경우 표준 storage partition key 속성 표의 구성원이어야 하며, 그렇지 않은 경우 확장 storage partition key 속성이어야 한다. 정확한 엔트리는 구현 정의이며 구현이 채택한 storage partitioning에 의해 결정된다. 이 목록에는 기본값을 사용할 수 없는 partition key만 포함된다. 따라서 이 목록은 storage partition key 속성의 기본값의 키와 엔트리를 공유해서는 안 된다.

filter가 주어졌을 때 filter를 역직렬화하려면:
  1. deserialized filter를 빈 으로 둔다.

  2. filter 안의 각 namevalue에 대해:

    1. deserialized namecookie 변환 표에서 JSON 키 name에 대응하는 필드 이름으로 둔다.

    2. name이 "value"이면, deserialized valuevalue프로토콜 bytes 역직렬화한 것으로 설정하고, 그렇지 않으면 deserialized valuevalue로 둔다.

    3. deserialized filter[deserialized name]를 deserialized value설정한다.

  3. deserialized filter를 반환한다.

partition spec이 주어졌을 때 storage partition spec 확장하려면:
  1. partition spec이 null이면:

    1. partition spec을 빈 으로 설정한다.

  2. 그렇지 않고, partition spec["type"]이 "context"이면:

    1. navigablepartition spec["context"]가 주어졌을 때 navigable 가져오기시도한 결과로 둔다.

    2. partition keynavigable연관된 storage partitionkey로 둔다.

    3. 데이터 partition key와 함께 success를 반환한다.

  3. partition key를 빈 으로 둔다.

  4. storage partition key 속성의 기본값 안의 각 namedefault value에 대해:

    1. value를, partition spec[name]이 존재하면 그것으로 두고, 그렇지 않으면 default value로 둔다.

    2. partition key[name]을 value설정한다.

  5. remote end의 필수 partition key 속성 안의 각 name에 대해:

    1. partition spec[name]이 존재하면:

      1. partition key][name]을 partition spec[name]로 설정한다.

    2. 그렇지 않으면:

      1. underspecified storage partition error code와 함께 error를 반환한다.

  6. 데이터 partition key와 함께 success를 반환한다.

storage partition key가 주어졌을 때 cookie store 가져오기를 하려면:
  1. storage partition key가 현존하는 storage partition을 고유하게 식별하면:

    1. store를 해당 storage partitioncookie store로 둔다.

    2. 데이터 store와 함께 success를 반환한다.

  2. no such storage partition error code와 함께 error를 반환한다.

stored cookiefilter가 주어졌을 때 cookie 일치를 하려면:
  1. filter 안의 각 namevalue에 대해:

    1. stored cookie[name]이 value와 같지 않으면:

      1. false를 반환한다.

  2. true를 반환한다.

cookie storefilter가 주어졌을 때 일치하는 cookie 가져오기를 하려면:
  1. cookies를 새 목록으로 둔다.

  2. deserialized filterfilterfilter 역직렬화한 것으로 설정한다.

  3. cookie store 안의 각 stored cookie에 대해:

    1. stored cookiedeserialized filtercookie 일치한 결과가 true이면:

      1. stored cookiecookies에 추가한다.

  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,
}
sessioncommand parameters를 사용한 원격 끝 단계는 다음과 같다:
  1. filtercommand parametersfilter 필드 값으로 둔다. 존재하면 그 값으로 두고, 존재하지 않으면 빈 으로 둔다.

  2. partition speccommand parameterspartition 필드 값으로 둔다. 존재하면 그 값으로 두고, 존재하지 않으면 null로 둔다.

  3. partition keypartition specstorage partition spec 확장시도한 결과로 둔다.

  4. storepartition keycookie store 가져오기시도한 결과로 둔다.

  5. cookiesstorefilter일치하는 cookie 가져오기한 결과로 둔다.

  6. serialized cookies를 새 목록으로 둔다.

  7. cookies 안의 각 cookie에 대해:

    1. serialized cookiecookie가 주어졌을 때 cookie 직렬화의 결과로 둔다.

    2. serialized cookieserialized cookies에 추가한다.

  8. bodycookies 필드가 serialized cookies로, partitionKey 필드가 partition key로 설정된 storage.GetCookiesResult 생성규칙과 일치하는 으로 둔다.

  9. 데이터 body와 함께 success를 반환한다.

7.7.3.2. storage.setCookie 명령

storage.setCookie 명령은 cookie store 안에 새 cookie를 생성하며, [COOKIES]에 따라 일치하는 해당 store 안의 모든 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
}
sessioncommand parameters를 사용한 원격 끝 단계는 다음과 같다:
  1. cookie speccommand parameterscookie 필드 값으로 둔다.

  2. partition speccommand parameterspartition 필드 값으로 둔다. 존재하면 그 값으로 두고, 존재하지 않으면 null로 둔다.

  3. partition keypartition specstorage partition spec 확장시도한 결과로 둔다.

  4. storepartition keycookie store 가져오기시도한 결과로 둔다.

  5. deserialized valuecookie spec["value"]로 프로토콜 bytes 역직렬화한 것으로 둔다.

  6. store 안에 cookie name cookie spec["name"], cookie value deserialized value, cookie domain cookie spec["domain"], 그리고 cookie 변환 표에 열거된 다음 cookie 개념의 attribute-value 목록을 사용하여 cookie를 생성한다:

    Cookie path

    존재하면 cookie spec["path"], 그렇지 않으면 "/".

    Cookie secure only

    존재하면 cookie spec["secure"], 그렇지 않으면 false.

    Cookie HTTP only

    존재하면 cookie spec["httpOnly"], 그렇지 않으면 false.

    Cookie expiry time

    존재하면 cookie spec["expiry"], 그렇지 않으면 이것이 session cookie임을 나타내도록 설정하지 않은 채로 둔다.

    참고: cookie의 expiry 값은 Cookie Lifetime Limits에 따라 remote end에 의해 제한될 수 있다.

    Cookie same site

    존재하면 cookie spec["sameSite"], 그렇지 않으면 same site policy가 정의되지 않았음을 나타내도록 설정하지 않은 채로 둔다.

    이 단계가 cookie store에 cookie를 삽입하지 못하고 중단되면, unable to set cookie error code와 함께 error를 반환한다.

  7. bodypartitionKey 필드가 partition key로 설정된 storage.SetCookieResult 생성규칙과 일치하는 으로 둔다.

  8. 데이터 body와 함께 success를 반환한다.

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
}
sessioncommand parameters를 사용한 원격 끝 단계는 다음과 같다:
  1. filtercommand parametersfilter 필드 값으로 둔다. 존재하면 그 값으로 두고, 존재하지 않으면 빈 으로 둔다.

  2. partition speccommand parameterspartition 필드 값으로 둔다. 존재하면 그 값으로 두고, 존재하지 않으면 null로 둔다.

  3. partition keypartition specstorage partition spec 확장시도한 결과로 둔다.

  4. storepartition keycookie store 가져오기시도한 결과로 둔다.

  5. cookiesstorefilter일치하는 cookie 가져오기한 결과로 둔다.

  6. cookies 안의 각 cookie에 대해:

    1. cookiestore에서 제거한다.

  7. bodypartitionKey 필드가 partition key로 설정된 storage.DeleteCookiesResult 생성규칙과 일치하는 으로 둔다.

  8. 데이터 body와 함께 success를 반환한다.

7.8. log 모듈

log 모듈은 로깅과 관련된 기능 및 이벤트를 포함한다.

BiDi Sessionlog event buffer를 가지며, 이는 navigable id에서 아직 방출되지 않은 해당 컨텍스트의 log event 목록으로 가는 이다. 사용자 에이전트는 이 buffer에 최대 크기를 부과할 수 있으며, 단 이벤트 A와 B가 같은 컨텍스트에서 발생하고 A가 B보다 먼저 발생했으며 둘 다 buffer에 추가된 경우, B에 대한 엔트리가 A에 대한 엔트리보다 먼저 제거되어서는 안 된다는 조건을 따른다.

session, navigablesevent가 주어졌을 때 log event 버퍼링하려면:

  1. buffersessionlog event buffer로 둔다.

  2. navigable ids를 새 목록으로 둔다.

  3. navigables의 각 navigable에 대해:

    1. navigable에 대한 navigable idnavigable ids에 추가한다.

  4. navigable ids 안의 각 navigable id에 대해:

    1. other navigables를 빈 목록으로 둔다

    2. navigable ids 안의 각 other id에 대해:

    3. other idnavigable id와 같지 않으면, other idother navigables에 추가한다.

    4. buffernavigable id를 포함하지 않으면, buffer[navigable id]를 새 목록으로 둔다.

    5. (event, other navigables)를 buffer[navigable id]에 추가한다.

참고: 각 이벤트가 한 번만 방출되도록 하기 위해 여기에서 다른 navigable을 저장한다. 실제로 이는 여러 navigable과 연관될 수 있는 worker에 대해서만 관련된다.

이것을 browsing context 또는 top-level traversable 중 무엇을 키로 삼을지? 차이는 프레임에서 이벤트가 발생한 뒤 로컬 끝이 최상위 navigable의 log event를 구독하기 전에 그 프레임이 탐색되는 경우에 무엇이 일어나는가에 있다.

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 event는 log.Entry 객체로 표현된다. 이는 추가된 log entry의 타입을 나타내는 type 속성, 심각도를 나타내는 level 속성, log entry의 출처를 나타내는 source 속성, log message 문자열 자체를 가진 text 속성, 그리고 log entry가 생성된 시간에 대응하는 timestamp 속성을 가진다. 서로 다른 소스의 로그를 표현하기 위해 log.Entry의 특정 variant가 사용되며, entry 타입에 특화된 추가 필드를 제공한다.

7.8.3. 이벤트

7.8.3.1. log.entryAdded 이벤트
이벤트 타입
log.EntryAdded = (
 method: "log.entryAdded",
 params: log.Entry,
)

원격 끝 이벤트 트리거는 다음과 같다:

method, args, 그리고 options를 사용하여 다음 console steps를 정의한다:

  1. 활성 BiDi 세션 안의 각 session에 대해:

    1. method가 "error" 또는 "assert"이면 level을 "error"로 둔다. method가 "debug" 또는 "trace"이면 level을 "debug"로 둔다. method가 "warn"이면 level을 "warn"로 둔다. 그렇지 않으면 level을 "info"로 둔다.

    2. timestamp를 UTC의 현재 날짜와 시간을 나타내는 time value로 둔다.

    3. text를 빈 문자열로 둔다.

    4. args[0]의 Type이 String이고 args[0]이 formatting specifier를 포함하면, formatted argsFormatter(args)로 둔다. 그렇지 않으면 formatted argsargs로 둔다.

      참고: formatter 연산은 console 명세에서 덜 정의되어 있으므로, formatting은 서로 다른 구현 간에 일관되지 않을 수 있다.

    5. formatted args 안의 각 arg에 대해:

      1. argargs의 첫 번째 엔트리가 아니면, U+0020 SPACE를 text에 추가한다.

      2. argprimitive ECMAScript value이면, ToString(arg)을 text에 추가한다. 그렇지 않으면 구현 정의 문자열을 text에 추가한다.

    6. realm현재 Realm Recordrealm id로 둔다.

    7. serialized args를 새 목록으로 둔다.

    8. serialization options를 필드가 기본값으로 설정된 script.SerializationOptions 생성규칙과 일치하는 으로 둔다.

    9. args의 각 arg에 대해:

      1. serialized arg를 값으로 arg, serialization options, ownership type으로 none, serialization internal map으로 새 , realmsession을 사용하여 remote value로 직렬화한 결과로 둔다.

      2. serialized argserialized args에 추가한다.

    10. source현재 Realm Record가 주어졌을 때 source 가져오기의 결과로 둔다.

    11. stack현재 stack trace로 둔다.

    12. entrylevel 필드가 level로, text 필드가 text로, timestamp 필드가 timestamp로, stackTrace 필드가 stack로, method 필드가 method로, source 필드가 source로, 그리고 args 필드가 serialized args로 설정된 log.ConsoleLogEntry 생성규칙과 일치하는 으로 둔다.

    13. bodyparams 필드가 entry로 설정된 log.EntryAdded 생성규칙과 일치하는 으로 둔다.

    14. settingscurrent settings object로 둔다

    15. related navigablessettings가 주어졌을 때 관련 navigable 가져오기의 결과로 둔다.

    16. session, "log.entryAdded" 및 related navigablesevent가 활성화되면, sessionbodyevent를 방출한다.

      그렇지 않으면, session, related browsing contexts, 그리고 bodylog event를 버퍼링한다.

script, line number, column number, messagehandled 인자를 사용하여 다음 error reporting steps를 정의한다:

  1. handled가 true이면 반환한다.

  2. settingsscriptsettings object로 둔다.

  3. timestamp를 UTC의 현재 날짜와 시간을 나타내는 time value로 둔다.

  4. stack을 보고되는 error에 대응하는 exception으로 exception의 stack trace한 것으로 둔다.

  5. source현재 Realm Record가 주어졌을 때 source 가져오기의 결과로 둔다.

  6. entrylevel이 "error"로, textmessage로, sourcesource로, timestamptimestamp로, 그리고 stackTrace 필드가 stack로 설정된 log.JavascriptLogEntry 생성규칙과 일치하는 으로 둔다.

  7. bodyparams 필드가 entry로 설정된 log.EntryAdded 생성규칙과 일치하는 으로 둔다.

  8. related navigablessettings가 주어졌을 때 관련 navigable 가져오기의 결과로 둔다.

  9. 활성 BiDi 세션 안의 각 session에 대해:

    1. session, "log.entryAdded" 및 related navigablesevent가 활성화되면, sessionbodyevent를 방출한다.

      그렇지 않으면, session, related browsing contexts, 그리고 bodylog event를 버퍼링한다.

훨씬 더 많은 것들이 로깅을 필요로 한다. CDP에는 LogEntryAdded 타입으로 xml, javascript, network, storage, appcache, rendering, security, deprecation, worker, violation, intervention, recommendation, other가 있다. 이들은 별도의 메서드로 표현되는 js exception 및 console API 타입에 더해 존재한다.

구현 정의 log 타입 허용

session, navigablesinclude global이 주어지고, 구독 우선순위 10을 가지는 원격 끝 구독 단계는 다음과 같다:

  1. sessionlog event buffer 안의 각 navigable idevents에 대해:

    1. maybe contextnavigable id가 주어졌을 때 navigable 가져오기의 결과로 둔다.

    2. maybe contexterror이면, log event buffer에서 navigable id를 제거하고 계속한다.

    3. navigablemaybe context의 data로 둔다

    4. top level navigablenavigabletop-level traversable로 둔다.

    5. include global이 true이고 top level navigablenavigables 안에 없거나, 또는 include global이 false이고 top level navigablenavigables 안에 있으면:

      1. events 안의 각 (event, other navigables)에 대해:

        1. sessioneventevent를 방출한다.

        2. other navigables 안의 각 other context id에 대해:

          1. log event bufferother context id를 포함하면, log event buffer[other context id]에서 event를 제거한다.

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. objectinput.ElementOrigin 생성규칙과 일치하는 이면 true를 반환한다.

  2. false를 반환한다.

session이 주어졌을 때 get Element from input.ElementOrigin 단계를 얻으려면:
  1. originnavigable이 주어진 다음 단계를 반환한다:

    1. Assert: origininput.ElementOrigin과 일치한다.

    2. documentnavigable활성 문서로 둔다.

    3. referenceorigin["element"]로 둔다

    4. environment settings관련 전역 객체연관된 Documentdocument환경 설정 객체로 둔다.

    5. realmenvironment settingsrealm 실행 컨텍스트의 Realm 컴포넌트로 둔다.

    6. elementreference, realm, 그리고 session으로 원격 참조 역직렬화시도한 결과로 둔다.

    7. elementElement를 구현하지 않으면, errorerror code no such element와 함께 반환한다.

    8. 데이터 element와 함께 success를 반환한다.

7.9.3. 명령

7.9.3.1. input.performActions 명령

input.performActions 명령은 지정된 사용자 입력 동작 시퀀스를 수행한다.

참고: 이 명령의 동작에 대한 자세한 설명은 [WEBDRIVER]actions 섹션을 참조한다.

명령 타입
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

sessioncommand parameters를 사용한 원격 끝 단계는 다음과 같다:

  1. navigable idcommand parameterscontext 필드 값으로 둔다.

  2. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

  3. input statesessionnavigabletop-level traversableinput state 가져오기한 것으로 둔다.

  4. actions options를, is element origin 단계가 is input.ElementOrigin으로 설정되고, get element origin 단계가 session이 주어졌을 때 get Element from input.ElementOrigin steps의 결과로 설정된 새 actions options로 둔다.

  5. actions by tickinput state, command parameters, 그리고 actions optionsaction sequence 추출을 시도한 결과로 둔다.

  6. input state, actions by tick, navigable, 그리고 actions optionsactions 디스패치시도한다.

  7. 데이터 null과 함께 success를 반환한다.

7.9.3.2. input.releaseActions 명령

input.releaseActions 명령은 현재 세션과 연관된 input state를 재설정한다.

명령 타입
input.ReleaseActions = (
  method: "input.releaseActions",
  params: input.ReleaseActionsParameters
)

input.ReleaseActionsParameters = {
  context: browsingContext.BrowsingContext,
}
반환 타입
input.ReleaseActionsResult = EmptyResult

sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:

  1. navigable idcommand parameterscontext 필드 값으로 둔다.

  2. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

  3. top-level traversablenavigabletop-level traversable로 둔다.

  4. input statesessiontop-level traversableinput state 가져오기한 것으로 둔다.

  5. actions options를, is element origin 단계가 is input.ElementOrigin으로 설정되고, get element origin 단계가 session이 주어진 get Element from input.ElementOrigin steps로 설정된 새 actions options로 둔다.

  6. undo actionsinput stateinput cancel list를 역순으로 한 것으로 둔다.

  7. undo actions, 0, navigable, 그리고 actions optionstick actions 디스패치시도한다.

  8. sessiontop-level traversableinput state 재설정을 수행한다.

  9. 데이터 null과 함께 success를 반환한다.

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

sessioncommand parameters가 주어졌을 때 원격 끝 단계는 다음과 같다:

  1. navigable idcommand parameters["context"] 필드 값으로 둔다.

  2. navigablenavigable idnavigable 가져오기시도한 결과로 둔다.

  3. documentnavigable활성 문서로 둔다.

  4. environment settings관련 전역 객체연관된 Documentdocument환경 설정 객체로 둔다.

  5. realmenvironment settingsrealm 실행 컨텍스트의 Realm 컴포넌트로 둔다.

  6. elementcommand parameters["element"], realm, 그리고 session원격 참조 역직렬화시도한 결과로 둔다.

  7. elementElement를 구현하지 않으면, errorerror code no such element와 함께 반환한다.

  8. elementHTMLInputElement를 구현하지 않거나, elementtypeFile Upload state에 있지 않거나, 또는 elementdisabled이면, errorerror code unable to set file input과 함께 반환한다.

  9. files크기가 1보다 크고 elementmultiple 속성이 설정되어 있지 않으면, errorerror code unable to set file input과 함께 반환한다.

  10. filescommand parameters["files"] 필드 값으로 둔다.

  11. selected fileselementselected files로 둔다.

  12. filesselected files교집합크기selected files크기와 같고, files크기와도 같으면, element가 주어졌을 때 사용자 상호작용 task source에서 element에 대해 bubbles 속성이 true로 초기화된 cancel이라는 이름의 이벤트를 발화하도록 요소 task를 큐에 넣는다.

    참고: 브라우저에서 취소는 일반적으로 파일 선택의 변경으로 판단된다. 즉 변경이 없으면 "cancel" 이벤트가 전송된다.

  13. 그렇지 않으면, files를 사용자의 선택으로 하여 element에 대한 파일 선택을 갱신한다.

  14. 어떤 이유로든 원격 끝이 elementselected filesfiles에 주어진 경로의 파일로 설정할 수 없으면, error code unsupported operation과 함께 error를 반환한다.

    참고: 예를 들어 원격 끝은 현재 파일 시스템에 존재하지 않는 파일을 selected files로 설정하지 못할 수 있다.

  15. 데이터 null과 함께 success를 반환한다.

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 file picker options구조체로, boolean인 multiple이라는 항목을 가진다.

원격 끝 이벤트 트리거요소 element와 선택적으로 WebDriver BiDi file picker options file picker options (기본값: null)가 주어졌을 때의 WebDriver BiDi file dialog opened 단계이다:

참고: 다른 사용자 프롬프트 핸들러와 달리 기본 동작은 파일 대화상자가 열리는 것을 허용하는 것이다.

  1. navigableelement노드 문서navigable로 둔다.

  2. navigable idnavigablenavigable id로 둔다.

  3. user context idnavigable연관된 사용자 컨텍스트사용자 컨텍스트 id로 둔다.

  4. multiplefalse로 둔다.

  5. element가 null이 아니고 elementmultiple 속성이 설정되어 있으면, multipletrue로 설정한다.

  6. file picker options가 null이 아니고 file picker optionsmultiple이 true이면, multipletrue로 설정한다.

  7. related navigablesnavigable을 포함하는 집합으로 둔다.

  8. "input.fileDialogOpened" 및 related navigables가 주어졌을 때의 이벤트가 활성화된 세션 집합에 있는 각 session에 대해:

    1. paramscontext 필드가 navigable id로, userContext 필드가 user context id로, multiple 필드가 multiple로 설정되고 input.FileDialogInfo 생성규칙과 일치하는 으로 둔다.

    2. element가 null이 아니면:

      1. shared idelementsession으로 노드에 대한 shared id 가져오기를 수행한 것으로 둔다.

      2. params["element"]를 shared id로 설정한다.

    3. bodyparams 필드가 params로 설정되고 input.fileDialogOpened 생성규칙과 일치하는 으로 둔다.

    4. sessionbody이벤트를 방출한다.

  9. dismissed를 false로 둔다.

  10. 활성 BiDi 세션에 있는 각 session에 대해:

    1. user prompt handlersessionuser prompt handler로 둔다.

    2. user prompt handler가 null이 아니면:

    3. Assert 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 모듈은 웹 확장을 관리하고 상호작용하기 위한 기능을 포함한다.

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 타입은 원격 끝 내의 웹 확장 id를 나타낸다.

7.10.3. 명령

7.10.3.1. webExtension.install 명령

webExtension.install 명령은 원격 끝에 웹 확장을 설치한다.

명령 타입
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 archive 추출을 수행하려면:
  1. zip 압축 알고리즘을 사용하여 bytes를 디코딩하는 구현 정의 단계를 수행한다. TODO: zip 디코딩에 대한 더 나은 참조를 찾는다.

  2. 이전 단계가 실패하면(예: bytes가 유효한 zip 압축 데이터를 나타내지 않았기 때문에), error를 error code invalid web extension과 함께 반환한다. 그렇지 않으면 entry를 추출된 파일 시스템 엔트리를 포함하는 디렉터리 엔트리로 둔다.

  3. entry를 반환한다.

extension data spec가 주어졌을 때 web extension data spec 확장을 수행하려면:
  1. typeextension data spec["type"]로 둔다.

  2. type을 사용한 웹 확장 설치가 지원되지 않으면 errorerror code unsupported operation과 함께 반환한다.

  3. 다음 조건과 관련 단계 목록에서, 관련 조건이 true인 첫 번째 단계 집합을 실행한다:

    type이 문자열 "path"인 경우
    1. pathextension data spec["path"]로 둔다.

    2. locatorpathpath와 파일 시스템의 루트에 대응하는 root를 가진 디렉터리 locator로 둔다.

    3. entrylocator가 주어진 엔트리 찾기로 둔다.

    type이 문자열 "archivePath"인 경우
    1. archive pathextension data spec["path"]로 둔다.

    2. locatorarchive pathpath와 파일 시스템의 루트에 대응하는 root를 가진 파일 locator로 둔다.

    3. archive entrylocator가 주어진 엔트리 찾기로 둔다.

    4. archive entry가 null이면 null을 반환한다.

    5. bytesarchive entry바이너리 데이터로 둔다.

    6. entrybytes가 주어졌을 때 zip archive 추출시도한 결과로 둔다.

    type이 문자열 "base64"인 경우
    1. bytesextension data spec["value"]를 forgiving-base64 decode한 것으로 둔다.

    2. bytes가 failure이면 null을 반환한다.

    3. entrybytes가 주어졌을 때 zip archive 추출시도한 결과로 둔다.

  4. entry를 반환한다.

command parameters를 사용한 원격 끝 단계는 다음과 같다:
  1. 웹 확장 설치가 지원되지 않으면 error를 error code unsupported operation과 함께 반환한다.

  2. extension data speccommand parameters["extensionData"]로 둔다.

  3. extension directory entryextension data spec으로 web extension data spec 확장시도한 결과로 둔다.

  4. extension directory entry가 null이면, errorerror code invalid web extension과 함께 반환한다.

  5. extension directory entry에서 웹 확장을 설치하기 위한 구현 정의 단계를 수행한다. 이것이 실패하면 errorerror code invalid web extension과 함께 반환한다. 그렇지 않으면 extension id를 새로 설치된 웹 확장의 고유 식별자로 둔다.

  6. resultextension 필드가 extension id로 설정되고 webExtension.InstallResult 생성규칙과 일치하는 으로 둔다.

  7. 데이터 result와 함께 success를 반환한다.

참고: 브라우저는 기본적으로 웹 확장을 일시적으로만 설치할 수 있으며, 따라서 다음 종료 시 자동으로 제거될 수 있다.

7.10.3.2. webExtension.uninstall 명령

webExtension.uninstall 명령은 원격 끝에 대해 웹 확장을 제거한다.

명령 타입
webExtension.Uninstall = (
   method: "webExtension.uninstall",
   params: webExtension.UninstallParameters
)

webExtension.UninstallParameters = {
   extension: webExtension.Extension,
}
반환 타입
webExtension.UninstallResult = EmptyResult
command parameters를 사용한 원격 끝 단계는 다음과 같다:
  1. extensioncommand parameters["extension"]으로 둔다.

  2. 원격 끝extension과 같은 id를 가진 웹 확장이 없으면, errorerror code no such web extension과 함께 반환한다.

  3. 원격 끝에서 웹 확장을 제거하기 위한 임의의 구현 정의 단계를 수행한다. 이것이 실패하면 errorerror code unknown error와 함께 반환한다.

  4. 데이터 null과 함께 success를 반환한다.

8. 다른 명세에 대한 패치

이 명세는 필요한 통합 지점을 제공하기 위해 외부 명세에 대한 일부 변경을 요구한다. 이러한 패치는 표준화 과정의 일부로 다른 명세에 커밋될 것으로 가정한다.

8.1. HTML

오류 보고 알고리즘은 끝에 추가 단계가 있는 것으로 수정된다:

  1. 외부 명세에 정의된 모든 오류 보고 단계script, line, col, message, 그리고 오류가 처리된 경우 true, 그렇지 않은 경우 false와 함께 호출한다.

8.2. Console

다른 명세는 console steps를 정의할 수 있다.

  1. Printer 연산이 인자 name, printerArgsoptions(인자가 제공되지 않으면 undefined)로 호출되는 시점에, 외부 명세에 정의된 모든 console steps를 인자 name, printerArgs, 그리고 options와 함께 호출한다.

8.3. CSS

8.3.1. device pixel ratio 결정

device pixel ratio 결정 알고리즘의 시작 부분에 다음 단계를 삽입한다:

  1. device pixel ratio overrideswindownavigable포함하면, device pixel ratio overrides[windownavigable]를 반환한다.

9. 부록

이 섹션은 비규범적이다.

9.1. 외부 명세

참고: 이 목록은 완전하지 않으며 최신이 아닐 수 있다.

다음 외부 명세는 추가 WebDriver BiDi 모듈을 정의한다:

  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월. 제안 표준. URL: https://httpwg.org/specs/rfc6265.html
[CORE-AAM-1.1]
Joanmarie Diggs; et al. Core Accessibility API Mappings 1.1. URL: https://w3c.github.io/core-aam/
[CSS-COLOR-ADJUST-1]
Elika Etemad; et al. CSS Color Adjustment Module Level 1. URL: https://drafts.csswg.org/css-color-adjust-1/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. URL: https://drafts.csswg.org/css-overflow-3/
[CSS-PAINT-API-1]
Ian Kilpatrick; Dean Jackson. CSS Painting API Level 1. URL: https://drafts.css-houdini.org/css-paint-api-1/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) 명세. URL: https://drafts.csswg.org/css2/
[CSSOM-VIEW-1]
Simon Fraser; Emilio Cobos Álvarez. CSSOM View Module. 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 Module Level 1. URL: https://drafts.csswg.org/geometry/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. 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/
[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월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc4648
[RFC5280]
D. Cooper; et al. Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. 2008년 5월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc5280
[RFC6455]
I. Fette; A. Melnikov. WebSocket 프로토콜. 2011년 12월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc6455
[RFC8610]
H. Birkholz; C. Vigano; C. Bormann. Concise Data Definition Language (CDDL): Concise Binary Object Representation(CBOR) 및 JSON 데이터 구조를 표현하기 위한 표기 규칙. 2019년 6월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc8610
[RFC9110]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP Semantics. 2022년 6월. 인터넷 표준. URL: https://httpwg.org/specs/rfc9110.html
[RFC9562]
K. Davis; B. Peabody; P. Leach. Universally Unique IDentifiers (UUIDs). 2024년 5월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc9562
[SCREEN-ORIENTATION]
Marcos Caceres. Screen Orientation. URL: https://w3c.github.io/screen-orientation/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. URL: https://drafts.csswg.org/selectors/
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers Nightly. URL: https://w3c.github.io/ServiceWorker/
[SVG2]
Amelia Bellamy-Royds; et al. Scalable Vector Graphics (SVG) 2. URL: https://w3c.github.io/svgwg/svg2-draft/
[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]
Nidhi Jaju; Victor Vasiliev; Jan-Ivar Bruaroey. WebTransport. URL: https://w3c.github.io/webtransport/

정보성 참고문헌

[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월. 인터넷 표준. URL: https://httpwg.org/specs/rfc9112.html
[JSON-RPC]
JSON-RPC Working Group. JSON-RPC 2.0 명세. 2013년 1월 4일. URL: https://www.jsonrpc.org/specification
[RFC6265BIS]
Cookies: HTTP 상태 관리 메커니즘. 편집자 초안. 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 표준. 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.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.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.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,
}

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

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.TraverseHistory = (
  method: "browsingContext.traverseHistory",
  params: browsingContext.TraverseHistoryParameters
)

browsingContext.TraverseHistoryParameters = {
  context: browsingContext.BrowsingContext,
  delta: js-int,
}

EmulationCommand = (
  emulation.SetForcedColorsModeThemeOverride //
  emulation.SetGeolocationOverride //
  emulation.SetLocaleOverride //
  emulation.SetNetworkConditions //
  emulation.SetScreenOrientationOverride //
  emulation.SetScreenSettingsOverride //
  emulation.SetScriptingEnabled //
  emulation.SetScrollbarTypeOverride //
  emulation.SetTimezoneOverride //
  emulation.SetTouchOverride //
  emulation.SetUserAgentOverride
)


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.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.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.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.EvaluateResult = (
  script.EvaluateResultSuccess /
  script.EvaluateResultException
)

script.EvaluateResultSuccess = {
  type: "success",
  result: script.RemoteValue,
  realm: script.Realm
}

script.EvaluateResultException = {
  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,
}

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
)

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 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.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: {
    acceptInsecureCerts: bool,
    browserName: text,
    browserVersion: text,
    platformName: text,
    setWindowRect: bool,
    userAgent: text,
    ? proxy: session.ProxyConfiguration,
    ? unhandledPromptBehavior: session.UserPromptHandler,
    ? webSocketUrl: text,
    Extensible
  }
}

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.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.Info = {
  children: browsingContext.InfoList / null,
  clientWindow: browser.ClientWindow,
  context: browsingContext.BrowsingContext,
  originalOpener: browsingContext.BrowsingContext / null,
  url: text,
  userContext: browser.UserContext,
  ? parent: browsingContext.BrowsingContext / null,
}

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.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.TraverseHistoryResult = EmptyResult

browsingContext.ContextCreated = (
 method: "browsingContext.contextCreated",
 params: browsingContext.Info
)

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 = {
  suggestedFilename: text,
  browsingContext.BaseNavigationInfo
}

browsingContext.DownloadEnd = (
  method: "browsingContext.downloadEnd",
  params: browsingContext.DownloadEndParams
)

browsingContext.DownloadEndParams = {
  (
    browsingContext.DownloadCanceledParams //
    browsingContext.DownloadCompleteParams
  )
}

browsingContext.DownloadCanceledParams = (
  status: "canceled",
  browsingContext.BaseNavigationInfo
)

browsingContext.DownloadCompleteParams = (
  status: "complete",
  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.SetScreenOrientationOverrideResult /
  emulation.SetScriptingEnabledResult /
  emulation.SetScrollbarTypeOverrideResult /
  emulation.SetTimezoneOverrideResult /
  emulation.SetTouchOverrideResult /
  emulation.SetUserAgentOverrideResult
)

emulation.SetForcedColorsModeThemeOverrideResult = EmptyResult

emulation.SetGeolocationOverrideResult = EmptyResult

emulation.SetLocaleOverrideResult = EmptyResult

emulation.SetNetworkConditionsResult = EmptyResult

emulation.SetScreenSettingsOverrideResult = EmptyResult

emulation.SetScreenOrientationOverrideResult = EmptyResult

emulation.SetUserAgentOverrideResult = EmptyResult

emulation.SetScriptingEnabledResult = EmptyResult

emulation.SetScrollbarTypeOverrideResult = 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.EvaluateResult = (
  script.EvaluateResultSuccess /
  script.EvaluateResultException
)

script.EvaluateResultSuccess = {
  type: "success",
  result: script.RemoteValue,
  realm: script.Realm
}

script.EvaluateResultException = {
  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.EvaluateResult

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가 원한다면 listener를 닫을 수 있도록 세션 종료에 연결해야 한다.
sandbox realm 생성을 정의한다. 이것은 window를 래핑하는 SandboxWindowProxy를 반환하게 된다.
SandboxProxy가 작동하는 방식을 자세히 정의한다
이것이 어떻게 작동하는지 정의한다.
사용자 컨텍스트 개념이나 저장소와의 상호작용을 형식적으로 정의하는 최선의 방법인지 명확하지 않다.
null이 아닌 opener를 가진 최상위 traversable은 해당 opener와 같은 연관된 사용자 컨텍스트를 가진다고 지정해야 하는가? 기존 구현이 이것을 강제하는지 확인해야 한다.
이것은 꽤 부정확한 표현이지만, 의도는 연결 종료를 시작하기 전에 명령에 대한 응답을 보낸다는 것이 분명하기를 바란다.
이것은 realm에서도 작동하도록 일반화되어야 한다.
이것은 realm에서도 작동하도록 일반화되어야 한다.
ignore cache 플래그가 어떻게 작동하는지 제대로 지정해야 한다. 이것은 리소스의 첫 번째 로드만 캐시를 우회하는지 (즉, 이것이 처음에 캐시를 지우고 평소처럼 진행하는 것과 같은지), 또는 HTML 파서가 직접 로드하지 않는 리소스 (예: 스크립트나 스타일시트가 시작한 로드)도 캐시를 우회하는지를 고려해야 한다.
여기서 무엇이 왜 실패했는지에 대한 충분한 정보를 오류로 노출하고 있는가? 어떤 오류 코드를 원하는가? 로컬 끝이 실제로 무엇이 잘못되었는지 알아내기 위해 구현 정의 문자열을 파싱하는 문제가 생길 것인가?
이것은 update rendering 알고리즘에 좀 더 명시적인 방식으로 통합되어야 한다.
마지막 최상위 traversable를 닫을 때의 동작에 관한 공개 논의가 있다. 브라우저를 닫거나, 세션을 닫거나, 이것을 구현에 맡기는 것으로 예상할 수 있다. [w3c/webdriver-bidi Issue #170]
이것은 update rendering 알고리즘에 좀 더 명시적인 방식으로 통합되어야 한다.
작성된 알고리즘에는 경쟁 조건이 있는데, 우리가 탐색을 시도할 때 대상 session history entry가 더 이상 존재하지 않을 수 있기 때문이다. history 탐색 대기를 지원하면 이것을 더 견고하게 처리할 수 있다.
`browsingContext.pageShow 이벤트를 노출하고 싶은가? 그 경우에는 bfcache 복원 때뿐 아니라 `pageshow`가 발생하려고 할 때마다 이것을 호출해야 하며, persisted 상태도 데이터에 추가해야 한다.
활성 문서를 가진 browsing context에 대해서만 이 이벤트를 발생시켜야 하는지 명확하지 않다. navigation은 context가 접근 불가능해지게 만들 수도 있지만, bfcache 때문에 아직 폐기되지 않을 수 있다.
이 알고리즘을 screen orientation 명세로 이동한다.
이것은 navigable과 관련 없는 데이터 수집을 방지한다. collector 구성과 대조하기 위해 여전히 navigable을 검색해야 하지만 여기서 null을 허용할 수도 있다.
이것은 auth를 취소하는 방법이 없다.
realm 이외의 매개변수를 포함해야 하는가?
Fetch에서처럼 이것이 여러 헤더, 파싱 문제 등을 처리하는 올바른 방법인지 명확하지 않다.
context와 더불어 요청을 시작한 문서 노드의 `sharedId`도 포함하는 것을 고려한다.
"request already sent" 오류를 고려한다.
정확한 오류 종류를 설정할 수 있게 한다 [Issue #508]
Fetch의 "HTTP-network-or-cache fetch" 알고리즘에서 반환 값을 존중한다.
이것은 잘못된 오류 코드를 가진다
이것은 lone surrogate를 처리하지 않는다
"stale object reference" 경우를 처리한다.
WASM 타입 추가?
WindowProxy도 Node와 비슷한 스타일로 속성을 가져야 하는가?
String / Number / etc. 래퍼 객체를 특별히 처리할 것인가?
mirror object의 수명주기를 재고한다.
children과 자식 노드는 다른 것이다. childNodeCountchildNodes를 참조하거나, childrenCount로 이름을 바꿔야 한다.
이것은 잘못된 오류 코드를 가진다
이것은 잘못된 오류 코드를 가진다
TODO: script.evaluate에 설명된 대로 timeout 인수를 추가한다.
예를 들어 중첩 worker를 위해 realm 부모도 허용하도록 이것을 확장해야 하는가? 아니면 모든 ancestor worker를 가져와야 하는가?
단순한 리터럴 일치보다 더 정교한 필터 시스템을 원할 수도 있다.
여기서 순서를 더 잘 정의해야 하는가?
이것의 키를 browsing context로 할 것인가, 아니면 top-level traversable로 할 것인가? 차이는 이벤트가 frame에서 발생하고 그 frame이 로컬 끝이 최상위 navigable에 대한 log event를 구독하기 전에 탐색되는 경우에 어떻게 되는지에 있다.
훨씬 더 많은 것이 로깅을 필요로 한다. CDP에는 LogEntryAdded 타입으로 xml, javascript, network, storage, appcache, rendering, security, deprecation, worker, violation, intervention, recommendation, other가 있다. 이것들은 서로 다른 메서드로 표현되는 js exception 및 console API 타입에 추가되는 것이다.
구현 정의 log 타입 허용