













Our Safari release notes have never been as long as they are for this version. The number of features alone rose from 58 to 83 since the first beta in June.
Safari MCP makes working with coding agents dramatically easier. Customizable select turns the real <select> element into something you can fully restyle — now with new UA default styles that provide an even-better starting place. Scroll anchoring stops content from jumping when something loads in above. The <model> element comes to iOS, iPadOS, and macOS, giving 3D a powerful HTML element. Websites can now provide immersive environments on visionOS. And much more.
Are you developing websites using coding agents? The Safari MCP server, now available in Safari 27.0 will make your workflow faster and more powerful. Give Claude Code, Codex, or the agent of your choice control over the browser window so it can see how your code renders. Safari MCP provides access to the DOM, network requests, screenshots, and console output. Your agent can do more on its own while you do less hopping between windows, less dropping screenshots in your terminal, and less typing prompts to describe what’s not working.
The Safari MCP server enables your agent to:
And much more. The MCP server runs entirely on your local machine. It makes no network calls of its own. It does not have access to your personal information in Safari. And any captured data goes directly to the agent you’re running, not to Apple.
To give it a try, go to Safari > Settings > Developer > check “Allow remote automation and external agents.” (If the Developer pane is not available, first go to Advanced, and check “Show features for web developers”.)
If you’re using Claude:
claude mcp add safari-mcp -- "/usr/bin/safaridriver" --mcp
If you’re using Codex:
codex mcp add safari-mcp -- "/usr/bin/safaridriver" --mcp
For other agents, you put the following in your mcp.json or config.json file.
{
"mcpServers": {
"safari-mcp": {
"command": "/usr/bin/safaridriver",
"args": ["--mcp"]
}
}
}
Let us know what you think, especially if you have any feature requests. Learn more by reading Introducing the Safari MCP server for web developers, or by referencing documentation.
The biggest feature of Safari 27.0 isn’t a feature at all. It’s the tremendous effort that went into improving the quality of existing features. At WWDC, we were proud to announce 525 fixes. Then we added 60% more, reaching a total of 844. Plus the majority of feature work improves existing features.

When we look at the efforts we made to improve quality, the story can be seen in several themes.
Compatibility. Our team made many changes to help make specific websites work correctly for their users. For example, Hindi InScript typing in an online document editor, images vanishing from search results on a restaurant reservation site, and Pahawh Hmong text misrendering in an online encyclopedia.
Foundations. Sometimes the best way to improve quality is to start over. Safari 27.0 has an all-new ES module loader. We rebuilt CSS Zoom. And now inline layout places elements with subpixel precision.
Depth. We got deep into specific technologies. There are 66 fixes to SVG in this release alone, including an end-to-end review of the SMIL animation engine. HTML tables got a systematic pass, with absolutely positioned tables now handling percentage-sized children, min-height, and max-height correctly. Plus deep work on Media Source Extensions (MSE) and Encrypted Media Extensions (EME). And much more.
Alignment. Much of the work is to better match exactly what web standards prescribe. For example, we corrected the MathML Core operator dictionary and its spacing values across several fixes. Fixes to innerText bring Safari’s rendered-text output better in line with standards for display, visibility, white-space, and form controls. And we improved how HTTP cache obeys Cache-Control.
Integration. Sometimes two features each work perfectly alone, but combined, something starts to go wrong. We fixed a lot of these this year. For example, -webkit-line-clamp shipped in WebKit in 2010, while text-wrap: balance arrived in 2024. Before Safari 27.0, if you applied both to the same element, the balancing simply didn’t happen. Now that’s fixed.
We truly hope all of these efforts throughout the last year make your work as a web developer a little easier. Read through the resolved issues at the end of this article to see specifics. And learn more about what we are doing to raise the quality of WebKit by watching What’s new in WebKit for Safari 27.
The <select> element has been part of the web since the very beginning of HTML. But until recently, there wasn’t a lot you could to do style it or fill it with custom content. Customizable Select changes that. Now in Safari 27.0, it lets you build a fully custom drop-down menu to match the look and feel of your website or web app, without reaching for JavaScript or a pile of <div>. You can even push far beyond a typical drop-down menu to a very different UI. Because it’s a real form control, you get automatic, reliable support for keyboard navigation, screen readers, form submission, validation, change events and more.
Start by applying appearance: base-select in your CSS. This immediately switches to the look and feel provided by new UA styles, and enables the new powers in HTML.
select,
select::picker(select) {
appearance: base-select
}
You might notice that the default UA styles in Safari 27.0 are different than they were for the first beta back in June. The summer gave us the opportunity to reflect on what it will be like for web developers to write custom styles on top of the new defaults. We realized after 30 years of web developers struggling with form control styling, we wanted to provide something even better.

These defaults set you up with all the basics. You won’t be left with homework to do to get the select into a usable state. You can simply switch to the new control with appearance: base-select, and apply as little or as much additional code as you’d like. Don’t like the new defaults? You are in luck, it’s very easy to override them. Feel fine keeping any of these pieces like the new drop shadow, 4px rounded corners, touch-friendly line height, cleaner hover states, user-ready chevron & checkmark, subtle opt group styling, etc? Great! It’s already done for you, with support for all the variations like light & dark modes, forced color mode, disabled states and more.
We brought this new design to the CSS Working Group, where it’s being further discussed and refined. Once other browsers update their implementations, we will together reach our shared commitment for all browsers to support an identically interoperable starting place.
New pseudo-elements like ::picker-icon and ::checkmark let you easily target parts of the control that were previously unstylable. Plus, you can now insert HTML elements inside each <option> to add more detail. The new <selectedcontent> element can be used to adjust what gets displayed as the currently-selected option’s content. Learn more watching Rediscover the HTML Select Element from WWDC26.

Originally shipped a year ago in visionOS, the HTML <model> element is now also available in Safari on iOS, iPadOS, and macOS. This new element is a lot like video, audio, and img — this time embedding a 3D model in the page.
<model src="mallet.usdz"></model>
Just like the other HTML elements for media, you can link to multiple source files, including a fallback.
<model>
<source src="boot.usdz" type="model/vnd.usdz+zip">
<source src="boot.glb" type="model/gltf-binary">
<img src="boot.png" alt="workboot in light tan leather">
</model>
You can optionally include attributes like environmentmap to provide custom lighting for your model. Or stagemode, which sets the default interaction behavior. Target your model with JavaScript and open up a wide range of possibilities.
Learn all about it, including where to get a 3D model, how to optimize it for the web, and what can be done with JavaScript by watching Get started with the HTML Model Element from WWDC26. And check out these demos in Safari.
Safari 27.0 also adds support so the CSS dynamic-range-limit property can be applied to the <model> element, giving you control over HDR tone mapping and rendering range for 3D content on iOS and macOS.
Responsive image techniques get easier with the auto keyword for sizes.
<img src="photo.jpg"
srcset="photo-400.jpg 400w, photo-800.jpg 800w, photo-1200.jpg 1200w"
sizes="auto"
loading="lazy"
width="1200"
height="800"
alt="A mountain landscape">
Using sizes="auto" on an image with loading="lazy" tells the browser to automatically calculate the size based on the actual layout width once it’s known. This means you don’t have to predict the rendered layout width ahead of time.
Safari 27.0 adds support for the shadowrootslotassignment attribute on declarative shadow roots. This lets you configure the slot assignment mode (named or manual) directly in HTML when defining a shadow root declaratively, matching the JavaScript attachShadow({ slotAssignment: "manual" }) option.
Environments in visionOS are an incredible part of the experience of Vision Pro. They let you transform your physical surroundings into a different place—like Yosemite, Mount Hood, or the Moon. It’s been possible for Apple developers creating immersive apps for visionOS to provide custom environments with their app. Now in Safari 27.0, environments can be provided as part of a website.

You can provide an immersive environment with a simple <model> element and one JavaScript API call. The Immersive API on the model element works similarly to how the Fullscreen API does on video elements. Learn all about it in Explore immersive website environments in visionOS.
By the way, this new Immersive API replaces the developer preview originally called Spatial Backdrop. If you built anything using Spatial Backdrop, migrate it to the Immersive API on the <model> element.
Now the <img> element has a controls attribute in HTML. It works just like the controls attribute on the video and audio elements. When present, the browser offers controls to allow the user to adjust or more fully experience the media.
<img controls src="panorama.jpg" alt="A panorama of the Dolomites" >
In Safari 27.0 in visionOS when the controls attribute is present, Safari provides a user interface for interacting with spatial and panorama photos. This gives users an easy and consistent mechanism to view photos spatially or immersively, and eliminates the need for web developers to build their own UI.

Safari 27.0 adds support for texture array projection layers in WebXR Layers. When creating a projection layer with XRWebGLBinding.createProjectionLayer(), you can now request textureType: "texture-array" so each eye’s view renders into its own layer of a single texture array.
Many websites inject content into the page as the user is reading or viewing that content. The new content often appears above where the user is currently looking — like images, ads, or comments being injected into the page. In the past, this caused the content the user was reading to be suddenly pushed down, causing a disorienting jump to a random place on the page.
Now with support for Scroll Anchoring, Safari 27.0 instead adjusts the scroll position and keeps the content exactly where it was before the content insertion. As a web developer, you don’t have to do anything to enable this on your site. It just works.
Scroll anchoring is controlled by the overflow-anchor CSS property, which defaults to auto. If you have a specific need where you need to opt out of scroll anchoring, you can use overflow-anchor: none.
Safari 27.0 adds support for using stretch with the properties width, height, min-width, max-width, min-height, max-height, and flex-basis. The stretch keyword tells an element to fill the available space in the relevant axis.
.card {
width: stretch;
}
It’s just like using width: 100% — but this time accounting for margins, which prevents overflow. If you’ve been using -webkit-fill-available to solve this need, now is a good time to switch.
Safari 27.0 makes three updates to anchor positioning, as the web standard evolves and the tool becomes more powerful.
First, we added support for transform-aware anchor positioning. Now, when an anchor element has a CSS transform applied — scale, rotate, translate, or any combination — elements positioned relative to that anchor follow its transformed position instead of its pre-transform layout position. This works for transforms applied via the transform property as well as through the individual translate, rotate, and scale properties. If you use anchor positioning to attach a tooltip, popover, or annotation to a transformed element, it now tracks correctly, even with animated transforms.

Second, the default value for position-anchor changes from auto to normal, fixing a potential side effect where the positioning behavior of elements that don’t even use Anchor Positioning could be impacted. The new value none opts out entirely. The new default, normal, behaves the same as none unless position-area is also set, in which case it behaves like auto did, as originally intended.
And third, Safari 27.0 also adds support for anchor-valid and anchor-visible . Originally, position-visibility: anchors-valid hid an element if any of its required anchor references couldn’t be resolved. However, it wasn’t clear what constituted “required anchor references”. So the CSS Working Group changed the behavior to only look at the default anchor box. To match, some keywords were renamed to drop the plurality. The anchors-valid value is now anchor-valid , while anchors-visible is now anchor-visible. Safari 27.0 aligns with the new behavior, and temporarily supports the old keywords for compatibility.
The new alpha() relative color function is a shorthand for adjusting just the alpha channel of an existing color, without repeating the rest of its channels: alpha(from var(--mycolor) / 80%). It keeps the origin color in its own color space and only changes the alpha value — useful when you want a more transparent or more opaque version of a color you already have, without writing out the full relative color syntax.
The color-mix() function now accepts more than two colors, so you can blend several colors together at once, like color-mix(in oklab, teal 20%, olive 30%, blue 50%). If you leave out the percentages, each color contributes equally.
The image(<color>) function lets you use a solid color anywhere an <image> value is expected. Unlike background-color, which sits underneath all background layers, image(<color>) behaves like a real image layer — it can stack above other background images, get sized with background-size, and be positioned and clipped like any image.
Safari 27.0 also adds support for forwarding missing color components when interpolating between analogous color spaces. Previously, a color with an intentionally missing component (none), like an achromatic gray with no meaningful hue, could get incorrectly assigned a hard 0 when converted into an analogous space for interpolation, producing a subtly wrong blended color. Now the missing component is carried forward as missing instead, so interpolation behaves the way you’d expect.
The light-dark() function now accepts <image> values, not just colors, so you can specify different images for light and dark color schemes in a single declaration: background-image: light-dark(url(day.png), url(night.png)). Gradients work here too.
Safari 27.0 adds support for the :heading pseudo-class, which matches any heading element — <h1> through <h6>. Instead of writing h1, h2, h3, h4, h5, h6 in your selector list, you can just write :heading. Plus, :heading also has a functional form for targeting specific levels, for example, :heading(1, 2) matches only <h1> and <h2>.
The revert-rule keyword is now supported in Safari 27.0. Like revert and revert-layer, revert-rule rolls back the cascade — but specifically to the state as if the current style rule had not been present. It gives you a more precise tool for working with overrides, especially in component libraries and design systems where you want to selectively undo declarations within a rule without losing the rest.
The CSS progress() function now supports a no-clamp option in Safari 27.0. By default, progress() returns how far a value sits between two bounds as a ratio from 0 to 1, clamped to that range. Adding no-clamp removes the clamp, so the result can fall below 0 or above 1, which is useful when you want an effect to keep scaling past its defined bounds instead of flattening out at the edges.
Safari 27.0 adds support for contain: style applying to CSS quotes. This allows you to scope effects of quotes to a certain subtree.
Safari 18.4 added support for text-autospace to control spacing between Chinese/Japanese/Korean (CJK) and non-CJK characters. Safari 27.0 now adds the insert keyword, making text-autospace: ideograph-alpha ideograph-numeric and text-autospace: ideograph-alpha ideograph-numeric insert equivalent.
The Dutch IJ digraph is now supported in Safari 27.0. When the content language is Dutch (lang="nl"), text-transform: capitalize and ::first-letter now correctly titlecase “ij” to “IJ” at the start of words.
Safari 27.0 adds support for the case-sensitive s modifier in CSS attribute selectors. Adding s after the value forces a case-sensitive match — for example, a[href$=".PDF" s] matches only a literal uppercase .PDF. This is the counterpart to the i modifier you may already be using to force case-insensitive matching (a[href$=".pdf" i] matches .pdf, .PDF, .Pdf, and so on); s lets you go the other way when you need an exact-case match on an attribute HTML would otherwise treat as case-insensitive.
Safari 27.0 also adds support for the :host:has() compound selector, letting a shadow host style itself based on what’s inside its own shadow tree. Because :has() can compound onto any selector, :host:has(:checked) or :host:has(::slotted(img)) let a custom element’s host change its own appearance depending on the state of its shadow content — useful for web component authors who want the host to react to what’s inside it without reaching for JavaScript.
Safari 27.0 adds the animation property to the AnimationEvent and TransitionEvent interfaces, letting event handlers directly access the Animation object associated with the event.
Safari 27.0 adds quite a few improvements to SVG.
Now the lang and xml:lang attributes are supported inside SVG. Use it to specify the language of text content to ensure correctness of both text rendering and accessibility announcements.
Safari 27.0 adds support for <use> referencing an external SVG file without a # fragment identifier. Previously, in order to point <use href="…"> at another SVG document, you had to name a specific element inside it with a fragment but now <use> can reference the external file on its own. There’s also a fix so <a> elements in SVG are treated consistently with HTML <a> elements for origin/security checks.
Several non-standard and legacy SVG interfaces have been removed to better align with the SVG 2 specification:
SVGLocatable and SVGTransformable interfacesnearestViewportElement and farthestViewportElement properties on SVGGraphicsElementviewTarget property on SVGViewSpecglyph-orientation-horizontal propertyPlus, there are a huge number of SVG fixes shipping this year. See the list below for what’s improved in Safari 27.0.
Safari 27.0 adds support for WebAssembly JavaScript Promise Integration (JSPI). JSPI lets synchronous-looking WebAssembly code suspend and wait for JavaScript Promises, making it much easier to port existing C, C++, Rust, and other language code to the web where that code expects synchronous I/O.
Before JSPI, porting code that called synchronous APIs to Wasm required rewriting everything on top of a callback or async state machine. With JSPI, the Wasm module can suspend at a call site and resume when the Promise resolves — the rest of the module sees straight-line synchronous code. This is a significant capability for the Wasm ecosystem.
Safari 27.0 includes a complete standards-compliant rewrite of the ECMAScript module (ESM) loader. The new loader is implemented in native C++ and conforms directly to the ECMAScript specification’s module loading algorithms, replacing an earlier implementation based on an abandoned 2016 WHATWG Loader proposal that predated top-level await entirely.
The rewrite fixes module execution ordering and initialization issues that could cause imports to access exports before they were fully evaluated. It was validated against test262, the Web Platform Tests, and additional test cases.
Top-level await is a foundational feature of modern JavaScript module authoring, and it’s been a real pain point in Safari for a while — a known source of cross-browser bugs that developers building module-based apps had to work around. This fix closes that gap. To learn more, read Fixing Top-Level Await in Safari.
Safari 27.0 adds support for the TC39 BigInt Math proposal, which brings Math-equivalent operations to BigInt as static functions on the BigInt constructor: BigInt.abs, BigInt.sign, BigInt.sqrt, BigInt.cbrt, BigInt.pow, BigInt.min, and BigInt.max. Like the existing BigInt.asIntN(), they’re called directly on BigInt rather than as instance methods, since BigInts are primitives.
This fills a real gap: Math.sqrt() and friends only accept Number, and routing a BigInt through Number to use them loses precision above 2^53. BigInt.sqrt() and BigInt.cbrt() truncate toward zero, so BigInt.sqrt(16n) returns 4n and BigInt.sqrt(17n) also returns 4n — there’s no ceil, floor, or round variant, since there’s no fractional BigInt to round in the first place. The proposal is still at TC39 Stage 1, so treat the exact API as early and possibly still changing.
Safari 27.0 adds support for import defer, a TC39 Stage 3 proposal that lets you import a module without evaluating it right away. The module and its dependencies are still loaded and linked up front, as part of the normal module graph — only execution is deferred, until the first time you access a property on the imported namespace:
import defer * as ns from "./big-library.js";
// big-library.js hasn't run yet — no top-level side effects,
// no cost beyond parsing and linking.
ns.doSomething(); // first property access triggers evaluation, synchronously
import defer only works with the namespace form (import defer * as ns) — there’s no equivalent yet for named imports like import defer { x } from "…", and modules that use top-level await can’t be deferred, since evaluation has to stay synchronous when you access the namespace.
This builds on the ECMAScript module loader rewrite described above: it gives you a standards-based way to keep expensive module initialization out of your startup path — large libraries, polyfills, or platform-detection branches where you import several possible modules but only end up needing one.
Safari 27.0 adds support for the Service Worker static routing API. This lets a service worker declare routing rules that the browser can use to bypass the service worker entirely for certain requests, reducing overhead for high-performance PWAs.
Safari 27.0 adds three improvements to ReadableStream. First, the async iteration with for await...of:
const response = await fetch("/data");
for await (const chunk of response.body) {
process(chunk);
}
Second, the ReadableStream.from() static method for creating a stream from any async iterable or iterable:
const vegetables = ["Carrot", "Broccoli", "Tomato", "Spinach"];
const asyncIterator = (async function* () {
yield 1;
yield 2;
yield 3;
})();
// Create ReadableStream from the array
const myReadableStream = ReadableStream.from(vegetables);
// Create ReadableStream from async iterator
const asyncReadableStream = ReadableStream.from(asyncIterator);
And third, the ability to transfer a ReadableStream , WritableStream and TransformStream across contexts via postMessage().
Several Web Inspector updates in Safari 27.0 make common debugging tasks easier.
The Color Picker now shows color contrast information inline as you edit. No more switching tools mid-decision to check whether a color combination is accessible. This works when you’re editing both foreground and background colors at the same time.

The Color Picker’s format and gamut controls are also now visible upfront instead of hidden. If you’ve ever gone hunting for those options, this will help.

In the Network tab, when a resource redirects, you can now see every request in the chain rather than just the final destination. It’s much easier to figure out what’s actually happening.

The Elements tab adds Subgrid and Grid-Lanes badges that make it easy to identify subgrid and grid-lanes layout contexts as you explore a page.

The Timeline tab now includes the layout root element in Layout event details, so you can see which element triggered a layout pass. The Timeline view also uses distinct colors for style events like “Style Invalidated” and “Style Recalculated”, making them easy to tell apart from layout events at a glance, and adds a separate column showing the node associated with each layout and rendering event.
Safari 27.0 supports setting TextTrackCue.endTime to Infinity to represent an unbounded cue duration. It’s useful for captions or data cues of live streams.
Safari 27.0 adds support for synchronized video playback on macOS displays using genlock. Genlock synchronizes the timing signal across multiple displays or capture devices, which is important for broadcast, live-event, and multi-display installation setups. Even a few frames of misalignment between screens is visible. When genlock is available, video played in Safari stays in lockstep with the rest of the signal chain instead of drifting on its own clock.
Safari 27.0 improves how HDR images with gain maps are decoded and rendered, decoding them into accelerated backing stores in the GPU process. This is a rendering-pipeline improvement rather than a new API — HDR photos with gain maps (the format used by iPhone’s Adaptive HDR photos) should render more correctly and efficiently, building on gain-map rendering fixes from recent releases.
Safari 27.0 lets you override the color space a hardware VideoDecoder uses when decoding video with WebCodecs. This helps when a stream’s embedded color space metadata is missing or wrong. Now, you can tell the decoder which color space to interpret the frames in instead of being stuck with an incorrect result.
Safari 27.0 adds support for the nextslide and previousslide MediaSession actions, mapping them to the platform’s nexttrack and previoustrack commands, which are the hardware and remotes people already use to skip tracks. If a page hasn’t registered a nexttrack or previoustrack handler but has registered nextslide or previousslide, pressing next or previous invokes the slide handler instead. This lets presentation and slideshow web apps respond to the same physical controls as music and video apps.
Safari 27.0 adds support for Secure cookies on loopback hosts. For loopback hosts using plaintext HTTP, cookies marked Secure can now be set via JavaScript and Set-Cookie headers, matching the behavior of other browsers, simplifying local development and testing with Secure cookies.
Safari 27.0 now supports the clip_distances built-in value in WGSL shaders. Clip distances are a WebGPU feature that allows vertex shaders to define custom clipping planes, enabling you to discard geometry on one side of an arbitrary plane before rasterization occurs.
The radii argument of CanvasPath.roundRect() is now optional in Safari 27.0. Calling roundRect(x, y, width, height) without radii draws a plain rectangle with square corners which is the same as calling rect() , matching the behavior of other browsers.
Safari 27.0 adds srgb-linear and display-p3-linear to predefined color spaces, making these linear-light color spaces available in Canvas, WebGL, and other APIs.
Safari 27.0 updates its MathML operator dictionary to match the MathML Core specification, adding support for multi-character operators (like ++, :=, and /=). This improves spacing and layout for these operators in complex mathematical notation.
In addition, Safari 27.0 supports tabindex, focus(), blur(), and autofocus on MathML elements, improving MathML feature parity with HTML. This makes math content fully participate in keyboard navigation and focus management, which supports interactive educational content and accessibility.
Safari 27.0 also adds support for detecting embellished operators through <mrow> for underover layout. In MathML, an operator wrapped in a grouping element like <mrow> — for example, <mrow><mo>∑</mo></mrow> used as the base of a <munder> or <munderover> — still counts as that operator for layout purposes.
And the href attribute is now deprecated on all MathML elements except <a>, matching how HTML already restricts href to elements built for navigation rather than treating it as a global attribute.
Safari 27.0 adds support for the targetLatency attribute in WebRTC, for specifying a target latency on a receiver. It adds support for the RTCRtpCodec dictionary and related constructs, improving the ability to inspect and configure codecs. It adds support for RTCRtpReceiver.jitterBufferTarget, for tuning the jitter buffer. And it adds video source width and height to RTC stats.
Safari 27.0 now supports specifying maxAge when setting a cookie via the Cookie Store API.
await cookieStore.set({
name: "session",
value: "abc123",
maxAge: 60 * 60 * 24 * 7, // one week, in seconds
});
Safari 27.0 now supports menu items that convert editable text between Simplified and Traditional Chinese characters. It’s available in the “Transformations” submenu of the context menu for relevant text selections.
Safari 27.0 adds WebDriver support for the Digital Credentials API, with commands that let automated tests simulate wallet payloads, wait indefinitely for a credential response, and simulate a user rejecting the request. This lets you write end-to-end tests for Digital Credentials flows without needing a real wallet or person to drive the interaction.
The runtime.getDocumentId() Web Extension API now has support in Safari 27.0. It adds reporting of uncaught JavaScript exceptions and unhandled promise rejections in Web Extension scripts, making extensions easier to debug. It adds support for propagating user gestures through sendMessage(), connect(), postMessage(), and executeScript() — so extensions can reliably perform actions like media playback that require user activation. And it adds support for the tabId key in chrome.windows.create(), letting an extension move an existing tab into a newly created window instead of only creating new tabs from scratch.
Safari 27.0 helps native app developers do even more using the WKWebView public API for native app developers. Build advanced browser and web-hosting experiences on top of WebKit more easily with the following new features:
WKJSHandle — use JavaScript object references from native code.WKContentWorldConfiguration — configure content world properties such as autofill scripting, shadow root access, and inspectability when creating a WKContentWorld.alternateRequest and overrideReferrerForAllRequests on WKWebpagePreferences — modify the main resource request during navigation and apply custom referrer headers across all resource loads.willSubmitForm callback on WKNavigationDelegate — receive notification of HTML form submissions via a new WKFormInfo object.mainFrameNavigation on WKNavigationAction and mainFrameNavigation on WKNavigationResponse — correlate navigation actions and responses with each other and their originating loads. WKWebView.load(_ url:) — load a URL directly without wrapping it in an NSURLRequest. WKDOMNodeSnapshot — clone DOM nodes, including shadow roots, between different WKWebView instances.WKHTTPCookieStore.cookies(for:) — retrieve cookies matching a specific URL without fetching the entire cookie store.WKWebpagePreferences.globalPrivacyControlEnabled — let a native app enable or disable sending the Global Privacy Control (GPC) Sec-GPC HTTP header on outgoing requests for a given page load. speechSynthesis.cancel() removed utterances queued by subsequent speechSynthesis.speak() calls. (46151521)<use> elements referencing <symbol> elements inside an <img> were incorrectly included as unnamed images in VoiceOver’s Images rotor. (98999595)id attribute of an element targeted by aria-owns did not update the accessibility tree. (107644248)aria-labelledby to correctly use their assigned slotted content for accessible names and ignore hidden slotted nodes. (114500560)<meter> element to have consistent labels between aria-label and title attributes. (127460695)display: contents and content in a shadow root to have their content properly read when referenced by aria-labelledby. (129361833)aria-labelledby to use the checkbox name instead of its value when the checkbox name comes from an associated <label> element. (141564913)drawFocusIfNeeded() canvas API. (146323788)role="presentation". (159304061)<details> elements was not exposed in the accessibility tree. (159865815)contextmenu event was not fired for elements inside iframes when triggered by keyboard or assistive technology actions such as VoiceOver’s VO+Shift+M. (164128676)<input type="button"> elements inside live regions were not announced by assistive technologies. (168200460)::first-letter text not being exposed in the accessibility tree when no other text accompanies it. (168458291)aria-owned rows and their cells in grids and tables. (168770938)<svg> named by a child <title> element did not expose an accessible name. (172559238)aria-activedescendant, preventing assistive technologies from interacting with list items. (172931277)hidden="until-found". (173228707)aria-owns was not respected when computing the accessible name from element content. (173249317)focus() calls for newly added elements. (177167634)<a> element with a click handler but no href not being exposed as a link. (179398579)aria-labelledby when the referenced element dynamically changes its aria-label. (180319221)animation-fill-mode did not correctly apply viewport-based units after the viewport was resized. (80075191)!important declarations did not override CSS animation values when CSS transitions were also running on the same property. (174367827)-webkit-text-fill-color incorrectly overrode text-decoration-color. (47010945)shape-outside computing incorrect text wrapping in RTL writing modes. (56890238)aspect-ratio intrinsic-size handling in flex layout to align with the specification. (83240099)flex-basis instead of the specified value for definiteness evaluation. (85707621)outline: auto on macOS. (94116168)box-shadow did not work on display: table-row elements. (96914376)text-indent with calc() containing percentages to correctly treat percentage components as zero for intrinsic size contributions. (97025949)fit-content. (97492632)clip-path: inset() border-radius values did not render correctly at certain element and clip-path sizes. (110847266)text-decoration-thickness propagation to inner spans with non-inline style. (111015539)-webkit-box flexbox emulation not sizing children correctly inside <fieldset> elements. (114094538):where and :is selectors. (114904007)display: table could have incorrect layout when borders were present. (116110440)aspect-ratio not being respected on flex children when the flex container has position: absolute. (117807518)aspect-ratio not working correctly on flex children that also have overflow set. (118926827)font-family serialization to preserve quotes around family names that match CSS-wide keywords or generic families. (125334960)border, position: absolute, and aspect-ratio: 1 were not rendered as squares. (126292577)perspective-origin failed to resolve var() references when used as the second value, preventing animations from being applied. (131288246):focus-visible incorrectly matching after a programmatic focus() call triggered by clicking a button with child elements. (134337357)min-height. (134356544):has() selectors could freeze. (138431700)unicode-range. (140674753)@media (prefers-color-scheme: dark) inside an iframe did not match when the iframe’s color-scheme was set to dark. (142072593)background-clip: text did not work on table header elements. (142812484)width: 0 did not collapse a table cell to its minimum size. (142814603):has(:empty) continued to match after the targeted element’s content was dynamically changed to no longer be empty. (143864358)text-transform on elements with ::first-letter styling. (145550507)height: max-content resolved to zero on absolutely positioned elements when a child had max-height: 100%. (147333178)inline-flex container with flex-direction: column did not update its width to match the intrinsic size of a child image when the image was not cached. (150260401)zoom interacting incorrectly with font-weight, font-style, and font-variant on iPad. (152173269)aspect-ratio enforced the automatic minimum size even when min-width was explicitly set to 0. (156837730)aspect-ratio not being preserved when width: 100% and height: 100% are set but no ancestor has a defined width. (162373271):has() style invalidation performance for selectors where :has() is in non-subject position. (163512170)display: contents. (164414720)border-width value types. (168240347)inset box-shadow was incorrectly positioned on table cells with collapsed borders. (169254286)position-try-order to interpret logical axis values using the containing block’s writing mode instead of the element’s own writing mode. (169501069)fit-content, min-content, max-content) incorrectly resolved against the containing block’s height instead of being treated as auto. (171179193)@scope styles did not apply to slotted elements in web components. (171383788)nowrap minimum width calculation quirk was applied outside of quirks mode. (171410252)display property transitions caused popovers and <dialog> elements to animate incorrectly when closing. (171454696)contain: layout caused significantly slower forced layouts when all siblings created their own formatting context. (171545381)::first-letter styling. (171649994)color-scheme did not repaint iframe background. (171658244)position: absolute. (171735933)color: initial resolved to the wrong color when the system is in dark mode. (172320282)display: contents did not establish an anchor scope when using anchor-scope. (172355302)<general-enclosed> in media queries to reject content with unmatched close brackets per the <any-value> grammar. (172575115)rlh unit was double-zoomed with evaluation-time CSS zoom. (172798163)outline: auto to correctly respect zoom. (173068660)outline-offset to work correctly with outline: auto on iOS. (173130230):active, :focus-within, and :hover pseudo-classes to correctly account for elements in the top layer. (173145294)ic length unit was incorrectly affected by page scaling. (173198587)shape() function to omit default control point anchors in computed value serialization per the CSS Shapes specification. (173233716):focus-visible instead of :focus. (173321368)lh and rlh units resolved with double-zoom when line-height was a number value. (173448638)outline-width to be ignored when outline-style is auto, matching the specification. (173567890):in-range and :out-of-range pseudo-classes for time inputs with reversed ranges. (173589851):placeholder-shown to correctly match input elements that have an empty placeholder attribute. (173604635)font-size: 0. (173840866)getComputedStyle() to be zero, if the element uses position-area or anchor-center. (173885561)position-area not being able to anchor to an element positioned using anchor functions. (173964030):in-range and :out-of-range pseudo-classes to correctly update when the readonly attribute changes. (173978657)view-timeline-inset serialization failed to coalesce identical values. (174096313)url() token serialization in CSS custom properties. (174144616)text-autospace to correctly handle supplementary Unicode characters. (174148315)order values caused incorrect baseline alignment. (174241817)::first-letter text showed a pointer cursor instead of the expected I-beam cursor. (174258447)display: grid on a <fieldset> element added extra unnecessary space below its content. (174301311)outline-style. (174328839)aspect-ratio was not honored when the page was zoomed in. (174361289)height: 100% on a child element altered the layout when the parent’s height was defined via aspect-ratio. (174448267)document.styleSheets and shadowRoot.styleSheets incorrectly included adopted style sheets, which per the CSSOM specification should only appear in the final CSS style sheets list used for style resolution. (174583340)-webkit-box-pack to account for -webkit-box-direction and to handle overflow repositioning correctly. (174588996)::selection and ::highlight to disallow vendor-prefixed properties, aligning with the CSS Pseudo-Elements specification. (174590593)FontFace.loaded to reject when a local() font source fails to load. (174631384)word-break: break-all incorrectly allowed CJK close punctuation to appear at the start of a line. (174656971)word-break: keep-all incorrectly suppressed line break opportunities at CJK punctuation characters. (174658701)FontFace constructor to reject with a SyntaxError instead of a NetworkError when a BufferSource fails to parse, per the CSS Font Loading specification. (174669738)FontFace family attribute to return the serialization of the parsed value. (174698351)calc() values for the specified size suggestion. (174863227):has() sibling invalidation issues related to relation forwarding. (175006235)min-width: auto was not correctly computed for flex items. (175157619)margin-trim: block-start did not apply to blocks nested inside inline boxes. (175162899)display: contents on a <fieldset> legend caused incorrect rendering. (175163337):has() invalidation performance by including the full selector context in invalidation selectors. (175177078):hover state to repaint correctly on the customizable <select> element. (175273152)@import URLs against the <base> element URL. (175305190)-webkit-box flex distribution for children with orthogonal writing modes. (175323734)calc(infinity) as a flex-grow factor not stretching a flex item to 100% width. (175431146):has() sibling invalidation failing due to an internal bitfield overflow, causing stale styles when siblings are added or removed. (175433733):has() invalidation for sibling combinators when elements are inserted or removed from the DOM. (175441568)transition-property not preserving the specified case of <custom-ident> values during serialization. (175467206)will-change property not serializing correctly when used with non-property identifiers or identifiers in a non-standard case. (175482352)top and bottom values on relatively positioned elements not resolving when the containing block has aspect-ratio. (175502356)<select> element to use self- keywords for anchor positioning. (175505107)text-indent computation when tab stop positions are involved. (175529961)calc() margin computations in flex layout. (175532405)calc() margin computations for block, fieldset, and table caption layouts. (175548980)<li> value attributes in reversed ordered lists. (175558324)sibling-index() and sibling-count() inside calc() functions to be correctly simplified. (175590806)sibling-index() and sibling-count()to correctly return 0 when used in cross-tree ::part() styling. (175592607)resize handle not working on an element when the handle overlaps a child iframe. (175621855)calc() margins or padding lost the fixed component during intrinsic width computation. (175669222)margin-start incorrectly overlapping adjacent floats. (175669464)aspect-ratio calculations for block-level elements with size constraints. (175669713)aspect-ratio calculations for flex items with percentage cross-size constraints. (175669774)aspect-ratio calculations for flex items with definite cross-size values. (175690028)revert-layer computing incorrectly when there is a leading empty or space substitution value. (175729680):has() invalidation incorrectly resetting sibling relation bits, causing style invalidation failures for first-in-sibling-chain elements. (175738008)overflow: hidden clipping content on subsequent items. (175877530)CSSStyleDeclaration.setProperty() failing to apply !important priority to an existing inline style property when the value was an integer of 255 or lower. (176099619)min-height: min-content were incorrectly treated as scrollable, zeroing out their minimum size. (176173688):has() invalidation performance when used inside nested :is() selectors. (176354723)sibling-count() & sibling-index() used in @keyframes to re-resolve when siblings change. (176531901):has() style invalidation failing in complex nested cases involving :is(). (176719780)-webkit-perspective not establishing a containing block for fixed-positioned descendants. (176729670):has() selector performance by using scope selectors to limit style invalidation traversal for class, attribute, and pseudo-class changes. (176771971)aspect-ratio and a percentage max-width collapsing to zero width during intrinsic sizing. (176873776)max-width on elements with aspect-ratio resolving against the wrong axis in perpendicular writing modes. (176879597)z-index not applying to statically-positioned display: -webkit-box items to align with Firefox and Chrome behavior. (176886461)img with max-width and surrounding elements that caused the parent’s layout to compute incorrectly. (176889859)box-sizing: border-box providing the wrong cross size to stretched flex items. (176989934)aspect-ratio-derived height not providing a definite cross size to their flex items. (177085129)<div> positioning to fix the broken layout of paragraph spacing on some sites. (177139092)zoom to be animatable by the computed value. (177411607)attr() to align with disallowing the <url> type. (177540489)::first-letter to use the correct definition of punctuation. (177599506)offset-path to respect <coord-box> when blending shape() and basic-shape paths. (177685457)aspect-ratio providing a definite cross size to flex items when it should not. (177705930)inline-block baseline to fall back to the bottom margin edge when the content has no in-flow line boxes. (177753094):focus-visible. (177850766)@font-face font-style to serialize ‘oblique 0deg’ as ‘normal’. (178185291)font-variant longhands set after a system font. (178251443)CSSFontFeatureValuesRule.fontFamily to be settable rather than readonly. (178323504)font-style: oblique to be clamped against the font’s slant range rather than the @font-face weight range. (178324521)font-style: oblique angle being applied to the variable font ‘slnt’ axis with the wrong sign. (178326843)background and mask coordinated property list resolved values to match the specification. (178378309)none. (178476769)@font-face font-weight, font-width, and font-style oblique descriptor ranges with equal bounds to collapse to a single value, per CSSOM. (178517226)font-synthesis to avoid synthesizing styles outside of a font’s variable axis range. (178550149)font-style: italic to slant a variable font whose @font-face uses an oblique angle. (178566326)font-synthesis incorrectly applied synthetic oblique to variable fonts declared with @font-face. (178698772)height: max-content uses the used width rather than the default width. (178712792)color-mix() to allow percentages that sum to zero. (178758710)color-mix() resolution for the new 0% rules. (178921722)min-width: min-content being clamped to a smaller max-width. (178777567):last-child and related selectors incorrectly gating on parser state outside of style resolution. (178879939)@font-face font-weight descriptor explicitly restricts it to normal. (179001275)color-scheme of an <iframe> not invalidating the appearance of the embedded document. (179177141)min(), max(), clamp(), and mod(). (179534440)hsl() and hwb() colors that contain at least one none component value so they preserve their hsl()/hwb() function rather than converting to rgb(). (179854247):target) snap area over other aligned snap targets. (180108825)input[type=hidden] was not set to display: none !important in the user-agent stylesheet. (180137214)@import rules that follow an @layer statement rule. (180170656)CSSViewTransitionRule. (180170814)MediaList.deleteMedium() to parse its argument as a media query and remove all matching queries. (180270019)MediaList.appendMedium() to parse its argument as a single media query and suppress duplicates. (180291283)stretch or fit-content preferred sizes computing incorrect minimum-content contributions when sizing tracks. (180748205)var() to only resolve its fallback when the first argument resolves to the guaranteed-invalid value. (181114298)pagereveal and starting an outbound cross-document view transition. (181191512)anchor-center in vertical writing modes not being scroll-adjusted along the block axis. (181413103)origin-clean flag when reset. (177858398)fillText with textAlign=center misplacing complex-shaped text. (178682402)::first-letter were not selectable. (5688237)<font> size would be incorrectly substituted with the legacy size, causing inconsistent rendering across different default font size configurations. (15292320)execCommand('FormatBlock') did not preserve inline styles of replaced block elements, causing text formatting to be lost when pasting content. (157657531)text-indent flickered or was ignored on contenteditable elements while typing. (170280101)user-select: none. (170475401)contentEditable element to a non-editable target. (171221909)margin-top on a <legend> element inside a <fieldset> did not shift the fieldset down. (141267953)<datalist> suggestions appearing with white text on a white background in dark mode after typing. (168676757)<input> element associated with a <datalist> was intercepted by type-to-select behavior. (173346270)<input type="checkbox" switch> control behave more like other controls with regards to native appearance CSS properties. (173487610)<select multiple> did not always fire onchange when the mouse button was released far outside the element. (173882861)<select> control rendering was broken in vertical writing mode. (174068353)<select> elements with thousands of <option> children via innerHTML caused O(n²) overhead due to repeated list recalculation. (174244946)min or max attributes incorrectly matched the :in-range pseudo-class. (174829899)<input> and <textarea> elements did not preserve their user-modified state. (174892989)<option> elements to correctly implement the HTML specification’s dirtiness concept for tracking user-modified selected state. (175306111)<select> element is anchor positioned. (175454476)display value for <optgroup> and <option> elements to block, matching the behavior of other browsers. (175473184)field-sizing: content clipping the placeholder on number inputs that have no value. (175883299)<option> and <optgroup> elements to match the :disabled pseudo-class when inside a disabled <select>. (176559708)top: 100%) being mispositioned when its containing block is out-of-flow with percentage height. (177181803)<select> with appearance: base-select, including spacing, borders, border-radius, overflow, cursors, optgroup styling, picker dialog shadow, and increased contrast colors. (183345556)map element without a name attribute did not match its associated image using the id attribute. (12359382)<meta> parsing to correctly treat form feed as ASCII whitespace per the HTML specification. (108440799)javascript: URLs to align with the specification. (147612682)<img> elements with a src attribute to be dramatically slower than other browsers. (166201075)<iframe> using the srcdoc attribute did not render. (167917471)<body>, <iframe>, and <frame> elements. (171240848)replaceWith() stopped processing remaining nodes if a script in the replacement removed a sibling. (172753019)disabled attribute. (173378582)rel attribute on an <a> element multiple times did not clear prior link relations. (173567839)<li> elements. (173983892)<object> elements, aligning with other browser engines. (174537345)window.open() to correctly consume user activation when creating a new browsing context, aligning with the HTML specification. (174587258)<img sizes="auto"> to fully align with the specification. (174684058)requestClose() incorrectly firing multiple cancel events and causing a stack overflow. (174850509)requestClose() incorrectly removing the open attribute when called on a disconnected dialog element. (174855725)dir=auto on <slot> elements did not update when slotted content changed. (174871706)<option> elements rendered incorrectly when the label attribute was empty. (174979446)<source> elements with an empty type attribute inside <picture>. (175094037)innerText to emit a newline for empty <option> or <optgroup> inside <select>. (175245381)+ sign. (175300431)innerText to no longer emit newlines for visibility: hidden block elements. (175569426)innerText to correctly emit blank lines around <p> elements regardless of their CSS display value. (175729427)<a rel="ar"> elements wrapping <model> elements to correctly enter ARQL without extra steps and to display the AR badge. (176410897)innerText on tables to no longer emit spurious trailing newlines and to preserve row-exit newlines after empty rows. (176635985)<image> tags. (176712749)pushState with custom application URL schemes. (177547157)outerHTML setter to align with the HTML standard. (177788638)xmlns="" inheritance and annotation-xml encoding. (177808494)createHTMLDocument() to no longer leave the body in a parsing state. (178440940)<link rel=preload as=json> incorrectly triggered a preload. (179843455)align="center" attribute was not treated as identical to align="middle" per spec. (180128710)srcset attribute into a dynamically created iframe resulted in an invisible image. (66849050)naturalWidth and naturalHeight returning incorrect values for SVG images without intrinsic dimensions. (141196049)img element did not update its image data. (172856773)<picture> <source> candidates being speculatively preloaded even when the inner <img> has loading=lazy. (177833110)HTMLImageElement.decode() to no longer resolve spuriously after adoption, src change, or cached-image reuse. (178118012)%TypedArray%.prototype.subarray to calculate beginByteOffset correctly to align with ECMA-262. (168143600)RegExp.prototype[Symbol.split] to align with ECMA-262. (168288878)Array.prototype.concat to correctly handle arrays with indexed accessors, preventing getter reentry from bypassing Symbol.isConcatSpreadable checks. (172237596)[[Set]] to check the receiver before writing to the typed array. (173386404)%ArrayIteratorPrototype%.next() to return { done: true } instead of throwing a TypeError when the source TypedArray is detached and the iterator has already completed. (173759106)import { “``" as x } was incorrectly treated as a namespace import instead of a named import using the string “" as a ModuleExportName. (174314099)RegExp.prototype.exec and RegExp.prototype.test could match against a stale pattern if lastIndex has a valueOf that calls RegExp.prototype.compile. (174461752)Intl.Segmenter with granularity: "word" incorrectly reported isWordLike: false for numeric segments. (175057894)Object.defineProperties to call Proxy traps in the correct order. (175068687)Intl.Locale did not canonicalize before overriding the language. (175092327)Array ToPrimitive fast path incorrectly ignoring overrides of Object.prototype.valueOf. (175122250)Intl.DateTimeFormat to preserve the original legacy timezone identifier instead of replacing it with the primary IANA ID. (175206605)Promise.prototype.finally to throw a TypeError when @@species is not a constructor, matching the behavior of other browsers. (175290627)/v flag. (175559808)TypedArray.prototype.lastIndexOf by adding SIMD-accelerated reverse search for numeric types. (175904377)export statements was significantly slower than necessary. (175949532)DataView constructor to match specification-defined argument validation order and error throwing behavior. (176110210)Array.prototype.concat could produce incorrect results when combining arrays with incompatible indexing types. (176219964)TypedArray constructor edge cases involving buffer sequences to align with the specification. (176724918)WebAssembly.Memory and WebAssembly.Module to align their cloning and transferring behavior with SharedArrayBuffer. (176792374)Array.prototype.join to include prototype elements added during element toString invocation. (178055452)Temporal.Instant operations were not aligned with the spec’s abstract operations. (179844859)<mo> element attributes did not trigger a relayout. (170907029)minsize and maxsize defaults and percentages did not use the unstretched size as specified. (170908253)<mprescripts> element within <mmultiscripts> layout. (170909975)<none> and <mprescripts> elements were not laid out as <mrow> elements in MathML. (170940035)-webkit-text-fill-color when painting math variant glyphs. (172020318)padding and border rendering on <msqrt> and <mroot> elements and corrected token sizing for mathvariant. (173081436)tabIndex values not being set correctly for MathML elements. (174734133)+, −, ±, ∓, ∇, and infix operator ⋉ in the MathML Core operator dictionary. (176652211)∂ prefix operator to use the correct spacing values (3, 0) instead of (2, 1). (176693587)MathOperator being invisible when their glyph only exists in a fallback font. (178096170)<audio> and <video> controls rendering incorrectly when rotated via CSS transform. (37516619)preservesPitch and playbackRate were not correctly handled on an HTMLMediaElement connected to an AudioContext via createMediaElementSource. (93275149)MediaCapabilities.decodingInfo() incorrectly reporting VP8 in WebM as not supported. (127339546)VideoDecoder API output frames in an incorrect order for videos containing B-frames. (145093697)<source> element does not match the actual content type served by the server. (166181001)HTMLMediaElement.currentTime to report smoothly progressing values instead of updating only at fixed intervals. (170115677)decodeAudioData. (170196423)VideoFrame constructor did not handle the video color range correctly for NV12 (I420 BT601) video frames. (170299037)MediaSource. (171210968)currentTime getter to return defaultPlaybackStartPosition when no media player exists. (171722368)HTMLMediaElement to fire a timeupdate event when resetting the playback position during media load as required by the specification. (171785463)preload attribute was not properly updated when the autoplay attribute was set. (171883159)HTMLMediaElement.volume had no effect when the element was connected to an AudioContext. (174278899)ImageCapture to correctly queue takePhoto() and applyConstraints() requests to avoid concurrent capture session reconfiguration. (174950018)VTTCue text content. (175084171)<audio controls> to not show the “Subtitles” option when no subtitle track is present. (175357130)::cue() selectors to correctly match the WebVTT root object in addition to child nodes. (175550173)currentTime on iOS to update more frequently during media playback. (175774587)readyState not being updated immediately when playback stalls due to a gap in buffered data. (176330683)timeupdate events being fired during seeking before the seek operation completes. (176861767)ended event not always firing when the MediaSource duration is changed to match the current playback position. (176863546)currentTime() returning a stale value after the playback rate was changed from zero to a non-zero value. (177046564)SourceBuffer.remove() to no longer remove an extra sample, and fixed buffered ranges to cover the correct ranges. (177065364)keystatuses event when all keys have expired. (177939767)getSupportedCapabilitiesForAudioVideoType (EME) to no longer include unsupported capabilities. (178142768)MediaSession.setActionHandler to not throw an exception when called. (178167294)AudioData.copyTo to throw RangeError when frameOffset equals numberOfFrames. (178609688)PannerNode to no longer produce non-finite samples for edge-case distance parameters. (178784571)bitDepth based on transferCharacteristics. (179210193)MediaSource text-track removal loop always processed only the last track. (179508398)isValidVideoFrameBufferInit() tested displayWidth and displayHeight presence against themselves instead of the correct properties. (179514279)MediaMetadata artwork sizes parsing read the wrong substring for the height value. (179523057)pictureInPictureElement getter inverted the shadow-host connectivity check. (179675087)VideoFrame with a visibleRect rendering with offset chroma channels. (180202939)entityTransform on a <model> element while the model is unloaded or hidden. (179114750)<model> elements losing gesture interactivity after the model player is reloaded (for example, when the model scrolls out of and back into the viewport). (179249565)<meta http-equiv="refresh"> to a URL differing only in fragment identifier being incorrectly treated as a page reload. (176933795)data: URLs to be blocked for subresources such as images and scripts, aligning with the Fetch specification. (74165956)XMLHttpRequest incorrectly dropping the request body during redirects. (98459882)X-Frame-Options to only strip tab or space characters, not vertical tabs. (126915315)iso-8859-2, windows-1250, and gbk. (169566553)WKHTTPCookieStore. (174557252)sendBeacon() and the Media Session API. (177330315)xn-- that did not pass strict IDNA 2008 validation, aligning behavior with the WHATWG URL Standard. xn-- is the prefix of a punycode-encoded non-ASCII domain. (177686282)Content-* headers from 304 responses were not used to update cached entries. (179864251)Cache-Control request directives max-age, min-fresh, and no-store were not honored. (179865576)Cache-Control: public was not honored on responses with unknown status codes. (179870099)%2F following a percent-encoded Armenian path segment. (180067095)WKWebView‘s PDF export API. (180631575)NSPrintOperation dropped all text. (174756900)rowspan values exceeding the actual number of rows were incorrectly computing heights. (3209126)filter: drop-shadow() not repainting the area outside the element’s boundaries. (49387957)::first-letter styles caused Range.getClientRects() and Range.getBoundingClientRect() to return incorrect dimensions. (71546397)<td> element has an explicit height set. (78549188)margin-start could overlap an adjacent float. (93187697)position: relative on table rows (<tr>) to correctly establish a containing block for absolutely positioned descendants. (94294819)<marquee> elements causing incorrect table width calculations. (99826593)height: 100% in auto-height containers incorrectly resolved to zero height. (161699543)padding-left plus margin-left equals zero. (162376969)visibility: collapse on columns. (168556786)text-overflow: ellipsis and an inline-block pseudo-element. (168875614)min-width: fit-content rendered at an incorrect width. (169359566)height: 100% was incorrectly calculated for replaced elements like images serving as grid items nested inside a flexbox. (169431440)user-select: none. (170477571)inline-block elements so that when overflow is not visible, the baseline is correctly set to the bottom margin edge. (170575015)min-height and min-width constraints in certain configurations. (170765025)max-width on table cells when distributing width between them. (171459245)border-spacing incorrectly included collapsed columns in auto table layout calculations. (171468102)@prefers-color-scheme, it does not follow the color-scheme set by grandparents of the iframe. (172229372)about:blank iframes did not always have a transparent background. (172400258)text-wrap: balance not being applied to content with -webkit-line-clamp. (172715503)<legend> to mask the <fieldset>‘s border correctly when it has a negative left margin. (174185071)<br> elements with line-height: 0 still created extra vertical space, failing to respect the declared line height. (174400946)image-orientation being ignored for background-image, border-image, and list-style-image. (174894122)white-space: pre-wrap layout issue with justified text. (174937310)min-height: min-content inside a column flex container not shrinking to preserve its aspect ratio. (174999995)flex-wrap and flex factor computation for wrapping flex items. (175012395)writing-mode content incorrectly wrapping when the parent has auto height. (175123356)column-wrap flex container with flex-basis: 0 wrapping items into extra columns instead of stacking them when nested inside another column flex container. (175195518)filter: blur() ignored border-radius overflow clipping from its parent. (175519148)max-height was removed. (175799547)display: flex. (175866046)min-height and shrinking below their content height. (175883577)drop-shadow filters and transform: translate() incorrectly clipping nested elements after a regression. (175905543)max-height constraints. (175932457)scrollbar-gutter placement on the root element in RTL layouts. (175939512)aspect-ratio and content-box padding computed the wrong height in a column flex container. (176033726)align-content: center. (176173122)stretch. (176398251)<html> element not being repainted when the <body> background changed. (177975964)<sup> elements. (179537119)<sup> element was offset by one device pixel from the rest of the line on subpixel displays. (179586525)ex unit in text-box-edge misplaced the propagated underline, causing it to be painted twice. (179769451)min-width was not honored over max-width when sizing a shrink-to-fit container around a replaced element. (179935558)<img> embedding an SVG with a near-integral intrinsic width rendered one device pixel narrower than expected. (180490343)filter: drop-shadow() not being fully repainted when a child is resized. (181284741)text-decoration to elements with display: contents. (85691104)<text> with textLength scaling each glyph separately when x or y is a list. (94161279)href or xlink:href on SVG <image> elements had no visual effect. (96316808)width and height properties on SVG <rect>, <image>, <svg>, and other elements. (96320059)<use> and the opacity was adjusted. (96837306)attributeName was dynamically changed. (97097883)box-shadow was not drawn on fixed-positioned SVG elements. (97098951):visited link color to properly propagate to SVG through currentColor. (98776770)url(#id) was not invalidated when the filter content changed. (101870430)vector-effect to apply a transform to path geometry rather than to stroke geometry. (103573160)stroke-dashoffset values rendering with incorrect offsets when stroke-dasharray has an odd number of values. (103596361)<animateMotion> non-path animations to apply the rotate attribute. (110915794)SVGTransformList to properly allow attribute removal. (117840533)to, from, and by values such as those with leading whitespace. (118537155)<textPath>. (120284006)<img> tag did not animate correctly due to repaint artifacts with object-fit. (141815698)display: contents being visually hidden. (141825746)<tspan> positioning bug with xml:space="preserve" that caused multi-line text to render incorrectly. (143722975)SVGPathElement.getTotalLength() and . SVGPathElement.getTotalLength.getPointAtLength() to respect the CSS d property. (167195297)offsetX and offsetY for SVG elements to use the outermost SVG as the base for coordinate calculation. (168548585)fx and fy attributes on SVGRadialGradientElement to 50% to align with the SVG2 specification. (169645572)SVGAnimatedRect.baseVal to ignore invalid values set on the viewBox attribute, such as negative width or height, aligning with Firefox and Chrome. (170214971)getScreenCTM() did not include CSS transforms and zoom contributions in the legacy SVG rendering path. (171525696)em and percentage values. (171587382)SVGLength.convertToSpecifiedUnits() failing when converting from px to %, em, or ex. (172056830)<image> element was not repainted when the href attribute was removed. (172530834)<svg> root element. (172909441)parseClockValue did not reject out-of-range minutes and seconds values per the SMIL timing specification. (173577212)values attribute to preserve empty values and handle trailing semicolons. (173594455)repeat(n) event conditions not triggering animations. (173599629)getStartPositionOfChar and getEndPositionOfChar to be more compliant with the specification. (174145885)max-content and min-content use the viewBox aspect ratio when intrinsic sizes are missing. (174568894)glyph-orientation-vertical: auto to use UTR#50 Vertical Orientation properties for correct character orientation in vertical text. (175064567)preserveAspectRatio is set to none. (175173375)background-size. (175345107)glyph-orientation-vertical: auto to decode surrogate pairs for UTR#50 lookup. (175570881)stroke-dasharray interpolation to use least common multiple for list length matching and corrected composition behavior. (175598175)cx, cy, r, rx, ry, x, y, width, and height being incorrectly applied to elements such as <g> on which they are not permitted. (175672111)pathLength="0" and negative pathLength for stroke dashing. (175928827)@prefers-color-scheme in an SVG image will sometimes not follow the system color appearance. (176413340)getScreenCTM() returning an incorrect matrix when the document is scrolled under a CSS-transformed ancestor. (176814876)clip-path with nested objectBoundingBox <clipPath> to use the correct reference box. (177605894)IntersectionObserver not computing intersections for SVG element roots. (177807041)feGaussianBlur not applying when stdDeviation contains a 0 in the second component. (177906905)<text> to honor the CSS text-orientation property instead of only the deprecated glyph-orientation-vertical presentation attribute. (178044217)rotate attribute was discarded on a <textPath>, so it now composes with the path tangent angle. (178044478)getRotationOfChar() returned approximately 360° instead of 0° for full-turn rotations after normalisation into the [0°, 360°) range. (178044934)<tspan> boundary shifted the x and y value lists by one position. (178360036)d property to treat them as non-zero booleans. (178950624)pathFromEllipseElement to honor auto values for rx and ry, so APIs such as getTotalLength() return the correct length for ellipses. (178959205)<use> element. (179414226)getBoundingClientRect() on an SVG <tspan> element returned the bounds of the entire <text> element instead of the <tspan>‘s own area. (179626476)clip-path on a <clipPath> element ignored css zoom. (180162723)orient and markerUnits on <marker> not repainting elements that reference it. (181106538)number, integer-optional-integer, number-optional-number, and path animations to not apply when their from, to, or by values fail to parse. (181308150)scrollTo during a momentum scroll incorrectly interrupted the scroll, ensuring that momentum scrolling continues as expected and smooth scrolling behaves properly. (41949531)scroll-snap-type: mandatory failed after the browser chrome was hidden. (100727098)scrollIntoView with nearest alignment incorrectly aligned to the far edge for an oversized target positioned before the scrollport. (106356373)passive: false wheel event listener combined with overscroll-behavior: contain preventing scrolling. (137757208)scroll-padding did not scroll the focused element into view. (147513379)window.scrollTo() was called synchronously with a DOM layout change. (173197381)scrollIntoView() on a scrollable element incorrectly scrolled the element’s own contents. (174173683)scrollTo() call to a different target fired the scrollend event at the wrong position. (179551854)scroll-padding while scroll anchoring is active. (183145868)'self' did not match script sources in opaque-origin HTTP(S) documents. (178638597)<object> elements that load images being incorrectly blocked by the img-src Content Security Policy directive. (178772677)script-src to JSON module imports instead of connect-src. (180006320)frame-ancestors violations in report-only policies being ignored instead of reported. (180447621)nonce-source and hash-source values. (180903857)trusted-types expressions to reject trailing characters after keywords and the wildcard. (180973793)<model> elements displaying at 100x the expected size for assets authored in tools that use centimeter units. (167805672)getViewport() was called. (168125694)<model> element stagemode orbit physics behaved differently between iOS and visionOS. (172189776)XRProjectionLayer to return correct values for width, height, and layer count. (178444052)<model> element led to undesirable lighting effects. (179522538)onupgradeneeded event. (176195526)history.state being set to null when history.pushState is called from a child iframe. (50019069)activeElement. (92367314)change event was not fired on <input> and <textarea> elements when they lost focus while another application was in the foreground. (98526540)SharedArrayBuffer where [AllowShared] is not specified. (107786134)MouseEvent.offsetX and MouseEvent.offsetY were not relative to the padding edge as specified. (125763807)gamepadconnected event did not fire unless gamepad permission had already been granted. (141623162)CSPViolationReportBody did not include the source line number in Content Security Policy violation reports. (152607402)IntersectionObserver to no longer notify targets in detached documents. (162699098)toolbar.visible, statusbar.visible, menubar.visible) to return static values per the HTML specification for privacy and interoperability. (166554327)DigitalCredential protocols by gracefully filtering them out and showing a console warning instead of throwing an error. (166673454)DigitalCredentialRequest to DigitalCredentialGetRequest per the latest specification. (167115220)layerX and layerY to return correct values with CSS transforms. (168968832)location.ancestorOrigins returning stale origins after an iframe is removed from the document. (169097730)NavigateEvent.canIntercept to correctly return false when navigating to a URL with a different port, aligning with the Navigation API specification. (169845691)NavigateEvent.navigationType to return "replace" when navigating to a URL that matches the active document’s URL. (169999046)dragend event had incorrect coordinates when dragging within a nested <iframe>. (170750013)navigation.currentEntry.key did not change in private browsing windows after calling history.pushState(). (171147417)ResizeObserver callbacks became increasingly sluggish over time. (172718139)IntersectionObserver became sluggish over time when observing many elements due to O(n²) iteration. (172727210)navigation.currentEntry.id did not change in private browsing windows after calling history.replaceState(). (172897962)document.open() incorrectly aliased the caller’s security origin. (173369038)history.replaceState() on a traversed history entry incorrectly changed navigation.currentEntry.key to a new UUID instead of preserving the original key. (173388766)Object.prototype could not be serialized by structuredClone(). (173728983)once and passive flags were not preserved when copying listeners between elements. (173834642)get() request. (173918198)event.target was not set after dispatching an event in a shadow tree with no listeners. (174136382)navigator.credentials.create() and navigator.credentials.get() discarded the AbortSignal reason and always rejected with a generic AbortError. (174220589)Range.extractContents() to not extract out-of-bounds nodes when the end container is removed during extraction. (174307275)OperationError for platform-cancellation and unknown errors instead of AbortError or UnknownError. (174308268)document.createEvent() to throw an exception for "MutationEvents", "MutationEvent", "PopStateEvent", and "WheelEvent", aligning with other browser engines. (174339775)ParentNode.append() to correctly de-duplicate nodes when the same node is passed multiple times. (174365465)MutationObserver delivered childList records in the wrong order when script ran during node insertion. (174368989)URL object’s port property to whitespace behaved incorrectly. (174484035)return in the Navigation API’s performTraversal that caused incorrect behavior when traversing to an unknown key. (174513305)Blob.slice() to correctly clamp fractional start and end parameters using round-half-to-even rounding per the File API specification, which may change how edge-case fractional values like 0.5 are rounded. (174555334)postMessage() to validate transferable object states after serialization, aligning with the HTML specification. (174558047)structuredClone() and window.postMessage() to correctly throw a DataCloneError when serializing a SharedArrayBuffer outside of cross-origin isolated contexts. (174562553)Element.blur() on an <iframe> did not reset document.activeElement to <body>. (174591529)document.styleSheets to be accessible on documents created by DOMParser. (174625774)innerText getter to correctly handle trailing newlines and blank lines for <p> elements and headings. (174642704)innerText whitespace handling at inline-block boundaries. (174713114)XMLSerializer namespace handling to correctly serialize elements with namespace prefixes. (174726401)innerText getter to preserve newlines for elements with white-space: pre-line. (174727341)innerText handling of replaced elements at block boundaries. (174816319)EventSource to be closed when window.stop() is called. (174830925)preventDefault() during a pointerdown event to correctly suppress mousedown and mouseup events on iOS. (174864309)innerText to not fall back to textContent for elements with display: contents. (174883499)innerText to preserve the contents of <option> elements inside <select>. (175006854)Element.innerText to collect option text when called directly on a <select> element. (175156630)Event object’s target property could lose its JavaScript wrapper due to premature garbage collection. (175439759)TreeWalker.currentNode could be prematurely garbage collected. (175442228)FileSystemDirectoryHandle.resolve() to return the correct path array for child entries. (175645387)PerformanceNavigationTiming.domInteractive and domContentLoadedEventEnd incorrectly returning 0 instead of the correct timestamps. (175739835)FileSystemDirectoryHandle.removeEntry() to correctly remove entries. (175745157)CryptoKey to correctly remain associated with its secure context. (176157712)SharedArrayBuffer cloning and agent cluster ID assignment. (176465817)role attribute. (176713992)Notification object. (176762955)requestAnimationFrame() not providing sub-millisecond timestamp precision in cross-origin isolated contexts. (176967366)IntersectionObserverEntry.boundingClientRect to honor CSS zoom aware getBoundingClientRect. (177250323)IntersectionObserver to report correct bounds for SVG element targets. (177260411)AbortSignal abort algorithm after a lock request settles. (178589067)Regexp token for empty regexp groups. (179452346)KeyboardEvent.getModifierState("AltGraph") and MouseEvent.getModifierState("AltGraph") always returning false. (180597374)Credential.type returning "digital-credential" instead of "digital" for digital credentials. (180618646)navigator.credentials.get() leaving the digital-credentials document picker stuck on screen. (180812397)FileReader.readAsText() ignoring the charset parameter of the Blob‘s MIME type. (180890703)DOMMatrix and IntersectionObserver correctly enforcing absolute-length unit requirements when parsing values. (181453666)PannerNode orientation-only changes not updating the directional cone gain. (181413407)XMLHttpRequest from a Safari Web Extension to no longer trigger an additional permissions request. (154866064)browser.i18n.getMessage() to correctly substitute named placeholders when they appear adjacent to non-space characters. (169146196)browser.i18n.getMessage() to correctly substitute two adjacent named placeholders. (175315700)let and const. (143140659)performance.mark() records. (145226764)style attribute values in the Elements panel resulting in truncated or malformed content. (149523483)Array, Date, EventTarget, and Worker. (157178256)WebAssembly.instantiateStreaming, preventing source-level debugging in LLDB. (174362152)console.groupCollapsed() is used. (175279759)DOM.getAttributes commands per tick in cross-origin iframes instead of issuing one command per node. (178830496)Map.prototype. (180298712)Page.searchInResources silently omitting cache-backed resources from search results. (181202027)Network.setExtraHTTPHeaders to replace previously set headers instead of accumulating them. (181282814)WebAssembly.Suspending and WebAssembly.SuspendError to be data properties instead of getter functions, aligning with other WebAssembly attributes like WebAssembly.Module. (170155726)IntegerOverflow exceptions thrown by i32.rem_s, i64.rem_s, i32.div_u, i64.div_u, i32.rem_u, and i64.rem_u when both operands are constants. (175122462)RegisterSet::normalizeWidths() lost vector-width information, causing v128 argument corruption in WebAssembly SIMD thunks. (176035764)compressedTexImage not validating whether the compressed texture format extension has been enabled. (175652171)texImage functions reporting errors with incorrect function names. (175652807)GPUDevice.onuncapturederror event handler attribute not working. (149577124)maxStorageBuffersInFragmentStage and related WebGPU limits. (160800947)GPUTexture objects instead of GPUTextureView with multisampled resolve targets in render passes. (175452924)VideoFrame was encoded in an incorrect color space when encoding to VP9. (169425608)RTCPeerConnection.addIceCandidate() did not reject when the connection was already closed. (170470988)RTCDataChannel did not check the SCTP buffered amount synchronously. (172386678)MediaStreamTrack could have incorrect settings if the source settings changed while the track was being transferred. (172657570)RTCRtpSender.setParameters did not clear parameters that were unset by the web application. (173678165)RTCPeerConnection with iceTransportPolicy: "relay" failed to gather ICE candidates. (174794660)RTCInboundRtpStreamStats.trackIdentifier to match MediaStreamTrack.id. (174938984)getDisplayMedia() starting at extremely low quality and taking up to 30 seconds to become legible for remote participants. (175425085)AudioSession to remain active while microphone capture is live. (180505014)OverconstrainedError to inherit from DOMException and expose a code attribute per the Media Capture spec. (180728516)configurationchange event being dropped when a source-side change occurred while a MediaStreamTrack was muted; the event is now deferred until unmute. (180728609)Safari 27.0 comes automatically with macOS 27 Golden Gate, iOS 27, iPadOS27 and visionOS 27. Plus, you can update to Safari 27.0 on macOS 26 Tahoe and macOS 15 Sequoia, separate from macOS.
We love hearing from you. To share your thoughts, find our web evangelists online: Jen Simmons on Bluesky / Mastodon, Saron Yitbarek on Bluesky, and Jon Davis on Bluesky / Mastodon. You can 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 run into a website that isn’t working as expected, please file a report at webcompat.com. Filing issues really does make a difference.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。