Firefox 121 的开发者说明
==================

本文提供了有关 Firefox 121 中影响开发者的变更信息。Firefox 121 于 2023 年 12 月 19 日发布。

为 Web 开发者带来的变化
--------------

### HTML

* `<iframe>` 现已支持懒加载，这允许开发者提示特定的 `<iframe>` 仅在可见时才进行加载。这可以减少页面加载时需要获取的资源（某些 `<iframe>` 可能根本不需要获取）以加快初始加载的时间。提示可以通过 `<iframe>` 元素上的 `loading` 属性或 JavaScript 中的 `HTMLIFrameElement.loading` (en-US) 属性提供。（Firefox bug 1622090）。
### CSS

* 已更新 `text-wrap` (en-US) 属性，添加了对 `balance` 和 `stable` 值的支持。`balance` 值用于短的内容块（例如标题），它将确保内容在多行上分布时平衡且易于阅读。`stable` 值确保可编辑的内容在用户编辑时不会被重排（Firefox bug 1731541）。
* 现已支持 `:has()` 选择器（通常被称为*父选择器*）。它允许开发者根据相关联的元素为某个元素应用样式，例如，`li:has(ul)` 将匹配包含子列表的列表，`h1:has(+ p)` 将匹配后面紧跟段落的标题。
* 现已支持 `text-indent` CSS 属性的 `each-line` 和 `hanging` 属性值（Firefox bug 784648），以允许开发者更轻松地指定某些文本缩进样式。此外，开发者现在可以结合多个 `text-indent` 属性值以产生更多创意，例如 `text-indent: 3em hanging each-line`。
### JavaScript

* 现已支持 `Promise.withResolvers()` 静态方法。该方法将 `resolve` 和 `reject` 回调函数暴露在与返回的 `Promise` 相同的作用域中，允许在其构造之后定义兑现或拒绝该 promise 的代码（Firefox bug 1845586）。
* `Date.parse()` 现在接受几种额外的日期格式：
    + 年份大于 9999 的 `YYYY-MMM-DD` 格式（例如 `19999-Jan-01`）（Firefox bug 1858851）
    + `MMM-DD-YYYY` 格式（例如 `Jan-01-1970`）（Firefox bug 1863489）
    + 非 ISO 日期格式的毫秒值（例如 `Jan 1 1970 10:00:00.050`）（Firefox bug 1863125）
    + 现在会忽略格式开头的星期，例如：
        - `Wed, 1970-01-01`
        - `Wed, 1970-Jan-01`星期不需要是正确的，或者根本不是星期几；例如，`foo 1970-01-01` 也是有效的（Firefox bug 1617562）。
* 其他 `Date.parse()` 的修复：
    + `YYYY-M-DD` 和 `YYYY-MM-D` 不再被假定为 GMT，就像 ISO 日期 `YYYY-MM-DD` 一样（Firefox bug 1783731）。
    + 所有格式的毫秒值都被截断为 3 位数，而不是进行四舍五入（Firefox bug 746529）。
### API

* 现已支持 `WebTransportSendStream` (en-US) 接口的 `sendOrder` (en-US) 属性，其允许在创建流之后读取和更改传出的 WebTransport API (en-US) 的*双向*流的相对优先级。请注意，这不能用于修改单向流的优先级，因为 Firefox 将其实现为 `WritableStream` 而不是 `WebTransportSendStream` (en-US)。（有关更多信息，请参阅 Firefox bug 1853444。）
### WebAssembly

* WebAssembly 现已支持尾调用优化，使用新的 `return_call` 和 `return_call_indirect` 替代 `call` (en-US) 指令。这提高了性能，减少了堆栈空间的使用，并增强了与使用尾调用的编程语言的兼容性。（Firefox bug 1858855）。
### WebDriver 一致性（WebDriver BiDi、Marionette）

#### WebDriver BiDi

* 添加了 `browsingContext.contextDestroyed` 事件，该事件在丢弃浏览上下文时触发（Firefox bug 1694390）。
* 添加了对 `script.callFunction` 和 `script.evaluate` 命令的 `userActivation` 参数的支持，该参数允许在模拟用户操作时执行 JavaScript。（Firefox bug 1845488）。
* 添加了对 `browsingContext.userPromptOpened` 事件的 `defaultValue` 字段的支持，该字段允许用户检索提示的默认值（Firefox bug 1851761）。
* 将 `browsingContext.captureScreenshot` 命令的 `viewportOptions` 参数重命名为 `boxOptions`（Firefox bug 1859258）。
* 移除了 `browsingContext.captureScreenshot` 命令的 `scrollIntoView` 参数，其已被下面的 `origin` 参数取代（Firefox bug 1862649）。
* 添加了对 `browsingContext.captureScreenshot` 命令的 `origin` 参数的支持，该参数允许定义屏幕截图的原点和边界。接受的值为 `"document"` 和 `"viewport"`（Firefox bug 1840999）。
* 在序列化 `Window` 对象时，序列化后的值现包含 `context` 属性，该属性被设置为 `Window` 对象的上下文 id，该 id 也可以与 Marionette 交换以引用特定的窗口和框架（Firefox bug 1841049）。
* 修复了嵌套在数据结构（数组、映射等）中的节点（Node）的序列化失败的错误（Firefox bug 1861000）。
* 修复了 `browsingContext.navigate` 命令会返回不正确的导航 id 的错误（Firefox bug 1861655）。

#### Marionette

* 添加了对 `Window` 和 `Frame` 对象的序列化和反序列化的支持（Firefox bug 1274251）。
实验性 Web 特性
----------

以下特性是在 Firefox 121 中新推出的，但默认情况下处于禁用状态。要尝试这些特性，请在 `about:config` 页面上搜索相应的首选项并将其设置为 `true`。你可以在实验性特性页面上找到更多此类特性。

自定义元素状态伪类：`dom.element.customstateset.enabled`

自定义元素可以通过 `states` (en-US) 属性将其内部状态暴露为 `CustomStateSet` (en-US)。CSS 自定义状态伪类（例如 `:--somestate`）可以匹配该元素的状态。（Firefox bug 1861466）

HTML select 元素的 `showPicker()` 方法：`dom.select.showPicker.enabled`

`HTMLSelectElement.showPicker()` (en-US) 方法以编程方式运行浏览器用于 `<select>` 元素的选择器，该方法需要由用户交互触发。（Firefox bug 1854112）

为附加组件开发者带来的变化
-------------

* 修复了当 manifest.json 的 `background` 键包含 `service_worker` 和 `scripts` 声明时会导致后台页面无法启动的错误（Firefox bug 1860304）。

**备注：** 顺便说一下，Chrome 121 中的更改会导致在指定了 `service_worker` 属性时忽略 `scripts` 属性。以前，Chrome 拒绝加载同时包含这两个属性的扩展（Chromium bug 1418934）。有关更多信息，请参阅清单 `background` 键的浏览器支持。
更早期的版本
------

* Firefox 120 for developers
* Firefox 119 for developers
* Firefox 118 for developers (en-US)
* Firefox 117 for developers (en-US)
* Firefox 116 for developers (en-US)
* Firefox 115 for developers (en-US)
* Firefox 114 for developers (en-US)
* Firefox 113 for developers (en-US)
* Firefox 112 for developers (en-US)
* Firefox 111 for developers (en-US)
* Firefox 110 for developers (en-US)
* Firefox 109 for developers (en-US)
* Firefox 108 for developers (en-US)
* Firefox 107 for developers (en-US)
* Firefox 106 for developers (en-US)
* Firefox 105 for developers (en-US)
* Firefox 104 for developers (en-US)
* Firefox 103 for developers (en-US)
* Firefox 102 for developers (en-US)
* Firefox 101 for developers (en-US)
* Firefox 100 for developers (en-US)
* Firefox 99 for developers (en-US)
* Firefox 98 for developers (en-US)
* Firefox 97 for developers (en-US)
* Firefox 96 for developers (en-US)
* Firefox 95 for developers (en-US)
* Firefox 94 for developers (en-US)
* Firefox 93 for developers (en-US)
* Firefox 92 for developers (en-US)
* Firefox 91 for developers (en-US)
* Firefox 90 for developers (en-US)