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 )
EmptyResult 是一种没有必需字段的结果 类型, 用作不会产生结果数据的命令的返回类型。
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 screencast"/"no such script"/"no such storage partition"/"no such user context"/"no such web extension"/"session not created"/"unable to capture screen"/"unable to close browser"/"unable to set cookie"/"unable to set file input"/"unavailable network data"/"underspecified storage partition"/"unknown command"/"unknown error"/"unsupported operation"
3.6. 事件
事件是一个通知,由 远端 发送给本地端,表示远端上发生了值得关注的事情。
-
事件类型由一个包含组的
本地端定义片段定义。每个这样的组都有两个字段:-
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,则 停止运行这些步骤,并表现为所请求的服务不可 用。
-
如果会话在活跃会话列表中,并且 session id 是其会话 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 的主机,port 设置为 listener 的 端口,path 设置为 resource name;如果 listener 的安全标志已设置,则遵循 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 监听器,其具有 由实现定义的主机、端口、 安全 标志,以及一个空的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:
-
对于 session 的 屏幕录制映射中的每个 screencast recording:
-
执行任何特定于实现的清理步骤。
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。
- downloadResponse
- 如果导航是下载,则为响应, 否则为 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.StartScreencast //
browsingContext.StopScreencast //
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.StartScreencastResult / browsingContext.StopScreencastResult / browsingContext.TraverseHistoryResult )BrowsingContextEvent= ( browsingContext.ContextCreated // browsingContext.ContextDestroyed // browsingContext.DomContentLoaded // browsingContext.DownloadEnd // browsingContext.DownloadWillBegin // browsingContext.FragmentNavigated // browsingContext.HistoryUpdated // browsingContext.Load // browsingContext.NavigationAborted // browsingContext.NavigationCommitted // browsingContext.NavigationFailed // browsingContext.NavigationStarted // browsingContext.UserPromptClosed // browsingContext.UserPromptOpened )
远端具有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 之间的弱映射。
一个远程端具有一个 下载 ID 映射,它是 响应和下载 ID 之间的弱映射。它初始为空。
一个 屏幕录制流 是 顶级可遍历的视口的抽象流,由一个 视频轨道组成, 其包含该顶级可遍历的文档视口的已渲染视觉输出, 以及可选的一个 音频轨道,其包含该 顶级可遍历的文档的音频输出。
一个 BiDi 会话具有一个 屏幕录制映射,它是一个映射,其中键是 UUID,值是 屏幕录制;
后者是一个具有
一个名为 stream 的项的结构体,该项是一个屏幕录制流,
一个名为 path 的项,该项是字符串,
一个名为 state 的项,该项是
"recording"、"stopping"、"stopped" 之一,
以及一个名为 writeError 的项,该项是字符串或 null。
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.Download 类型
browsingContext.Download = text;
browsingContext.Download 类型是标识下载的唯一字符串。
7.3.2.6. 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.7. browsingContext.ReadinessState 类型
browsingContext.ReadinessState="none"/"interactive"/"complete"
browsingContext.ReadinessState 类型表示导航命令将返回时的
文档加载阶段。
7.3.2.8. 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 获取可导航的结果。否则令 reference navigable 为 null。
-
如果 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 的新顶级可遍历,则返回带有 错误 码 不支持的操作的错误。
-
令 traversable 为尝试以 null 和空字符串运行创建新的顶级可遍历步骤, 并将新创建的顶级可遍历的关联用户上下文设为 user context 的结果。 新顶级可遍历会在哪个 OS 窗口中创建,取决于 type 和 reference navigable:
-
如果 command parameters 的
background字段的值为 false:注:如果
background为 true,则不要为创建的可导航调用聚焦步骤。 -
令 body 为一个匹配
browsingContext.CreateResult产生式的映射, 其中context字段设为 traversable 的可导航 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字段的值。 -
令 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 中移除 任何其从 1 开始的索引未包含在 pages 中的页面。
-
令 encoding result 为对 pdf data 调用Base64 编码的结果。
-
令 encoded data 为 encoding result 的数据。
-
令 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.startScreencast 命令
browsingContext.startScreencast 命令 启动给定可导航的屏幕录制,并将其写入文件。
注:远程端 创建并写入屏幕录制文件,但不会删除它。 清理该文件留给本地端。在 某些配置中这可能不 可行——例如,如果远程端 对文件系统具有读/写访问权限,但 本地端只有只读访问权限。
- 命令类型
-
browsingContext.StartScreencast= (method:"browsingContext.startScreencast",params: browsingContext.StartScreencastParameters )browsingContext.StartScreencastParameters= {context: browsingContext.BrowsingContext, ?mimeType: text, ?video: browsingContext.MediaTrackConstraints, ?audio: bool .default false, }browsingContext.MediaTrackConstraints= { ?width: js-uint, ?height: js-uint, ?frameRate: js-uint, } - 返回类型
-
browsingContext.StartScreencastResult= {screencast: browsingContext.Screencast,path: text }browsingContext.Screencast= text
-
令 navigable id 为 command parameters["
context"]。 -
令 navigable 为用 navigable id 尝试获取 navigable 的结果。
-
如果 navigable 不是顶级可遍历对象,则返回带有 错误码 invalid argument 的错误。
-
如果 command parameters 包含
mimeType字段:-
令 mime type 为 command parameters["
mimeType"]。
-
-
否则,将 mime type 设置为实现定义的默认格式。
-
如果实现由于任何原因无法录制 navigable 的屏幕录像, 则返回带有 错误 码 unsupported operation 的错误。
-
令 stream 为用于 navigable 的一个新的屏幕录制流,按如下方式构造:
-
创建一个 video track,它必须是浏览器显示表面的实时捕获, 该显示表面是相关全局对象的关联 `Document` 的 navigable 的 视口。
-
如果 command parameters 包含 "
video": -
将 video track 设置到 stream[video track]。
-
如果 command parameters["
audio"] 为 true:-
创建一个 audio track,它包含由下列文档的总和产生的合并音频: 相关全局对象的关联 `Document` 的 navigable 的活动文档,以及相关全局对象的关联 `Document` 的 navigable 的嵌套浏览上下文中的所有活动文档。
-
将 audio track 设置到 stream[audio track]。
-
-
如果实现无法产生 stream,则返回带有 错误码 unknown error 的错误。
-
-
令 path 为将存储录制内容的实现定义文件路径。
-
令 screencast 为 UUID 的字符串表示。
-
令 recording 为一个新的屏幕录制记录,其 stream 为 stream、 path 为 path、 state 为 "
recording"、 writeError 为 null。 -
将 session 的屏幕录制记录映射[screencast] 设置为 recording。
-
给定 recording 和 mime type,启动屏幕录制记录。
-
令 body 为一个新的映射, 其匹配
browsingContext.StartScreencastResult, 其中screencast字段设置为 screencast,且path字段设置为 path。 -
返回带有数据 body 的成功。
7.3.3.14. browsingContext.stopScreencast 命令
browsingContext.stopScreencast 命令 停止屏幕录制。
- 命令类型
-
browsingContext.StopScreencast= (method:"browsingContext.stopScreencast",params: browsingContext.StopScreencastParameters )browsingContext.StopScreencastParameters= {screencast: browsingContext.Screencast } - 返回类型
-
browsingContext.StopScreencastResult= {path: text, ?error: text }
-
令 screencast 为 command parameters 中 "
screencast" 字段的值。 -
令 screencast recording 为 session 的屏幕 录制映射[screencast]。
-
给定 screencast recording,停止屏幕录制。
-
令 error 为 screencast recording 的writeError。
-
令 path 为 screencast recording 的path。
-
令 body 为一个新的映射, 它匹配
browsingContext.StopScreencastResult, 其中path字段设为 path,如果 error 不为 null,则error字段设为 error,否则省略该字段。 -
返回带有数据 body 的成功。
7.3.3.15. 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 不是 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 进行等待的结果。 -
给定 delta 和 navigable,按增量遍历历史。
按照当前写法,该算法存在 竞态条件,因为当我们尝试导航时,目标会话历史条目可能已经不 存在。一旦我们支持等待历史导航完成,就可以更 稳健地处理这一点。
-
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 的可导航 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= {download: browsingContext.Download,suggestedFilename: text, browsingContext.BaseNavigationInfo }
-
令 navigation info 为给定 navigable 和 navigation status 获取导航 信息的结果。
-
令 download 为 UUID 的字符串表示。
-
将下载 ID 映射[navigation status 的downloadResponse] 设置为 download。
-
令 params 为一个匹配
browsingContext.DownloadWillBeginParams产生式的映射, 其中context字段设为 navigation info["context"],navigation字段设为 navigation info["navigation"],timestamp字段设为 navigation info["timestamp"],url字段设为 navigation info["url"],download字段设为 download 且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",download: browsingContext.Download, browsingContext.BaseNavigationInfo )browsingContext.DownloadCompleteParams= (status:"complete",download: browsingContext.Download,filepath: text / null, browsingContext.BaseNavigationInfo )
-
令 navigation info 为给定 navigable 和 navigation status 获取导航 信息的结果。
-
断言 navigation info["
status"] 等于 "complete" 或 "canceled"。 -
令 download response 为 navigation status 的downloadResponse。
-
如果下载 ID 映射包含 download response,则令 download 为 下载 ID 映射[download response],否则令 download 为 UUID 的字符串表示。
-
如果 navigation info["
status"] 为 "complete",则令 params 为一个匹配browsingContext.DownloadCompleteParams产生式的映射,其中download字段 设为 download,filepath字段设为 navigation status 的downloadedFilepath,context字段设为 navigation info["context"],navigation字段设为 navigation info["navigation"],timestamp字段设为 navigation info["timestamp"],且url字段设为 navigation info["url"]。注:对于已完成的下载,如果由于任何原因无法获得文件路径,
filepath可以为 null。 -
否则,令 params 为一个匹配
browsingContext.DownloadCanceledParams产生式的映射, 其中download字段 设为 download,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 会话具有一个模拟用户代理,它是一个具有 一个名为 默认用户代理的项的结构体,该项是字符串或 null; 一个名为 用户上下文用户代理的项,该项是 用户上下文与 字符串之间的弱映射;以及一个名为 可导航用户代理的项,该项是 可导航与字符串之间的弱映射。
一个 BiDi 会话具有 模拟 maxTouchPoints,它是一个结构体,具有 一个名为 default 的项,该项是整数或 null,初始为 null; 一个名为 user contexts 的项,该项是 用户上下文与整数之间的弱映射, 初始为空; 以及一个名为 navigables 的项,该项是 可导航与整数之间的弱映射,初始为空。
屏幕 方向覆盖是一个具有以下内容的结构体:
一个远程端具有一个 屏幕方向覆盖映射,它是 用户上下文与 屏幕 方向覆盖之间的弱 映射。
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 设为未设置。
-
令 affected navigables 为尝试为 command parameters 存储 WebDriver 配置 强制颜色模式主题 覆盖配置 theme 的结果。
-
对于 affected navigables 中的每个 navigable:
-
为 navigable 更新模拟的强制颜色 主题。
-
-
返回带有数据 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
地理位置 覆盖是一个具有以下内容的结构体:
-
名为
latitude的项,它是浮点数; -
名为
longitude的项,它是浮点数; -
名为
accuracy的项,它是浮点数; -
名为
altitude的项,它是浮点数或 null; -
名为
altitudeAccuracy的项,它是 浮点数或 null; -
名为
heading的项,它是浮点数或 null; -
名为
speed的项,它是浮点数或 null。
一个远程端具有一个 地理位置覆盖配置,它是 WebDriver 配置,并具有关联类型 地理位置覆盖。
-
令 emulated position data 为获取 navigable 的 地理位置覆盖配置的 WebDriver 配置值的结果。
-
如果 emulated position data 为未设置,则将 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 override configuration emulated position data 的结果。
-
对于 affected navigables 的每个 navigable:
-
为 navigable 更新地理位置覆盖。
-
-
返回带有数据 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 获取相关 navigable的结果。
-
对于 related navigables 的每个 navigable:
-
令 top-level traversable 为 navigable 的 顶级可遍历对象。
-
令 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 获取有效顶级 可遍历对象的结果。
-
-
否则:
-
断言 command parameters 的
userContexts字段存在。 -
令 user contexts 为用 command parameters["
userContexts"] 尝试 获取有效用户上下文 的结果。 -
对于 user contexts 的每个 user context:
-
如果 emulated locale 为 null,则从 locale 覆盖映射中移除 user context。
-
否则,将 locale 覆盖映射[user context] 设置为 emulated locale。
-
对于所有顶级可遍历对象中其关联用户上下文为 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 获取有效顶级 可遍历对象的结果。 -
对于 navigables 的每个 navigable:
-
如果 emulated network conditions 为 null,则从 session 的模拟网络 条件的 navigable 网络条件中移除 navigable
-
否则,将 session 的模拟网络 条件的 navigable 网络条件[navigable] 设置为 emulated network conditions。
-
-
-
如果 command parameters 的
userContexts字段存在:-
令 user contexts 为用 command parameters["
userContexts"] 尝试 获取有效用户上下文 的结果。 -
对于 user contexts 的每个 user context:
-
如果 emulated network conditions 为 null,则从 session 的模拟网络 条件的 用户 上下文网络条件中移除 user context。
-
否则,将 session 的模拟网络 条件的 用户 上下文网络条件[user context] 设置为 emulated network conditions。
-
-
-
如果 command parameters 不包含 "
userContexts" 且 command parameters 不包含 "context", 则将 session 的模拟网络条件的 默认网络 条件设置为 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 模拟可用屏幕 区域步骤为:
给定navigable navigable 时,WebDriver BiDi 模拟总屏幕区域步骤 为:
带有 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 获取有效顶级 可遍历对象的结果。 -
令 target 为navigable 屏幕 设置。
-
对于 navigables 的每个 navigable:
-
返回带有数据 null 的成功。
-
-
否则:
7.4.2.6. emulation.setScreenOrientationOverride 命令
emulation.setScreenOrientationOverride 命令 模拟给定顶级可遍历或用户上下文的屏幕方向。
- 命令类型
-
emulation.SetScreenOrientationOverride= (method:"emulation.setScreenOrientationOverride",params: emulation.SetScreenOrientationOverrideParameters )emulation.ScreenOrientationNatural="portrait"/"landscape"emulation.ScreenOrientationType="portrait-primary"/"portrait-secondary"/"landscape-primary"/"landscape-secondary"emulation.ScreenOrientation= {natural: emulation.ScreenOrientationNatural,type: emulation.ScreenOrientationType }emulation.SetScreenOrientationOverrideParameters= {screenOrientation: emulation.ScreenOrientation / null, ?contexts: [+browsingContext.BrowsingContext], ?userContexts: [+browser.UserContext], } - 返回类型
-
emulation.SetScreenOrientationOverrideResult= EmptyResult
要在给定 navigable 和 emulated screen orientation 的情况下,设置 模拟屏幕方向:
-
如果 emulated screen orientation 为 null:
-
否则:
带有 command parameters 的远端步骤如下:
-
如果实现由于任何原因无法使用给定的 command parameters 调整屏幕方向 参数,则返回带有错误 码 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 获取有效顶级 可遍历对象的结果。
-
-
否则,如果 command parameters 的
userContexts字段 存在:-
令 user contexts 为用 command parameters["
userContexts"] 尝试 获取有效用户上下文 的结果。 -
对于 user contexts 的每个 user context:
-
如果 emulated screen orientation 为 null,则从 screen orientation overrides map中移除 user context。
-
否则,将 screen orientation overrides map[user context] 设置为 emulated screen orientation。
-
对于所有顶级可遍历对象中其关联用户上下文为 user context 的列表的每个 top-level traversable:
-
将 top-level traversable 追加到 navigables。
-
-
-
-
对于 navigables 的每个 navigable:
-
令 user context 为 navigable 的关联 用户上下文。
-
如果 emulated screen orientation 为 null,且 screen orientation overrides map 包含 user context,则用 navigable 和 screen orientation overrides map[user context] 设置模拟屏幕方向。
-
否则,用 navigable 和 emulated screen orientation 设置模拟屏幕方向。
-
-
返回带有数据 null 的成功。
7.4.2.7. emulation.setUserAgentOverride 命令
emulation.setUserAgentOverride 命令会修改 给定顶级可遍历、用户上下文或全局的 User-Agent。
- 命令类型
-
emulation.SetUserAgentOverride= (method:"emulation.setUserAgentOverride",params: emulation.SetUserAgentOverrideParameters )emulation.SetUserAgentOverrideParameters= {userAgent: text / null, ?contexts: [+browsingContext.BrowsingContext], ?userContexts: [+browser.UserContext], } - 返回类型
-
emulation.SetUserAgentOverrideResult= EmptyResult
-
令 related navigables 为使用 environment settings 获取相关 可导航的结果。
-
对于每个 navigable 或 related navigables:
-
令 top-level navigable 为 navigable 的顶级可遍历。
-
令 user context 为 top-level navigable 的关联 用户上下文。
-
对于活动 BiDi 会话中的每个 session:
-
对于活动 BiDi 会话中的每个 session:
-
如果 session 的模拟用户代理的用户上下文用户 代理 包含 user context,则返回 session 的模拟用户代理的 用户上下文用户 代理[user context]。
-
-
-
对于活动 BiDi 会话中的每个 session:
-
返回 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 获取有效顶级 可遍历对象的结果。 -
对于 navigables 的每个 navigable:
-
如果 emulated user agent 为 null,则从 session 的模拟用户代理的navigable 用户 代理中移除 navigable。
-
否则,将 session 的模拟用户代理的 navigable 用户 代理[navigable] 设置为 emulated user agent。
-
-
返回带有数据 null 的成功。
-
-
如果 command parameters 包含 "
userContexts":-
令 user contexts 为用 command parameters["
userContexts"] 尝试 获取有效用户上下文 的结果。 -
对于 user contexts 的每个 user context:
-
如果 emulated user agent 为 null,则从 session 的模拟用户代理的用户上下文用户 代理中移除 user context。
-
否则,将 session 的模拟用户代理的 用户上下文用户 代理[user context] 设置为 emulated user agent。
-
-
返回带有数据 null 的成功。
-
-
返回带有数据 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。
带有 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 获取有效顶级 可遍历对象的结果。 -
对于 navigables 的每个 navigable:
-
如果 emulated scripting enabled status 为 null,则从 scripting enabled overrides map中移除 navigable。
-
否则,将 scripting enabled overrides map[navigable] 设置为 emulated scripting enabled status。
-
-
-
如果 command parameters 的
userContexts字段存在:-
令 user contexts 为用 command parameters["
userContexts"] 尝试 获取有效用户上下文 的结果。 -
对于 user contexts 的每个 user context:
-
如果 emulated scripting enabled status 为 null,则从 scripting enabled overrides map中移除 user context。
-
否则,将 scripting enabled overrides map[user context] 设置为 emulated scripting enabled status。
-
-
-
返回带有数据 null 的成功。
7.4.2.9. emulation.setScrollbarTypeOverride 命令
emulation.setScrollbarTypeOverride 命令 修改 给定顶级可遍历、用户上下文或全局的滚动条类型。
- 命令类型
-
emulation.SetScrollbarTypeOverride= (method:"emulation.setScrollbarTypeOverride",params: emulation.SetScrollbarTypeOverrideParameters )emulation.SetScrollbarTypeOverrideParameters= {scrollbarType:"classic"/"overlay"/ null, ?contexts: [+browsingContext.BrowsingContext], ?userContexts: [+browser.UserContext], } - 返回类型
-
emulation.SetScrollbarTypeOverrideResult= EmptyResult
一个远程端具有一个 滚动条类型覆盖配置, 它是具有关联类型字符串的 WebDriver 配置。
-
令 scrollbar type override 为获取 navigable 的 滚动条类型覆盖配置的 WebDriver 配置值的结果。
-
断言:scrollbar type override 为 "
classic"、 "overlay" 或 未设置。 -
如果 scrollbar type override 为 "
classic",则运行实现定义的步骤,使 navigable 的活动文档使用经典滚动条并返回。 -
如果 scrollbar type override 为 "
overlay",则运行实现定义的 步骤,使 navigable 的活动文档使用覆盖滚动条并返回。 -
断言:scrollbar type override 为未设置。
给定 command parameters 的远程端步骤如下:
-
令 scrollbar type override 为 command parameters["
scrollbarType"]。 -
如果 scrollbar type override 为 null,则将 scrollbar type override 设为 未设置。
-
令 affected navigables 为尝试为 command parameters 存储 WebDriver 配置 滚动条类型覆盖 配置 scrollbar type override 的结果。
-
对于 affected navigables 中的每个 navigable:
-
为 navigable 更新滚动条类型覆盖。
-
-
返回带有数据 null 的成功。
7.4.2.10. emulation.setTimezoneOverride 命令
emulation.setTimezoneOverride 命令会修改 给定顶级可遍历或用户上下文的时区。
- 命令类型
-
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。
-
令 related navigables 为给定 environment settings 获取相关 navigable的结果。
-
对于 related navigables 的每个 navigable:
-
如果 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 获取有效顶级 可遍历对象的结果。
-
-
否则:
-
对于 navigables 的每个 navigable:
-
返回带有数据 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 获取相关 可导航的结果。
-
对于 related navigables 中的每个 navigable:
-
令 top-level navigable 为 navigable 的顶级可遍历。
-
令 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 的远程端步骤如下:
注:存在一个旧式的暴露旧式触摸事件 API, 一些现有 Web 内容仍可能将其用作用户代理是启用触摸的“移动”设备的信号。尽管该 API 是旧式的,用户代理仍可能运行实现定义的步骤,以在暴露旧式触摸事件 API中遵循 模拟 maxTouchPoints 状态。
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "contexts",则返回带有错误 码 invalid argument 的错误。 -
令 maxTouchPoints 为 command parameters["
maxTouchPoints"]。 -
如果 command parameters 的
contexts字段存在:-
令 navigables 为尝试使用 command parameters["
contexts"] 通过 ID 获取有效顶级 可遍历 的结果。 -
对于 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 )
一个远程端具有一个 请求发送前映射,其初始为空映射。它用于跟踪
已发送过 network.beforeRequestSent 事件的网络事件。
一个远程端具有一个 默认缓存行为,它是字符串。其初始为
"default"。
一个远程端具有一个 可导航缓存行为映射,它是顶级可遍历与表示缓存 行为的字符串之间的弱映射。其初始为空。
一个 BiDi 会话具有 额外标头,它是一个结构体,具有 一个名为 默认 标头的项,它是一个标头 列表(初始设为空 标头列表);一个名为 用户上下文标头的项,它是 用户上下文与标头列表之间的弱映射;以及一个名为 可导航标头的项,它是 可导航与标头 列表之间的弱映射。
7.5.2. 网络数据收集
网络数据是一个具有以下内容的结构体:
-
名为 bytes 的项,它是
network.BytesValue或 null, -
名为 collectors 的项,它是
network.Collector的列表, -
名为 pending 的项,它是布尔值,
-
名为 size 的项,它是 js-uint 或 null,
-
名为 type 的项,它是
network.DataType。
collector 是一个具有以下内容的结构体:
-
名为 max encoded item size 的项,它是 js-uint;
-
名为 data types 的项,它是
network.DataType的列表; -
名为 collector 的项,它是
network.Collector; -
名为 collector type 的项,它是
network.CollectorType; -
名为 user contexts 的项,它是
browser.UserContext的列表。
注:max encoded item size 定义每项(响应或请求)的限制, 并不限制特定 collector 所收集的大小。所有已收集资源的总大小 由 最大总收集大小限制。
一个 BiDi 会话具有
network collectors,
它是
network.Collector
与collector之间的映射。其初始为空。
一个远程端具有 已收集网络数据,它是 网络数据的列表。其初始为空。
一个远程端具有一个 最大总收集大小,它是表示 在已收集网络数据中分配给收集网络数据的大小的 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 会话具有一个 拦截映射,它是
拦截 ID 与具有 url patterns、
phases 和 contexts 字段的结构体之间的映射,
这些字段定义活动网络拦截的属性。其初始为空。
一个 BiDi 会话具有一个 已阻塞请求
映射,用于跟踪
正在被主动阻塞的请求。它是请求 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:
-
返回 intercepts。
-
令 blocked requests 为 session 的已阻塞请求映射。
-
令 request id 为 command parameters["
request"]。 -
令 (request, phase, response) 为 blocked requests[request id]。
-
如果 phase 为 "
beforeRequestSent" 且 command 为 "continueResponse",则返回带有错误码 "invalid argument" 的错误。TODO:考虑使用不同的错误
-
如果 response 为 null:
-
断言:phase 为 "
beforeRequestSent"。 -
将 response 设为新的响应。
-
-
如果 command parameters 包含 "
statusCode":-
将 responses 的状态设为 command parameters["
statusCode"]。
-
-
如果 command parameters 包含 "
reasonPhrase": -
如果 command parameters 包含 "
headers": -
如果 command parameters 包含 "
cookies":-
如果 command parameters 包含 "
headers",则令 headers 为 response 的标头列表。否则:
-
对于 command parameters["
cookies"] 中的每个 cookie:-
令 header value 为使用 cookie 序列化 set-cookie 标头的结果。
-
将 (`
Set-Cookie`, header value) 追加到 headers。 -
将 response 的标头列表设为 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 执行无 BOM 的 UTF-8 解码或失败的结果。
-
如果 text 为 failure,则返回一个匹配
network.Base64Value产生式的映射, 其中 value 设为对 bytes 执行宽容 base64 编码的结果。 -
返回一个匹配
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 类型,供希望通过流读取给定 collector 所收集数据的客户端使用。
network.CollectorType
类型表示可添加的数据 collector 的不同类型。
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 解码的结果。
-
令 value 为使用 stored cookie 的 value 对序列化协议字节的结果。
-
令 domain 为 stored cookie 的 domain 字段。
-
令 path 为 stored cookie 的 path 字段。
-
如果已设置,则令 expiry 为 stored cookie 的 expiry-time 字段表示为 unix 时间戳;否则为 null。
-
令 size 为将 stored cookie 序列化为它在
Cookie标头中表示时所得结果的字节长度。 -
如果 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,否则省略;size字段 设为 size,httpOnly字段设为 http only,secure字段设为 secure,且sameSite字段设为 same site。
7.5.4.8. network.CookieHeader 类型
network.CookieHeader= {name: text,value: network.BytesValue, }
network.CookieHeader 类型表示
Cookie 请求标头中的 cookie 数据子集。
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 类型表示请求各部分相对于该请求的
客户端的时间原点的时间。
-
令 global 为 request 的客户端。
-
如果 global 为 null,则返回一个匹配
network.FetchTimingInfo产生式的映射,其中所有字段都设为 0。 -
令 time origin 为使用 global 获取时间原点时间戳的结果。
-
令 timings 为 request 的 fetch 计时信息。
-
如果 timings 的最终连接计时信息不为 null,则令 connection timing 为它;否则为一个新的连接计时信息。
-
令 request time 为给定 timings 的开始时间和 global 转换 fetch 时间戳的结果。
-
令 redirect start 为给定 timings 的 重定向开始时间和 global 转换 fetch 时间戳的结果。
-
令 redirect end 为给定 timings 的重定向结束时间和 global 转换 fetch 时间戳的结果。
-
令 fetch start 为给定 timings 的 重定向后开始时间和 global 转换 fetch 时间戳的结果。
-
令 DNS start 为给定 connection timing 的 域名查找开始时间 和 global 转换 fetch 时间戳的结果。
-
令 DNS end 为给定 connection timing 的 域名查找结束时间和 global 转换 fetch 时间戳的结果。
-
令 TLS start 为给定 connection timing 的 安全连接开始 时间和 global 转换 fetch 时间戳的结果。
-
令 connect start 为给定 connection timing 的连接开始时间和 global 转换 fetch 时间戳的结果。
-
令 connect end 为给定 connection timing 的 连接结束时间和 global 转换 fetch 时间戳的结果。
-
令 request start 为给定 timings 的最终网络请求开始 时间和 global 转换 fetch 时间戳的结果。
-
令 response start 为给定 timings 的最终网络响应 开始时间和 global 转换 fetch 时间戳的结果。
-
令 response end 为给定 timings 的 结束时间和 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 类型表示单个请求标头。
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 中,而后者也包含相同的
请求 ID,使得此信息成为冗余。参见
§ 7.5.4.3 network.BaseParameters 类型。
-
如果 request 的initiator type 为 "
fetch" 或 "xmlhttprequest":-
令 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:Chrome 会将当前解析器位置作为解析器插入资源的 column number / line number 包含进去。
-
-
返回一个匹配
network.Initiator产生式的映射, 如果columnNumber字段不为 null,则设为 column number, 否则省略;如果lineNumber字段不为 null,则设为 line number, 否则省略;且如果stackTrace字段不为 null,则设为 stack trace,否则省略。
7.5.4.13. network.Intercept 类型
network.Intercept = text
network.Intercept 类型表示一个网络拦截的 ID。
7.5.4.14. network.Request 类型
network.Request = text;
每个网络请求都有一个关联的请求 ID,它是唯一标识该请求的字符串。由重定向产生的请求的标识符与发起它的请求相匹配。
7.5.4.15. network.RequestData 类型
network.RequestData= {request: network.Request,url: text,method: text,headers: [*network.Header],cookies: [*network.Cookie],headersSize: js-uint,bodySize: js-uint / null,destination: text,initiatorType: text / null,timings: network.FetchTimingInfo, }
network.RequestData 类型表示正在进行的网络请求。
要在给定 request 的情况下获取请求 数据:
-
令 request id 为 request 的请求 ID。
-
令 method 为 request 的方法。
-
令 body size 为 null。
-
令 body 为 request 的主体。
-
如果 body 是字节 序列,则将 body size 设为该序列的长度。 否则,如果 body 是主体,则将 body size 设为该主体的长度。
-
令 headers size 为 request 的标头列表按照 [HTTP11] 要求序列化时的字节大小。
注:对于允许标头压缩的协议, 这是通过网络发送的标头的压缩 大小。
-
令 headers 为空列表。
-
令 cookies 为空列表。
-
对于 request 的标头列表中的每个 (name, value):
-
将使用 name 和 value 序列化标头的结果追加到 headers。
-
如果 name 与 "
Cookie" 是字节大小写不敏感匹配,则:-
对于用户代理的cookie 存储中包含在 request 中的每个 cookie:
注:[COOKIES] 定义了一些关于存储中的哪些 cookie 可被包含在请求中的基线要求,但用户代理可以自由地施加额外约束。
-
将给定 cookie 序列化 cookie的结果追加到 cookies。
-
-
-
-
令 destination 为 request 的目标。
-
令 initiator type 为 request 的initiator type。
-
令 timings 为使用 request 获取 fetch 计时的结果。
-
返回一个匹配
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 类型表示对
网络请求的已解码响应。
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 设为给定 response 获取协议的结果。
-
令 status 为 response 的状态。
-
令 status text 为 response 的状态消息。
-
如果 response 的缓存状态为 "
local",则令 from cache 为 true,否则令其为 false。 -
令 headers 为空列表。
-
令 mime type 为 response 的计算出的 MIME 类型的本质。
注:这是浏览器实际使用的任何 MIME 类型, 即使它没有遵循 [MIMESNIFF] 规范中的精确算法。
-
对于 response 的标头列表中的每个 (name, value):
-
将使用 name 和 value 序列化标头的结果追加到 headers。
-
-
令 bytes received 为作为与 response 关联的 HTTP 响应的一部分传输的总字节数。
-
令 headers size 为作为 HTTP 响应的标头 字段部分传输的字节数。
-
令 content 为使用 response 获取 响应内容信息的结果。
-
令 auth challenges 为使用 response 提取质询的结果。
-
返回一个匹配
network.ResponseData产生式的映射, 其中url字段设为 url,protocol字段 设为 protocol,status字段设为 status,statusText字段设为 status text,fromCache字段设为 from cache,headers字段设为 headers,mimeType字段设为 mime type,bytesReceived字段设为 bytes received,headersSize字段设为 headers size,bodySize字段设为 body size,content字段设为 content,且如果authChallenges字段不为 null,则设为 auth challenges,否则省略。
7.5.4.18. network.SetCookieHeader 类型
network.SetCookieHeader= {name: text,value: network.BytesValue, ?domain: text, ?httpOnly: bool, ?expiry: text, ?maxAge: js-int, ?path: text, ?sameSite: network.SameSite, ?secure: bool, }
network.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"] 反序列化协议字节的结果。 -
令 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 (\) 字符进行转义。
-
令 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 是 特殊的,则将 "
//" 追加到 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 serializer 的结果; 否则为 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 路径序列化器的结果,则返回 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参数表示 最大编码项大小,并限制 给定 collector 收集的每个请求的大小, 而不是该 collector 收集的总大小。注:不同实现可能 支持不同的编码,这意味着 编码后的大小在不同浏览器之间可能不同。因此,对于相同的数据 collector 配置,某些网络数据可能只在部分实现中符合最大编码项大小。
-
令 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 不为 空,则返回带有错误 码 无效参数的错误。
-
如果 max encoded item size 为 0,或 max encoded item size 大于 最大总收集大小,则返回带有错误 码 无效参数的错误。
-
如果 input context ids 不为空:
-
否则,如果 input user context ids 不为空:
-
令 collector 为一个collector,其 最大编码项大小字段设为 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字段存在: -
令 intercept map 为 session 的拦截映射。
-
令 parsed patterns 为空列表。
-
对于 url patterns 中的每个 url pattern:
-
将 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 的阻塞请求映射。
-
令 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":-
令 url record 为将 URL parser 应用于 command parameters["
url"] 且基 URL 为 null 的结果。 -
如果 url record 为 failure,则返回带有 错误码 invalid argument 的错误。
TODO:这里也应当恢复吗?
-
令 request 的url 为 url record。
-
-
如果 command parameters 包含 "
method": -
如果 command parameters 包含 "
headers": -
如果 command parameters 包含 "
cookies":-
令 cookie header 为空字节 序列。
-
对于 command parameters["
cookies"] 中的每个 cookie:-
如果 cookie header 不为空,则将 `
;` 追加到 cookie header。 -
将用 cookie 序列化 cookie 标头的结果追加到 cookie header。
-
-
令 found cookie header 为 false。
-
对于 request 的标头列表中的每个 header:
-
令 name 为 header 的 name。
-
如果对 name 进行字节小写化的结果为 `
cookie`:-
将 header 的 value 设置为 cookie header。
-
将 found cookie header 设置为 true。
-
中断。
-
-
-
如果 found cookie header 为 false:
-
-
如果 command parameters 包含 "
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
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 的已阻塞请求映射。
-
令 request id 为 command parameters["
request"]。 -
令 (request, phase, response) 为 blocked requests[request id]。
-
如果 command parameters "
action" 为 "cancel",则将 response 的身份验证凭据设为 "cancelled"。 -
如果 command parameters "
action" 为 "provideCredentials":-
令 credentials 为 command parameters["
credentials"]。 -
断言:credentials["
type"] 为 "password"。 -
将 response 的身份验证凭据设为 (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,则返回 带有错误 码 无此网络 collector的错误。
-
令 collected data 为使用 request id 和 data type 获取已收集数据的结果。
-
使用 collected data 和 collector id 从数据中移除 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 的已阻塞请求映射。
-
令 request id 为 command parameters["
request"]。 -
令 (request, phase, response) 为 blocked requests[request id]。
-
令 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,则返回 带有错误码 无此网络 collector的错误。
-
将 collector id 设为 command parameters["
collector"]。
-
-
令 disown 为 command parameters["
disown"]。 -
令 collected data 为给定 request id 和 data type 获取已收集数据的结果。
-
如果 collected data 为 null:
-
如果 collected data 的pending 为 true:
-
使用 "network data collected" 和 (request id, data type) 等待。
-
-
如果 collector id 不为 null,且如果 collected data 的collectors 不包含 collector id:
-
令 bytes 为 collected data 的bytes。
-
如果 bytes 为 null,
-
令 body 为一个匹配
network.GetDataResult产生式的映射, 其中bytes字段设为 bytes。 -
如果 disown 为 true,则使用 collected data 和 collector id 从数据中移除 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
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,则返回 带有错误 码 无此网络 collector的错误。
-
从 session 的network collectors中移除 collector id。
-
对于已收集网络数据中的 collected data,使用 collected data 和 collector id 从数据中移除 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。
注:移除拦截不会影响 已经被此拦截阻塞的请求。只有未来请求或现有 请求的未来阶段会受到影响。
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
-
令 behavior 为 command parameters["
cacheBehavior"]。 -
如果 command parameters 不包含 "
contexts": -
令 navigables 为空集合。
-
对于 command parameters["
contexts"] 中的每个 navigable id: -
对于 navigables 中的每个 navigable:
-
如果可导航缓存行为映射包含 navigable,且 可导航缓存行为 映射[navigable] 等于 behavior,则 继续。
-
切换 behavior 的值:
-
如果 behavior 等于默认缓存行为:
-
如果可导航缓存行为映射 包含 navigable, 则移除可导航缓存行为 映射[navigable]。
-
-
否则:
-
将可导航缓存行为 映射[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
-
断言:related navigables 的大小为 0 或 1。
注:这意味着它不适用于 与多个可导航关联的 worker。在这种情况下,不清楚应以何种顺序覆盖标头。
-
对于 related navigables 中的 navigable:
-
对于 related navigables 中的 navigable:
-
如果 command parameters 包含 "
userContexts" 且 command parameters 包含 "contexts", 则返回带有错误 码 invalid argument 的错误。 -
如果 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。
-
-
对于 user contexts 中的 user context:
-
将 target[user context] 设置为 headers。
-
-
返回带有数据 null 的成功。
-
-
如果 command parameters 包含 "
contexts":-
令 navigables 为用 command parameters["
contexts"] 尝试 通过 ID 获取有效顶级 可遍历对象的结果。 -
令 target 为 session 的额外标头的 navigable 标头
-
对于 navigables 中的 navigable:
-
将 target[navigable] 设置为 headers。
-
-
返回带有数据 null 的成功。
-
-
返回带有数据 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 的重定向计数。
-
断言:请求发送前映射[request] 等于 redirect count。
注:这意味着每个调用方都需要 确保在这些步骤之前,已使用 request 调用WebDriver BiDi before request sent 步骤。
-
如果 request 的客户端不为 null,则令 related navigables 为使用 request 的获取相关可导航和 客户端的结果。否则,令 related navigables 为空 集合。
-
对于给定 "
network.authRequired" 和 related navigables 的已启用事件的会话集合 中的每个 session:-
令 params 为使用 session、 "
network.authRequired" 和 request 处理 网络事件的结果。 -
令 response data 为使用 response 获取响应 数据的结果。
-
断言:response data 包含 "
authChallenge"。 -
将 params 的
response字段设为 response data。 -
断言:params 匹配
network.AuthRequiredParameters产生式。 -
令 body 为匹配
network.AuthRequired产生式的映射,其中params字段设为 params。 -
使用 session 和 body 发出 事件。
-
如果 params["
isBlocked"] 为 true:
-
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 的顶级可遍历。
-
令 user context 为 top-level traversable 的关联 用户上下文。
-
对于活动 BiDi 会话中的每个 session:
-
对于活动 BiDi 会话中的每个 session:
-
如果 session 的模拟网络 条件的 用户 上下文网络条件 包含 user context,则返回 session 的 模拟网络 条件的 用户 上下文网络条件[user context]。
-
-
对于活动 BiDi 会话中的每个 session:
-
-
返回 null。
-
令 navigable 为 settings 的相关全局对象的 关联
Document的节点可导航。 -
令 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 至多只能在一个 用户 上下文到接受不安全证书覆盖映射中。
-
如果 session 的用户 上下文到接受不安全证书覆盖映射 包含 user context:
-
令 accept insecure certificates 为 session 的 用户 上下文到接受不安全证书覆盖 映射[user context]。
-
如果 accept insecure certificates 为 true:
-
否则,当为 request 运行基本证书处理 步骤时,执行所有步骤以及任何 实现定义的 证书验证步骤。
-
注:user context 至多只能在一个 用户上下文到代理 配置映射中。
-
如果 session 的用户上下文 到代理配置映射 包含 user context:
-
令 proxy configuration 为 session 的 用户 上下文到代理配置映射[user context]。
-
执行实现定义的步骤,以确保 request 使用 proxy configuration 所定义的代理设置。
注:这些 设置在创建用户上下文时已被验证,因此 在此阶段假定其有效;访问代理时的任何错误 都将在处理请求时报告为网络错误。
-
-
-
-
-
使用 request 可能收集网络请求主体。
-
令 redirect count 为 request 的重定向计数。
-
将 redirect count 添加到请求发送前映射[request]。
-
如果 request 的客户端不为 null,则令 related navigables 为使用 request 的获取相关可导航和 客户端的结果。否则,令 related navigables 为空 集合。
-
令 response 为 null。
-
令 response status 为 "
incomplete"。 -
对于活动 BiDi 会话中的每个 session:
-
使用 session、request 和 related navigables 更新请求标头。
-
-
对于给定 "
network.beforeRequestSent" 和 related navigables 的已启用事件的会话集合 中的每个 session:-
令 params 为使用 session、 "
network.beforeRequestSent" 和 request 处理 网络事件的结果。 -
令 initiator 为使用 request 获取 initiator的结果。
-
如果 initiator 不是空,则将 params 的
initiator字段设为 initiator。 -
断言:params 匹配
network.BeforeRequestSentParameters产生式。 -
令 body 为匹配
network.BeforeRequestSent产生式的映射,其中params字段设为 params。 -
使用 session 和 body 发出 事件。
-
如果 params["
isBlocked"] 为 true,则:-
令 blocked requests 为 session 的已阻塞 请求映射。
-
令 request id 为 request 的请求 ID。
-
将 blocked requests[request id] 设为 (request, "
beforeRequestSent", null)。 -
令 (response, status) 为使用 «"
continue 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 会话具有一个 预加载脚本映射,
它是一个映射,
其中键为 UUID,值为具有以下项的结构体:
名为 function declaration 的项,它是字符串;
名为 arguments 的项,它是列表;
名为 contexts 的项,它是列表或 null;
名为 sandbox 的项,它是字符串或 null;
以及名为 user contexts 的项,它是一个集合。
注:如果执行预加载脚本失败,无论是由于语法 错误,还是 运行时异常,都会在其被执行的 realm 中报告一个 [ECMAScript] 异常,而其他预加载脚本会照常运行。
-
令 document 为 environment settings 的相关全局对象的 关联
Document。 -
令 navigable 为 document 的可导航。
-
令 user context 为 navigable 的关联用户 上下文。
-
令 user context id 为 user context 的用户 上下文 ID。
-
对于活动 BiDi 会话中的每个 session:
-
对于 session 的预加载脚本映射的 值中的每个 preload script:
-
如果 preload script 的
user contexts的大小不为零: -
如果 preload script 的
contexts不为 null: -
如果 preload script 的
sandbox不为 null,则令 realm 为使用 preload script 的sandbox和 navigable 获取或创建沙盒 realm的结果。 否则,令 realm 为 environment settings 的 realm 执行上下文的 Realm 组件。 -
令 exception reporting global 为 environment settings 的 realm 执行上下文的 Realm 组件的全局对象。
-
令 arguments 为 preload script 的
arguments。 -
令 deserialized arguments 为空列表。
-
对于 arguments 中的每个 argument:
-
令 channel 为使用 session、realm 和 argument 创建 通道的结果。
-
将 channel 追加到 deserialized arguments。
-
-
令 base URL 为 environment settings 的API 基础 URL。
-
令 options 为默认脚本 fetch 选项。
-
令 function declaration 为 preload script 的
function declaration。 -
令 function body evaluation status 为使用 function declaration、 environment settings、base URL 和 options 求值函数体的结果。
-
如果 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
类型表示用于从远程端向
本地端发送自定义消息的特定通道的 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 的情况下,获取异常 详情:
-
断言:record.[[Type]] 为
throw。 -
令 text 为由实现定义的、对 record 所表示错误的文本描述。
TODO:收紧这里的要求;人们很可能会尝试用正则表达式之类同样糟糕的东西来解析 这些数据。
-
令 serialization options 为一个匹配
script.SerializationOptions产生式的映射, 其字段设为 它们的默认值。 -
令 exception 为使用 record.[[Value]]、serialization options、ownership type、 一个新的映射作为序列化内部映射、realm 和 session 序列化为 远程值的结果。
-
令 stack trace 为给定 record 的异常的堆栈跟踪。
-
如果 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 都有一个对应的 句柄对象映射。这是一个 从句柄 ID 到其对应对象的强映射。
7.6.3.6. script.InternalId 类型
script.InternalId = text;
script.InternalId 类型表示在
序列化期间,
先前序列化的 script.RemoteValue 的 ID。
7.6.3.7. script.LocalValue 类型
script.LocalValue= ( script.RemoteReference / script.PrimitiveProtocolValue / script.ChannelValue / script.ArrayLocalValue / { script.DateLocalValue } / script.MapLocalValue / script.ObjectLocalValue / { script.RegExpLocalValue } / script.SetLocalValue )script.ListLocalValue= [*script.LocalValue];script.ArrayLocalValue= {type:"array",value: script.ListLocalValue, }script.DateLocalValue= (type:"date",value: text )script.MappingLocalValue= [*[(script.LocalValue / text), script.LocalValue]];script.MapLocalValue= {type:"map",value: script.MappingLocalValue, }script.ObjectLocalValue= {type:"object",value: script.MappingLocalValue, }script.RegExpValue= {pattern: text, ?flags: text, }script.RegExpLocalValue= (type:"regexp",value: script.RegExpValue, )script.SetLocalValue= {type:"set",value: script.ListLocalValue, }
script.LocalValue
类型表示可以被反序列化到 ECMAScript 中的值。
这包括原始值和非原始值,以及远程引用和
通道。
要在给定 serialized key-value list、realm 和 session 的情况下,反序列化 键值列表:
-
令 deserialized key-value list 为一个新列表。
-
对于 serialized key-value list 中的每个 serialized key-value:
-
令 serialized key 为 serialized key-value[0]。
-
如果 serialized key 是
string, 则令 deserialized key 为 serialized key。 -
否则,令 deserialized key 为尝试在给定 serialized key、realm 和 session 的情况下 反序列化本地值的结果。
-
令 serialized value 为 serialized key-value[1]。
-
令 deserialized value 为尝试 在给定 serialized value、realm 和 session 的情况下 反序列化本地值的结果。
-
将 CreateArrayFromList(«deserialized key, deserialized value») 追加到 deserialized key-value list。
-
返回带有数据 deserialized key-value list 的成功。
要在给定 serialized value list、realm 和 session 的情况下,反序列化 值列表:
要在给定 local protocol value、realm 和 session 的情况下,反序列化 本地值:
-
如果 local protocol value 匹配script.RemoteReference 产生式,则返回 给定 local protocol value、realm 和 session 的反序列化远程引用。
-
如果 local protocol value 匹配script.PrimitiveProtocolValue 产生式, 则返回使用 local protocol value 反序列化原始协议值的结果。
-
如果 local protocol value 匹配
script.ChannelValue产生式, 则返回使用 session、realm 和 local protocol value 创建 通道的结果。 -
令 type 为 local protocol value 的
type字段的值;如果没有这样的字段,则为 undefined。 -
令 value 为 local protocol value 的
value字段的值;如果没有这样的字段, 则为 undefined。 -
在以下条件及关联步骤列表中,运行首个关联条件为 true 的步骤集:
- type 为字符串 "
array" -
-
令 deserialized value list 为尝试在给定 value、realm 和 session 的情况下反序列化值列表的结果。
-
返回带有数据 CreateArrayFromList(deserialized value list) 的成功。
-
- type 为字符串 "
date" - type 为字符串 "
map" -
-
令 deserialized key-value list 为尝试使用 value、realm 和 session 反序列化键值列表的结果。
-
令 iterable 为 CreateArrayFromList(deserialized key-value list)
-
- type 为字符串 "
object" -
-
令 deserialized key-value list 为尝试使用 value、realm 和 session 反序列化键值列表的结果。
-
令 iterable 为 CreateArrayFromList(deserialized key-value list)
-
返回带有数据 Object.fromEntries(iterable) 的成功。
-
- type 为字符串 "
regexp" - type 为字符串 "
set" -
-
令 deserialized value list 为尝试在给定 value、realm 和 session 的情况下反序列化值列表的结果。
-
令 iterable 为 CreateArrayFromList(deserialized key-value list)
-
返回带有数据 Set object(iterable) 的成功。
-
- 否则
- 返回带有错误码 无效参数的错误。
- 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 是不透明的, 不得能从句柄对象映射中对应全局对象的句柄 ID 推导出来,或在相关时,从任何可导航 ID 的可导航推导出来。
注:这是为了确保用户不会依赖 不同 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 的情况下序列化原始协议值:
-
令 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产生式的映射, 其value属性设为 value。 - Type(value) 为 Number
- Type(value) 为 Boolean
- 令 remote value 为一个匹配
本地端定义中script.BooleanValue产生式的映射, 其value属性设为 value。 - Type(value) 为 BigInt
- 令 remote value 为一个匹配
本地端定义中script.BigIntValue产生式的映射, 其value属性设为在 value 上运行 ToString 操作的结果。
-
返回 remote value
要在给定 primitive protocol value 的情况下反序列化原始协议值:
-
令 type 为 primitive protocol value 的
type字段的值。 -
令 value 为 undefined。
-
如果 primitive protocol value 具有字段
value:-
令 value 为 primitive protocol value 的
value字段的值。
-
-
在以下条件及关联步骤列表中,运行首个关联条件为 true 的步骤集:
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 是
WorkerGlobalScope对象。 -
令 owners 为空列表。
-
对于 global object 的关联拥有者集合中的每个 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 的源序列化。
-
令 global object 为 environment settings 指定的全局对象
-
运行首个匹配条件下的步骤:
- global object 是
Window对象 -
-
令 document 为 environment settings 的相关全局对象的 关联
Document。 -
令 navigable 为 document 的节点可导航。
-
如果 navigable 为 null,则返回 null。
-
令 navigable id 为 navigable 的可导航 ID。
-
令 realm info 为一个匹配
script.WindowRealmInfo产生式的映射, 其中realm字段设为 realm id,origin字段设为 origin,context字段设为 navigable id,且userContext字段设为 user context id。
-
- global object 是
SandboxWindowProxy对象 -
TODO:尚不清楚这是否是处理 sandbox 的正确表述。
-
令 document 为 global object 的已包装
Window的 关联Document。 -
令 navigable 为 document 的节点可导航。
-
如果 navigable 为 null,则返回 null。
-
令 navigable id 为 navigable 的可导航 ID。
-
令 sandbox name 为给定 realm 获取 sandbox 名称的结果。
-
断言: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 正好有一项。
-
令 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
的全局对象始终为 "worker",
而对于实现 WorkletGlobalScope
的全局对象始终为 "worklet"。
7.6.3.12. script.RealmType 类型
script.RealmType="window"/"dedicated-worker"/"shared-worker"/"service-worker"/"worker"/"paint-worklet"/"audio-worklet"/"worklet"
script.RealmType 类型表示 Realm 的不同类型。
7.6.3.13. script.RemoteReference 类型
script.RemoteReference= ( script.SharedReference / script.RemoteObjectReference )script.SharedReference= {sharedId: script.SharedId ?handle: script.Handle, Extensible }script.RemoteObjectReference= {handle: script.Handle, ?sharedId: script.SharedId Extensible }
script.RemoteReference
类型要么是
script.RemoteObjectReference,表示对给定Realm中句柄对象映射里
现有 ECMAScript 对象的远程引用,要么
是 script.SharedReference,表示对节点的引用。
注:如果提供的引用同时具有
handle 和
sharedId,则该算法将忽略 handle,并且仅遵循
sharedId。
-
断言 remote reference 匹配
script.RemoteReference产生式。 -
如果 remote reference 匹配
script.SharedReference产生式,则返回 使用 remote reference、realm 和 session 反序列化共享引用的结果。 -
返回使用 remote reference 和 realm 反序列化远程对象引用的结果。
-
断言 shared reference 匹配
script.SharedReference产生式。 -
令 navigable 为使用 realm 获取该可导航的结果。
-
如果 navigable 为
null,则返回带有错误码 无此 节点的错误。注:当 realm 不是 Window 全局对象时会发生这种情况。
-
令 shared id 为 shared reference 的
sharedId字段的值。 -
令 environment settings 为环境设置对象,其 realm 执行上下文的 Realm 组件为 realm。
-
如果 node 的节点文档的源与 environment settings 的源不是同源域, 则返回带有错误 码 无此节点的错误。
注:这确保 WebDriver-BiDi 不能被用来在本来不允许脚本访问的 realm 之间传递对象。
-
令 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 为在给定 value 的情况下序列化原始协议值的结果。
-
如果 remote value 不是 undefined,则返回 remote value。
-
令 handle id 为使用 realm、 ownership type 和 value 对象的句柄。
-
将 ownership type 设为 "
none"。 -
如果 value 在 serialization internal map 中,则令 known object 为
true,否则为false。 -
在以下条件及关联步骤列表中,运行首个 关联条件为 true 的步骤集:
- Type(value) 为 Symbol
- 令 remote value 为一个匹配
本地端定义中script.SymbolRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性。 - IsArray(value)
- 令 remote value 为使用
session、
script.ArrayRemoteValue、handle id、known object、 value、 serialization options、ownership type、serialization internal map、 realm 和 session 序列化类数组对象的结果。 - IsRegExp(value)
- value 具有 [[DateValue]] 内部槽。
-
-
将 serialized 设为 Call(Date.prototype.toISOString, value)。
-
断言:serialized 不是抛出完成。
-
令 remote value 为一个匹配
本地端定义中script.DateRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性,并且 值设为 serialized。
-
- value 具有 [[MapData]] 内部槽
-
-
令 remote value 为一个匹配
本地端定义中script.MapRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则 省略该属性。 -
使用 serialization internal map、 remote value 和 value 按需设置内部 ID。
-
令 serialized 为 null。
-
如果 known object 为
false,且 serialization options["maxObjectDepth"] 不为 0,则运行以下 步骤:-
令 serialized 为使用 CreateMapIterator(value, key+value)、serialization options、 ownership type、serialization internal map、 realm 和 session 序列化为映射的结果。
-
-
如果 serialized 不为 null,则将 remote value 的字段
value设为 serialized。
-
- value 具有 [[SetData]] 内部槽
-
-
令 remote value 为一个匹配
本地端定义中script.SetRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则 省略该属性。 -
使用 serialization internal map、 remote value 和 value 按需设置内部 ID。
-
令 serialized 为 null。
-
如果 known object 为
false,且 serialization options["maxObjectDepth"] 不为 0,则运行以下 步骤:-
令 serialized 为使用 CreateSetIterator(value, value)、serialization options、 ownership type、serialization internal map、 realm 和 session 序列化为列表的结果。
-
-
如果 serialized 不为 null,则将 remote value 的字段
value设为 serialized。
-
- value 具有 [[WeakMapData]] 内部槽
- 令 remote value 为一个匹配
本地端定义中script.WeakMapRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性。 - value 具有 [[WeakSetData]] 内部槽
- 令 remote value 为一个匹配
本地端定义中script.WeakSetRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性。 - value 具有 [[GeneratorState]] 内部槽或 [[AsyncGeneratorState]] 内部槽
- 令 remote value 为一个匹配
本地端定义中script.GeneratorRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性。 - value 具有 [[ErrorData]] 内部槽
- 令 remote value 为一个匹配
本地端定义中script.ErrorRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性。 - value 具有 [[ProxyHandler]] 内部槽和 [[ProxyTarget]] 内部槽
- 令 remote value 为一个匹配
本地端定义中script.ProxyRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性。 - IsPromise(value)
- 令 remote value 为一个匹配
本地端定义中script.PromiseRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性。 - value 具有 [[TypedArrayName]] 内部槽
- 令 remote value 为一个匹配
本地端定义中script.TypedArrayRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性。 - value 具有 [[ArrayBufferData]] 内部槽
- 令 remote value 为一个匹配
本地端定义中script.ArrayBufferRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性。 - value 是实现
NodeList的平台对象 - 令 remote value 为使用
script.NodeListRemoteValue、handle id、known object、 value、 serialization options、ownership type、serialization internal map、 realm 和 session 序列化类数组对象的结果。 - value 是实现
HTMLCollection的平台对象 - 令 remote value 为使用
script.HTMLCollectionRemoteValue、handle id、known object、value、 serialization options、ownership type、known object、 serialization internal map、 realm 和 session 序列化类数组对象的结果。 - value 是实现
Node的平台对象 -
-
令 shared id 为使用 value 和 session 获取 节点的共享 ID。
-
令 remote value 为一个匹配
本地端定义中script.NodeRemoteValue产生式的映射, 如果 shared id 不为 null,则将sharedId属性设为 shared id;否则省略该属性,并且 如果 handle id 不为 null,则将handle属性设为 handle id;否则 省略该属性。 -
使用 serialization internal map、 remote value 和 value 按需设置内部 ID。
-
令 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 的模式为 "closed",则令 children 为 null。否则,令 children 为空列表,并且对于 value 的子节点中的每个节点 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 序列化为 远程值的结果。
-
将 serialized 追加到 children。
-
-
如果 children 不为 null,则将 serialized["
children"] 设为 children。 -
如果 value 实现
Element:-
令 attributes 为新的映射。
-
对于 value 的属性列表中的每个 attribute:
-
将 serialized["
attributes"] 设为 attributes。 -
令 shadow root 为 value 的影子根。
-
如果 shadow root 为 null,则令 serialized shadow 为 null。 否则运行以下子步骤:
-
令 serialized shadow 为使用 shadow root、 serialization options、ownership type、serialization internal map、 realm 和 session 序列化 为远程值的结果。
-
-
将 serialized["
shadowRoot"] 设为 serialized shadow。
-
-
如果 value 实现
ShadowRoot, 则将 serialized["mode"] 设为 value 的模式。
-
-
如果 serialized 不为 null,则将 remote value 的字段
value设为 serialized。
-
- value 是实现
WindowProxy的平台对象 -
-
令 window 为 value 的 [[WindowProxy]] 内部 槽的值。
-
令 navigable 为 window 的可导航。
-
令 navigable id 为 navigable 的可导航 ID。
-
令 serialized 为一个匹配
本地端定义中script.WindowProxyProperties产生式的映射, 其context属性设为 navigable id。 -
令 remote value 为一个匹配
本地端定义中script.WindowProxyRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性,并且value属性设为 serialized。
-
- value 是平台对象
- 1. 令 remote value 为一个匹配
本地端定义中script.ObjectRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性。 - IsCallable(value)
- 令 remote value 为一个匹配
本地端定义中script.FunctionRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性设为 handle id;否则省略该属性。 - 否则:
-
-
令 remote value 为一个匹配
本地端定义中script.ObjectRemoteValue产生式的映射, 如果 handle id 不为 null,则将handle属性 设为 handle id;否则省略该属性。 -
使用 serialization internal map、 remote value 和 value 按需设置内部 ID。
-
令 serialized 为 null。
-
如果 known object 为
false,且 serialization options["maxObjectDepth"] 不为 0,则运行以下 步骤:-
令 serialized 为使用 EnumerableOwnPropertyNames(value, key+value)、serialization options、 ownership type、serialization internal map、 realm 和 session 序列化为映射的结果。
-
-
如果 serialized 不为 null,则将 remote value 的字段
value设为 serialized。
-
返回 remote value
children
和子节点是不同的东西。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 堆栈。
注:关于如何获取堆栈帧列表的细节, 以及该列表的属性 规定不足,因此这里的细节由实现定义。
假定实现能够生成堆栈 帧列表,它是一个列表,其中每一项对应 JavaScript 调用堆栈中的每个条目,从最近的开始。每个条目都是一个单个堆栈 帧,对应于脚本 script 中语句或表达式的执行,并包含以下字段:
- 脚本 URL
- 包含 script 的资源的 URL
- 函数
- 正在执行的函数的名称
- 行号
- 被执行代码的从零开始的行号,相对于包含 script 的资源顶部。
- 列号
- 被执行代码的从零开始的列号,相对于 包含 script 的资源中该行的起始位置。
要使用堆栈帧列表 stack 构造 堆栈跟踪:
当前堆栈 跟踪 是在给定表示正在运行的 执行上下文的调用堆栈的堆栈 帧列表时,构造堆栈跟踪的结果。
带有异常或类型为
throw 的 Completion Record exception
的异常的堆栈
跟踪,由以下给出:
-
如果 exception 是作为异常被抛出的值,则令 record 为为抛出 exception 而创建的 Completion Record。否则令 record 为 exception。
-
令 stack 为与 创建 record 时所在点的执行相对应的堆栈帧列表。
-
返回在给定 stack 的情况下构造堆栈跟踪的结果。
7.6.3.20. script.Source 类型
script.Source= {realm: script.Realm, ?context: browsingContext.BrowsingContext, ?userContext: browser.UserContext }
script.Source 类型表示一个 script.Realm,
以及可选的 browsingContext.BrowsingContext 和相关的
browser.UserContext,脚本相关事件在其中发生。
-
令 realm 为 source realm 的realm ID。
-
令 environment settings 为环境设置对象,其 realm 执行上下文的 Realm 组件为 source realm。
-
如果 environment settings 具有关联
Document:-
令 document 为 environment settings 的关联
Document。 -
令 navigable 为 document 的节点可导航。
-
如果 navigable 不为 null,则令 navigable id 为 navigable 的可导航 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 的值。
这在可导航标识符可以代表与该可导航的活动文档
关联的 realm 的情况下很有用。
-
如果 sandbox 为 null 或为空字符串:
-
令 document 为 navigable 的活动文档。
-
令 environment settings 为环境设置对象,其 相关全局对象的关联
Document是 document。 -
令 realm 为 environment settings 的realm 执行上下文的 Realm 组件。
-
-
否则:令 realm 为尝试在给定 sandbox 和 navigable 的情况下获取或创建 sandbox realm的结果。
-
返回带有数据 realm 的成功
-
如果 target 匹配
script.ContextTarget产生式:-
令 sandbox 为 null。
-
如果 target 包含 "
sandbox",则将 sandbox 设为 target["sandbox"]。 -
令 realm 为使用 target["
context"] 和 sandbox 从可导航获取 realm的结果。
-
-
否则:
-
断言:target 匹配
script.RealmTarget产生式。 -
令 realm id 为 target 的
realm字段的值。 -
令 realm 为给定 realm id 时获取 realm的结果。
-
-
返回带有数据 realm 的成功
7.6.4. 命令
7.6.4.1. script.addPreloadScript 命令
script.addPreloadScript 命令添加一个预加载脚本。
- 命令类型
-
script.AddPreloadScript= (method:"script.addPreloadScript",params: script.AddPreloadScriptParameters )script.AddPreloadScriptParameters= {functionDeclaration: text, ?arguments: [*script.ChannelValue], ?contexts: [+browsingContext.BrowsingContext], ?userContexts: [+browser.UserContext], ?sandbox: text } - 返回类型
-
script.AddPreloadScriptResult= {script: script.PreloadScript }
-
如果 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 不是顶级可遍历对象,则返回带有错误码 invalid argument 的错误。
-
将 navigable 追加到 navigables。
-
-
-
否则,如果 command parameters 包含
userContexts:-
将 user contexts 设置为用 command parameters["
userContexts"] 创建 集合的结果。 -
对于 user contexts 的每个 user context id:
-
将 user context 设置为用 user context id 获取用户上下文的结果。
-
如果 user context 为 null,则返回带有错误码 no such user context 的错误。
-
-
-
如果存在,则令 sandbox 为 command parameters 中 "
sandbox" 字段的值;否则为 null。 -
令 script 为 UUID 的字符串表示。
-
令 preload script map 为 session 的预加载脚本映射。
-
将 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 命令解除对给定句柄的拥有。 这并不保证被句柄引用的对象会被垃圾收集,因为可能存在 其他句柄或强 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 map 包含 handle id,则从 handle map 中移除 handle id。
-
-
返回带有数据 null 的成功。
7.6.4.3. script.callFunction 命令
script.callFunction 命令在给定 realm 中使用给定实参调用提供的 函数。
RealmInfo 可以是 realm 或可导航。
注:在
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 的情况下反序列化 实参:
注:function declaration 会被 加上括号并求值。
-
令 bypassDisabledScripting 为 true。
-
令 parenthesized function declaration 为 «"
(", function declaration, ")"» 的拼接结果 -
令 function script 为使用 parenthesized function declaration、environment settings、base URL、 options 和 bypassDisabledScripting 创建经典脚本的结果。
-
使用 environment settings 准备运行脚本。
-
令 function body evaluation status 为 ScriptEvaluation(function script 的 record)。
-
使用 environment settings 运行脚本后清理。
-
返回 function body evaluation status。
带有 session 和 command parameters 的远程端步骤如下:
-
令 realm 为尝试给定 command parameters 的
target字段的值从 target 获取 realm的结果。 -
令 realm id 为 realm 的realm ID。
-
令 environment settings 为环境设置对象,其 realm 执行上下文的 Realm 组件为 realm。
-
令 command arguments 为 command parameters 的
arguments字段的值。 -
令 deserialized arguments 为空列表。
-
如果 command arguments 不为 null,则将 deserialized arguments 设为 尝试在给定 realm、 command arguments 和 session 的情况下 反序列化实参的结果。
-
令 this parameter 为 command parameters 的
this字段的值。 -
令 this object 为 null。
-
如果 this parameter 不为 null,则将 this object 设为 尝试在给定 this parameter、realm 和 session 的情况下 反序列化本地值的结果。
-
令 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 基础 URL。
-
令 options 为默认脚本 fetch 选项。
-
令 function body evaluation status 为使用 function declaration、 environment settings、base URL 和 options 求值函数体的 结果。
-
如果 function body evaluation status.[[Type]] 为
throw: -
令 function object 为 function body evaluation status.[[Value]]。
-
如果 IsCallable(function object) 为
false: -
如果 command parameters["
userActivation"] 为 true,则运行激活通知步骤。 -
使用 environment settings 准备运行脚本。
-
将 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 运行脚本后清理。
-
如果 evaluation status.[[Type]] 为
throw: -
断言:evaluation status.[[Type]] 为
normal。 -
令 result 为使用 evaluation status.[[Value]]、serialization options、result ownership、 一个新的映射作为序列化内部映射、realm 和 session 序列化为 远程值的结果。
-
返回一个新的映射,其匹配
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 执行上下文的 Realm 组件为 realm。
-
令 source 为 command parameters 的
expression字段的值。 -
令 await promise 为 command parameters 的
awaitPromise字段的值。 -
如果存在,则令 serialization options 为 command parameters 的
serializationOptions字段的值, 否则为一个匹配script.SerializationOptions产生式、且字段设为其默认值的映射。 -
如果存在,则令 result ownership 为 command parameters 的
resultOwnership字段的值;否则为none。 -
令 options 为默认脚本 fetch 选项。
-
令 base URL 为 environment settings 的API 基础 URL。
-
令 bypassDisabledScripting 为 true。
-
令 script 为使用 source、 environment settings、base URL、options 和 bypassDisabledScripting 创建经典脚本的结果。
-
如果 command parameters["
userActivation"] 为 true,则运行激活通知步骤。 -
使用 environment settings 准备运行脚本。
-
将 evaluation status 设为 ScriptEvaluation(script 的 record)。
-
如果 evaluation status.[[Type]] 为
normal,await promise 为 true,且 IsPromise(evaluation status.[[Value]]):-
将 evaluation status 设为 Await(evaluation status.[[Value]])。
-
-
使用 environment settings 运行脚本后清理。
-
如果 evaluation status.[[Type]] 为
throw: -
断言:evaluation status.[[Type]] 为
normal。 -
令 result 为使用 evaluation status.[[Value]]、serialization options、result ownership、 一个新的映射作为序列化内部映射、realm 和 session 序列化为 远程值的结果。
-
返回一个新的映射,其匹配
script.EvaluateResultSuccess产生式,且realm字段设为 realm id,result字段设为 result。
7.6.4.5. script.getRealms 命令
script.getRealms 命令返回所有 realm 的列表,可选地过滤为特定类型的 realm,或者过滤为与可导航的活动文档关联的 realm。
- 命令类型
-
script.GetRealms= (method:"script.getRealms",params: script.GetRealmsParameters )script.GetRealmsParameters= { ?context: browsingContext.BrowsingContext, ?type: script.RealmType, } - 返回类型
-
script.GetRealmsResult= {realms: [*script.RealmInfo] }
-
如果 command parameters 包含
context:-
令 document 为 navigable 的活动文档。
-
令 navigable environment settings 为一个列表。
-
对于 environment settings 的每个 settings:
-
如果满足以下任一条件:
-
settings 的相关全局对象的关联
Document是 document -
由 settings 指定的全局对象是一个
WorkerGlobalScope, 且其拥有者集合中有 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 命令移除一个 预加载脚本。
- 命令类型
-
script.RemovePreloadScript= (method:"script.removePreloadScript",params: script.RemovePreloadScriptParameters )script.RemovePreloadScriptParameters= {script: script.PreloadScript } - 返回类型
-
script.RemovePreloadScriptResult= EmptyResult
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 执行上下文的 Realm 组件为 realm。
-
令 related navigables 为给定 environment settings 时获取相关 可导航的结果。
-
如果在给定 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、 一个新的映射作为序列化 内部映射以及 realm 的情况下序列化为远程值的结果。
-
令 source 为使用 realm 获取源的结果。
-
令 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 环境设置 对象、设置 worker 环境设置 对象或设置 worklet 环境设置 对象算法被调用时,在返回该设置 对象之前立即:
-
令 environment settings 为新创建的环境设置对象。
-
令 realm info 为给定 environment settings 时获取 realm info的结果。
-
如果 realm info 为 null,则返回。
-
令 related navigables 为给定 environment settings 时获取相关 可导航的结果。
-
令 body 为一个匹配
script.RealmCreated产生式的映射, 其中params字段设为 realm info。 -
对于在给定 "
script.realmCreated" 和 related navigables 的情况下,事件已启用的会话集合 中的每个 session:-
使用 session 和 body 发出 事件。
-
带有订阅优先级 2,在给定 session、navigables 和 include global 的情况下,远程端订阅步骤如下:
-
对于 environment settings 的每个 settings:
-
令 related navigables 为一个新集合。
-
如果 settings 的相关全局对象的关联
Document是一个Document:-
令 navigable 为 settings 的相关全局对象的 关联
Document的 节点可导航。 -
如果 navigable 为 null,则继续。
-
令 top-level traversible 为 navigable 的顶级可遍历。
-
如果 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 的可导航追加到 related navigables。
-
对于 document 的worklet 全局作用域中的每个 worklet global scope:
-
令 realm 为 worklet global scope 的相关 Realm。
-
令 realm id 为 realm 的realm ID。
-
令 params 为一个匹配
script.RealmDestroyedParameters产生式的映射,其中realm字段设为 realm id。 -
令 body 为一个匹配
script.RealmDestroyed产生式的映射,其中params字段设为 params。 -
对于在给定 "
script.realmDestroyed" 和 related navigables 的情况下,事件已启用的会话集合 中的每个 session:-
使用 session 和 body 发出 事件。
-
-
-
令 environment settings 为环境设置对象,其 相关全局对象的关联
Document是 document。 -
令 realm 为 environment settings 的realm 执行上下文的 Realm 组件。
-
令 realm id 为 realm 的realm ID。
-
令 params 为一个匹配
script.RealmDestroyedParameters产生式的映射, 其中realm字段设为 realm id。 -
令 body 为一个匹配
script.RealmDestroyed产生式的映射, 其中params字段设为 params。 -
对于在给定 "
script.realmDestroyed" 和 related navigables 的情况下,事件已启用的会话集合 中的每个 session:-
使用 session 和 body 发出 事件。
-
每当一个 worker 事件循环 event loop 被销毁时,无论是因为 worker 到达其生命周期末尾,还是通过终止 worker算法提前终止:
-
令 related navigables 为给定 environment settings 时获取相关 可导航的结果。
-
令 realm 为 environment settings 的环境设置对象的 Realm。
-
令 realm id 为 realm 的realm ID。
-
令 params 为一个匹配
script.RealmDestroyedParameters产生式的映射, 其中realm字段设为 realm id。 -
令 body 为一个匹配
script.RealmDestroyed产生式的映射, 其中params字段设为 params。
7.7. storage 模块
storage 模块包含与存储相关的功能和 事件。
存储分区 是一个命名空间,用户代理可以在其中 组织持久数据,例如 cookies 和本地存储。
7.7.1. 定义
StorageCommand = (
storage.DeleteCookies //
storage.GetCookies //
storage.SetCookie
)
StorageResult = (
storage.DeleteCookiesResult /
storage.GetCookiesResult /
storage.SetCookieResult
)
7.7.2. 类型
7.7.2.1. storage.PartitionKey 类型
storage.PartitionKey= { ?userContext: text, ?sourceOrigin: text, Extensible, }
storage.PartitionKey 类型表示一个存储分区键。
以下标准存储分区键 属性表 枚举了具有众所周知含义的属性,远程端 可以 选择支持这些属性。实现可以定义额外的扩展存储分区键属性。
| 属性 | 定义 |
|---|---|
"userContext"
| 一个用户上下文 ID |
"sourceOrigin"
| 可以访问该存储分区的资源的源序列化 |
远程端可以支持任意数量的扩展存储分区键 属性。为了避免与其他实现冲突,这些 属性必须以厂商和用户代理的唯一标识符开头, 后跟 U+003A (:)。
远程端具有一个存储分区 键属性的默认值的映射,其中包含零个或多个条目。每个键都必须是 标准存储分区键 属性表的成员,其中 存储分区 键对应于标准存储分区,或者在其不对应时,是一个 扩展存储分区键属性, 并且值 表示在用户未提供显式值时将使用的该分区键的默认值。 精确的条目由实现定义,并由实现采用的存储分区方式决定。
远程端具有一个必需分区键 属性的列表,其中包含零个或多个条目。每个键都必须是 标准存储分区键 属性表的成员,其中 存储分区 键对应于标准存储分区,或者在其不对应时,是一个 扩展存储分区键属性。 精确的 条目由实现定义,并由实现采用的存储 分区方式决定。此列表仅包含没有可用默认值的分区 键。因此,该列表不得与存储分区 键属性的默认值的键共享任何 条目。
-
令 deserialized filter 为空映射。
-
对于 filter 中的每个 name → value:
-
令 deserialized name 为在 cookie 转换表中与 JSON 键 name 对应的字段名称。
-
如果 name 是 "
value",则将 deserialized value 设为 使用 value 反序列化协议字节的结果, 否则令 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 的成功。
-
-
令 partition key 为空映射。
-
对于存储分区键属性的默认值中的每个 name → default value:
-
对于远端的必需分区键属性中的每个 name:
-
返回带有数据 partition key 的成功。
-
对于 filter 中的每个 name → value:
-
如果 stored cookie[name] 不等于 value:
-
返回 false。
-
-
-
返回 true。
7.7.3. 命令
7.7.3.1. storage.getCookies 命令
storage.getCookies 命令检索零个或多个与一组提供的 参数匹配的 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。 -
令 store 为尝试使用 partition key 获取 cookie 存储的结果。
-
令 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 存储中创建一个新的 cookie, 替换该存储中根据 [COOKIES] 匹配的任何 cookie。
- 命令类型
-
storage.SetCookie= (method:"storage.setCookie",params: storage.SetCookieParameters, )storage.PartialCookie= {name: text,value: network.BytesValue,domain: text, ?path: text, ?httpOnly: bool, ?secure: bool, ?sameSite: network.SameSite, ?expiry: js-uint, Extensible, }storage.SetCookieParameters= {cookie: storage.PartialCookie, ?partition: storage.PartitionDescriptor, } - 返回类型
-
storage.SetCookieResult= {partitionKey: storage.PartitionKey }
-
令 cookie spec 为 command parameters 的
cookie字段的值。 -
如果存在,则令 partition spec 为 command parameters 的
partition字段的值;否则为 null。 -
令 store 为尝试使用 partition key 获取 cookie 存储的结果。
-
令 deserialized value 为使用 cookie spec["
value"] 反序列化协议字节的结果。 -
使用cookie 名称 cookie spec["
name"]、 cookie 值 deserialized value、cookie 域 cookie spec["domain"],以及cookie 转换表中列出的 以下 cookie 概念的属性-值列表,在 store 中创建 cookie:- Cookie 路径
-
如果 cookie spec["
path"] 存在,则为它;否则为 "/"。 - Cookie 仅安全
-
如果 cookie spec["
secure"] 存在,则为它;否则为 false。 - Cookie 仅 HTTP
-
如果 cookie spec["
httpOnly"] 存在,则为它;否则为 false。 - Cookie 到期时间
-
如果 cookie spec["
expiry"] 存在,则为它;否则保持未设置, 以表示这是一个会话 cookie。注:cookie 的到期值 可能会由远程端根据 Cookie 生命周期限制来限制。
- Cookie same site
-
如果 cookie spec["
sameSite"] 存在,则为它;否则保持未设置, 以表示未定义 same site 策略。
如果此步骤在未向 cookie 存储插入 cookie 的情况下中止,则返回 带有错误 码 无法设置 cookie的错误。
-
令 body 为一个匹配
storage.SetCookieResult产生式的映射, 其中partitionKey字段设为 partition key。 -
返回带有数据 body 的成功。
7.7.3.3. storage.deleteCookies 命令
storage.deleteCookies 命令移除零个或多个与一组提供的 参数匹配的 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。 -
令 store 为尝试使用 partition key 获取 cookie 存储的结果。
-
令 cookies 为使用 store 和 filter 获取匹配的 cookies的结果。
-
对于 cookies 中的每个 cookie:
-
从 store 中移除 cookie。
-
-
令 body 为一个匹配
storage.DeleteCookiesResult产生式的映射, 其中partitionKey字段设为 partition key。 -
返回带有数据 body 的成功。
7.8. log 模块
log 模块包含与日志记录相关的功能和事件。
BiDi 会话具有一个日志事件缓冲区,它 是一个从 可导航 ID到该上下文中尚未 发出的日志事件列表的映射。用户代理可以对此缓冲区施加最大大小,但须满足以下条件: 如果事件 A 和 B 发生在同一上下文中,且 A 发生在 B 之前,并且二者都被添加到缓冲区, 则 B 的条目不得在 A 的条目之前被移除。
要在给定 session、navigables 和 event 的情况下缓冲日志 事件:
-
令 buffer 为 session 的日志事件缓冲区。
-
令 navigable ids 为一个新列表。
-
对于 navigables 的每个 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]。
-
注:我们在此存储其他可导航,以便 每个事件只发出 一次。实践中,这只与可以关联到 多个可导航的 worker 有关。
我们是否希望以 浏览上下文还是顶级可遍历作为键? 区别在于,如果事件发生在一个 frame 中,而该 frame 在本地端订阅顶级可导航的日志事件之前发生导航,会出现什么情况。
7.8.1. 定义
LogEvent = (
log.EntryAdded
)
7.8.2. 类型
7.8.2.1. log.LogEntry
log.Level="debug"/"info"/"warn"/"error"log.Entry= ( log.GenericLogEntry / log.ConsoleLogEntry / log.JavascriptLogEntry )log.BaseLogEntry= (level: log.Level,source: script.Source,text: text / null,timestamp: js-uint, ?stackTrace: script.StackTrace, )log.GenericLogEntry= { log.BaseLogEntry,type: text, }log.ConsoleLogEntry= { log.BaseLogEntry,type:"console",method: text,args: [*script.RemoteValue], }log.JavascriptLogEntry= { log.BaseLogEntry,type:"javascript", }
每个日志事件都由一个 log.Entry 对象表示。它具有一个
type 属性,表示所添加日志条目的类型;一个
level 属性,表示严重性;一个 source
属性,表示日志条目的来源;一个 text 属性,
带有日志消息字符串本身;以及一个 timestamp 属性,
对应于日志条目生成的时间。log.Entry 的特定变体
用于表示来自不同来源的日志,并
提供特定于条目类型的附加字段。
7.8.3. 事件
7.8.3.1. log.entryAdded 事件
- 事件类型
-
log.EntryAdded= (method:"log.entryAdded",params: log.Entry, )
远程端事件触发器如下:
定义以下带有 method、args 和 options 的console 步骤:
-
对于活动 BiDi 会话中的每个 session:
-
如果 method 是 "
error" 或 "assert",则令 level 为 "error"。如果 method 是 "debug" 或 "trace", 则令 level 为 "debug"。如果 method 是 "warn",则令 level 为 "warn"。否则令 level 为 "info"。 -
令 timestamp 为一个表示当前 UTC 日期和时间的时间值。
-
令 text 为空字符串。
-
如果 Type(args[0]) 为 String,并且 args[0] 包含一个 格式化说明符,则令 formatted args 为 Formatter(args)。否则 令 formatted args 为 args。
注:console 规范中 formatter 操作的规定不足, 不同实现之间格式化可能不一致。
-
对于 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:
-
令 source 为给定当前 Realm Record 时获取源的结果。
-
令 stack 为当前堆栈跟踪。
-
令 entry 为一个匹配
log.ConsoleLogEntry产生式的映射, 其中level字段设为 level,text字段设为 text,timestamp字段设为 timestamp,stackTrace字段设为 stack,method 字段设为 method,source字段设为 source, 且args字段设为 serialized args。 -
令 body 为一个匹配
log.EntryAdded产生式的映射,其中params字段设为 entry。 -
令 settings 为当前设置对象
-
令 related navigables 为给定 settings 时获取相关 可导航的结果。
-
如果在给定 session、"
log.entryAdded" 和 related navigables 的情况下事件 已启用,则使用 session 和 body 发出事件。否则,使用 session、 related browsing contexts 和 body 缓冲日志事件。
-
定义以下带有实参 script、 line number、column number、message 和 handled 的错误报告步骤:
-
如果 handled 为 true,则返回。
-
令 settings 为 script 的设置对象。
-
令 timestamp 为一个表示当前 UTC 日期和时间的时间值。
-
令 stack 为带有对应于正在报告的错误的 异常时的异常的堆栈跟踪。
-
令 source 为给定当前 Realm Record 时获取源的结果。
-
令 entry 为一个匹配
log.JavascriptLogEntry产生式的映射, 其中level设为 "error",text设为 message,source设为 source,timestamp设为 timestamp,且stackTrace字段设为 stack。 -
令 body 为一个匹配
log.EntryAdded产生式的映射, 其中params字段设为 entry。 -
令 related navigables 为给定 settings 时获取相关 可导航的结果。
-
对于活动 BiDi 会话中的每个 session:
还有更多内容 需要日志记录。CDP 有 LogEntryAdded 类型 xml、 javascript、network、storage、appcache、rendering、security、deprecation、 worker、violation、intervention、recommendation、other。这些是对由不同方法表示的 js 异常和 console API 类型的补充。
带有订阅优先级 10,在给定 session、navigables 和 include global 的情况下,远程端订阅步骤如下:
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 的 Element
步骤:
-
返回以下步骤,给定 origin 和 navigable:
-
断言:origin 匹配
input.ElementOrigin。 -
令 document 为 navigable 的活动文档。
-
令 reference 为 origin["
element"] -
令 environment settings 为环境设置对象,其 相关全局对象的关联
Document是 document。 -
令 realm 为 environment settings 的realm 执行上下文的 Realm 组件。
-
返回带有数据 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
带有 session 和 command parameters 的远程端步骤如下:
-
令 navigable id 为 command parameters 的
context字段的值。 -
令 actions options 为一个新的actions options,其中 is element origin 步骤设为 is input.ElementOrigin,且 get element origin 步骤设为给定 session 时获取来自 input.ElementOrigin 的 Element 步骤的结果。
-
令 actions by tick 为使用 input state、command parameters 和 actions options 提取动作序列的尝试结果。
-
尝试使用 input state、 actions by tick、 navigable 和 actions options 分派动作。
-
返回带有数据 null 的成功。
7.9.3.2. input.releaseActions 命令
input.releaseActions 命令重置与当前会话关联的输入 状态。
- 命令类型
-
input.ReleaseActions= (method:"input.releaseActions",params: input.ReleaseActionsParameters )input.ReleaseActionsParameters= {context: browsingContext.BrowsingContext, } - 返回类型
-
input.ReleaseActionsResult= EmptyResult
给定 session 和 command parameters 的远程端步骤如下:
-
令 navigable id 为 command parameters 的
context字段的值。 -
令 top-level traversable 为 navigable 的顶级可遍历。
-
令 input state 为使用 session 和 top-level traversable 获取输入状态的结果。
-
令 actions options 为一个新的actions options,其中 is element origin 步骤设为 is input.ElementOrigin,且 get element origin 步骤设为给定 session 时获取来自 input.ElementOrigin 的 Element 步骤。
-
令 undo actions 为 input state 的输入取消列表的逆序。
-
尝试使用 undo actions、0、navigable 和 actions options 分派 tick 动作。
-
使用 session 和 top-level traversable 重置输入状态。
-
返回带有数据 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"] 字段的值。 -
令 document 为 navigable 的活动文档。
-
令 environment settings 为环境设置对象,其 相关全局对象的关联
Document是 document。 -
令 realm 为 environment settings 的realm 执行上下文的 Realm 组件。
-
令 element 为尝试使用 command parameters["
element"]、realm 和 session 反序列化远程引用的结果。 -
如果 element 未实现
HTMLInputElement, element 的type不处于文件上传状态,或者 element 被 禁用, 则返回带有错误 码 无法设置文件输入的错误。 -
如果 files 的大小大于 1,且 element 的
multiple属性未设置,则返回带有错误码 无法设置文件输入的错误。 -
令 files 为 command parameters["
files"] 字段的值。 -
令 selected files 为 element 的已选文件。
-
如果 files 和 selected files 的交集的大小等于 selected files 的大小,并且等于 files 的 大小,则在用户交互任务源上,给定 element, 排入一个元素任务,以在 element 上触发一个名为
cancel的事件, 其bubbles属性初始化为 true。注:浏览器中的取消通常 由文件选择的变化来确定。换言之,如果没有变化,则会发送一个 "
cancel" 事件。 -
否则,使用 files 作为用户的选择,更新文件选择。
-
如果由于任何原因,远程端无法将 element 的已选文件设置为 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 文件选择器选项是一个结构体,具有一个名为 multiple 的项,其为 boolean。
注:不同于其他用户提示处理器,默认 行为是允许打开文件对话框。
-
令 navigable id 为 navigable 的可导航 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 获取 节点的共享 ID。
-
将 params["
element"] 设为 shared id。
-
-
令 body 为一个匹配
input.fileDialogOpened产生式的映射,其中params字段设为 params。 -
使用 session 和 body 发出 事件。
-
-
令 dismissed 为 false。
-
对于活动 BiDi 会话中的每个 session:
-
令 user prompt handler 为 session 的用户提示处理器。
-
如果 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 }
-
令 type 为 extension data spec["
type"]。 -
在以下条件及关联步骤列表中,运行首个关联条件为 true 的步骤集:
- type 是字符串 "
path" - type 是字符串 "
archivePath" - type 是字符串 "
base64" -
-
令 bytes 为对 extension data spec["
value"] 进行 forgiving-base64 解码的结果。 -
如果 bytes 为 failure,则返回 null。
-
- type 是字符串 "
-
返回 entry。
-
令 extension data spec 为 command parameters["
extensionData"]。 -
令 extension directory entry 为尝试使用 extension data spec 展开 Web 扩展数据规范的结果。
-
执行由实现定义的步骤,从 extension directory entry 安装 Web 扩展。如果这失败,则返回带有错误码 无效 Web 扩展的错误。否则令 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
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 模块: