News from WWDC24:
WebKit in Safari 18 beta
The last year has been a great one for WebKit. After unveiling Safari 17 beta at WWDC23, we’ve shipped six releases of Safari 17.x with a total of 200 new web technologies. And we’ve been hard at work on multiple architectural improvement projects that strengthen WebKit for the long-term.
Now, we are pleased to announce WebKit for Safari 18 beta. It adds another 48 web platform features, as well as 18 deprecations and 174 bug fixes. Test it today on iOS 18 beta, iPadOS 18 beta, visionOS 2 beta, and macOS Sequoia beta.
WebXR
Safari 18 for visionOS 2 beta adds support for immersive WebXR. Now you can create fully immersive experiences and deliver them on the web to people using Apple Vision Pro. Safari on visionOS 2 beta supports immersive-vr
sessions. WebXR scenes are displayed using hardware-accelerated graphics driven by WebGL.
![A beautiful garden rendered in created graphics. There's a tree with bright red leaves. A blue sky full of puffy white clouds. Bright green grass, with a path leading by plants and garden sculpture. It's a world created in WebXR.](https://webkit.org/wp-content/uploads/chess-garden.jpg)
Safari for visionOS 2 beta supports the new WebXR transient-pointer
input mode. It lets you make the most of natural input on visionOS, and allow your users to interact with a look and a pinch.
![We are in a rendered 3d environment, in a garden. We look at a chess board, with a real human hand lifting a rendered chess piece to make the next move in the game. A floating panel has two buttons reading "Leave garden" and "Reset game".](https://webkit.org/wp-content/uploads/playing-chess.jpg)
transient-pointer
in your WebXR experience to support interactions like this, where players use their hands to pinch and drag as they move chess pieces around.If you want to animate a 3D model of the user’s hands, Safari for visionOS 2 beta also includes support for WebXR hand tracking. To ensure privacy, permission to allow hand tracking will be requested from users at the start of their WebXR session.
Learn all about WebXR on visionOS 2 beta by watching Build immersive web experiences with WebXR at WWDC24, available Wednesday June 12. And learn more about transient-pointer
input mode by reading Introducing natural input for WebXR in Apple Vision Pro.
CSS
View Transitions
WebKit added support for the View Transitions API in Safari 18 beta. It provides an optimized browser API to animate elements from one state to another. Safari supports the CSS View Transitions Module Level 1 specification that adds new CSS properties and pseudo-elements for defining transition animations, along with a new browser API to start transition animations and react to different transition states. It works by capturing the current (old) state of the page and applying an animated transition to the new state. By default, the browser applies a cross-fade between the states.
Call the document.startViewTransition()
method to initiate the capture. You can pass a callback function as the first argument to make DOM state changes between the old and new captures. The method returns a ViewTransition object which contains promises that can be used to track when the view transition starts or ends.
Once the states are captured, a pseudo-element tree is built which can be targeted with CSS, allowing you to modify the CSS animations used for the transitions. The animations out of the old page state and into the new page state can be modified via the ::view-transition-new(*)
and ::view-transition-old(*)
selectors. You can also ask the browser to independently track state changes for a specific element by naming it with the CSS view-transition-name
property. You can then use the pseudo-element to customize animations for it.
.page-view {
view-transition-name: page-view;
}
::view-transition-old(page-view) {
animation: 500ms ease-in-out transition-out-animation;
}
::view-transition-new(page-view) {
animation: 500ms ease-in-out transition-in-animation;
}
The example below demonstrates state management with tabbed navigation. Each tab view has a custom transition animation out and a subtly different animation in, while the tabs themselves rely on the default page transition.
Style Queries
WebKit for Safari 18 beta adds support for Style Queries when testing CSS Custom Properties. Similar to how developers can use Sass mixins, Style Queries can be used to define a set of reusable styles that get applied as a group.
Here, if the --background
custom property is set to black, then certain styles will be applied — in this case to make the headline and paragraph text color white.
@container style(--background: black) {
h2, h3, p {
color: white;
}
}
Don’t forget to pay attention the HTML structure. By default, Style Queries reference the styles on the direct parent element. You can create a different reference through the use of Container Query names.
currentcolor and system color keywords in Relative Color Syntax
Support for Relative Color Syntax shipped in Safari 16.4. It lets you define colors in a more dynamic fashion, creating a new color from an existing color. The value lch(from var(--color) calc(L / 2) C H)
for instance uses the lch
color space to take the variable --color
and calculate a new color that’s half its lightness, calc(L / 2)
.
Now, starting in WebKit for Safari 18 beta, you can reference the currentcolor or a system color keyword as you define the new color. For example, this code will set the background color to be the same color as the text color, only 4 times lighter, as calculated in the oklch
color space.
section { background: oklch(from currentcolor calc(L * 4) C H); }
Being able to reference system color keywords opens up another world of options. System colors are like variables that represent the default colors established by the OS, browser, or user — defaults that change depending on whether the system is set to light mode, dark mode, high contrast mode, etc. For example, canvas
represents the current default background color of the HTML page, while fieldtext
matches the color of text inside form fields. Find the full list of system colors in CSS Color level 4.
Relative Color Syntax lets you define dynamic connections between colors in your CSS, lessening the need to control color through variables in a tightly-regimented design system. Learn more about Relative Color Syntax by watching this portion of What’s new in CSS from WWDC23.
Animating display
WebKit for Safari 18 beta adds support for transition animation of the display
property.
Many developers are excited to use @starting-style
along with transition-behavior
and display: none
interpolation. WebKit for Safari 17.4 added general support for transition-behavior
, including transition-behavior: allow-discrete
. WebKit for Safari 17.5 added support for @starting-style
, letting you define starting values for transitioning an element as it’s created (or re-created). Now in WebKit for Safari 18 beta, you can use these features together to transition the display
property.
Shaping interaction regions on visionOS
As a web developer, you’re very familiar with how link styling works on the web. For decades you’ve been able to use CSS to style text-decoration
, color
and more for :link
, :hover
, :active
, and :visited
states. You’ve also been able to adjust the size of the invisible tap target through use of padding.
Apple Vision Pro adds a new dimension to how links work — tap targets are visible on visionOS. Anytime a user looks at an interactive element, it’s highlighted to let them know that it can be tapped. And you as a designer or developer can intentionally design how an interaction region looks. You may want to add padding, for instance, or even a rounded corner to the otherwise invisible box.
Now in Safari in visionOS 2 beta, when you use CSS clip-path
to change the shape of tappable area of a link, the visible interaction region will change shape as well. Interactive UI elements built with SVG will also be highlighted with the proper shape. Learn more by watching Optimize for the spatial web at WWDC24, available Tuesday June 11.
Backdrop Filter
Originally shipped in Safari 9.0, backdrop filter provides a way to apply graphics effects to the content behind a particular element. You can apply backdrop-filter
to a headline, for example, and everything behind the headline will be blurred, or have decreased saturation, or increased contrast. Any of the filter functions from SVG can be used — blur()
, brightness()
, contrast()
, drop-shadow()
, grayscale()
, hue-rotate()
, invert()
, opacity()
, saturate()
, and sepia()
.
For many years, backdrop filter only worked in Safari. It was available when you prefixed the property with -webkit-backdrop-filter
. Now, starting in Safari 18 beta, you don’t need the prefix. We also improved our implementation, fixing bugs and boosting interoperability.
This demo shows eight different filters and what you might do with each one alone. You can, of course, combine filters to create even more interesting results. With backdrop filter supported in Safari since 2015, Edge since 2018, Chrome since 2019, Samsung Internet since 2020, and Firefox since 2022, this is a great time to consider the kind of graphic design possibilities it enables.
safe in Flexbox
WebKit for Safari 18 beta adds support for the safe
keyword for alignment in Flexbox. This provides a mechanism for refining how flex items overflow. Let’s look at an example of a simple navigation menu — a classic use of Flexbox.
<nav aria-label="main"><ul>
<li><a href="/us">U.S.</a></li>
<li><a href="/business">Business</a></li>
<li><a href="/investigations">Investigations</a></li>
<li><a href="/style">Style</a></li>
<li><a href="/tech">Tech</a></li>
<li><a href="/world">World</a></li>
</ul></nav>
The following CSS creates a simple layout that wraps when there’s not enough space on one line for the menu, while centering the items in the available space.
header nav {
display: flex;
flex-flow: wrap;
gap: 1.5rem;
justify-content: center; /* centers the items in the available space */
}
![A simple menu of links, each represented by a word, laid out in two lines of centered text.](https://webkit.org/wp-content/uploads/flex-menu-light.png)
By default, justify-content: center
will always keep the items centered, even when the content is overflowing the containing box. You might prefer, however, that the content not be centered when it overflows — being centered cuts off both the beginning and end of the word, making the content harder to understand when the overflow is not visible.
![Diagram showing the difference between safe and default layout of the same menu, when the space for it is so narrow every word in on its own line, and some of the long words start to get chopped off.](https://webkit.org/wp-content/uploads/flex-safe-light.png)
justify-content: center
without and with the safe
keyword in this demo.The safe
keyword lets you change how alignment works when content overflows. The justify-content: safe center
rule will instead start align any item that is overflowing, while continuing to center the items that are not overflowing.
If you want to override the safe
keyword, you can use unsafe
. The justify-content: unsafe center
rule will do the same thing as justify-content: center
. The unsafe
keyword has been supported in WebKit for Safari for quite some time.
Content visibility
WebKit for Safari 18 beta adds support for content-visibility
. This property controls whether or not an element renders its contents in a fashion that’s useful for making performance optimizations. It lets you communicate to the browser that certain portions of the page will likely be initially offscreen, and suggest they be omitted from layout and rendering. This can make the page load faster.
Web apps for Mac
Last year, we added support for web apps in macOS Sonoma. You can add any website to your dock — whether or not it was built with a Manifest file, Service Worker, or other technology to customize the web app experience. Go to the site in Safari, then File > Add to Dock… where you can customize the icon, change the name, and even clean up the URL. Then, just click on the web app icon in your Dock, and it will open as an app.
This year brings two improvements to web apps on Mac.
Opening links
macOS Sequoia beta adds support for opening links directly in web apps. Now, when a user clicks a link, if it matches the scope
of a web app that the user has added to their Dock, that link will open in the web app instead of their default web browser.
For example, imagine you have added MDN Web Docs to the Dock. Then a colleague sends you a link to an MDN page in Messages, Mail, Slack, Discord, IRC, or any non-browser application on your Mac. Now when you click on that link, it will open in the MDN Web Docs web app instead of your default browser.
Clicking a link within a browser will maintain the current behavior. This feature only affects links opened elsewhere. (When a user is in Safari, clicking on a link that matches the scope
of a web app that is added to Dock, they will see an “Open in web app” banner, unless they have previously dismissed the banner.)
By default, this behavior applies when the link matches the host of the web page used to create the web app. As a developer, you can refine this experience by defining the range of URLs that should open in the web app with the scope
member in the web app manifest.
Extension support
Now you can personalize web apps on Mac with Safari Web Extensions and Content Blockers. Navigate to the web app’s Settings menu to access all your installed Content Blockers and Web Extensions. Any enabled in Safari will be on by default in the web app. Each web app is uniquely customizable, just like Safari profiles.
Safari Extensions
Safari 18 beta also adds support for Mobile Device Management of extension enabled state, private browsing state, and website access on managed devices. This means schools and businesses that manage iOS, iPadOS, or macOS devices can now include the configuration of Safari App Extensions, Content Blockers, and Web Extensions in their management.
Spatial media
One of the amazing experiences you can have on Apple Vision Pro is looking at spatial photos and panoramas. When you open the Photos app in visionOS, you see a montage of your photos. Tap an image, it appears alone in a floating frame in front of you, while the rest of the app disappears.
![A family blows out candles on a birthday cake in a photo — that's floating in a frame in midair, in a living room. This is a still from the WWDC23 Keynote that introduced Apple Vision Pro. It's an example of how spatial photos work.](https://webkit.org/wp-content/uploads/spatial-photo.png)
A spatial photo appears at just the right height and viewing angle to make it feel like you’ve gone back to a moment in time. A second tap of the UI breaks it out of the frame, as it grows and becomes even more immersive. Similarly, a panorama floats in a frame on first tap. Then on second tap of the UI, it expands to wrap all around you, creating a fully immersive experience.
Now in Safari 18 for visionOS 2 beta, you can use the Fullscreen API to create the same experience on the web. You can embed the photo in a web page, and provide the ability to tap. The photo will pop into a floating frame as the Safari window disappears. Then when the user taps on the spatial photo or panorama UI that visionOS provides, the photo will further expand to create a fully immersive experience. When they exit the image, the Safari window will return.
Let’s walk through how to support experiencing a spatial photo or panorama on the web using Fullscreen API. First, include the image on your web page using any of the techniques we’ve used on the web for years. Here, we can embed a flattened panoramic photo into the web page using simple HTML.
<img src="panorama.jpeg" class="go-fullscreen" alt="[description]">
Then using JavaScript, we’ll trigger .requestFullscreen()
on tap. Perhaps like this.
document.querySelectorAll('.go-fullscreen').forEach(element => {
element.addEventListener('click', async () => {
await element.requestFullscreen();
});
});
You could, of course, create your own UI for the user to tap, rather than making the entire photo the tap target.
Spatial images work just the same, although it’s likely we want to provide fallbacks for browsers that do not support HEIC files. We can do so with the picture
element.
<picture>
<source srcset="spatial.heic" type="image/heic">
<source srcset="fallback.avif" type="image/avif">
<img src="fallback.jpg" class="go-fullscreen" alt="[description]" >
</picture>
Spatial images are stereoscopic, with both a left and right channel. In Safari, when the image is embedded in the web page, the browser will show the left channel. And there’s no need to worry about providing a fallback of any sort for Safari on macOS, iOS, or iPadOS — the stereoscopic HEIC file works great.
This technique will also cause images to go fullscreen in any browser that supports Fullscreen API. Learn more about adding panorama and spatial photos to your websites by watching Optimize for the spatial web at WWDC24, available Tuesday June 11.
HTML
Writing Suggestions
At last year’s WWDC, Apple unveiled inline predictive text on iOS, iPadOS, macOS and more. It helps users input text faster by predicting what they might be typing and finishing the word, phrase or even a whole sentence when the user taps the space bar. Now, WebKit for Safari 18 beta on iOS, iPadOS, visionOS, macOS Sequoia and macOS Sonoma brings inline predictive text to the web.
While inline predictive text makes for a fantastic, personalized user experience, there might be specific situations on the web where it’s better to not have predictions. WebKit for Safari 18 beta on iOS, iPadOS, visionOS, macOS Sequoia and macOS Sonoma gives web developers the opportunity to disable inline predictions through the writingsuggestions
attribute. By default, writing suggestions is set to true. You can turn off the capability by including the writingsuggestions="false"
attribute on any type of text input field.
writingsuggestions
.
Switch
WebKit for Safari on iOS 18 beta adds haptic feedback for <input type=checkbox switch>
. This means, now when a user taps a switch control on iPhone, a single tap is felt — just like how toggling a switch feels in Settings app on iOS. Try this demo to see what it’s like.
Date and time inputs
WebKit for Safari 18 beta on macOS improves accessibility support for date and time input field types. Now <input type="date">
, <input type="datetime-local">
, and <input type="time">
elements work properly with VoiceOver.
ARIA
Usually elements have the labels they need, but sometimes there is no text label for a particular button or UI. In this situation, ARIA can be used to provide an accessible label. The aria-label
attribute provides names of labels while aria-roledescription
provides the description for the role of an element.
On very rare occasions, you may need to override aria-label
or aria-roledescription
to provide different names or descriptions specifically for braille. The aria-braillelabel
and aria-brailleroledescription
attributes provide such an ability. They exist to solve very specific needs, including educational contexts where the site needs to render the specific braille table dot pattern. If you do use braille-related ARIA attributes, be sure to test them using a braille reader. If in doubt, relying on the accessible name from content or aria-label
/ aria-roledescription
is almost always the better user experience. WebKit has supported these ARIA attributes for years.
Now, WebKit for Safari 18 beta adds support for the ariaBrailleLabel
and ariaBrailleRoleDescription
element reflection properties. These make it possible to get and set the aria-braillelabel
and aria-brailleroledescription
ARIA attributes on DOM elements directly via JavaScript APIs, rather than by using setAttribute
and getAttribute
.
Media
Watch video without distractions in Viewer for Safari 18 beta on macOS.
![A video playing in a Safari window, where the video is enlarged to fill almost all of the space. The rest of the web page content is mostly hidden behind a dark translucent overlay.](https://webkit.org/wp-content/uploads/video-viewer.png)
When you play in Viewer, the video fills the Safari window, while providing full access to system playback controls. Then it automatically enters picture-in-picture anytime you switch tabs, close the window, or occlude the web page with another window. Look for Video Viewer in the new page menu in Safari whenever you are on a web page with a prominent video element.
Video on visionOS
Safari for visionOS 2 beta adds support for docking fullscreen videos into the current Environment. Anytime a user is watching a video fullscreen, they can tap to enter a fully immersive experience. Turning the Digital Crown adjusts the immersion. Light emitted from the video reflects off of the Environment, while audio is rendered on a large soundstage.
Managed Media Source
WebKit for Safari 18 beta adds Workers support for both Managed Media Source (MMS) and Media Source Extensions (MSE). This can be especially helpful on complex websites that want to ensure continuous and smooth video playback even when other site activity (such as live commenting) causes a very busy main thread. You can see the performance difference in this demo.
WebRTC
WebKit for Safari 18 beta adds support for the WebRTC HEVC RFC 7789 RTP Payload Format. Previously, the WebRTC HEVC used generic packetization instead of RFC 7789 packetization. This payload format provides a new option for improving videoconferencing, video streaming, and delivering high-bitrate movies and TV shows.
WebKit for Safari 18 beta adds support for MediaStreamTrack processing in a dedicated worker. And it adds support for missing WebRTC stats.
Passkeys
Two years ago at WWDC22, we announced support for passkeys — a groundbreaking industry-standard way to login to websites and app services. Passkeys provide people with an extremely easy user experience, while delivering a profound increase in security. To learn more, watch Meet Passkeys or read Supporting passkeys.
WebKit for Safari 18 beta adds support for three new features as we continue to improve passkeys. First, Safari 18 beta adds support for using mediation=conditional
for web authentication credential creation. This allows websites to automatically upgrade existing password-based accounts to use passkeys. Learn more by watching Streamline sign-in with passkey upgrades and credential managers at WWDC24, available on Tuesday, June 11.
Second, WebKit for Safari 18 beta adds support for using passkeys across related origins. This lets websites use the same passkey across a limited number of domains which share a credential backend.
And third, WebKit for Safari 18 beta adds support for the WebAuthn prf
extension. It allows for retrieving a symmetric key from a passkey to use for the encryption of user data.
HTTPS
WebKit for Safari 18 beta adds support for secure HTTPS for all images, video, and audio by upgrading passive subresource requests in mixed content settings. This means that if some files for a website are served using HTTPS and some are served using HTTP (known as “mixed content”), all images and media will now be auto-upgraded to HTTPS, in adherence with Mixed Content Level 2.
JavaScript
WebKit for Safari 18 beta adds support for Unicode 15.1.0 characters in RegExp. Unicode 15.1 added 627 characters, bringing the total of characters to 149,813. Now, these new characters can be used in regular expressions.
WebKit for Safari 18 beta also adds support for the v
flag with RegExp.prototype[Symbol.matchAll]
. providing more powerful ways to match Unicode characters, as specified in the ECMAScript 2024 standard.
For example, you can now specify to only match on Latin characters, while avoiding matching on Cyrillic script characters.
const regex = /\p{sc=Latin}/v;
console.log(regex.test('A')); // true, 'A' is a Latin script character
console.log(regex.test('А')); // false, 'А' is a Cyrillic script character
Or split a string matching on Emojis.
"a 🥰 b 🥰".split(/[\p{Emoji}--\p{ASCII}]/v)// ["a ", " b ", ""]
Web API
WebKit for Safari 18 beta adds support for URL.parse()
, a way to parse URLs which returns null rather than an exception when parsing fails.
// Before
let url = null;
try {
url = new URL(input, base);
} catch(e) { }
// Now
const url = URL.parse(input, base);
WebKit for Safari 18 beta expands Declarative Shadow tree support by adding the shadowRootDelegatesFocus
and shadowRootClonable
IDL attributes to the <template>
element. It also adds the shadowRootSerializable
attribute and shadowRootSerializable
IDL attribute to the <template>
element, enabling those using Declarative Shadow roots to opt into making them serializable. Serializing can be done through the new getHTML()
method that has been added at the same time.
WebKit for Safari 18 beta adds support for PopStateEvent
’s hasUAVisualTransition
, indicating whether the user agent has a visual transition in place for the fragment navigation.
WebKit for Safari 18 beta adds support for subresource integrity in imported module scripts, which gives cryptographic assurances about the integrity of contents of externally-hosted module scripts.
WebKit for Safari 18 beta adds support for the bytes()
method to the Request,
Response
, Blob
, and PushMessageData
objects. This replaces the need for web developers to call arrayBuffer()
, which can be difficult to use, and wraps the result in a Uint8Array
. Calling bytes()
is now the recommended way going forward when you need to access the underlying bytes of the data these objects represent.
WebKit for Safari 18 beta adds support for feature detecting text fragments by exposing document.fragmentDirective
. Note that the returned object (a FragmentDirective
) doesn’t provide any functionality, but it’s helpful if you need to know if Fragment Directives are supported by the browser.
Canvas
WebKit for Safari 18 beta adds support for the willReadFrequently
context attribute for the getContext()
method. It indicates whether or not a lot of read-back operations are planned. It forces the use of a software accelerated 2D or offscreen canvas, instead of hardware accelerated. This can improve performance when calling getImageData()
frequently.
WebKit for Safari 18 beta extends 2D canvas support for currentcolor
. It can now be used inside color-mix()
or Relative Color Syntax. Here currentcolor
will default to the computed color
property value on the canvas
element.
WebGL
WebKit for Safari 18 beta adds support for six new WebGL extensions:
EXT_texture_mirror_clamp_to_edge
WEBGL_render_shared_exponent
WEBGL_stencil_texturing
EXT_render_snorm
OES_sample_variables
OES_shader_multisample_interpolation
Web Inspector
WebKit for Safari 18 beta adds support for fuzzy search code completion in the Web Inspector’s CSS source editor.
WKWebView
WebKit for iOS 18 beta, iPadOS 18 beta, visionOS 2 beta, and macOS Sequoia beta adds support for two new API — the Writing Tools API and an API to control adaptive image glyph insertion. Learn more about these API by watching Get started with Writing Tools and Bring expression to your app with Genmoji at WWDC24, both available Tuesday June 11.
Apple Pay
WebKit for Safari 18 beta adds support for Apple Pay funds transfer.
Deprecations
While it’s rare to deprecate older technology from the web, there are occasions when it makes sense. We’ve been busy removing -webkit
prefixed properties that were never standardized, aging media formats that were never supported in other browsers, and more. This helps align browser engines, improve interoperability, and prevent compatibility problems by reducing the possibility that a website depends on something that’s not a web standard.
Canvas
WebKit for Safari 18 beta removes support for OffscreenCanvasRenderingContext2D
’s commit()
method.
CSS
WebKit for Safari 18 beta deprecates support for a number of rarely used -webkit
prefixed CSS pseudo-classes and properties — and even one -khtml
prefixed property.
-webkit-alt
andalt
properties:-webkit-animating-full-screen-transition
pseudo-class:-webkit-full-screen-ancestor
pseudo-class:-webkit-full-screen-controls-hidden
pseudo-class:-webkit-full-page-media
pseudo-class:-webkit-full-screen-document
pseudo-class:-khtml-drag
pseudo-class
WebKit for Safari 18 beta also deprecates support for the resize: auto
rule. Support for the resize
property remains, just as it’s been since Safari 4. The values Safari continues to support include: none
, both
, horizontal
, vertical
, block
, inline
, plus the global values. Early versions of CSS Basic User Interface Module Level 3 defined auto
, but it was later written out of the web standard.
WebKit for Safari 18 beta also deprecates support for non-standardize WEBKIT_KEYFRAMES_RULE
and WEBKIT_KEYFRAME_RULE
API in CSSRule.
Images
WebKit for Safari 18 beta removes support for the JPEG2000 image format. Safari was the only browser to ever provide support.
If you’ve been serving JPEG2000 files using best practices, then your site is using the picture
element to offer multiple file format options to every browser. Safari 18 beta will simply no longer choose JPEG2000, and instead use a file compressed in JPEG XL, AVIF, WebP, HEIC, JPG/JPEG, PNG, or Gif — choosing the file that’s best for each user. Only one image will be downloaded when you use <picture>
, and the browser does all the heavy lifting.
We have noticed that some Content Deliver Networks (CDN) use User Agent sniffing to provide one file to each UA, offering only JPEG2000 images to Safari — especially on iPhone and iPad. If you expect this might be happening with your site, we recommend testing in Safari 18 beta on both macOS Sequoia and iOS or iPadOS 18. If you see problems, contact your SaaS provider or change your image delivery settings to ensure your website provides fallback images using industry best practices.
If you notice a broken site, please file an issue at webcompat.com.
Media
WebKit for Safari 18 beta removes support for non-standard VTTRegion.prototype.track
.
Storage
WebKit for Safari 18 beta removes the last bits of support for AppCache.
When AppCache first appeared in 2009, in Safari 4, it held a lot of promise as a tool for caching web pages for use offline. It was imagined as “HTML5 Application Cache” back when HTML itself was being further expanded to handle more use cases for web applications. A developer could create a simple cache manifest file with a list of files to be cached. Its simplicity looked elegant, but there was no mechanism for cache busting, and that made both developing a site and evolving the site over time quite frustrating. AppCache also had security challenges. So new web standards were created to replace it. Today, developers use Service Workers and Cache Storage instead.
WebKit deprecated AppCache with a warning to the Console in Safari 11.0. Then in 2021, we removed support for AppCache from Safari 15.0, with a few exceptions for third-party users of WKWebView. Now we are removing those exceptions. This change to WebKit will only affect the rare web content loaded in older third-party apps that have JavaScript code which relies on the existence of AppCache related interfaces.
SVG
WebKit for Safari 18 beta removes the SVGAnimateColorElement interface.
Web API
WebKit for Safari 18 beta removes support for four non-standard Web APIs:
KeyboardEvent.altGraphKey
- AES-CFB support from WebCrypto
KeyboardEvent.prototype.keyLocation
HashChangeEvent
’s non-standardinitHashChangeEvent()
method
Bug Fixes and more
In addition to all the new features, WebKit for Safari 18 beta includes work to polish existing features.
Accessibility
- Fixed role assignment for
<header>
inside<main>
and sectioning elements. - Fixed range input not firing an input event when incremented or decremented via accessibility APIs.
- Fixed setting
aria-hidden
on a slot not hiding the slot’s assigned nodes. - Fixed comboboxes to expose their linked objects correctly.
- Fixed time input accessibility by adding labels to subfields.
- Fixed
aria-hidden=true
to be ignored on the<body>
and<html>
elements. - Fixed
datetime
values being exposed to assistive technologies in the wrong timezone. - Fixed time control accessibility by adding a label to the meridiem component.
- Fixed wrong
datetime
value being exposed to assistive technologies fordatetime-local
inputs. - Fixed ignored CSS content property replacement text when it is an empty string.
- Fixed the computed role for these elements:
dd
,details
,dt
,em
,hgroup
,option
,s
, andstrong
. - Fixed hidden elements targeted by
aria-labelledby
to expose their entire subtree text, not just their direct child text. - Fixed accessible name computation for elements with
visibility: visible
inside a container withvisibility: hidden
. - Fixed updating table accessibility text when its caption dynamically changes.
- Fixed updating
aria-describedby
text after the targeted element changes its subtree.
Animations
- Fixed the
transition
property to produce the shortest serialization. - Fixed the
animation
property to produce the shortest serialization.
Authentication
- Fixed
navigator.credentials.create()
rejects with “NotAllowedError: Operation Failed” after a conditional UI request is aborted. - Fixed renaming DigitalCredential’s
response
attribute todata
. - Fixed setting the cancel flag once the cancel completes regardless of a subsequent request occurring.
Canvas
- Fixed
drawImage(detachedOffscreenCanvas)
to throw an exception. - Fixed OffscreenCanvas failing to render to the placeholder with nested workers.
- Fixed losing the contents layer of the placeholder canvas of OffscreenCanvas when switching off the tab.
- Fixed
drawImage
to not alter the input source or the destination rectangles. - Fixed toggling the visibility on a canvas parent undoing the effect of
clearRect()
. - Fixed the Canvas
drawImage()
API to throw an exception when the image is in broken state.
CSS
- Fixed setting
white-space
to a non-default value dynamically on a whitespace or a new line. - Fixed turning
text-spacing
properties intofont
properties. - Fixed custom counter styles extending
disclosure-open
anddisclosure-closed
to point to the correct direction in right-to-left. - Fixed
backface-visibility
to create a stacking context and containing block. - Fixed
getComputedStyle()
to work with functional pseudo-elements like::highlight()
. - Fixed: Aliased
:-webkit-full-screen
pseudo-class to:fullscreen
. - Fixed: Aliased
:-webkit-any-link
to:any-link
and:matches()
to:is()
. - Fixed
getComputedStyle()
pseudo-element parsing to support the full range of CSS syntax. - Fixed
@supports
to correctly handle support for some-webkit
prefixed pseudo-elements that were incorrectly treated as unsupported. - Fixed updating media-query sensitive meta tags after style changes.
- Fixed changing color scheme to update gradients with system colors or
light-dark()
. - Fixed incorrect inline element size when using
font-variant-caps: all-small-caps
withfont-synthesis
. - Fixed
:empty
selector to work with animations. - Fixed preserving whitespace when serializing custom properties.
- Fixed updating style correctly for non-inherited custom property mutations.
- Fixed element removed by parent to end up losing the last remembered size.
- Fixed an incorrect difference between implicit and explicit initial values for custom properties.
- Fixed the contrast of Menu and MenuText system colors.
- Fixed keeping the shorthand value for CSS
gap
as-is in serialized and computed values. - Fixed the style adjuster for
@starting-style
incorrectly invoking with a null element. - Fixed excluding
-apple-pay-button
from applying to any element that supportsappearance: auto
and is not a button. - Fixed missing color interpretation methods added to CSS color specifications.
- Fixed
hsl()
andhsla()
implementation to match the latest spec changes. - Fixed the implementation of
rgb()
andrgba()
to match the latest spec. - Fixed the
hwb()
implementation to match the latest spec. - Fixed the remaining color types to be synced with the latest spec changes.
- Fixed carrying analogous components forward when interpolating colors
- Fixed applying the fill layer pattern for
mask-mode
.
Forms
- Fixed displayed
datalist
dropdown to sync itsoptions
elements after a DOM update. - Fixed
<select multiple>
scrollbars to match the used color scheme. - Fixed updating the input value when selecting an
<option>
from a<datalist>
element. - Fixed the value attribute not getting displayed in an
input
element withtype="email"
and themultiple
attribute. - Fixed the iOS animation for
<input type=checkbox switch>
. - Fixed form controls drawing with an active appearance when the window is inactive.
- Fixed constructed FormData object to not include entries for the image button submitter by default.
History
- Fixed the properties of
History
to throw a SecurityError when not in a fully active Document.
HTML
- Fixed “about:blank”
document.referrer
initialization. - Fixed parsing a self-closing SVG script element. It now successfully executes.
JavaScript
- Fixed
RegExp.prototype.@@split
to update the following legacy RegExp static properties:RegExp.input
,RegExp.lastMatch
,RegExp.lastParen
,RegExp.leftContext
,RegExp.rightContext
, andRegExp.$1, ... RegExp.$9
. - Fixed
String.prototype.replace
to not take the fast path if the pattern is RegExp Object and thelastIndex
is not numeric. ( - Fixed spec compliance for Async / Await, Generators, Async Functions, and Async Generators.
- Fixed async functions and generators to properly handle promises with throwing “constructor” getter.
- Fixed
return
in async generators to correctlyawait
its value. - Fixed
Symbol.species
getters to not share a single JS Function. - Fixed throwing a
RangeError
ifSet
methods are called on an object with negativesize
property. - Fixed
eval()
function from another realm to not cause a directeval
call. - Fixed
eval()
call with...spread
syntaxt to be a direct call. - Fixed try/catch to not intercept errors originated in
[[Construct]]
of derived class. - Fixed several issues:
- direct
eval()
in a default value expression inside a rest parameter creates a variable in the environment of the function rather than the separate one of the parameters; - a ReferenceError is thrown when accessing a binding, which is defined inside rest parameter, in
eval()
, or a closure created in a default value expression of a preceding parameter, but only if there is avar
binding by the same name; - a closure, created in the default value expression inside a rest parameter, is created in a different VariableEnvironment of the function than its counterparts in preceding parameters which causes the incorrect environment to be consulted when querying or modifying parameter names that are “shadowed” by
var
bindings.
- direct
- Fixed TypedArray sorting methods to have a special-case for camparator returning
false
. - Fixed programming style for bitwise and in setExpectionPorts.
- Fixed
emitReturn()
to loadthis
value from arrow function lexical environment prior to the TDZ check. - Fixed NFKC normalization to work with Latin-1 characters.
- Fixed parsing of private names with Unicode start characters.
- Fixed
instanceof
to not get RHS prototype when LHS is primitive. - Fixed bracket update expression to resolve property key at most once.
- Fixed bracket compound assignement to resolve the property key at most once.
- Fixed
Object.groupBy
andMap.groupBy
to work for non-objects. - Fixed
Array.fromAsync
to not call the Array constructor twice. - Fixed inconsistent output of
Function.prototype.toString
for accessor properties. - Fixed
Set#symmetricDifference
to callthis.has
in each iteration. - Fixed logical assignment expressions to throw a syntax error when the left side of the assignment is a function call.
- Fixed throwing a syntax error for nested duplicate-named capturing groups in RegEx.
- Fixed
ArrayBuffer
andSharedArrayBuffer
constructor to check length before creating an instance. - Fixed Intl implementation to ensure canonicalizing “GMT” to “UTC” based on a spec update.
- Fixed RegEx lookbehinds differing from v8.
- Fixed
fractionalDigits
ofIntl.DurationFormat
to be treated as at most 9 digits if it is omitted.
Loading
- Fixed
navigator.cookieEnabled
to returnfalse
when cookies are blocked.
Media
- Fixed video sound coming from another window after changing tabs in the Tab Bar in visionOS.
- Fixed playback for MSE videos on some sites.
- Fixed allowing a video’s
currentTime
to be further than the gap’s start time. - Fixed broken audio playback for a WebM file with a Vorbis track.
- Fixed
sampleRate
andnumberOfChanges
to be required and non-zero in a valid AudioEncoderConfig. - Fixed media elements appending the same media segment twice.
- Fixedrejecting valid NPT strings if ‘hours’ is defined using 1 digit.
- Fixed an issue where Safari audio may be emitted from the wrong window in visionOS.
Networking
- Fixed upgrading inactive or passive subresource requests and fetches in would-be mixed security contexts to match standards.
- Fixed incorrect
Sec-Fetch-Site
value for navigation of a nested document. - Fixed loading WebArchives with a non-persistent datastore.
- Fixed
Timing-Allow-Origin
to not apply to an HTTP 302 response.
- Fixed print buttons with a print action implementation.
- Fixed Open in Preview for a PDF with a space in its name.
Rendering
- Fixed Greek uppercase transforms failing for some characters.
- Fixed resizing a
<textarea>
element with1rem
padding. - Fixed the color correctness of the color matrix filter.
- Fixed
backdrop-filter
to apply to the border area of an element with aborder-radius
. - Fixed intrinsic inline size calculators to account for whitespace before an empty child with nonzero margins.
- Fixed overlapping elements with flex box when
height: 100%
is applied on nested content. - Fixed incorrect grid item positioning with out-of-flow sibling.
- Fixed
break-word
with a float discarding text. - Fixed
min-content
calculation for unstyledonly-child
inlines elements. - Fixed ellipsis rendering multiple times when
position: relative
andtop
are used. - Fixed a bug for inline elements inserted in reverse order after a block in a continuation.
- Fixed the flash of a page background-colored bar in the footer when the window is resized.
Scrolling
- Fixed the cursor not updating as content scrolls under it on some pages.
SVG
- Fixed the SVG parser to interpret “form feed” as white space.
- Fixed error handling for invalid filter primitive references.
- Fixed displaying an SVG element inside a
<switch>
element. - Fixed SVG title to have
display: none
as the default UA style rule. - Fixed the UA stylesheet for links in SVGs to apply
cursor: pointer
matching standards. - Fixed returning the initial value for the SVG gradient
stop-color
if it is not rendered in the page. - Fixed the SVG marker segment calculations if the marker path consists of sub-paths.
- Fixed
SVGLength
to sync with the WebIDL specification.
Web Animations
- Fixed percentage transform animations when
width
andheight
are animated. - Fixed updating an animation when changing the value of a
transform
property while that property is animated with an implicit keyframe. - Fixed animating with
color-mix
.
Web API
- Fixed
cssText
setter to change thestyle
attribute when the serialization differs. - Fixed
history.pushState()
andhistory.replaceState()
to ignore thetitle
argument. - Fixed URL text fragment directives not fully stripped from JavaScript.
- Fixed
showPicker()
method to trigger suggestions from adatalist
. - Fixed
lang
attribute in no namespace to only apply to HTML and SVG elements. - Fixed unnecessarily unsetting the iframe fullscreen flag.
- Fixed DOM Range to correctly account for CDATASection nodes.
- Fixed
getGamepads()
to no longer trigger an insecure contexts warning. - Fixed inserting a
<picture>
element displaying the same image twice. - Fixed throwing exceptions in navigation methods if in a detached state.
- Fixed a minor issue in URL’s host setter.
- Fixed cloning of ShadowRoot nodes following a DOM Standard clarification.
- Fixed GeolocationCoordinates to expose a
toJSON()
method. - Fixed GeolocationPosition to expose a
toJSON()
method. - Fixed setting
CustomEvent.target
when dispatching an event. - Fixed
navigator.language
only returning the system language in iOS 17.4. - Fixed: Removed presentational hints from the
width
attribute for<hr>
.
Web Apps
- Fixed resolving
www.
sub-domain for Associated Domains for all web apps.
Web Assembly
- Fixed initialization of portable reference typed globals.
Web Inspector
- Fixed font sizes in the Audits tab.
- Fixed expanded sections of Storage to not collapse
- Fixed CSS font property values marked
!important
not getting overridden when using the interactive editing controls. - Fixed an issue where the Web Inspector viewport might appear cut off.
- Fixed runtimes to be aligned in the Audit tab.
- Fixed remembering the message type selection in the Console tab.
- Fixed autocomplete for the
text-indent
property suggesting prefixed properties instead ofeach-line
orhanging
. - Fixed
background
autocompletion suggestion to includerepeating-conic-gradient
. - Fixed console clearing unexpectedly when Web Inspector reopens
- Fixed console code completion to be case-insensitive.
- Fixed
overflow: scroll
elements to scroll as expected when highlighting an element from the DOM tree. - Fixed showing additional Safari tabs from an iOS device in the Develop menu.
- Fixed Console and code editor completion not auto-scrolling the suggestion into view.
- Fixed search in the DOM tree view unexpectedly chaning the text display.
- Fixed clicking the “goto” arrow for computed CSS when “show independent Styles sidebar” is disabled.
- Fixed inspectable tabs from Safari in the visionOS Simulator don’t appear in Developer menu on the host macOS.
Web Views
- Fixed Gamepad API in WKWebView.
- Fixed repainting HTML elements when their width or height change in legacy WebView.
WebRTC
- Fixed VideoTrackGenerator writer to close when its generator track (and all its clones) are stopped.
- Fixed WebRTC AV1 HW decoding on iPhone 15 Pro.
- Fixed black stripes with screen sharing windows.
- Fixed black stripes with getDisplayMedia captured windows when the window is resized.
Help us Beta Test
You can test Safari 18 beta by installing the beta of macOS 15, iOS 18, or iPadOS 18. Or, if you’d like, you can try out Safari 18 beta on macOS Sonoma or macOS Ventura by downloading the Safari 18 beta, once it’s available. (Sign in using a free Apple ID to download. Installing Safari 18 beta on macOS Sonoma or macOS Ventura will replace your existing version of Safari with no way to revert to an earlier version.) You can also help test many of these features in Safari Technology Preview.
Feedback
We love hearing from you. To share your thoughts on Safari 18 beta, find us on Mastodon at @[email protected] and @[email protected]. Or send a reply on X to @webkit. You can also follow WebKit on LinkedIn. If you run into any issues, we welcome your feedback on Safari UI (learn more about filing Feedback), or your WebKit bug report about web technologies or Web Inspector. If you notice a website that seems broken in Safari, but not in other browsers, please file a report at webcompat.com. Filing issues really does make a difference.
Download the latest Safari Technology Preview on macOS to stay at the forefront of the web platform and to use the latest Web Inspector features.
You can also find this information in the Safari 18 beta release notes.