Safari 18.4 中的 WebKit 功能

Safari 18.4 来了!它包含了 84 个新功能,其中包括一个全新的声明式 Web 推送通知发送机制,大量的 CSS 功能(包括全新的 shape() 函数),HTML 颜色选择器支持 P3 和半透明,更强大的媒体录制格式支持,新的 Web API(包括现代的弹窗操作),新的 JavaScript 功能(如迭代器),在响应式设计模式中更快地跳转到设备视口预设,新的 Web 扩展 API,对 WKWebView 的改进,以及网络、存储和连接安全方面的增强——还有更多内容。

今年冬天,我们的许多重点都放在了提高现有 Web 平台功能的质量和完善度上,目标是大幅提高兼容性。适用于 Safari 18.4 的 WebKit 包含了 184 个已解决的问题和 13 项旧技术的弃用。

如果您过去在使用 WebKit 或 Safari 时遇到支持问题,请使用适用于 Safari 18.4 的 WebKit 再次测试。您可以随时在 bugs.webkit.org 上提交关于 WebKit 的问题。或者,如果问题涉及堆栈深层的技术,请通过 反馈助手 提交 系统诊断报告,以提供有关操作系统本身如何受到影响的信息。如果您遇到网站未能按预期工作的情况,请在 webcompat.com 提交报告,我们的团队将进行调查。提交问题确实能带来改变。您可以随时联系我们的 Web 推广人员:Jen Simmons 在 Bluesky / Mastodon,Saron Yitbarek 在 BlueSky,或 Jon Davis 在 Bluesky / Mastodon

以下是 Safari 18.4 中 WebKit 新增功能概览。

声明式 Web 推送

通过推送通知触达用户是任何现代计算平台强大而重要的一部分。2013 年,OS X 10.9 Mavericks 上的 Safari 7 首次增加了 Safari 推送功能,使网站能够首次在网络上发送推送通知。我们了解了网站如何使用此功能以及用户对此的反应。

其他浏览器也渴望将推送通知添加到 Web。Service Worker API 的发展与 Push API、Notifications API 和 RFC 8030 的发展同时进行。这四者结合成了我们现在所称的 Web 推送。Chrome 于 2015 年首次支持这些标准,Firefox 于 2016 年支持。

多年来,Apple 的 Safari 团队持续改进 Safari 推送,进一步了解其功耗、隐私及其潜在的滥用。Apple 的 WebKit 团队密切关注 Web 推送标准的部署,然后有意识地决定以保护隐私和节约功耗的方式实施这些标准。该实施方案首先在 macOS 上的 Safari 16.1 中提供了 Web 推送,随后又支持了 iOS 和 iPadOS 16.4 上的 Web 应用

Web 推送标准从一开始就要求 Service Worker,就像 Chromium 浏览器中的 Web 应用要求 Service Worker 一样。与使用声明式模型的原始 Safari 推送相比,要求 Service Worker 为 Web 开发人员增加了额外的复杂性。它还对系统提出了更高的要求——消耗额外的电池和 CPU 资源——并为潜在的滥用打开了大门。就像在 Safari 中创建的 Web 应用在 iOS、iPadOS 或 macOS 上从未要求 Service Worker 一样,我们希望 Web 平台能够拥有声明式推送通知,无需 Service Worker 即可即时显示。

在过去的几年里,我们一直在研究一种新的 Web 推送通知技术——声明式 Web 推送。请在了解声明式 Web 推送中全面了解我们如何设计和实现它。

声明式 Web 推送现已在 iOS 和 iPadOS 18.4 上针对添加到主屏幕的 Web 应用提供。

CSS

Shape 函数

对于将图像或视频裁剪为特定形状等复杂的图形效果,开发者通常会求助于 CSS 遮罩,以确保遮罩能够适应被遮罩内容的大小和宽高比。使用 clip-path 属性曾存在问题,因为指定复杂形状的唯一方法是使用 path() 函数,该函数接受 SVG 样式路径,而这些路径中的值没有单位;它们仅被视为 CSS 像素。因此无法指定一个能响应被裁剪元素的路径。

Safari 18.4 中 WebKit 新增的 CSS shape() 函数解决了这些缺点。shape() 函数是 CSS 基本形状系列 的一个新成员,它提供了一种将 SVG 样式路径描述为使用 CSS 单位的路径命令列表的方式。例如,要创建这个简单形状:

Solid blue baseball diamond shape

我们可以使用这种样式

clip-path: shape(from right center,
line to bottom center,
arc to top center of 50% 50% cw,
line to right center);

Details 样式

Safari 18.4 的 WebKit 增加了对 <details><summary> 元素使用体验的几项改进,持续缓慢推进此功能的显著提升。如果您过去因为限制而避开它,现在应该再试一次。近年来 Web 标准不断发展,所有浏览器都在作为 Interop 2025 的一部分改进支持。

首先,新增支持::details-content 伪元素。您可以使用此伪元素仅选择在 details 元素打开时出现的内容,以便对其进行独立样式设置。

在支持的浏览器中尝试此演示

这也意味着您首次可以为这个容器的高度添加动画,解决了之前需要 JavaScript 或内容周围额外容器的长期存在的问题。

此外,Safari 18.4 的 WebKit 将 <details></details><summary> 的展开/折叠三角重新实现为列表项。这意味着您现在可以轻松地更改所使用的字符,例如:summary { list-style: "+ "; },并使用::marker 伪元素进一步自定义其样式。

这些更改使 <details><summary> 现代化,使得可以使用此 HTML 而不是从头开始使用 JavaScript 构建自定义控件。这对于您来说更快、更简单,并确保您的结果具有正确的语义和对辅助技术用户的全面支持。

横向书写模式

CSS 中的书写模式支持各种书写语言的布局方向。其核心是,writing-mode 属性在行内方向上切换文本流的水平或垂直布局,并确定块堆叠的方向。Safari 自 2011 年以来就支持 writing-mode: horizontal-tbvertical-rlvertical-lr(在 2017 年 3 月之前带有前缀)。现在,Safari 18.4 的 WebKit 增加了对 writing-mode: sideways-rlwriting-mode: sideways-lr 的支持。

横向书写模式与垂直书写模式非常相似,但并不完全相同。它们旨在用于通常水平排版的文本,作为图形设计效果垂直显示。请注意下面的演示中,CJK 字符在 sideways-*vertical-* 中的渲染差异。当意图是将典型的水平文本横向排版时,使用 sideways-rl 而不是 vertical-rl 可确保标点符号和其他方向中性字符为当前目的正确排版。它还以不同的方式处理文本基线。使用 sideways-lr 而不是 vertical-lr 会产生完全不同的结果。深入研究此示例以了解更多信息,包括切换以查看文本换行的差异。

支持的浏览器中尝试此演示

文本自动间距

Safari 18.4 的 WebKit 新增了对全新 text-autospace 属性的支持,该属性在脚本转换时自动引入额外空间,以提供视觉上的“呼吸空间”。在很久以前,中文和日文纯粹使用源自古汉字的本土书写系统。但在现代排版中,它们自由地混合了西方数字和字母。当文字紧密排列时,传统字符与新引入的外国字符之间的界限会显得拥挤,因此现代排版惯例采用了在这些边界处插入少量额外空间的做法。通过 text-autospace 属性,浏览器会在检测到脚本转换时自动插入这些额外空间。

值选项包括

  • ideograph-alpha 在 CJK 和非 CJK 字母之间创建额外间距。
  • ideograph-numeric 在 CJK 和非 CJK 数字之间创建额外间距。
  • normal 同时执行 ideograph-alphaideograph-numeric
  • no-autospace 不插入任何空间。

支持的浏览器中尝试此演示

WebKit 默认使用 text-autospace: no-autospace 以匹配旧版(目前所有)浏览器的当前默认行为。CSS 规范要求浏览器将默认值切换为 text-autospace: normal — 自动为 Web 上的所有 CJK 内容应用更好的间距,无论网站何时创建。

我们尚未切换到新的默认行为。在 Safari 18.4 中使用 text-autospace 让您的内容采用新的间距,并进行测试。如果您对实现有任何想法,请在 bugs.webkit.org 提交问题。我们希望在更改默认设置之前确保我们的实现经过充分测试。

视图过渡

去年 12 月,Safari 18.2 增加了对 view-transition-name: auto 的支持,如果您在单个页面上对内容应用过渡效果,这可以避免单独命名数百个不同的内容项。使用 auto 时,首先检查过渡期间 id 是否相同,如果 id 不存在,则直接检查过渡期间元素是否相同。

在 Safari 18.4 的 WebKit 中,我们增加了对 view-transition-name: match-element 的支持,它只检查过渡期间元素是否相同。这只能用于单页视图过渡,而 auto 可以通过匹配 id 属性用于多页视图过渡。

更多 CSS 更新

Safari 18.4 的 WebKit 还增加了对更多 CSS 功能的支持

  • 只有一个停止点的渐变
  • attr() 内部的后备值,例如 — attr(data-count, "0")
  • unicode-bidi 文本渲染 UA 规则(ruby 元素除外)

并且非标准的 CSSUnknownRule 接口已被移除。

HTML

现在,Safari 18.4 的 WebKit 增强了 <input type="color"> 以支持 alphacolorspace 属性。这意味着您现在可以为用户提供从 Display P3 色彩空间中选择颜色的机会,和/或使用 <input type="color" colorspace="display-p3" alpha> 调整所选颜色的不透明度。

您还可以在 <input type="color" /> 控件的 value 属性中使用任何受支持的 CSS 颜色语法,它将根据 colorspace 属性正确转换。

The color picker showcasing the opacity and color wheel

WebKit 团队还与 WHATWG 社区合作,将这些颜色选择器增强功能标准化到 HTML 标准中。

Safari 18.4 的 WebKit 为 <input type="file" /> 元素上的webkitdirectory 属性增加了 iOS 支持。当调用带有该属性的文件输入时,文档选择器会立即显示,非目录项会变灰。从该文档选择器中,可以通过导航到目标目录并按下“打开”来上传目录。

Safari 18.4 的 WebKit 已移除对 <img> 元素上 composite 属性的支持。它最初于 2004 年 4 月添加,用于在现已停用的 macOS Dashboard 功能上下文中支持图像合成操作(组合两张图像以创建效果)。此属性不再需要,可以安全移除。

Web Inspector

Safari 18.4 的响应式设计模式允许您从设备视口尺寸预设列表中选择,以快速测试网页布局。预设可以旋转以适应纵向和横向方向。视口尺寸预设可以很好地近似您的网页将如何受到视口尺寸的影响,但它们不代表实际设备上体验到的精确布局、渲染和行为。例如,设备上的页面布局可能会受到浏览器地址栏或屏幕键盘的影响。要获得高保真预览,请使用“通过模拟器打开”菜单在设备模拟器上检查网页。

Screenshot of the top section of webkit.org viewed in Responsive Design Mode

如果您在 macOS、iOS、iPadOS、visionOS、watchOS 或 tvOS 应用中使用 JSContext,则可以使用 Safari Web Inspector 对其进行调试。有时,您需要在 JSContext 运行之前自动检查并暂停脚本执行,以便设置断点并手动单步调试代码。在 Safari 18.4 之前,您只能为整个设备配置这些选项,这可能导致中断,因为来自其他应用的 JSContext 也会被自动检查。从 Safari 18.4 开始,您可以仅为您的应用配置 JSContext 的自动检查和暂停。

“开发”菜单中的新“检查应用和设备”菜单项会打开一个窗口,其中列出了所有连接的设备和当前正在运行的、具有可检查内容(例如网页、Service Worker、JSContextWKWebView 和 Web 扩展后台页面)的应用。列表中的每个应用旁边都有一个三点菜单,其中显示了仅针对该应用配置 JSContext 自动检查和暂停的选项。这些设置适用于该应用创建的任何新 JSContext。如果您想要自动检查的 JSContext 是在应用启动时创建的,则需要重新启动应用才能看到效果。

Screenshot of the Apps and Devices Inspection menu showing devices on the left panel and apps in the primary panel

您可以使用请求本地覆盖功能,在本地覆盖配置弹窗中勾选“包含原始请求数据”复选框,为匹配特定 URL 的请求添加或更改标头,而无需修改任何其他数据。任何新增或更改的标头都将补充请求标头。从 Safari 18.4 开始,您可以为“方法”选择器选择“直通”选项,以将覆盖应用于任何 HTTP 方法。

Screenshot of thethe Sources panel in Web Inspector open to the Local Overrides section and towing the Request Override form for webkit.org

用户代理字符串覆盖列表现在包含 Android 选项。您可以从 Safari“开发”菜单中的“用户代理”子菜单为当前打开的页面应用覆盖。在连接的设备或模拟器上远程检查网页时,您可以在设备设置弹出窗口中找到用户代理字符串覆盖。

Web Inspector 控制台 API 中的 console.screenshot 方法现在支持提供 DOMRect 作为参数,以捕获网页的精确区域的屏幕截图。

您可以从现有 DOM 节点获取 DOMRect

console.screenshot(document.querySelector("#testNode").getBoundingClientRect())

或者您可以定义一个具有自定义值的 DOMRect

console.screenshot(new DOMRect(0, 0, 800, 600))

Web Inspector 现在支持来自官方源映射规范ignoreList 字段。生成源映射的工具可以使用此字段来识别可以忽略的源,例如框架代码或打包器生成的代码,以减轻开发人员调试其自身代码时的认知负担。

“存储”选项卡中的“Cookie”表格视图现在可以配置为显示分区 Cookie 的 Cookie 分区键列。

媒体

Safari 18.4 的 WebKit 新增了对 Image Capture API 的支持。它通过 MediaStream Image Capture API 提供了一种从相机或其他照相设备捕获图像或照片的方式。

作为我们改进 Web 兼容性工作的一部分,Safari 18.4 的 WebKit 中的 MediaRecorder 现在支持使用 Opus 音频编解码器以及 VP8 或 VP9 视频编解码器创建 WebM 文件。

这使得录制音频的 Web 应用(包括流行的播客应用)可以通过 MediaRecorder API 保存 WebM 文件。

只需通过指定 mimeType 来创建您的 MediaRecorder,如下所示

const recorder = new MediaRecorder(stream, { mimeType : 'video/webm' });

您也可以指定要使用的编解码器

const video = await navigator.mediaDevices.getUserMedia({
    audio: true,
    video: true,
});

const recorder = new MediaRecorder(video, {
    mimeType: "video/mp4; codecs=avc1.42000a,opus",
});

此外,它现在可以创建 ISOBMFF(分片 MP4)文件,这些文件可以轻松与 Media Source Extensions 的 SourceBuffer 一起使用。MediaRecorder 还可以生成 ALAC 或 PCM 格式的高质量无损音频轨道。我们还增加了对 H264、HEVC 和 AV1 视频轨道(适用于支持 AV1 硬件的设备)的支持。

Safari 18.4 的 WebKit 通过在 macOS Sequoia 15.4、iOS 18.4、iPadOS 18.4 和 visionOS 2.4 上为 OpusVorbis 音频添加 Ogg 容器支持,完善了我们对媒体格式的支持。

WebRTC

Safari 18.4 的 WebKit 增加了对 MediaSession 捕获静音 API 的 WebRTC 支持

  • 网页可以在一个中心位置检测用户是否通过特定的操作静音/取消静音摄像头/麦克风/屏幕共享捕获
  • 网页可以通过专用的方法请求捕获静音/取消静音。取消静音需要用户激活,如果静音是由网页完成的,则不会触发用户提示。

Safari 18.4 的 WebKit 在 macOS 上增加了扬声器选择 API

  • 授予麦克风访问权限后,扬声器可以被枚举
  • 使用 HTMLMediaElement 渲染的音频可以通过 setSinkId 路由到特定扬声器。

SVG

Safari 18.4 的 WebKit 中对 SVG 有一些更新。

SVG 内部新增了对 lhch 单位的支持。请注意,对 ch 的支持不包括对直立垂直字符宽度的支持。

现在支持 SVGImageElement.prototype.decode(),以帮助您在等待下载和解码 SVG 图像时避免出现空白图像。

此外,Safari 18.4 的 WebKit 移除了对 SVG 1.1 kerning 属性和 SVGDocument 到 XMLDocument 别名的支持。

Web API

屏幕唤醒锁定 API 现在也适用于 iOS 和 iPadOS 18.4 上的主屏幕 Web 应用。这允许您防止设备屏幕变暗和锁定。它特别适用于食谱应用等使用场景,当用户仍在阅读但未触摸屏幕时。

Safari 18.4 的 WebKit 新增了 dialog.requestClose() 方法。使用它来请求关闭一个 <dialog>。它与其他方法的不同之处在于,它会在触发 close 事件并关闭对话框之前触发一个 cancel 事件。

Safari 18.4 的 WebKit 增加了通过 showPopover()togglePopover() 方法以命令式 API 为 popover 设置调用者的选项。例如:

element.showPopover({ source: document.querySelector("#menu-button") })

Safari 18.4 的 WebKit 中新增了 Cookie Store API,这是一个用于管理 Cookie 并获取更改通知的异步 API。出于隐私考虑,这个新 API 只暴露了 Cookie 的“name”和“value”属性——就像 document.cookie 一样。更改事件已为窗口实现,但由于规范中的歧义,尚未为 Service Worker 实现。

压缩流现在支持使用 Brotli 格式压缩和解压缩数据。与 Deflate 相比,这可能会根据特定数据在性能和压缩大小方面提供显著改进。开发者只需将 CompressionStreams 构造函数更新为 brotli 即可利用这一新功能。

Safari 18.4 的 WebKit 增加了对 Web 加密 X25519 的支持,允许在 SubtleCrypto 接口中访问 deriveBits、deriveKey、exportKey、generateKey 和 importKey。这提供了更好的安全性,并减少了对外部库的依赖,从而获得安全曲线的优势。

现在通过 CryptoKit 实现支持 CryptoKeyOKP(x25519/ed25519) 的密钥生成、导入和导出,允许在密码学中使用 Curve25519。

Safari 18.4 的 WebKit 支持 element.focus({ focusVisible: true }),提供了对焦点处理过程的新控制。这允许开发人员通过编程方式控制元素的可见焦点指示器,强制其可见或阻止其可见,而不是完全依赖用户代理。

Safari 18.4 的 WebKit 增加了对 PublicKeyCredential.parseCreationOptionsFromJSON()PublicKeyCredential.parseRequestOptionsFromJSON()PublicKeyCredential.toJSON() 方法的支持。这为 Web 开发人员提供了一种简单的方法,用于在客户端和服务器之间序列化 Web 认证请求和响应对象。

Safari 18.4 的 WebKit 增加了对“滚动到文本片段”功能检测的支持,使用 document.fragmentDirective。这允许您通过检查对象的存在来测试您的浏览器是否支持文本片段。

Safari 18.4 的 WebKit 移除了对 <input type="number" /> 元素内置 wheel 事件 处理的支持。其行为与 Apple 平台上的等效控件不符,并给最终用户造成困惑。Web 开发人员经常寻求禁用它,或会无意中启用它。

JavaScript

迭代器

Safari 18.4 的 WebKit 增加了对 Iterator Helpers 提案中几个新功能的支持。当处理大量数据时,可能无法一次性将所有数据放入内存,例如在数组中。使用迭代器辅助函数,数据被惰性处理,因此不必同时全部存在于内存中。

例如,《八十天环游世界》是儒勒·凡尔纳的一部法国小说。主人公菲利亚斯·福格打赌他能在不超过 80 天内环游世界。以下是菲利亚斯·福格将经过的城市:

function* cities() {
yield "London (UK)";
yield "Suez (Egypt)";
yield "Bombay (India)";
yield "Calcutta (India)";
yield "Victoria (Hong-Kong)";
yield "Singapore (Singapore)";
yield "Yokohama (Japan)";
yield "San Francisco (USA)";
yield "New-York (USA)";
yield "London (UK)";
// If Phileas went to every city in the world this list would be very long.
}

我们可以通过调用 cities 生成器函数来创建一个迭代器。对于其他可迭代数据结构,如 MapSetArray,我们可以使用 Iterator.from

let citiesIter = cities();

let otherCitiesIter = Iterator.from(["London (UK)", "Suez (Egypt)", "Bombay (India)"]);

要遍历迭代器,我们可以调用 next()

citiesIter.next(); // < {value: "London (UK)", done: false}
citiesIter.next(); // < {value: "Suez (Egypt)", done: false}
citiesIter.next(); // < {value: "Bombay (India)", done: false} // etc. 

如我们所见,我们可以逐一遍历这些城市。如果想从头开始重新遍历,我们只需创建一个新的迭代器。

citiesIter = cities(); 

让我们创建函数来检查一个城市是在印度还是法国

isCityInIndia = (x) => x.includes("India");
isCityInFrance = (x) => x.includes("France");

iterator.some() 方法将检查迭代器中的某些元素是否满足特定条件

citiesIter.some(isCityInIndia);

它将返回 true,因为一些城市在印度。

让我们再次创建一个新的迭代器,并检查法国的城市

citiesIter.some(isCityInFrance);

正如预期的那样,它返回 false,因为这些城市都不在法国。

Iterator.every() 方法检查迭代器中的所有元素是否符合指定条件。

citiesIter.every(isCityInIndia);

它将返回false。确实,并非迭代器中的所有城市都在印度。

Iterator.filter() 方法返回一个新的迭代器,其元素符合我们的条件。

citiesIter.filter(isCityInIndia);
// Iterator.from(["Bombay (India)", "Calcutta (India)"]);

迭代器辅助函数最棒的一点是它们可以组合使用。假设我们想知道菲利亚斯在他的旅程中在印度访问了多少地方。我们可以对我们 filter 过的迭代器使用 reduce 函数来得到答案。

cities().filter(isCityInIndia).reduce((count, city) => count + 1, 0);
// 2

Iterator.map() 方法在调用 .next() 时,将函数应用于迭代器返回的每个元素。

citiesIter = cities();
// here we create a function modifying the element returned by `next()`.
travelDone = (x); "Travel to " + x + ": done!";
let citiesDone = citiesIter.map(travelDone);
citiesDone.next();
// {value: "Travel to London (UK): done!", done: false}
citiesDone.next();
// {value: "Travel to Suez (Egypt): done!", done: false}
// etc.

这些是 Safari 中新增方法的一些示例。请花时间探索其他方法:some()every()find()map()filter()take()drop()flatMap()toArray()forEach()reduce()

JSON 解析

WebKit 使用 JSON 中的 SIMDe 提高了解析性能,实现了 JSON.parse 中字符串的快速扫描,以及 JSON.stringify 中字符串的快速扫描和复制。SIMD(单指令多数据)在处理大量数据上的计算时非常实用,其中每个数据元素都接收相同的指令。

改进的错误检测

Safari 18.4 的 WebKit 支持 Error.isError,用于在一个 Symbol.toStringTag 导致无法可靠测试 Error 实例内部插槽的世界中识别“真实”的原生错误。它使得错误对象能够被规范化,而不是仅仅依赖于字符串。

try {
  throw "Oops; this is not an Error object. Just a string.";
} catch (e) {
  // test if it's not an error
  if (!Error.isError(e)) {
    // make it a real error
    e = new Error(e);
  }
  console.error(e.message);
}

更多

WebKit 还允许使用自旋等待循环的程序通过实现 Atomics.pause 来向 CPU 提供一个提示,表明它正在等待一个值并且仍在自旋。

Canvas

Safari 18.4 的 WebKit 为 CanvasRenderingContext2D 增加了无前缀的 letterSpacingwordSpacing 支持。这使得您在 2D canvas 中绘制文本时可以指定单词和字母之间的间距,而无需 -webkit 前缀。

并已移除对三项过时技术的支持,以提高互操作性和兼容性

  • webKitBackingStorePixelRatio
  • 带前缀的 webkitImageSmoothingEnabled — 请改用标准 imageSmoothingEnabled 属性
  • Canvas Compositing 的非标准遗留别名,包括 setAlphasetCompositeOperation

编辑

Safari 18.4 的 WebKit 增加了对 ClipboardItem.supports() 的支持。当 Web 应用程序需要将内容放置到操作系统的剪贴板时,预先了解剪贴板是否支持该格式非常有用。默认情况下,浏览器支持 text/plaintext/htmlimage/png

  • 这提供了检查是否支持其他格式的能力。当格式不受支持时,它将返回 false,并避免显示错误消息。
  • 它还增加了 text/uri-list,这是 Safari 支持的一种格式,在共享 URL 列表时很有用。

它还通过为使用空数组的新 ClipboardItem() 发送 TypeError 来提高互操作性。

此外,Safari 18.4 的 WebKit 修复了 document.execCommand("copy"),使其即使在没有选中任何文本的情况下也能触发。

加载

借助 Safari 18.4,WebKit 现在支持 跨源开启者策略 (COOP) 中的 noopener-allow-popups。这会断开开启者与加载了其策略的文档之间的关系,但如果其他文档的 COOP 策略允许,仍然允许该文档打开其他文档。

WebAssembly

Safari 18.4 的 WebKit 支持在禁用即时编译 (JIT) 的情况下运行 Wasm。这意味着 Safari 仍然可以在禁用 JIT 编译的环境中运行 Wasm,以提高系统安全性。

还支持新的 Wasm 异常规范。异常处理允许代码在抛出异常时中断控制流。新规范提供了一种机制,既允许 Wasm 代码处理 JavaScript 异常,也允许抛出自己的异常。此新规范取代了旧版提案,WebKit 自 Safari 15.2 以来一直支持该提案,并将继续支持以保持兼容性。

Safari 18.4 的 WebKit 增加了对 relaxed_laneselect SIMD 指令的支持,这意味着当掩码的**所有**位都设置或未设置时,它的行为将类似于按位选择 SIMD 指令。否则,如果掩码具有不同的值,则实现可以使用底层架构来选择宽松指令的行为。

Web 扩展

浏览器 Web 扩展 API

WebKit 在 iOS 18.4、iPadOS 18.4、visionOS 2.4 和 macOS Sequoia 15.4 上增加了对使用一组简单的 Swift 和 Objective-C API 将 Web 扩展集成到基于 WebKit 的浏览器的支持。通过新的 WKWebExtensionWKWebExtensionContextWKWebExtensionController 类,浏览器可以集成 Web 扩展,从而让用户能够自定义其浏览体验。将 Web 扩展集成到 WebKit 中,使所有基于 WebKit 的浏览器能够统一实现,确保它们都受益于对不断发展的 Web 扩展标准的持续改进和修复。

临时扩展安装

macOS 版 Safari 18.4 的新功能是,您可以从磁盘临时安装 Web 扩展。这提供了一种方便的方式来开发您的扩展并测试兼容性,而无需构建 Xcode 项目。加载临时扩展时,您将可以使用大多数 Safari Web 扩展功能。当您准备好测试 nativeMessaging 或准备分发您的扩展时,您可以使用 Safari Web 扩展转换器创建新的 Xcode 项目。

开发者 ID 签名和公证的 Safari Web 扩展

macOS 版 Safari 18.4 现在支持已经过开发者 ID 签名和公证的 Safari Web 扩展。公证是使用您的开发者 ID 签名您的应用和扩展之后的额外步骤。Apple 的公证服务会自动检查恶意内容和代码签名问题。一旦公证完成,您的应用和扩展就可以在 Safari 中分发和使用了。

可靠的文档识别

Safari 18.4 增加了对 webRequestwebNavigationtabsscripting API 中 documentId 的支持,确保扩展在发送消息、注入脚本或处理请求时能够可靠地跟踪文档。与 frameId 不同,当新文档加载到同一框架时,frameId 保持不变,而 documentId 会随着每次导航更新,帮助扩展避免与错误的内容交互。

高效的存储键检索

Safari 18.4 在扩展存储中引入了 getKeys(),允许开发人员检索存储的键而不获取其关联的值。这提高了管理大量结构化数据(例如存储用户偏好设置、会话数据或分类内容)的扩展的性能。通过仅检索键,扩展可以在决定加载哪些值之前有效地确定哪些数据可用,从而减少不必要的数据传输。

改进的本地化支持

Safari 18.4 中对 i18n.getSystemUILanguage()i18n.getPreferredSystemLanguages() 的支持,使扩展能够访问用户的系统语言设置。与返回浏览器界面语言的 i18n.getUILanguage() 不同,这些 API 允许扩展与系统范围的语言偏好保持一致。这对于根据用户首选区域设置格式化日期、数字和其他特定于区域设置的内容的扩展尤其有用,即使浏览器区域设置不同。

扩展的子框架注入

Safari 18.4 增加了对扩展清单中 match_about_blankmatch_origin_as_fallback 的支持,以及动态注册内容脚本的 scripting 中对 matchOriginAsFallback 的支持。这些属性允许脚本和样式在其他框架(如 about:blankdata:blob: URL)中运行,方法是根据父框架的源而非框架自身的 URL 进行匹配,从而可以针对具有不透明源的框架。仍然需要父框架源的主机权限。

WKWebView

在此版本中,我们实现了 API 平台之间的更多对等性。在 iOS 上,API 客户端现在可以使用 WKUIDelegate/webView(_:runOpenPanelWith:initiatedByFrame:) 委托方法自定义文件输入的上传流程。

我们现在还在 iOS 和 visionOS 上公开了 WKNavigationActionbuttonNumbermodifierFlags 属性。

最后,visionOS 2.4 将 Apple 智能功能,如摘要、文本撰写、重写和校对,通过支持书写工具引入到 visionOS 上的 WebKit 客户端体验中。这包括它们各自的 API:WKWebView.isWritingToolsActiveWKWebViewConfiguration.writingToolsBehavior

网络

Safari 18.4 的 WebKit 在 macOS Sequoia 15.4、iOS 18.4 和 visionOS 2.4 上引入了对选择性分区 Cookie(称为 CHIPS)的支持。分区 Cookie 允许网页上的第三方内容在该特定站点上创建和访问 Cookie,而无需进行跨站点跟踪。CHIPS 对于仍然需要在第三方上下文(例如 iframe)中访问 Cookie 的网站来说是一项重要技术,它是帮助网站完成从依赖未分区跨站点 Cookie 迁移的重要一步。

例如,如果 https://siteA.example 创建一个 iframe 并加载 https://siteB.example,并且来自 https://siteB.example 的网页创建了一个分区 Cookie,则该 Cookie 仅在来自 siteA.example 的网页上对 siteB.example 可访问。请注意,WebKit 为 CHIPS 使用了与其他存储区域(例如 localstorage)不同的分区边界。WebKit 通过按 站点 而非按 对 Cookie 进行分区,从而与其他浏览器引擎保持一致。这意味着如果 https://news.siteA.example 和 https://mail.siteA.example 都嵌入了来自 https://chat.siteB.example 的 iframe,那么 https://chat.siteB.example 将在这两个网页上访问相同的 Cookie,因为 https://news.siteA.example 和 https://mail.siteA.example 是同一 site 的子域:https://siteA.example。

CHIPS 分区 Cookie 要求网站在 Cookie 上显式设置一个新属性。这个显式属性确保 WebKit 和网站都清楚该 Cookie 只能在特定站点上访问。新属性名为 Partitioned,其使用方式类似于 SecureHTTPOnly 属性。与其他 Cookie 属性一样,Partitioned 属性仅在设置 Cookie 时使用,之后无法访问。

举例来说,如果您想使用 HTTP Set-Cookie 标头设置分区 Cookie,它可能看起来像这样:

Set-Cookie: TestCookie=12345; SameSite=None; Secure; Partitioned

请注意,此 Cookie 包含 SameSite=NoneSecure 属性。这些属性是 Partitioned Cookie 所必需的,如果未设置这些属性,Cookie 将被阻止。这意味着该 Cookie 必须从安全网页(例如 https)创建和访问,并且该 Cookie 将在您所有跨站点请求中发送到您的服务器。您可以在链接页面上阅读有关这些属性的更多信息。

与使用 HTTP 标头设置分区 Cookie 类似,您也可以使用 JavaScript 进行设置。例如,JavaScript 可以创建与上面相同的 Cookie:

document.cookie = "TestCookie=12345; SameSite=None; Secure; Partitioned";

并且 document.cookie 将返回 "TestCookie=12345"

请注意,跨站点跟踪域可能不允许使用分区 Cookie。

如果您需要访问分区第三方 Cookie 和未分区第三方 Cookie,那么您可以继续使用 存储访问 APIdocument.requestStorageAccess() 来请求访问未分区 Cookie。

存储

Safari 18.4 的 WebKit 增加了对使用 Clear-Site-Data HTTP 标头清除分区 Cookie 的支持。Safari 17.0 中引入了使用 Clear-Site-Data 清除第一方 Cookie 的支持。现在,随着上面描述的 CHIPS 的引入,此 HTTP 标头根据发送它的服务器而具有不同的行为。如果标头在第一方站点(例如,主网页)发送的响应中收到,则 WebKit 将仅清除该域的未分区 Cookie。如果 HTTP 标头在跨站点 iframe 发送的响应中收到,则 WebKit 将仅清除加载 iframe 的特定站点的分区 Cookie。

连接安全

多年来,Safari 中的锁形图标表示连接是安全的——即该站点正在使用 HTTPS。如今,超过 87% 的所有连接都通过 HTTPS 进行,安全连接已无处不在,成为新常态。同时,锁形图标的存在可能会造成一种虚假的可信赖感,如果用户反而认为它在那里是表示网站值得信任。考虑到这一点,我们在 Safari 18.4 中从智能搜索字段中移除了 HTTPS 连接的锁形图标。

对于希望了解更多连接安全信息的用户,我们引入了一个新选项。在 macOS 上,请前往 Safari 菜单;连接安全详情。在 iOS、iPadOS 和 visionOS 上,您可以在“页面”菜单;更多;连接安全详情中找到信息。

此视图允许用户确认连接是安全的,并且首次在 iOS、iPadOS 和 visionOS 上查看证书信息,例如 CA 颁发者和到期日期。

Three devices showing three different screens. The first shows the Page Menu and shows options for Page Actions, Tab Actions, and Website Settings for Apple.com. The second screen shows the Connection Security Details options and displays that your connection with apple.com is secure and shows the certificate. The third screen show the three certificates for apple.com.

在欧盟,连接安全详情会指示使用欧盟合格 Web 认证 (QWAC) 证书建立的连接,为 iOS 18.4、iPadOS 18.4、macOS Sequoia 15.4 和 visionOS 2.4 上的在线交互提供增强信任和安全性的指示器。

此外,Safari 18.4 的 WebKit 更改了 3DES 密码,以向用户显示警告,表明它是一个旧版 TLS(传输层安全协议)。点击此处查看此类警告。

安全

Safari 18.4 的 WebKit 增加了对 CSP 哈希报告关键字的支持:report-sha256report-sha384report-sha512。并且移除了对 Clear-Site-Data: 针对 executionContexts 的支持,因为 Safari 是唯一一个支持它的浏览器。

Safari 18.4 的 WebKit 现在允许用户在注册时需要安全密钥时为其设置 PIN。

已解决问题

除了新功能,Safari 18.4 的 WebKit 还包含了完善现有功能的工作。

浏览器

  • 修复了网站在短时间后自动退出的问题。(99829958)

CSS

  • 修复了表格 border-color 默认值为 currentColor 的问题。(48382483)
  • 修复了 CSS clip-path 与任何创建新堆叠上下文的属性结合使用会导致 <img> 元素消失的问题。(86091397)
  • 修复了调整大小不应用于生成内容的问题。(121348638)
  • 修复了 contain: size 破坏 object-fit 的问题。(131866042)
  • 修复:从 container-type 中去除了布局包含。(132549134)
  • 修复了处理规范中所有应导致 UI 小部件退化为原始外观的 CSS 属性的问题。(134273374)
  • 修复了 scrollIntoView 对齐始终被遵守的问题。(135484284)
  • 修复:background-clip: border-area 在根元素上无效的问题。(135972986)
  • 修复了 vertical-rl 书写模式下字间注音字符显著小于旁注注音字符的问题。(135973587)
  • 修复了 CSS 光标不会急切评估 calc() 值的问题。(136103471)
  • 修复了 flex 简写不会急切评估 calc() 的问题。(136103475)
  • 修复了 -webkit-perspective 不会急切评估 calc() 的问题。(136103493)
  • 修复了 @property initial-value 描述符以防止包含 var(--foo) 的问题。(136103499)
  • 修复了延迟评估 calc() 以供原始字体消费者使用的问题,以便每个调用者都可以选择正确的行为。(136103500)
  • 修复了网格不会急切评估 calc() 用于重复值的问题。(136103503)
  • 修复了 counter-incrementcounter-setcounter-reset 不会急切评估 calc() 的问题。(136103519)
  • 修复了 @scope 内的 CSS 嵌套声明行为与 :where(:scope) 类似的问题。(136856371)
  • 修复:将 shape() 函数更新为匹配提议的语法。(138126105)
  • 修复了包含许多元素的页面上的相同文档视图过渡性能问题。(138966650)
  • 修复了径向渐变在 100% 处有两个颜色停止点时无法扩展到最后一种颜色的问题。(139369366)
  • 修复了 @scope startend 为经典(非宽容)选择器列表的问题。(139471866)
  • 修复了在切换到亮或暗模式时,根元素明确设置 color 的情况下更新基本背景颜色的问题。(139917332)
  • 修复了 querySelectorAll():has() 后代选择器一起使用时的性能问题。(140093151)
  • 修复了 <bdo> 元素的 unicode-bidi 默认值问题。(140662417)
  • 修复了当逻辑组 CSS 属性被显式继承时 revert-layer 损坏的问题。(140819138)
  • 修复了边框间距使用最短序列化(“0px”与“0px 0px”)的问题。(141920587)
  • 修复了不正确的嵌套选择器后后续嵌套样式被忽略的问题。(142187930)
  • 修复了 font-variant-caps: all-small-capsflex 行内上下文中导致 box-sizing 不正确的问题。(142212550)
  • 修复了当绝对定位框是 writing-mode 根时,确保对过度约束情况运行正确逻辑的问题。(142214631)
  • 修复了从视图过渡动态 UA 样式表设置的 animation-name 包含额外引号的问题。(142298840)
  • 修复了 animation-name 字符串的序列化和解析问题。(142318879)
  • 修复了动态更新 CSS 时 text-box-trim 累积失败的问题。(142386761)
  • 修复了 text-emphasis 不在标点符号上绘制强调标记的问题。(142387538)
  • 修复了弹窗打开时更改 CSS 位置导致的尺寸和定位问题。(142491219)
  • 修复了 macOS 上页面缩放(⌘+ 和 ⌘-)与 font-size 中使用的 calc() 协同工作的问题。(142736427) (FB16287129)
  • 修复了 scroll-paddingscroll-margin 作为强类型 CSS/Style 值的问题。(142830546)
  • 修复了当用户通过滑动导航时视图过渡停止运行的问题。(142844150)
  • 修复了顶级和嵌套选择器具有零特异性,以匹配最新的规范更新。(143765827)

编辑

  • 修复了 document.execCommand("copy") 仅在有选择时触发的问题。(27792460)
  • 修复了 iCloud 备忘录中从 Safari 纯文本文档复制的文本粘贴为原始标记的问题。(124788252)
  • 修复了正确高亮以常见短语结尾的大文本选区的问题。(135973065)
  • 修复了复制文章中常见术语的链接以高亮页面正确部分的问题。(135973186)
  • 修复了 ClipboardItem 接口中缺少 SecureContext 的问题。(137197266)
  • 修复了从 Safari 粘贴的希伯来语文本左对齐的问题。(139029945)
  • 修复了设置选择不会设置焦点,除非存在现有选择的问题。(139075809)
  • 修复了有时无法选择非可编辑内容中的文本的问题。(143296175)
  • 修复了跨多行选择文本后缺少选择句柄的问题。(143720155)

表单

  • 修复了 <textarea> 处理方向切换的问题。(73475239)
  • 修复了将 datetime-local 输入设置为大值导致崩溃的问题。(135733092)
  • 修复了 <datalist> 下拉菜单键盘交互以符合平台惯例的问题。(143012287)
  • 修复:对于空的可编辑内容,除“撰写”外,禁用所有“书写工具”应用菜单项。(143332082)

主屏幕 Web 应用

  • 修复了主屏幕 Web 应用的屏幕唤醒锁定 API 问题。(108573133)

HTML

  • <details><summary> 的展开/折叠三角实现为列表项。(95148788)

图像

  • 修复了锁定模式下 WebP 图像损坏的问题。(144224372)

JavaScript

  • 修复了数组解构赋值在评估抛出异常时关闭迭代器的问题。(121960887)
  • 修复:将 Intl.DurationFormat#resolvedOptions 更新到最新规范。(136276429)
  • 修复了 Iterator Helpers 方法不迭代数组的问题。(136303997)
  • 修复了 Iterator.prototype.reduce() 未正确将 return() 调用转发到底层迭代器的问题。(137181340)
  • 修复了 Set.prototype 方法在没有参数的情况下调用 keys() 的问题。(137395979)
  • 修复了 Array.from()Array.fromAsync()TypedArray.from() 在将 document.all 作为映射器传递时会调用它的问题。(137490201)
  • 修复了 Intl.DurationFormat 具有与规范匹配的值限制的问题。(137885273)
  • 修复了 Intl.DurationFormat 的舍入误差问题。(138261569)
  • 修复了 DateTimeFormat 中的日历规范化逻辑问题。(141792829)
  • 修复了当 hoursDisplay"auto"Intl.DurationFormat 数字样式输出损坏的问题。(141969050)
  • 修复了 Intl.DurationFormat 在隐藏小时后为分钟打印负号的问题。(142119353)
  • 修复了 Array.prototype.toReversedundefined 填充空洞的问题。(142197604)
  • 修复:增加了正则表达式的 matchLimit,允许对更长的字符串进行复杂匹配。(143202375)

媒体

  • 修复了媒体元素中处理空 srcAttr 的问题。(132042925)
  • 修复了 getUserMedia 视频轨道 getSettings() 返回 torchwhiteBalanceMode 约束的陈旧值的问题。(137870391)
  • 修复了通过使视频可被鼠标聚焦来解决全屏视频中 space 键无法暂停的问题。(138037616)
  • 修复了查找后播放不总是恢复的问题。(140097993)
  • 修复了播放视频生成非单调“timeupdate”事件的问题。(142275184) (FB16222910)
  • 修复了在 seek() 期间调用 play() 网站被规范允许的问题,以便即使 seek 尚未完成,也会触发播放事件。(142517488)
  • 修复了 WebM 在某些情况下查找无法完成的问题。(143372794)
  • 修复了 MediaRecorderPrivateEncoder 写入帧顺序错误的问题。(143956063)

网络

  • 修复了乐观升级的导航根据当前网络条件设置超时的问题。(135972599)

PDF

  • 修复了将 PDF 从连续模式切换到离散模式时,即使页面几乎不可见,也会显示位于窗口顶部的页面。(137608841)
  • 修复了“上一页”上下文菜单选项在双页连续模式下无法导航到上一页的问题。(139817364)
  • 修复了带有 CSP 沙盒标头的主框架 PDF 无法加载的问题。(141166987)

渲染

  • 修复了计算具有固有比例但无固有尺寸的替换元素作为 flex 项的基线问题。(74279029)
  • 修复了 iOS 上从横向旋转到纵向时,额外分派的 resize 事件导致的闪烁问题。(93767145)
  • 修复了在连续链中,尽可能地将流外对象添加到行内元素下方的问题。(102421379)
  • 修复了 mix-blend-mode 适用于大分辨率固定或粘性元素的问题。(104686540)
  • 修复了 <thead><tbody><tfoot> 元素顺序错误导致表格折叠边框缺失的问题。(110430887)
  • 修复了处理行内盒尾随内容的问题。(112409103)
  • 修复了 <input type="range"> 即使应用了 width: 0 也会占用空间的问题。(113402515)
  • 修复了 iOS 上旋转到横向模式时 Spotify 媒体播放器消失的问题。(123870311)
  • 修复了 textarea 元素为叠加滚动条预留空间的问题。(129597865)
  • 修复了通过在第一次行尺寸计算时缓存固有逻辑高度来提高网格布局动画性能的问题,从而提高了效率并防止了复杂网格配置的失效问题。(135791322)
  • 修复了网格项为具有指定尺寸的图像时,当 src 更改时无法更新的问题。(135972911)
  • 修复了当 line-fit-edge 设置时嵌套行内元素的垂直对齐问题。(136036997)
  • 修复了 <td width="100%"> 表格布局的一致性问题。(136090741)
  • 修复了 text-underline-position 的重绘更一致的问题。(136095297)
  • 修复了 WordPress 经典编辑器侧边栏布局中浮动元素不清除的问题。(136362683)
  • 修复了 MathML 布局函数中流外子元素的处理不一致问题。(136683070)
  • 修复了尺寸设定为 content-box 的重复 background-image 无法在 iframe 中填充视口的问题。(136725820)
  • 修复了在表格 DOM 操作需要时始终触发重排的问题。(137300794)
  • 修复了 MathML 中字体大小的 scriptlevel 乘数问题。(137671252)
  • 修复了行内跑马灯在与浮动元素相邻时允许其收缩的问题。(137766071)
  • 修复了没有 flex 项的 flex 容器不运行 flex 布局的问题。(137884128)
  • 修复了 MathML 元素上 CSS width 和 height 属性的支持问题。(138174295)
  • 修复了行内内容在右到左和/或垂直 shape-outside 浮动元素周围定位不正确的问题。(139076129)
  • 修复了浮动元素具有 shape-outside: inset 时错误重叠的问题。(139133291)
  • 修复了右到左内容在 shape-outside 浮动元素下失败的问题。(139198865)
  • 修复了在垂直模式下,浮动元素具有 shape-outside: ellipse 时错误重叠的问题。(139208636)
  • 修复了在右到左模式下,浮动元素具有 shape-outside: polygon 时错误重叠的问题。(139215719)
  • 修复了 list-style-position 的外部怪癖仅在怪异模式下适用。(140602985)
  • 修复:更新了行框尺寸。(141167251)
  • 修复了嵌套在垂直块容器中时,水平书写模式状态不正确的问题。(141543326)
  • 修复了带空行的表格中基线计算的少数情况。(142046863)
  • 修复了拒绝在替换内容内部换行的问题。(142224455)
  • 修复了绝对定位的子元素百分比包含其包含块的内边距。(142321535)
  • 修复了当流外盒子位于行内连续体内时,正确计算其宽度的问题。(142417374)
  • 修复了当设置线性渐变和边框半径时边框不显示的问题。(142617573)
  • 修复了滚动区域中相对定位的输入元素不渲染轮廓的问题。(142995142)
  • 修复了在某些情况下,通过 Tab 键跳出弹窗会导致卡死的问题。(143145544)
  • 修复了在不插入新子元素时正确设置行内连续的问题。(143388080)
  • 修复了为 <rt> 添加 margin-top 也会添加底部外边距的问题。(143720832)

滚动

  • 修复了 DOM 中已存在的 iframe 元素的“scrolling”属性更改生效的问题。(98911472)

Service Workers

  • 修复了处理包含网页的进程中忙碌循环 Service Worker 的情况。(138626537)
  • 修复了通过 Service Worker 导航预加载加载的导航从缓存提供重定向响应时出现意外故障的问题。(146113615)

存储

  • 修复了存储访问 API 将 AllExceptPartitioned 视为当前不具备 Cookie 访问权限的问题,确保网站可以请求访问第一方 Cookie。(143508260)

SVG

  • 修复了空的 text 元素边界框不传播给祖先元素的问题。(115217040)
  • 修复了 SVG 遮罩不能作为 mask-image 工作的问题。(127327715)
  • 修复了引用元素(例如 textPath)无法通知引用元素(例如 text)其可用性时的错误。(135509733)
  • 修复了 SVGUseElement 在加载外部文档时阻止嗅探内容类型的问题。(135972621)
  • 修复了垂直书写模式设置正确的边界矩形。(135973175)
  • 修复:根据 Web 规范更新了 getTotalLength(),使其在不可渲染且路径为空时抛出异常。(136719548)
  • 修复了 SVG 二次曲线在图块边界处被错误裁剪的问题。(139904014)
  • 修复了动态更新 transform 属性的问题。(140761655)
  • 修复了仅为文档元素 <svg><img> 中合成 viewBox 的问题。(141733733)
  • 修复了 foreignObject 中最外层 <svg> 上的 SVGElement.prototype.ownerSVGElement 问题。(143625675)

表格

  • 修复了表格行方向由表格方向而非节方向决定的问题。(99343532)
  • 修复了 HTML 表格中 rowspan="0" 缺少行为的问题,其中 0 表示跨越所有剩余行。(133910430)
  • 修复了 Table Root 在固定表格布局中也会考虑 fill-available 的问题。(137297914)
  • 修复了表格分区和行背景未被视为不透明的问题。(142588505)

文本

  • 修复了短内容上不显示粗下划线的问题。(64705955)
  • 修复:根据编码标准要求,GB18030-2022 的更改现在也正确影响 GBK。(136368583)
  • 修复了仅在指定语言时才自动连字符文本的问题。(136826305)
  • 修复了应用 text-spacing: text-autospace 时边界样式计算的问题。(137153961)
  • 修复了 OpenType-SVG 彩色字体显示问题。(137496217) (FB15426148)

Web API

  • 修复:将 EME 中部分 MIME 类型处理与 MIME Sniffing 标准对齐。(114311586)
  • 修复了 window.history.replaceState('', '', '') 在 macOS 上无效的问题。(117782346)
  • 修复了 MutationObserver 在调整元素大小时观察样式属性更改的问题。(120109181)
  • 修复:更新了 selectorText 处理以符合 CSSPageRule 规范。(125588212)
  • 修复了 Gamepad 震动问题,即发送两个连续的 playEffect() 请求会阻止 reset() 按预期工作。(126589062) (FB13733668)
  • 修复了 <link rel=expect>href 使用百分比编码语法时,元素 id 属性中表情符号的匹配问题。(134531921)
  • 修复了 onrejectionhandledonunhandledrejection 事件处理程序属性在 body 和 frameset 元素上正常工作的问题。(135401362)
  • 修复了 <link> 的渲染阻塞,使其不匹配解析器“开放元素堆栈”中的元素。(135846827)
  • 修复了干扰控制意外隐藏与隐藏元素重叠的脱离流元素的问题。(136358918)
  • 修复了 CSSOM setSelectorText(string) 预置隐式选择器的问题。(136791222)
  • 修复了 HTMLElement.prototype.requestPointerLock 返回 Promise 的问题。(139854530)
  • 修复了 innerText 对于 <details><summary> 的行为。(140172890)
  • 修复了 HTML 解析器电话号码处理以更好地考虑 MathML 的问题。(141632782)
  • 修复了 Range.getClientRects 考虑代理对的问题。(142098484)
  • 修复了 link 元素的 rel 属性和 Link 头部的分词问题。(142600096)

Web 认证

  • 修复了条件调解的 .catch() 未收到抛出的中止原因的问题。(112178073)

Web 扩展

  • 修复了 Web 扩展页面的 CORS 以尊重授予的每个站点的权限。

    开发人员需要在执行任何被 CORS 阻止的 fetch() 调用之前,添加 browser.permissions.request({origins: []}) 调用。(102912898)

  • 修复了导致内容拦截器无法隐藏 about:blank 帧中内容的问题。(134273470)
  • 修复了 declarativeNetRequest 中应用规则集和动态规则时的性能下降问题。(136394861) (FB15196130)
  • 修复了 Safari 扩展设置中点击“清除存储…”按钮的问题。(137533628)
  • 修复了 storage.onChanged 返回 undefined 作为 areaName 的问题。(138086765)
  • 修复了 windows.create 返回的结果中缺少 tabs 字段的问题。(138529797)
  • 修复了 Web 扩展中对 es-419 的支持问题。(138857112)
  • 修复了 webRequest.onBeforeRequest 事件缺少 requestBody 的问题。(140338580) (FB15911234)
  • 修复了模糊的扩展图标。(142070967) (FB16171862)
  • 修复了当首选“zh-Hant”时未选择“zh”区域设置的问题。(142602243) (FB16271745)
  • 修复了 webRequest 事件监听器以遵守 extraInfoSpec 以获得更好的性能。(142907168)
  • 修复了 Web 扩展资源默认按 UTF-8 处理的问题。(143079179)

Web Inspector

  • 修复了在 Web Inspector 中关闭站点特定技巧设置时,确保禁用 iPad 上所有桌面网站站点特定技巧的问题。(50035167)
  • 修复了样式规则在被 JavaScript 中的 CSSOM 修改后仍然可编辑的问题。(124650808)
  • 修复了尝试编辑包含 @import 语句的样式表中的样式时出现的故障。(131756178)
  • 修复了错误情况以匹配新的源映射规范。(137934436)
  • 修复了在“图形”标签页中概述图标在深色模式下反色的问题。(140602803)
  • 修复了在“图形”标签页中录制的 WebGL 对象未正确高亮显示的问题。(140625113)

WebAssembly

  • 修复了 Wasm 旧版 catch_all 指令可正确捕获抛出的 JS 原语的问题。(135972897)

WebDriver

  • 修复了使用鼠标右键模拟拖动事件时可能发生的崩溃。(137068514)

WebRTC

  • 修复了如果麦克风曾被用户代理静音一次,MediaSession.setMicrophoneActive(true) 会反复提示的问题。(135941062)
  • 修复了 setCameraActive 在用户代理之前同时静音了摄像头和麦克风的情况下不会取消麦克风静音的问题。(136221456)
  • 修复了 AirPods 取消静音时,如果网站已将摄像头静音,则不会取消摄像头静音的问题。(137065964)
  • 修复了在页面发起的同源导航后,语音搜索不会再次提示摄像头或麦克风权限的问题。(138122655)

WKWebView

  • 修复了当 JS 没有返回任何内容时,在异步上下文中调用 WKWebView.evaluateJavaScript 的问题。(139618495) (FB15755273)

更新到 Safari 18.4

Safari 18.4 可在 iOS 18.4iPadOS 18.4macOS Sequoia 15.4、macOS Sonoma、macOS Ventura 以及 visionOS 2.4 上使用。若要在 iPhone、iPad 或 Apple Vision Pro 上获取最新版本的 Safari,请前往“设置”>“通用”>“软件更新”,然后轻点以更新。

如果您运行的是 macOS Sonoma 或 macOS Ventura,您可以单独更新 Safari,无需更新 macOS。请前往  > “系统设置”>“通用”>“软件更新”,然后在“可用更新”下方点击“更多信息…”。

反馈

我们乐于倾听您的意见。要分享您的想法,请在线查找我们的 Web 布道师:Jen Simmons 在 Bluesky / Mastodon 上,Saron Yitbarek 在 BlueSky 上,以及 Jon Davis 在 Bluesky / Mastodon 上。您可以在 LinkedIn 上关注 WebKit。如果您遇到任何问题,欢迎您就 Safari UI 提供反馈(了解更多关于提交反馈的信息),或提交关于 Web 技术或 Web Inspector 的WebKit 错误报告。如果您遇到某个网站无法按预期工作,请在 webcompat.com 提交报告。提交问题确实会带来改变。

在 macOS 上下载最新的 Safari Technology Preview,以保持在 Web 平台的最前沿并使用最新的 Web Inspector 功能。

您也可以在 Safari 18.4 发行说明中找到此信息。