1. 引言
本节是非规范性的。
WebDriver 定义了一种用于 自省和 远程控制用户代理的协议。本规范通过 引入双向通信来扩展 WebDriver。相较于 WebDriver 严格的 命令/响应格式,这允许事件从 用户代理流式传输到控制软件,从而更好地匹配浏览器 DOM 的事件驱动本质。
2. 基础设施
本规范依赖 Infra Standard。[INFRA]
网络协议消息使用 CDDL 定义。[RFC8610]
本规范定义了一个等待 队列,它是一个映射。
当一个并行运行的算法 algorithm 等待一组 事件 events 和 resume id 时:
WebDriver 配置是一个具有以下内容的结构体:
WebDriver 配置具有一个关联类型, 它 是一个类型。
WebDriver 配置的 值要么是一个 其类型为该配置的关联类型的值,要么是 unset。
Unset 是一个值,表示某个特定配置 值尚未被设置。
注:此算法允许访问给定navigable 的 WebDriver 配置,方式是依次检查 navigables、然后是 user contexts,最后是 global 中的值。 如果配置未设置,则返回 unset。
要获取 WebDriver 配置 configuration 对于 navigable navigable 的 WebDriver 配置值:
-
令 top-level traversable 为 navigable 的顶级 traversable。
-
如果 configuration 的navigables 包含 top-level traversable:
-
令 navigable configuration value 为 configuration 的 navigables[top-level traversable]。
-
如果 navigable configuration value 不是 unset,则返回 navigable configuration value。
-
-
令 user context 为 navigable 的关联用户 上下文。
-
如果 configuration 的user contexts 包含 user context:
-
令 user context configuration value 为 configuration 的 user contexts[user context]。
-
如果 user context configuration value 不是 unset,则返回 user context configuration value。
-
-
返回 configuration 的 global。
注:这是一个用于按 target 存储 WebDriver 配置的通用算法,target 可以是 navigable、用户上下文,或者如果 target 为 null 或被省略,则全局存储。
要将 WebDriver 配置 configuration 的 值 value 存储到可选 target 中, 其中 target 是一个navigable、 一个用户上下文,或在未提供时为 null:
-
如果 target 为 null,则将 configuration 的 global 设置为 value。
-
如果 target 是一个用户上下文,则将 configuration 的 user contexts[target] 设置为 value。
-
如果 target 是一个navigable,则将 configuration 的 navigables[target] 设置为 value。
注:此通用算法将 WebDriver
配置的值
存储在 global、user contexts 或
navigables 中,具体取决于
command parameters 中是否存在
"userContexts" 和 "contexts"。这些
参数
是互斥的。如果两者都未提供,则配置会全局存储。
要针对给定的 command parameters 存储 WebDriver 配置 WebDriver 配置 configuration 的 值 value:
-
如果 command parameters 包含 "
userContexts",且 command parameters 包含 "contexts",则返回带有错误 代码 invalid argument 的错误。 -
令 affected navigables 为空集合。
-
如果 command parameters 包含 "
contexts":-
令 navigables 为尝试用 command parameters["
contexts"] 通过 id 获取有效顶级 traversables 的结果。 -
对于 navigables 中的每个 navigable:
-
-
否则,如果 command parameters 包含 "
userContexts": -
否则:
-
对于所有顶级 traversable中的每个 top-level traversable,将 top-level traversable 追加 到 affected navigables。
-
存储 configuration 的 value。
-
-
返回 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 }
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..9007199254740991js-uint= 0..9007199254740991
3.2. 会话
WebDriver BiDi 扩展了 会话概念,该概念来自 WebDriver。
会话具有一个 BiDi 标志,除非另有 说明,否则为 false。
BiDi 会话是一个 会话,其 BiDi 标志 被设为 true。
3.3. 模块
WebDriver BiDi 协议被组织为多个模块。
每个模块表示与用户 代理某一方面有关的一组相关 命令和事件。例如,模块可能包含用于检查和 操作 DOM,或用于脚本执行的功能。
每个模块都有一个模块名称,它是一个字符串。模块中定义的命令
和事件的命令名称和
事件名称
以模块名称开头,后跟一个句点
"."。
包含命令的模块定义 远端定义
片段。它们会为该模块的命令在 CommandData
组中提供选择项,也可以定义
额外的定义属性。它们
也可以定义 本地端定义
片段,为该模块中命令的结果
在 ResultData 组中提供额外选择项。
包含事件的模块定义 本地端定义
片段,这些片段是该模块事件在 Event 组中的
选择项。
实现可以定义扩展模块。这些扩展模块必须具有一个
包含单个冒号 ":" 字符的模块名称。
冒号之前的
部分是前缀;对于给定实现专用的所有
扩展模块,
这通常是相同的,并且对于
给定实现应当是唯一的。
其他规范可以定义自己的 WebDriver-BiDi 模块来扩展该协议。
这类模块的名称不得包含冒号(:)字符,
也不得定义包含该字符的命令名称、事件名称或属性
名称。
鼓励外部规范的作者添加新模块,而不是扩展 现有模块。如果希望扩展某个现有模块,最好将该 扩展直接整合到包含原始模块定义的规范中。
3.4. 命令
命令是一种异步 操作,由 本地端请求,并在远端运行, 最终将 结果或错误返回给本地端。 多个 命令可以同时运行,并且命令可能会 长时间运行。因此,命令可能会乱序完成。
每个命令由以下内容定义:
-
一个命令类型,它由一个包含组的
远端定义片段定义。每个这样的组都有两个字段:-
method,它是形式为[module name].[method name]的字符串字面量。这是命令 名称。 -
params,它定义了一个映射,其中包含要传入 命令的数据。此映射填充后的值是 命令参数。
-
-
一个结果类型,它由一个
本地端定义片段定义。 -
一组远端步骤,它们定义了对于给定的 BiDi 会话和 命令参数,为某个命令要采取的动作,并返回该命令结果类型的一个 实例。
可以在没有活动会话的情况下运行的命令是静态 命令。除非在其定义中说明,否则命令不是静态命令。
当命令从本地端发送时,它们 具有命令 id。这是一个 标识符,本地端用它来识别来自特定 命令的响应。从远端 的角度看, 该标识符是不透明的,不能在内部用于识别命令。
注:这是因为命令 id 完全由本地端 控制,并且在一个会话的过程中不一定唯一。例如,一个本地端如果 忽略所有响应,就可以对每个命令使用相同的命令 id。
所有命令 名称的集合是一个集合,包含 所有已定义的命令名称,包括任何属于扩展模块的命令名称。
3.5. 错误
WebDriver BiDi 使用以下额外代码扩展了来自 WebDriver 的错误代码集合:
- invalid web extension
- 尝试安装无效的 Web 扩展。
- 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
- 尝试引用未知的 Web 扩展。
- unable to close browser
- 尝试关闭浏览器,但未能做到。
- unable to set cookie
- 尝试创建 cookie,但用户代理拒绝了它。
- underspecified storage partition
- 尝试与未充分指定的存储分区中的数据交互。
- unable to set file input
- 尝试设置文件输入,但未能做到。
- unavailable network data
- 尝试获取未被收集或已被逐出的网络数据。
ErrorCode="invalid argument"/"invalid selector"/"invalid session id"/"invalid web extension"/"move target out of bounds"/"no such alert"/"no such network collector"/"no such element"/"no such frame"/"no such handle"/"no such history entry"/"no such intercept"/"no such network data"/"no such node"/"no such request"/"no such 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. 事件
事件是一个通知,由 远端 发送给本地端,表示远端上发生了值得关注的事情。
-
事件类型由一个包含组的
本地端定义片段定义。每个这样的组都有两个字段:-
method,它是形式为[module name].[event name]的字符串字面量。这是事件 名称。 -
params,它定义了一个包含事件数据的映射。此映射 填充后的值是事件 参数。
-
-
一个远端事件触发器,它定义事件何时被 触发,以及构造事件类型数据的步骤。
-
可选地,一组远端订阅步骤, 它们定义当本地端订阅某个事件时要采取的步骤。如果 已定义,这些步骤具有一个关联的订阅 优先级,它是一个整数,用于控制同时启用多个事件时这些步骤 运行的顺序,整数越小 表示步骤越早运行。
BiDi 会话具有一个已知订阅 id,它是一个集合,包含 已发布给本地端但尚未被取消订阅的所有 订阅 id。
订阅是一个结构体,由一个 订阅 id(一个字符串)、 事件名称(一个事件名称的集合)、 顶级 traversable id(一个集合,包含顶级 traversable的 ID) 和 用户上下文 id(一个集合,包含用户上下文的 ID)。
如果 subscription 的顶级 traversable id是空集合, 且 subscription 的用户上下文 id是空集合,则订阅 subscription 是全局的。
给定 event name 和 navigables,启用了某个事件的会话 集合为:
-
令 sessions 为一个新的集合。
-
对于活动 BiDi 会话中的每个 session:
-
如果对于 session、event name 和 navigables,事件 已启用, 则将 session 追加到 sessions。
-
-
返回 sessions。
要在给定 session、 event name 和 navigables 的情况下判断某个事件 是否已启用:
注:navigables 是一个集合,因为共享 worker 可以关联 多个上下文。
-
令 top-level traversables 为使用 navigables 调用获取顶级 traversable 的结果。
-
对于 session 的订阅中的每个 subscription:
-
如果 subscription 是全局的,则返回 true。
-
如果用户上下文 id不为空:
-
否则:
-
令 subscription top-level traversables 为用 subscription 的顶级 traversable id 调用通过 id 获取 navigables 的结果。
-
如果 top-level traversables 与 subscription top-level traversables 的交集不是空,则返回 true。
-
-
返回 false。
给定 event name 和 session,启用了某个事件的顶级 traversable 集合 为:
-
令 result 为一个新的集合。
-
对于 session 的订阅中的每个 subscription:
-
如果 subscription 是全局的:
-
对于远端的顶级 traversable中的每个 traversable:
-
将 traversable 追加到 result。
-
-
中断。
-
-
否则,如果用户上下文 id不为空:
-
否则:
-
令 top-level traversables 为用 subscription 的顶级 traversable id 调用通过 id 获取 navigables 的结果。
-
将 top-level traversables 中的每一项追加到 result。
-
-
返回 result。
4. 传输
消息传输使用 WebSocket 协议提供。 [RFC6455]
注:按 WebSocket 协议的术语,本地端是 客户端,而远端是服务器 / 远程主机。
注:将命令和事件编码为消息的方式 类似于 JSON-RPC,但本规范并未规范性地 引用它。[JSON-RPC] 对远端的规范性要求 改为以精确处理模型的形式给出,而不对 本地端给出规范性要求。
WebSocket 监听器 是一个能够 接受传入 WebSocket 连接的网络端点。
WebSocket 监听器 具有一个host、一个port、一个secure flag,以及一个 WebSocket 资源 列表。
当创建 WebSocket 监听器 listener 时,远端 必须开始在 listener 的host 和port 所给定的主机和端口上监听 WebSocket 连接。如果 listener 的secure flag 已设置,则从 listener 建立的连接必须经过 TLS 加密。
远端具有一个集合,其中包含 WebSocket 监听器 活动 监听器,其初始为空。
远端具有一个集合,其中包含未与 会话关联的 WebSocket 连接,其初始为空。
WebSocket 连接是遵循 WebSocket 协议要求的网络连接
BiDi 会话具有一个集合,其中包含会话 WebSocket 连接,其元素是WebSocket 连接。这 初始为空。
BiDi 会话 session 与连接 关联 connection,如果 session 的会话 WebSocket 连接包含 connection。
注:每个 WebSocket 连接至多与一个 BiDi 会话关联。
当客户端通过连接到活动监听器集合之一的 listener 来建立 WebSocket 连接 connection 时, 实现必须按照 WebSocket 服务器端要求继续进行,并在决定是否 接受传入连接时运行以下步骤:
-
令 resource name 为读取客户端开启握手所得的资源名称。如果 resource name 不在 listener 的WebSocket 资源列表中,则停止 运行这些步骤,并表现为所请求的服务不可 用。
-
如果 resource name 是字节字符串 "
/session", 且实现支持仅 BiDi 会话:-
运行任何其他实现定义的步骤,以决定是否应当接受 该连接;如果不接受,则停止运行这些 步骤,并表现为所请求的服务不可用。
-
将该连接添加到未与会话关联的 WebSocket 连接。
-
返回。
-
-
用 resource name 获取 WebSocket 资源的会话 ID, 并令 session id 为该值。如果 session id 为 null,则 停止运行这些步骤,并表现为所请求的服务不可 用。
-
如果活动会话列表中存在一个会话,其 会话 ID为 session id,则令 session 为该 会话。否则停止运行这些步骤,并表现为所 请求的服务不可用。
-
运行任何其他实现定义的步骤,以决定是否 应接受该连接;如果不接受,则停止运行这些 步骤,并表现为所请求的服务不可用。
-
否则,将 connection 追加到 session 的会话 WebSocket 连接,并在服务器选择接受传入连接时,继续执行 WebSocket 服务器端要求。
当为 WebSocket 连接 connection 接收到 WebSocket 消息,其类型为 type 且数据为 data 时,远端 必须在给定 connection、 type 和 data 的情况下处理传入消息。
当对 WebSocket 连接 connection 开始 WebSocket 关闭握手,或当该WebSocket 连接关闭时, 远端必须在给定 connection 的情况下处理连接 关闭。
注:需要这两个条件,因为 WebSocket 连接可能在没有关闭握手的情况下被关闭。
要在给定会话 session 的情况下构造 WebSocket 资源名称:
-
如果 session 为 null,则返回 "
/session" -
返回将字符串 "
/session/" 与 session 的会话 ID连接所得的结果。
要在给定 WebSocket 监听器 listener 和会话 session 的情况下构造 WebSocket URL:
-
令 resource name 为用 session 调用构造 WebSocket 资源名称 的结果。
-
返回一个构造出的 WebSocket URI,其中 host 设置为 listener 的host,port 设置为 listener 的 port,path 设置为 resource name;如果 listener 的secure flag 已设置,则遵循 wss-URI 构造,否则遵循 ws-URL 构造。
要在给定 resource name 的情况下获取 WebSocket 资源的会话 ID:
-
如果 resource name 不是以字节字符串 "
/session/" 开头,则返回 null。 -
令 session id 为 resource name 中位于 "
/session/" 前缀之后的字节。 -
如果 session id 不是 UUID 的字符串表示,则返回 null。
-
返回 session id。
-
如果活动监听器中存在一个已有的WebSocket 监听器, 且远端想要复用它,则令 listener 为该 监听器。否则,令 listener 为一个新的 WebSocket 监听器,具有 实现定义的host、port、 secure flag,以及一个空的WebSocket 资源列表。
-
令 resource name 为用 session 调用构造 WebSocket 资源名称 的结果。
-
将 resource name 追加到 listener 的WebSocket 资源 列表。
-
返回 listener。
注:处理多个会话的中介节点可以使用一个 或多个 WebSocket 监听器。WebDriver 定义 端点节点一次最多支持一个会话,因此预期 它只会有单个监听器。
注:对于端点
节点,上述步骤中的host
通常会是 "localhost"。
-
如果 type 不是text,则在给定 connection、 null 和invalid argument 的情况下发送错误响应,最后 返回。
-
断言:data 是一个标量值字符串,因为 WebSocket 处理 UTF-8 编码数据中的错误否则已经 会使 WebSocket 连接失败。
似乎没有内容 定义 UTF-8 错误使用什么状态码。
-
如果存在一个BiDi 会话与连接关联 connection, 则令 session 为该会话。否则,如果 connection 在未与会话关联的 WebSocket 连接中,则令 session 为 null。否则,返回。
-
令 parsed 为在给定 data 的情况下将 JSON 解析为 Infra 值的结果。如果这抛出异常,则在给定 connection、 null 和invalid argument 的情况下发送错误响应,并 最后返回。
-
如果 session 非 null 且不在活动会话中,则返回。
-
将 parsed 与
远端定义匹配。 如果这产生 匹配:-
令 matched 为表示匹配数据的映射。
-
断言:matched 包含 "
id"、"method" 和 "params"。 -
令 command id 为 matched["
id"]。 -
令 method 为 matched["
method"] -
令 command 为命令名称为 method 的命令。
-
如果 session 为 null 且 command 不是静态命令,则 在给定 connection、command id 和invalid session id 的情况下发送错误响应,并返回。
-
并行运行以下步骤:
-
令 result 为对于 command,在给定 session 和命令参数 matched["
params"] 的情况下运行远端步骤所得的结果 -
如果 result 是一个错误,则在给定 connection、command id 和 result 的错误代码的情况下发送 错误响应,并最后 返回。
-
令 value 为 result 的数据。
-
如果 method 是 "
session.new",则令 session 为 活动会话列表中的条目,其会话 ID等于 value 的 "sessionId" 属性;将 connection 追加 到 session 的会话 WebSocket 连接,并 从未与会话关联的 WebSocket 连接中移除 connection。 -
令 response 为一个新的映射,它与
CommandResponse产生式匹配,该产生式在本地端定义中,其id字段设置为 command id,value字段设置为 value。 -
令 serialized 为在给定 response 的情况下将 infra 值序列化为 JSON 字节的结果。
-
在 connection 上发送 WebSocket 消息,该消息由 serialized 组成。
-
-
-
否则:
-
令 command id 为 null。
-
如果 parsed 是一个映射, 且 parsed["
id"] 存在并且是一个 大于或等于零的整数,则将 command id 设置为该整数。 -
令 error code 为invalid argument。
-
如果 parsed 是一个映射, 且 parsed["
method"] 存在并且是一个 字符串,但 parsed["method"] 不在所有命令名称的集合中,则将 error code 设置为unknown command。 -
在给定 connection、command id 和 error code 的情况下发送错误响应。
-
要在给定设置对象 settings 的情况下获取相关 navigables:
-
令 related navigables 为空集合。
-
如果 settings 的相关全局对象是一个
Window:-
令 navigable 为相关全局对象的关联
Document的节点 navigable。 -
如果 navigable 非 null,则将 navigable 追加到 related navigables。
-
-
否则,如果 settings 所指定的全局对象是一个
WorkerGlobalScope, 则对于该全局对象的 所有者集合中的每个 owner:-
令 navigable 为 null。
-
如果 owner 是一个Document,则将 navigable 设置为 owner 的 节点 navigable。
-
如果 navigable 非 null,则将 navigable 追加到 related navigables。
-
-
返回 related navigables。
要在给定一个 context id navigable ids 的列表的情况下通过 id 获取 navigables:
要在给定navigables navigables 的列表的情况下获取 顶级 traversables:
-
令 result 为空集合。
-
对于 navigables 中的每个 navigable:
-
将 navigable 的追加顶级 traversable到 result。
-
-
返回 result。
要在给定 context id navigable ids 的列表的情况下通过 id 获取有效 navigables:
-
令 result 为空集合。
-
对于 navigable ids 中的每个 navigable id:
-
令 navigable 为尝试用 navigable id 获取 navigable的结果。
-
将 navigable 追加到 result。
-
-
返回带有数据 result 的成功。
要在给定 context id navigable ids 的列表的情况下通过 id 获取有效顶级 traversables:
-
令 result 为空集合。
-
对于 navigable ids 中的每个 navigable id:
-
令 navigable 为尝试用 navigable id 获取 navigable的结果。
-
如果 navigable 不是顶级 traversable,则返回带有错误代码 invalid argument 的错误。
-
将 navigable 追加到 result。
-
-
返回带有数据 result 的成功。
-
断言:body 与
Event产生式匹配。 -
令 serialized 为在给定 body 的情况下将 infra 值序列化为 JSON 字节的结果。
-
对于 session 的会话 WebSocket 连接中的每个 connection:
-
在 connection 上发送 WebSocket 消息,该消息由 serialized 组成。
-
-
令 error data 为一个新的映射,与
本地端定义中的ErrorResponse产生式匹配, 其中id字段 设置为 command id,error字段设置为 error code,message字段设置为一个实现定义的字符串, 包含对所发生错误的人类可读定义,并且stacktrace字段可选地设置为一个实现定义的 字符串,包含错误发生时活动栈帧的栈跟踪报告。 -
令 response 为在给定 error data 的情况下将 infra 值序列化为 JSON 字节 的结果。
注:command id 可以为 null,在 这种情况下,
id字段也会 被设置为 null,而不会从 response 中省略。 -
在 connection 上发送 WebSocket 消息,该消息由 response 组成。
要在给定 WebSocket 连接 connection 的情况下处理连接 关闭:
-
如果存在一个BiDi 会话与连接关联 connection:
-
从 session 的会话 WebSocket 连接中移除 connection。
-
否则,如果未与会话关联的 WebSocket 连接 包含 connection,则从该集合中移除 connection。
注:这不会结束任何会话。
要在给定 session 的情况下关闭 WebSocket 连接:
-
对于 session 的会话 WebSocket 连接中的每个 connection:
-
使用 connection 开始 WebSocket 关闭握手。
注:这将导致 对 connection 运行处理连接关闭中的步骤, 这些步骤将清理与 connection 关联的资源。
-
4.1. 建立连接
WebDriver 客户端通过请求值为 true 的 WebSocket URL 能力,选择加入双向连接。
-
如果 flags 包含 "
bidi",则返回。 -
令 webSocketUrl 为从 capabilities 获取名为 "
webSocketUrl" 的属性的结果。 -
如果 webSocketUrl 是 undefined,则返回。
-
断言:webSocketUrl 为 true。
-
令 listener 为在给定 session 的情况下开始监听 WebSocket 连接的结果。
-
将 webSocketUrl 设置为用 listener 和 session 构造 WebSocket URL的结果。
-
在 capabilities 上设置名为 "
webSocketUrl" 的属性为 webSocketUrl。 -
将 session 的 BiDi 标志设置为 true。
-
将 "
bidi" 追加到 flags。
实现还应允许客户端建立一个 不是 HTTP 会话的 BiDi 会话。在这种情况下,WebSocket 服务器的 URL 通过带外方式传达。允许这样做的实现支持 仅 BiDi 会话。当这样的实现准备好接受 启动 WebDriver 会话的请求时,它必须:
-
在给定 null 的情况下开始监听 WebSocket 连接。
5. 沙盒化脚本执行
自动化工具的一个常见需求是执行这样的脚本:它们可以 访问某个文档的 DOM,但没有关于包含该 文档的 navigable 中运行的脚本对 DOM API 所做任何更改的信息。
BiDi 会话具有一个沙盒映射,它是一个弱
映射,其中
键是 Window
对象,值是字符串与
SandboxWindowProxy
对象之间的映射。
注:这里对沙盒的定义,是试图 将现有实现的行为编纂成规范。它暴露了实现中 以前被规范视为内部的部分,尤其是 平台对象的内部状态(通常以浏览器 引擎主要实现语言中的原生对象来实现)与 ECMAScript 可见状态之间的 区别。由于现有沙盒 实现发生在引擎的低层,实现要在 所有细节上收敛到本规范可能是一个缓慢过程。在 此期间,鼓励实现者提供有关其与规范 差异的详细文档,并鼓励此特性的用户 显式测试在沙盒中运行的脚本是否能在所有实现中工作。
5.1. 沙盒 Realm
每个沙盒都是一个唯一的 ECMAScript Realm。但是,沙盒 realm
通过
SandboxProxy
对象提供对现有 Window
realm 中平台对象的访问。
-
如果 name 为空字符串,则返回带有 错误代码 invalid argument 的错误。
-
令 window 为 navigable 的活动窗口。
-
令 sandboxes 为沙盒映射[window]。
-
如果 sandboxes 不包含 name,则将 sandboxes[name] 设置为用 navigable 调用创建沙盒 realm的结果。
-
返回带有数据 sandboxes[name] 的成功。
定义
沙盒 realm 的创建。这将返回一个
SandboxWindowProxy,
其包装 window。
要在给定 target realm 的情况下获取沙盒 名称:
5.2. 沙盒代理对象
SandboxProxy 对象是一个特异对象,用于调解对
另一个 realm 中对象的沙盒化
访问。沙盒代理对象被设计为强制执行
以下限制:
-
平台对象可访问,但属性访问只返回 Web IDL 定义的属性,而不返回 ECMAScript 定义的属性(即 底层接口中不存在的“expando”属性,或 遮蔽底层接口中某个属性的 ECMAScript 定义属性)。
-
设置属性要么运行 Web IDL 定义的 setter 步骤,要么在代理对象上 设置属性。这意味着在沙盒外写入的属性 不可访问,但接口成员可以正常使用。
不存在 SandboxProxy
接口对象。
详细定义 SandboxProxy
如何工作
-
只要 object 是
SandboxProxy或SandboxWindowProxy, 就将 object 设置为它的 被包装对象。 -
返回 object。
5.3. SandboxWindowProxy
SandboxWindowProxy 是一个特异对象,表示由 SandboxProxy
对象包装的
Window
对象。这提供了对 Window
全局中该数据的沙盒化
访问。
6. 用户上下文
用户上下文表示 远端内零个或多个 顶级 traversable的集合。 每个用户上下文都有 一个关联的存储 分区,因此远端数据不会在不同的用户上下文之间 共享。
目前还不清楚这是不是 正式定义用户上下文概念或其与存储交互的 最佳方式。
注:Infra 规范使用术语“user agent”来指代 与用户上下文相同的概念。然而,这与 “user agent”用来表示包含多个用户上下文的整个 Web 客户端这一用法 不兼容。虽然这种差异对 Web 内容不可见, 但它可通过 WebDriver 被观察到,因此我们避免使用该术语。
用户上下文具有一个用户上下文 id, 它是在用户上下文创建时设置的唯一字符串。
navigable 具有一个关联用户上下文,它是一个用户上下文。
当新的顶级 traversable被创建时,其关联用户上下文 被设置为用户上下文集合中的某个用户上下文。
注:在某些情况下,用户上下文会在 顶级 traversable创建时由规范设置;但是在不存在此类 要求的情况下,关联用户上下文对于顶级 traversable是实现定义的。
我们是否应指定具有非 null opener 的顶级 traversable具有与其 opener 相同的关联用户上下文? 需要检查这是否是现有实现会强制执行的内容。
子 navigable 的关联用户上下文是 其 父级的关联用户上下文。
如果某个用户上下文不是任何 顶级 traversable的关联 用户上下文,则它是一个空用户上下文。
默认用户
上下文是一个用户
上下文,其用户上下文 id 为 "default"。
实现具有一个用户上下文集合,它是一个由用户上下文组成的集合。初始时,它 包含默认 用户上下文。
实现可以在任何时候将新的用户上下文追加到用户上下文集合, 例如响应用户操作。
注:这里的“任何时候”包括实现 启动期间,因此给定 实现可能总是在用户上下文集合中有多个条目。
实现可以在任何 时候从用户上下文集合中移除任何空用户上下文,但 默认用户 上下文除外。然而,它们并非必须移除这类用户上下文。不是空用户上下文的用户上下文不得从 用户 上下文集合中移除。
BiDi 会话具有一个 用户上下文到接受不安全 证书覆盖映射,它是 用户上下文与 boolean 之间的映射。
BiDi 会话具有一个用户 上下文到代理配置映射,它是 用户上下文与代理配置之间的映射。
模拟网络条件结构体是一个具有以下内容的结构体:
-
名为 offline 的项,它是 boolean 或 null。
BiDi 会话具有模拟网络条件,它是 一个结构体,具有 一个名为 default network conditions 的项,它是 一个 模拟网络条件结构体或 null;一个 名为 user context network conditions 的项, 它 是用户 上下文与模拟网络条件结构体之间的弱映射; 以及一个名为 navigable network conditions 的项, 它是 navigable与模拟 网络条件结构体之间的 弱映射。
当用户上下文从 用户 上下文集合中被移除时,移除用户上下文订阅。
要移除 用户上下文订阅:
-
对于活动会话中的每个 session:
要在给定 user context ids 的情况下获取有效用户 上下文:
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。
-
如果活动会话为空,则将 webdriver-active 标志 设置为 false。
要在给定 session 的情况下清理 会话:
-
使用 session 关闭 WebSocket 连接。
-
对于用户上下文集合中的每个 user context:
-
移除 session 的 用户上下文到接受不安全证书覆盖映射[user context]。
-
移除 session 的 用户上下文到代理配置映射[user context]。
-
-
对于 session 的已阻塞请求映射中的每个 request id →(request、phase、response):
-
使用 "
continue request"、request id 和(response、"incomplete")恢复。
-
-
对于 session 的网络收集器中的每个 collector:
-
执行任何特定于实现的清理步骤。
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,如下:
-
如果 value 不是 boolean,则返回带有代码 invalid argument 的错误。
-
返回带有数据 value 的成功。
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, }
给定 session 和 command parameters 时,远端步骤为:
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 } }
给定 session 和 command parameters 时,远端步骤为:
-
如果 session 不是 null,则返回一个错误,错误 代码为 session not created。
-
如果实现因任何原因无法启动新会话,则返回 一个错误,错误代码为 session not created。
-
令 flags 为一个包含 "
bidi" 的集合。 -
令 capabilities json 为使用 command parameters 和 flags 尝试处理能力 所得的结果。
-
令 capabilities 为用 capabilities json 调用将 JSON 派生的 JavaScript 值转换为 Infra 值的结果。
-
将 session 的 BiDi 标志设置为 true。
注:此会话的连接将由调用者设置为当前连接。
-
令 body 为一个新的映射, 它与
session.NewResult产生式匹配, 其sessionId字段设置为 session 的会话 ID,并且capabilities字段设置为 capabilities。 -
返回带有数据 body 的成功。
7.1.3.3. session.end 命令
session.end 命令结束当前 会话。
- 命令类型
-
session.End= (method:"session.end",params: EmptyParams ) - 返回类型
-
session.EndResult= EmptyResult
给定 session 和 command parameters 时,远端步骤为:
-
使用 session 结束会话。
-
返回带有数据 null 的成功,并并行运行以下 步骤:
-
等到发送 WebSocket 消息步骤已使用 对此命令的 响应被调用。
-
使用 session 清理会话。
-
7.1.3.4. session.subscribe 命令
session.subscribe 命令会全局地或针对一组 navigable 启用某些事件。
- 命令类型
-
session.Subscribe= (method:"session.subscribe",params: session.SubscribeParameters ) - 返回类型
-
session.SubscribeResult= {subscription: session.Subscription, }
-
令 event names 为空集合。
-
对于 command parameters["
events"] 中的每个条目 name,令 event names 为 event names 与尝试用 name 获得一组 事件名称的结果的并集。 -
令 input user context ids 为用 command parameters[
userContexts] 创建集合所得的结果。 -
令 input context ids 为用 command parameters[
contexts] 创建集合所得的结果。 -
如果 input user context ids 非空且 input context ids 非空, 则返回带有错误 代码 invalid argument 的错误。
-
令 subscription navigables 为一个集合。
-
令 top-level traversable context ids 为一个集合。
-
如果 input context ids 非空:
-
令 navigables 为尝试用 input context ids 通过 id 获取有效 navigables的结果。
-
将 subscription navigables 设置为用 navigables 调用获取 顶级 traversables的结果。
-
对于 subscription navigables 中的每个 navigable:
-
将 navigable 的navigable id 追加到 top-level traversable context ids。
-
-
-
否则,如果 input user context ids 非空:
-
对于 input user context ids 中的每个 user context id:
-
令 user context 为用 user context id 调用获取用户上下文的结果。
-
如果 user context 为 null,则返回带有错误代码 no such user context 的错误。
-
对于所有其关联用户上下文为 user context 的顶级 traversable列表中的每个 top-level traversable:
-
将 top-level traversable 追加到 subscription navigables。
-
-
-
-
否则,将 subscription navigables 设置为远端中所有 顶级 traversable组成的集合。
-
令 subscription 为一个订阅,其 订阅 id设置为 UUID 的字符串表示, 事件名称设置为 event names, 顶级 traversable id设置为 top-level traversable context ids,并且 用户上下文 id设置为 input user context ids。
-
令 subscribe step events 为一个新的映射。
-
对于 event names 中的每个 event name:
-
令 existing navigables 为使用 session 和 event name 调用启用了某个事件的顶级 traversable 集合的结果。
-
将 subscribe step events[event name] 设置为 subscription navigables 与 existing navigables 的差集。
-
将 subscription 追加到 session 的订阅。
-
使用以下小于算法,按升序排序 subscribe step events;给定两个键为 event name one 和 event name two 的条目:
-
如果 subscription 是全局的,则令 include global 为 true, 否则令 include global 为 false。
-
对于 subscribe step events 中的每个 event name → navigables:
-
令 body 为一个新的映射, 它与
session.SubscribeResult产生式匹配, 其subscription字段设置为 subscription 的订阅 id。 -
返回带有数据 body 的成功。
7.1.3.5. session.unsubscribe 命令
session.unsubscribe 命令会全局地或针对一组 navigable 禁用事件。
- 命令类型
-
session.Unsubscribe= (method:"session.unsubscribe",params: session.UnsubscribeParameters, )session.UnsubscribeParameters= session.UnsubscribeByAttributesRequest / session.UnsubscribeByIDRequest - 返回类型
-
session.UnsubscribeResult= EmptyResult
-
如果 command parameters 不包含 "
subscriptions":注:该条件意味着 command parameters 与 session.UnsubscribeByAttributesRequest 产生式匹配。
-
令 event names 为空集合。
-
对于 command parameters["
events"] 中的每个条目 name, 令 event names 为 event names 与尝试用 name 获得 一组事件名称所得结果的并集。 -
令 new subscriptions 为一个列表。
-
令 matched events 为一个集合。
-
对于 session 的订阅中的每个 subscription:
-
如果 subscription 不是全局的:
-
对于 event names 中的每个 event name:
-
如果 subscription event names 非空:
-
如果 matched events 不等于 event names,则返回带有 错误代码 invalid argument 的错误。
-
将 session 的订阅设置为 new subscriptions。
-
-
否则:
-
返回带有数据 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都关联到单个客户端
窗口,该窗口表示一个矩形区域,其中包含
用于在其可见性状态为
"visible" 时渲染该顶级 traversable的活动文档的视口,以及与显示该
traversable 相关联的任何浏览器特定用户界面元素
(例如任何 URL 栏、工具栏或 OS
窗口装饰)。
客户端窗口具有一个客户端窗口 id,它是唯一 标识该窗口的字符串。
客户端窗口具有一个x 坐标,它是 Web 暴露屏幕区域左边缘与窗口左边缘之间的 CSS 像素数,若这对于某个 特定窗口没有意义则为零。
客户端窗口具有一个y 坐标,它是 Web 暴露屏幕区域上边缘与窗口上边缘之间的 CSS 像素数,若这对于某个 特定窗口没有意义则为零。
客户端窗口具有一个宽度,它是 窗口矩形的宽度,以 CSS 像素计。
客户端窗口具有一个高度,它是 窗口矩形的高度,以 CSS 像素计。
要最大化 客户端窗口 window,实现应当要么 执行与平台最大化 window 概念相对应的步骤,要么 定位 window,使其x 坐标尽可能接近 0,其y 坐标尽可能接近 0, 其宽度尽可能接近 Web 暴露屏幕区域的宽度,且其高度尽可能接近 Web 暴露屏幕区域的高度。如果支持这两个选项中的任一个, 则支持最大化客户端窗口。
要最小化
客户端窗口 window,实现应当要么
执行与平台最小化 window 概念相对应的步骤,要么
以其他方式隐藏 window,使得与 window 关联的
顶级 traversable中的所有活动文档都具有
"hidden" 的可见性状态,并且 window 的宽度和高度都尽可能接近 0。如果支持这两个
选项中的任一个,则支持最小化客户端窗口。
要还原
客户端窗口 window,实现应确保它
既不处于平台定义的最大化状态,也不处于平台定义的
最小化状态,并且如果存在一个或多个与 window 关联的顶级 traversable,
其中至少一个具有处于
"visible" 状态的活动文档。如果支持这一点,则支持还原客户端
窗口。
要在给定 window 的情况下获取 客户端窗口状态:
-
令 documents 为空列表。
-
令 visible documents 为空列表。
-
对于每个顶级 traversable traversable:
-
对于 visible documents 中的每个 document:
-
如果 document 的全屏元素不是 null,则返回 "
fullscreen"。
-
-
如果 visible documents 为空但 documents 不是 空,或者如果 window 以其他方式处于特定于 OS 的 最小化状态,则返回 "
minimized"。 -
如果 window 处于特定于 OS 的最大化状态,则返回 "
maximized"。注:这通常但不一定意味着 window 的宽度等于Web 暴露屏幕区域的宽度,并且 window 的高度等于 Web 暴露屏幕区域的高度。
-
返回 "
normal"。
要在给定 window 和 state 的情况下设置 客户端窗口状态:
-
令 current state 为使用 window 获取客户端窗口状态的结果。
-
如果 current state 是 "
fullscreen"、"maximized" 或 "minimized",且等于 state,则返回带有数据 null 的成功。 -
在以下条件及其关联步骤列表中,运行第一个关联条件为 true 的步骤集:
- "
fullscreen" - 如果不支持全屏,则返回带有错误代码 unsupported operation 的错误。
- "
normal" - 如果对于 window 不支持还原客户端窗口, 则返回带有 错误代码 unsupported operation 的错误。
- "
maximize" - 如果对于 window 不支持最大化客户端窗口, 则返回带有 错误代码 unsupported operation 的错误。
- "
minimize" - 如果对于 window 不支持最小化客户端窗口, 则返回带有 错误代码 unsupported operation 的错误。
- "
-
令 documents 为空列表。
-
对于每个顶级 traversable traversable:
-
如果 documents 为空,则返回 带有错误 代码 no such client window 的错误。
-
如果 current state 是 "
fullscreen":-
对于 documents 中的每个 document:
-
使用 document 完全退出全屏。
注:对于窗口中并非全屏的 文档,这是无操作。
-
-
-
如果 current state 是 "
maximized" 或 "minimized":-
还原客户端窗口 window。
-
-
根据 state 的值进行切换:
-
返回带有数据 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 id 为 client window 的客户端窗口 id。
-
令 state 为使用 client window 调用获取客户端窗口状态的结果。
-
如果 client window 能够接收从操作系统传送来的键盘输入, 则令 active 为 true,否则令 active 为 false。
注:这可能意味着某个顶级 traversable(其客户端窗口是 client window)具有系统焦点,也可能意味着浏览器自身的 用户界面当前具有焦点。
-
令 client window info 为一个映射, 它与
browser.ClientWindowsInfo产生式匹配,其clientWindow字段设置为 client window id,state字段设置为 state,x字段设置为 client window 的 x 坐标,y字段设置为 client window 的y 坐标,width字段设置 为 client window 的宽度,height字段 设置为 client window 的高度,且active字段设置为 active。 -
返回 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
-
使用 session 结束会话。
-
如果活动会话不是空,实现可以 返回带有错误 代码 unable to close browser 的错误,然后 并行运行以下步骤:
-
等到发送 WebSocket 消息步骤已使用 对此命令的 响应被调用。
-
使用 session 清理会话。
注:当浏览器具有多个自动化 会话时的行为目前未指定。可能是任何会话都可以关闭 浏览器,也可能只有最后一个打开的会话才能实际关闭浏览器, 或者只有第一个启动的会话可以。此行为可能会在本规范的未来版本中 完全指定。
-
-
对于活动会话中的每个 active session:
-
-
等到发送 WebSocket 消息步骤已使用 对此命令的 响应被调用。
-
使用 session 清理会话。
-
在不提示卸载的情况下关闭任何顶级 traversable。
-
执行实现定义的步骤,以清理与自动化控制下的远端关联的资源。
注:例如,这可能包括 干净地关闭与自动化控制下的浏览器关联的任何 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
给定 session 和 command parameters 时,远端步骤为:
-
令 user context 为一个新的用户上下文。
-
如果 command parameters 包含 "
acceptInsecureCerts":注:如果设置了 "
acceptInsecureCerts", 它会覆盖 接受不安全 TLS 标志的行为。-
令 acceptInsecureCerts 为 command parameters["
acceptInsecureCerts"]: -
如果 acceptInsecureCerts 为 true,且端点节点不支持 接受不安全 TLS 连接,则返回带有 错误代码 unsupported operation 的错误。
-
将 session 的 用户上下文到接受不安全证书覆盖映射[user context] 设置为 acceptInsecureCerts。
-
-
如果 command parameters 包含 "
unhandledPromptBehavior", 则将未处理提示行为覆盖 映射[user context] 设置为 command parameters["unhandledPromptBehavior"]。 -
如果 command parameters 包含 "
proxy":-
令 proxy configuration 为 command parameters["
proxy"]。 -
如果远端无法按用户 上下文配置代理设置, 或无法用 proxy configuration 配置代理,则返回带有 错误代码 unsupported operation 的错误。
-
将 session 的 用户上下文到代理 配置映射[user context] 设置为 proxy configuration。
-
-
令 user context info 为一个映射, 它与
browser.UserContextInfo产生式匹配,其userContext字段设置为 user context 的用户上下文 id。 -
返回带有数据 user context info 的成功。
7.2.4.3. browser.getClientWindows 命令
browser.getClientWindows 命令返回 客户端窗口列表。
- 命令类型
-
browser.GetClientWindows= (method:"browser.getClientWindows",params: EmptyParams, ) - 返回类型
-
browser.GetClientWindowsResult= {clientWindows: [ * browser.ClientWindowInfo] }
远端步骤为:
-
令 client window ids 为空集合。
-
令 client windows 为空列表。
-
对于每个顶级 traversable traversable:
-
令 result 为一个映射, 它与
browser.GetClientWindowsResult产生式匹配,其clientWindows字段设置为 client windows。 -
返回带有数据 result 的成功。
7.2.4.4. browser.getUserContexts 命令
browser.getUserContexts 命令返回 用户上下文列表。
- 命令类型
-
browser.GetUserContexts= (method:"browser.getUserContexts",params: EmptyParams, ) - 返回类型
-
browser.GetUserContextsResult= {userContexts: [ + browser.UserContextInfo] }
远端步骤为:
7.2.4.5. browser.removeUserContext 命令
browser.removeUserContext 命令关闭一个
用户上下文及其中的所有 navigable,且不运行
beforeunload 处理程序。
- 命令类型
-
browser.RemoveUserContext= (method:"browser.removeUserContext",params: browser.RemoveUserContextParameters )browser.RemoveUserContextParameters= {userContext: browser.UserContext } - 返回类型
-
browser.RemoveUserContextResult= EmptyResult
给定 command parameters 时,远端步骤为:
-
令 user context id 为 command parameters["
userContext"]。 -
如果 user context id 是
"default",则返回带有错误代码 invalid argument 的错误。 -
将 user context 设置为用 user context id 调用获取用户上下文的结果。
-
如果 user context 为 null,则返回带有错误代码 no such user context 的错误。
-
对于每个顶级 traversable navigable:
-
返回带有数据 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
给定 session 和 command parameters 时,远端步骤为:
-
如果实现完全不支持设置客户端窗口状态, 则返回带有错误 代码 unsupported operation 的错误。
-
如果存在一个客户端 窗口,其客户端窗口 id 为 command parameters["
clientWindow"],则令 client window 为该客户端窗口。 否则返回带有错误 代码 no such client window 的错误。 -
如果 command parameters["
state"] 是 "normal":-
如果 command parameters 包含 "
x",并且 实现支持定位客户端窗口,则将 client window 的x 坐标设置为尽可能接近 command parameters["x"] 的值。 -
如果 command parameters 包含 "
y",并且 实现支持定位客户端窗口,则将 client window 的y 坐标设置为尽可能接近 command parameters["y"] 的值。 -
如果 command parameters 包含 "
width",并且 实现支持调整客户端窗口大小,则将 client window 的宽度设置为尽可能接近 command parameters["width"] 的值。 -
如果 command parameters 包含 "
width",并且 实现支持调整客户端窗口大小,则将 client window 的宽度设置为尽可能接近 command parameters["width"] 的值。
-
-
令 client window info 为使用 client window 调用获取客户端窗口信息的结果。
-
返回带有数据 client window info 的成功。
注:为简单起见,这里将所有客户端窗口 操作都建模为 同步。因此,返回的客户端窗口尺寸预期是 窗口达到其新状态之后的尺寸。
7.2.4.7. browser.setDownloadBehavior 命令
下载行为 结构体是一个具有以下内容的结构体:
远端具有一个下载行为,它是一个结构体,具有一个 名为 default download behavior 的项,它是一个 下载 行为结构体或 null,以及一个名为 user context download behavior 的项,它是 用户上下文与下载 行为结构体之间的弱映射。
- 命令类型
-
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
-
令 user context 为 navigable 的关联用户 上下文。
-
如果下载 行为的user context download behavior 包含 user context,则返回下载行为的 user context download behavior[user context]。
给定 session 和 command parameters 时,远端步骤为:
-
如果 command parameters["
downloadBehavior"] 为 null,则令 download behavior 为 null。 -
否则:
-
如果 command parameters["
downloadBehavior"]["type"] 是 "allowed",则令 allowed 为 true,否则令 allowed 为 false。 -
如果 command parameters["
downloadBehavior"] 包含 "destinationFolder",则令 destinationFolder 为 command parameters["downloadBehavior"]["destinationFolder"], 否则令 destinationFolder 为 null。 -
令 download behavior 为一个下载 行为结构体,其 allowed 设置为 allowed, 且 destinationFolder 设置 为 destinationFolder。
-
-
如果实现不支持所需的 download behavior,则返回 带有错误 代码 unsupported operation 的错误。
-
如果 command parameters 的
userContexts字段存在:-
令 user contexts 为尝试用 command parameters["
userContexts"] 获取有效用户上下文 所得的结果。 -
对于 user contexts 中的每个 user context:
-
如果 download behavior 为 null,则从下载行为的 user context download behavior中移除 user context。
-
否则,将下载 行为的 user context download behavior[user context] 设置为 download behavior。
-
-
-
否则,将下载行为的default download behavior设置为 download behavior。
-
返回带有数据 null 的成功。
7.3. browsingContext 模块
browsingContext 模块包含与navigable相关的命令和 事件。
注:由于历史原因,此模块称为
browsingContext
而不是 navigable,并且协议使用术语
context 来指代 navigable,尤其是作为命令
和响应参数中的字段时。
导航进度使用一个不可变结构体 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 会话存活更久。
viewport 尺寸是一个具有以下内容的结构体:
viewport 配置是一个具有以下内容的结构体:
-
名为 viewport 的项,它是viewport 尺寸或 null;
-
名为 devicePixelRatio 的项,它是浮点数或 null。
未处理 提示行为结构体是一个具有以下内容的结构体:
-
名为
alert的项,它是字符串或 null; -
名为
beforeUnload的项,它是字符串或 null; -
名为
confirm的项,它是字符串 或 null; -
名为
default的项,它是字符串 或 null; -
名为
file的项,它是字符串或 null; -
名为
prompt的项,它是字符串或 null。
远端具有viewport 覆盖映射,它是用户上下文与viewport 配置之间的弱映射。
远端具有locale 覆盖映射,它是 navigable或用户上下文与字符串之间的弱映射。
screen settings 是一个
结构体,具有
一个名为
height 的项,它是整数;
一个名为 width 的项,它是整数;
一个名为 x 的项,它是整数;
一个名为 y 的项,它是整数。
远端具有screen settings 覆盖,它是一个结构体,具有 一个名为 user context screen settings 的项, 它是用户 上下文与screen settings之间的弱映射, 以及一个名为 navigable screen settings 的项, 它是navigable与screen settings之间的弱映射。
远端具有timezone 覆盖映射,它是 navigable或用户上下文与字符串之间的弱映射。
远端具有一个未处理提示行为覆盖映射, 它是 用户上下文与 未处理提示行为结构体之间的 弱映射。
远端具有scripting enabled 覆盖映射,它是 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还具有一个关联的original opener, 它是导致该 navigable 打开的navigable 或 null,初始设置为 null。
-
如果 navigable id 为 null,则返回带有数据 null 的成功。
-
如果不存在navigable id 为 navigable id 的 navigable,则返回 带有错误 代码 no such frame 的错误
-
令 navigable 为 id 为 navigable id 的navigable。
-
返回带有数据 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 的属性。
TODO:使其按文档顺序返回列表
-
令 child navigables 为一个集合, 包含所有作为 navigable 的子 navigable的 navigable。
-
返回 child navigables。
-
令 navigable id 为 navigable 的navigable id。
-
令 parent navigable 为 navigable 的父级。
-
如果 parent navigable 非 null,则令 parent id 为 parent navigable 的navigable id。否则令 parent id 为 null。
-
令 document 为 navigable 的活动文档。
-
令 url 为在给定 document 的URL的情况下运行 URL 序列化器所得的结果。
注:这包括 URL 的片段组成部分。
-
令 child infos 为 null。
-
如果 max depth 为 null,或 max depth 大于 0:
-
令 child navigables 为给定 navigable 时调用获取子 navigable的结果。
-
如果 max depth 非 null,则令 child depth 为 max depth - 1, 否则为 null。
-
将 child infos 设置为空列表。
-
对于 child navigables 中的每个 child navigable:
-
令 info 为给定 child navigable、child depth 和 false 时调用获取 navigable 信息的结果。
-
将 info 追加到 child infos
-
-
-
令 user context 为 navigable 的关联用户 上下文。
-
如果 navigable 的original opener 非 null, 则令 opener id 为 navigable 的 original opener的navigable id, 否则为 null。
-
令 top-level traversable 为 navigable 的顶级 traversable。
-
令 client window id 为 top-level traversable 的关联客户端窗口的客户端窗口 id。
-
令 navigable info 为一个映射, 它与
browsingContext.Info产生式匹配,其中context字段设置为 navigable id;如果 include parent id 为true,则parent字段设置为 parent id,否则不设置;url字段设置为 url;userContext字段设置 为 user context 的用户上下文 id;originalOpener字段 设置为 opener id;children字段设置为 child infos;且clientWindow字段设置为 client window id。 -
返回 navigable info。
default")和 ignore cache(默认值:false)的情况下
等待导航:
-
令 navigation id 为一个基于真正随机数或 伪随机数的 UUID 的字符串表示。
-
用资源 request 导航 navigable, 并使用 navigable 的活动文档作为来源
Document, 导航时使用 navigation id navigation id 和 历史处理行为 history handling。如果 ignore cache 为 true, 则该导航不得从 HTTP 缓存加载资源。准确 指定 ignore cache 标志如何工作。这需要 考虑是否只有资源的首次加载会绕过缓存 (即这是否类似于最初清除缓存然后像 通常一样继续),或者不是由 HTML 解析器直接加载的资源 (例如由脚本或样式表发起的加载)是否也会绕过缓存。
-
令(event received、navigation status)为在给定 «"
navigation started", "navigation failed", "fragment navigated"» 和 navigation id 的情况下进行 await 的结果。 -
断言:navigation status 的id 是 navigation id。
-
如果 navigation status 的status 是 "
complete":-
令 body 为一个映射, 它与
browsingContext.NavigateResult产生式匹配,其中navigation字段设置为 navigation id,且url字段设置为在给定 navigation status 的url时运行 URL 序列化器所得的结果。 -
返回带有数据 body 的成功。
注:如果导航仅导致片段 改变,就是这种情况。
-
-
如果 navigation status 的status 是 "
canceled", 则返回带有错误 代码 unknown error 的错误。TODO:这是在这里处理错误的正确方式吗?
-
断言:navigation status 的status 是 "
pending",并且 navigation id 不是 null。 -
如果 wait condition 是 "
committed",则令 event name 为 "committed"。 -
否则,如果 wait condition 是 "
interactive",则令 event name 为 "domContentLoaded"。 -
否则,令 event name 为 "
load"。 -
令(event received、status)为在给定 «event name, "
download started", "navigation aborted", "navigation failed"» 和 navigation id 的情况下进行 await 的结果。 -
如果 event received 是 "
navigation failed", 则返回带有错误 代码 unknown error 的错误。我们在这里用 错误暴露了足够多关于失败内容和原因的信息吗? 我们想要什么错误代码?本地端是否会解析实现定义的字符串 来弄清楚实际出了什么问题,从而造成问题?
-
令 body 为一个映射, 它与
browsingContext.NavigateResult产生式匹配,其中navigation字段设置为 status 的 id,且url字段设置为在给定 status 的 url 时运行 URL 序列化器所得的结果。 -
返回带有数据 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 id 为 navigable 的navigable id。
-
令 navigation id 为 navigation status 的id。
-
令 timestamp 为表示当前 UTC 日期和 时间的时间值。
-
令 url 为 navigation status 的url。
-
返回一个与
browsingContext.NavigationInfo产生式匹配的映射,其中context字段设置为 navigable id,navigation字段设置为 navigation id,timestamp字段设置为 timestamp,url字段设置为在给定 url 的情况下运行 URL 序列化器所得的结果,且userContext字段设置为 user context id。
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 时,远端步骤为:
-
令 navigable id 为 command parameters["
context"] 字段的值。 -
令 navigable 为使用 navigable id 尝试获取 navigable的结果。
-
如果 navigable 不是顶级 traversable,则返回带有错误 代码 invalid argument 的错误。
-
返回使用 navigable 调用激活 navigable的结果。
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 }
-
令 rect1 为用 rect1 调用规范化矩形的结果。
-
令 rect2 为用 rect2 调用规范化矩形的结果。
-
令 x1_0 为 rect1 的x 坐标。
-
令 x2_0 为 rect2 的x 坐标。
-
令 x_0 为 «x1_0, x2_0» 的最大元素。
-
令 x_1 为 «x1_1, x2_1» 的最小元素。
-
令 y1_0 为 rect1 的y 坐标。
-
令 y2_0 为 rect2 的y 坐标。
-
令 y_0 为 «y1_0, y2_0» 的最大元素。
-
令 y_1 为 «y1_1, y2_1» 的最小元素。
-
如果 x_1 小于 x_0,则令 width 为 0。否则令 width 为 x_1 - x_0。
-
如果 y_1 小于 y_0,则令 height 为 0。否则令 height 为 y_1 - y_0。
-
返回一个新的
DOMRectReadOnly, 其x 坐标为 x_0,y 坐标 为 y_0,宽度尺寸为 width,且高度尺寸为 height。
-
令 ratio 为在给定 document 的默认视图的情况下确定 device pixel ratio所得的结果。
-
令 paint width 为 rect 的宽度尺寸乘以 ratio, 四舍五入到最接近的整数,使其与 rect 在设备像素中的宽度 相匹配。
-
令 paint height 为 rect 的高度尺寸乘以 ratio, 四舍五入到最接近的整数,使其与 rect 在设备像素中的高度 相匹配。
-
令 canvas 为新的
HTMLCanvasElement, 其width为 paint width,height为 paint height。 -
令 canvas context 为用 canvas 和 null 运行 2D 上下文创建算法 所得的结果。
-
完成特定于实现的步骤,其等价于将 framebuffer 中表示 document 被 rect 覆盖区域的区域绘制到 canvas context,使 framebuffer 中的每个像素对应于 canvas context 中的一个像素,其中视口坐标中的(rect 的x 坐标,rect 的y 坐标)对应于 canvas context 中的 (0,0),而(rect 的 x 坐标 + rect 的宽度尺寸,rect 的 y 坐标 + rect 的高度尺寸)对应于(paint width,paint height)。
-
返回 canvas。
-
如果 format 不是 null,则令 type 为 format 的
type字段,且令 quality 为 format 的quality字段。 -
否则,令 type 为 "image/png",并令 quality 为undefined。
-
令 file 为 canvas 在给定 type 和 quality 的情况下的位图作为文件的序列化。
-
令 encoded string 为 file 的forgiving-base64 编码。
-
返回带有数据 encoded string 的成功。
-
如果 origin 是
"viewport": -
断言:origin 是
"document"。 -
令 document element 为 document 的document element。
-
令 document rect 为一个
DOMRectReadOnly, 其x 坐标为 0,y 坐标为 0,宽度尺寸为 document element 的scroll height, 且高度尺寸为 document element 的scroll width。 -
返回带有数据 document rect 的成功。
给定 session 和 command parameters 时,远端步骤为:
-
令 navigable id 为 command parameters 的
context字段的值, 如果存在的话;否则为 null。 -
令 navigable 为使用 navigable id 尝试获取 navigable 所得的结果。
-
如果实现因任何原因无法捕获 navigable 的屏幕截图, 则返回带有错误 代码 unsupported operation 的错误。
-
令 document 为 navigable 的活动文档。
-
在下次为 document 调用运行动画帧回调算法之后立即:
-
令 origin 为 command parameters 的
context字段的值,如果存在的话;否则为 "viewport"。 -
令 origin rect 为在给定 origin 和 document 的情况下 尝试获取 origin 矩形 所得的结果。
-
令 clip rect 为 origin rect。
-
如果 command parameters 包含 "
clip":-
令 clip 为 command parameters["
clip"]。 -
运行第一个匹配条件下的步骤:
- clip 与
browsingContext.ElementClipRectangle产生式匹配: -
-
令 environment settings 为环境设置对象, 其 相关全局对象的关联
Document是 document。 -
令 realm 为 environment settings 的realm 执行上下文的 Realm 组件。
-
令 element 为用 clip["
element"]、realm 和 session 尝试反序列化远程 引用所得的结果。 -
如果 element 没有实现
Element, 则返回带有错误代码 no such element 的错误。 -
如果 element 的节点文档不是 document,则返回带有 错误代码 no such element 的错误。
-
令 viewport rect 为在给定 "
viewport" 和 document 的情况下调用获取 origin 矩形的结果。 -
令 element rect 为针对 element 获取边界框所得的结果。
-
令 clip rect 为一个
DOMRectReadOnly, 其x 坐标为 element rect["x"] + viewport rect["x"], y 坐标为 element rect["y"] + viewport rect["y"],width 为 element rect["width"], 且 height 为 element rect["height"]。
-
- clip 与
browsingContext.BoxClipRectangle产生式匹配: -
-
令 clip x 为 clip["
x"] 加上 origin rect 的x 坐标。 -
令 clip y 为 clip["
y"] 加上 origin rect 的y 坐标。 -
令 clip rect 为一个
DOMRectReadOnly, 其x 坐标为 clip x, y 坐标为 clip y,width 为 clip["width"],且 height 为 clip["height"]。
-
- clip 与
-
-
注:所有坐标现在都从文档的 origin 开始测量。
-
令 rect 为 origin rect 和 clip rect 的矩形交集。
-
如果 rect 的宽度尺寸为 0,或 rect 的高度尺寸为 0, 则返回带有错误代码 unable to capture screen 的错误。
-
令 canvas 为用 document 和 rect 将 document 渲染到 canvas所得的结果。
-
令 format 为 command parameters 的
format字段。 -
令 encoding result 为用 canvas 和 format 尝试将 canvas 编码为 Base64所得的结果。
-
令 body 为一个与
browsingContext.CaptureScreenshotResult产生式匹配的映射,其中data字段设置为 encoding result。 -
返回带有数据 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
-
令 navigable id 为 command parameters 的
context字段的值。 -
令 prompt unload 为 command parameters 的
promptUnload字段的值。 -
令 navigable 为用 navigable id 尝试获取 navigable 所得的结果。
-
断言:navigable 不是 null。
-
如果 navigable 不是顶级 traversable,则返回带有 错误代码 invalid argument 的错误。
-
如果 prompt unload 为 true:
-
关闭 navigable。
-
-
否则:
-
返回带有数据 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 }
-
令 type 为 command parameters 的
type字段的值。 -
令 reference navigable id 为 command parameters 的
referenceContext字段的值,如果存在的话;否则为 null。 -
如果 reference navigable id 不是 null,则令 reference navigable 为 用 reference navigable id 尝试获取 navigable所得的结果。否则令 reference navigable 为 null。
-
如果 reference navigable 不是 null 且不是顶级 traversable, 则返回带有错误 代码 invalid argument 的错误。
-
如果实现因任何原因无法创建新的顶级 traversable,则返回带有错误 代码 unsupported operation 的错误。
-
如果 reference navigable 为 null,则令 user context 为默认用户上下文,否则为 reference navigable 的关联用户 上下文。
-
令 user context id 为 command parameters 的
userContext字段的值, 如果存在的话;否则为 null。 -
如果 user context id 不是 null,则将 user context 设置为用 user context id 尝试获取用户上下文所得的结果。
-
如果 user context 为 null,则返回带有错误代码 no such user context 的错误。
-
如果实现因任何原因无法用关联用户上下文 user context 创建新的顶级 traversable,则返回 带有错误 代码 unsupported operation 的错误。
-
令 traversable 为尝试用 null 和空字符串执行创建新的顶级 traversable 步骤,并将新创建顶级 traversable的关联用户上下文设置为 user context 所得的结果。 新的顶级 traversable创建在哪个 OS 窗口中取决于 type 和 reference navigable:
-
如果 type 是 "
tab",且实现支持 同一 OS 窗口中的多个顶级 traversable:-
新的顶级 traversable应复用 现有 OS 窗口(如果有)。
-
如果 reference navigable 不是 null,新的顶级 traversable应 复用包含 reference navigable 的窗口(如果有)。如果 OS 窗口内的顶级 traversable 有明确的排序, 新的顶级 traversable应在该排序中 紧接在 reference navigable 的顶级 traversable之后。
-
-
如果 type 是 "
window",且实现支持 分别位于独立 OS 窗口中的多个顶级 traversable,则创建的 顶级 traversable应位于新的 OS 窗口中。 -
否则,该顶级 traversable如何呈现给 用户的细节是实现定义的。
-
-
如果 command parameters 的
background字段的值为 false:-
令 activate result 为用新创建的navigable 调用激活 navigable所得的结果。
-
如果 activate result 是一个错误, 则返回 activate result。
注:如果
background为 true,不要为创建的 navigable 调用聚焦步骤。 -
-
令 body 为一个与
browsingContext.CreateResult产生式匹配的映射, 其中context字段设置为 traversable 的navigable id,且userContext属性设置为 traversable 的 关联用户上下文的用户 上下文 id。 -
返回带有数据 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 }
-
令 root id 为 command parameters 的
root字段的值, 如果存在的话;否则为 null。 -
令 max depth 为 command parameters 的
maxDepth字段的值,如果存在的话;否则为 null。 -
令 navigables 为空列表。
-
如果 root id 不是 null,则将给定 root id 时 尝试获取 navigable所得的结果追加到 navigables。 否则将所有顶级 traversable追加到 navigables。
-
令 navigables infos 为空列表。
-
对于 navigables 中的每个 navigable:
-
令 info 为给定 navigable、max depth 和 true 时调用获取 navigable 信息所得的结果。
-
将 info 追加到 navigables infos
-
-
令 body 为一个与
browsingContext.GetTreeResult产生式匹配的映射, 其中contexts字段设置为 navigables infos。 -
返回带有数据 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
给定 session 和 command parameters 时,远端步骤为:
-
令 navigable id 为 command parameters 的
context字段的值。 -
令 navigable 为用 navigable id 尝试获取 navigable 所得的结果。
-
令 accept 为 command parameters 的
accept字段的值,如果存在的话;否则为 true。 -
令 userText 为 command parameters 的
userText字段的值,如果存在的话;否则为空字符串。 -
如果 navigable 当前显示的是由调用 alert 产生的简单对话框,则 确认该提示。
否则,如果 navigable 当前显示的是由调用 confirm 产生的简单对话框,则当 accept 为 true 时肯定响应, 或当 accept 为 false 时 否定响应。
否则,如果 navigable 当前显示的是由调用 prompt 产生的简单对话框,则当 accept 为 true 时用字符串值 userText 响应,或当 accept 为 false 时中止。
否则,如果 navigable 当前显示的是作为提示卸载步骤的一部分的提示,则当 accept 为 true 时确认该 导航,否则 拒绝该导航。
否则,返回带有错误 代码 no such alert 的错误。
-
返回带有数据 null 的成功。
7.3.3.7. browsingContext.locateNodes 命令
browsingContext.locateNodes 命令返回 与指定定位器匹配的所有节点列表。
- 命令类型
-
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 的情况下使用 XPath 定位节点:
注:由于 XPath 规范处于无人维护状态,本算法被表述为像是在调用 XPath DOM API。 然而,应将其理解为等价于直接访问底层算法的规范内部调用, 而不经过 ECMAScript 运行时。
-
令 returned nodes 为空列表。
-
对于 context nodes 中的每个 context node:
-
令 evaluate result 为在 navigable 的 活动文档上调用 evaluate,并以 selector、context node、null、 ORDERED_NODE_SNAPSHOT_TYPE 和 null 作为实参所得的结果。如果这抛出一个 "SyntaxError" DOMException,则返回带有 错误代码 invalid selector 的错误; 否则,如果这抛出任何其他异常,则返回带有 错误代码 unknown error 的错误。
-
令 index 为 0。
-
令 length 为从 evaluate result 获取
snapshotLength属性所得的结果。 -
当 index 小于 length 时,重复:
-
令 node 为以 evaluate result 作为 this、以 index 作为实参调用 snapshotItem所得的结果。
-
将 node 追加到 returned nodes。
-
如果 maximum returned node count 不是 null,且 returned nodes 的大小等于 maximum returned node count, 则返回带有数据 returned nodes 的成功。
-
将 index 设置为 index + 1。
-
-
-
返回带有数据 returned nodes 的成功。
-
如果 selector 是空字符串,则返回带有错误代码 invalid selector 的错误。
-
令 returned nodes 为空列表。
-
如果 ignore case 为 false,则令 search text 为 selector。否则, 令 search text 为按 Unicode 默认大小写转换算法对 selector 执行 toUppercase所得的结果。
-
对于 context nodes 中的每个 context node:
-
如果 context node 实现了
Document或DocumentFragment:注:遍历 document 或 document fragment 时,
max depth有意不减少,以使使用document和document.documentElement的搜索结果等价。 -
如果 context node 没有实现
HTMLElement, 则继续。 -
令 node inner text 为以 context node 作为 this 值调用 innerText getter 步骤所得的结果。
-
如果 ignore case 为 false,则令 node text 为 node inner text。否则, 令 node text 为按 Unicode 默认大小写转换算法对 node inner text 执行 toUppercase所得的结果。
-
如果 search text 是 node text 的码点子字符串, 则执行以下步骤:
-
令 child nodes 为空列表,并且 对于 context node 的 子节点中的每个节点 child:
-
将 child 追加到 child nodes。
-
-
如果 child nodes 的大小等于 0,或 max depth 等于 0, 则执行以下步骤:
-
否则,执行以下步骤:
-
如果 max depth 为 null,则令 child max depth 为 null, 否则为 max depth - 1。
-
令 child node matches 为用 child nodes、selector、child max depth、match type、 ignore case 和 maximum returned node count 调用使用 inner text 定位节点所得的结果。
-
如果 child node matches 的大小等于 0 且 match type 是
"partial",则将 context node 追加到 returned nodes。否则,用 child node matches 扩展 returned nodes。
-
-
-
-
如果 maximum returned node count 不是 null,则移除 returned nodes 中索引大于或等于 maximum returned node count 的所有条目。
-
返回带有数据 returned nodes 的成功。
-
如果 returned nodes 为 null:
-
将 returned nodes 设置为空列表。
-
-
对于 context nodes 中的每个 context node:
-
令 match 为 true。
-
如果 context node 实现了
Element: -
否则,将 match 设置为 false。
-
如果 match 为 true:
-
尝试用 child nodes、selector、maximum returned node count 和 returned nodes 使用无障碍属性收集节点。
-
-
返回 returned nodes。
-
如果 selector 不包含 "
role",且 selector 不包含 "name",则返回 带有错误 代码 invalid selector 的错误。 -
返回用 context nodes、selector、maximum returned node count 和 null 调用使用无障碍属性收集节点所得的结果。
-
令 navigable id 为 command parameters["
context"]。 -
令 navigable 为用 navigable id 尝试获取 navigable 所得的结果。
-
断言:navigable 不是 null。
-
令 realm 为用 navigable 的navigable id 和 null 尝试从 navigable 获取 realm 所得的结果。
-
令 locator 为 command parameters["
locator"]。 -
如果 command parameters 包含 "
startNodes",则令 start nodes parameter 为 command parameters["startNodes"]。 否则令 start nodes parameter 为 null。 -
如果 command parameters 包含 "
maxNodeCount",则令 maximum returned node count 为 command parameters["maxNodeCount"]。 否则,令 maximum returned node count 为 null。 -
令 context nodes 为空列表。
-
如果 start nodes parameter 为 null,则将 navigable 的 活动文档追加到 context nodes。否则,对于 start nodes parameter 中的每个 serialized start node:
-
断言 context nodes 的大小大于 0。
-
令 type 为 locator["
type"]。 -
在以下条件及其关联步骤列表中,运行第一个其关联条件为 true 的 步骤集合:
- type 是字符串 "
css" -
-
令 selector 为 locator["
value"]。 -
令 result nodes 为给定 navigable、context nodes、selector 和 maximum returned nodes 时尝试使用 css 定位节点所得的结果。
-
- type 是字符串 "
xpath" -
-
令 selector 为 locator["
value"]。 -
令 result nodes 为给定 navigable、context nodes、selector 和 maximum returned nodes 时尝试使用 xpath 定位节点所得的结果。
-
- type 是字符串 "
innerText" -
-
令 selector 为 locator["
value"]。 -
如果 locator 包含
maxDepth,则令 max depth 为 locator["maxDepth"]。否则,令 max depth 为 null。 -
如果 locator 包含
ignoreCase,则令 ignore case 为 locator["ignoreCase"]。否则,令 ignore case 为 false。 -
如果 locator 包含
matchType,则令 match type 为 locator["matchType"]。否则,令 match type 为 "full"。 -
令 result nodes 为给定 context nodes、selector、max depth、 match type、ignore case 和 maximum returned node count 时 尝试使用 inner text 定位节点所得的结果。
-
- type 是字符串 "
accessibility" -
-
令 selector 为 locator["
value"]。 -
令 result nodes 为给定 context nodes、selector 和 maximum returned node count 时使用无障碍属性定位节点所得的结果。
-
- type 是字符串 "
context" -
-
如果 start nodes parameter 不是 null, 则返回带有错误代码 "
invalid argument" 的错误。 -
令 selector 为 locator["
value"]。 -
令 context id 为 selector["
context"]。 -
令 child navigable 为用 context id 尝试获取 navigable 所得的结果。
-
如果 child navigable 的父级不是 navigable, 则返回带有错误代码 "
invalid argument" 的错误。 -
令 result nodes 为给定 child navigable 时定位容器元素所得的结果。
-
断言:对于 result nodes 中的每个 node, node 的节点 navigable是 navigable。
-
- type 是字符串 "
-
断言:maximum returned node count 为 null,或 result nodes 的大小小于或等于 maximum returned node count。
-
如果 command parameters 包含 "
serializationOptions", 则令 serialization options 为 command parameters["serializationOptions"]。 否则,令 serialization options 为一个与script.SerializationOptions产生式匹配、且各字段 设置为其默认值的映射。 -
令 result ownership 为 "none"。
-
令 serialized nodes 为空列表。
-
对于 result nodes 中的每个 result node:
-
令 result 为一个与
browsingContext.LocateNodesResult产生式匹配的映射, 其nodes字段设置为 serialized nodes。 -
返回带有数据 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, }
-
令 navigable id 为 command parameters 的
context字段的值。 -
令 navigable 为用 navigable id 尝试获取 navigable 所得的结果。
-
断言:navigable 不是 null。
-
令 wait condition 为 "
committed"。 -
如果 command parameters 包含
wait且 command parameters[wait] 不是 "none", 则将 wait condition 设置为 command parameters[wait]。 -
令 url 为 command parameters 的
url字段的值。 -
令 document 为 navigable 的活动文档。
-
令 base 为 document 的基 URL。
-
如果 url record 为 failure,则返回带有错误代码 invalid argument 的错误。
-
令 request 为一个新的 request,其 URL 为 url record。
-
返回用 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-lengthsbrowsingContext.PrintPageParameters= { ?height: (float .ge 0.0352) .default 27.94, ?width: (float .ge 0.0352) .default 21.59, } - 返回类型
-
browsingContext.PrintResult= {data: text }
给定 session 和 command parameters 时,远端步骤为:
-
令 navigable id 为 command parameters 的
context字段的值。 -
令 navigable 为用 navigable id 尝试获取 navigable 所得的结果。
-
如果实现因任何原因无法提供 navigable 的分页表示, 则返回带有 错误代码 unsupported operation 的错误。
-
令 margin 为 command parameters 的
margin字段的值(如果存在),否则为一个与browsingContext.PrintMarginParameters匹配且字段设置为 其默认值的映射。 -
令 page size 为 command parameters 的
page字段的值(如果存在),否则为一个与browsingContext.PrintPageParameters匹配且字段设置为 其默认值的映射。
注:最小页面尺寸为 1 点, 根据绝对长度,即 (2.54 / 72) cm。
-
令 page ranges 为 command parameters 的
pageRanges字段的值, 如果存在的话;否则为空列表。 -
令 document 为 navigable 的活动文档。
-
在下次为 document 调用运行动画帧回调 算法之后立即:
-
令 pdf data 为采取 UA 特定步骤生成 document 的分页表示的结果,其中 CSS 媒体类型设置为
print,编码为 PDF,并使用以下纸张设置:属性 值 宽度,单位为 cm 如果 command parameters[" orientation"] 是 "portrait",则为 page size["width"], 否则为 page size["height"]高度,单位为 cm 如果 command parameters[" orientation"] 是 "portrait",则为 page size["height"], 否则为 page size["width"]上边距,单位为 cm margin[" top"]下边距,单位为 cm margin[" bottom"]左边距,单位为 cm margin[" left"]右边距,单位为 cm margin[" right"]此外,UA 应应用以下格式化提示:
- 如果 command parameters["
scale"] 不等于1: - 按因子 command
parameters["
scale"] 缩放内容尺寸 - 如果 command parameters["
background"] 为 false: - 抑制背景图像的输出
- 如果 command parameters["
shrinkToFit"] 为 true: - 调整内容尺寸以匹配页面宽度,并覆盖内容中指定的任何页面 宽度
- 如果 command parameters["
-
如果 page ranges 不是空, 则令 pages 为用 page ranges 和 pdf data 中包含的页数尝试解析页面范围所得的结果, 然后从 pdf data 中移除其从一开始的索引未包含在 pages 中的任何页面。
-
令 encoding result 为在 pdf data 上调用 Base64 Encode所得的结果。
-
令 encoded data 为 encoding result 的 data。
-
令 body 为一个与
browsingContext.PrintResult产生式匹配的映射, 其data字段设置为 encoded data。 -
返回带有数据 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
-
令 navigable id 为 command parameters 的
context字段的值。 -
令 navigable 为用 navigable id 尝试获取 navigable 所得的结果。
-
断言:navigable 不是 null。
-
令 ignore cache 为 command parameters 的
ignoreCache字段的值(如果存在),否则为 false。 -
令 wait condition 为 "
committed"。 -
如果 command parameters 包含
wait且 command parameters[wait] 不是 "none", 则将 wait condition 设置为 command parameters[wait]。 -
令 document 为 navigable 的活动文档。
-
令 url 为 document 的URL。
-
令 request 为一个新的 request,其 URL 为 url。
-
返回用 navigable、 request、wait condition、历史处理 "
reload" 和 ignore cache ignore cache 调用等待导航所得的结果。
7.3.3.11. browsingContext.setBypassCSP 命令
browsingContext.setBypassCSP 命令允许绕过 Content Security Policy 的强制执行。
注:启用 CSP 绕过时,所有 CSP 指令都会被 绕过,包括通常会阻止 eval()、new Function()、内联脚本和资源 加载的指令。
- 命令类型
-
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 被绕过步骤为:
-
令 top-level traversable 为 navigable 的顶级 traversable。
-
令 bypass CSP enabled 为针对 top-level traversable 的 绕过 CSP 配置调用获取 WebDriver 配置值所得的结果。
-
断言:bypass CSP enabled 是
true或 unset。 -
如果 bypass CSP enabled 是 unset,则返回 false。
-
返回 true。
给定 command parameters 时,远端步骤为:
-
令 bypass 为 command parameters["
bypass"]。 -
如果 bypass 为 null,则将 bypass 设置为 unset。
-
尝试为 command parameters 存储 WebDriver 配置 绕过 CSP 配置 bypass。
-
返回带有数据 null 的成功。
7.3.3.12. browsingContext.setViewport 命令
browsingContext.setViewport 命令修改给定顶级 traversable 上的特定 viewport 特征(例如 viewport width 和 viewport height)。
- 命令类型
-
browsingContext.SetViewport= (method:"browsingContext.setViewport",params: browsingContext.SetViewportParameters )browsingContext.SetViewportParameters= { ?context: browsingContext.BrowsingContext, ?viewport: browsingContext.Viewport / null, ?devicePixelRatio: (float .gt 0.0) / null, ?userContexts: [+browser.UserContext], }browsingContext.Viewport= {width: js-uint,height: js-uint, } - 返回类型
-
browsingContext.SetViewportResult= EmptyResult
-
如果 device pixel ratio 不是 null:
-
对于当前加载在指定 navigable 中的document:
-
当运行从 source set 选择图像源步骤时, 在选择图像时,表现得如同实现的像素密度被设置为 device pixel ratio。
-
就 resolution 媒体特性而言,表现得如同 实现的 resolution 是按页面缩放缩放的 device pixel ratio dppx。
-
-
将device pixel ratio 覆盖[navigable] 设置为 device pixel ratio。
注:这会因 § 8.3.1 确定 device pixel ratio 的补丁而生效。
-
-
否则:
-
对于当前加载在指定 navigable 中的document:
-
当运行从 source set 选择图像源步骤时,使用实现的默认行为, 不带有这些步骤先前调用所作的任何更改。
-
就 resolution 媒体特性而言,使用 实现的默认行为, 不带有这些步骤先前调用所作的任何更改。
-
-
从 device pixel ratio 覆盖中移除 navigable。
-
-
对当前加载在指定 navigable 中的document运行求值媒体查询并报告变化。
在新的 navigable navigable 中创建 document 之后, 且在调用运行 WebDriver BiDi 预加载脚本算法之前:
TODO:改为将其移作 html 规范中的一个钩子。
-
令 user context 为 navigable 的关联用户 上下文。
-
如果 navigable 是顶级 traversable:
-
为 navigable 更新 geolocation 覆盖。
-
为 navigable 更新模拟 forced colors 主题。
-
如果 screen orientation 覆盖映射 包含 user context, 则用 navigable 和 screen orientation 覆盖 映射[user context] 设置模拟 screen orientation。
-
-
如果 viewport 覆盖映射 包含 user context:
-
如果 navigable 是顶级 traversable,且 viewport 覆盖映射[user context] 的 viewport 不是 null:
-
用 navigable 和 viewport 覆盖映射[user context] 的 viewport 设置 viewport。
-
-
如果 viewport 覆盖映射[user context] 的devicePixelRatio 不是 null:
-
用 navigable 和 viewport 覆盖映射[user context] 的 devicePixelRatio 设置 device pixel ratio 覆盖。
-
-
-
为 navigable 更新 scrollbar type 覆盖。
给定 command parameters 时,远端步骤为:
-
如果实现因任何原因无法用给定 command parameters 调整布局视口 参数,则返回带有错误 代码 unsupported operation 的错误。
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "context", 则返回带有错误 代码 invalid argument 的错误。 -
令 navigables 为一个集合。
-
如果 command parameters 的
context字段存在:-
令 navigable id 为 command parameters 的
context字段的值。 -
令 navigable 为用 navigable id 尝试获取 navigable所得的结果。
-
如果 navigable 不是顶级 traversable,则返回带有 错误代码 invalid argument 的错误。
-
将 navigable 追加到 navigables。
-
-
否则,如果 command parameters 的
userContexts字段存在:-
令 user contexts 为用 command parameters["
userContexts"] 尝试获取有效用户上下文所得的结果。 -
对于 user contexts 中的每个 user context:
-
将viewport 覆盖映射[user context] 设置为一个结构体。
-
如果 command parameters 包含 "
viewport":-
将 viewport 覆盖 映射[user context] 的viewport 设置为 command parameters["
viewport"]。
-
-
如果 command parameters 包含 "
devicePixelRatio":-
将 viewport 覆盖 映射[user context] 的devicePixelRatio 设置为 command parameters["
devicePixelRatio"]。
-
-
对于所有顶级 traversable的列表中 其关联用户上下文为 user context 的每个 top-level traversable:
-
将 top-level traversable 追加到 navigables。
-
-
-
-
否则,返回带有错误 代码 invalid argument 的错误。
-
如果 command parameters 包含
viewport字段:-
令 viewport 为 command parameters["
viewport"]。 -
对于 navigables 中的每个 navigable:
-
用 navigable 和 viewport 设置 viewport。
-
用 navigable 的活动文档运行 CSSOM View § 13.1 Resizing viewports 步骤。
-
-
-
如果 command parameters 包含
devicePixelRatio字段:-
令 device pixel ratio 为 command parameters["
devicePixelRatio"]。 -
对于 navigables 中的每个 navigable:
-
对于 navigable 和所有后代 navigable:
-
用 navigable 和 device pixel ratio 设置 device pixel ratio 覆盖。
-
-
-
-
返回带有数据 null 的成功。
7.3.3.13. browsingContext.traverseHistory 命令
browsingContext.traverseHistory 命令 按 delta 遍历给定 navigable 的历史。
- 命令类型
-
browsingContext.TraverseHistory= (method:"browsingContext.traverseHistory",params: browsingContext.TraverseHistoryParameters )browsingContext.TraverseHistoryParameters= {context: browsingContext.BrowsingContext,delta: js-int, } - 返回类型
-
browsingContext.TraverseHistoryResult= EmptyResult
-
令 navigable 为用 command parameters["
context"] 尝试获取 navigable 所得的结果。 -
如果 navigable 不是顶级 traversable,则返回带有 错误代码 invalid argument 的错误。
-
断言:navigable 不是 null。
-
令 delta 为 command parameters["
delta"]。 -
令 resume id 为唯一字符串。
-
在 navigable 的会话历史遍历队列上排入一个任务,以运行以下步骤:
-
令 all steps 为针对 navigable 获取所有已使用历史步骤所得的结果。
-
令 current index 为 navigable 的当前会话历史步骤在 all steps 中的索引。
-
令 target index 为 current index 加 delta。
-
如果 all steps[target index] 不存在, 则令 valid entry 为 false;否则为 true。
-
用 "
check history"、resume id 和 valid entry 恢复。
-
-
令 is valid entry 为用 «"
check history"» 和 resume id 等待所得的结果。 -
如果 is valid entry 为 false,则返回带有错误 代码 no such history entry 的错误。
-
给定 delta 和 navigable 按 delta 遍历历史。
按写出的算法存在 竞态条件,因为到我们尝试导航时,目标会话历史条目可能已经不存在。 一旦我们支持等待历史进行导航,就可以更稳健地处理这个问题。
-
TODO:支持等待历史遍历完成。
-
令 body 为一个与
browsingContext.TraverseHistoryResult产生式匹配的映射。 -
返回带有数据 body 的成功。
给定 context 和 navigation status navigation status 时,WebDriver BiDi page show 步骤为:
我们是否想暴露 `browsingContext.pageShow 事件?在这种情况下,我们需要 每当即将发出 `pageshow` 时调用它,而不仅仅是在 bfcache 恢复时调用,并且还要向数据中添加 persisted 状态。
给定 context 和 navigation status navigation status 时,WebDriver BiDi pop state 步骤为:
7.3.4. 事件
7.3.4.1. browsingContext.contextCreated 事件
- 事件类型
-
browsingContext.ContextCreated= (method:"browsingContext.contextCreated",params: browsingContext.Info )
要在给定 session 和 navigable 的情况下递归发出 context created 事件:
-
用 session 和 navigable 发出 context created 事件。
-
对于 navigable 的每个子 navigable child:
-
给定 session 和 child 递归发出 context created 事件。
-
要在给定 session 和 navigable 的情况下发出 context created 事件:
-
令 params 为给定 navigable、0 和 true 时调用获取 navigable 信息所得的结果。
-
令 body 为一个与
browsingContext.ContextCreated产生式匹配的映射, 其params字段设置为 params。 -
用 session 和 body 发出事件。
远端事件触发器是给定 navigable navigable 和 navigable opener navigable 时的WebDriver BiDi navigable created 步骤:
-
如果提供了 opener navigable,则将 navigable 的 原始 opener设置为 opener navigable。
-
如果以 navigable 调用的navigable 缓存行为为 "
bypass", 则执行实现定义的步骤,以禁用源自 navigable 的网络请求的任何实现特定资源缓存。 -
令 related navigables 为一个包含 navigable 的集合。
-
对于给定 "
browsingContext.contextCreated" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
给定 session 和 navigable 发出 context created 事件。
-
给定 session、navigables 和 include global 时,远端订阅步骤(其 订阅优先级为 1)为:
-
对于 navigables 中的每个 navigable:
-
给定 session 和 navigable 递归发出 context created 事件。
-
7.3.4.2. browsingContext.contextDestroyed 事件
- 事件类型
-
browsingContext.ContextDestroyed= (method:"browsingContext.contextDestroyed",params: browsingContext.Info )
远端事件触发器是给定 navigable navigable 时的WebDriver BiDi navigable destroyed 步骤:
-
令 params 为给定 navigable、null 和 true 时调用获取 navigable 信息所得的结果。
-
令 body 为一个与
browsingContext.ContextDestroyed产生式匹配的映射, 其params字段设置为 params。 -
令 related navigables 为一个集合, 如果 navigable 的父级不是 null,则包含该父级; 否则为空集合。
-
对于给定 "
browsingContext.contextDestroyed" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
令 subscriptions to remove 为一个集合。
-
对于 session 的订阅中的每个 subscription:
-
如果 subscription 的顶级 traversable ids 包含 navigable 的navigable id;
-
从 subscription 的顶级 traversable ids中移除 navigable 的navigable id。
-
如果 subscription 的顶级 traversable ids为空:
-
将 subscription 追加到 subscriptions to remove。
-
-
-
-
尚不清楚我们是否 应当只针对具有活动文档的 browsing context 触发此事件;导航也可能导致 context 变得不可访问,但由于 bfcache 尚未被丢弃。
7.3.4.3. browsingContext.navigationStarted 事件
- 事件类型
-
browsingContext.NavigationStarted= (method:"browsingContext.navigationStarted",params: browsingContext.NavigationInfo )
-
令 params 为给定 navigable 和 navigation status 时调用获取 navigation 信息所得的结果。
-
令 body 为一个与
browsingContext.NavigationStarted产生式匹配的映射, 其params字段设置为 params。 -
令 navigation id 为 navigation status 的id。
-
令 related navigables 为一个包含 navigable 的集合。
-
用 "
navigation started"、navigation id 和 navigation status 恢复。 -
对于给定 "
browsingContext.navigationStarted" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
7.3.4.4. browsingContext.fragmentNavigated 事件
- 事件类型
-
browsingContext.FragmentNavigated= (method:"browsingContext.fragmentNavigated",params: browsingContext.NavigationInfo )
-
令 params 为给定 navigable 和 navigation status 时调用获取 navigation 信息所得的结果。
-
令 body 为一个与
browsingContext.FragmentNavigated产生式匹配的映射, 其params字段设置为 params。 -
令 navigation id 为 navigation status 的id。
-
令 related navigable 为一个包含 navigable 的集合。
-
用 "
fragment navigated"、navigation id 和 navigation status 恢复。 -
对于给定 "
browsingContext.fragmentNavigated" 和 related navigable 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
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 }
-
令 timestamp 为表示当前 UTC 日期和时间的时间值。
-
令 params 为一个与
browsingContext.HistoryUpdatedParameters产生式匹配的映射, 其中url字段设置为 url,timestamp字段设置为 timestamp,context字段设置为 navigable 的navigable id,且userContext字段设置为 user context id。 -
令 body 为一个与
browsingContext.HistoryUpdated产生式匹配的映射, 其params字段设置为 params。 -
对于给定 "
browsingContext.historyUpdated" 和 related browsing contexts 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
7.3.4.6. browsingContext.domContentLoaded 事件
- 事件类型
-
browsingContext.DomContentLoaded= (method:"browsingContext.domContentLoaded",params: browsingContext.NavigationInfo )
-
令 params 为给定 navigable 和 navigation status 时调用获取 navigation 信息所得的结果。
-
令 body 为一个与
browsingContext.DomContentLoaded产生式匹配的映射, 其params字段设置为 params。 -
令 related navigables 为一个包含 navigable 的集合。
-
令 navigation id 为 navigation status 的id。
-
用 "
domContentLoaded"、navigation id 和 navigation status 恢复。 -
对于给定 "
browsingContext.domContentLoaded" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
7.3.4.7. browsingContext.load 事件
- 事件类型
-
browsingContext.Load= (method:"browsingContext.load",params: browsingContext.NavigationInfo )
-
令 params 为给定 navigable 和 navigation status 时调用获取 navigation 信息所得的结果。
-
令 body 为一个与
browsingContext.Load产生式匹配的映射, 其params字段设置为 params。 -
令 related navigables 为一个包含 navigable 的集合。
-
令 navigation id 为 navigation status 的id。
-
用 "
load"、navigation id 和 navigation status 恢复。 -
对于给定 "
browsingContext.load" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
7.3.4.8. browsingContext.downloadWillBegin 事件
- 事件类型
-
browsingContext.DownloadWillBegin= (method:"browsingContext.downloadWillBegin",params: browsingContext.DownloadWillBeginParams )browsingContext.DownloadWillBeginParams= {suggestedFilename: text, browsingContext.BaseNavigationInfo }
-
令 navigation info 为给定 navigable 和 navigation status 时调用获取 navigation 信息所得的结果。
-
令 params 为一个与
browsingContext.DownloadWillBeginParams产生式匹配的映射, 其中context字段设置为 navigation info["context"],navigation字段设置为 navigation info["navigation"],timestamp字段设置为 navigation info["timestamp"],url字段设置为 navigation info["url"],且suggestedFilename字段设置 为 navigation status 的suggestedFilename。 -
令 body 为一个与
browsingContext.DownloadWillBegin产生式匹配的映射, 其params字段设置为 params。 -
令 navigation id 为 navigation status 的id。
-
令 related navigables 为一个包含 navigable 的集合。
-
用 "
download started"、navigation id 和 navigation status 恢复。 -
对于给定 "
browsingContext.downloadWillBegin" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
-
令 download behavior 为以 navigable 调用获取下载行为所得的结果。
-
返回 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 )
-
令 navigation info 为给定 navigable 和 navigation status 时调用获取 navigation 信息所得的结果。
-
断言 navigation info["
status"] 等于 "complete" 或 "canceled"。 -
如果 navigation info["
status"] 是 "complete",则令 params 为一个与browsingContext.DownloadCompleteParams产生式匹配的映射,其中filepath字段设置为 navigation status 的downloadedFilepath,context字段设置为 navigation info["context"],navigation字段设置为 navigation info["navigation"],timestamp字段设置为 navigation info["timestamp"],且url字段设置为 navigation info["url"]。注:如果由于任何原因无法获得 filepath, 则对于已完成的下载,
filepath可以为 null。 -
否则,令 params 为一个与
browsingContext.DownloadCanceledParams产生式匹配的映射, 其中context字段设置为 navigation info["context"],navigation字段设置为 navigation info["navigation"],timestamp字段设置为 navigation info["timestamp"],且url字段设置为 navigation info["url"]。 -
令 body 为一个与
browsingContext.DownloadEnd产生式匹配的映射, 其params字段设置为 params。 -
令 related navigables 为一个包含 navigable 的集合。
-
对于给定 "
browsingContext.downloadEnd" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
7.3.4.10. browsingContext.navigationAborted 事件
- 事件类型
-
browsingContext.NavigationAborted= (method:"browsingContext.navigationAborted",params: browsingContext.NavigationInfo )
-
令 params 为给定 navigable 和 navigation status 时调用获取 navigation 信息所得的结果。
-
令 body 为一个与
browsingContext.NavigationAborted产生式匹配的映射, 其params字段设置为 params。 -
令 navigation id 为 navigation status 的id。
-
令 related navigables 为一个包含 navigable 的集合。
-
用 "
navigation aborted"、navigation id 和 navigation status 恢复。 -
对于给定 "
browsingContext.navigationAborted" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
7.3.4.11. browsingContext.navigationCommitted 事件
- 事件类型
-
browsingContext.NavigationCommitted= (method:"browsingContext.navigationCommitted",params: browsingContext.NavigationInfo )
-
令 params 为给定 navigable 和 navigation status 时调用获取 navigation 信息所得的结果。
-
令 body 为一个与
browsingContext.NavigationCommitted产生式匹配的映射, 其params字段设置为 params。 -
令 related navigables 为一个包含 navigable 的集合。
-
令 navigation id 为 navigation status 的id。
-
用 "
navigation committed"、navigation id 和 navigation status 恢复。 -
对于给定 "
browsingContext.navigationCommitted" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
7.3.4.12. browsingContext.navigationFailed 事件
- 事件类型
-
browsingContext.NavigationFailed= (method:"browsingContext.navigationFailed",params: browsingContext.NavigationInfo )
-
令 params 为给定 navigable 和 navigation status 时调用获取 navigation 信息所得的结果。
-
令 body 为一个与
browsingContext.NavigationFailed产生式匹配的映射, 其params字段设置为 params。 -
令 navigation id 为 navigation status 的id。
-
令 related navigables 为一个包含 navigable 的集合。
-
用 "
navigation failed"、navigation id 和 navigation status 恢复。 -
对于给定 "
browsingContext.navigationFailed" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
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 步骤。
-
令 navigable 为 window 的navigable。
-
令 navigable id 为 navigable 的navigable id。
-
令 params 为一个与
browsingContext.UserPromptClosedParameters产生式匹配的映射,其context字段设置为 navigable id,userContext字段设置为 user context id,accepted字段设置为 accepted,type字段设置为 type,且如果 user text 不是 null,则将userText字段设置为 user text,否则省略。 -
令 body 为一个与
BrowsingContextUserPromptClosedEvent产生式匹配的映射, 其params字段设置为 params。 -
令 related navigables 为一个包含 navigable 的集合。
-
对于给定 "
browsingContext.userPromptClosed" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
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 }
-
令 user context 为 navigable 的关联用户 上下文。
-
如果 未处理提示行为覆盖 映射 包含 user context:
-
令 unhandled prompt behavior override 为未处理提示行为 覆盖映射[user context]。
-
如果 unhandled prompt behavior override[type] 不是 null,则返回 unhandled prompt behavior override[type]。
-
如果 unhandled prompt behavior override[
"default"] 不是 null, 则返回 unhandled prompt behavior override["default"]。
-
-
令 handler configuration 为以 type 调用获取提示处理器所得的结果。
-
返回 handler configuration 的handler。
Window
window、字符串 type、字符串 message 和可选 text default
value
(默认值:null)时的WebDriver
BiDi user prompt opened 步骤。
-
令 navigable 为 window 的navigable。
-
令 navigable id 为 navigable 的navigable id。
-
令 handler 为以 type 和 navigable 调用获取 navigable 的用户提示处理器所得的结果。
-
令 params 为一个与
browsingContext.UserPromptOpenedParameters产生式匹配的映射,其context字段设置为 navigable id,userContext字段设置为 user context id,type字段设置为 type,message字段设置为 message,如果 default value 不是 null,则将defaultValue字段设置为 default value,否则省略, 并将handler字段设置为 handler。 -
令 body 为一个与
browsingContext.UserPromptOpened产生式匹配的映射, 其params字段设置为 params。 -
令 related navigables 为一个包含 navigable 的集合。
-
对于给定 "
browsingContext.userPromptOpened" 和 related navigables 时 事件已启用的会话集合 中的每个 session:-
用 session 和 body 发出 事件。
-
-
如果 handler 是 "
ignore",则将 handler 设置为 "none"。 -
返回 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,它是一个 结构体,带有 一个名为 default user agent 的项,其为字符串或 null; 一个名为 user context user agent 的项,其为 用户上下文与 字符串之间的弱映射;以及一个名为 navigable user agent 的项,其为 navigables 与字符串之间的弱映射。
BiDi 会话具有模拟 maxTouchPoints,它是一个结构体,带有 一个名为 default 的项,其为整数或 null,初始为 null; 一个名为 user contexts 的项,其为 用户上下文与整数之间的弱映射, 初始为空; 以及一个名为 navigables 的项,其为 navigables 与整数之间的弱映射,初始为空。
screen orientation 覆盖是一个带有以下内容的结构体:
远端具有一个screen orientation 覆盖映射,它是 用户上下文与 screen orientation 覆盖之间的弱映射。
7.4.2. 命令
7.4.2.1. emulation.setForcedColorsModeThemeOverride 命令
emulation.setForcedColorsModeThemeOverride 命令修改给定顶级 traversables 或用户上下文上的 forced colors mode 主题特征。
- 命令类型
-
emulation.SetForcedColorsModeThemeOverride= (method:"emulation.setForcedColorsModeThemeOverride",params: emulation.SetForcedColorsModeThemeOverrideParameters )emulation.SetForcedColorsModeThemeOverrideParameters= {theme: emulation.ForcedColorsModeTheme / null, ?contexts: [+browsingContext.BrowsingContext], ?userContexts: [+browser.UserContext], }emulation.ForcedColorsModeTheme="light"/"dark" - 返回类型
-
emulation.SetForcedColorsModeThemeOverrideResult= EmptyResult
注:对应的 CSS 规范中的枚举映射,请查看 ForcedColorsModeAutomationTheme。
远端具有一个forced colors mode theme override 配置,它是 WebDriver 配置,其关联类型为字符串。
-
令 theme 为针对 navigable 的 forced colors mode theme override 配置调用获取 WebDriver 配置值所得的结果。
-
断言:theme 是 "
light"、"dark" 或 unset。 -
如果 theme 为 unset,则将 theme 设置为 "
none"。 -
用 navigable 和 theme 设置模拟 forced colors 主题数据。
给定 command parameters 时,远端步骤为:
-
令 theme 为 command parameters["
theme"]。 -
如果 theme 为 null,则将 theme 设置为 unset。
-
如果实现不支持设置 theme,则返回带有错误 代码 unsupported operation 的错误。
-
令 affected navigables 为为 command parameters 尝试存储 WebDriver 配置 forced colors mode theme override 配置 theme 所得的结果。
-
对于 affected navigables 中的每个 navigable:
-
为 navigable 更新模拟 forced colors 主题。
-
-
返回带有数据 null 的成功。
7.4.2.2. emulation.setGeolocationOverride 命令
emulation.setGeolocationOverride 命令修改 给定顶级 traversables 或用户上下文上的 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 覆盖是一个带有以下内容的结构体:
-
名为
latitude的项,其为 float; -
名为
longitude的项,其为 float; -
名为
accuracy的项,其为 float; -
名为
altitude的项,其为 float 或 null; -
名为
altitudeAccuracy的项,其为 float 或 null; -
名为
heading的项,其为 float 或 null; -
名为
speed的项,其为 float 或 null。
远端具有一个geolocation 覆盖配置,它是 WebDriver 配置,其关联类型为 geolocation 覆盖。
-
令 emulated position data 为针对 navigable 的geolocation 覆盖配置调用获取 WebDriver 配置值所得的结果。
-
如果 emulated position data 为 unset,则将 emulated position data 设置为 null。
-
用 navigable 和 emulated position data 设置模拟位置数据。
给定 command parameters 时,远端步骤为:
-
如果 command parameters 包含 "
coordinates",且 command parameters["coordinates"] 包含 "altitudeAccuracy",且 command parameters["coordinates"] 不包含 "altitude",则返回带有错误代码 invalid argument 的错误。 -
如果 command parameters 包含 "
error":-
断言 command parameters["
error"]["type"] 等于 "positionUnavailable"。 -
令 emulated position data 为一个与 GeolocationPositionError 产生式匹配的映射, 其
code字段设置为 POSITION_UNAVAILABLE, 并且message字段设置为空字符串。注:根据 geolocation 规范,
message将被实现忽略。
-
-
否则,令 emulated position data 为 command parameters["
coordinates"]。 -
如果 emulated position data 为 null,则将 emulated position data 设置为 unset。
-
令 affected navigables 为为 command parameters 尝试存储 WebDriver 配置 geolocation 覆盖配置 emulated position data 所得的结果。
-
对于 affected navigables 中的每个 navigable:
-
为 navigable 更新 geolocation 覆盖。
-
-
返回带有数据 null 的成功。
7.4.2.3. emulation.setLocaleOverride 命令
emulation.setLocaleOverride 命令修改 给定顶级 traversables 或用户上下文上的 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 模拟语言步骤为:
-
令 related navigables 为给定 environment settings 时调用获取相关 navigables所得的结果。
-
对于 related navigables 中的每个 navigable:
-
令 top-level traversable 为 navigable 的 顶级 traversable。
-
令 user context 为 top-level traversable 的关联 用户上下文。
-
如果 locale 覆盖映射 包含 top-level traversable,则返回 locale 覆盖映射[top-level traversable]。
-
如果 locale 覆盖映射 包含 user context,则返回 locale 覆盖映射[user context]。
-
-
返回 null
给定 command parameters 时,远端步骤为:
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
如果 command parameters 不包含 "
userContexts" 且 command parameters 不包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
令 emulated locale 为 command parameters["
locale"]。 -
如果 emulated locale 不是 null 且 IsStructurallyValidLanguageTag(emulated locale) 返回 false,则返回带有错误 代码 invalid argument 的错误。
-
令 navigables 为一个集合。
-
如果 command parameters 的
contexts字段存在:-
令 navigables 为以 command parameters["
contexts"] 尝试通过 id 获取有效顶级 traversables所得的结果。
-
-
否则:
-
断言 command parameters 的
userContexts字段存在。 -
令 user contexts 为以 command parameters["
userContexts"] 尝试获取有效用户上下文 所得的结果。 -
对于 user contexts 中的每个 user context:
-
如果 emulated locale 为 null,则从 locale 覆盖映射中移除 user context。
-
否则,将 locale 覆盖映射[user context] 设置为 emulated locale。
-
对于所有 顶级 traversable的列表中 其关联用户上下文为 user context 的每个 top-level traversable:
-
将 top-level traversable 追加到 navigables。
-
-
-
-
对于 navigables 中的每个 navigable:
-
如果 emulated locale 为 null,则从 locale 覆盖映射中移除 navigable。
-
否则,将 locale 覆盖映射[navigable] 设置为 emulated locale。
-
-
返回带有数据 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.NetworkConditionsOfflineemulation.NetworkConditionsOffline= {type:"offline"} - 返回类型
-
emulation.SetNetworkConditionsResult= EmptyResult
要应用网络 条件:
-
对于每个 WebSocket 对象 webSocket:
-
令 realm 为 webSocket 的相关 Realm。
-
令 environment settings 为其 realm execution context 的 Realm 组件 是 realm 的环境设置对象。
-
如果以 environment settings 调用WebDriver BiDi 网络离线 所得的结果为 true:
-
使 WebSocket 连接失败 webSocket。
-
-
-
对于每个 WebTransport 对象 webTransport:
-
令 realm 为 webSocket 的相关 Realm。
-
令 environment settings 为其 realm execution context 的 Realm 组件 是 realm 的环境设置对象。
-
如果以 environment settings 调用WebDriver BiDi 网络 离线所得的结果为 true:
-
清理 WebTransport webTransport。
-
-
给定 command parameters 和 session 时,远端步骤为:
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "context", 则返回带有错误 代码 invalid argument 的错误。 -
令 emulated network conditions 为 null。
-
如果 command parameters["
networkConditions"] 不是 null,且 command parameters["networkConditions"]["type"] 等于 "offline",则将 emulated network conditions 设置为一个新的 模拟网络条件结构体,其 offline 设置为 true。 -
如果 command parameters 的
contexts字段存在:-
令 navigables 为以 command parameters["
contexts"] 尝试通过 id 获取有效顶级 traversables所得的结果。 -
对于 navigables 中的每个 navigable:
-
如果 emulated network conditions 为 null,则从 session 的模拟网络 条件的 navigable network conditions中移除 navigable
-
否则,将 session 的模拟网络 条件的 navigable network conditions[navigable] 设置为 emulated network conditions。
-
-
-
如果 command parameters 的
userContexts字段存在:-
令 user contexts 为以 command parameters["
userContexts"] 尝试获取有效用户上下文 所得的结果。 -
对于 user contexts 中的每个 user context:
-
如果 emulated network conditions 为 null,则从 session 的模拟网络 条件的 user context network conditions中移除 user context。
-
否则,将 session 的模拟网络 条件的 user context network conditions[user context] 设置为 emulated network conditions。
-
-
-
如果 command parameters 不包含 "
userContexts" 且 command parameters 不包含 "context", 则将 session 的模拟网络条件的 default network conditions 设置为 emulated network conditions。 -
返回带有数据 null 的成功。
7.4.2.5. emulation.setScreenSettingsOverride 命令
emulation.setScreenSettingsOverride 命令 模拟给定顶级 traversables 或用户上下文的Web 暴露屏幕区域和Web 暴露可用屏幕区域。
- 命令类型
-
emulation.SetScreenSettingsOverride= (method:"emulation.setScreenSettingsOverride",params: emulation.SetScreenSettingsOverrideParameters )emulation.ScreenArea= {width: js-uint,height: js-uint }emulation.SetScreenSettingsOverrideParameters= {screenArea: emulation.ScreenArea / null, ?contexts: [+browsingContext.BrowsingContext], ?userContexts: [+browser.UserContext], } - 返回类型
-
emulation.SetScreenSettingsOverrideResult= EmptyResult
给定 navigable navigable 时,WebDriver BiDi 模拟可用屏幕 区域步骤为:
-
令 top-level traversable 为 navigable 的顶级 traversable。
-
令 user context 为 top-level traversable 的关联用户 上下文。
-
如果 screen settings 覆盖 包含 top-level traversable,则返回 screen settings 覆盖[top-level traversable]。
-
如果 screen settings 覆盖 包含 user context,则返回 screen settings 覆盖[user context]。
-
返回 null
给定 navigable navigable 时,WebDriver BiDi 模拟总屏幕区域步骤为:
-
令 top-level traversable 为 navigable 的顶级 traversable。
-
令 user context 为 top-level traversable 的关联用户 上下文。
-
如果 screen settings 覆盖 包含 top-level traversable,则返回 screen settings 覆盖[top-level traversable]。
-
如果 screen settings 覆盖 包含 user context,则返回 screen settings 覆盖[user context]。
-
返回 null
给定 command parameters 时,远端步骤为:
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
如果 command parameters 不包含 "
userContexts" 且 command parameters 不包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
令 emulated screen area 为 command parameters["
screenArea"]。 -
如果 emulated screen area 不是 null:
-
令 navigables 为一个集合。
-
如果 command parameters 的
contexts字段存在:-
令 navigables 为以 command parameters["
contexts"] 尝试通过 id 获取有效顶级 traversables所得的结果。 -
令 target 为 navigable screen settings。
-
对于 navigables 中的每个 navigable:
-
返回带有数据 null 的成功。
-
-
否则:
-
断言 command parameters 的
userContexts字段存在。 -
令 user contexts 为以 command parameters["
userContexts"] 尝试获取有效用户上下文 所得的结果。 -
令 target 为 user context screen settings。
-
对于 user contexts 中的每个 user context:
-
返回带有数据 null 的成功。
-
7.4.2.6. emulation.setScreenOrientationOverride 命令
emulation.setScreenOrientationOverride 命令 模拟给定顶级 traversables 或用户上下文的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
要在给定 navigable 和 emulated screen orientation 的情况下设置 模拟 screen orientation:
-
如果 emulated screen orientation 为 null:
-
否则:
-
令 emulated orientation type 为 emulated screen orientation["
type"]。 -
令 emulated orientation angle 为针对具有 emulated screen orientation["
natural"] 方向的屏幕, 按screen orientation values lists 中定义的、与 emulated orientation type 关联的角度。 -
将当前方向角设置为 emulated orientation angle。
-
将当前方向类型设置为 emulated orientation type。
-
-
用 navigable 的活动文档运行 screen orientation change steps。
给定 command parameters 时,远端步骤为:
-
如果实现因任何原因无法用给定 command parameters 调整 screen orientations 参数,则返回带有错误 代码 unsupported operation 的错误。
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
如果 command parameters 不包含 "
userContexts" 且 command parameters 不包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
令 emulated screen orientation 为 command parameters["
screenOrientation"]。 -
令 navigables 为一个集合。
-
如果 command parameters 的
contexts字段存在:-
令 navigables 为以 command parameters["
contexts"] 尝试通过 id 获取有效顶级 traversables所得的结果。
-
-
否则,如果 command parameters 的
userContexts字段存在:-
令 user contexts 为以 command parameters["
userContexts"] 尝试获取有效用户上下文 所得的结果。 -
对于 user contexts 中的每个 user context:
-
如果 emulated screen orientation 为 null,则从 screen orientation 覆盖 映射中移除 user context。
-
否则,将 screen orientation 覆盖 映射[user context] 设置为 emulated screen orientation。
-
对于所有 顶级 traversable的列表中 其关联用户上下文为 user context 的每个 top-level traversable:
-
将 top-level traversable 追加到 navigables。
-
-
-
-
对于 navigables 中的每个 navigable:
-
令 user context 为 navigable 的关联 用户上下文。
-
如果 emulated screen orientation 为 null,且 screen orientation 覆盖映射 包含 user context,则用 navigable 和 screen orientation 覆盖 映射[user context] 设置模拟 screen orientation。
-
否则,用 navigable 和 emulated screen orientation 设置模拟 screen orientation。
-
-
返回带有数据 null 的成功。
7.4.2.7. emulation.setUserAgentOverride 命令
emulation.setUserAgentOverride 命令修改 给定顶级 traversables、用户上下文或全局的 User-Agent。
- 命令类型
-
emulation.SetUserAgentOverride= (method:"emulation.setUserAgentOverride",params: emulation.SetUserAgentOverrideParameters )emulation.SetUserAgentOverrideParameters= {userAgent: text / null, ?contexts: [+browsingContext.BrowsingContext], ?userContexts: [+browser.UserContext], } - 返回类型
-
emulation.SetUserAgentOverrideResult= EmptyResult
-
令 related navigables 为以 environment settings 调用获取相关 navigables所得的结果。
-
对于 related navigables 中的每个 navigable:
-
令 top-level navigable 为 navigable 的顶级 traversable。
-
令 user context 为 top-level navigable 的关联 用户上下文。
-
对于 活动 BiDi 会话中的每个 session:
-
如果 session 的模拟 user agent的 navigable user agent 包含 top-level navigable,则返回 session 的模拟 user agent的 navigable user agent[top-level navigable]。
-
-
对于 活动 BiDi 会话中的每个 session:
-
如果 session 的模拟 user agent的 user context user agent 包含 user context,则返回 session 的模拟 user agent的 user context user agent[user context]。
-
-
-
对于 活动 BiDi 会话中的每个 session:
-
令 default emulated user agent 为 session 的模拟 user agent的 default user agent。
-
如果 default emulated user agent 不是 null,则返回 default emulated user agent。
-
-
返回 null。
给定 session 和 command parameters 时,远端步骤为:
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
令 emulated user agent 为 command parameters["
userAgent"]。 -
如果 command parameters 包含 "
contexts":-
令 navigables 为以 command parameters["
contexts"] 尝试通过 id 获取有效顶级 traversables所得的结果。 -
对于 navigables 中的每个 navigable:
-
如果 emulated user agent 为 null,则从 session 的模拟 user agent的 navigable user agent中移除 navigable。
-
否则,将 session 的模拟 user agent的 navigable user agent[navigable] 设置为 emulated user agent。
-
-
返回带有数据 null 的成功。
-
-
如果 command parameters 包含 "
userContexts":-
令 user contexts 为以 command parameters["
userContexts"] 尝试获取有效用户上下文 所得的结果。 -
对于 user contexts 中的每个 user context:
-
如果 emulated user agent 为 null,则从 session 的模拟 user agent的 user context user agent中移除 user context。
-
否则,将 session 的模拟 user agent的 user context user agent[user context] 设置为 emulated user agent。
-
-
返回带有数据 null 的成功。
-
-
将 session 的模拟 user agent的 default user agent 设置为 emulated user agent。
-
返回带有数据 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。
-
令 navigable 为 settings 的相关全局对象的 关联
Document的node navigable。 -
令 top-level traversable 为 navigable 的顶级 traversable。
-
如果 scripting enabled 覆盖映射包含 top-level traversable,则返回 scripting enabled 覆盖 映射[top-level traversable]
-
令 user context 为 top-level traversable 的关联用户 上下文。
-
如果 scripting enabled 覆盖映射包含 user context,则返回 scripting enabled 覆盖映射[user context]。
-
返回 true。
给定 command parameters 时,远端步骤为:
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
如果 command parameters 不包含 "
userContexts" 且 command parameters 不包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
令 emulated scripting enabled status 为 command parameters["
enabled"]。 -
如果 command parameters 的
contexts字段存在:-
令 navigables 为以 command parameters["
contexts"] 尝试通过 id 获取有效顶级 traversables所得的结果。 -
对于 navigables 中的每个 navigable:
-
如果 emulated scripting enabled status 为 null,则从 scripting enabled 覆盖 映射中移除 navigable。
-
否则,将 scripting enabled 覆盖 映射[navigable] 设置为 emulated scripting enabled status。
-
-
-
如果 command parameters 的
userContexts字段存在:-
令 user contexts 为以 command parameters["
userContexts"] 尝试获取有效用户上下文 所得的结果。 -
对于 user contexts 中的每个 user context:
-
如果 emulated scripting enabled status 为 null,则从 scripting enabled 覆盖 映射中移除 user context。
-
否则,将 scripting enabled 覆盖 映射[user context] 设置为 emulated scripting enabled status。
-
-
-
返回带有数据 null 的成功。
7.4.2.9. emulation.setScrollbarTypeOverride 命令
emulation.setScrollbarTypeOverride 命令 修改给定顶级 traversables、用户上下文或全局的 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 配置,其关联类型为字符串。
-
令 scrollbar type override 为针对 navigable 的 scrollbar type 覆盖配置调用获取 WebDriver 配置值所得的结果。
-
断言:scrollbar type override 是 "
classic"、 "overlay" 或 unset。 -
如果 scrollbar type override 是 "
classic",则运行实现定义的步骤, 使 navigable 的活动文档使用classic scrollbars,并返回。 -
如果 scrollbar type override 是 "
overlay",则运行实现定义的 步骤,使 navigable 的活动文档使用overlay scrollbars,并返回。 -
断言:scrollbar type override 是 unset。
给定 command parameters 时,远端步骤为:
-
令 scrollbar type override 为 command parameters["
scrollbarType"]。 -
如果 scrollbar type override 为 null,则将 scrollbar type override 设置为 unset。
-
如果实现不支持设置 scrollbar type override,则返回带有错误代码 unsupported operation 的错误。
-
令 affected navigables 为为 command parameters 尝试存储 WebDriver 配置 scrollbar type 覆盖 配置 scrollbar type override 所得的结果。
-
对于 affected navigables 中的每个 navigable:
-
为 navigable 更新 scrollbar type 覆盖。
-
-
返回带有数据 null 的成功。
7.4.2.10. emulation.setTimezoneOverride 命令
emulation.setTimezoneOverride 命令修改 给定顶级 traversables 或用户上下文上的 timezone。
- 命令类型
-
emulation.SetTimezoneOverride= (method:"emulation.setTimezoneOverride",params: emulation.SetTimezoneOverrideParameters )emulation.SetTimezoneOverrideParameters= {timezone: text / null, ?contexts: [+browsingContext.BrowsingContext], ?userContexts: [+browser.UserContext], } - 返回类型
-
emulation.SetTimezoneOverrideResult= EmptyResult
-
令 emulated timezone 为 null。
-
令 realm 为当前 Realm Record。
-
令 environment settings 为其 realm execution context 的 Realm 组件为 realm 的环境设置对象。
-
令 related navigables 为给定 environment settings 时调用获取相关 navigables所得的结果。
-
对于 related navigables 中的每个 navigable:
-
令 top-level traversable 为 navigable 的 顶级 traversable。
-
令 user context 为 top-level traversable 的关联 用户上下文。
-
如果 timezone 覆盖映射 包含 top-level traversable,则将 emulated timezone 设置为 timezone 覆盖映射[top-level traversable]。
-
否则,如果 timezone 覆盖映射 包含 user context,则将 emulated timezone 设置为 timezone 覆盖映射[user context]。
-
-
如果 emulated timezone 不是 null,则返回 emulated timezone。
-
返回依照 SystemTimeZoneIdentifier 规范要求的 实现定义步骤的结果。
给定 command parameters 时,远端步骤为:
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
如果 command parameters 不包含 "
userContexts" 且 command parameters 不包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
令 emulated timezone 为 command parameters["
timezone"]。 -
如果 emulated timezone 不是 null,且 IsTimeZoneOffsetString(emulated timezone) 返回 false,且 AvailableNamedTimeZoneIdentifiers 不包含 emulated timezone,则返回带有错误代码 invalid argument 的错误。
-
令 navigables 为一个集合。
-
如果 command parameters 的
contexts字段存在:-
令 navigables 为以 command parameters["
contexts"] 尝试通过 id 获取有效顶级 traversables所得的结果。
-
-
否则:
-
断言 command parameters 的
userContexts字段存在。 -
令 user contexts 为以 command parameters["
userContexts"] 尝试获取有效用户上下文 所得的结果。 -
对于 user contexts 中的每个 user context:
-
如果 emulated timezone 为 null,则从 timezone 覆盖映射中移除 user context。
-
否则,将 timezone 覆盖映射[user context] 设置为 emulated timezone。
-
对于所有 顶级 traversable的列表中 其关联用户上下文为 user context 的每个 top-level traversable:
-
将 top-level traversable 追加到 navigables。
-
-
-
-
对于 navigables 中的每个 navigable:
-
如果 emulated timezone 为 null,则从 timezone 覆盖映射中移除 navigable。
-
否则,将 timezone 覆盖映射[navigable] 设置为 emulated timezone。
-
-
返回带有数据 null 的成功。
7.4.2.11. emulation.setTouchOverride 命令
emulation.setTouchOverride 命令模拟 网页上启用的触摸输入。
- 命令类型
-
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
-
令 related navigables 为以 environment settings 调用获取相关 navigables所得的结果。
-
对于 related navigables 中的每个 navigable:
-
令 top-level navigable 为 navigable 的顶级 traversable。
-
令 user context 为 top-level navigable 的关联 用户上下文。
-
对于 活动 BiDi 会话中的每个 session:
-
如果 session 的模拟 maxTouchPoints的 navigables 包含 top-level navigable,则返回 session 的模拟 maxTouchPoints的 navigables[top-level navigable]。
-
-
对于 活动 BiDi 会话中的每个 session:
-
如果 session 的模拟 maxTouchPoints的 user contexts 包含 user context,则返回 session 的 模拟 maxTouchPoints的 user contexts[user context]。
-
-
-
对于 活动 BiDi 会话中的每个 session:
-
令 emulated maxTouchPoints 为 session 的模拟 maxTouchPoints的 default。
-
如果 emulated maxTouchPoints 不是 null,则返回 emulated maxTouchPoints。
-
-
返回 null。
给定 session 和 command parameters 时,远端步骤为:
注:存在一个遗留的暴露遗留 touch event API, 它仍可被某些现有 Web 内容用作用户代理是启用了触摸的“移动”设备的信号。即使该 API 是遗留的,用户代理也可以运行实现定义的步骤,以便在暴露遗留 touch event API中遵循 模拟 maxTouchPoints 状态。
-
如果 command parameters 包含 "
userContexts",且 command parameters 包含 "contexts",则返回带有错误 代码 invalid argument 的错误。 -
令 maxTouchPoints 为 command parameters["
maxTouchPoints"]。 -
如果 command parameters 的
contexts字段存在:-
令 navigables 为以 command parameters["
contexts"] 尝试通过 id 获取有效顶级 traversables 所得的结果。 -
对于 navigables 中的每个 navigable:
-
如果 maxTouchPoints 为 null,则从 session 的 模拟 maxTouchPoints的 navigables中移除 navigable。
-
否则,将 session 的模拟 maxTouchPoints的 navigables[navigable] 设置为 maxTouchPoints。
-
-
返回带有数据 null 的成功。
-
-
如果 command parameters 的
userContexts字段存在:-
令 user contexts 为以 command parameters["
userContexts"] 尝试获取有效用户上下文所得的结果。 -
对于 user contexts 中的每个 user context:
-
如果 maxTouchPoints 为 null,则从 session 的 模拟 maxTouchPoints的 user contexts中移除 user context。
-
否则,将 session 的模拟 maxTouchPoints的 user contexts[user context] 设置为 maxTouchPoints。
-
-
返回带有数据 null 的成功。
-
-
将 session 的模拟 maxTouchPoints的default 设置为 maxTouchPoints。
-
返回带有数据 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 映射,其初始为一个
空映射。它用于跟踪已经发送过
network.beforeRequestSent 事件的网络事件。
远端具有一个default cache behavior,它是一个字符串。其初始为
"default"。
远端具有一个navigable cache behavior 映射,它是 顶级 traversables与表示 cache behavior 的字符串之间的弱映射。其初始为空。
BiDi 会话具有extra headers,它是一个 结构体,带有 一个名为 default headers 的项,其为一个 header list(初始设置为空 header list),一个名为 user context headers 的项,其为 用户上下文与header lists之间的弱映射,以及一个名为 navigable headers 的项,其为 navigables 与 header lists 之间的弱映射。
7.5.2. 网络数据收集
network data 是一个带有以下内容的结构体:
-
名为 bytes 的项,其为
network.BytesValue或 null, -
名为 collectors 的项,其为
network.Collector的列表, -
名为 pending 的项,其为 boolean,
-
名为 request 的项,其为 request id,
-
名为 size 的项,其为 js-uint 或 null,
-
名为 type 的项,其为
network.DataType。
collector 是一个带有以下内容的结构体:
-
名为 max encoded item size 的项,其为 js-uint;
-
名为 contexts 的项,其为 列表, 其中包含 navigable id;
-
名为 data types 的项,其为
network.DataType的列表; -
名为 collector 的项,其为
network.Collector; -
名为 collector type 的项,其为
network.CollectorType; -
名为 user contexts 的项,其为
browser.UserContext的列表。
注:max encoded item size 定义每个项(响应或请求)的限制, 并不限制特定 collector 收集的大小。所有已收集资源的总大小 由 max total collected size 限制。
BiDi 会话具有network collectors,
它是
network.Collector
与 collector 之间的映射。其初始为空。
远端具有collected network data,它是 network data 的列表。其初始 为空。
远端具有一个max total collected size,它是表示 在 collected network data 中分配给收集 network data 的大小的 js-uint。其值是实现定义的。
注:这允许实现设置资源使用限制。 这些限制预期足够大,以便用户可以依赖于 收集由浏览器完全解码和处理的数据, 例如网页上使用的图像和字体。
-
-
如果 collector 的contexts 包含 navigable 的navigable id,则返回 true。
-
否则,返回 false。
-
-
如果 collector 的user contexts 不是空:
-
令 user context 为 navigable 的关联 用户上下文。
-
如果 collector 的user contexts 包含 user context 的 用户上下文 id,则返回 true。
-
否则,返回 false。
-
-
返回 true。
-
如果 request 的body 为 null,则返回。
-
对于 活动 BiDi 会话中的每个 session:
-
如果 session 的network collectors 不是空:
-
令 collected data 为一个network data,其中 bytes 设置为 null, cloned body 设置为 request 的body 的克隆, collectors 设置为空列表, pending 设置为 true, request 设置为 request 的request id, size 设置为 null, type 设置为 "request"。
-
将 collected data 追加到 collected network data。
-
返回。
-
-
-
如果 response body 为 null,则返回。
-
对于 活动 BiDi 会话中的每个 session:
-
如果 session 的network collectors 不是空:
-
令 collected data 为一个network data,其中 bytes 设置为 null, cloned body 设置为 response body 的克隆, collectors 设置为空列表, pending 设置为 true, request 设置为 request 的 request id, size 设置为 null, type 设置为 "response"。
-
将 collected data 追加到 collected network data。
-
返回。
-
-
-
对于 collected network data 中的每个 collected data:
-
返回 null。
-
令 collected data 为以 request 的request id 和 "response" 调用获取 collected data所得的结果。
-
如果 collected data 为 null,则返回。
-
将 collected data 的pending 设置为 false。
-
用 "
network data collected" 和 (request 的request id, "response") 恢复。
-
令 collected data 为以 request 的request id 和 "request" 调用获取 collected data所得的结果。
-
如果 collected data 为 null,则返回。
注:如果在创建请求时没有设置 collectors, 且 WebDriver BiDi 克隆网络请求 body未克隆对应的 body, 或者 body 一开始就是 null,则可能发生这种情况。
-
用 request、collected data、null 和 "request" 调用可能收集 network data。
-
如果 response 的status 是redirect status,则返回。
注:对于重定向,仅存储最终响应 body。
-
令 collected data 为以 request 的request id 和 "response" 调用获取 collected data所得的结果。
-
如果 collected data 为 null,则返回。
注:如果在创建响应时没有设置 collectors, 且 WebDriver BiDi 克隆网络 响应 body未克隆对应的 body, 或者 body 一开始就是 null,则可能发生这种情况。
-
令 size 为 response 的response body info 的encoded size。
注:从 fetch stream 检索的 bytes 对应于已解码数据这一事实与为了计算大小限制而使用编码(网络)大小之间存在差异。 实现可以决定使用这样的存储模型:只要在 getData 中返回给客户端的数据与已解码数据相同, 其使用的大小就可以小于存储已解码数据所需的大小。存储与性能之间的潜在 取舍由实现决定。
-
用 request、collected data、size 和 "response" 调用可能收集 network data。
-
将 collected data 的pending 设置为 false。
-
令 navigable 为以 request 调用获取 request 的 navigable所得的结果。
-
如果 navigable 为 null:
-
从 collected network data中移除 collected data。
-
用 "
network data collected" 和 (request 的request id, data type) 恢复。 -
返回。
这会阻止 收集与 navigable 无关的数据。 我们仍然需要检索 navigable 以对照 collector 配置进行检查,但这里仍可接受 null。
-
-
令 top-level navigable 为 navigable 的顶级 traversable。
-
令 collectors 为空列表。
-
对于 活动 BiDi 会话中的每个 session:
-
对于 session 的network collectors 中的每个 collector:
-
如果 collector 的data types 包含 data type,且以 collector 和 top-level navigable 调用匹配 navigable 的 collector所得的结果为 true:
-
将 collector 追加到 collectors。
-
-
-
-
如果 collectors 为空:
-
从 collected network data中移除 collected data。
-
用 "
network data collected" 和 (request 的request id, data type) 恢复。 -
返回。
-
-
令 bytes 为 null。
-
令给定 nullOrBytes 的 processBody 为此步骤:
-
如果 nullOrBytes 不是 null:
-
将 bytes 设置为用 nullOrBytes 调用序列化协议 bytes所得的结果。
-
如果 size 为 null,则将 size 设置为 bytes 的长度。
-
-
-
令 processBodyError 为此步骤:不执行任何操作。
-
给定 processBody 和 processBodyError,完全读取 collected data 的cloned body。
-
如果 bytes 不是 null:
-
对于 collectors 中的每个 collector:
-
如果 size 小于或等于 collector 的max encoded item size, 则将 collector 的collector 追加到 collected data 的 collectors。
-
-
如果 collected data 的collectors 不是空:
-
否则,从 collected network data中移除 collected data。
-
-
用 "
network data collected" 和 (request 的request id, data type) 恢复。
-
令 available size 为 max total collected size。
-
令 already collected data 为空列表。
-
对于 collected network data 中的每个 collected data:
-
如果 size 大于 available size:
-
如果 collected data 的collectors 包含 collector id:
-
从 collected data 的collectors中移除 collector id。
-
如果 collected data 的collectors 为空:
-
从 collected network data中移除 collected data。
-
-
7.5.3. 网络拦截
网络拦截 是一种机制,允许远端拦截 并修改网络请求和响应。
BiDi 会话具有一个 拦截映射,它是
intercept id 与一个映射
之间的
结构体,该结构体带有字段
url patterns、
phases 和 contexts,定义活动网络拦截的属性。
其初始为空。
BiDi 会话具有一个 被阻塞请求
映射,用于跟踪
正在被主动阻塞的请求。它是 映射,位于 request id
和一个带有字段 request、phase 以及
response 的结构体
之间。其初始为空。
要在给定 session、event、request 和 navigable id 的情况下获取 网络拦截:
-
令 session intercepts 为 session 的拦截映射。
-
令 intercepts 为空列表。
-
运行第一个匹配条件下的步骤:
- event 为 "
network.beforeRequestSent" - 将 phase 设置为 "
beforeRequestSent"。 - event 为 "
network.responseStarted" - 将 phase 设置为 "
responseStarted"。 - event 为 "
network.authRequired" - 将 phase 设置为 "
authRequired"。 - event 为 "
network.responseCompleted" - 返回 intercepts。
- event 为 "
-
对于 session intercepts 中的每个 intercept id → intercept:
-
如果 intercept 的
contexts不是 null:-
如果 intercept 的
contexts不包含 navigable id:-
继续。
-
-
-
如果 intercept 的
phases包含 phase:-
令 url patterns 为 intercept 的
url patterns。 -
如果 url patterns 为空:
-
将 intercept id 追加到 intercepts。
-
继续。
-
-
对于 url patterns 中的每个 url pattern:
-
如果以 url pattern 和 url 调用匹配 URL pattern:
-
将 intercept id 追加到 intercepts。
-
中断。
-
-
-
-
-
返回 intercepts。
-
令 blocked requests 为 session 的被阻塞请求映射。
-
令 request id 为 command parameters["
request"]。 -
如果 blocked requests 不包含 request id,则返回带有错误 代码 no such request 的错误。
-
令 (request, phase, response) 为 blocked requests[request id]。
-
如果 phase 为 "
beforeRequestSent" 且 command 为 "continueResponse",则返回带有错误代码 "invalid argument" 的错误。TODO:考虑不同的错误
-
如果 response 为 null:
-
断言:phase 为 "
beforeRequestSent"。 -
将 response 设置为一个新的response。
-
-
如果 command parameters 包含 "
statusCode":-
将 responses 的status 设置为 command parameters["
statusCode"]。
-
-
如果 command parameters 包含 "
reasonPhrase":-
将 responses 的status message 设置为以 command parameters["
reasonPhrase"] 调用UTF-8 encode所得的结果。
-
-
如果 command parameters 包含 "
headers":-
令 headers 为以 command parameters["
headers"] 尝试创建 headers list所得的结果。 -
将 response 的header list设置为 headers。
-
-
如果 command parameters 包含 "
cookies":-
如果 command parameters 包含 "
headers",令 headers 为 response 的header list。否则:
-
令 headers 为空 header list。
-
对于 response 的headers list中的每个 header:
-
令 name 为 header 的 name。
-
如果 name 的byte-lowercase 不是 `
set-cookie`:-
将 header 追加到 headers
-
-
-
-
对于 command parameters["
cookies"] 中的 cookie:-
令 header value 为以 cookie 调用序列化 set-cookie header所得的结果。
-
将 (`
Set-Cookie`, header value) 追加到 headers。 -
将 response 的header list设置为 headers。
-
-
-
如果 command parameters 包含 "
credentials":-
令 credentials 为 command parameters["
credentials"]。 -
断言:credentials["
type"] 为 "password"。 -
将 response 的认证凭据设置为 (credentials["
username"], credentials["password"])
-
-
返回 response
7.5.4. 类型
7.5.4.1. network.AuthChallenge 类型
network.AuthChallenge= {scheme: text,realm: text, }
要在给定 response 的情况下提取 challenges:
-
如果 response 的status 为 401,则令 header name 为 `
WWW-Authenticate`。否则,如果 response 的status 为 407,则令 header name 为 `Proxy-Authenticate`。否则返回 null。 -
令 challenges 为一个新的列表。
-
对于 response 的header list中的每个 (name, value):
与 Fetch 中一样, 尚不清楚这是否是处理多个 headers、解析问题等的正确方式。
-
如果 name 与 header name 按字节大小写不敏感匹配:
-
令 header challenges 为将 value 解析为 challenges 列表的结果,每个 challenge 由一个 scheme 和一个参数列表组成, 每个参数均为元组 (name, value),按照 [RFC9110] 的规则解析。
-
对于 header challenges 中的每个 header challenge:
-
令 scheme 为 header challenge 的 scheme。
-
令 realm 为空字符串。
-
对于 header challenge 的 parameters 中的每个 (param name, param value):
-
如果 param name 等于 `
realm`,则令 realm 为 对 param value 进行UTF-8 decode所得的结果。
-
-
令 challenge 为一个新的映射,匹配
network.AuthChallenge产生式,其中scheme字段设置为 scheme,且realm字段设置为 realm。
-
-
将 challenge 追加到 challenges。
-
-
-
返回 challenges。
7.5.4.2. network.AuthCredentials 类型
network.AuthCredentials= {type:"password",username: text,password: text, }
network.AuthCredentials 类型表示对授权凭据请求的响应。
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`。
-
令 request data 为以 request 调用获取 request data所得的结果。
-
令 navigation 为 request 的navigation id。
-
令 navigable id 为 null。
-
令 top-level navigable id 为 null。
-
令 user context id 为 null。
-
-
令 environment settings 为 request 的client。
-
如果存在一个navigable,其活动 window是 environment settings 的全局对象,则将 navigable id 设置为该 navigable 的navigable id,将 top-level navigable id 设置为 该 navigable 的顶级 traversable 的navigable id,并 将 user context id 设置为该 navigable 的 关联用户上下文的用户上下文 id。
-
-
令 intercepts 为以 session、event、request 和 top-level navigable id 调用获取网络 拦截所得的结果。
-
令 redirect count 为 request 的redirect count。
-
令 timestamp 为一个时间值,表示 UTC 中的当前日期 和时间。
-
如果 intercepts 不是空,则令 is blocked 为 true,否则 令 is blocked 为 false。
-
令 params 为映射, 匹配
network.BaseParameters产生式,其中request字段设置为 request data, navigation 字段设置为navigation,context字段设置为 navigable id,userContext字段设置为 user context id,timestamp字段设置为 timestamp,redirectCount字段设置为 redirect count,isBlocked字段设置为 is blocked,且如果 is blocked 为 true, 则intercepts字段设置为 intercepts,否则省略。 -
返回 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。
注:这接收编码为
network.BytesValue
的 bytes,并返回
字节序列。
-
如果 protocol bytes 匹配
network.StringValue产生式, 则令 bytes 为对 protocol bytes["value"] 进行 UTF-8 encode所得的结果。 -
否则,如果 protocol bytes 匹配
network.Base64Value产生式。令 bytes 为对 protocol bytes["value"] 进行forgiving-base64 decode所得的结果。 -
返回 bytes。
注:这接收一个字节序列
并返回一个
network.BytesValue。
-
令 text 为对 bytes 进行UTF-8 decode without BOM or fail所得的结果。
-
如果 text 为 failure,则返回一个匹配
network.Base64Value产生式的映射, 其中 value 设置为以 bytes 调用 forgiving-base64 encode所得的结果。 -
返回一个匹配
network.StringValue产生式的映射, 其中 value 设置为 text。
7.5.4.5. network.Collector 类型
network.Collector = text
network.Collector
类型表示一个 collector 的 id。
7.5.4.6. network.CollectorType 类型
network.CollectorType="blob"
注:未来我们也可能支持 "stream" collector type,供希望通过流读取给定 collector 所收集数据的客户端使用。
network.CollectorType
类型表示可以添加的不同类型的数据收集器。
7.5.4.7. network.Cookie 类型
network.SameSite="strict"/"lax"/"none"/"default"network.Cookie= {name: text,value: network.BytesValue,domain: text,path: text,size: js-uint,httpOnly: bool,secure: bool,sameSite: network.SameSite, ?expiry: js-uint, Extensible, }
network.Cookie 类型表示一个 cookie。
-
令 name 为以 stored cookie 的 name 字段调用UTF-8 decode所得的结果。
-
令 value 为以 stored cookie 的 value 调用序列化协议 bytes所得的结果。
-
令 domain 为 stored cookie 的 domain 字段。
-
令 path 为 stored cookie 的 path 字段。
-
令 expiry 为 stored cookie 的 expiry-time 字段,表示为 unix timestamp(如果已设置);否则为 null。
-
令 size 为将 stored cookie 按其在
Cookieheader 中的表示方式序列化所得结果的字节长度。 -
如果 stored cookie 的 http-only-flag 为 true,则令 http only 为 true; 否则为 false。
-
如果 stored cookie 的 secure-only-flag 为 true,则令 secure 为 true; 否则为 false。
-
如果 stored cookie 的 same-site-flag 为 "
None",则令 same site 为 "none";如果为 "Lax",则为 "lax"; 如果为 "Strict",则为 "strict";如果为 "Default",则为 "default" -
返回一个匹配
network.Cookie产生式的映射, 其中name字段设置为 name,value字段 设置为 value,domain字段设置为 domain,path字段设置为 path,如果 expiry 不是 null,则expiry字段设置为 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 请求 header 中的 cookie 数据子集。
-
令 name 为对 protocol cookie["
name"] 进行UTF-8 encode所得的结果。 -
令 value 为以 protocol cookie["
value"] 调用反序列化协议 bytes所得的结果。 -
令 header value 为通过连接 name、 `
=` 和 value 形成的字节 序列 -
返回 header value。
7.5.4.9. network.DataType 类型
network.DataType="request"/"response"
network.DataType
类型表示可以收集的不同类型的网络数据。
7.5.4.10. network.FetchTimingInfo 类型
network.FetchTimingInfo= {timeOrigin: float,requestTime: float,redirectStart: float,redirectEnd: float,fetchStart: float,dnsStart: float,dnsEnd: float,connectStart: float,connectEnd: float,tlsStart: float,requestStart: float,responseStart: float,responseEnd: float, }
network.FetchTimingInfo 类型表示请求各个部分的时间,
相对于 时间原点,该时间原点属于request 的
client。
-
令 global 为 request 的client。
-
如果 global 为 null,则返回一个匹配
network.FetchTimingInfo产生式的映射,所有字段均设置为 0。 -
令 time origin 为以 global 调用获取时间原点时间戳所得的结果。
-
令 timings 为 request 的fetch timing info。
-
如果 timings 的final connection timing info 不为 null,则令 connection timing 为它,否则令其为一个新的connection timing info。
-
令 request time 为给定 timings 的start time 和 global,调用转换 fetch 时间戳所得的结果。
-
令 redirect start 为给定 timings 的 redirect start time 和 global,调用转换 fetch 时间戳所得的结果。
-
令 redirect end 为给定 timings 的 redirect end time 和 global,调用转换 fetch 时间戳所得的结果。
-
令 fetch start 为给定 timings 的 post-redirect start time 和 global,调用转换 fetch 时间戳所得的结果。
-
令 DNS start 为给定 connection timing 的 domain lookup start time 和 global,调用转换 fetch 时间戳所得的结果。
-
令 DNS end 为给定 connection timing 的 domain lookup end time 和 global,调用转换 fetch 时间戳所得的结果。
-
令 TLS start 为给定 connection timing 的 secure connection start time 和 global,调用转换 fetch 时间戳所得的结果。
-
令 connect start 为给定 connection timing 的connection start time 和 global,调用转换 fetch 时间戳所得的结果。
-
令 connect end 为给定 connection timing 的 connection end time 和 global,调用转换 fetch 时间戳所得的结果。
-
令 request start 为给定 timings 的 final network-request start time 和 global,调用转换 fetch 时间戳所得的结果。
-
令 response start 为给定 timings 的 final network-response start time 和 global,调用转换 fetch 时间戳所得的结果。
-
令 response end 为给定 timings 的 end time 和 global,调用转换 fetch 时间戳所得的结果。
-
返回一个匹配
network.FetchTimingInfo产生式的映射, 其中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 类型表示单个请求 header。
-
令 name 为以 name bytes 调用UTF-8 解码所得的结果。
断言:由于 header 名称被约束为仅 ASCII,因此这不会失败。
-
令 value 为以 value bytes 调用序列化协议 bytes所得的结果。
-
返回一个匹配
network.Header产生式的映射,其中name字段设置为 name,并且value字段 设置为 value。
-
令 name 为对 protocol header["
name"] 进行UTF-8 编码所得的结果。 -
令 value 为以 protocol header["
value"] 调用反序列化协议 bytes所得的结果。 -
返回一个header(name, value)。
-
令 headers 为空header list。
-
对于 protocol headers 中的每个 header:
-
令 deserialized header 为以 header 调用反序列化 header所得的结果。
-
如果 deserialized header 的 name 不匹配field-name token 产生式,则返回带有错误代码 "
invalid argument" 的错误。 -
如果 deserialized header 的 value 不匹配header value 产生式,则返回带有错误代码 "
invalid argument" 的错误。 -
将 deserialized header 追加到 headers。
-
-
返回带有数据 headers 的成功
7.5.4.12. network.Initiator 类型
network.Initiator= { ?columnNumber: js-uint, ?lineNumber: js-uint, ?request: network.Request, ?stackTrace: script.StackTrace, ?type:"parser"/"script"/"preflight"/"other"}
network.Initiator 类型表示网络请求的来源。
注:type 字段被包含在
定义中是为了向后兼容,但它不再由获取
initiator 步骤设置,并且会在此规范的未来修订版中
移除。预期它的用途会由
network.RequestData 上的 initiatorType 和
destination 取代。
注:request 字段被包含在
定义中是为了向后兼容,但它不再由获取
initiator 步骤设置,并且会
在此规范的未来修订版中移除。
network.Initiator 被包含在
network.BeforeRequestSentParameters 中,后者也包含相同的
request id,使得此信息变得冗余。参见
§ 7.5.4.3 network.BaseParameters 类型。
-
如果 request 的initiator type 是 "
fetch" 或 "xmlhttprequest":-
令 stack trace 为当前 stack trace。
-
如果 stack trace 的大小为 1 或更大,则令 line number 为 stack trace[0] 中
lineNumber字段的值,并令 column number 为 stack trace[0] 中columnNumber字段的值。否则 令 line number 和 column number 为 0。
否则,令 stack trace、column number 和 line number 均为 null。
TODO:对于 parser 插入的资源,Chrome 会将当前解析器位置作为 column number / line number。
-
-
返回一个匹配
network.Initiator产生式的映射, 如果 column number 不为 null,则将columnNumber字段设置为 column number,否则省略; 如果 line number 不为 null,则将lineNumber字段设置为 line number,否则省略;并且如果 stack trace 不为 null,则将stackTrace字段设置为 stack trace,否则省略。
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 id 为 request 的request id。
-
令 method 为 request 的method。
-
令 body size 为 null。
-
令 body 为 request 的body。
-
如果 body 是字节 序列,则将 body size 设置为该序列的长度。否则,如果 body 是 body,则 将 body size 设置为该 body 的长度。
-
令 headers size 为 request 的headers list 按照 [HTTP11] 要求序列化时的字节大小。
注:对于允许 header 压缩的协议,这是通过网络发送时 headers 的压缩后大小。
-
令 headers 为空列表。
-
令 cookies 为空列表。
-
对于 request 的headers list 中的每个 (name, value):
-
将以 name 和 value 调用序列化 header所得的结果追加到 headers。
-
如果 name 与 "
Cookie" 为字节大小写不敏感匹配,则:-
对于用户代理的cookie store 中被包含在 request 中的每个 cookie:
注:[COOKIES] 定义了存储中哪些 cookie 可以包含在请求中的一些基线要求,但用户代理可以自由地 施加额外约束。
-
将给定 cookie 调用序列化 cookie所得的结果追加到 cookies。
-
-
-
-
令 destination 为 request 的destination。
-
令 initiator type 为 request 的initiator type。
-
令 timings 为以 request 调用获取 fetch timings所得的结果。
-
返回一个匹配
network.RequestData产生式的映射,其中request字段设置为 request id,url字段 设置为 url,method字段设置为 method,headers字段设置为 headers,cookies 字段设置为 cookies,headersSize字段设置为 headers size,bodySize字段设置为 body size,destination字段设置为 destination,initiatorType字段设置为 initiator type,并且timings字段设置为 timings。
7.5.4.16. network.ResponseContent 类型
network.ResponseContent= {size: js-uint }
network.ResponseContent 类型表示对网络请求的已解码响应。
-
返回一个匹配
network.ResponseContent产生式的新映射,其中size字段设置为 response 的response body info 的decoded 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:
-
令 protocol 为空字符串。
-
如果 response 的final connection timing info 不为 null,则将 protocol 设置为 response 的final connection timing info 的ALPN negotiated protocol。
-
如果 protocol 是空字符串,或等于 "
unknown":-
如果 protocol 等于 "
http" 或 "https",并且 response 具有关联的 HTTP Response。注:[FETCH] 未明确说明 HTTP 网络响应与 response 对象之间的关系。
-
返回 protocol。
-
将 protocol 设置为给定 response 调用获取 protocol所得的结果。
-
令 status 为 response 的status。
-
令 status text 为 response 的status message。
-
如果 response 的cache state 是 "
local", 则令 from cache 为 true,否则令其为 false。 -
令 headers 为空列表。
-
令 mime type 为 response 的计算 MIME 类型的实质。
注:这就是浏览器实际使用的 MIME 类型, 即使它没有遵循 [MIMESNIFF] 规范中的确切算法。
-
对于 response 的headers list 中的每个 (name, value):
-
将以 name 和 value 调用序列化 header所得的结果追加到 headers。
-
-
令 bytes received 为作为与 response 关联的 HTTP 响应的一部分传输的总字节数。
-
令 headers size 为作为 HTTP 响应的 header fields section 的一部分传输的字节数。
-
令 body size 为 response 的response body info 的encoded size。
-
令 content 为以 response 调用获取 response content info所得的结果。
-
令 auth challenges 为以 response 调用提取 challenges所得的结果。
-
返回一个匹配
network.ResponseData产生式的映射, 其中url字段设置为 url,protocol字段 设置为 protocol,status字段设置为 status,statusText字段设置为 status text,fromCache字段设置为 from cache,headers字段设置为 headers,mimeType字段设置为 mime type,bytesReceived字段设置为 bytes received,headersSize字段设置为 headers size,bodySize字段设置为 body size,content字段设置为 content,并且如果 auth challenges 不为 null, 则将authChallenges字段设置为 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.SetCookieHeader 表示
Set-Cookie 响应 header 中的数据。
注:这会生成 input 作为十进制数字字符串的最短表示。
-
令 serialized 为空字符串。
-
令 value 为 input。
-
当 value 大于 0 时:
-
令 x 为 value 除以 10。
-
令 most significant digits 为 x 的整数部分。
-
令 y 为 most significant digits 乘以 10。
-
令 least significant digit 为 value - y。
-
断言:least significant digit 是 0 到 9(含)范围内的整数。
-
令 codepoint 为一个码 点,其值为 U+0030 DIGIT ZERO 的值 + least significant digit。
-
将 codepoint 前置到 serialized。
-
将 value 设置为 most significant digits。
-
-
返回 serialized。
-
令 name 为对 protocol cookie["
name"] 进行UTF-8 编码所得的结果。 -
令 value 为以 protocol cookie["
value"] 调用反序列化协议 bytes所得的结果。 -
令 header value 为通过连接 name、 `
=` 和 value 形成的字节 序列。 -
如果 protocol cookie 包含 "
expiry":-
令 attribute 为 `
;Expires=` -
将 protocol cookie["
expiry"] 的UTF-8 编码追加到 attribute。 -
将 attribute 追加到 header value。
-
-
如果 protocol cookie 包含 "
maxAge": -
如果 protocol cookie 包含 "
domain":-
令 attribute 为 `
;Domain=` -
将 protocol cookie["
domain"] 的UTF-8 编码追加到 attribute。 -
将 attribute 追加到 header value。
-
-
如果 protocol cookie 包含 "
path":-
令 attribute 为 `
;Path=` -
将 protocol cookie["
path"] 的UTF-8 编码追加到 attribute。 -
将 attribute 追加到 header value。
-
-
如果 protocol cookie 包含 "
secure" 且 protocol cookie["secure"] 为 true:-
将 `
;Secure` 追加到 header value。
-
-
如果 protocol cookie 包含 "
httpOnly" 且 protocol cookie["httpOnly"] 为 true:-
将 `
;HttpOnly` 追加到 header value。
-
-
如果 protocol cookie 包含 "
sameSite":-
令 attribute 为 `
;SameSite=` -
将 protocol cookie["
sameSite"] 的UTF-8 编码追加到 attribute。 -
将 attribute 追加到 header value。
-
-
返回 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.UrlPattern 表示用于为网络
拦截匹配请求 URL 的模式。
当 URL 与 network.UrlPattern 匹配时,会解析该 URL,
并在模式中存在对应字段时,将每个组成部分与该字段按相等性进行比较。
模式中缺失的字段始终匹配。
注:此语法在设计时考虑了未来的可扩展性。 特别是,该语法禁止在 [URLPattern] 规范中被特殊处理的字符。这些字符可以通过在其前面加上 U+005C (\) 字符进行转义。
-
令 forbidden characters 为码点 «U+0028 ((), U+0029 ()), U+002A (*), U+007B ({), U+007D (})» 的集合
-
令 result 为空字符串。
-
令 is escaped character 为 false。
-
对于 pattern 中的每个 codepoint:
-
如果 is escaped character 为 false:
-
如果 forbidden characters 包含 codepoint,则返回带有错误代码 invalid argument 的错误。
-
如果 codepoint 是 U+005C (\):
-
将 is escaped character 设置为 true。
-
继续。
-
-
-
将 codepoint 追加到 result。
-
将 is escaped character 设置为 false。
-
-
返回带有数据 result 的成功。
-
令 has protocol 为 true。
-
令 has hostname 为 true。
-
令 has port 为 true。
-
令 has pathname 为 true。
-
令 has search 为 true。
-
如果 pattern 匹配
network.UrlPatternPattern产生式:-
令 pattern url 为空字符串。
-
如果 pattern 包含 "
protocol":-
如果 pattern["
protocol"] 是空字符串,则返回带有错误代码 invalid argument 的错误。 -
令 protocol 为尝试以 pattern["
protocol"] 调用反转义 URL Pattern所得的结果。 -
对于 protocol 中的每个 codepoint:
-
如果 codepoint 不是 ASCII 字母数字,且 «U+002B (+), U+002D (-), U+002E (.)» 不包含 codepoint:
-
-
将 protocol 追加到 pattern url。
-
-
否则:
-
将 has protocol 设置为 false。
-
将 "
http" 追加到 pattern url。
-
-
令 scheme 为以 pattern url 调用ASCII 小写化所得的结果。
-
将 "
:" 追加到 pattern url。 -
如果 scheme 为 special,则将 "
//" 追加到 pattern url。 -
如果 pattern 包含 "
hostname":-
如果 pattern["
hostname"] 是空字符串,则返回带有错误代码 invalid argument 的错误。 -
如果 scheme 是 "
file",则返回带有错误代码 invalid argument 的错误。 -
令 hostname 为尝试以 pattern["
hostname"] 调用反转义 URL Pattern所得的结果。 -
令 inside brackets 为 false。
-
对于 hostname 中的每个 codepoint:
-
如果 «U+002F (/), U+003F (?), U+0023 (#)» 包含 codepoint:
-
返回带有错误代码 invalid argument 的错误。
-
-
如果 inside brackets 为 false 且 codepoint 是 U+003A (:):
-
返回带有错误代码 invalid argument 的错误。
-
-
如果 codepoint 是 U+005B ([),则将 inside brackets 设置为 true。
-
如果 codepoint 是 U+005D (]),则将 inside brackets 设置为 false。
-
-
将 hostname 追加到 pattern url。
-
-
否则:
-
如果 scheme 不是 "
file",则将 "placeholder" 追加到 pattern url。 -
将 has hostname 设置为 false。
-
-
如果 pattern 包含 "
port":-
如果 pattern["
port"] 是空字符串,则返回带有错误代码 invalid argument 的错误。 -
令 port 为尝试以 pattern["
port"] 调用反转义 URL Pattern所得的结果。 -
将 "
:" 追加到 pattern url。 -
对于 port 中的每个 codepoint:
-
如果 codepoint 不是 ASCII 数字:
-
返回带有错误代码 invalid argument 的错误。
-
-
-
将 port 追加到 pattern url。
-
-
否则:
-
将 has port 设置为 false。
-
-
如果 pattern 包含 "
pathname":-
令 pathname 为尝试以 pattern["
pathname"] 调用反转义 URL Pattern所得的结果。 -
如果 pathname 不是以 U+002F (/) 开头,则 将 "
/" 追加到 pattern url。 -
对于 pathname 中的每个 codepoint:
-
如果 «U+003F (?), U+0023 (#)» 包含 codepoint:
-
返回带有错误代码 invalid argument 的错误。
-
-
-
将 pathname 追加到 pattern url。
-
-
否则:
-
将 has pathname 设置为 false。
-
-
如果 pattern 包含 "
search":-
令 search 为尝试以 pattern["
search"] 调用反转义 URL pattern所得的结果。 -
如果 search 不是以 U+003F (?) 开头,则 将 "
?" 追加到 pattern url。 -
对于 search 中的每个 codepoint:
-
如果 codepoint 是 U+0023 (#):
-
返回带有错误代码 invalid argument 的错误。
-
-
-
将 search 追加到 pattern url。
-
-
否则:
-
将 has search 设置为 false。
-
-
-
否则,如果 pattern 匹配
network.UrlPatternString产生式:-
令 pattern url 为尝试以 pattern["
pattern"] 调用反转义 URL pattern所得的结果。
-
-
令 url 为解析 pattern url 所得的结果。
-
如果 url 是 failure,则返回带有错误代码 invalid argument 的错误。
-
令 parsed 为具有以下字段的结构体:
- protocol
- 如果 has protocol 为 true,则为 url 的 scheme;否则为 null。
- hostname
- 如果 has hostname 为 true,则为 url 的 host;否则为 null。
- port
- pathname
-
-
如果 has pathname 为 false:
-
null。
-
-
否则:
-
如果 url 的path 不是空字符串且 不是空, 则为以 url 调用URL path 序列化器所得的结果; 否则为 null。
-
-
- search
-
返回带有数据 parsed 的成功。
-
令 url 为解析 url string 所得的结果。
-
如果 url pattern 的 protocol 不为 null 且不等于 url 的 scheme,则返回 false。
-
如果 url pattern 的 hostname 不为 null 且不等于 url 的 host,则返回 false。
-
如果 url pattern 的 port 不为 null:
-
如果 url pattern 的 pathname 不为 null,且不等于 以 url 运行URL path 序列化器的结果,则返回 false。
-
如果 url pattern 的 search 不为 null:
-
令 url query 为 url 的query。
-
如果 url query 为 null,则将 url query 设置为空字符串。
-
如果 url pattern 的 search 不等于 url query,则返回 false。
-
-
返回 true。
7.5.5. 命令
7.5.5.1. network.addDataCollector 命令
network.addDataCollector 会添加一个 collector。
- 命令类型
-
network.AddDataCollector= (method:"network.addDataCollector",params: network.AddDataCollectorParameters )network.AddDataCollectorParameters= {dataTypes: [+network.DataType],maxEncodedDataSize: js-uint, ?collectorType: network.CollectorType .default "blob", ?contexts: [+browsingContext.BrowsingContext], ?userContexts: [+browser.UserContext], } - 返回类型
-
network.AddDataCollectorResult= {collector: network.Collector }
-
令 collector id 为 UUID 的字符串表示。
-
令 input context ids 为空集合。
-
如果 command parameters 的
contexts字段存在, 则将 input context ids 设置为用 command parameters[contexts] 创建集合。 -
令 data types 为用 command parameters["
dataTypes"] 创建集合。 -
令 max encoded item size 为 command parameters ["
maxEncodedDataSize"]。注:
maxEncodedDataSize参数表示 max encoded item size,并限制由给定 collector 收集的每个请求的大小,而不是该 collector 收集到的数据总大小。注:不同实现可能支持不同编码,这意味着 编码后的大小可能在不同浏览器之间不同。因此,对于同一个数据 collector 配置,某些网络数据可能只在某些实现中适合 max encoded item size。
-
令 collector type 为 command parameters ["
collectorType"]。 -
令 input user context ids 为空集合。
-
如果 command parameters 的
userContexts字段存在, 则将 input user context ids 设置为用 command parameters[userContexts] 创建集合。 -
如果 input user context ids 非空且 input context ids 非空, 则返回带有错误 代码 invalid argument 的错误。
-
如果 max encoded item size 为 0,或 max encoded item size 大于 max total collected size,则返回带有错误 代码 invalid argument 的错误。
-
如果 input context ids 不是空:
-
令 navigables 为尝试以 input context ids 调用通过 id 获取有效 navigables所得的结果。
-
对于 navigables 中的每个 navigable:
-
如果 navigable 不是顶级 traversable,则返回带有错误代码 invalid argument 的错误。
-
-
-
否则,如果 input user context ids 不是空:
-
对于 input user context ids 的每个 user context id:
-
令 user context 为以 user context id 调用获取用户上下文所得的结果。
-
如果 user context 为 null,则返回带有错误代码 no such user context 的错误。
-
-
-
令 collector 为一个collector,其 max 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。
-
将 session 的 network collectors[collector id] 设置为 collector。
-
返回一个新的映射,其匹配
network.AddDataCollectorResult产生式,并且collector字段设置为 collector id。
7.5.5.2. network.addIntercept 命令
network.addIntercept 命令会添加一个 网络拦截。
- 命令类型
-
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 }
-
令 intercept 为 UUID 的字符串表示。
-
令 url patterns 为 command parameters 的
urlPatterns字段(如果存在),否则为空列表。 -
令 navigables 为 null。
-
如果 command parameters 的
contexts字段存在:-
将 navigables 设置为空集合。
-
对于 command parameters["
contexts"] 的每个 navigable id-
令 navigable 为尝试以 navigable id 调用获取 navigable 所得的结果。
-
如果 navigable 不是顶级 traversable,则返回带有错误代码 invalid argument 的错误。
-
将 navigable 追加到 navigables。
-
-
如果 navigables 是空集合,则返回带有 错误代码 invalid argument 的错误。
-
-
令 intercept map 为 session 的intercept map。
-
令 parsed patterns 为空列表。
-
对于 url patterns 中的每个 url pattern:
-
令 parsed 为尝试以 url pattern 调用解析 url pattern所得的结果。
-
将 parsed 追加到 parsed patterns。
-
-
将 intercept map[intercept] 设置为一个结构体,其
url patterns为 parsed patterns,phases为 command parameters["phases"],以及browsingContexts为 navigables。 -
返回一个新的映射,其匹配
network.AddInterceptResult产生式,并且intercept字段设置为 intercept。
7.5.5.3. network.continueRequest 命令
network.continueRequest 命令会继续一个 被网络拦截阻塞的请求。
- 命令类型
-
network.ContinueRequest= (method:"network.continueRequest",params: network.ContinueRequestParameters )network.ContinueRequestParameters= {request: network.Request, ?body: network.BytesValue, ?cookies: [*network.CookieHeader], ?headers: [*network.Header], ?method: text, ?url: text, } - 返回类型
-
network.ContinueRequestResult= EmptyResult
-
令 blocked requests 为 session 的blocked request map。
-
令 request id 为 command parameters["
request"]。 -
如果 blocked requests 不包含 request id,则返回带有错误 代码 no such request 的错误。
-
令 (request, phase, response) 为 blocked requests[request id]。
-
如果 phase 不是 "
beforeRequestSent",则返回带有错误代码 invalid argument 的错误。 -
如果 command parameters 包含 "
url": -
如果 command parameters 包含 "
method":-
令 method 为 command parameters["
method"]。 -
如果 method 不匹配 method token 产生式,则返回带有 错误代码 "
invalid argument" 的错误。 -
令 request 的method 为 method。
-
-
如果 command parameters 包含 "
headers":-
令 headers 为空header list。
-
对于 command parameters["
headers"] 中的 header:-
令 deserialized header 为以 header 调用反序列化 header所得的结果。
-
如果 deserialized header 的 name 不匹配 field-name token 产生式,则返回带有错误代码 "
invalid argument" 的错误。 -
如果 deserialized header 的 value 不匹配 header value 产生式,则返回带有错误代码 "
invalid argument" 的错误。 -
将 deserialized header 追加到 headers。
-
-
将 request 的headers list 设置为 headers。
-
-
如果 command parameters 包含 "
cookies":-
令 cookie header 为空字节 序列。
-
对于 command parameters["
cookies"] 中的每个 cookie:-
如果 cookie header 非空,则将 `
;` 追加到 cookie header。 -
将以 cookie 调用序列化 cookie header所得的结果追加到 cookie header。
-
-
令 found cookie header 为 false。
-
对于 request 的headers list 中的每个 header:
-
令 name 为 header 的 name。
-
如果对 name 进行 byte-lowercase 的结果为 `
cookie`:-
将 header 的 value 设置为 cookie header。
-
将 found cookie header 设置为 true。
-
中断。
-
-
-
如果 found cookie header 为 false:
-
将header (`
Cookie`, cookie header) 追加到 request 的headers list。
-
-
-
如果 command parameters 包含 "
body":-
令 body 为以 command parameters["
body"] 调用反序列化 protocol bytes所得的结果。 -
将 request 的body 设置为 body。
-
-
以 "
continue request"、request id 和 (null, "incomplete") 恢复。 -
返回带有数据 null 的成功。
7.5.5.4. network.continueResponse 命令
network.continueResponse 命令会继续一个
被网络拦截阻塞的响应。它可以在
responseStarted 阶段调用,以修改响应的状态和头部,
但仍提供网络响应体。
- 命令类型
-
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
-
令 request id 为 command parameters["
request"]。 -
令 response 为尝试以 session、"
continueResponse" 和 command parameters 调用更新 response所得的结果。 -
以 "
continue request"、request id 和 (response, "incomplete") 恢复。 -
返回带有数据 null 的成功。
7.5.5.5. network.continueWithAuth 命令
network.continueWithAuth 命令会继续一个在
authRequired 阶段被网络拦截阻塞的响应。
- 命令类型
-
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
-
令 blocked requests 为 session 的blocked request map。
-
令 request id 为 command parameters["
request"]。 -
如果 blocked requests 不包含 request id,则返回带有错误 代码 no such request 的错误。
-
令 (request, phase, response) 为 blocked requests[request id]。
-
如果 phase 不是 "
authRequired",则返回带有错误代码 invalid argument 的错误。 -
如果 command parameters "
action" 是 "cancel",则将 response 的 authentication credentials 设置为 "cancelled"。 -
如果 command parameters "
action" 是 "provideCredentials":-
令 credentials 为 command parameters["
credentials"]。 -
断言:credentials["
type"] 是 "password"。 -
将 response 的 authentication credentials 设置为 (credentials["
username"], credentials["password"])
-
-
以 "
continue request"、request id 和 (response, "incomplete") 恢复。 -
返回带有数据 null 的成功。
7.5.5.6. network.disownData 命令
network.disownData 命令会为给定collector释放收集到的网络数据。
- 命令类型
-
network.DisownData= (method:"network.disownData",params: network.DisownDataParameters )network.DisownDataParameters= {dataType: network.DataType,collector: network.Collector,request: network.Request, } - 返回类型
-
network.DisownDataResult= EmptyResult
-
令 data type 为 command parameters 中 "
dataType" 字段的值。 -
令 collector id 为 command parameters 中 "
collector" 字段的值。 -
令 request id 为 command parameters 中 "
request" 字段的值。 -
令 collectors 为 session 的network collectors。
-
如果 collectors 不包含 collector id,则返回带有错误 代码 no such network collector 的错误。
-
令 collected data 为以 request id 和 data type 调用获取 collected data所得的结果。
-
如果 collected data 为 null,则返回带有错误代码 no such network data 的错误。
-
以 collected data 和 collector id 调用从 data 中移除 collector。
7.5.5.7. network.failRequest 命令
network.failRequest 命令会使一个被网络拦截阻塞的 fetch 失败。
- 命令类型
-
network.FailRequest= (method:"network.failRequest",params: network.FailRequestParameters )network.FailRequestParameters= {request: network.Request, } - 返回类型
-
network.FailRequestResult= EmptyResult
-
令 blocked requests 为 session 的blocked request map。
-
令 request id 为 command parameters["
request"]。 -
如果 blocked requests 不包含 request id,则返回带有错误 代码 no such request 的错误。
-
令 (request, phase, response) 为 blocked requests[request id]。
-
如果 phase 是 "
authRequired",则返回带有错误代码 invalid argument 的错误。 -
令 response 为新的网络错误。
允许设置 精确的错误种类 [Issue #508]
-
以 "
continue request"、request id 和 (response, "complete") 恢复。 -
返回带有数据 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, }
-
令 data type 为 command parameters["
dataType"]。 -
令 request id 为 command parameters["
request"]。 -
令 collector id 为 null。
-
如果 command parameters 包含 "
collector":-
令 collectors 为 session 的network collectors。
-
如果 collectors 不包含 collector id,则返回 带有错误代码 no such network collector 的错误。
-
将 collector id 设置为 command parameters["
collector"]。
-
-
令 disown 为 command parameters["
disown"]。 -
如果 disown 为 true 且 collector id 为 null,则返回带有 错误代码 invalid argument 的错误。
-
令 collected data 为给定 request id 和 data type 时获取 collected data所得的结果。
-
如果 collected data 为 null:
-
返回带有错误代码 no such network data 的错误。
-
-
如果 collected data 的 pending 为 true:
-
以 "network data collected" 和 (request id, data type) 等待。
-
-
如果 collector id 不是 null,并且如果 collected data 的 collectors 不包含 collector id:
-
返回带有错误代码 no such network data 的错误。
-
-
令 bytes 为 collected data 的bytes。
-
如果 bytes 为 null,
-
返回带有错误代码 unavailable network data 的错误。
-
-
令 body 为一个匹配
network.GetDataResult产生式的 映射, 其bytes字段设置为 bytes。 -
如果 disown 为 true,则以 collected data 和 collector id 调用从 data 中移除 collector。
-
返回带有数据 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
-
令 request id 为 command parameters["
request"]。 -
令 response 为尝试以 session、"
provideResponse" 和 command parameters 调用更新 response所得的结果。 -
如果 command parameters 包含 "
body":-
令 body 为以 command parameters["
body"] 调用反序列化 protocol bytes所得的结果。
-
-
以 "
continue request"、request id 和 (response,"complete") 恢复。 -
返回带有数据 null 的成功。
7.5.5.10. network.removeDataCollector 命令
network.removeDataCollector 命令会移除一个 collector。
- 命令类型
-
network.RemoveDataCollector= (method:"network.removeDataCollector",params: network.RemoveDataCollectorParameters )network.RemoveDataCollectorParameters= {collector: network.Collector } - 返回类型
-
network.RemoveDataCollectorResult= EmptyResult
-
令 collector id 为 command parameters 中 "
collector" 字段的值。 -
令 collectors 为 session 的network collectors。
-
如果 collectors 不包含 collector id,则返回 带有错误 代码 no such network collector 的错误。
-
从 session 的network collectors中移除 collector id。
-
对于 collected network data 中的 collected data, 以 collected data 和 collector id 调用从 data 中移除 collector。
7.5.5.11. network.removeIntercept 命令
network.removeIntercept 命令会移除一个 网络拦截。
- 命令类型
-
network.RemoveIntercept= (method:"network.removeIntercept",params: network.RemoveInterceptParameters )network.RemoveInterceptParameters= {intercept: network.Intercept } - 返回类型
-
network.RemoveInterceptResult= EmptyResult
-
令 intercept 为 command parameters 中 "
intercept" 字段的值。 -
令 intercept map 为 session 的intercept map。
-
如果 intercept map 不包含 intercept,则返回 带有错误 代码 no such intercept 的错误。
-
从 intercept map 中移除 intercept。
注:移除某个拦截不会影响已被此拦截 阻塞的请求。只有未来的请求或现有请求的未来阶段 会受到影响。
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
-
令 navigable 为 null。
-
-
令 environment settings 为 request 的client。
-
如果存在一个navigable,其活动 window是 environment settings 的全局对象,则将 navigable 设置为该 navigable 的顶级 traversable。
-
-
如果 navigable 不是 null,且 navigable cache behavior map 包含 navigable,则返回 navigable cache behavior map[navigable]。
-
令 top-level navigable 为 navigable 的顶级 traversable。
-
如果 navigable cache behavior map 包含 top-level navigable,则返回 navigable cache behavior map[top-level navigable]。
-
令 behavior 为 command parameters["
cacheBehavior"]。 -
如果 command parameters 不包含 "
contexts":-
将 default cache behavior 设置为 behavior。
-
根据 behavior 的值切换:
- "
bypass" - 执行实现定义步骤,以禁用任何 实现特定的资源缓存。
- "
default" - 执行实现定义步骤,以启用当前远端配置中通常启用的任何 实现特定的资源缓存。
- "
-
返回带有数据 null 的成功。
-
-
令 navigables 为空集合。
-
对于 command parameters["
contexts"] 的每个 navigable id:-
令 context 为尝试以 navigable id 调用获取 navigable所得的结果。
-
如果 context 不是顶级浏览上下文,则返回带有 错误代码 invalid argument 的错误。
-
将 context 追加到 navigables。
-
-
对于 navigables 中的每个 navigable:
-
如果 navigable cache behavior map 包含 navigable,且 navigable cache behavior map[navigable] 等于 behavior,则 继续。
-
根据 behavior 的值切换:
-
如果 behavior 等于 default cache behavior:
-
如果 navigable cache behavior map 包含 navigable, 则移除 navigable cache behavior map[navigable]。
-
-
否则:
-
将 navigable cache behavior map[navigable] 设置为 behavior。
-
-
-
返回带有数据 null 的成功。
7.5.5.13. network.setExtraHeaders 命令
network.setExtraHeaders 命令允许 指定将扩展或覆盖现有请求头的头部。
- 命令类型
-
network.SetExtraHeaders= (method:"network.setExtraHeaders",params: network.SetExtraHeadersParameters )network.SetExtraHeadersParameters= {headers: [*network.Header] ?contexts: [+browsingContext.BrowsingContext] ?userContexts: [+browser.UserContext] } - 返回类型
-
network.SetExtraHeadersResult= EmptyResult
-
令 request headers 为 request 的header list。
-
对于 headers 中的每个 header:
-
在 request headers 中设置 header。
注:这总是会覆盖现有值(如果有)。特别是它 不会将 cookie 追加到现有的 `Set-Cookie` header。
-
-
断言:related navigables 的大小为 0 或 1。
注:这意味着它不适用于与多个 navigables 关联的 worker。在这种情况下,不清楚应按什么顺序覆盖 headers。
-
以 request 和 session 的 extra headers 的default headers 调用更新 headers
-
令 user context headers 为 session 的extra headers 的 user context headers。
-
对于 related navigables 中的 navigable:
-
令 user context 为 navigable 的关联 用户上下文。
-
如果 user context headers 包含 user context, 则以 request 和 user context headers[user context] 调用更新 headers
-
-
令 navigable headers 为 session 的extra headers 的 navigable headers。
-
对于 related navigables 中的 navigable:
-
令 top-level traversable 为 navigable 的 顶级 traversable。
-
如果 navigable headers 包含 top-level traversable, 则以 request 和 navigable headers[top-level traversable] 调用更新 headers。
-
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
令 headers 为尝试以 command parameters["
headers"] 调用创建 headers list所得的结果。 -
如果 command parameters 包含 "
userContexts":-
令 user contexts 为空列表。
-
对于 command parameters["
userContexts"] 中的 user context id:-
令 user context 为以 user context id 调用获取用户上下文所得的结果。
-
如果 user context 为 null,则返回带有错误代码 no such user context 的错误。
-
将 user context 追加到 user contexts。
-
-
令 target 为 session 的extra headers 的 user context headers
-
对于 user contexts 中的 user context:
-
将 target[user context] 设置为 headers。
-
-
返回带有数据 null 的成功。
-
-
如果 command parameters 包含 "
contexts":-
令 navigables 为尝试以 command parameters["
contexts"] 调用通过 id 获取有效顶级 traversables所得的结果。 -
令 target 为 session 的extra headers 的 navigable headers
-
对于 navigables 中的 navigable:
-
将 target[navigable] 设置为 headers。
-
-
返回带有数据 null 的成功。
-
-
将 session 的extra headers 的 default headers 设置为 headers。
-
返回带有数据 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 }
此事件会在用户代理即将提示输入授权 凭据时发出。
-
令 redirect count 为 request 的redirect count。
-
断言:before request sent map[request] 等于 redirect count。
注:这意味着每个调用者都需要确保在这些步骤之前, 先以 request 调用 WebDriver BiDi before request sent 步骤。
-
如果 request 的client 不是 null,则令 related navigables 为以 request 的 client 调用获取相关 navigables所得的结果。否则令 related navigables 为空集合。
-
对于给定 "
network.authRequired" 和 related navigables 时的事件已启用的会话集合中的每个 session:-
令 params 为以 session、 "
network.authRequired" 和 request 调用处理 network event所得的结果。 -
令 response data 为以 response 调用获取 response data所得的结果。
-
断言:response data 包含 "
authChallenge"。 -
将 params 的
response字段设置为 response data。 -
断言:params 匹配
network.AuthRequiredParameters产生式。 -
令 body 为一个匹配
network.AuthRequired产生式的映射,其params字段设置为 params。 -
以 session 和 body 发出 事件。
-
如果 params["
isBlocked"] 为 true:-
令 blocked requests 为 session 的blocked request map。
-
令 request id 为 request 的request id。
-
将 blocked requests[request id] 设置为 (request, "
authRequired", response)。 -
以 «"
continue request"» 和 request id 等待。 -
移除 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 或本地缓存处理之前)。
-
令 settings 为 request 的client。
-
令 related navigables 为以 settings 调用获取相关 navigables所得的结果。
-
对于 related navigables 中的 navigable:
-
如果 navigable 的关联用户上下文是 user context,则返回 true。
-
-
返回 false。
-
对于 related navigables 的每个 navigable:
-
令 top-level traversable 为 navigable 的顶级 traversable。
-
令 user context 为 top-level traversable 的关联 用户上下文。
-
对于 活动 BiDi 会话中的每个 session:
-
如果 session 的模拟网络 条件的 navigable network conditions 包含 top-level traversable, 则返回 session 的 模拟网络 条件的 navigable network conditions[top-level traversable]。
-
-
对于 活动 BiDi 会话中的每个 session:
-
如果 session 的模拟网络 条件的 user context network conditions 包含 user context,则返回 session 的 模拟网络 条件的 user context network conditions[user context]。
-
-
对于 活动 BiDi 会话中的每个 session:
-
如果 session 的模拟网络 条件的 default network conditions 不是 null, 则返回 session 的模拟网络 条件的 default network conditions。
-
-
-
返回 null。
-
令 navigable 为 settings 的相关全局对象的 关联
Document的node navigable。 -
令 emulated network conditions 为以 [navigable] 调用 获取模拟网络条件所得的结果。
-
如果 emulated network conditions 不是 null,且 emulated network conditions 的 offline 为 true,则返回 true。
-
返回 false。
-
对于用户上下文集合中的每个 user context:
-
如果以 request 和 user context 执行请求是否源自用户 上下文步骤返回 true:
-
对于 活动 BiDi 会话中的每个 session:
注:user context 最多只能位于一个 user context to accept insecure certificates override map 中。
-
如果 session 的user context to accept insecure certificates override map 包含 user context:
-
令 accept insecure certificates 为 session 的 user context to accept insecure certificates override map[user context]。
-
如果 accept insecure certificates 为 true:
-
断言端点节点 支持接受不安全的 TLS 连接。
-
为 request 运行 Basic Certificate Processing 步骤时,跳过步骤 a,以及任何其他 实现定义的证书验证步骤。
-
-
否则,为 request 运行 Basic Certificate Processing 步骤时,执行所有步骤以及任何实现定义的 证书验证步骤。
-
注:user context 最多只能位于一个 user context to proxy configuration map 中。
-
如果 session 的user context to proxy configuration map 包含 user context:
-
令 proxy configuration 为 session 的 user context to proxy configuration map[user context]。
-
采取实现定义步骤,以确保 request 使用由 proxy configuration 定义的代理设置。
注:这些 设置在创建用户上下文时已经过验证,因此 在此阶段假定其有效;访问代理时的任何错误 都会在处理请求时作为网络错误报告。
-
-
-
-
-
以 request 调用可能收集网络请求体。
-
如果 before request sent map 不包含 request,则将 before request sent map[request] 设置为新的 集合。
-
令 redirect count 为 request 的redirect count。
-
将 redirect count 添加到 before request sent map[request]。
-
如果 request 的client 不是 null,则令 related navigables 为以 request 的 client 调用获取相关 navigables所得的结果。否则令 related navigables 为空 集合。
-
令 response 为 null。
-
令 response status 为 "
incomplete"。 -
对于 活动 BiDi 会话中的每个 session:
-
以 session、request 和 related navigables 调用更新 request headers。
-
-
对于给定 "
network.beforeRequestSent" 和 related navigables 时的事件已启用的会话集合中的每个 session:-
令 params 为以 session、 "
network.beforeRequestSent" 和 request 调用处理 network event所得的结果。 -
令 initiator 为以 request 调用获取 initiator所得的结果。
-
如果 initiator 不是空,则将 params 的
initiator字段 设置为 initiator。 -
断言:params 匹配
network.BeforeRequestSentParameters产生式。 -
令 body 为一个匹配
network.BeforeRequestSent产生式的映射,其params字段设置为 params。 -
以 session 和 body 发出 事件。
-
如果 params["
isBlocked"] 为 true,则:-
令 blocked requests 为 session 的blocked request map。
-
令 request id 为 request 的request id。
-
将 blocked requests[request id] 设置为 (request, "
beforeRequestSent", null)。 -
令 (response, status) 为以 «"
continue request"» 和 request 的request id 等待所得的结果。 -
如果 status 是 "
complete",则将 response status 设置为 status。 -
移除 blocked requests[request id]。
注:在等待期间,不会对该请求进行进一步处理。
-
-
-
令 emulated network conditions 为以 related navigables 调用 获取模拟网络条件所得的结果。
-
如果 emulated network conditions 不是 null,且 emulated network conditions 的offline 为 true,则返回 (网络错误, "
complete")。 -
返回 (response, response status)。
7.5.6.3. network.fetchError 事件
- 事件类型
-
network.FetchError= (method:"network.fetchError",params: network.FetchErrorParameters )network.FetchErrorParameters= { network.BaseParameters,errorText: text, }
此事件会在网络请求以错误结束时发出。
-
如果 before request sent map[request] 不包含 request 的 redirect count,则以 request 运行 WebDriver BiDi before request sent 步骤。
注:这确保了
network.beforeRequestSent总是可以在network.fetchError之前发出,而无需调用者在每条错误路径上显式调用 WebDriver BiDi before request sent 步骤。 -
如果 request 的client 不是 null,则令 related navigables 为以 request 的 client 调用获取相关 navigables所得的结果。否则令 related navigables 为空 集合。
-
以 request 调用可能中止网络响应体 收集。
-
对于给定 "
network.fetchError" 和 related navigables 时的事件已启用的会话集合中的每个 session:-
令 params 为以 session、 "
network.fetchError" 和 request 调用处理 network event所得的结果。 -
将 params 的
errorText字段设置为一个实现定义的 字符串, 用于描述导致请求中止的错误。 -
断言:params 匹配
network.FetchErrorParameters产生式。 -
令 body 为一个匹配
network.FetchError产生式的映射,其params字段设置为 params。 -
以 session 和 body 发出 事件。
-
7.5.6.4. network.responseCompleted 事件
- 事件类型
-
network.ResponseCompleted= (method:"network.responseCompleted",params: network.ResponseCompletedParameters )network.ResponseCompletedParameters= { network.BaseParameters,response: network.ResponseData, }
此事件会在接收到完整响应体之后发出。
-
令 redirect count 为 request 的redirect count。
-
断言:before request sent map[request] 包含 redirect count。
注:这意味着每个调用者都需要确保在这些步骤之前, 先以 request 调用 WebDriver BiDi before request sent 步骤。
-
如果 request 的client 不是 null,则令 related navigables 为以 request 的 client 调用获取相关 navigables所得的结果。否则令 related navigables 为空 集合。
-
以 request 和 response 调用可能收集网络响应体。
-
令 sessions 为给定 "
network.responseCompleted" 和 related navigables 时的事件已启用的会话集合。 -
对于 sessions 中的每个 session:
-
令 params 为以 session、 "
network.responseCompleted" 和 request 调用处理 network event所得的结果。 -
断言:params["
isBlocked"] 为 false。 -
令 response data 为以 response 调用获取 response data所得的结果。
-
将 params 的
response字段设置为 response data。 -
断言:params 匹配
network.ResponseCompletedParameters产生式。 -
令 body 为一个匹配
network.ResponseCompleted产生式的映射,其params字段设置为 params。 -
以 session 和 body 发出 事件。
-
7.5.6.5. network.responseStarted 事件
- 事件类型
-
network.ResponseStarted= (method:"network.responseStarted",params: network.ResponseStartedParameters )network.ResponseStartedParameters= { network.BaseParameters,response: network.ResponseData, }
此事件会在接收到响应头之后、响应体完成之前发出。
-
令 redirect count 为 request 的redirect count。
-
断言:before request sent map[request] 等于 redirect count。
注:这意味着每个调用者都需要确保在这些步骤之前, 先以 request 调用 WebDriver BiDi before request sent 步骤。
-
如果 request 的client 不是 null,则令 related navigables 为以 request 的 client 调用获取相关 navigables所得的结果。否则令 related navigables 为空 集合。
-
令 response status 为 "
incomplete"。 -
令 sessions 为给定 "
network.responseStarted" 和 related navigables 时的事件已启用的会话集合。 -
对于 sessions 中的每个 session:
-
令 params 为以 session、 "
network.responseStarted" 和 request 调用处理 network event所得的结果。 -
令 response data 为以 response 调用获取 response data所得的结果。
-
将 params 的
response字段设置为 response data。 -
断言:params 匹配
network.ResponseStartedParameters产生式。 -
令 body 为一个匹配
network.ResponseStarted产生式的映射,其params字段设置为 params。 -
以 session 和 body 发出 事件。
-
如果 params["
isBlocked"] 为 true:-
令 blocked requests 为 session 的blocked request map。
-
令 request id 为 request 的request id。
-
将 blocked requests[request id] 设置为 (request, "
beforeRequestSent", response)。 -
令 (response, status) 为以 «"
continue request"» 和 request id 等待所得的结果。 -
如果 status 为 "
complete",则将 response status 设置为 status。 -
移除 blocked requests[request id]。
-
-
-
返回 (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 会话有一个 preload script map,
它是一个映射,其中键是 UUID,值是带有如下项目的结构体:
一个名为 function declaration 的项目,它是字符串;
一个名为 arguments 的项目,它是列表;
一个名为 contexts 的项目,它是列表或 null;
一个名为 sandbox 的项目,它是字符串或 null;
以及一个名为 user contexts 的项目,它是一个集合。
注:如果执行预加载脚本失败,无论是由于语法 错误还是 运行时异常,都会在其被执行所在的 realm 中报告一个 [ECMAScript] 异常,并且其他预加载脚本会照常运行。
-
令 document 为 environment settings 的相关全局对象的 关联
Document。 -
令 navigable 为 document 的navigable。
-
令 user context 为 navigable 的关联用户 上下文。
-
令 user context id 为 user context 的user context id。
-
对于 活动 BiDi 会话中的每个 session:
-
对于 session 的 preload script map 的 值中的每个 preload script:
-
如果 preload script 的
user contexts的大小不是零: -
如果 preload script 的
contexts不是 null:-
令 navigable id 为 navigable 的顶级 traversable的 id。
-
-
如果 preload script 的
sandbox不是 null,则令 realm 为以 preload script 的sandbox和 navigable 调用获取或创建 sandbox realm所得的结果。否则令 realm 为 environment settings 的 realm 执行上下文的 Realm 组件。 -
令 exception reporting global be be environment settings 的 realm 执行上下文的 Realm 组件的全局对象。
-
令 arguments 为 preload script 的
arguments。 -
令 deserialized arguments 为空列表。
-
对于 arguments 中的每个 argument:
-
令 channel 为以 session、realm 和 argument 调用创建 channel所得的结果。
-
将 channel 追加到 deserialized arguments。
-
-
令 base URL 为 environment settings 的 API base URL。
-
令 options 为默认脚本获取选项。
-
令 function declaration 为 preload script 的
function declaration。 -
令 function body evaluation status 为以 function declaration、 environment settings、base URL 和 options 调用求值 function body所得的结果。
-
如果 function body evaluation status 是突然完成, 则为 exception reporting global 报告异常,该异常由 function body evaluation status.[[Value]] 给出。
-
令 function object 为 function body evaluation status.[[Value]]。
-
如果 IsCallable(function object) 为
false: -
以 environment settings 准备运行脚本。
-
将 evaluation status 设置为 Call(function object, null, deserialized arguments)。
-
以 environment settings 运行脚本后清理。
-
如果 evaluation status 是突然 完成,则为 exception reporting global 报告异常,该异常由 evaluation status.[[Value]] 给出。
-
-
7.6.3. 类型
7.6.3.1. script.Channel 类型
script.Channel = text;
script.Channel
类型表示用于将自定义消息从远端发送到
本地端的特定 channel 的 id。
7.6.3.2. script.ChannelValue 类型
script.ChannelValue= {type:"channel",value: script.ChannelProperties, }script.ChannelProperties= {channel: script.Channel, ?serializationOptions: script.SerializationOptions, ?ownership: script.ResultOwnership, }
script.ChannelValue 类型表示一个
ArgumentValue,它可以被反序列化为一个函数,该函数会将消息从远端发送到本地端。
要在给定 session、realm 和 protocol value 的情况下创建 channel:
-
令 channel properties 为 protocol value["
value"]。 -
令 steps 为给定参数 message 时的以下步骤:
-
令 current realm 为当前 Realm Record。
-
以 session、current realm、channel properties 和 message 发出 script message。
-
-
返回 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.ExceptionDetailsrealm: 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、完成记录 record、ownership type 和 session 的情况下获取 exception details:
-
断言:record.[[Type]] 为
throw。 -
令 text 为由实现定义的、对 record 所表示错误的文本描述。
TODO: 收紧这里的要求;人们可能会尝试用 regex 或同样糟糕的东西来解析 此数据。
-
令 serialization options 为一个匹配
script.SerializationOptions产生式的映射, 其字段设置为它们的默认值。 -
令 exception 为以 record.[[Value]]、serialization options、ownership type、 一个新的映射作为 serialization internal map、realm 和 session 调用序列化为 remote value所得的结果。
-
令 stack trace 为给定 record 时的异常的 stack trace。
-
如果 stack trace 的大小为 1 或更大,则令 line number 为 stack trace[0] 中
lineNumber字段的值,并令 column number 为 stack trace[0] 中columnNumber字段的值。否则 令 line number 和 column number 为 0。 -
令 exception details 为一个匹配
script.ExceptionDetails产生式的映射, 其text字段设置为 text,exception字段设置为 exception,lineNumber字段设置为 line number,columnNumber字段设置为 column number,且stackTrace字段设置为 stack trace。 -
返回 exception details。
7.6.3.5. script.Handle 类型
script.Handle = text;
script.Handle 类型表示由 ECMAScript 运行时拥有的对象的句柄。
该句柄只在特定 Realm 中有效。
每个 ECMAScript Realm 都有一个对应的 handle object map。这是一个从 handle id 到其对应对象的强 映射。
7.6.3.6. script.InternalId 类型
script.InternalId = text;
script.InternalId 类型表示在
序列化期间,
先前序列化的 script.RemoteValue 的 id。
7.6.3.7. script.LocalValue 类型
script.LocalValue= ( script.RemoteReference / script.PrimitiveProtocolValue / script.ChannelValue / script.ArrayLocalValue / { script.DateLocalValue } / script.MapLocalValue / script.ObjectLocalValue / { script.RegExpLocalValue } / script.SetLocalValue )script.ListLocalValue= [*script.LocalValue];script.ArrayLocalValue= {type:"array",value: script.ListLocalValue, }script.DateLocalValue= (type:"date",value: text )script.MappingLocalValue= [*[(script.LocalValue / text), script.LocalValue]];script.MapLocalValue= {type:"map",value: script.MappingLocalValue, }script.ObjectLocalValue= {type:"object",value: script.MappingLocalValue, }script.RegExpValue= {pattern: text, ?flags: text, }script.RegExpLocalValue= (type:"regexp",value: script.RegExpValue, )script.SetLocalValue= {type:"set",value: script.ListLocalValue, }
script.LocalValue
类型表示可以被反序列化到 ECMAScript 中的值。这包括原始值和非原始值,
以及远程引用和
channels。
要在给定 serialized key-value list、realm 和 session 的情况下反序列化 key-value list:
-
令 deserialized key-value list 为一个新的列表。
-
对于 serialized key-value list 中的每个 serialized key-value:
-
如果 serialized key-value 的大小不是 2, 则返回错误,其错误代码为 invalid argument。
-
令 serialized key 为 serialized key-value[0]。
-
如果 serialized key 是
string, 则令 deserialized key 为 serialized key。 -
否则,令 deserialized key 为尝试 以 serialized key、realm 和 session 给定反序列化 local value所得的结果。
-
令 serialized value 为 serialized key-value[1]。
-
令 deserialized value 为尝试 以 serialized value、realm 和 session 给定反序列化 local value所得的结果。
-
将 CreateArrayFromList(«deserialized key, deserialized value») 追加到 deserialized key-value list。
-
-
返回成功,数据为 deserialized key-value list。
要在给定 serialized value list、realm 和 session 的情况下反序列化 value list:
-
令 deserialized values 为一个新的列表。
-
对于 serialized value list 中的每个 serialized value:
-
令 deserialized value 为尝试 以 serialized value、realm 和 session 给定反序列化 local value所得的结果。
-
将 deserialized value 追加到 deserialized values;
-
-
返回成功,数据为 deserialized values。
要在给定 local protocol value、realm 和 session 的情况下反序列化 local value:
-
如果 local protocol value 匹配 script.RemoteReference 产生式,则返回以给定 local protocol value、realm 和 session 反序列化 remote reference所得的结果。
-
如果 local protocol value 匹配 script.PrimitiveProtocolValue 产生式, 则返回以 local protocol value 调用反序列化 primitive protocol value所得的结果。
-
如果 local protocol value 匹配
script.ChannelValue产生式, 则返回以 session、realm 和 local protocol value 调用创建 channel所得的结果。 -
令 type 为 local protocol value 的
type字段的值;如果 不存在这样的字段,则为 undefined。 -
令 value 为 local protocol value 的
value字段的值;如果 不存在这样的字段,则为 undefined。 -
在以下条件及关联步骤的列表中,运行第一个关联条件为 true 的步骤集:
- type 是字符串 "
array" -
-
令 deserialized value list 为尝试以 value、realm 和 session 给定反序列化 value list所得的结果。
-
返回成功,数据为 CreateArrayFromList(deserialized value list)。
-
- type 是字符串 "
date" -
-
如果 value 不匹配 Date Time String Format,则返回 错误,其 错误代码为 invalid argument。
-
断言:date result 不是突然 完成。
-
返回成功,数据为 date result。
-
- type 是字符串 "
map" -
-
令 deserialized key-value list 为尝试以 value、realm 和 session 调用反序列化 key-value list所得的结果。
-
令 iterable 为 CreateArrayFromList(deserialized key-value list)
-
- type 是字符串 "
object" -
-
令 deserialized key-value list 为尝试以 value、realm 和 session 调用反序列化 key-value list所得的结果。
-
令 iterable 为 CreateArrayFromList(deserialized key-value list)
-
返回成功,数据为 Object.fromEntries(iterable)。
-
- type 是字符串 "
regexp" -
-
令 pattern 为 local protocol value 的
pattern字段的值。 -
令 flags 为 local protocol value 的
flags字段的值; 如果不存在这样的字段,则为 undefined。 -
令 regex_result 为 Regexp(pattern, flags)。如果这抛出异常,则返回错误, 其错误代码为 invalid argument。
-
返回成功,数据为 regex_result。
-
- type 是字符串 "
set" -
-
令 deserialized value list 为尝试以 value、realm 和 session 给定反序列化 value list所得的结果。
-
令 iterable 为 CreateArrayFromList(deserialized key-value list)
-
返回成功,数据为 Set object(iterable)。
-
- 否则
- 返回错误,其错误代码为 invalid argument。
- type 是字符串 "
7.6.3.8. script.PreloadScript 类型
script.PreloadScript = text;
script.PreloadScript 类型表示一个指向将在 realm 创建时运行的脚本的句柄。
7.6.3.9. script.Realm 类型
script.Realm = text;
每个 realm 都有一个关联的 realm id,它是一个唯一标识该 realm 的字符串。 这会在创建 realm 时隐式设置。
realm 的 realm id 是不透明的,且 不得能从 handle object map 中对应全局对象的 handle id 推导出来;在相关时,也不得从任何 navigable id 推导出来,该 id 属于某个 navigable。
注:这是为了确保用户不依赖不同 id 之间的 实现特定关系。
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 时序列化 primitive protocol value:
-
令 remote value 为 undefined。
-
在以下条件及关联步骤的列表中,运行第一个关联条件为 true 的步骤集(如果有):
- Type(value) 为 undefined
- 令 remote value 为一个映射,
它匹配
script.UndefinedValue产生式,该产生式位于本地端定义中。 - Type(value) 为 Null
- 令 remote value 为一个映射,
它匹配
script.NullValue产生式,该产生式位于本地端定义中。 - Type(value) 为 String
-
令 remote value 为一个映射,
它匹配
script.StringValue产生式,该产生式位于本地端定义中, 且其valueproperty 设置为 value。 - Type(value) 为 Number
- Type(value) 为 Boolean
- 令 remote value 为一个映射,
它匹配
script.BooleanValue产生式,该产生式位于本地端定义中, 且其valueproperty 设置为 value。 - Type(value) 为 BigInt
- 令 remote value 为一个映射,
它匹配
script.BigIntValue产生式,该产生式位于本地端定义中, 且其valueproperty 设置为对 value 运行 ToString 操作所得的结果。
-
返回 remote value
要在给定 primitive protocol value 时反序列化 primitive protocol value:
-
令 type 为 primitive protocol value 的
type字段的值。 -
令 value 为 undefined。
-
如果 primitive protocol value 有
value字段:-
令 value 为 primitive protocol value 的
value字段的值。
-
-
在以下条件及关联步骤的列表中,运行第一个关联条件为 true 的步骤集:
- type 是字符串 "
undefined" - 返回成功,数据为 undefined。
- type 是字符串 "
null" - 返回成功,数据为 null。
- type 是字符串 "
string" - 返回成功,数据为 value。
- type 是字符串 "
number" -
-
断言:Type(value) 为 String。
-
如果 value 是字符串 "
NaN",则返回成功, 数据为 NaN。 -
令 number_result 为 StringToNumber(value)。
-
如果 number_result 为 NaN,则返回错误,其错误代码为 invalid argument
-
返回成功,数据为 number_result。
- type 是字符串 "
boolean" - 返回成功,数据为 value。
- type 是字符串 "
bigint" -
-
令 bigint_result 为 StringToBigInt(value)。
-
如果 bigint_result 为 undefined,则返回错误,其错误代码为 invalid argument
-
返回成功,数据为 bigint_result。
-
- type 是字符串 "
-
返回错误,其错误 代码为 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 的属性。
-
令 global object 为 realm 的全局对象。
-
令 global object 为解包装后的 global object。
-
如果 global object 不是
Window对象,则返回null。 -
令 document 为 global object 的已包装
Window的 关联Document。 -
返回 document 的node navigable。
-
断言:global object 是一个
WorkerGlobalScope对象。 -
令 owners 为空列表。
-
对于 global object 的关联owner set 中的每个 owner:
-
令 owner environment settings 为 owner 的相关设置对象。
-
令 owner realm info 为给定 owner environment settings 时调用获取 realm info 所得的结果。
-
如果 owner realm info 为 null,则继续。
-
将 owner realm info["
id"] 追加到 owners。
-
-
返回 owners。
-
令 realm 为 environment settings 的realm 执行上下文的 Realm 组件。
-
令 realm id 为 realm 的 realm id。
-
令 origin 为给定 environment settings 的 origin 时的origin 序列化。
-
令 global object 为 environment settings 指定的全局对象
-
运行第一个匹配条件下的步骤:
- global object 是一个
Window对象 -
-
令 document 为 environment settings 的相关全局对象的 关联
Document。 -
令 navigable 为 document 的node navigable。
-
如果 navigable 为 null,则返回 null。
-
令 navigable id 为 navigable 的 navigable id。
-
令 user context id 为 navigable 的关联用户上下文的 user context id
-
令 realm info 为一个映射,它匹配
script.WindowRealmInfo产生式, 其中realm字段设置为 realm id,origin字段设置为 origin,context字段设置为 navigable id,且userContext字段设置为 user context id。
-
- global object 是
SandboxWindowProxy对象 -
TODO: 尚不清楚这是否是处理 sandboxes 的正确表述。
-
令 document 为 global object 的已包装
Window的 关联Document。 -
令 navigable 为 document 的node navigable。
-
如果 navigable 为 null,则返回 null。
-
令 navigable id 为 navigable 的 navigable id。
-
令 user context id 为 navigable 的关联用户上下文的 user context id
-
令 sandbox name 为给定 realm 时调用获取 sandbox name所得的结果。
-
断言:sandbox name 不是 null。
-
令 realm info 为一个映射,它匹配
script.WindowRealmInfo产生式, 其中realm字段设置为 realm id,origin字段设置为 origin,context字段设置为 navigable id,userContext字段设置为 user context id,并且sandbox字段设置为 sandbox name。
-
- global object 是一个
DedicatedWorkerGlobalScope对象 -
-
令 owners 为给定 global object 时调用获取 worker 的 owners所得的结果。
-
断言:owners 精确地有一项。
-
令 realm info 为一个映射,它匹配
script.DedicatedWorkerRealmInfo产生式, 其中realm字段设置为 realm id,origin字段 设置为 origin,并且owners字段设置为 owners。
-
- global object 是一个
SharedWorkerGlobalScope对象 -
-
令 realm info 为一个映射,它匹配
script.SharedWorkerRealmInfo产生式, 其中realm字段设置为 realm id,且origin字段 设置为 origin。
-
- global object 是一个
ServiceWorkerGlobalScope对象 -
-
令 realm info 为一个映射,它匹配
script.ServiceWorkerRealmInfo产生式, 其中realm字段设置为 realm id,且origin字段 设置为 origin。
-
- global object 是一个
WorkerGlobalScope对象 -
-
令 realm info 为一个映射,它匹配
script.WorkerRealmInfo产生式, 其中realm字段设置为 realm id,且origin字段设置为 origin。
-
- global object 是一个
PaintWorkletGlobalScope对象 -
-
令 realm info 为一个映射,它匹配
script.PaintWorkletRealmInfo产生式, 其中realm字段设置为 realm id,且origin字段设置为 origin。
-
- global object 是一个
AudioWorkletGlobalScope对象 -
-
令 realm info 为一个映射,它匹配
script.AudioWorkletRealmInfo产生式, 其中realm字段设置为 realm id,且origin字段设置为 origin。
-
- global object 是一个
WorkletGlobalScope对象 -
-
令 realm info 为一个映射,它匹配
script.WorkletRealmInfo产生式, 其中realm字段设置为 realm id,且origin字段设置为 origin。
-
- 否则:
-
-
令 realm info 为 null。
-
- global object 是一个
-
返回 realm info
注:此规范未来的变体将保留以下不变量:
在按 "-" 拆分类型名称后,
类型名称的最后一个组成部分,对于实现
WorkerGlobalScope
的 globals 始终为 "worker",
而对于实现 WorkletGlobalScope
的 globals 始终为 "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
类型要么是
script.RemoteObjectReference,表示对给定 Realm 中
handle object map 内已有
ECMAScript 对象的远程引用;要么
是 script.SharedReference,表示对某个 node 的引用。
处理 "stale object reference" 情况。
注:如果所提供的引用同时具有
handle 和
sharedId,该算法将忽略 handle,而只遵循
sharedId。
-
断言 remote reference 匹配
script.RemoteReference产生式。 -
如果 remote reference 匹配
script.SharedReference产生式,则返回 以 remote reference、realm 和 session 调用反序列化 shared reference 的结果。 -
返回以 remote reference 和 realm 调用反序列化 remote object reference 的结果。
-
令 handle id 为 remote object reference 的
handle字段的值。 -
令 handle map 为 realm 的 handle object map
-
如果 handle map 不包含 handle id,则返回错误,其 错误代码为 no such handle。
-
返回成功,数据为 handle map[handle id]。
-
断言 shared reference 匹配
script.SharedReference产生式。 -
令 navigable 为以 realm 调用获取 navigable 的结果。
-
如果 navigable 为
null,则返回错误,其错误代码 为 no such node。注:当 realm 不是 Window global 时会发生这种情况。
-
令 shared id 为 shared reference 的
sharedId字段的值。 -
如果 node 为
null,则返回错误,其错误代码 为 no such node。 -
令 environment settings 为其 realm 执行上下文的 Realm 组件是 realm 的环境设置对象。
-
如果 node 的node document 的origin 与 environment settings 的origin 不是same origin domain, 则返回错误,其错误 代码为 no such node。
注:这会确保 WebDriver-BiDi 不能被用来在本来不允许脚本访问的 realms 之间传递对象。
-
令 realm global object 为 realm 的全局对象。
-
如果 realm global object 是
SandboxWindowProxy对象,则将 node 设置为在 realm 中包装 node 的SandboxProxy。 -
返回成功,数据为 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 }
WindowProxy 是否应该以类似 Node 的样式 获取属性?
是否要特殊处理 String / Number / 等包装器对象?
可从 ECMAScript 运行时访问的值由一个镜像对象表示,
其指定为 script.RemoteValue。值的类型由
type 属性指定。对于可用 JSON 表示的
原始值,它会在 value 属性中包含该值;对于
不可用 JSON 表示的原始值,value 属性
包含该值的字符串表示。
对于非原始对象,handle 属性在存在时
包含指向该对象的唯一字符串 handle。该 handle 对于每次
序列化都是唯一的。远端会让具有对应 handle 的对象
保持存活,直到以该 handle 调用 script.disown,
或 realm 本身将被丢弃(例如由于导航)。
对于某些非原始类型,value 属性包含
ECMAScript 对象中数据的表示;对于容器类型,这
可以包含更多 script.RemoteValue 实例。
如果存在重复对象,即该对象已经在当前
script.RemoteValue 中被序列化过(也许作为循环的一部分),
或者在达到最大序列化深度时,value 属性可以为 null 或被省略。
在同一 script.RemoteValue 中存在重复对象的情况下,
只为其中一个 remote value 提供 value,而
对于给定序列化中的所有重复对象,都会提供按 ECMAScript 对象唯一的
internalId。
Nodes
也由 script.RemoteValue
实例表示。它们在 value 属性中具有 node 的部分序列化。
注:镜像对象不会让运行时中的原始对象 保持存活。如果某个对象在运行时中被丢弃,随后尝试通过 协议访问它将导致错误。
-
如果 ownership type 等于 "
none",返回null。 -
令 handle id 为 object 的新的、唯一的字符串 handle。
-
令 handle map 为 realm 的 handle object map
-
将 handle map[handle id] 设置为 object。
-
返回 handle id 作为结果。
-
令 node 为解包装的 node。
-
如果 node 未实现
Node, 返回 null。 -
令 navigable 为 node 的 node navigable。
-
如果 navigable 为 null,返回 null。
-
返回以 session、navigable 和 node 调用获取或创建 node 引用的结果。
-
如果 serialization internal map 不包含 object,则将 serialization internal map[object] 设置为 remote value。
-
否则,运行以下步骤:
-
令 previously serialized remote value 为 serialization internal map[object]。
-
如果 previously serialized remote value 没有
internalId字段,则运行以下步骤:-
令 internal id 为基于真正随机或伪随机数字的 UUID 的字符串表示。
-
将 previously serialized remote value 的
internalId字段设置为 internal id。
-
-
将 remote value 的
internalId字段设置为 previously serialized remote value 中的internalId字段。
-
要在给定 value、serialization options、 一个 ownership type、一个 serialization internal map、一个 realm 和一个 session 时序列化为 remote value:
-
令 remote value 为给定 value 调用序列化 primitive protocol value 的结果。
-
如果 remote value 不是 undefined,返回 remote value。
-
令 handle id 为以 realm、 ownership type 和 value 调用对象的 handle所得的结果。
-
将 ownership type 设置为 "
none"。 -
如果 value 在 serialization internal map 中,则令 known object 为
true, 否则为false。 -
在以下条件及其关联步骤列表中,运行第一个关联条件为 true 的步骤集:
- Type(value) is Symbol
- 令 remote value 为一个映射,
其匹配
本地端定义中的script.SymbolRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 - IsArray(value)
- 令 remote value 为以
session、
script.ArrayRemoteValue、handle id、known object、 value、 serialization options、ownership type、serialization internal map、 realm 和 session 调用序列化 Array-like所得的结果。 - IsRegExp(value)
- value 具有 [[DateValue]] 内部槽。
-
-
将 serialized 设置为 Call(Date.prototype.toISOString, value)。
-
断言:serialized 不是throw completion。
-
令 remote value 为一个映射,其匹配
本地端定义中的script.DateRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略,并将 value 设置为 serialized。
-
- value 具有 [[MapData]] 内部槽
-
-
令 remote value 为一个映射,其匹配
本地端定义中的script.MapRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 -
以 serialization internal map、 remote value 和 value 调用必要时设置 internal ids。
-
令 serialized 为 null。
-
如果 known object 为
false,且 serialization options["maxObjectDepth"] 不为 0,则运行以下 步骤:-
令 serialized 为以 CreateMapIterator(value, key+value)、serialization options、 ownership type、serialization internal map、 realm 和 session 调用序列化为 mapping的结果。
-
-
如果 serialized 不为 null,则将 remote value 的字段
value设置为 serialized。
-
- value 具有 [[SetData]] 内部槽
-
-
令 remote value 为一个映射,其匹配
本地端定义中的script.SetRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 -
以 serialization internal map、 remote value 和 value 调用必要时设置 internal ids。
-
令 serialized 为 null。
-
如果 known object 为
false,且 serialization options["maxObjectDepth"] 不为 0,则运行以下 步骤:-
令 serialized 为以 CreateSetIterator(value, value)、serialization options、 ownership type、serialization internal map、 realm 和 session 调用序列化为 list的结果。
-
-
如果 serialized 不为 null,则将 remote value 的字段
value设置为 serialized。
-
- value 具有 [[WeakMapData]] 内部槽
- 令 remote value 为一个映射,
其匹配
本地端定义中的script.WeakMapRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 - value 具有 [[WeakSetData]] 内部槽
- 令 remote value 为一个映射,
其匹配
本地端定义中的script.WeakSetRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 - value 具有 [[GeneratorState]] 内部槽或 [[AsyncGeneratorState]] 内部槽
- 令 remote value 为一个映射,
其匹配
本地端定义中的script.GeneratorRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 - value 具有 [[ErrorData]] 内部槽
- 令 remote value 为一个映射,
其匹配
本地端定义中的script.ErrorRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 - value 具有 [[ProxyHandler]] 内部槽和 [[ProxyTarget]] 内部槽
- 令 remote value 为一个映射,
其匹配
本地端定义中的script.ProxyRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 - IsPromise(value)
- 令 remote value 为一个映射,
其匹配
本地端定义中的script.PromiseRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 - value 具有 [[TypedArrayName]] 内部槽
- 令 remote value 为一个映射,
其匹配
本地端定义中的script.TypedArrayRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 - value 具有 [[ArrayBufferData]] 内部槽
- 令 remote value 为一个映射,
其匹配
本地端定义中的script.ArrayBufferRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 - value 是实现了
NodeList的平台对象 - 令 remote value 为以
script.NodeListRemoteValue、handle id、known object、 value、 serialization options、ownership type、serialization internal map、 realm 和 session 调用序列化 Array-like所得的结果。 - value 是实现了
HTMLCollection的平台对象 - 令 remote value 为以
script.HTMLCollectionRemoteValue、handle id、known object、value、 serialization options、ownership type、known object、 serialization internal map、 realm 和 session 调用序列化 Array-like所得的结果。 - value 是实现了
Node的平台对象 -
-
令 shared id 为以 value 和 session 调用获取 node 的 shared id所得的结果。
-
令 remote value 为一个映射,其匹配
本地端定义中的script.NodeRemoteValue产生式,并将sharedId属性设置为 shared id(如果它不为 null),否则省略,并将handle属性设置为 handle id(如果它不为 null),否则省略。 -
以 serialization internal map、 remote value 和 value 调用必要时设置 internal ids。
-
令 serialized 为 null。
-
如果 known object 为
false,则运行以下步骤:-
令 serialized 为一个映射。
-
将 serialized["
nodeType"] 设置为 Get(value, "nodeType")。 -
将 node value 设置为 Get(value, "nodeValue")。
-
如果 node value 不为 null,则将 serialized["
nodeValue"] 设置为 node value。 -
将 serialized["
childNodeCount"] 设置为 child node count。 -
如果 serialization options["
maxDomDepth"] 等于 0,或者如果 value 实现了ShadowRoot且 serialization options["includeShadowTree"] 为 "none", 或者如果 serialization options["includeShadowTree"] 为 "open" 且 value 的mode 为 "closed",则令 children 为 null。否则,令 children 为空 列表,并且对于 value 的子节点中的每个 node child:
-
令 child serialization options 为 serialization options 的克隆。
-
如果 child serialization options["
maxDomDepth"] 不为 null,则将 child serialization options["maxDomDepth"] 设置为 child serialization options["maxDomDepth"] - 1。 -
令 serialized 为以 child、child serialization options、 ownership type、 serialization internal map、realm 和 session 调用序列化为 remote value的结果。
-
将 serialized 追加到 children。
-
-
如果 children 不为 null,则将 serialized["
children"] 设置为 children。 -
如果 value 实现了
Element:-
令 attributes 为一个新的映射。
-
对于 value 的attribute list中的每个 attribute:
-
将 serialized["
attributes"] 设置为 attributes。 -
令 shadow root 为 value 的shadow root。
-
如果 shadow root 为 null,则令 serialized shadow 为 null。 否则运行以下子步骤:
-
令 serialized shadow 为以 shadow root、 serialization options、ownership type、serialization internal map、 realm 和 session 调用 序列化为 remote value的结果。
-
-
将 serialized["
shadowRoot"] 设置为 serialized shadow。
-
-
如果 value 实现了
ShadowRoot, 则将 serialized["mode"] 设置为 value 的mode。
-
-
如果 serialized 不为 null,则将 remote value 的字段
value设置为 serialized。
-
- value 是实现了
WindowProxy的平台对象 -
-
令 window 为 value 的 [[WindowProxy]] 内部 槽的值。
-
令 navigable 为 window 的navigable。
-
令 navigable id 为 navigable 的navigable id。
-
令 serialized 为一个映射,其匹配
本地端定义中的script.WindowProxyProperties产生式, 并将context属性设置为 navigable id。 -
令 remote value 为一个映射,其匹配
本地端定义中的script.WindowProxyRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略,并将value属性设置为 serialized。
-
- value 是平台对象
- 1. 令 remote value 为一个映射,
其匹配
本地端定义中的script.ObjectRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 - IsCallable(value)
- 令 remote value 为一个映射,
其匹配
本地端定义中的script.FunctionRemoteValue产生式,并将handle属性设置为 handle id(如果它不为 null),否则省略。 - 否则:
-
-
令 remote value 为一个映射,其匹配
本地端定义中的script.ObjectRemoteValue产生式, 并将handle属性设置为 handle id(如果它不为 null),否则省略。 -
以 serialization internal map、 remote value 和 value 调用必要时设置 internal ids。
-
令 serialized 为 null。
-
如果 known object 为
false,且 serialization options["maxObjectDepth"] 不为 0,则运行以下 步骤:-
令 serialized 为以 EnumerableOwnPropertyNames(value, key+value)、serialization options、 ownership type、serialization internal map、 realm 和 session 调用序列化为 mapping的结果。
-
-
如果 serialized 不为 null,则将 remote value 的字段
value设置为 serialized。
-
返回 remote value
children
和 child nodes 是不同的东西。要么 childNodeCount 应该
引用 childNodes,要么它应该重命名为 childrenCount。
-
令 remote value 为一个映射, 其匹配 production,并将
handle属性设置为 handle id(如果它不为 null),否则省略。 -
以 serialization internal map、 remote value 和 value 调用必要时设置 internal ids。
-
如果 known object 为
false,且 serialization options["maxObjectDepth"] 不为 0:-
令 serialized 为以 CreateArrayIterator(value, value)、serialization options、ownership type、 serialization internal map、realm 和 session 调用序列化为 list的结果。
-
如果 serialized 不为 null,则将 remote value 的字段
value设置为 serialized。
-
-
返回 remote value
-
如果 serialization options["
maxObjectDepth"] 不为 null, 断言:serialization options["maxObjectDepth"] 大于 0。 -
令 serialized 为一个新列表。
-
对于 IteratorToList(GetIterator(iterable, sync)) 中的每个 child value:
-
令 child serialization options 为 serialization options 的克隆。
-
如果 child serialization options["
maxObjectDepth"] 不为 null,则将 child serialization options["maxObjectDepth"] 设置为 child serialization options["maxObjectDepth"] - 1。 -
令 serialized child 为以 child value、child serialization options、ownership type、 serialization internal map、realm 和 session 调用序列化为 remote value的结果。
-
将 serialized child 追加到 serialized。
-
-
返回 serialized
要在给定 iterable、serialization options、 ownership type、serialization internal map、realm 和 session 时序列化为 mapping:
-
如果 serialization options["
maxObjectDepth"] 不为 null, 断言:serialization options["maxObjectDepth"] 大于 0。 -
令 serialized 为一个新列表。
-
对于 IteratorToList(GetIterator(iterable, sync)) 中的 item:
-
断言:IsArray(item)
-
令 property 为 CreateListFromArrayLike(item)
-
断言:property 是一个大小为 2 的列表
-
令 key 为 property[0],令 value 为 property[1]
-
令 child serialization options 为 serialization options 的克隆。
-
如果 child serialization options["
maxObjectDepth"] 不为 null,则将 child serialization options["maxObjectDepth"] 设置为 child serialization options["maxObjectDepth"] - 1。 -
如果 Type(key) is String,则令 serialized key 为 child key, 否则令 serialized key 为以 child key、child serialization options、ownership type、 serialization internal map、realm 和 session 调用序列化为 remote value的结果。
-
令 serialized value 为以 value、child serialization options、ownership type、 serialization internal map、realm 和 session 调用序列化为 remote value的结果。
-
令 serialized child 为(«serialized key, serialized value»)。
-
将 serialized child 追加到 serialized。
-
-
返回 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 类型表示对 DOM Node
的引用,
该引用可在任何 realm 中使用(包括 Sandbox Realms)。
7.6.3.18. script.StackFrame 类型
script.StackFrame= {columnNumber: js-uint,functionName: text,lineNumber: js-uint,url: text, }
栈跟踪中的一个帧由 StackFrame
对象表示。它具有一个 url 属性,表示
脚本的 URL;一个 functionName 属性,表示
正在执行的函数的名称;以及 lineNumber 和 columnNumber
属性,表示已执行代码的行号和列号。
7.6.3.19. script.StackTrace 类型
script.StackTrace= {callFrames: [*script.StackFrame], }
script.StackTrace 类型表示脚本执行中某一点的 javascript
栈。
注:如何获取 stack frames 列表及 该列表的属性的细节未充分规定,因此这里的细节由实现定义。
假定实现能够生成一个stack frames 列表,该列表对于 javascript 调用栈中的每一项都有一个条目,从最近的一项开始。每个条目都是一个单独的stack frame,对应于脚本 script 中某条语句或表达式的执行,并包含以下字段:
- script url
- 包含 script 的资源的 url
- function
- 正在执行的函数的名称
- line number
- 已执行代码的从零开始的行号,相对于包含 script 的资源顶部。
- column number
- 已执行代码的从零开始的列号,相对于包含 script 的资源中该行的起始位置。
要使用 stack frames 列表 stack构造 stack trace:
-
令 call frames 为一个新列表。
-
对于 stack 中的每个 stack frame frame, 从最近执行的 frame 开始,运行以下步骤:
-
令 url 为在给定 frame 的 script url 的 URL 时运行 URL 序列化器的结果。
-
令 frame info 为一个新的映射,其匹配
script.StackFrame产生式,并将url字段设置为 url,将functionName字段设置为 frame 的 function, 将lineNumber字段设置为 frame 的 line number, 并将columnNumber字段设置为 frame 的 column number。
-
-
将 frame info 追加到 call frames。
-
令 stack trace 为一个新的映射, 其匹配
script.StackTrace产生式,并将callFrames属性设置为 call frames。 -
返回 stack trace。
当前 stack trace 是在给定一个stack frames 列表(表示正在运行的 执行上下文的 callstack)时调用构造 stack trace所得的结果。
带有一个 exception 或一个类型为
throw 的 Completion Record exception
的exception
的 stack
trace,由以下给出:
-
如果 exception 是一个已作为 exception 抛出的值,则令 record 为为抛出 exception 而创建的 Completion Record。否则令 record 为 exception。
-
令 stack 为对应于 record 被创建时的执行点的stack frames 列表。
-
返回给定 stack 调用构造 stack trace所得的结果。
7.6.3.20. script.Source 类型
script.Source= {realm: script.Realm, ?context: browsingContext.BrowsingContext, ?userContext: browser.UserContext }
script.Source 类型表示一个 script.Realm,
以及可选的 browsingContext.BrowsingContext 和相关的
browser.UserContext,在其中发生了与 script 相关的事件。
-
令 realm 为 source realm 的 realm id。
-
令 environment settings 为其 realm execution context 的 Realm component 是 source realm 的environment settings object。
-
如果 environment settings 具有一个关联的
Document:-
令 document 为 environment settings 的关联的
Document。 -
令 navigable 为 document 的 node navigable。
-
如果 navigable 不为 null,则令 navigable id 为 navigable 的 navigable id。
-
令 user context id 为 navigable 的 associated user context 的 user context id。
否则令 navigable 为 null。
-
-
令 source 为一个映射, 其匹配
script.Source产生式,并将realm字段设置为 realm,如果 navigable 不为 null,则将context字段设置 为 navigable id,否则不设置, 并且如果 |navigable 不为 null,则将userContext字段设置为 user context id, 否则不设置。 -
返回 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 的 active document
关联的 realm 的情况下很有用。
-
令 navigable 为尝试以 navigable id 调用获取 navigable所得的结果。
-
如果 sandbox 为 null 或为空字符串:
-
令 document 为 navigable 的 active document。
-
令 environment settings 为其 relevant global object 的关联的
Document是 document 的environment settings object。 -
令 realm 为 environment settings 的 realm execution context 的 Realm component。
-
-
否则:令 realm 为尝试给定 sandbox 和 navigable 调用 获取或创建 sandbox realm所得的结果。
-
返回带有数据 realm 的成功
-
如果 target 匹配
script.ContextTarget产生式:-
令 sandbox 为 null。
-
如果 target 包含 "
sandbox",则将 sandbox 设置为 target["sandbox"]。 -
令 realm 为以 target["
context"] 和 sandbox 调用从 navigable 获取 realm所得的结果。
-
-
否则:
-
断言:target 匹配
script.RealmTarget产生式。 -
令 realm id 为 target 的
realm字段的值。 -
令 realm 为给定 realm id 调用获取 realm所得的结果。
-
-
返回带有数据 realm 的成功
7.6.4. 命令
7.6.4.1. script.addPreloadScript 命令
script.addPreloadScript 命令会添加一个preload script。
- 命令类型
-
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 }
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "contexts", 则返回带有错误 代码 invalid argument 的错误。 -
令 function declaration 为 command parameters 的
functionDeclaration字段。 -
如果存在,则令 arguments 为 command parameters 的
arguments字段;否则为空列表。 -
令 user contexts 为一个集合。
-
令 navigables 为 null。
-
如果 command parameters 的
contexts字段存在:-
将 navigables 设置为空集合。
-
对于 command parameters["
contexts"] 中的每个 navigable id-
令 navigable 为尝试以 navigable id 调用获取 navigable 所得的结果。
-
如果 navigable 不是顶级 traversable,则返回带有错误代码 invalid argument 的错误。
-
将 navigable 追加到 navigables。
-
-
-
否则,如果 command parameters 包含
userContexts:-
将 user contexts 设置为以 command parameters["
userContexts"] 调用创建 集合所得的结果。 -
对于 user contexts 中的每个 user context id:
-
将 user context 设置为以 user context id 调用获取 user context所得的结果。
-
如果 user context 为 null,则返回带有错误代码 no such user context 的错误。
-
-
-
如果存在,则令 sandbox 为 command parameters 中 "
sandbox" 字段的值;否则为 null。 -
令 script 为 UUID 的字符串表示。
-
令 preload script map 为 session 的 preload script map。
-
将 preload script map[script] 设置为一个结构体,其
function declaration为 function declaration,arguments为 arguments,contexts为 navigables,sandbox为 sandbox,并且user contexts为 user contexts。 -
返回一个新的映射,其匹配
script.AddPreloadScriptResult, 并将script字段设置为 script。
7.6.4.2. script.disown 命令
script.disown 命令会 disown 给定的 handles。 这并不保证被 handle 的对象会被垃圾回收,因为可能存在 其他 handles 或强 ECMAScript 引用。
- 命令类型
-
script.Disown= (method:"script.disown",params: script.DisownParameters )script.DisownParameters= {handles: [*script.Handle]target: script.Target; } - 返回类型
-
script.DisownResult= EmptyResult
-
令 realm 为尝试给定 command parameters 的
target字段的值调用从 target 获取 realm所得的结果。 -
令 handles 为 command parameters 的
handles字段的值。 -
对于 handles 中的每个 handle id:
-
令 handle map 为 realm 的 handle object map
-
如果 handle map 包含 handle id,则从 handle map 中移除 handle id。
-
-
返回带有数据 null 的成功。
7.6.4.3. script.callFunction 命令
script.callFunction 命令会在给定 realm 中用给定参数调用 所提供的函数。
RealmInfo 可以是一个 realm 或 navigable。
注:当 functionDeclaration 中是箭头函数时,
this 参数不会影响函数的 this 绑定。
- 命令类型
-
script.CallFunction= (method:"script.callFunction",params: script.CallFunctionParameters )script.CallFunctionParameters= {functionDeclaration: text,awaitPromise: bool,target: script.Target, ?arguments: [*script.LocalValue], ?resultOwnership: script.ResultOwnership, ?serializationOptions: script.SerializationOptions, ?this: script.LocalValue, ?userActivation: bool .default false, } - 返回类型
-
script.CallFunctionResult= script.EvaluateResult
TODO:添加 timeout 参数, 如 script.evaluate 中所述。
要在给定 realm、serialized arguments list 和 session 的情况下反序列化 arguments:
-
令 deserialized arguments list 为空列表。
-
对于 serialized arguments list 的每个 serialized argument:
-
令 deserialized argument 为尝试给定 serialized argument、realm 和 session 调用 反序列化 local value 所得的结果。
-
将 deserialized argument 追加到 deserialized arguments list。
-
-
返回带有数据 deserialized arguments list 的成功。
注:function declaration 会被 加括号并求值。
-
令 bypassDisabledScripting 为 true。
-
令 parenthesized function declaration 为拼接 «"
(", function declaration, ")"» 所得的结果 -
令 function script 为以 parenthesized function declaration、environment settings、base URL、 options 和 bypassDisabledScripting 调用创建 classic script所得的结果。
-
以 environment settings 调用准备运行 script。
-
令 function body evaluation status 为 ScriptEvaluation(function script 的 record)。
-
以 environment settings 调用运行 script 后清理。
-
返回 function body evaluation status。
带有 session 和 command parameters 的远端步骤为:
-
令 realm 为尝试给定 command parameters 的
target字段的值调用从 target 获取 realm所得的结果。 -
令 realm id 为 realm 的 realm id。
-
令 environment settings 为其 realm execution context 的 Realm component 是 realm 的environment settings object。
-
令 command arguments 为 command parameters 的
arguments字段的值。 -
令 deserialized arguments 为空列表。
-
如果 command arguments 不为 null,则将 deserialized arguments 设置为 尝试给定 realm、 command arguments 和 session 调用 反序列化 arguments所得的结果。
-
令 this parameter 为 command parameters 的
this字段的值。 -
令 this object 为 null。
-
如果 this parameter 不为 null,则将 this object 设置为尝试给定 this parameter、realm 和 session 调用 反序列化 local value所得的结果。
-
令 function declaration 为 command parameters 的
functionDeclaration字段的值。 -
令 await promise 为 command parameters 的
awaitPromise字段的值。 -
如果存在,则令 serialization options 为 command parameters 的
serializationOptions字段的值, 否则为一个匹配script.SerializationOptions产生式且字段被设置为其默认值的映射。 -
如果存在,则令 result ownership 为 command parameters 的
resultOwnership字段的值,否则为none。 -
令 base URL 为 environment settings 的 API base URL。
-
令 options 为默认 script fetch options。
-
令 function body evaluation status 为以 function declaration、 environment settings、base URL 和 options 调用求值 function body所得的结果。
-
如果 function body evaluation status.[[Type]] 为
throw:-
令 exception details 为给定 realm、function body evaluation status、result ownership 和 session 调用获取 exception details所得的结果。
-
返回一个新的映射,其匹配
script.EvaluateResultException产生式,并将exceptionDetails字段设置为 exception details。
-
-
令 function object 为 function body evaluation status.[[Value]]。
-
如果 IsCallable(function object) 为
false:-
返回一个带有错误代码 invalid argument 的错误
-
-
如果 command parameters["
userActivation"] 为 true,则运行activation notification 步骤。 -
以 environment settings 调用准备运行 script。
-
将 evaluation status 设置为 Call(function object, this object, deserialized arguments)。
-
如果 evaluation status.[[Type]] 为
normal,且 await promise 为true,且 IsPromise(evaluation status.[[Value]]):-
将 evaluation status 设置为 Await(evaluation status.[[Value]])。
-
-
以 environment settings 调用运行 script 后清理。
-
如果 evaluation status.[[Type]] 为
throw:-
令 exception details 为给定 realm、evaluation status、result ownership 和 session 调用获取 exception details所得的结果。
-
返回一个新的映射,其匹配
script.EvaluateResultException产生式,并将exceptionDetails字段设置为 exception details。
-
-
断言:evaluation status.[[Type]] 为
normal。 -
令 result 为以 evaluation status.[[Value]]、serialization options、result ownership、 一个新的映射作为 serialization internal map、realm 和 session 调用序列化为 remote value所得的结果。
-
返回一个新的映射,其匹配
script.EvaluateResultSuccess产生式,并将realm字段设置为 realm id, 且将result字段设置为 result。
7.6.4.4. script.evaluate 命令
script.evaluate 命令会在给定 realm 中求值所提供的 script。为方便起见,可以提供一个 navigable 来代替 realm;在这种情况下, 所使用的 realm 是该 browsing context 的 active document 的 realm。
该方法返回执行所提供 script 的值,除非它返回一个
promise 且 awaitPromise 为 true,在这种情况下会返回该
promise 的已解决值。
- 命令类型
-
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 步骤,但 这可能并不是客户端想要的行为。
给定 session 和 command parameters 时,远端步骤为:
-
令 realm 为尝试给定 command parameters 的
target字段的值调用从 target 获取 realm 所得的结果。 -
令 realm id 为 realm 的 realm id。
-
令 environment settings 为其 realm execution context 的 Realm component 是 realm 的environment settings object。
-
令 source 为 command parameters 的
expression字段的值。 -
令 await promise 为 command parameters 的
awaitPromise字段的值。 -
如果存在,则令 serialization options 为 command parameters 的
serializationOptions字段的值, 否则为一个映射,其匹配script.SerializationOptions产生式,并且字段被设置为其默认值。 -
如果存在,则令 result ownership 为 command parameters 的
resultOwnership字段的值,否则为none。 -
令 options 为默认 script fetch options。
-
令 base URL 为 environment settings 的 API base URL。
-
令 bypassDisabledScripting 为 true。
-
令 script 为以 source、 environment settings、base URL、options 和 bypassDisabledScripting 调用创建 classic script所得的结果。
-
如果 command parameters["
userActivation"] 为 true,则运行 activation notification 步骤。 -
以 environment settings 调用准备运行 script。
-
将 evaluation status 设置为 ScriptEvaluation(script 的 record)。
-
如果 evaluation status.[[Type]] 为
normal、await promise 为 true,且 IsPromise(evaluation status.[[Value]]):-
将 evaluation status 设置为 Await(evaluation status.[[Value]])。
-
-
以 environment settings 调用运行 script 后清理。
-
如果 evaluation status.[[Type]] 为
throw:-
令 exception details 为以 realm、evaluation status、result ownership 和 session 调用获取 exception details所得的结果。
-
返回一个新的映射,其匹配
script.EvaluateResultException产生式,并将realm字段设置为 realm id,且将exceptionDetails字段设置为 exception details。
-
-
断言:evaluation status.[[Type]] 为
normal。 -
令 result 为以 evaluation status.[[Value]]、serialization options、result ownership、 一个新的映射作为 serialization internal map、realm 和 session 调用序列化为 remote value所得的结果。
-
返回一个新的映射,其匹配
script.EvaluateResultSuccess产生式,并将realm字段设置为 realm id,且 将result字段设置为 result。
7.6.4.5. script.getRealms 命令
script.getRealms 命令会返回所有 realms 的列表,可选地筛选为特定类型的realms,或筛选为与某个 navigable 的 active document 关联的 realm。
- 命令类型
-
script.GetRealms= (method:"script.getRealms",params: script.GetRealmsParameters )script.GetRealmsParameters= { ?context: browsingContext.BrowsingContext, ?type: script.RealmType, } - 返回类型
-
script.GetRealmsResult= {realms: [*script.RealmInfo] }
-
令 environment settings 为所有其 execution ready flag 已设置的 environment settings objects 的列表。
-
如果 command parameters 包含
context:-
令 navigable 为尝试以 command parameters["
context"] 调用 获取 navigable 所得的结果。 -
令 document 为 navigable 的 active document。
-
令 navigable environment settings 为一个列表。
-
对于 environment settings 中的每个 settings:
-
如果满足以下任一条件:
-
settings 的 relevant global object 的 关联的
Document是 document -
由 settings 指定的 global object 是一个
WorkerGlobalScope, 且其 owner set 中含有 document
将 settings 追加到 navigable environment settings。
-
-
-
将 environment settings 设置为 navigable environment settings。
-
-
令 realms 为一个列表。
-
对于 environment settings 中的每个 settings:
-
令 realm info 为给定 settings 调用获取 realm info 所得的结果。
-
如果 command parameters 包含
type,且 realm info["type"] 不等于 command parameters["type"],则继续。 -
如果 realm info 不为 null,则将 realm info 追加到 realms。
-
-
令 body 为一个映射, 其匹配
script.GetRealmsResult产生式, 并将realms字段设置为 realms。 -
返回带有数据 body 的成功。
7.6.4.6. script.removePreloadScript 命令
script.removePreloadScript 命令会移除一个 preload script。
- 命令类型
-
script.RemovePreloadScript= (method:"script.removePreloadScript",params: script.RemovePreloadScriptParameters )script.RemovePreloadScriptParameters= {script: script.PreloadScript } - 返回类型
-
script.RemovePreloadScriptResult= EmptyResult
-
令 script 为 command parameters 中 "
script" 字段的值。 -
令 preload script map 为 session 的 preload script map。
-
如果 preload script map 不包含 script,则返回带有错误 代码 no such script 的错误。
-
从 preload script map 中移除 script。
-
返回 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, }
-
令 environment settings 为其 realm execution context 的 Realm component 是 realm 的environment settings object。
-
令 related navigables 为给定 environment settings 调用获取相关 navigables所得的结果。
-
如果给定 session、"
script.message" 和 related navigables 时事件已启用:-
如果 channel properties 包含 "
serializationOptions",则令 serialization options 为 channel properties 的serializationOptions字段的值。 否则令 serialization options 为一个映射, 其匹配script.SerializationOptions产生式,并且 字段被设置为其默认值。 -
如果 channel properties 包含 "
ownership",则令 ownership type 为 channel properties["ownership"]。 否则令 ownership type 为 "none"。 -
令 data 为给定 message、serialization options、ownership type、一个新的 映射作为 serialization internal map 和 realm 调用序列化为 remote value所得的结果。
-
令 source 为以 realm 调用获取 source所得的结果。
-
令 params 为一个映射,其匹配
script.MessageParameters产生式,并将channel字段设置为 channel properties["channel"], 将data字段设置为 data,并将source字段设置为 source。 -
令 body 为一个映射,其匹配
script.Message产生式,并将params字段设置为 params。 -
以 session 和 body 发出 事件。
-
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 之前立即执行:
-
令 environment settings 为新创建的environment settings object。
-
令 realm info 为给定 environment settings 调用获取 realm info所得的结果。
-
如果 realm info 为 null,则返回。
-
令 related navigables 为给定 environment settings 调用获取相关 navigables所得的结果。
-
令 body 为一个映射, 其匹配
script.RealmCreated产生式,并将params字段设置为 realm info。 -
对于给定 "
script.realmCreated" 和 related navigables 时,启用了事件的 session 集合中的每个 session:-
以 session 和 body 发出 事件。
-
给定 session、navigables 和 include global 时,带有订阅优先级 2 的远端订阅步骤为:
-
令 environment settings 为所有其 execution ready flag 已设置的 environment settings objects的列表。
-
对于 environment settings 中的每个 settings:
-
令 related navigables 为一个新的集合。
-
如果 settings 的 relevant global object 的 关联的
Document是一个Document:-
令 navigable 为 settings 的relevant global object 的 关联的
Document的 node navigable。 -
如果 navigable 为 null,则继续。
-
令 top-level traversible 为 navigable 的 顶级 traversable。
-
如果 top-level traversible 不在 navigables 中,则继续。
-
将 top-level traversible 追加到 related navigables。
否则,如果 include global 为 false,则继续。
-
-
令 realm info 为给定 settings 调用获取 realm info 所得的结果。
-
如果 realm info 为 null,则继续。
-
令 body 为一个映射,其匹配
script.RealmCreated产生式,并将params字段设置为 realm info。 -
如果给定 session、 "
script.realmCreated" 和 related navigables 时事件 已启用:-
以 session 和 body 发出 事件。
-
-
7.6.5.3. script.realmDestroyed 事件
- 事件类型
-
script.RealmDestroyed= (method:"script.realmDestroyed",params: script.RealmDestroyedParameters )script.RealmDestroyedParameters= {realm: script.Realm }
-
令 related navigables 为空集合。
-
将 document 的 navigable 追加到 related navigables。
-
对于 document 的 worklet global scopes 中的每个 worklet global scope:
-
令 realm 为 worklet global scope 的 relevant Realm。
-
令 realm id 为 realm 的 realm id。
-
令 params 为一个映射,其匹配
script.RealmDestroyedParameters产生式,并将realm字段设置为 realm id。 -
令 body 为一个映射,其匹配
script.RealmDestroyed产生式,并将params字段设置为 params。 -
对于给定 "
script.realmDestroyed" 和 related navigables 时,启用了事件的 session 集合中的每个 session:-
以 session 和 body 发出 事件。
-
-
-
令 environment settings 为其 relevant global object 的关联的
Document是 document 的environment settings object。 -
令 realm 为 environment settings 的 realm execution context 的 Realm component。
-
令 realm id 为 realm 的 realm id。
-
令 params 为一个映射, 其匹配
script.RealmDestroyedParameters产生式,并将realm字段设置为 realm id。 -
令 body 为一个映射, 其匹配
script.RealmDestroyed产生式,并将params字段设置为 params。 -
对于给定 "
script.realmDestroyed" 和 related navigables 时,启用了事件的 session 集合中的每个 session:-
以 session 和 body 发出 事件。
-
每当一个 worker event loop event loop 被销毁时,不论是因为 worker 到达其生命周期末尾,还是通过 终止 worker 算法提前销毁:
-
令 environment settings 为其 event loop 是responsible event loop 的environment settings object。
-
令 related navigables 为给定 environment settings 调用获取相关 navigables所得的结果。
-
令 realm 为 environment settings 的environment settings object 的 Realm。
-
令 realm id 为 realm 的 realm id。
-
令 params 为一个映射, 其匹配
script.RealmDestroyedParameters产生式,并将realm字段设置为 realm id。 -
令 body 为一个映射, 其匹配
script.RealmDestroyed产生式,并将params字段设置为 params。
7.7. storage 模块
storage 模块包含与存储相关的功能和 事件。
storage partition 是一个命名空间,用户代理可在其中组织诸如 cookies 和 local storage 之类的持久化数据。
storage partition key 是一个映射,它唯一标识一个 storage 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 属性表 枚举了具有公认含义、remote end 可以选择支持的属性。实现可以定义额外的扩展 storage partition key 属性。
| 属性 | 定义 |
|---|---|
"userContext"
| 一个 user context id |
"sourceOrigin"
| 可以访问该 storage partition 的资源的 origin 的序列化 |
Remote ends 可以支持任意数量的扩展 storage partition key 属性。为了避免与其他实现冲突,这些 属性必须以供应商和用户代理的唯一标识符开头, 后跟 U+003A (:)。
remote end 具有一个映射,即storage partition key 属性的默认值,其中包含零个或多个条目。每个键必须是 标准 storage partition key 属性表中的成员(当该 storage partition key 对应于标准 storage partition 时),或是一个 扩展 storage partition key 属性 (当它不对应标准 storage partition 时);其值 表示当用户没有提供显式值时要使用的该 partition key 的默认值。 精确的条目是实现定义的,并由实现采用的 storage partitioning 决定。
remote end 具有一个列表,即必需 partition key 属性,其中包含零个或多个条目。每个键必须是 标准 storage partition key 属性表中的成员(当该 storage partition key 对应于标准 storage partition 时),或是一个 扩展 storage partition key 属性 (当它不对应标准 storage partition 时)。精确的 条目是实现定义的,并由实现采用的 storage partitioning 决定。该列表只包含没有可用默认值的 partition keys。因此,该列表不得与storage partition key 属性的默认值的键共享任何条目。
-
令 deserialized filter 为空映射。
-
对于 filter 中的每个 name → value:
-
令 deserialized name 为 cookie conversion 表中与 JSON 键 name 对应的字段名称。
-
如果 name 是 "
value",则将 deserialized value 设置为以 value 调用反序列化 protocol bytes所得的结果, 否则令 deserialized value 为 value。 -
将 deserialized filter[deserialized name] 设置为 deserialized value。
-
-
返回 deserialized filter。
-
如果 partition spec 为 null:
-
将 partition spec 设置为空映射。
-
-
否则,如果 partition spec["
type"] 是 "context":-
令 navigable 为尝试给定 partition spec["
context"] 调用获取 navigable所得的结果。 -
令 partition key 为 navigable 的关联的 storage partition 的key。
-
返回带有数据 partition key 的成功。
-
-
令 partition key 为空映射。
-
对于storage partition key 属性的默认值中的每个 name → default value:
-
对于 remote end 的必需 partition key 属性中的每个 name:
-
返回带有数据 partition key 的成功。
-
如果 storage partition key 唯一标识一个现存的 storage partition:
-
令 store 为该 storage partition 的 cookie store。
-
返回带有数据 store 的成功。
-
-
返回带有错误 代码 no such storage partition 的错误。
-
对于 filter 中的每个 name → value:
-
如果 stored cookie[name] 不等于 value:
-
返回 false。
-
-
-
返回 true。
-
令 cookies 为一个新列表。
-
将 deserialized filter 设置为以 filter 调用反序列化 filter所得的结果。
-
对于 cookie store 中的每个 stored cookie:
-
如果以 stored cookie 和 deserialized filter 调用匹配 cookie所得的结果为 true:
-
将 stored cookie 追加到 cookies。
-
-
-
返回 cookies。
7.7.3. 命令
7.7.3.1. storage.getCookies 命令
storage.getCookies 命令会检索零个或多个 cookies, 这些 cookies 匹配一组提供的 参数。
- 命令类型
-
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, }
-
如果存在,则令 filter 为 command parameters 的
filter字段的值; 否则令其为空映射。 -
如果存在,则令 partition spec 为 command parameters 的
partition字段的值;否则为 null。 -
令 partition key 为尝试以 partition spec 调用展开 storage partition spec所得的结果。
-
令 store 为尝试以 partition key 调用获取 cookie store所得的结果。
-
令 cookies 为以 store 和 filter 调用获取匹配 cookies所得的结果。
-
令 serialized cookies 为一个新列表。
-
对于 cookies 中的每个 cookie:
-
令 serialized cookie 为给定 cookie 调用序列化 cookie所得的结果。
-
将 serialized cookie 追加到 serialized cookies。
-
-
令 body 为一个映射, 其匹配
storage.GetCookiesResult产生式, 并将cookies字段设置为 serialized cookies,将partitionKey字段设置为 partition key。 -
返回带有数据 body 的成功。
7.7.3.2. storage.setCookie 命令
storage.setCookie 命令会在 cookie store 中创建一个新的 cookie, 替换该 store 中根据 [COOKIES] 匹配的任何 cookie。
- 命令类型
-
storage.SetCookie= (method:"storage.setCookie",params: storage.SetCookieParameters, )storage.PartialCookie= {name: text,value: network.BytesValue,domain: text, ?path: text, ?httpOnly: bool, ?secure: bool, ?sameSite: network.SameSite, ?expiry: js-uint, Extensible, }storage.SetCookieParameters= {cookie: storage.PartialCookie, ?partition: storage.PartitionDescriptor, } - 返回类型
-
storage.SetCookieResult= {partitionKey: storage.PartitionKey }
-
令 cookie spec 为 command parameters 的
cookie字段的值。 -
如果存在,则令 partition spec 为 command parameters 的
partition字段的值;否则为 null。 -
令 partition key 为尝试以 partition spec 调用展开 storage partition spec所得的结果。
-
令 store 为尝试以 partition key 调用获取 cookie store所得的结果。
-
令 deserialized value 为以 cookie spec["
value"] 调用反序列化 protocol bytes所得的结果。 -
使用 cookie name cookie spec["
name"]、 cookie value deserialized value、cookie domain cookie spec["domain"],以及下列在 cookie conversion 表中列出的 cookie 概念的属性-值列表,在 store 中创建 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 值 可能会由 remote end 按照 Cookie Lifetime Limits 进行限制。
- Cookie same site
-
如果 cookie spec["
sameSite"] 存在,则为它;否则保持未设置以 表示未定义 same site 策略。
如果此步骤在未向 cookie store 插入 cookie 的情况下中止,则返回带有错误 代码 unable to set cookie 的错误。
-
令 body 为一个映射, 其匹配
storage.SetCookieResult产生式, 并将partitionKey字段设置为 partition key。 -
返回带有数据 body 的成功。
7.7.3.3. storage.deleteCookies 命令
storage.deleteCookies 命令会移除零个或多个 cookies, 这些 cookies 匹配一组提供的 参数。
- 命令类型
-
storage.DeleteCookies= (method:"storage.deleteCookies",params: storage.DeleteCookiesParameters, )storage.DeleteCookiesParameters= { ?filter: storage.CookieFilter, ?partition: storage.PartitionDescriptor, } - 返回类型
-
storage.DeleteCookiesResult= {partitionKey: storage.PartitionKey }
-
如果存在,则令 filter 为 command parameters 的
filter字段的值;否则令其为空映射。 -
如果存在,则令 partition spec 为 command parameters 的
partition字段的值;否则为 null。 -
令 partition key 为尝试以 partition spec 调用展开 storage partition spec所得的结果。
-
令 store 为尝试以 partition key 调用获取 cookie store所得的结果。
-
令 cookies 为以 store 和 filter 调用获取匹配 cookies所得的结果。
-
对于 cookies 中的每个 cookie:
-
从 store 中移除 cookie。
-
-
令 body 为一个映射, 其匹配
storage.DeleteCookiesResult产生式, 并将partitionKey字段设置为 partition key。 -
返回带有数据 body 的成功。
7.8. log 模块
log 模块包含与日志记录相关的功能和事件。
BiDi Session 有一个 log event buffer, 它是一个从 navigable id 到该 context 中尚未被 发出的 log events 列表的映射。用户代理可以对此 buffer 施加最大大小限制, 但须满足以下条件:如果事件 A 和 B 在同一 context 中发生,且 A 发生在 B 之前,并且二者都被添加到 buffer 中,则 B 的条目不得在 A 的条目之前被移除。
要在给定 session、navigables 和 event 的情况下缓冲 log event:
-
令 buffer 为 session 的 log event buffer。
-
令 navigable ids 为一个新列表。
-
对于 navigables 中的每个 navigable:
-
将 navigable 的 navigable id 追加到 navigable ids。
-
-
对于 navigable ids 中的每个 navigable id:
-
令 other navigables 为空列表
-
对于 navigable ids 中的每个 other id:
-
如果 other id 不等于 navigable id,则将 other id 追加到 other navigables。
-
如果 buffer 不包含 navigable id,则令 buffer[navigable id] 为一个新列表。
-
将 (event, other navigables) 追加到 buffer[navigable id]。
-
注:我们在这里存储其他 navigables,是为了让 每个 event 只被发出一次。实践中,这只与能够关联到 多个 navigables 的 workers 有关。
我们是否要以 browsing context 或 top-level traversable 作为键? 二者的区别在于:如果某个 event 发生在 frame 中,且该 frame 在本地端订阅顶层 navigable 的 log events 之前发生导航,会产生什么结果。
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 对象表示。它具有
type 属性,表示所添加 log entry 的类型;具有
level 属性,表示严重性;具有 source
属性,表示 log entry 的来源;具有 text 属性,
表示日志消息字符串本身;并具有 timestamp 属性,
对应于生成该 log entry 的时间。log.Entry 的特定变体
用于表示来自不同来源的日志,并提供特定于该 entry 类型的附加字段。
7.8.3. 事件
7.8.3.1. log.entryAdded 事件
- 事件类型
-
log.EntryAdded= (method:"log.entryAdded",params: log.Entry, )
远端事件触发器为:
定义以下带有 method、args 和 options 的console 步骤:
-
对于 活动 BiDi 会话中的每个 session:
-
如果 method 是 "
error" 或 "assert",则令 level 为 "error"。如果 method 是 "debug" 或 "trace", 则令 level 为 "debug"。如果 method 是 "warn",则令 level 为 "warn"。否则令 level 为 "info"。 -
令 timestamp 为表示当前 UTC 日期和时间的 time value。
-
令 text 为空字符串。
-
如果 args[0] 的 Type 是 String,且 args[0] 包含一个 formatting specifier,则令 formatted args 为 Formatter(args)。否则 令 formatted args 为 args。
注:Formatter 操作在 console 规范中 未充分定义,不同实现之间的格式化可能不一致。
-
对于 formatted args 中的每个 arg:
-
如果 arg 不是 args 中的第一个条目,则向 text 追加一个 U+0020 SPACE。
-
如果 arg 是一个原始 ECMAScript 值,则将 ToString(arg) 追加到 text。否则将一个实现定义的字符串追加到 text。
-
-
令 realm 为当前 Realm Record 的 realm id。
-
令 serialized args 为一个新列表。
-
令 serialization options 为一个映射,其匹配
script.SerializationOptions产生式,且各字段设置为 其默认值。 -
对于 args 中的每个 arg:
-
令 serialized arg 为以 arg 作为 value、serialization options、
none作为 ownership type、一个新的映射作为 serialization internal map、 realm 和 session 调用序列化为 remote value所得的结果。 -
将 serialized arg 添加到 serialized args。
-
-
令 source 为给定当前 Realm Record 调用获取 source所得的结果。
-
令 stack 为当前 stack trace。
-
令 entry 为一个映射,其匹配
log.ConsoleLogEntry产生式, 并将level字段设置为 level,将text字段设置为 text,将timestamp字段设置为 timestamp,将stackTrace字段设置为 stack,将 method 字段设置 为 method, 将source字段设置为 source, 并将args字段设置为 serialized args。 -
令 body 为一个映射,其匹配
log.EntryAdded产生式,并将params字段设置为 entry。 -
令 settings 为当前 settings object
-
令 related navigables 为给定 settings 调用获取相关 navigables所得的结果。
-
如果以 session、"
log.entryAdded" 和 related navigables 调用event is enabled所得的结果为 true,则以 session 和 body 调用发出事件。否则,以 session、 related browsing contexts 和 body 调用缓冲 log event。
-
定义以下带有参数 script、 line number、column number、message 和 handled 的错误报告步骤:
-
如果 handled 为 true,则返回。
-
令 settings 为 script 的settings object。
-
令 timestamp 为表示当前 UTC 日期和时间的 time value。
-
令 stack 为以对应于所报告错误的 exception 调用exception 的 stack trace所得的结果。
-
令 source 为给定当前 Realm Record 调用获取 source所得的结果。
-
令 entry 为一个映射, 其匹配
log.JavascriptLogEntry产生式, 并将level设置为 "error",将text设置为 message,将source设置为 source,将timestamp设置为 timestamp,并将stackTrace字段设置为 stack。 -
令 body 为一个映射, 其匹配
log.EntryAdded产生式,并将params字段设置为 entry。 -
令 related navigables 为给定 settings 调用获取相关 navigables所得的结果。
-
对于 活动 BiDi 会话中的每个 session:
-
如果以 session、"
log.entryAdded" 和 related navigables 调用event is enabled所得的结果为 true,则以 session 和 body 调用发出事件。否则,以 session、 related browsing contexts 和 body 调用缓冲 log event。
-
还有许多东西 需要日志记录。CDP 有 LogEntryAdded 类型 xml、 javascript、network、storage、appcache、rendering、security、deprecation、 worker、violation、intervention、recommendation、other。这些是在由不同方法表示的 js exception 和 console API 类型之外的类型。
带有 订阅优先级 10,且给定 session、navigables 和 include global 时,远端订阅步骤为:
-
对于 session 的 log event buffer 中的每个 navigable id → events:
-
令 maybe context 为给定 navigable id 获取 navigable所得的结果。
-
如果 maybe context 是一个错误, 则从 log event buffer 中移除 navigable id 并继续。
-
令 navigable 为 maybe context 的 data
-
令 top level navigable 为 navigable 的 top-level traversable。
-
如果 include global 为 true 且 top level navigable 不在 navigables 中, 或者如果 include global 为 false 且 top level navigable 在 navigables 中:
-
对于 events 中的每个 (event, other navigables):
-
以 session 和 event 发出事件。
-
对于 other navigables 中的每个 other context id:
-
如果 log event buffer 包含 other 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 }
input.ElementOrigin 步骤为:
-
如果 object 是一个匹配
input.ElementOrigin产生式的映射, 则返回 true。 -
返回 false。
input.ElementOrigin
steps:
-
返回以下给定 origin 和 navigable 的步骤:
-
断言:origin 匹配
input.ElementOrigin。 -
令 document 为 navigable 的活动文档。
-
令 reference 为 origin["
element"] -
令 environment settings 为环境设置对象,其 相关全局对象的关联
Document是 document。 -
令 realm 为 environment settings 的realm execution context 的 Realm 组件。
-
令 element 为尝试以 reference、realm 和 session 调用 反序列化 remote reference所得的结果。
-
如果 element 没有实现
Element, 则返回带有错误代码 no such element 的错误。 -
返回带有数据 element 的成功。
-
7.9.3. 命令
7.9.3.1. input.performActions 命令
input.performActions 命令会执行指定的用户输入 actions 序列。
注:有关此命令行为的详细描述,请参见 actions section of [WEBDRIVER]。
- 命令类型
-
input.PerformActions= (method:"input.performActions",params: input.PerformActionsParameters )input.PerformActionsParameters= {context: browsingContext.BrowsingContext,actions: [*input.SourceActions] }input.SourceActions= ( input.NoneSourceActions / input.KeySourceActions / input.PointerSourceActions / input.WheelSourceActions )input.NoneSourceActions= {type:"none",id: text,actions: [*input.NoneSourceAction] }input.NoneSourceAction= input.PauseActioninput.KeySourceActions= {type:"key",id: text,actions: [*input.KeySourceAction] }input.KeySourceAction= ( input.PauseAction / input.KeyDownAction / input.KeyUpAction )input.PointerSourceActions= {type:"pointer",id: text, ?parameters: input.PointerParameters,actions: [*input.PointerSourceAction] }input.PointerType="mouse"/"pen"/"touch"input.PointerParameters= { ?pointerType: input.PointerType .default "mouse" }input.PointerSourceAction= ( input.PauseAction / input.PointerDownAction / input.PointerUpAction / input.PointerMoveAction )input.WheelSourceActions= {type:"wheel",id: text,actions: [*input.WheelSourceAction] }input.WheelSourceAction= ( input.PauseAction / input.WheelScrollAction )input.PauseAction= {type:"pause", ?duration: js-uint }input.KeyDownAction= {type:"keyDown",value: text }input.KeyUpAction= {type:"keyUp",value: text }input.PointerUpAction= {type:"pointerUp",button: js-uint, }input.PointerDownAction= {type:"pointerDown",button: js-uint, input.PointerCommonProperties }input.PointerMoveAction= {type:"pointerMove",x: float,y: float, ?duration: js-uint, ?origin: input.Origin, input.PointerCommonProperties }input.WheelScrollAction= {type:"scroll",x: js-int,y: js-int,deltaX: js-int,deltaY: js-int, ?duration: js-uint, ?origin: input.Origin .default "viewport", }input.PointerCommonProperties= ( ?width: js-uint, ?height: js-uint, ?pressure: (0.0..1.0), ?tangentialPressure: (-1.0..1.0), ?twist: (0..359), ; 0 .. Math.PI / 2 ?altitudeAngle: (0.0..1.5707963267948966), ; 0 .. 2 * Math.PI ?azimuthAngle: (0.0..6.283185307179586), )input.Origin="viewport"/"pointer"/ input.ElementOrigin - 返回类型
-
input.PerformActionsResult= EmptyResult
带有 session 和 command parameters 时,远端步骤为:
-
令 navigable id 为 command parameters 的
context字段的值。 -
令 navigable 为尝试以 navigable id 调用获取 navigable所得的结果。
-
令 input state 为以 session 和 navigable 的 顶级 traversable 调用获取 input state所得的结果。
-
令 actions options 为一个新的 actions options,其中 is element origin 步骤设置为 is input.ElementOrigin,且 get element origin 步骤设置为给定 session 调用get Element from input.ElementOrigin steps所得的结果。
-
令 actions by tick 为尝试以 input state、command parameters 和 actions options 提取 action sequence所得的结果。
-
尝试以 input state、 actions by tick、 navigable 和 actions options dispatch actions。
-
返回带有数据 null 的成功。
7.9.3.2. input.releaseActions 命令
input.releaseActions 命令会重置与当前 session 关联的 input state。
- 命令类型
-
input.ReleaseActions= (method:"input.releaseActions",params: input.ReleaseActionsParameters )input.ReleaseActionsParameters= {context: browsingContext.BrowsingContext, } - 返回类型
-
input.ReleaseActionsResult= EmptyResult
给定 session 和 command parameters 时,远端步骤为:
-
令 navigable id 为 command parameters 的
context字段的值。 -
令 navigable 为尝试以 navigable id 调用获取 navigable所得的结果。
-
令 top-level traversable 为 navigable 的顶级 traversable。
-
令 input state 为以 session 和 top-level traversable 调用获取 input state所得的结果。
-
令 actions options 为一个新的 actions options,其中 is element origin 步骤设置为 is input.ElementOrigin,且 get element origin 步骤设置为给定 session 调用get Element from input.ElementOrigin steps所得的结果。
-
令 undo actions 为 input state 的input cancel list 的逆序。
-
尝试以 undo actions、0、navigable 和 actions options dispatch tick actions。
-
以 session 和 top-level traversable 调用重置 input state。
-
返回带有数据 null 的成功。
7.9.3.3. input.setFiles 命令
input.setFiles 命令会将给定
input 元素(其 type 为 file)的 files 属性
设置为一组文件路径。
- 命令类型
-
input.SetFiles= (method:"input.setFiles",params: input.SetFilesParameters )input.SetFilesParameters= {context: browsingContext.BrowsingContext,element: script.SharedReference,files: [*text] } - 返回类型
-
input.SetFilesResult= EmptyResult
给定 session 和 command parameters 时,远端步骤为:
-
令 navigable id 为 command parameters["
context"] 字段的值。 -
令 navigable 为尝试以 navigable id 调用获取 navigable所得的结果。
-
令 document 为 navigable 的活动文档。
-
令 environment settings 为环境设置对象,其 相关全局对象的关联
Document是 document。 -
令 realm 为 environment settings 的realm execution context 的 Realm 组件。
-
令 element 为尝试以 command parameters["
element"]、realm 和 session 调用反序列化 remote reference所得的结果。 -
如果 element 没有实现
Element, 则返回带有错误 代码 no such element 的错误。 -
如果 element 没有实现
HTMLInputElement, element 的type不处于 File Upload 状态,或者 element 是 disabled, 则返回带有错误 代码 unable to set file input 的错误。 -
如果 files 的大小大于 1,且 element 的
multiple属性未设置,则返回带有错误代码 unable to set file input 的错误。 -
令 files 为 command parameters["
files"] 字段的值。 -
令 selected files 为 element 的selected files。
-
如果 files 和 selected files 的交集的大小等于 selected files 的大小,且等于 files 的大小,则在用户交互任务源上,给定 element 排入一个元素任务,以在 element 上触发名为
cancel的事件,并将bubbles属性初始化为 true。注:浏览器中的取消通常由文件选择的变化来 确定。换句话说,如果没有变化,则会发送一个 "cancel" 事件。
-
否则,以 files 作为 用户的选择,更新文件选择。
-
如果出于任何原因,远端无法将 element 的selected files 设置为 files 中给出的路径对应的文件, 则返回带有错误代码 unsupported operation 的错误。
注:例如,远端可能 无法将 selected files 设置为文件系统中当前不存在的文件。
-
返回带有数据 null 的成功。
7.9.4. 事件
7.9.4.1. input.fileDialogOpened 事件
- 事件类型
-
input.FileDialogOpened= (method:"input.fileDialogOpened",params: input.FileDialogInfo )input.FileDialogInfo= {context: browsingContext.BrowsingContext, ?userContext: browser.UserContext, ?element: script.SharedReference,multiple: bool, }
WebDriver BiDi file picker options 是一个结构体,带有一个名为 multiple 的项目, 它是一个布尔值。
注:与其他用户提示处理器不同,默认 行为是允许文件对话框被 打开。
-
令 navigable 为 element 的node document 的navigable。
-
令 navigable id 为 navigable 的navigable id。
-
令 user context id 为 navigable 的关联用户 上下文的 user context id。
-
令 multiple 为
false。 -
如果 element 不是 null 且 element 的
multiple属性已设置, 则将 multiple 设置为true。 -
如果 file picker options 不是 null 且 file picker options 的multiple 为 true,则将 multiple 设置为
true。 -
令 related navigables 为一个包含 navigable 的集合。
-
对于给定 "
input.fileDialogOpened" 和 related navigables 时的事件已启用的会话集合中的每个 session:-
令 params 为一个匹配
input.FileDialogInfo产生式的映射,其中context字段设置为 navigable id,userContext字段设置为 user context id,且multiple字段设置为 multiple。 -
如果 element 不是 null:
-
令 shared id 为以 element 和 session 调用获取 node 的 shared id所得的结果。
-
将 params["
element"] 设置为 shared id。
-
-
令 body 为一个匹配
input.fileDialogOpened产生式的映射,其params字段设置为 params。 -
以 session 和 body 发出 事件。
-
-
令 dismissed 为 false。
-
对于 活动 BiDi 会话中的每个 session:
-
令 user prompt handler 为 session 的user prompt handler。
-
如果 user prompt handler 不是 null:
-
断言:user prompt handler 是一个映射。
-
如果 user prompt handler 包含 "
file":-
如果 user prompt handler["
file"] 不等于 "ignore",则将 dismissed 设置为 true。
-
-
否则,如果 user prompt handler 包含 "
default" 且 user prompt handler["default"] 不等于 "ignore",则将 dismissed 设置为 true。
-
-
返回 dismissed。
7.10. webExtension 模块
webExtension 模块包含用于 管理 Web 扩展以及与其交互的功能。
7.10.1. 定义
WebExtensionCommand = (
webExtension.Install //
webExtension.Uninstall
)
WebExtensionResult = (
webExtension.InstallResult /
webExtension.UninstallResult
)
7.10.2. 类型
7.10.2.1. webExtension.Extension 类型
webExtension.Extension = text
webExtension.Extension 类型表示远端内的
Web 扩展 id。
7.10.3. 命令
7.10.3.1. webExtension.install 命令
webExtension.install 命令会在远端中安装一个 Web 扩展。
- 命令类型
-
webExtension.Install= (method:"webExtension.install",params: webExtension.InstallParameters )webExtension.InstallParameters= {extensionData: webExtension.ExtensionData, }webExtension.ExtensionData= ( webExtension.ExtensionArchivePath / webExtension.ExtensionBase64Encoded / webExtension.ExtensionPath )webExtension.ExtensionPath= {type:"path",path: text, }webExtension.ExtensionArchivePath= {type:"archivePath",path: text, }webExtension.ExtensionBase64Encoded= {type:"base64",value: text, } - 返回类型
-
webExtension.InstallResult= {extension: webExtension.Extension }
-
执行实现定义的步骤,使用 zip 压缩 算法解码 bytes。TODO:为 zip 解码找到更好的引用。
-
如果前一步失败(例如,因为 bytes 并不表示有效的 zip 压缩 数据),则返回带有错误代码 invalid web extension 的错误。否则令 entry 为一个目录条目, 其中包含提取出的文件系统条目。
-
返回 entry。
-
令 type 为 extension data spec["
type"]。 -
如果不支持使用 type 安装 Web 扩展,则返回带有错误 代码 unsupported operation 的错误。
-
在以下条件及关联步骤列表中,运行其关联条件为 true 的第一组步骤:
- type 是字符串 "
path" - type 是字符串 "
archivePath" - type 是字符串 "
base64" -
-
令 bytes 为forgiving-base64 解码 extension data spec["
value"] 所得的结果。 -
如果 bytes 为 failure,则返回 null。
-
- type 是字符串 "
-
返回 entry。
-
如果不支持安装 Web 扩展,则返回带有错误 代码 unsupported operation 的错误。
-
令 extension data spec 为 command parameters["
extensionData"]。 -
令 extension directory entry 为尝试以 extension data spec 调用展开 web extension data spec所得的结果。
-
如果 extension directory entry 为 null,则返回带有错误代码 invalid web extension 的错误。
-
执行实现定义的步骤,以从 extension directory entry 安装 Web 扩展。如果这失败,则返回带有错误代码 invalid web extension 的错误。否则令 extension id 为新安装的 Web 扩展的唯一标识符。
-
令 result 为一个匹配
webExtension.InstallResult产生式的映射,其中extension字段设置为 extension id。 -
返回带有数据 result 的成功。
注:浏览器默认可能只是临时安装 Web 扩展, 以便它们会在下次关闭时自动卸载。
7.10.3.2. webExtension.uninstall 命令
webExtension.uninstall 命令会为 远端卸载一个 Web 扩展。
- 命令类型
-
webExtension.Uninstall= (method:"webExtension.uninstall",params: webExtension.UninstallParameters )webExtension.UninstallParameters= {extension: webExtension.Extension, } - 返回类型
-
webExtension.UninstallResult= EmptyResult
-
令 extension 为 command parameters["
extension"]。 -
如果远端没有 id 等于 extension 的 Web 扩展,则返回带有错误代码 no such web extension 的错误。
-
执行任何实现定义的步骤,以从远端移除该 Web 扩展。如果这失败,则返回带有错误代码 unknown error 的错误。
-
返回带有数据 null 的成功。
8. 对其他规范的补丁
本规范要求对外部规范进行一些更改,以提供必要的 集成点。假定这些补丁将作为标准化流程的一部分提交到其他规范中。
8.1. HTML
report an error 算法被修改,在末尾增加一个步骤:
-
调用外部规范中定义的任何 error reporting steps,传入 script、line、col、message,以及如果错误已 处理则为 true,否则为 false。
8.2. Console
其他规范可以定义 console steps。
-
在以 参数 name、printerArgs 和 options(如果未提供该参数则为 undefined)调用 Printer 操作时,调用 外部规范中定义的任何 console steps,并传入参数 name、printerArgs 和 options。
8.3. CSS
8.3.1. 确定设备像素比
在 determine the device pixel ratio 算法的开头插入以下步骤:
-
如果 device pixel ratio overrides 包含 window 的navigable,则返回 device pixel ratio overrides[window 的navigable]。
9. 附录
本节为非规范性内容。
9.1. 外部规范
注:该列表并不详尽,且可能不是最新的。
以下外部规范定义了额外的 WebDriver BiDi 模块: