Update on what happened in WebKit in the week from March 17 to March 24.
Cross-Port đ±
Limited the amount data stored for certain elements of WebKitWebViewSessionState. This results in memory savings, and avoids oddly large objects which resulted in web view state being restored slowly.
Multimedia đ„
GStreamer-based multimedia support for WebKit, including (but not limited to) playback, capture, WebAudio, WebCodecs, and WebRTC.
The built-in JavaScript/ECMAScript engine for WebKit, also known as JSC or SquirrelFish.
Fixed an integer overflow when using wasm/gc on 32-bits.
Graphics đŒïž
Landed a change that fixes a few scenarios where the damage was not generated on layer property changes.
Releases đŠïž
WebKitGTK 2.48.0 and WPE WebKit 2.48.0 have been released. While they may not look as exciting as the 2.46 series, which introduced the use of Skia for painting, they nevertheless includes half a year of improvements. This development cycle focused on reworking internals, which brings modest performance improvements for all kinds of devices, but most importantly cleanups which will enable further improvements going forward.
For those who need longer to integrate newer releases, which we know can be a longer process for embedded device distrihytos, we have also published WPE WebKit 2.46.7 with a few stability and security fixes.
Accompanying these releases there is security advisory WSA-2025-0002 (GTK, WPE), which covers the solved security issues. Crucially, all three contain the fix for an issue known to be exploited in the wild, and therefore we strongly encourage updating.
Update on what happened in WebKit in the week from March 10 to March 17.
Cross-Port đ±
Web Platform đ
Updated button activation behaviour and type property reflection with command and commandfor. Also aligned popovertarget behaviour with latest specification.
Safari Technology Preview Release 215 is now available for download for macOS Sequoia and macOS Sonoma. If you already have Safari Technology Preview installed, you can update it in System Settings under General â Software Update.
Added support for Scroll Driven Animations. (290471@main) (144887859)
Added support for text-wrap-style: pretty. (291092@main) (145577976)
Added support for CSS Anchor Positioning. (291214@main) (145681750)
Images
New Features
Added support for HDR images. (291387@main) (145723539)
JavaScript
Resolved Issues
Fixed processing of an alternation of strings (290982@main) (145222010)
Networking
Resolved Issues
Fixed using WebSocket in a WebWorker causing the entire Worker to freeze. (290802@main) (145149784)
Scrolling
Resolved Issues
Fixed autoscrolling for smooth scrolling while selecting text. (290497@main) (144900491)
Text
Resolved Issues
Fixed generating scroll to text fragments around text that contains newlines. (290761@main) (137109344)
Fixed generating text fragments when the selected text starts and ends in different blocks. (290748@main) (137761701)
Fixed Copy Link to Highlight not working when selecting text that is its own block and when that text exists higher up in the document. (290683@main) (144392379)
Fixed selections that start or end in white space not creating text fragments. (291146@main) (145614181)
Web API
New Features
Added support for Trusted Types. (291409@main) (130065736)
Added support for the File System WritableStream API. (291399@main) (145875384)
Resolved Issues
Fixed fullscreen to use a single queue for event dispatching. (290898@main) (145372389)
Web Extensions
Resolved Issues
Fixed a bug where the runtime.MessageSender origin parameter would be lowercased, differing from the result returned from runtime.getURL. (291118@main) (140291738)
Update on what happened in WebKit in the week from March 3 to March 10.
Cross-Port đ±
Web Platform đ
Forced styling to field-sizing: fixed when an input element is auto filled, and added
support for changing field-sizing
dynamically.
Fixed an issue where the imperative
popover APIs didn't take into account the source parameter for focus behavior.
Multimedia đ„
GStreamer-based multimedia support for WebKit, including (but not limited to) playback, capture, WebAudio, WebCodecs, and WebRTC.
Fixed YouTube breakage on videos with
advertisements. The fix prevents scrolling to the comments section when the
videos are fullscreened, but having working video playback was considered more
important for now.
Graphics đŒïž
Fixed re-layout issues for form
controls with the experimental field-sizing implementation.
Landed a change that improves
the quality of damage rectangles and reduces the amount of painting done in the
compositor in some simple scenarios.
Introduce a hybrid threaded rendering
mode, scheduling tasks to both the CPU and GPU worker pools. By default we use
CPU-affine rendering on WPE, and GPU-affine rendering on the GTK port,
saturating the CPU/GPU worker pool first, before switching to the GPU/CPU.
Infrastructure đïž
We have recently enabled automatic nightly runs of WPT tests with WPE for the
Web Platform Tests (WPT) dashboard. If you click on the âEditâ button at the
wpt.fyi dashboard now there is the option to select WPE.
These nightly runs happen now daily on the TaskCluster CI sponsored by Mozilla
(Thanks to James Graham!).
If you want to run WPT tests with WPE WebKit locally, there are instructions
at the WPT documentation.
After fixing
an issue with Trusted Types when doing attribute mutation within the default
callback, and implementing
performance improvements for Trusted Types enforcement, the
Trusted Types
implementation is now considered stable and has been
enabled by default.
Multimedia đ„
GStreamer-based multimedia support for WebKit, including (but not limited to) playback, capture, WebAudio, WebCodecs, and WebRTC.
Landed one fix which,
along with previous patches, solved the webKitMediaSrcStreamFlush() crash
reported in bug #260455.
Unfortunately, in some pages where the crash previously occurred, now a
different blank video bug has been revealed. The cause of this bug is known,
but fixing it would cause performance regressions in pages with many video
elements. Work is ongoing to find a better solution for both.
The initial support of MP4-muxed WebVTT in-band text
tracks is about to be merged,
which will bring this MSE feature to the ports using GStreamer. Text tracks
for the macOS port of WebKit only landed two weeks
ago and we expect there will be
issues to iron out in WebKit ports, multiplatform code and even potentially in
spec workâwe are already aware of a few potential ones.
Note that out-of band text-tracks are well supported in MSE across browsers
and commonly used. On the other hand, no browsers currently ship with in-band
text track support in MSE at this point.
Support for MediaStreamTrack.configurationchange events was
added,
along with related
improvements
in the GStreamer PipeWire plugin. This will allow WebRTC applications to
seamlessly handle default audio/video capture changes.
Graphics đŒïž
Continued improving the support for handling graphics damage:
Added support
for validating damage rectangles in Layout Tests.
Landed a change that adds
layout tests covering the damage propagation feature.
Landed a change that fixes
damage rectangles on layer resize operations.
Landed a change that
improves damage rectangles produced by scrolling so that they are
clipped to the parent container.
The number of threads used for painting with the GPU has been slightly
tweaked, which brings a measurable
performance improvement in all kinds of devices with four or mores processor
cores.
Releases đŠïž
The stable branch
for the upcoming 2.48.x stable release series of the GTK and WPE ports has
been created. The first preview releases from this branch are WebKitGTK
2.47.90 and
WPE WebKit 2.47.90.
People willing to report issues and help with stabilization are encouraged to
test them and report issues in Bugzilla.
Community & Events đ€
Published a blog
post
that presents an opinionated approach to the work with textual logs obtained
from WebKit and GStreamer.
Safari Technology Preview Release 214 is now available for download for macOS Sequoia and macOS Sonoma. If you already have Safari Technology Preview installed, you can update it in System Settings under General â Software Update.
WebKit has grown into a massive codebase throughout the years. To make developersâ lives easier, it offers various subsystems and integrations.
One such subsystem is a logging subsystem that offers the recording of textual logs describing an execution of the internal engine parts.
The logging subsystem in WebKit (as in any computer system), is usually used for both debugging and educational purposes. As WebKit is a widely-used piece of software that runs on
everything ranging from desktop-class devices up to low-end embedded devices, itâs not uncommon that logging is sometimes the only way for debugging when various limiting
factors come into play. Such limiting factors donât have to be only technical - it may also be that the software runs on some restricted systems and direct debugging is not allowed.
Requirements for efficient work with textual logs #
Regardless of the reasons why logging is used, once the set of logs is produced, one can work with it according to the particular need.
From my experience, efficient work with textual logs requires a tool with the following capabilities:
Ability to search for a particular substring or regular expression.
Ability to filter text lines according to the substring or regular expressions.
Ability to highlight particular substrings.
Ability to mark certain lines for separate examination (with extra notes if possible).
Ability to save and restore the current state of work.
While all text editors should be able to provide requirement 1, requirements 2-5 are usually more tricky and text editors wonât support them out of the box.
Fortunately, any modern extensible text editor should be able to support requirements 2-5 after some extra configuration.
Throughout the following sections, I use Emacs, the classic âextensible, customizable, free/libre text editorâ, to showcase how it can be set up and used to meet
the above criteria and to make work with logs a gentle experience.
Emacs, just like any other text editor, provides the support for requirement 1 from the previous section out of the box.
To support requirement 2, it requires some extra mode. My recommendation for that is loccur - the minor mode
that acts just like a classic grep *nix utility yet directly in the editor. The benefit of that mode (over e.g. occur)
is that it works in-place. Therefore itâs very ergonomic and - as Iâll show later - it works well in conjunction with bookmarking mode.
Installation of loccur is very simple and can be done from within the built-in package manager:
M-x package-install RET loccur RET
With loccur installed, one can immediately start using it by calling M-x loccur RET <regex> RET. The figure below depicts the example of filtering:
highlight-symbol - the package with utility functions for text highlighting #
To support requirement 3, Emacs also requires the installation of extra module. In that case my recommendation is highlight-symbol
that is a simple set of functions that enables basic text fragment highlighting on the fly.
Installation of this module is also very simple and boils down to:
M-x package-install RET highlight-symbol RET
With the above, itâs very easy to get results like in the figure below:
just by moving the cursor around and using C-c h to toggle the highlight of the text at the current cursor position.
bm - the package with utility functions for buffer lines bookmarking #
Finally, to support requirements 4 and 5, Emacs requires one last extra package. This time my recommendation is bm
that is quite a powerful set of utilities for text bookmarking.
In this case, installation is also very simple and is all about:
M-x package-install RET bm RET
In a nutshell, the bm package brings some visual capabilities like in the figure below:
as well as non-visual capabilities that will be discussed in further sections.
Once all the necessary modules are installed, itâs worth to spend some time on configuration. With just a few simple tweaks itâs possible to make the work with logs
simple and easily reproducible.
To not influence other workflows, I recommend attaching as much configuration as possible to any major mode and setting that mode as a default for
files with certain extensions. The configuration below uses a major mode called text-mode as the one for working with logs and associates all the files with a
suffix .log with it. Moreover, the most critical commands of the modes installed in the previous sections are binded to the key shortcuts. The one last
thing is to enable truncating the lines ((set-default 'truncate-lines t)) and highlighting the line that the cursor is currently at ((hl-line-mode 1)).
To show what the workflow of Emacs is with the above configuration and modules, some logs are required first. Itâs very easy to
get some logs out of WebKit, so Iâll additionally get some GStreamer logs as well. For that, Iâll build a WebKit GTK port from the latest revision of WebKit repository.
To make the build process easier, Iâll use the WebKit container SDK.
The above command disables the ENABLE_JOURNALD_LOG build option so that logs are printed to stderr. This will result in the WebKit and GStreamer logs being bundled together as intended.
Once the build is ready, one can run any URL to get the logs. Iâve chosen a YouTube conformance tests suite from 2021 and selected test case â39. PlaybackRateChangeâ
to get some interesting entries from multimedia-related subsystems:
Once the logs are collected, one can open them using Emacs and start making sense out of them by gradually exploring the flow of execution. In the below exercise, I intend to understand
what happened from the multimedia perspective during the execution of the test case â39. PlaybackRateChangeâ.
The first step is usually to find the most critical lines that mark more/less the area in the file where the interesting things happen. In that case I propose using M-x loccur RET CONSOLE LOG RET to check what the
console logs printed by the application itself are. Once some lines are filtered, one can use bm-toggle command (C-c t) to mark some lines for later examination (highlighted as orange):
For practicing purposes I propose exiting the filtered view M-x loccur RET and trying again to see what events the browser was dispatching e.g. using M-x loccur RET on node node 0x7535d70700b0 VIDEO RET:
In general, the combination of loccur and substring/regexp searches should be very convenient to quickly explore various types of logs along with marking them for later. In case of very important log
lines, one can additionally use bm-bookmark-annotate command to add extra notes for later.
Once some interesting log lines are marked, the most basic thing to do is to jump between them using bm-previous (C-c n) and bm-next (C-c p). However, the true power of bm mode comes with
the use of M-x bm-show RET to get the view containing only the lines marked with bm-toggle (originally highlighted orange):
This view is especially useful as it shows only the lines deliberately marked using bm-toggle and allows one to quickly jump to them in the original file. Moreover, the lines are displayed in
the order they appear in the original file. Therefore itâs very easy to see the unified flow of the system and start making sense out of the data presented. Whatâs even more interesting,
the view contains also the line numbers from the original file as well as manually added annotations if any. The line numbers are especially useful as they may be used for resuming the work
after ending the Emacs session - which Iâll describe further in this section.
When the *bm-bookmarks* view is rendered, the only problem left is that the lines are hard to read as they are displayed using a single color. To overcome that problem one can use the macros from
the highlight-symbol package using the C-c h shortcut defined in the configuration. The result of highlighting some strings is depicted in the figure below:
With some colors added, itâs much easier to read the logs and focus on essential parts.
On some rare occasions it may happen that itâs necessary to close the Emacs session yet the work with certain log file is not done and needs to be resumed later. For that, the simple trick is to open the current
set of bookmarks with M-x bm-show RET and then save that buffer to the file. Personally, I just create a file with the same name as log file yet with .bm prefix - so for log.log itâs log.log.bm.
Once the session is resumed, it is enough to open both log.log and log.log.bm files side by side and create a simple ad-hoc macro to use line numbers from log.log.bm to mark them again in the log.log
file:
As shown in the above gif, within a few seconds all the marks are applied in the buffer with log.log file and the work can resume from that point i.e. one can jump around using bm, add new marks etc.
Although the above approach may not be ideal for everybody, I find it fairly ergonomic, smooth, and covering all the requirements I identified earlier.
Iâm certain that editors other than Emacs can be set up to allow the same or very similar flow, yet any particular configurations are left for the reader to explore.
Igalia is arranging the twelfth annual Web Engines Hackfest, which will be held on Monday 2nd June through Wednesday 4th June.
As usual, this is a hybrid event, at Palexco in A Coruña (Galicia, Spain) as well as remotely.
Registration is now open:
Submit your talks and breakout sessions. The deadline to submit proposals is Wednesday 30th April.
The Web Engines Hackfest is an event where folks working on various parts of the web platform gather for a few days to share knowledge and discuss a variety of topics.
These topics include web standards, browser engines, JavaScript engines, and all the related technology around them.
Last year, we had eight talks (watch them on YouTube) and 15 breakout sessions (read them on GitHub).
A wide range of experts with a diverse set of profiles and skills attend each year, so if you are working on the web platform, this event is a great opportunity to chat with people that are both developing the standards and working on the implementations.
Weâre really grateful for all the people that regularly join us for this event; you are the ones that make this event something useful and interesting for everyone! đ
Really enjoying Web Engines Hackfest by @igalia once again. Recommended for everyone interested in web technology.
The breakout sessions are probably the most interesting part of the event.
Many different topics are discussed there, from high-level issues like how to build a new feature for the web platform, to lower-level efforts like the new WebKit SDK container.
Together with the hallway discussions and impromptu meetings, the Web Engines Hackfest is an invaluable experience.
Big shout-out to Igalia for organising the Web Engines Hackfest every year since 2014, as well as the original WebKitGTK+ Hackfest starting in 2009.
The event has grown and weâre now close to 100 onsite participants with representation from all major browser vendors.
If your organization is interested in helping make this event possible, please contact us regarding our sponsorship options.
The GStreamer video frame converter, used to show video frames in the canvas or
WebGL, has been fixed to use the right GL context and now supports DMA-BUF
video frames, too.
Added support to the eotf
additional MIME type parameter when checking for supported multimedia content
types. This is required by some streaming sites like YouTube TV.
The WebKit ports that use CMake as their build systemâas is the case for the GTK and WPE onesânow enable C++ library assertions by default, when building against GNU libstdc++ or LLVM's libc++. This adds lightweight runtime checks to a number of C++ library facilities, mostly aimed at detecting out-of-bounds memory access, and does not have a measurable performance impact on typical browsing workloads.
A number of Linux distributions were already enabling these assertions as part of their security hardening efforts (e.g. Fedora or Gentoo) and they do help finding actual bugs. As a matter of fact, a number of issues were fixed before all the WebKit API and layout tests with the assertions enabled and the patch could be merged! Going forward, this will prevent accidentally introducing bugs new due to wrong usage of the C++ standard library.
Safari Technology Preview Release 213 is now available for download for macOS Sequoia and macOS Sonoma. If you already have Safari Technology Preview installed, you can update it in System Settings under General â Software Update.
Fixed ensuring the correct logic is run for over-constrained cases when the absolute positioned box is a writing-mode root. (288797@main) (142214631)
Fixed text-box-trim accumulation failing when updating the CSS dynamically. (288480@main) (142386761)
Fixed text-emphasis to not paint emphasis marks on punctuations. (288476@main) (142387538)
Fixed sizing and positioning issues when a popover changes CSS position upon opening. (288655@main) (142491219)
Fixed view transitions to stop running when the user navigates with a swipe. (288956@main) (142844150)
Editing
Resolved Issues
Fixed document.execCommand("copy") only triggering if there is a selection. (288559@main) (27792460)
Fixed Hebrew text pasted from Safari getting aligned left. (289323@main) (139029945)
Fixed setting selection to not set focus unless there is an existing selection. (288555@main) (139075809)
Forms
Resolved Issues
Fixed <datalist> dropdown keyboard interactions to align with platform conventions. (289067@main) (143012287)
Fixed: Disabled all Writing Tools app menu items, except “Compose”, for empty editable content. (289243@main) (143332082)
HTML
Deprecations
Removed the composite attribute on an <img> element. (289071@main) (143109250)
JavaScript
Resolved Issues
Fixed: Increased the matchLimit for regular expressions, allowing complex matches on longer strings. (289319@main) (143202375)
Media
New Features
Enabled MediaSource prefers DecompressionSession by default. (289924@main) (142761051)
Enabled WebCodec’s AudioEncoder and AudioDecoder by default. (288965@main) (142916087)
Resolved Issues
Fixed handling an empty srcAttr in Media Element. (289432@main) (132042925)
Fixed the space key not pausing a video in fullscreen by making the video mouse focusable. (289220@main) (138037616)
Fixed playing video generating non-monotonic ‘timeupdate’ events. (288722@main) (142275184) (FB16222910)
Fixed websites calling play() during a seek() is allowed by the specification so that the play event is fired even if the seek hasn’t completed. (288577@main) (142517488)
Fixed seek not completing for WebM under some circumstances. (143372794)
Fixed MediaRecorderPrivateEncoder writing frames out of order. (289643@main) (143956063)
Networking
Deprecations
Changed 3DES cipher to show a warning to users that it is a legacy TLS cipher. (288742@main) (138948491)
PDF
Resolved Issues
Fixed switching a PDF from continuous to discrete mode displaying the page(s) that are at the top of the window, even when barely visible. (289212@main) (137608841)
Fixed the “Previous Page” context menu option not navigating to previous page in 2-up continuous mode. (289337@main) (139817364)
Rendering
Resolved Issues
Fixed adding out-of-flow objects under the inline in a continuation chain, when possible. (289451@main) (102421379)
Fixed the missing table collapsed border for <thead>, <tbody>, and <tfoot> elements in the wrong order. (289434@main) (110430887)
Fixed <input type="range"> taking up space even with width: 0 applied. (289184@main) (113402515)
Fixed absolute positioned child with percent to include containing block padding. (288460@main) (142321535)
Fixed a border not showing when a linear gradient and a border radius are set. (289101@main) (142617573)
Fixed relative-positioned input elements in scroll areas not rendering outlines. (289154@main) (142995142)
Fixed tabbing out of a popover causing a hang in certain cases. (289277@main) (143145544)
Storage
Resolved Issues
Fixed the Storage Access API to consider AllExceptPartitioned as not currently having cookie access, ensuring sites can request access to first-party cookie. (289450@main) (143508260)
SVG
New Features
Added support for the ch length type for character width, but does not include support for upright vertical character width. (288558@main) (142463263)
Resolved Issues
Fixed not propagating bbox for empty text to ancestors. (289394@main) (115217040)
Fixed dynamically updating the transform attribute. (289022@main) (140761655)
Fixed SVGElement.prototype.ownerSVGElement on the outermost <svg> in foreignObject. (289388@main) (143625675)
Tables
Resolved Issues
Fixed missing behavior for rowspan="0" on HTML tables where 0 means span over all the remaining rows. (288746@main) (133910430)
Fixed table section and row background to not be treated as opaque. (289047@main) (142588505)
Text
Resolved Issues
Fixed displaying OpenType-SVG color fonts. (288980@main) (137496217) (FB15426148)
Web Animations
Resolved Issues
Fixed computing the time offset as needed when applying accelerated actions. (288652@main) (142604875)
Web API
New Features
Added support for the URLPattern API. (288942@main) (142967833)
Resolved Issues
Fixed: Aligned some MIME type handling in EME with the MIME Sniffing standard. (288916@main) (114311586)
Fixed: Updated selectorText handling to align with the specification for CSSPageRule. (289428@main) (125588212)
Fixed matching emoji in an element’s id attribute from a <link rel=expect> with an href that uses percent-encoded syntax. (289174@main) (134531921)
Fixed render blocking for <link> to not match elements that are on a ‘stack of open elements’ for the parser. (289020@main) (135846827)
Fixed Distraction Control unexpectedly hiding out-of-flow elements that overlap with a hidden element. (288593@main) (136358918)
Fixed the HTML parser phone number handling to better account for MathML. (288706@main) (141632782)
Deprecations
Removed wheel event handling for <input type="number"> to match platform conventions. (289285@main) (99318505)
Web Extensions
Resolved Issues
Fixed the tabs field missing from the result returned by windows.create. (288949@main) (138529797)
Fixed the webRequest.onBeforeRequest event missing the requestBody. (288813@main) (140338580) (FB15911234)
Exciting news for web developers, designers, and browser enthusiasts alike â Interop 2025 is here, continuing the mission of improving cross-browser interoperability. For the fourth year in a row, we are pleased to collaborate with Bocoup, Igalia, Google, Microsoft, and Mozilla to smooth out inconsistencies between browsers. The result? A more reliable, user-friendly web experience for everyone.
The WebKit team is proud to have ended Interop 2024 with 98% of tests passing in Safari 18.2 and 99% passing in Safari Technology Preview. In fact, itâs very exciting to see all four participating preview browsers reach 99.
Overall interoperability reached 97% for Interop 2024 â the highest test pass-rate ever! This means long-time features like Accessibility, Custom Properties, font-size-adjust, IndexDB, URLs, scrollbar styling, Text Direction now work the same way in every browser. And new features like CSS Nesting, Declarative Shadow DOM, popover, Relative Color Syntax, and text-wrap: balance are starting their lives with excellent interoperability.
Introducing Interop 2025
Standards are most impactful when theyâre broadly supported and Interop 2025 will continue to push the web forward by promoting consistent adoption of standards that let developers build cutting-edge websites. Safari has already implemented many of the standards included in Interop 2025, including View Transitions in Safari 18.0 and Safari 18.2, and the @scope rule shipped in Safari 17.4. Weâre excited that these technologies are being included as focus areas in Interop 2025, ensuring they get implemented across all browsers with strong interoperability.
We will also be focused on adding support for the following features over the course of the year: Anchor positioning, Navigation API, URLPattern, scrollend events, Core Web Vitals, two Wasm features, two new Storage Access API methods, and removing Mutation Events. Together, these eight areas make up over 40% of the overall score. We believe these are features you are asking for and care about and are excited to work on them. Increasing support over the course of the year is what the Interop Project is all about, and year after year our ending scores prove our commitment to leadership in providing the latest and most important web standards.
This yearâs Interop 2025 runs automated tests for 19 focus areas:
In addition to the focus areas, the Interop Project includes several investigation areas. These are projects where teams gather to assess the current state of testing infrastructure and sort through issues that are blocking progress. For instance, two years ago accessibility could not be an Interop focus area, because there just wasnât enough test coverage in the WPT test suite. So Apple led a project to create over 1,100 subtests. Accessibility then became a focus area for Interop 2024, where it reached almost perfect interoperability.
There are five investigations for Interop 2025. We are especially excited about another Accessibility investigation to create even more accessibility tests. A new WebVTT investigation will look to improve the text tracks that are synchronized to videos, used most often for closed captioning. And a new Privacy investigation will dive into what privacy-related standardized features need tests, develop automated tests or document manual tests, and improve interoperability of privacy protections.
Focus Areas for 2025
Interop 2025 contains a lot, with nineteen focus areas. Just two areas are being carried over from Interop 2024. The other seventeen are brand new.
Anchor Positioning
Have you ever wanted to position one element relative to another elementâs position and size, rather than relying solely on the elementâs own dimensions or static placement within the page? Thatâs what Anchor Positioning is all about. This CSS feature allows elements like tooltips or dropdowns to be anchored to specific parts of other elements. Whether it’s a tooltip that follows a button or a callout that stays in place even when the page scrolls, this feature makes complex layouts simpler and more predictable.
Anchor Positioning is currently a work-in-progress in WebKit, available in Safari Technology Preview behind a feature flag. You can test it by turning on support. Once the implementation is close to complete, it will be marked as preview, turning it on by default in Safari Technology Preview, where the tests in the Anchor Positioning focus area will begin to pass.
Backdrop-filter
Next up,backdrop-filter lets you apply graphical effects like blur or color shifts to the background area behind an element. Imagine a frosted glass effect on a page where the content behind an overlay is blurred without affecting the content itself. This can add depth to designs and make interfaces feel modern and sleek. This year, the goal is to ensure this property works smoothly across all browsers, making those stunning effects a reliable part of your CSS toolkit.
See whatâs possible with backdrop filter in this demo. Use the dropdown to switch filters.
In Safari 18.0, we updated our implementation to the latest spec, but thereâs more work to do to reach full interoperability.
Core Web Vitals
The performance of your website is key to providing a fantastic user experience, and we know itâs top-of-mind as you write code. Weâve heard your requests for cross-browser support of the popular Core Web Vitals, and we are excited to have them on the agenda for 2025. The focus areas includes:
Largest Contentful Paint (LCP)
Interaction to Next Paint (INP)
Having these metrics available in all browsers allows you to track how quickly and smoothly users can interact with a page, no matter which platform they are on.
<details> Element
This simple but powerful HTML element lets you create expandable content sections â think of those collapsible menus or FAQs. In 2025, the goal is to enhance support for the <details> and<summary> elements, and improve their interaction with other features of the Web platform. This means:
improving how pseudo-elements like ::marker and ::details-content work
adding better interactivity with content-visibility
making the find-in-page search interact with the element more intuitively
Itâs all about improving user interaction with these controls.
This focus area also includes the hidden=until-found HTML attribute, which can be used on any element. This causes the content in the element with this attribute to be hidden until a fragment link to the content is activated or find in page reaches the content â then the content is revealed.
Layout: Flexbox & Grid
The Layout focus area is being carried over from Interop 2024 to ensure even more interoperability for Flexbox, Grid, Subgrid. These layout systems have been a game-changer for web design.
Modules: JSON and Import Attributes
Modern JavaScript is all about modularity, and in 2025, Modules are getting a little extra love. This includes allowing you to import JSON files directly into your scripts. And refining import attributes (like type:"json") to ensure they work seamlessly, reducing the need for custom parsing logic.
Navigation API
The Navigation API is a powerful tool for managing meaningful user state within web applications, making it easier for developers to control, intercept, and modify browser navigation events. This API is designed to enhance the way websites and web apps manage navigation, enabling more control over how users move between pages or states within a single page application.
The team at Igalia has been hard at work implementing Navigation API in WebKit. You can test it in Safari Technology Preview by turning on the feature flag. Once itâs enabled in Safari Technology Preview by default, the tests in the Navigation API focus area will begin to pass.
Pointer and Mouse Events
Handling user input with pointer and mouse events is essential for building interactive web experiences. While pointer events provide a unified model for all input types (mouse, touch, stylus), there are still some differences in how these events are handled across browsers.
Last year, Safari made a solid 47% improvement to Pointer and Mouse Events, rising from passing 41% of the WPT automated tests included in Interop 2024 to passing 88% â but weâre not stopping there. Interop 2025 adds even more tests to this focus area, encouraging all browsers to keep making progress towards interoperability.
Remove Mutation Events
Those old, deprecated mutation events (like DOMNodeInserted) were handy back in the day but have long since been replaced by the more efficient MutationObserver API. In 2025, the goal is to fully phase out support for mutation events in favor of the newer, better approach. This will improve performance and reduce potential issues for developers relying on DOM mutation tracking.
@scope
For developers working with complex CSS rules, @scope offers the ability to apply a set of styles within a specific subtree of the DOM. Think of it as a more efficient way to apply styles to certain areas of your page, avoiding global overrides. This year, the focus is on ensuring that @scope works consistently and correctly across all browsers.
<articleid="my-component"><style>
@scope {
h1 { font-size: 4rem; }
}
</style><h1>This is 4rem text.</h1></article><h1>This will not be styled by the CSS above.</h1>
We shipped support for CSS Scoping in Safari 17.4.
scrollend Event
The scrollend event fires when a user finishes scrolling a document or an element. Itâs a helpful tool for triggering actions or animations only after a scroll has completed, improving performance.
This feature is not in Safari yet. We are happy for it to be part of Interop 2025 to ensure both Firefox and Safari implement support.
Storage Access API
Keeping user data private is one of our core values. It shapes how we approach the web. We were pleased to introduce the Storage Access API in 2018 to provide a way for embedded cross-site content to authenticate users who are already logged in to their first-party services, while maintaining user privacy by not using third-party cookies.
Over the last seven years, the Storage Access API has continued to evolve as other browsers implemented support. Interop 2025 brings focus to the latest changes to the web standard â specifically two methods:
the document.requestStorageAccess() method, which allows iframe content to request storing and reading cookies and other site data
the document.hasStorageAccess() method, which checks if such access is granted
We look forward to implementing these two methods in Safari, and gaining stronger interoperability for Storage Access API across browsers â providing tools for you to create elegant experiences while maintaining user privacy.
Text Decoration
Text decoration is a great example of the power of the Interop Project. The ability to underline text on the web has existed since HTML 1.1 with the original <u> element. Today you can use CSS to create underlines, strikethroughs and overlines, and adjust how they look. However, small differences across browsers leave traps that developers can fall into, writing code that you might well expect will work everywhere, but just doesnât. This focus area will ensure interoperability for:
With the URLPattern API, you can define and match patterns against URLs or URL components. This makes handling URL routing and parsing easier, especially for modern web applications.
View Transitions
View Transitions are all about animating the change between different states of a page or the content on the page. Itâs great for creating smooth, dynamic user experiences where elements transition between states (like navigating between pages or opening and closing a modal). While View Transitions is a powerful and complex API, Interop 2025 focuses on:
Same-document View Transitions
View Transitions Classes
We shipped support for same-document View transitions in Safari 18.0 and support for View Transition classes in Safari 18.2.
WebAssembly
WebAssembly enables developers to deploy code written in a number of programming languages at near-native speed in the browser. With that in mind, one of the core weaknesses of Wasm today is interaction with the DOM. To that end, Interop 2025 focuses on enhancing:
integration of Resizable Buffers
improving JS string built-ins to make working with WebAssembly even smoother and more efficient
Web Compat
Web compatibility refers to whether a website works as intended in a particular browser. The tests in this focus area were selected based on evidence that differences between browsers have caused real-world problems for web developers or end users. This year, the work focuses on web compatibility issues with:
WebRTC (Web Real-Time Communication) enables direct peer-to-peer communication between web browsers, mobile apps, and devices. It allows for real-time audio, video, and data sharing directly within the browser, without the need for external plugins or software. WebRTC is especially useful for video conferencing tools and live-streaming applications. This year, Interop 2025 focuses on:
RTCRtpScriptTransform, which allows scripts to modify the media stream, and which is commonly used to implement end-to-end encryption in WebRTC applications.
Make RTCDataChannels transferable to workers to enable off-main-thread processing of data.
Writing Modes
CSS Writing Modes define the layout direction of text for different languages and designs. At its core, writing-mode switches the inline direction between horizontal and vertical. Writing modes have been supported in browsers for years, but Interop 2025 includes two newer aspects:
writing-mode: sideways-lr and sideways-rl allow for text thatâs normally laid out horizontally to be instead displayed vertically as a graph design effect. Using sideways-rl instead of vertical-rl ensures punctuation and other direction-neutral characters are typeset correctly, while using sideways-lr instead of vertical-lr creates an entirely different result
The Interop Focus Areas improve interoperability through automated testing of specific, high-priority features, but not everything the Interop Project wants to help improve can be tested across browsers using automated tests. When this happens, Investigation projects are launched to see what kind of work can be done to improve interoperability, often including by improving the testing infrastructure and writing more tests. Here are the Interop 2025 Investigations:
Accessibility Testing
Continuing from last year, the Accessibility Testing investigation aims to broaden the testing surface of accessibility features of the web platform. This will ensure that accessibility features are reliable and consistent, helping developers create more inclusive web experiences.
Gaming Testing
With excitement about gaming on the web, the Gaming investigation focuses on improving the automated test coverage of the Gamepad API.
Mobile Testing
The advent of mobile devices brought the web to billions of people. Continuing from 2024, the Mobile Testing Investigation is finishing the creation the infrastructure necessary so WPT tests can run correctly on mobile devices. This will open up the possibilities for mobile-specific Interop Focus Areas, as well as other testing and interoperability efforts in the future.
Privacy Testing
Privacy is more important than ever, but the web doesnât yet have a good automated test suite for testing privacy protections across browsers. This Privacy investigation will set out to fix that by identifying possibilities for tests of existing web standards, writing tests, and documenting what else is needed.
WebVTT
The WebVTT investigation will address the challenges in ensuring consistent behavior for captions and subtitles across browsers. By improving how WebVTT works with the <track> element and enhancing the VTTCue API, the team will ensure that captions are reliable, dynamic, and accessible across all web platforms.
A More Interoperable Web
Interop 2025 is all about making the web work better for everyone. Whether itâs ensuring that your CSS behaves the same across browsers or improving privacy with Storage Access API, this yearâs focus areas are all about creating a more reliable, efficient, and seamless web. With continued collaboration from the browser community and the contributions of developers around the world, Interop 2025 will help ensure that the web remains a powerful, user-friendly platform for years to come. Get ready for smoother, more consistent experiences ahead!
Update on what happened in WebKit in the week from February 3 to February 11.
Cross-Port đ±
Fixed an assertion crash in the
remote Web Inspector when its resources contain an UTF-8 ânon-breaking spaceâ
character.
Multimedia đ„
GStreamer-based multimedia support for WebKit, including (but not limited to) playback, capture, WebAudio, WebCodecs, and WebRTC.
Media playback now supports choosing the output audio device on a per element basis, using the setSinkId() API. This also added the support needed for enumerating audio outputs, which is needed by Web applications to obtain the identifiers of the available devices. Typical usage includes allowing the user to choose the audio output used in WebRTC-based conference calls.
For now feature flags ExposeSpeakers, ExposeSpeakersWithoutMicrophone, and PerElementSpeakerSelection need to be enabled for testing.
Landed a change that adds a
visualization for damage rectangles, controlled by the WEBKIT_SHOW_DAMAGE
environment variable. This highlights areas damaged during rendering of every
frameâas long as damage propagation is enabled.
Releases đŠïž
Stable releases of WebKitGTK 2.46.6 and WPE WebKit 2.46.6 are now available. These come along with the first security advisory of the year (WSA-2025-0001: GTK, WPE): they contain mainly security fixes, and everybody is advised to update.
The unstable release train continues as well, with WebKitGTK 2.47.4 and WPE WebKit 2.47.4 available for testing. These are snapshots of the current development status, and while expected to work there may be rough edgesâif you encounter any issue, reports at the WebKit Bugzilla are always welcome.
The recently released libwpe 1.16.1 accidentally introduced an ABI break, which has been corrected in libwpe 1.16.2. There are no other changes, and the latter should be preferred.
This blog post is to announce that Igalia has gotten a grant from NLnet Foundation to work on solving cross-root ARIA issues in Shadow DOM. My colleague Alice Boxhall, which has been working on sorting out this issue since several years ago, together with support form other igalians is doing the work related to this grant.
Briefly speaking, there are mainly two different problems when you want to reference elements for ARIA attributes cross shadow root boundaries.
First issue is that you cannot reference things outside the Shadow DOM. Imagine you have a custom element (#customButton) which contains a native button in its Shadow DOM, and you want to associate the internal button with a label (#label) which is outside in the light DOM.
And the second problem is that you cannot reference things inside a Shadow DOM from the outside. Imagine the opposite situation where you have a custom label (#customLabel) with a native label in its Shadow DOM that you want to reference from a button (#button) in the light DOM.
This is a huge issue for web components because they cannot use Shadow DOM, as they would like due to its encapsulation properties, if they want to provide an accessible experience to users. For that reason many of the web components libraries donât use yet Shadow DOM and have to rely on workarounds or custom polyfills.
The Accessibility Object Model (AOM) effort was started several years ago aiming to solve several issues including the one described before, that had a wider scope and tried to solve many different things including the problems described in this blog post. At that time Alice was at Google and Alex Surkov at Mozilla, both were part of this effort. Coincidentally, they are now at Igalia, which together with Joanmarie Diggs and Valerie Young create a dream team of accessibility experts in our company.
Even when the full problem hasnât been sorted out yet, there has been some progress with the Element Reflection feature which allows ARIA relationship attributes to be reflected as element references. Whit this users can specify them without the need to assign globally unique ID attributes to each element. This feature has been implemented in Chromium and WebKit by Igalia. So instead of doing something like:
<buttonid="button"aria-describedby="description">Button</button> <divid="description">Description of the button.</div>
You could specify it like:
<buttonid="button">Button</button> <divid="description">Description of the button.</div> <script> button.ariaDescribedByElements =[description]; </script>
Coming back to Shadow DOM, this feature also enables authors to specify ARIA relationships pointing to things outside the Shadow DOM (the first kind of problem described in the previous section), however it doesnât allow to reference elements inside another Shadow DOM (the second problem). Anyway letâs see an example of how this will solve the first issue:
const button = document.createElement("button"); button.textContent ="Button"; /* Here is where we reference the outer label from the button inside the Shadow DOM. */ button.ariaLabelledByElements =[label]; shadowRoot.appendChild(button);
const bar = document.createElement("div"); bar.textContent ="bar"; shadowRoot.appendChild(bar); </script>
Apart from Element Reflection, which only solves part of the issues, there have been other ideas about how to solve these problems. Initially Cross-root ARIA Delegation proposal by Leo Balter at Salesforce. A different one called Cross-root ARIA Reflection by Westbrook Johnson at Adobe. And finally the Reference Target for Cross-root ARIA proposal by Ben Howell at Microsoft.
Again if you want to learn more about the different nuances of the previous proposals you can revisit Aliceâs blog post.
At this point this is the most promising proposal is the Reference Target one. This proposal allows the web authors to use Shadow DOM and still donât break the accessibility of their web applications. The proposal is still in flux and itâs currently being prototyped in Chromium and WebKit. Anyway as an example this is the kind of API shape that would solve the second problem described in the initial section, where we reference a label (#actualLabel) inside the Shadow DOM from a button (#button) in the light DOM.
As part of this grant weâll work on all the process to get the Reference Target proposal ready to be shipped in the web rendering engines. Some of the tasks that will be done during this project include work in different fronts:
Proposal: Help with the work on the proposal identifying issues, missing bits, design solutions, providing improvements, keeping it up to date as the project evolves.
Specification: Write the specification text, discuss and review it with the appropriate working groups, improved it based on gathered feedback and implementation experience, resolve issues identified in the standards bodies.
Implementation: Prototype implementation in WebKit to verify the proposal, upstream changes to WebKit, fix bugs on the implementation, adapt it to spec modifications.
Testing: Analyze current WPT tests, add new ones to increase coverage, validate implementations, keep them up-to-date as things evolve.
Outreach: Blog posts explaining the evolution of the project and participation in events with other standards folks to have the proper discussions to move the proposal and specification forward.
Weâre really grateful that NLnet has trusted us to this project, and we really hope this will allow to fix an outstanding accessibility issue in the web platform that has been around for too many time already. At the same point itâs a bit sad, that the European Union through the NGI funds is the one sponsoring this project, when it will have a very important impact for several big fishes that are part of the Web Components WG.
If you want to follow the evolution of this project, Iâd suggest you to follow Aliceâs blog where sheâll be updating us about the progress of the different tasks.
Update on what happened in WebKit in the week from January 27 to February 3.
Cross-Port đ±
The documentation now has a section on how to use the Web Inspector
remotely. This makes information on
this topic easier to find, as it was previously scattered around a few
different locations.
Jamie continues her Coding Experience work around bringing WebExtensions to the
WebKitGTK port. A good part of this involves porting
functionality
from Objective-C, which only the Apple WebKit ports would use, into C++ code
that all ports may use. The latest in this saga was
WebExtensionStorageSQLiteStore.
Web Platform đ
The experimental support for Invoker
Commands
has been updated to match latest
spec changes.
GStreamer-based multimedia support for WebKit, including (but not limited to)
playback, capture, WebAudio, WebCodecs, and WebRTC.
The GStreamer WebRTC backend can now recycle inactive
senders
and support for inactive receivers was also improved. With these changes,
support for screen sharing over WebRTC is now more reliable.
Nushell is a new shell (get it?) in development since 2019. Where other shells like bash and zsh treat all data as raw text,
nu instead provides a type system for all data flowing through its pipelines, with many commands inspired by functional languages to manipulate
that data. The examples on their homepage and in the README.md demonstrate this well,
and I recommend taking a quick look if youâre not familiar with the language.
I have been getting familiar with Nu for a few months now, and found it a lot more approachable and user-friendly than traditional shells,
and particularly helpful for exploring logs.
I wonât go over all the commands I use in detail, so if anything is ever unclear, have a look at the Command Reference.
The most relevant categories for our use case are probably Strings and Filters.
From inside nushell, you can also use help some_cmd or some_cmd --help, or help commands for a full table of commands that can be manipulated and searched like
any other table in nu. And for debugging a pipeline, describe is a very useful command that describes the type of its input.
First of all, we need some custom commands to parse the raw logs into a nu table. Luckily, nushell provides a parse command for exacly this use case,
and we can define this regex to use with it:
(I use a simple pipeline here to split the string over multiple lines for better readability, it just concatenates the list elements.)
Lets run a simple pipeline to get some logs to play around with: GST_DEBUG=*:DEBUG GST_DEBUG_FILE=sample.log gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
For parsing the file, we need to be careful to remove any ansi escapes, and split the input into lines. On top of that, we will also store the result to a variable for ease of use: let gst_log = open sample.log | ansi strip | lines | parse --regex $gst_regex
You can also define a custom command for this, which would look something like:
Define it directly on the command line, or place it in your configuration files. Either way, use the command like this: let gst_log = open sample.log | from gst logs
Some basic commands for working with the parsed data #
If you take a look at a few lines of the table, it should look something like this: $gst_log | skip 10 | take 10
skip and take do exactly what it says on the tin - removing the first N rows, and showing only the first N rows, respectively. I use them here to keep the examples short.
To ignore columns, use reject: $gst_log | skip 10 | take 5 | reject time pid thread
Meanwhile, get returns a single column as a list, which can for example be used with uniq to get a list of all objects in the log: $gst_log | get object | uniq | take 5
Filtering rows by different criteria works really well with where. $gst_log | where thread in ['0x7f467c000b90' '0x232fefa0'] and category == GST_STATES | take 5
And if you need to merge multiple logs, I recommend using sort-by time. This could look like let gst_log = (open sample.log) + (open other.log) | from gst logs | sort-by time
While there are many other useful commands, there is one more command I find incredbly useful: explore.
It is essentially the nushell equivalent to less, and while it is still quite rough around the edges,
Iâve been using it all the time, mostly for its interactive REPL.
First, just pipe the parsed log into explore: $gst_log | explore
Now, using the :try command opens its REPL. Enter any pipeline at the top, and you will be able to explore its output below:
Switch between the command line and the pager using Tab, and while focused on the pager, search forwards or backwards using / and ?, or enter :help for explanations.
Also have a look at the documentation on explore in the Nushell Book.
Today marks the arrival of Safari 18.3. This release is focused on improving the quality of features with 23 bug fixes and 1 depreciation, plus 1 new feature. Safari 18.3 is available on iOS 18.3, iPadOS 18.3, visionOS 2.3, macOS Sequoia 15.3, macOS Sonoma and macOS Ventura.
Genmoji in WKWebView
macOS Sequoia 15.3 now supports Genmoji in Messages, Mail, Notes, and more. With this, WKWebView on macOS now supports the NSAdaptiveImageGlyph API, via the supportsAdaptiveImageGlyph property on WKWebViewConfiguration, making it possible to support adaptive image glyphs in your Mac app. Learn more by watching Bring expression to your app with Genmoji from WWDC24.
Bug Fixes and more
Accessibility
Fixed VoiceOver to not announce the content of <script> elements inside containers with display: contents.
CSS
Fixed the ::view-transition pseudo-element to create a stacking context.
Fixed an issue where SVG text was not displayed in a content-visibility: auto subtree.
Fixed :not(:has(...)) invalidation.
Fixed the default background-origin to border-box for the border-area in shorthand.
Fixed text-box not working correctly on buttons.
Editing
Fixed duplicated and offset highlights in iCloud Notes.
Fixed getRangeAt(0) returning the same JavaScript object even after selection changes.
Fixed the inability to tap to place the cursor at end of the line if last word was autocorrected.
Fixed the drag preview remaining after dragging multiple items and then cancelling the drag.
Media
Fixed an incorrect aspect ratio for WebM files with non-1:1 source pixels and a sample-aspect-ratio setting.
Rendering
Fixed dynamically changing scrollbar-width causing horizontal scrollbars to be painted incorrectly.
Fixed <img> element with height: min-content getting stretched vertically.
Improved view-transitions performance by only rasterizing on-screen snapshots.
Scrolling
Fixed scrollbar appearance when changing to light or dark appearance.
Security
Removed support for Clear-Site-Data: "executionContexts".
SVG
Fixed SVG paths getting clipped at tile boundaries.
Web API
Fixed touching or clicking outside of the popover not closing it on iOS or iPadOS.
Fixed coalesced and predicted events of a given pointer event to have the same pointer identifier as their parent.
Web Extensions
Fixed an issue where the permissions alert would still appear after clicking the extension icon, even though the user had granted the extension access to all sites.
Fixed browser.tabs.create ignoring the pinned and openerTabId attributes, also occurring with browser.tabs.duplicate on iOS.
Web Inspector
Fixed the DOM tree view in the Elements tab reducing deeply-nested nodes to one character wide.
Improved the reliability of safaridriver connecting to remote devices, especially immediately after toggling the âRemote Automationâ setting.
WebAssembly
Fixed memory leaks in WebAssembly Table objects for JSWebAssemblyInstance to improve resource management in WebAssembly instances. This change enhances the stability and performance of WebAssembly in Safari by ensuring proper lifecycle management of internal Table references. No action is required by web developers, but you may notice reduced memory usage in applications that create and manage WebAssembly instances extensively.
WKWebView
Fixed an issue where entering full screen in WKWebView on iOS could fail, even with isElementFullscreenEnabled enabled.
Updating to Safari 18.3
Safari 18.3 is available on iOS 18.3, iPadOS 18.3, macOS Sequoia 15.3, macOS Sonoma, macOS Ventura, and in visionOS 2.3. If you are running macOS Sonoma or macOS Ventura, you can update Safari by itself, without updating macOS. Go to ïŁż > System Settings > General > Software Update and click âMore infoâŠâ under Updates Available. To get the latest version of Safari on iPhone, iPad or Apple Vision Pro, go to Settings > General > Software Update, and tap to update.
Feedback
We love hearing from you. To share your thoughts, find Jen Simmons on Bluesky / Mastodon 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.
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.
GStreamer-based multimedia support for WebKit, including (but not limited to) playback, capture, WebAudio, WebCodecs, and WebRTC.
Fixed the assertion error "pipeline and player states are not synchronized" related to muted video playback in the presence of scroll. Work is ongoing regarding other bugs reproduced with the same video, some of them related to scroll and some likely indepedent.
Fixed lost initial audio
samples played using WebAudio on
32-bit Raspberry Pi devices, by preventing the OpenMAX subsystem to enter
standby mode.
Graphics đŒïž
Landed a change that fixes damage propagation of 3D-transformed layers.
Fixed a regression visiting any web page making use of accelerated ImageBuffers (e.g. canvas) when CPU rendering is used. We were unconditionally creating OpenGL fences, even in CPU rendering mode, and tried to wait for completion in a worker thread, that had no OpenGL context (due to CPU rendering). This is an illegal operation in EGL and fired an assertion, crashing the WebProcess.
Releases đŠïž
Despite the work on the WPE Platform API, we continue to maintain the âclassicâ stack based on libwpe. Thus, we have released libwpe 1.16.1 with the smallâbut importantâaddition of support for representing analog button inputs for devices capable of reporting varying amounts of pressure.
Safari Technology Preview Release 212 is now available for download for macOS Sequoia and macOS Sonoma. If you already have Safari Technology Preview installed, you can update it in System Settings under General â Software Update.
Added support for setting a pin on a security key when a registration requires it. (288259@main) (122660610)
Canvas
Deprecations
Removed non-standard legacy alias of Canvas Compositing including setAlpha and setCompositeOperation. (287871@main) (141510218)
CSS
New Features
Added support for view-transition-name: match-element. (288102@main) (138932551)
Resolved Issues
Fixed CSSPageRule to derive from CSSGroupingRule. (288443@main) (69847560)
Fixed animation-name set from the view transitions dynamic UA stylesheet having extra quotes. (288417@main) (142298840)
Fixed the serialization and parsing of animation-name strings. (288404@main) (142318879)
Deprecations
Removed the non-standard CSSUnknownRule interface. (288453@main) (142380626)
Forms
Resolved Issues
Fixed the hover state getting lost when moving from a checkbox input to the parent label. (288449@main) (107220591)
JavaScript
New Features
Added support for an in-place interpreter for Wasm. (288385@main) (113768719)
Updated JSON.parse to provide the reviver function access to the input source text and extended JSON.stringify behavior to support object placeholders. (288223@main) (131579181)
Resolved Issues
Fixed calendar canonicalization logic in DateTimeFormat. (288143@main) (141792829)
Fixed broken output for Intl.DurationFormat digital style when hoursDisplay is "auto". (288277@main) (141969050)
Fixed Intl.DurationFormat to print a negative sign for minutes after hidden hours. (288317@main) (142119353)
Fixed Array.prototype.toReversed to fill holes with undefined. (288339@main) (142197604)
Loading
Resolved Issues
Fixed javascript: URL navigation to another browsing context created from window.open not checking the source’s Content Security Policy. (137941234)
Networking
New Features
Added support for cookiesâ Partitioned attribute (opt-in partitioned cookies). (288413@main) (142317056)
PDF
Resolved Issues
Fixed main frame PDFs served with a CSP sandbox header not loading. (288060@main) (141166987)
Fixed grid layout animation performance by caching intrinsic logical heights during the first row sizing pass, improving efficiency and preventing invalidation issues with complex grid configurations. (287890@main) (135791322)
Fixed incorrect horizontal writing mode state when nested in a vertical block container. (287877@main) (141543326)
Fixed baseline calculation few cases for tables with empty rows. (288314@main) (142046863)
Fixed to refuse to break inside replaced content. (288354@main) (142224455)
SVG
New Features
Added support for the lh length type. (288448@main) (142068343)
Resolved Issues
Fixed synthesizing a viewBox in <img> only for the document element <svg>. (288134@main) (141733733)
Deprecations
Removed SVGDocument alias to XMLDocument. (288135@main) (123121696)
Text
Resolved Issues
Fixed bold synthesis to be less aggressive. (288130@main) (138047199)
Web API
New Features
Added support for element.focus({ focusVisible: true }). (287959@main) (97021844)
Web Inspector
New Features
Exposed cookie Partition Key in Web Inspector. (288103@main) (136293236)
Update on what happened in WebKit in the week from January 13 to January 20.
Cross-Port đ±
JavaScriptCore đ
The built-in JavaScript/ECMAScript engine for WebKit, also known as JSC or SquirrelFish.
The JavaScriptCore GLib API has gained
support
for creating
Promise
objects. This allows integrating asynchronous functionality more ergonomically when
interfacing between native code and JavaScript.
Landed a change that adds
multiple fixes to the damage propagation functionality in scenarios such as:
Layers with custom transforms.
Pages with custom viewport scale.
Dynamic layer size changes.
Scrollbar layers.
Landed a change that improves
damage propagation in terms of animations handling.
Landed a change that prevents
any kind of damage propagation when the feature is disabled at runtime using
its corresponding flag. Before that, even though the functionality was
runtime-disabled some memory usage and unneeded calculations were being done.
New, modern platform API that supersedes usage of libwpe and WPE backends.
Drag gesture threshold, and key repeat delay/interval are now handled through
the WPESettings API instead of using
hardcoded values. While defaults typically work well, being able to tweak them
for certain setups without rebuilding WPE is a welcome addition.
Sylvia has also improved the WPE Platform DRM/KMS backend to pick the
default output device scaling factor
using WPESettings.
Infrastructure đïž
libsoup has been added to
Google's OSS-Fuzz program to help find
security issues.
With close of 2024 came the end of another year of the Interop project â the annual collaboration between browser engine teams to improve the interoperability of web technology by collectively focusing on fixing bugs and improving features in specific areas.
In 2024, there were 17 such focus areas: Accessibility, CSS Nesting, Custom Properties, Declarative Shadow DOM, font-size-adjust, HTTPS URLs for WebSocket, IndexedDB, Layout, Pointer and Mouse Events, popover, Relative Color Syntax, requestVideoFrameCallback, Scrollbar Styling, @starting-style & transition-behavior, Text Directionality, text-wrap: balance and URL.
Each focus area was represented by a set of automated Web Platform Tests (WPT). Test results were continuously posted to the Interop dashboard throughout the year.
Interop 2024 progress, January through December
At the beginning of 2024, 46% of tests simultaneously passed in all four participating browsers â seen on this graph as the âInteropâ score, represented by the bottom line:
Test results in âstableâ browsers â those released to everyday users.
By end of December, 95% of tests passed in Chrome 131, Edge 131, Firefox 133 and Safari 18.2 at the same time. Reaching 95% interoperability is an incredible result! Itâs the best the Interop project has done so far â by a lot.
End-of-the-year results over time
Comparing year over year, you can see just how successful Interop 2024 has been. In past years, the final interop score reached 83â87%.
Results of Interop Project over the years, as seen in released browsers. (*The project was originally named âCompat 2021â and did not involve people from the Safari or Firefox teams in the first year.)
The WebKit team is proud to have ended 2024 with 98% of tests passing in Safari 18.2 and 99% passing in Safari Technology Preview. In fact, itâs exciting to see all four participating preview browsers reach 99.
Impact of Interop 2024
So what exactly did Interop 2024 improve? Thereâs a lot. You can read all the details in our article from the beginning of the year, The web just gets better with Interop 2024. A few standouts were especially meaningful to the WebKit team.
URL has been an Interop focus area since 2023. URLs are one of the most fundamental parts of the web. Without them, you wouldnât be reading this. The WHATWG URL standard details exactly how URLs are supposed to work, but less than 80% of the tests of the standard passed in all browsers. Weâre extremely happy with the progress made in 2024 by Chrome, Edge and Firefox, raising the overall interop score to 94.5%, finally putting full interoperability of this crucial building block in sight. Web developers can now use all matter of custom URL schemes and be assured they work identically across the board.
Itâs also particularly exciting to see strong improvements in the interoperability of Accessibility technology. Led by Appleâs accessibility team, Interop 2023 took on an Accessibility Investigation project and wrote almost 1500 new interoperable accessibility tests in the last two years. For Interop 2024, over 1000 accessibility tests were chosen for an Accessibility Focus Area, and now all but two of those pass in all preview browsers, reaching 99.7% interop. The Accessibility Testing Investigation continues into 2025, if youâre interested in contributing!
Thefont-size-adjust property first shipped sixteen years ago in Firefox, but the original design was missing key features to make it easy to use or compatible with every language (from-font and two value syntax). The CSS Working Group later updated the web standard. Safari shipped the full set of features in 2023, and Firefox updated their implementation at the same time. Now finally the mature version font-size-adjust works in all browser engines making it very easy to get all the fonts used in a string of text to be the same visual size. Learn how and when to use it in this chapter of Whatâs new in CSS from WWDC23.
Pointer and mouse events wins the award for most improved â passing just 31.9% of tests at the beginning of 2024, and now passing 87.2% in preview browsers. If youâve ever struggled writing code with pointer and mouse events, try again! Other focus areas also improved long-standing interoperability problems with existing technologies, including HTTPS URLs for WebSocket, IndexedDB, Layout (Grid, Subgrid and Flexbox), requestVideoFrameCallback, Scrollbar styling, and Text Directionality (dir).
And several focus areas ensured that new features start their life with strong interoperability, including CSS Nesting, Custom Properties (@property), Declarative Shadow DOM, Popover, Relative Color Syntax, text-wrap: balance, @starting-style and transition-behavior.
Interop 2025
Planning for Interop 2025 is currently underway. Stay tuned for more about whatâs next.
Safari Technology Preview Release 211 is now available for download for macOS Sequoia and macOS Sonoma. If you already have Safari Technology Preview installed, you can update it in System Settings under General â Software Update.
Added CanvasRenderingContext2D support for unprefixed letterSpacing and wordSpacing. (287661@main) (140614722)
Deprecations
Removed support for webKitBackingStorePixelRatio. (287523@main) (123980544)
Removed support for the prefixed webkitImageSmoothingEnabled to use the standard imageSmoothingEnabled property. (287552@main) (141128458)
CSS
Resolved Issues
Fixed table border-color to be currentColor by default. (287861@main) (48382483)
Fixed handling all of the CSS properties in specifications that should cause a UI widget to devolve to a primitive appearance. (287702@main) (134273374)
JavaScript
New Features
Added support for Error.isError. (287527@main) (141132351)
Added "never" and "formalSymbol" to the currencyDisplay option for Intl.NumberFormat. (287849@main) (141504278)
Media
Resolved Issues
Fixed getUserMedia video track getSettings() returning a stale value for torch and whiteBalanceMode constraints. (287845@main) (137870391)
Rendering
Resolved Issues
Fixed computing the baseline for replaced elements with an intrinsic ratio but no intrinsic size as flex items. (287672@main) (74279029)
Fixed textareas to reserve space for overlay scrollbars. (287837@main) (129597865)
Web API
New Features
Added an option to set the popover’s invoker from an imperative API. (287624@main) (139362169)
Added support for Declarative Web Push. (287606@main) (141082392)
Added support for X25519 for Web Cryptography. (287732@main) (141346336)
Resolved Issues
Fixed MutationObserver to observe style attribute changes when resizing the element. (287833@main) (120109181)
Web Extensions
New Features
Added support for documentId to webRequest. (287683@main) (141058456)
Added support for documentId to scripting and tabs. (287803@main) (141291546)
Update on what happened in WebKit in the week from December 31, 2024 to January 13, 2025.
Cross-Port đ±
Web Platform đ
Landed a fix to the experimental Trusted Types implementation for certain event handler content attributes not being protected even though they are sinks.
Landed a
fix
to experimental Trusted Types implementation where the
SVGScriptElement.className property was being protected even though it's not
a sink.
Multimedia đ„
GStreamer-based multimedia support for WebKit, including (but not limited to) playback, capture, WebAudio, WebCodecs, and WebRTC.
Support for the H.264 âconstrained-highâ and âhighâ profiles was
improved in the GStreamer WebRTC
backend.
The GStreamer WebRTC backend now has basic support for network conditions
simulation, that will be useful to
improve error recovery and packet loss coping mechanisms.
JavaScriptCore đ
The built-in JavaScript/ECMAScript engine for WebKit, also known as JSC or SquirrelFish.
JSC got a fix
for a tricky garbage-collection issue.
Graphics đŒïž
Landed a
change
that enables testing the "damage propagation" functionality. This
is a first step in a series of fixes and improvements that should stabilize
that feature.
Damage propagation passes extra information that describes the viewport areas
that have visually changed since the last frame across different graphics
subsystems. This allows the WebKit compositor and the system compositor to
reduce the amount of painting being done thus reducing usage of resources
(CPU, GPU, and memory bus). This is especially helpful on constrained,
embedded platforms.
WebKitGTK đ„ïž
A patch landed to add metadata
(title and creation/modification date) to PDF documents generated for
printing.
The âsuspendedâ toplevel state is now handled in GTK
port to pause rendering when web
views are fully obscured.
Jamie Murphy is doing a Coding Experience focused on adding support for WebExtensions. After porting a number of Objective-C classes to C++, to allow using them in all WebKit ports, she has recently made the code build on Linux, and started addingnew public API to expose the functionality to GTK applications that embed web views. There is still plenty of work to do, but this is great progress nevertheless.
Update on what happened in WebKit in the week from December 23 to December 30.
Community & Events đ€
Published an article on CSS Anchor Positioning. It discusses the current status of the support across browsers, Igalia's contributions to the WebKit's implementation, and the predictions for the future.
CSS Anchor Positioning is a novel CSS specification module
that allows positioned elements to size and position themselves relative to one or more anchor elements anywhere on the web page.
In simpler terms, it is a new web platform API that simplifies advanced relative-positioning scenarios such as tooltips, menus, popups, etc.
To better understand the true power it brings, letâs consider a non-trivial layout presented in Figure 1:
In the past, creating a context menu with position: fixed and positioned relative to the button required doing positioning-related calculations manually.
The more complex the layout, the more complex the situation. For example, if the table in the above example was in a scrollable container,
the position of the context menu would have to be updated manually on every scroll event.
With the CSS Anchor Positioning the solution to the above problem becomes trivial and requires 2 parts:
The <button> element must be marked as an anchor element by adding anchor-name: --some-name.
The context menu element must position itself using the anchor() function: left: anchor(--some-name right); top: anchor(--some-name bottom).
The above is enough for the web engine to understand that the context menu elementâs left and top must be positioned to the anchor elementâs right and bottom.
With that, the web engine can carry out the job under the hood, so the result is as in Figure 2:
As the above demonstrates, even with a few simple API pieces, itâs now possible to address very complex scenarios in a very elegant fashion from the web developerâs perspective.
Moreover, CSS Anchor Positioning offers even more than that. There are numerous articles with great examples such as
this MDN article,
this css-tricks article,
or this chrome blog post, but the long story short is that
both positioning and sizing elements relative to anchors are now very simple.
The first draft of the specification was published in early 2023,
which in the web engines field is not so long time ago.
Therefore - as one can imagine - not all the major web engines support it yet. The first (and so far the only) web engine
to support CSS Anchor Positioning was Chromium (see the introduction blog post) -
thus the information on caniuse.com.
However, despite the information visible on the WPT results page,
the other web engines are currently implementing it (see the meta bug for Gecko and
bug list
for WebKit). The lack of progress on the WPT results page is due to the feature not being enabled by default yet in those cases.
From the commits visible publicly, one can deduce that the work on CSS Anchor Positioning in WebKit has been started by Apple early 2024.
The implementation was initiated by adding a core part - support for anchor-name, position-anchor, and anchor(). Those 2 properties and function are enough to start using the feature
in real-world scenarios as well as more sophisticated WPT tests.
The work on the above had been finished by the end of Q3 2024, and then - in Q4 2024 - the work significantly intensified. A parsing/computing support has been added for numerous
properties and functions and moreover, a lot of new functionalities and bug fixes landed afterwards. One could expect some more things to land by the end of the year even if thereâs
not much time left.
Overall, the implementation is in progress and is far from being done, but can already be tested in many real-world scenarios.
This can be done using custom WebKit builds (across various OSes) or using Safari Technology Preview on Mac.
The precondition for testing is, however, that the runtime preference called CSSAnchorPositioning is enabled.
Since the CSS Anchor Positioning in WebKit is still work in progress, and since the demand for the set of features this module brings is high, Iâve been privileged to contribute
a little to the implementation myself. My work so far has been focused around the parts of API that allow creating menu-like elements becoming visible on demand.
The first challenge with the above was to fix various problems related to toggling visibility status such as:
The obvious first step towards addressing the above was to isolate elegant scenarios to reproduce the above. In the process, Iâve created some test cases, and added them to WPT.
With tests in place, Iâve imported them into WebKitâs source tree and proceeded with actual bug fixing.
The result was the fix for the above crash, and the fix for the layout being broken.
With that in place, the visibility of menu-like elements can be changed without any problems now.
The second challenge was about the missing features allowing automatic alignment to the anchor. In a nutshell, to get the alignment like in the Figure 3:
there are 2 possibilities:
The position-area CSS property can be used: position-area: bottom center;.
At first, I wasnât aware of the anchor-center and hence Iâve started initial work towards supporting position-area.
Once I became aware, however, Iâve switched my focus to implementing anchor-center and left the above for Apple to continue - not to block them.
Until now, both the initial and core parts of anchor-center implementation have landed.
It means, the basic support is in place.
Despite anchor-center layout tests passing, Iâve already discovered some problems such as:
and I anticipate more problems may appear once the testing intensifies.
To address the above, Iâll be focusing on adding extra WPT coverage along with fixing the problems one by one. The key is to
make sure that at the end of the day, all the unexpected problems are covered with WPT test cases. This way, other web engines
will also benefit.
With WebKitâs implementation of CSS Anchor Positioning in its current shape, the work can be very much parallel. Assuming that Apple will keep
working on that at the same pace as they did for the past few months, I wouldnât be surprised if CSS Anchor Positioning would be pretty much
done by the end of 2025. If the implementation in Gecko doesnât stall, I think one can also expect a lot of activity around testing in the
WPT. With that, the quality of implementation across the web engines should improve, and eventually (perhaps in 2026?) the CSS Anchor Positioning
should reach the state of full interoperability.
The built-in JavaScript/ECMAScript engine for WebKit, also known as JSC or SquirrelFish.
JavaScriptCore got a fix for a wasm test that was flaky on 32-bits. We also submitted a new PR to fix handling of Air (Air is an intermediate representation) Args with offsets that are not directly addressable in the O0 register allocator.
Stable releases of WebKitGTK 2.46.5 and WPE WebKit 2.46.5 are now available. While they include some minor fixes, these are focused on patches for security issues, and come accompanied with a new security advisory (WSA-2024-0008: GTK, WPE). As usual, it is recommended to stay up to date, and fresh packages have been already making their way to mainstream Linux distributions.
Safari Technology Preview Release 210 is now available for download for macOS Sequoia and macOS Sonoma. If you already have Safari Technology Preview installed, you can update it in System Settings under General â Software Update.
Added support for the text-autospace property. (286750@main) (140008990)
Resolved Issues
Fixed updating the base background color where the root has color set explicitly when switching to light or dark modes. (286833@main) (139917332)
Fixed performance of querySelectorAll() with :has() descendant selectors. (286908@main) (140093151)
Fixed the unicode-bidi default for the <bdo> element. (287175@main) (140662417)
DOM
New Features
Added support for the ::details-content pseudo-element. (286891@main) (129786929)
JavaScript
Resolved Issues
Fixed: Updated Intl.DurationFormat to not include grouping for 2-digit or numeric styles. (287393@main) (140962232)
Fixed Intl.PluralRulespluralCategories to follow a specific order. (287411@main) (140965181)
Rendering
New Features
Implemented <details> and <summary> disclosure triangle as a list item. (286869@main) (95148788)
Resolved Issues
Fixed outside list-style-position quirk to only be applicable in quirks mode. (287114@main) (140602985)
Web Animations
New Features
Added preview support for Scroll-driven Animations. (287062@main) (140532929)
Web API
Resolved Issues
Fixed Navigation.navigate() to trigger the beforeunload event synchronously. (286919@main) (139628818)
Fixed innerText behavior for <details> and <summary>. (286799@main) (140172890)
Web Extensions
New Features
Added support for documentId in webNavigation. (287408@main) (137532909)
Web Inspector
New Features
Added support for sending Android user agents using the device override menu when Web Inspector is connected to a remote device. (287092@main) (139305520)
Resolved Issues
Fixed the overview icon to be inverted dark mode in the Graphics tab. (287110@main) (140602803)
Fixed recorded WebGL objects not getting highlighted correctly in the Graphics tab. (287127@main) (140625113)
Update on what happened in WebKit in the week from December 9 to December 16.
Cross-Port đ±
Web Platform đ
Shipped the X25519 algorithm of the WebCrypto API for the Mac, GTK+ and WPE ports.
Fixed corner case invoker issue with popover inside invoker, matching the updated spec.
Form controls have long standing interoperability issues and <textarea> is no
exception. This patch
fixes space being reserved for scrollbars despite overlay scrollbars being
enabled. This brings WebKit in line with Firefox's behaviour.
Implemented improvements to the popover
API
to allow imperative invokers relationships, this brings the JavaScript APIs
inline with the declarative popovertarget attribute.
Implemented the CanvasRenderingContext2D letterSpacing/wordSpacingsupport.
Multimedia đ„
GStreamer-based multimedia support for WebKit, including (but not limited to) playback, capture, WebAudio, WebCodecs, and WebRTC.
Due to on-going work on improving memory usage in WebRTC use-cases, several patches landed in WebKit (1, 2,3) and GStreamer (4). Another related task is under review in libnice.
Building the OpenType-SVG support required building Skia's SVG module, which uses Expat as its XML parser. Packagers will need to add it as a build dependency, or configure the compilation passing -DUSE_SKIA_OPENTYPE_SVG=OFF, which disables the feature.
Support for cross-thread transfer of accelerated ImageBitmap objects
landed upstream for the GTK
and WPE ports. It improves performance of applications that use worker
threads and pass accelerated ImageBitmap objects (with ownership) around.
Today marks the arrival of Safari 18.2. With it, WebKit adds 61 new features and 111 resolved issues. Highlights include cross-document View Transitions, the ability to fill a border with a background, spatial videos in visionOS, ruby improvements, input type=week on iOS, iPadOS & visionOS, WASM garbage collection, HTTPS by default, Genmoji, and more.
Safari 18.2 is available on iOS 18.2, iPadOS 18.2, visionOS 2.2, macOS Sequoia 15.2, macOS Sonoma and macOS Ventura.
CSS
Text box
If you write CSS, youâve probably struggled at some point to optically center text vertically in a box, or to get a headline to line up with the top of an image. Now you can declare which font metric you want the browser to consider the edge of the text box when calculating layout:
h2 {
text-box: trim-startcap;
}
This means âplease do trim the start edge (above the headline) at the cap lineâ. You can see the effect on the right, where the top of the âHâ lines up with the top of the image:
Originally called âleading trimâ, this feature is now simply text-box. Itâs a shorthand for two longhands propertiesâ text-box-trim and text-box-edge â which you can declare separately if you need to control how each cascades. Safari 18.2 is the first browser to ship Text Box, but you can use it today to progressively enhance your design, while browsers without support simply fallback to the older behavior.
View Transitions
WebKit for Safari 18.2 adds support for cross-document View Transitions with @view-transition. This provides a mechanism for easily animating across webpages. Itâs especially handy if you are making an app experience where you donât want users to experience a reload when moving from one page to another. Instead, with View Transitions you can crossfade, swipe, hold steady only changing the new content, and more.
Building on our original support for View Transitions that shipped in Safari 18.0, WebKit for Safari 18.2 adds support for view-transition-name: auto. This means you wonât have to individually name potentially hundreds of different content items if you are applying transitions to the content on a single page. We ran into this problem when we created this masonry-layout demo (switch to âCombined with View Transitionsâ layout with pulldown menu). With 80 items on the page, we had to write 80 separate lines of code like .card:nth-child(80) { view-transition-name: card-80; } over and over. In the real world, you couldnât rely on there never being an 81st item, yet more-than-expected items would break the transitions. Now instead, we can just declare .card { view-transition-name: auto } and let the browser figure out the details.
WebKit for Safari 18.2 also adds support for View Transition Classes and View Transition Types. Classes allow you to easily share styles between different view transitions. It can be used very nicely in combination with view-transition-name: auto . Types allow you to define different variants for the same view transition (e.g. slide-in from the right vs. slide-in from the left for a carousel).
And Safari 18.2 adds support for the pageswap and pagereveal events for View Transitions.
Backgrounds on borders
WebKit for Safari 18.2 adds support for background-clip: border-area. It allows you to put a background on a box, and clip that background to only appear in the area where the border exists. It combines nicely with background-clip: text to create interesting visual effects.
In this example, we can apply a photo of a wooden table as a background to the box, twice. And then clip each background to the border-area and the text respectively.
WebKit for Safari 18.2 updates the calc() function to the most recent web standard, opening up many new possibilities â including dividing by numbers with units. For example, you can convert the current viewport width to pixels with calc(100vw / 1px). Scott Kellum created a demo where the background color of the page is determined by the width of the viewport with this:
WebKit for Safari 18.2 adds support for text-underline-position: left and text-underline-position: right. This lets you shift the position of a sideline to the other side.
Now that Safari 18.2 supports text-underline-position: right, the User Agent defaults for both underline position and text emphasis marks in have been changed for CJK languages.
Ruby
WebKit for Safari 18.2 adds support for three Ruby properties: ruby-align, ruby-overhang, and the now-unprefixed ruby-position.
The ruby-align property is reminiscent of the alignment properties of Flexbox, Grid, and (as of March 2024) block layout. It provides a mechanism for shifting where ruby annotations appear â whether they group together at the start, or in the center, or spread out with equal amounts of space in-between, or equal amounts of space between & around the annotations.
Theruby-overhang property letâs you control whether or not ruby annotations are allowed to spill over into the space above the neighboring character.
The difference can be subtle, but in the second version in the demo, with ruby-overhang: none, the two characters are more clearly separated so the reader can see that there are separate annotations for each. This does cause awkward inline spacing between characters, interrupting the rhythm of the main line of text â but doing so is helpful for beginner readers of textbooks, for example.
And last, Safari 18.2 unprefixes the ruby-position property. Supported since Safari 7 as -webkit-ruby-position with non-standard values, WebKit now supports the standardized values over, under, and inter-character.
WebKit for Safari 18.2 adds support for scrollbar-width and scrollbar-gutter. If you used computers 13-30 years ago, youâll remember how different scrollbars used to be. They were always present. They had thick gutters with complex edges. And they included little up and down arrows for clicking on with a mouse. Fifteen years ago, WebKit introduced a way to style these type of scrollbars through the ::-webkit-scrollbar pseudo element.
Today, scrollbars are visually much simpler, often disappearing entirely when not in use. In response to these changes and after many discussions, the CSS Working Group decided to standardize a slimmed down set of tools for styling scrollbars.
Thescrollbar-width property provides three options. The default is auto. The thin value asks for thinner scrollbars. And none can be used to remove scrollbars entirely, while still maintaining a container thatâs scrollable. On macOS, scrollbar-width: thin creates a thinner scrollbar. On iOS, iPadOS, and visionOS there is no change â iOS and iPadOS always use thin scrollbars.
Thescrollbar-gutter property provides an opportunity to reserve a space for the scrollbar â the space in which the scrollbar will slide. However, scrollbar-gutter has zero effect anytime a browser is using âoverlay scrollbarsâ. Overlay scrollbars are incredibly common these days. They slide overtop the content of the page, without a visible gutter. macOS, iOS, iPadOS and visionOS all use overlay scrollbars system-wide. On macOS, users can change this behavior if they desire, by going to System Settings > Appearance, and changing âShow scroll barsâ to âAlwaysâ. Only then, and on some other operating systems, will the scrollbar take up space in the page layout.
The scrollbar-gutter property has three options: auto, stable, and stable both-edges. The initial value is auto, where space is only reserved when the scrollbar is visible â that is, when the box is set to overflow: scroll, or has overflow: auto + enough content to overflow. The scrollbar: stable rule lets you as a web developer instead ask that the gutter always reserves space, which can be helpful for creating layout consistency. The third option, scrollbar-gutter: stable both-edges, asks the browser to not only create a stable space always reserved for the scrollbar, but to also create that same amount of space on both edges of the box. You can see the result below.
Website scrollbars in Safari 18.2 on macOS, with âShow scroll barsâ set to âAlwaysâ â with and without enough content to cause a scrollbar to appear. Learn more by trying this demo on macOS with overlay scrollbars instead, or on other operating systems.
Scroll to Text Fragments
You might be familiar with anchor links in HTML, where you can send someone a link to a specific anchor on the page â if the web developer of that site created an anchor link for you to use. Scroll to Text Fragments is a tool that allows a user to create a link to any fragment of text on the page, whether or not the siteâs developers thought to do so. Support for Scroll to Text Fragments was added in Safari 16.1. Now in Safari 18.2, thereâs an easy UI for creating a Text Fragment link.
Hereâs how it works. First, go to a web page and highlight the text you want to target with your link. Then choose âCopy Link with Highlightâ from the context menu.
The URL looks like this: https://webkit.org/blog/16214/background-clip-border-area/#:~:text=background%2Dclip:%20text. When a user navigates to the URL, the browser will scroll the text fragment into view, and mark it with a persistent highlight.
WebKit for Safari 18.2 also adds support for the ::target-text pseudo-element. It provides a mechanism for the siteâs web designer/developer to style text fragment link results for their site.
The highlight that appears when a user enters a Scroll to Text Fragment URL can now be styled with the ::target-text pseudo-element.
And more CSS
WebKit for Safari 18.2 adds support in CSS selectors for :is(:host). Previously:is() and:host() were supported, but not in this particular combination.
WebKit for Safari 18.2 adds support for using the corner keywords closest-corner and farthest-corner in circle and ellipse shapes. You might recognize these keywords from the radial gradient syntax. It lets you clip an element with syntax like clip-path: circle(closest-corner at 50px 50px).
WebKit for Safari 18.2 adds support for <string> values of the syntax descriptor for @property.
@property--foobar {
syntax: "<string>";
}
Safari 18.2 adds support for @page margin descriptors. And it adds support to @page for the Japanese standard paper sizes jis-b4 and jis-b5. Also, the size property of @page now parses as a descriptor instead of a global property.
Spatial videos and photos
Safari 18.2 in visionOS 2.2 now supports viewing spatial videos. You can record a spatial video on Vision Pro, iPhone 15 Pro or any iPhone 16, or any camera that records MV-HEVC with spatial metadata. You can then publish it on the web with the HTML video element, just like any other video.
<videocontrols><sourcesrc="birthdayparty.mov"type="video/quicktime; codecs=hvc1.1.6.L123.B0" /><!-- spatial video --><sourcesrc="birthdayparty.webm"type="video/webm" /></video>
Any browser that supports HEVC video will play the spatial video file as 2D video on the webpage. In visionOS, Safari 18.2 provides UI alongside the rest of the video controls to allow users to tap to view the video spatially. On first tap, the video appears in a floating frame as the Safari window disappears. Then when the user taps again, the video further expands to create a more immersive experience. When they exit the video, the Safari window returns.
Safari 18.2 in visionOS 2.2 also adds additional support for viewing spatial photos.
Anytime you embed a spatial photo in a web page, it appears inline in 2D, just like any other photo. Starting with Safari 18.0 for visionOS, as a web developer, you could use the JavaScript Fullscreen API to provide a mechanism for spatial photos to escape the webpage and be immersive.
Now, in Safari 18.2, users can view any spatial photo by pinching and holding it, and then selecting âView Spatial Photoâ.
You can continue to use Fullscreen API on spatial photos if youâd like to make your own UI. It now also works on spatial videos. They are displayed in a stereoscopic portal with a button allowing users to fully immerse themselves in the content.
WebXR
WebKit for Safari 18.2 in visionOS 2.2 adds support to re-project WebXR content converting depth from forward-Z to reverse-Z. And now, the WebXR Session now includes the enabledFeatures property. When you request an XRSession you list the optionalFeatures and requiredFeatures for your WebXR experience. The enabledFeatures property tells you which features were granted without needing to feature detect them.
Genmoji
WebKit on iOS 18.2 and iPadOS 18.2 adds support for Genmoji. Make a brand-new Genmoji right in the keyboard. Provide a description to see a preview, and adjust your description until youâve got the perfect custom emoji.
In Safari 18.2, you can post the Genmoji youâve created to the web. They get added to content as images.
WKWebView supports the full NSAdaptiveImageGlyph API, via the supportsAdaptiveImageGlyph property on WKWebViewConfiguration, making it possible to support adaptive image glyphs in your app. Learn more by watching Bring expression to your app with Genmoji from WWDC24.
Media
WebKit for Safari 18.2 adds support for allowing websites to override the system-default accessibility caption styling. Web Video Text Tracks (WebVTT) are the webâs system for creating subtitles and captions. As a developer, you can style these text tracks with the::cue pseudo-element. In the system accessibility settings on Apple platforms, users can select a system-default caption style, or create their own custom style. Previously, the system-default caption styles would override the websiteâs styles. Now, system-default caption styles are always overridable, but users may still create custom styles, and prevent those styles from being overridden by the page.
WebKit for Safari 18.2 now adds a fallback image to Now Playing when a website doesn’t specify one in MediaSession metadata.
HTML
Safari 18.2 adds support for input type=week on iOS, iPadOS, and visionOS.
WebKit for Safari 18.2 adds support for blocking=render attribute for <script> and <style>. It allows you to tell the browser to block presenting the rendered page until that particular script or style file is run. This is the default behavior of many resources for a web page, so itâs not often needed. But itâs here if you find yourself in a situation where such a tool (such as a <script> with the async attribute) would be handy. WebKit for Safari 18.2 also adds support for Document render-blocking with <link rel=expect>. It similarly causes the page to be render-blocked until the essential parts of the document are parsed so it will render consistently. These two tools can be especially useful for cross-document View Transitions, where you might want more control over what must be loaded before the animation snapshots can be taken.
WebAssembly
WebKit for Safari 18.2 adds support for WASM Garbage Collection. It allows WebAssembly modules to define a variety of new reference types whose memory is managed automatically by the browser. These types range from simple data types like structs and arrays, to more complex type relationships such as subtyping and recursion. Without WASM GC, source languages that rely on garbage collection (such as Java, C#, Kotlin, Go, and others) generally have to write their own garbage collectors and compile them to WebAssembly. This poses a significant barrier when targeting WebAssembly. Due to the limitations of WebAssembly memory, these collectors are often forced to use less efficient implementation techniques and canât easily interface with JavaScript. With WASM GC, these languages can often directly express their type system in WebAssembly, making it easier to target. Once running in WebAssembly, these languages can leverage the same native garbage collector the browser uses to manage JavaScript objects, which simplifies JS/WASM interoperability and often improves performance.
WebKit for Safari 18.2 also adds support for WASM Tail Calls, which allows WebAssembly modules to call functions while reusing the current stack frame. Tail calls can asymptotically reduce memory usage for recursive algorithms, which enables functional programming patterns to be directly expressed in WebAssembly. Tail calls can also be used to efficiently express state machines, which can be used to improve the performance of interpreters and emulators compiled to WebAssembly.
Web API
WebKit brings significant improvements to Pointer Events in Safari 18.2, including updating click, contextmenu, and click() to use PointerEvent giving developers access to the pointerType property on these events. Thereâs also new support support for the auxclick event that is triggered when a non-primary pointing device is pressed and released.
New PointerEvent methods getPredictedEvents() and getCoalescedEvents() are now supported. The getPredictedEvents() method returns a sequence of PointerEvent instances that are estimated future pointer positions, based on past points, current velocity, and trajectory. The getCoalescedEvents() method returns a sequence of PointerEvent instances that were coalesced (merged) into a single pointermove.
And WebKit for Safari 18.2 now supports altitudeAngle and azimuthAngle, letting you easily determine the angle between Apple Pencil and the X-Y or Y-Z planes of the screen. The first of these read-only properties represents the angle between a pointer or stylus axis and the X-Y plane of a device screen. The second represents the angle between the Y-Z plane and the plane containing both the pointer or stylus axis and the Y axis.
Additional Web API enhancements in WebKit includes support for NavigationActivation.finished handling and implementation of a specification update that provides a new initial focus algorithm for the <dialog> element.
JavaScript
WebKit for Safari 18.2 introduces several enhancements to JavaScript, including a new TypedArray â the Float16Array â to complement the existing Float32Array and Float64Array. This array represents 16-bit floating point numbers in platform byte order.
Enhancements to theIntl.Locale object now has support for firstDayOfWeek. It returns information about which day is considered the first day of the week in specific locations.
There is also new support for thePromise.try static method and for RegExp.escape.
WebKit for Safari 18.2 adds support for type reflection for WebAssembly.Module.imports and WebAssembly.Module.exports.
Iterator improvements include Iterator.prototype.constructor and Iterator.prototype[@@toStringTag], and Iterator.from as part of the Iterator Helpers Proposal.
Security and Privacy
Safari 18.2 on iOS, iPadOS, and visionOS will always try to load webpages over secure connections first, i.e. HTTPS by default. Only if the secure page load fails will Safari fall back to non-secure HTTP.
In addition, on all platforms, Safari 18.2 also adds an optional Security setting to enforce secure connections and show a warning before attempting a non-secure fallback. The user then gets to choose if they want to cancel or continue over HTTP. The label of the setting is “Not Secure Connection Warning” on iOS, iPadOS, and VisionOS. It is “Warn before connecting to a website over a non-secure connection” on macOS.
Web Inspector
WebKit for Safari 18.2 adds support for blackboxing ranges within a file, and adds support for sourcemaps to be blackboxed.
WebKit for Safari 18.2 also adds support for showing boundThis for arrow functions in the console.
WebDriver
WebKit for Safari 18.2 adds support for using a persistent website data store.
WKWebView
WKWebView also adds support for WKDownload.originatingFrame and WKDownload.userInitiated API, as well as for WKWebpagePreferences.UpgradeToHTTPSPolicy.
Bug Fixes and more
In addition to all the new features, WebKit for Safari 18.2 includes work to polish existing features.
Accessibility
Fixed text-transform: full-size-kana to not affect speech output.
Fixed element reflection attributes to be able to retrieve a disconnected element.
Fixed VoiceOver focus to activate PDF form fields when it lands on them.
Fixed tree updates becoming broken when children change for a dynamically ignored element and its unignored ancestor is in the same tree update cycle.
Fixed handling dynamically-created and nested aria-modal dialogs.
Fixed the accessibility tree to update when a text selection is cleared.
Browser
Fixed windows not getting restored after updating macOS.
Canvas
Fixed CanvasRenderingContext2D globalAlpha property getting ignored for some values of globalCompositeOperation.
CSS
Fixed backgrounds applied to a table row repeating in every table cell.
Fixed the size property of @page to parse as a descriptor, not a global CSS property.
Fixed background-clip: text to correctly paint text decorations.
Fixed font-variant: small-caps normal; to be invalid syntax.
Fixed -webkit-line-clamp: none to be parsable.
Fixed text-underline-offset to support percentages.
Fixed text-decoration-thickness to work on buttons.
Fixed the lh unit sometimes getting computed before line-height is resolved.
Fixed touch-action to use pan-x pan-y order when serializing.
Fixed serialization of place-content, place-items, and place-self properties.
Updated CSS Nesting to remove the hoisting behavior.
Fixed CSS Nested declarations inside a @scope to behave like :where(:scope).
Disallow matching of :has() in CSS Nesting.
Improved scrollbar styling support for interoperability.
Fixed contrast between ButtonFace and ButtonText system colors in dark mode.
Fixed attribute initial-value makes the @property rule invalid for [var(--x)].
Fixed invalidating attribute values when programmatically mutated so that page attribute selectors work as expected.
Editing
Aligned with the standardized version of the autocorrect attribute, which does not support Email, URL and Password fields and does not treat the empty string value in a special way.
Forms
Fixed HTMLSelectElement.prototype.add with optgroup elements.
History
Fixed using Cross-Origin-Opener-Policy HTTP header disabling the back-forward cache.
JavaScript
Fixed class field initializers to disallow yield and await expressions.
Fixed DestructuringAssignmentTarget to be evaluated prior to calling [[Get]] or a stepping iterator.
Fixed throwing an exception for negative exponent in BigInt in the JIT compiler.
Fixed RegExp range quantifier to allow 2^53 – 1.
Fixed Uint8Array#setFromBase64 to decode and write chunks which occur prior to bad data.
Disallowed yield and await expressions in class field initializers.
Fixed TimeZone without Time to be rejected in ISO8601 strings.
Fixed Object.keys(global) including non-enumerable properties unless deleted first.
Fixed the error message of Temporal.Instant.fromEpochMilliseconds.
Temporal.Instant.prototype.epochMilliseconds now returns a floored value.
Improved the TypeError message when a WeakMap constructor takes an iterable that yields invalid entry.
Fixed incorrect SyntaxError when destructuring let.
Removed the obsoleted Temporal.Instant API.
Media
Fixed fullscreen error handling to include error messages.
Fixed audioTrack.configuration() values for WebM files.
PDF
Fixed a hang that could occur using the Select All keyboard shortcut âA (Command-A) on a PDF causing all pages to be blank.
Rendering
Fixed non-separable blend modes in mix-blend-mode to workon elements in compositing layers.
Fixed MathML to layout invalid markup as an <mrow>.
Improved grid track sizing by adding support for wrapped column flex containers, multi-column containers, and items with aspect ratios that depend on row size.
Fixed margins used for grid items on relayout.
Fixed grid areas to be considered in layout overflow.
Fixed grid area overflow to include inline end and block end padding.
Fixed items that span multiple tracks with optimizations.
Fixed rendering image content with percentage height in a container with height: auto.
Fixed an extra wrap when a table with mixed white-space values applied to the table and table content.
Fixed repeating background-image sized to the content-box failing to fill the viewport in an iframe.
Fixed rendering tick marks of the range input type when the page zoom is less than 1.
Security
Fixed an empty origin in the location permission prompt for a blob:// resource.
Fixed javascript: URL navigation to another browsing context created from window.open not checking the source’s Content Security Policy.
SVG
Fixed correctly applying clip-path to the SVG element.
Fixed zooming in or out of an SVG with transform-origin.
Fixed an issue for getPointAtLength to throw an exception when path is empty.
Fixed fill to not be considered a presentation attribute on animation elements.
Fixed script elements in XHTML documents to work when trusted types are enforced.
Removed non-standard hasExtension.
Web Animations
Fixed alignment-baseline and buffered-rendering to support discrete animation.
Fixed hanging-punctuation to support discrete animation.
Fixed scroll-snap- properties to support discrete animation.
Fixed column-span to support discrete animation.
Fixed appearance to support discrete animation.
Fixed hyphenate-character to support discrete animation.
Fixed font-optical-sizing to support discrete animation.
Fixed image-rendering to support discrete animation.
Improved animation support for shorthands.
Fixed the mask-border- properties to be animatable.
Fixed stroke-color to be animatable.
Fixed transform animations that jump back and forth instead of animating continuously.
Web API
Fixed the Pointer Lock API to work when Fullscreen API is enabled.
Fixed pointer events generated from platform mouse events to use the platform event’s timestamp.
Aligned oncuechange event handler handling with other event handlers.
Fixed two mousemove events dispatched when the mouse enters a web view window instead of a single one.
Fixed Pointer Events created for pointer capture to be trusted and composed.
Fixed checking against the âactive documentâ of the pointer when setting the pointer capture.
Removed support for the non-standard “overflow” event.
Moved onbeforeinput to GlobalEventHandlers.
Fixed popovertarget to work on buttons in a form.
Fixed popover tab navigation.
Fixed the directionality of non-HTML elements.
Fixed the directionality of shadow trees.
Fixed setting .value = to update dir=auto inputs.
Fixed XMLSerializer.serializeToString() not serializing the children of <img> and also not closing the <img> if it has children.
Fixed text highlights when selecting large text that ends with a common phrase.
Fixed copying a link to a common term in an article resulting in an incorrect part of the page being highlighted.
Fixed scrollIntoView(...for SVG elements.
Fixed non-modal popover dialog blocking interaction on the content behind it.
Fixed pushManager.subscribe returning an empty endpoint.
Web Apps
Fixed Web Application Manifest parsing to trim all ASCII whitespace.
WebDriver
Fixed WebDriver to use pointer origin rather than viewport origin for state location resolution.
Fixed chorded mouse interactions by ensuring input dispatch logic correctly interprets successive mousepress or mouserelease actions with different button values.
Fixed WebDriver sometimes taking screenshots with a transparent grey line at the top and no rounded corners.
Fixed an issue where all script evaluation was unconditionally performed with user activation.
Web Inspector
Fixed parsing attributes added when editing the tag name.
Fixed an issue where multi-line content in the Console prompt was not scrollable.
WebXR
Fixed audio not audible during an immersive session in visionOS.
WKWebView
Fixed apps crashing intermittently crashing at launch.
Fixed -[WKWebViewConfiguration writingToolsBehavior] not available when using a deployment target lower than iOS 18. (FB15297419)
Fixed text editing corruption after [NSInputAnalytics didInsertText:] is called without a session beginning.
If you are running macOS Sonoma or macOS Ventura, you can update Safari by itself, without updating macOS. Go to ïŁż > System Settings > General > Software Update and click âMore infoâŠâ under Updates Available.
To get the latest version of Safari on iPhone, iPad or Apple Vision Pro, go to Settings > General > Software Update, and tap to update.
Feedback
We love hearing from you. To share your thoughts, find Jen Simmons on Bluesky / Mastodon and Jon Davis on Bluesky / Mastodon. You can follow WebKit on LinkedIn or X. 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.
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.
This is based on this previous blog post by Alicia, and I recommend taking a look - many things mentioned in it are still useful here. Reading a symbolâs documentation in a popup
The most straight-forward option would have been to just install another instance of my IDE inside the container.
However, I use NixOSÂ +Â Home Manager to manage and configure my packages declaratively, so the Ubuntu-based container environment would be a quite frustrating difference:
Package versions will be lagging behind, and sooner or later I will have to deal with differences with configuration, features, or bugs.
For example, at time of writing, neovim is packaged in Debian 24.10 at version 0.9.5, while nixpkgs ships 0.10.2.
(To be fair, Flathub and Snapcraft would be up-to-date as well, but I have my gripes with those too.)
Either way, I now have a new set of configurations to manage and keep in sync with their canonical versions on the host system.
Any other tools I donât install in the container, I wonât have access to - for example, for running commands from inside my IDE.
Overall, this will waste time and disk space better used for other things. So, after trying out a few different approaches, a clangd wrapper script that bridges
the disconnect between my host system and the container was the first satisfying solution I found.
Conveniently, this fits well with my approach of writing wrappers around wkdev scripts to expose as much functionality as possible to my host system, to avoid
manually entering the container - in effect abstracting it out of sight.
This is roughly the script I currently use. I personally prefer nushell, but I will go into details below so you can write your own
version in whatever language you prefer.
The idea is to start clangd inside the container, and use socat to expose its stdin/out to the IDE over TCP.
That is to avoid this podman issue I ran into if I tried using stdin.
#!/usr/bin/env -S nu --stdin
def main [
--name (-n): string = "wkdev-sdk"
--show-config
] {
# picking a random port for the connection avoids colliding with itself in case an earlier instance of this script is still around
let port = random int 2000..5000
let workdir = $"/host(pwd)"
# the container SDK mounts your home directory to `/host/home/...`,
# so as long as the WebKit checkout is somewhere within your $HOME,
# mapping paths is as easy as just prepending `/host`
let mappings_table = ["Source" "WebKitBuild/GTK/Debug" "WebKitBuild/GTK/Release"]
| each {|path| {host: $"($env.WEBKIT_DIR)/($path)" container: $"/host($env.WEBKIT_DIR)/($path)"}}
let mappings = $mappings_table
| each {|it| $"($it.host)=($it.container)" }
| str join ","
let podman_args = [
exec
--detach
--user
1000:100
$name
]
let clangd_args = [
$"--path-mappings=($mappings)"
--header-insertion=never # clangd has the tendency to insert unnecessary includes, so I prefer to just disable the feature.
--limit-results=5000 # The default limit for reference search results is too low for WebKit
--background-index
--enable-config # Enable reading .clangd file
-j 8
]
# Show results of above configuration when called with --show-config, particularly helpful for debugging
if $show_config {
{
port: $port
work_dir: $workdir
mappings: $mappings_table
podman_args: $podman_args
clangd_args: $clangd_args
}
} else {
# ensure that the container is running
podman start $name | ignore
# container side
( podman ...$podman_args /usr/bin/env $'--chdir=($workdir)' socat
$"tcp-l:($port),fork"
$"exec:'clangd ($clangd_args | str join (char space))'"
) | ignore
# host side
nc localhost $port
}
}
IDE setup is largely the same as it would usually be, aside from pointing the clangd path at our wrapper script instead.
I use helix, where I just need to add a .helix/languages.toml to the WebKit checkout directory:
In VS Code, you need the clangd extension, then you can enter the absolute path to the script under
File > Preferences > Settings > Extensions/clangd > Clangd: Path, ideally in the Workspace tab so the setting only applies to WebKit.
I created both files manually, but as of [cmake] Auto-complete via clangd auto-setup, there seem to be new scripts to help with setting up and updating both files. (Thanks Alicia!)
I havenât tried it so far, but I recommend you take a look yourself.
Overall, Iâm very satisfied with the results, so far everything is working like I expected it to. Finally having a working language server brought me the usual benefits -
I mostly got rid of the manual compile-fix cycles that introduced so much friction and waiting times, and trivial mistakes and typos are much less of a headache now.
But the biggest improvement, to me, is Goto definition/references and the symbol picker, making it easier to grasp how things interact. Much better than using grep over and over!
As I was fighting clangd/podman, I also came across some other options that I didnât try, but might be interesting to look at:
VSCode dev containers
Probably the most polished option, though it is exclusive to VSCode - from what I understand, the extension isnât even available to forks for licensing reasons.
Distant
Its main purpose is to act as a tool for working remotely, but I donât see why it couldnât be used with a container. It is still in alpha, and so far only has support in Neovim.
I canât tell how well it would play with LSP, but it might be worth a shot if you already use Neovim.
Update on what happened in WebKit in the week from November 23 to December 2.
Cross-Port đ±
The documentation on GTK/WPE port profiling with Sysprof landed upstream.
Support for anchor-center alignment landed upstream for all the WebKit ports. This is a part of cutting-edge CSS spec called CSS Anchor Positioning. To test this feature, the CSSAnchorPositioning runtime preference needs to be enabled.
Web Platform đ
WebKit has since a long time offered a non-standard method
Document.caretRangeFromPoint() to get the caret range at a certain
coordinate, but now offers the same functionality in a standardised way.
We improved the multi touch support on WPE: the touch identifiers are now more reliable when using the Web API Pointer Events. This has been backported to the last stable release 2.46.4
JavaScriptCore đ
The built-in JavaScript/ECMAScript engine for WebKit, also known as JSC or SquirrelFish.
On the JSC front, Justin Michaud has fixed a tricky
issue in the implementation of
Air shuffles (i.e. smartly copying N arbitrary locations to N different
arbitrary locations). He also
fixed some lowering code that
generated invalid B3, as well as the 32-bit version of
addI31Ref (part of the GC
wasm extension).
Angelos Oikonomopoulos
fixed another corner case in
the testing of single-precision floating point arguments on 32-bits.
Graphics đŒïž
Support for multi-threaded GPU rendering landed
upstream for both GTK/WPE ports. In
main branch, GPU accelerated tile rendering was already activated by
defaultâit is still the case, but now it utilizes one extra GPU rendering
thread instead of performing the GPU rendering using (and blocking) the main
thread.
The number of threads used for CPU multi-threaded rendering was controlled
by the WEBKIT_SKIA_PAINTING_THREADS environment variable and has been
renamed to WEBKIT_SKIA_CPU_PAINTING_THREADS. Likewise we now support the
setting WEBKIT_SKIA_GPU_PAINTING_THREADS (where 0 implies using the main
thread, and values in the 1 to 4 range enable threaded GPU rendering) to
control the amount of GPU rendering threads used.
Negotiation of buffer formats with Wayland using DMA-BUF feedback was
getting the first format that fits with the requirements in the first
tranche even when the transparency did not match. Now we honor the
transparency if there is a way to do
it,
even when other tranches than the first one need to be used. This allows the
compositor to do direct scanout in more cases.
Releases đŠïž
This has been a week filled with releases!
On the stable series, WebKitGTK 2.46.4 and WPE WebKit 2.46.4 include the usual stream of small fixes, a number of multimedia handling improvements focused on around Media Stream, and two important security fixes covered in a new security advisory (WSAâ2024â0007: GTK, WPE). The covered vulnerabilities are known to be exploited in the wild, and updating is strongly encouraged; fresh packages are already available (or will be soon) in popular Linux distributions.
Also, development releases WebKitGTK 2.47.2 and WPE WebKit 2.47.2 are now available. The main highlights are the multi-threaded GPU rendering, and the added system settings API in WPEPlatform. These development snapshots are often timed around important changes; we greatly appreciate when people put the effort to give them a try, because detecting (and reporting) any issues earlier is a great help that gives us developers more time to polish the code before it reaches a stable version.
Infrastructure đïž
Flatpak 1.15.11 was released with a handful of patches related to accessibility. These patches enable WebKit accessibility to work in sandboxed environments. With this release, all the pieces of this puzzle fell in place, and now sandboxed apps that use WebKit are properly accessible and introspectable by screen readers and Braille generators.
Of course, there are further improvements to be made, and lots of fine-tuning to how WebKit handles accessibility of web pages. But this is nonetheless an exciting step, both for accessibility on Linux and also for the platform.
A WPE MiniBrowser runner for the Web-Platform-Tests (WPT) cross-browser test suite was added recently. Please check the documentation on how to use it and remember that there is also a WebKitGTK MiniBrowser runner there also available. Both runners allow to automatically download and use the last nightly universal bundle for running the tests if you pass the flag --install-browser to ./wpt run. Pass also --log-mach=- for increased verbosity. Please note that this only adds the runner for manual testing. We are still working on adding WPE to the automated testing dashboard at wpt.fyi
Justin Michaud submitted a fix for flashing Yocto images to external SD cards.
The WPE WebKit web site now has a separate RSS feed for security advisories. It can be reached at https://wpewebkit.org/security.xml and may be useful for those interested in automated notifications about security fixes.