They report no pointing device at all: (hover: hover) and (pointer: fine) never match, (hover: none) and (pointer: none) do. Don't gate a desktop layout on them— a responsive framework can end up serving its touch layout.
Image cursors (cursor: url(...))
Partial
Ignored, though named cursors reach your app.
Smooth scrolling
Not available
scroll-behavior: smooth and the behavior: 'smooth' option jump straight to the target.
The Free edition has JIT disabled (JavaScript may execute slower). The editions are covered in Editions and Feature Macros.
Feature
Status
Notes
ES2022
Supported
The ES2023 array additions
Supported
ES modules and dynamic import()
Supported
Web Workers
Supported
Secure contexts on local pages
Supported
Pages loaded from file:// URLs are secure contexts, and so is HTML loaded from a string with a file:// base URL. Without one, that HTML is about:blank, which is not, and secure-context-only APIs such as crypto.randomUUID() and navigator.locks disappear— so pass a base URL.
Switching JavaScript off per View
Supported
The page still lays out and animates, and your app drives it from native code (see Embedded and Device UI).
Object.groupBy, the RegExp v flag, Temporal
Not available
Anything later than the Safari 16.4 level.
WebAssembly
Not available
Pick the JavaScript build of any library that offers one.
SharedArrayBuffer
Not available
Shared workers
Not available
Service workers
Not available
requestIdleCallback()
Not available
Schedule background work with setTimeout() or requestAnimationFrame().
Including Path2D, roundRect(), conic gradients, ImageBitmap, and toBlob().
imageSmoothingEnabled and imageSmoothingQuality
Supported
Turning smoothing off keeps hard pixel edges when scaling. 'high' applies a higher-quality filter when enlarging. 'low' and 'medium' use the default.
OffscreenCanvas
Supported
On the page and in workers.
The canvas filter property
Partial
Works unless your app switches canvas filters off. Reference filters like url(#id) draw unfiltered.
Canvas readback on a GPU-rendered View
Partial
getImageData() throws, toDataURL() returns data:,, and putImageData() does nothing. Create the context with getContext('2d', { willReadFrequently: true }) and all three work. CPU-rendered Views are unaffected.
WebGL
Not available
getContext('webgl') returns null. Draw 3D content in your engine and show it on the page as a custom texture (see Displaying Custom Textures).
A file the server sends as an attachment, or one the page can't display, reaches your app as a download (see Downloads and Network Control). An <a download> link just navigates.
navigator.sendBeacon()
Not available
Send analytics with fetch() while the page is alive.
From the controllers your app forwards (see Gamepad Input).
Form validation
Partial
An invalid control blocks the submission. invalid fires on each bad control and the first takes focus, but no message bubble is drawn, so style :invalid or show your own text (see Forms and Inputs).
Touch events
Not available
Use pointer events.
HTML drag and drop
Not available
draggable never starts a drag. Use pointer events.