<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet WebKit</title>
	<link rel="self" href="https://planet.webkit.org/atom.xml"/>
	<link href="https://planet.webkit.org/"/>
	<id>https://planet.webkit.org/atom.xml</id>
	<updated>2026-03-09T07:53:03+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #58</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-58/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-58/</id>
		<updated>2026-03-02T20:11:00+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from February 23 to March 2.&lt;/p&gt;
&lt;p&gt;
This installment of the periodical brings news about support
for Qualcomm qtivdec2 and qtivenc2 on GStreamer, GPU texture
atlas creation and replay substitution, enhancement of the scroll
gesture in WPE, and two new releases: WebKitGTK 2.51.92 and WPE
WebKit 2.51.92.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
&lt;h3 id=&quot;multimedia-movie-camera&quot;&gt;Multimedia 🎥&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;GStreamer-based multimedia support for WebKit, including (but not limited to) playback, capture, WebAudio, WebCodecs, and WebRTC.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Work on adding support for the Qualcomm GStreamer qtivdec2 and qtivenc2 elements is on-going&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics 🖼️&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/308458@main&quot; rel=&quot;external&quot;&gt;Implemented GPU texture atlas creation and replay substitution&lt;/a&gt; in the Skia painting engine on GTK/WPE. After recording, raster images are packed into GPU atlases via &lt;code&gt;BitmapTexture&lt;/code&gt;, with two upload paths: an optimized DMA-buf path that memory-maps GPU buffers and dispatches uploading to a dedicated worker thread, and a synchronous GL fallback using &lt;code&gt;BitmapTexture::updateContents()&lt;/code&gt;. Atlas uploads are synchronized across workers using a countdown-latch fence. During replay, &lt;code&gt;SkiaReplayCanvas&lt;/code&gt; intercepts raster image draws and substitutes them with atlas texture draws, mapping source coordinates into atlas space.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit 📟&lt;/h2&gt;
&lt;h3 id=&quot;wpe-platform-api-jigsaw&quot;&gt;WPE Platform API 🧩&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;New, modern platform API that supersedes usage of libwpe and WPE backends.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The recent WPE WebKit 2.51.92 release is the first one to have its &lt;a href=&quot;https://wpewebkit.org/reference/2.51.92/wpe-platform-2.0/&quot; rel=&quot;external&quot;&gt;WPEPlatform documentation online&lt;/a&gt;, but it was not included in the tarball. This issue &lt;a href=&quot;https://commits.webkit.org/308408@main&quot; rel=&quot;external&quot;&gt;has been corrected&lt;/a&gt; and tarballs for future releases  will also include this documentation.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Scrolling using touch input with WPEPlatform would result in scrolling faster when more than one touch point was in effect. The gesture detector &lt;a href=&quot;https://commits.webkit.org/308271@main&quot; rel=&quot;external&quot;&gt;has been fixed&lt;/a&gt; to make scrolling have always a consistent speed.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases 📦️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The third —and likely the last— release candidates for the upcoming stable branch, &lt;a href=&quot;https://webkitgtk.org/2026/02/27/webkitgtk2.51.92-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK 2.51.92&lt;/a&gt; and &lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.51.92.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.51.92&lt;/a&gt;, have been published. For those interested in previewing the upcoming 2.52.x series this release is expected to be quite stable; but there might be still some rough edges. Reporting &lt;a href=&quot;https://bugs.webkit.org/&quot; rel=&quot;external&quot;&gt;issues in Bugzilla&lt;/a&gt; are, as usual, more than welcome.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Release Notes for Safari Technology Preview 238</title>
		<link href="https://webkit.org/blog/17848/release-notes-for-safari-technology-preview-238/"/>
		<id>https://webkit.org/?p=17848</id>
		<updated>2026-02-26T22:36:22+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://webkit.org/blog/6017/introducing-safari-technology-preview/&quot;&gt;Safari Technology Preview&lt;/a&gt; Release 238 is now &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;available for download&lt;/a&gt; for macOS Tahoe and macOS Sequoia. If you already have Safari Technology Preview installed, you can update it in System Settings under General → Software Update.&lt;/p&gt;
&lt;p&gt;This release includes WebKit changes between: &lt;a href=&quot;https://github.com/WebKit/WebKit/compare/a908742cd775de5fa23dbf408618449db7f5fefb...b73f15088293cec470e0c2ceddd58bcd0b8480e5&quot;&gt;306596@main&amp;#8230;307618@main&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Animations&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Enabled threaded time-based animation resolution, synchronizing accelerated time-based animations with scroll-driven animations while preserving enhanced performance by running animations off the main thread. This also allows CSS Motion Path animations to be accelerated. (&lt;a href=&quot;https://commits.webkit.org/307252@main&quot;&gt;307252@main&lt;/a&gt;)  (170131323)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CSS&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for the CSS &lt;code&gt;:open&lt;/code&gt; pseudo-class, which matches form elements and other elements in an open state. (&lt;a href=&quot;https://commits.webkit.org/307295@main&quot;&gt;307295@main&lt;/a&gt;)  (170108337)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed scrollable overflow computation for block containers to account for &lt;code&gt;padding-inline-end&lt;/code&gt;, aligning with the CSS Overflow specification. (&lt;a href=&quot;https://commits.webkit.org/307212@main&quot;&gt;307212@main&lt;/a&gt;)  (144312078)&lt;/li&gt;
&lt;li&gt;Fixed rendering of linear gradients when all color stops are at the same position. (&lt;a href=&quot;https://commits.webkit.org/306823@main&quot;&gt;306823@main&lt;/a&gt;)  (169063497)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Editing&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added menu items to convert editable text between Simplified and Traditional Chinese characters in the &amp;#8220;Transformations&amp;#8221; submenu. (&lt;a href=&quot;https://commits.webkit.org/306761@main&quot;&gt;306761@main&lt;/a&gt;)  (156354464)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Forms&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Enabled the customizable &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; element, allowing custom styling and content in &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; dropdowns using &lt;code&gt;appearance: base-select&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/307548@main&quot;&gt;307548@main&lt;/a&gt;)  (170328089)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Networking&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where Safari&amp;#8217;s address bar could display an internationalized domain name (IDN) homograph as a visually identical legitimate Latin domain, enabling potential phishing attacks. (&lt;a href=&quot;https://commits.webkit.org/307005@main&quot;&gt;307005@main&lt;/a&gt;)  (166796168)&lt;/li&gt;
&lt;li&gt;Fixed incorrect URL query percent-encoding when using non-UTF-8 character encodings such as &lt;code&gt;iso-8859-2&lt;/code&gt;, &lt;code&gt;windows-1250&lt;/code&gt;, and &lt;code&gt;gbk&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/306768@main&quot;&gt;306768@main&lt;/a&gt;)  (169566553)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Rendering&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a performance issue causing a hang when rendering tables with a large number of &lt;code&gt;rowspan=&quot;0&quot;&lt;/code&gt; cells. (&lt;a href=&quot;https://commits.webkit.org/306891@main&quot;&gt;306891@main&lt;/a&gt;)  (146056348)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SVG&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed: Updated the default values of &lt;code&gt;fx&lt;/code&gt; and &lt;code&gt;fy&lt;/code&gt; attributes on &lt;code&gt;SVGRadialGradientElement&lt;/code&gt; to &lt;code&gt;50%&lt;/code&gt; to align with the SVG2 specification. (&lt;a href=&quot;https://commits.webkit.org/306811@main&quot;&gt;306811@main&lt;/a&gt;)  (169645572)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;SVGAnimatedRect.baseVal&lt;/code&gt; to ignore invalid values set on the &lt;code&gt;viewBox&lt;/code&gt; attribute, such as negative width or height, aligning with Firefox and Chrome. (&lt;a href=&quot;https://commits.webkit.org/307463@main&quot;&gt;307463@main&lt;/a&gt;)  (170214971)&lt;/li&gt;
&lt;li&gt;Fixed SVG length attributes to reset to their default values when removed, rather than retaining previously set values. (&lt;a href=&quot;https://commits.webkit.org/307585@main&quot;&gt;307585@main&lt;/a&gt;)  (170360351)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Scrolling&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Enabled scroll anchoring, which prevents visible jumps in scroll position when content is inserted or removed above the viewport. (&lt;a href=&quot;https://commits.webkit.org/307475@main&quot;&gt;307475@main&lt;/a&gt;)  (170279026)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web API&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for &lt;code&gt;ReadableStream.from()&lt;/code&gt; to create a &lt;code&gt;ReadableStream&lt;/code&gt; from an async iterable or iterable. (&lt;a href=&quot;https://commits.webkit.org/306786@main&quot;&gt;306786@main&lt;/a&gt;)  (169605740)&lt;/li&gt;
&lt;li&gt;Added support for transferring &lt;code&gt;ReadableStream&lt;/code&gt; objects via &lt;code&gt;postMessage()&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/307068@main&quot;&gt;307068@main&lt;/a&gt;)  (169950592)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where Speculation Rules did not trigger prefetches for anchor elements that were not themselves visible but had visible descendants. (&lt;a href=&quot;https://commits.webkit.org/306730@main&quot;&gt;306730@main&lt;/a&gt;)  (169561588)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;NavigateEvent.canIntercept&lt;/code&gt; to correctly return &lt;code&gt;false&lt;/code&gt; when navigating to a URL with a different port, aligning with the Navigation API specification. (&lt;a href=&quot;https://commits.webkit.org/307316@main&quot;&gt;307316@main&lt;/a&gt;)  (169845691)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web Inspector&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Improved discoverability of color formats and gamuts in the color picker by adding explicit format and gamut toggle controls. (&lt;a href=&quot;https://commits.webkit.org/306691@main&quot;&gt;306691@main&lt;/a&gt;)  (168216591)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where the text filter in the Sources tab did not apply to Local Overrides and Console Snippets sections. (&lt;a href=&quot;https://commits.webkit.org/306647@main&quot;&gt;306647@main&lt;/a&gt;)  (169443917)&lt;/li&gt;
&lt;li&gt;Fixed an issue where tree outlines in Web Inspector would intermittently show blank content while scrolling when a filter was active. (&lt;a href=&quot;https://commits.webkit.org/306680@main&quot;&gt;306680@main&lt;/a&gt;)  (169502061)&lt;/li&gt;
&lt;li&gt;Fixed an issue in the Timelines tab where rows containing object previews were sometimes not visible in the heap snapshot data grid. (&lt;a href=&quot;https://commits.webkit.org/307358@main&quot;&gt;307358@main&lt;/a&gt;)  (170164522)&lt;/li&gt;
&lt;li&gt;Fixed context menu items in the Elements tab to only display relevant options when multiple DOM nodes are selected. (&lt;a href=&quot;https://commits.webkit.org/307485@main&quot;&gt;307485@main&lt;/a&gt;)  (170307979)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebAssembly&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for JavaScript Promise Integration (JSPI) for WebAssembly, enabling WebAssembly code to suspend and resume execution while waiting for JavaScript promises. (&lt;a href=&quot;https://commits.webkit.org/307404@main&quot;&gt;307404@main&lt;/a&gt;)  (170260385)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebRTC&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;RTCRtpSynchronizationSource.timestamp&lt;/code&gt; to use the correct time base, aligning with the WebRTC specification. (&lt;a href=&quot;https://commits.webkit.org/307063@main&quot;&gt;307063@main&lt;/a&gt;)  (169679084)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;RTCIceCandidate.toJSON()&lt;/code&gt; to include the &lt;code&gt;usernameFragment&lt;/code&gt; field in the serialized output. (&lt;a href=&quot;https://commits.webkit.org/306845@main&quot;&gt;306845@main&lt;/a&gt;)  (169679947)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;RTCRtpTransceiver.setCodecPreferences()&lt;/code&gt; to accept codec entries regardless of the &lt;code&gt;mimeType&lt;/code&gt; case, aligning with Firefox and the specification. (&lt;a href=&quot;https://commits.webkit.org/307062@main&quot;&gt;307062@main&lt;/a&gt;)  (169789074)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;RTCRtpSender&lt;/code&gt; to allow a &lt;code&gt;maxFramerate&lt;/code&gt; encoding parameter value of &lt;code&gt;0&lt;/code&gt;, aligning with the specification and other browsers. (&lt;a href=&quot;https://commits.webkit.org/307034@main&quot;&gt;307034@main&lt;/a&gt;)  (169863687)&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>https://webkit.org</uri>
		</author>
		<source>
			<title type="html">Blog – WebKit</title>
			<subtitle type="html">Open Source Web Browser Engine</subtitle>
			<link rel="self" href="https://webkit.org/blog/feed/"/>
			<id>https://webkit.org/blog/feed/</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #57</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-57/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-57/</id>
		<updated>2026-02-23T19:52:49+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from February 9 to February 23.&lt;/p&gt;
&lt;p&gt;
In this week we have a nice fix for video streams timestamps, a fix
for a PDF rendering regression, support for rendering video buffers
provided by Qualcomm video decoders, and a fix for a font selection
issue. Also notable we had a new WPE Android release, and the libsoup
3.6.6 release.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Added a &lt;a href=&quot;https://commits.webkit.org/307348@main&quot; rel=&quot;external&quot;&gt;new &lt;code&gt;webkit_feature_list_find()&lt;/code&gt; convenience function&lt;/a&gt; to the public API, which searches for a &lt;a href=&quot;https://webkitgtk.org/reference/webkitgtk/2.51.91/struct.Feature.html&quot; rel=&quot;external&quot;&gt;WebKitFeature&lt;/a&gt; given its identifier.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;multimedia-movie-camera&quot;&gt;Multimedia 🎥&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;GStreamer-based multimedia support for WebKit, including (but not limited to) playback, capture, WebAudio, WebCodecs, and WebRTC.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/307359@main&quot; rel=&quot;external&quot;&gt;Opportunistically fix decoding timestamps to prevent deletion of preexisting samples when PTS doesn&#x27;t conflict&lt;/a&gt;, fixing potential glitches when inserting videos (eg: ad insertion).&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics 🖼️&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/308033@main&quot; rel=&quot;external&quot;&gt;Fixed&lt;/a&gt; a &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=306621&quot; rel=&quot;external&quot;&gt;PDF rendering regression&lt;/a&gt; caused by the canvas 2D operation recording feature, where switching between the recording canvas and the GPU surface canvas failed to preserve the full save/restore nesting, clip stack, and transparency layer state. Replaced the fragile state-copying approach with a state replay mechanism in GraphicsContextSkia that tracks the full sequence of save restore, clip, and transparency layer operations, then reconstructs the exact nesting on the target canvas when flushing a recording.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/307174@main&quot; rel=&quot;external&quot;&gt;Added support&lt;/a&gt; for rendering video buffers provided by Qualcomm hardware-accelerated decoders, with aid from the &lt;a href=&quot;https://registry.khronos.org/OpenGL/extensions/EXT/EXT_YUV_target.txt&quot; rel=&quot;external&quot;&gt;EXT_YUV_target&lt;/a&gt; OpenGL extension.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/307565@main&quot; rel=&quot;external&quot;&gt;Fixed&lt;/a&gt; the font selection issue that the system fallback font cache mixed up different font styles.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases 📦️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Igalia/wpe-android/releases/tag/v0.3.2&quot; rel=&quot;external&quot;&gt;WPE Android 0.3.2&lt;/a&gt; has been released, and prebuilt packages are available &lt;a href=&quot;https://central.sonatype.com/artifact/org.wpewebkit.wpeview/wpeview/&quot; rel=&quot;external&quot;&gt;at the Maven Central repository&lt;/a&gt;. This is a stable maintenance release which updates WPE WebKit to 2.50.5, which is the most recent stable release.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://gitlab.gnome.org/GNOME/libsoup/-/releases/3.6.6&quot; rel=&quot;external&quot;&gt;libsoup 3.6.6&lt;/a&gt; has been released with numerous bug and security fixes.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Announcing Interop 2026</title>
		<link href="https://webkit.org/blog/17818/announcing-interop-2026/"/>
		<id>https://webkit.org/?p=17818</id>
		<updated>2026-02-12T17:00:59+00:00</updated>
		<content type="html">&lt;p&gt;Exciting news for web developers, designers, and browser enthusiasts alike — &lt;a href=&quot;https://wpt.fyi/interop-2026&quot;&gt;Interop 2026&lt;/a&gt; is here, continuing the mission of improving cross-browser interoperability. For the fifth year in a row, we are pleased to collaborate with &lt;a href=&quot;https://web.dev/blog/interop-2026&quot;&gt;Google&lt;/a&gt;, &lt;a href=&quot;https://igalia.com/news/interop-2026.html&quot;&gt;Igalia&lt;/a&gt;, &lt;a href=&quot;https://blogs.windows.com/msedgedev/2026/02/12/microsoft-edge-and-interop-2026/&quot;&gt;Microsoft&lt;/a&gt;, and &lt;a href=&quot;https://hacks.mozilla.org/2026/02/launching-interop-2026/&quot;&gt;Mozilla&lt;/a&gt; to make web technology more consistent and reliable across our browsers.&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;introducing-interop-2026&quot;&gt;&lt;/a&gt;Introducing Interop 2026&lt;/h3&gt;
&lt;p&gt;Making your website work in every browser can be a challenge, especially if browser engines have implemented the same web technology in slightly different ways. The Interop Project tackles this challenge by bringing the major browser engines together to improve the same set of features during the same year. Each feature is judged on whether or not it fully aligns with its official web standard — the formal technical specifications that define how each web technology should work. This helps accelerate progress toward a more reliable, consistent platform to build on.&lt;/p&gt;
&lt;p&gt;Safari has already implemented many of the features included in Interop 2026. In fact, we were the first browser to ship &lt;code&gt;contrast-color()&lt;/code&gt;, Media pseudo-classes, &lt;code&gt;shape()&lt;/code&gt;, and Scoped Custom Element Registries. Plus, we have support for Anchor Positioning, Style Queries, Custom Highlights, Scroll Snap, View Transitions and much more. We’re excited that these technologies are being included as focus areas in Interop 2026, ensuring they get implemented across all browsers and any remaining interoperability gaps are closed.&lt;/p&gt;
&lt;p&gt;We will also be focused on adding support for the following features: advanced &lt;code&gt;attr()&lt;/code&gt;, the &lt;code&gt;getAllRecords()&lt;/code&gt; method for IndexedDB, WebTransport, and the JavaScript Promise Integration API for Wasm. Together, these four areas make up 20% of the Interop 2026 score. They are exciting new features that solve real needs.&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;focus-areas-for-2026&quot;&gt;&lt;/a&gt;Focus Areas for 2026&lt;/h3&gt;
&lt;p&gt;The Interop Project measures interoperability through Web Platform Tests — automated tests that check whether browsers conform to web standards. Interop 2026 is ambitious, covering twenty focus areas. Fifteen are brand new. And five are carryovers from &lt;a href=&quot;https://wpt.fyi/interop-2025&quot;&gt;Interop 2025&lt;/a&gt;.&lt;/p&gt;
&lt;ul class=&quot;interop-index&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#anchor-positioning&quot;&gt;Anchor Positioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#advanced-attr&quot;&gt;Advanced &lt;code&gt;attr()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#container-style-queries&quot;&gt;Container Style Queries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#contrast-color&quot;&gt;&lt;code&gt;contrast-color()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#css-zoom&quot;&gt;CSS Zoom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#custom-highlights&quot;&gt;Custom Highlights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#dialog-and-popover-additions&quot;&gt;Dialog and popover additions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#fetch-uploads-and-ranges&quot;&gt;Fetch Uploads and Ranges&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#getallrecords-for-indexeddb&quot;&gt;&lt;code&gt;getAllRecords()&lt;/code&gt; for IndexedDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#jspi-for-wasm&quot;&gt;JSPI for Wasm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#media-pseudo-classes&quot;&gt;Media pseudo-classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#navigation-api&quot;&gt;Navigation API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#scoped-custom-element-registries&quot;&gt;Scoped Custom Element Registries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#scroll-driven-animations&quot;&gt;Scroll-driven Animations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#scroll-snap&quot;&gt;Scroll Snap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#shape&quot;&gt;&lt;code&gt;shape()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#view-transitions&quot;&gt;View Transitions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#web-compat&quot;&gt;Web Compat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#webrtc&quot;&gt;WebRTC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/feed/#webtransport&quot;&gt;WebTransport&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a name=&quot;anchor-positioning&quot;&gt;&lt;/a&gt;Anchor positioning&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning&quot;&gt;Anchor positioning&lt;/a&gt; is a carryover from Interop 2025, where significant progress was made to empower developers to position elements relative to each other. This year’s focus will be on clarifying the spec, resolving test issues, and increasing the reliability of this powerful layout feature.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;advanced-attr&quot;&gt;&lt;/a&gt;Advanced attr()&lt;/h2&gt;
&lt;p&gt;The CSS &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/attr&quot;&gt;&lt;code&gt;attr()&lt;/code&gt;&lt;/a&gt; function lets you bridge the gap between structural data and visual presentation by pulling values directly from HTML attributes into your CSS, making styles more dynamic and context-aware without the overhead of JavaScript. While &lt;code&gt;attr()&lt;/code&gt; has long been supported for the &lt;code&gt;content&lt;/code&gt; property, advanced &lt;code&gt;attr()&lt;/code&gt; extends it to work across all CSS properties with type conversion — letting you use HTML attribute values as colors, lengths, angles, and other data types. Now that security concerns have been worked through in the specification, browser makers are united in our excitement to ship this long-awaited capability with strong interoperability.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;container-style-queries&quot;&gt;&lt;/a&gt;Container style queries&lt;/h2&gt;
&lt;p&gt;Style queries let you apply styles conditionally, based on the value of a custom property (aka, variable) as defined at a certain container. Similar to how Container size queries let your CSS respond to the size of the container, style queries let it respond to theme values, state flags, and other contextual data.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;@container&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;style&lt;/span&gt;(&lt;span class=&quot;keyword&quot;&gt;--theme&lt;/span&gt;: &lt;span class=&quot;keyword&quot;&gt;dark&lt;/span&gt;) {
  .&lt;span class=&quot;attribute&quot;&gt;card&lt;/span&gt; {
    &lt;span class=&quot;attribute&quot;&gt;background&lt;/span&gt;: &lt;span class=&quot;string&quot;&gt;#1a1a1a&lt;/span&gt;;
    &lt;span class=&quot;attribute&quot;&gt;color&lt;/span&gt;: &lt;span class=&quot;string&quot;&gt;#ffffff&lt;/span&gt;;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Style queries started shipping in recent years, including in Safari 18.0. Interop 2026 will help ensure this powerful tool works consistently everywhere.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;contrast-color&quot;&gt;&lt;/a&gt;contrast-color()&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/contrast-color&quot;&gt;&lt;code&gt;contrast-color()&lt;/code&gt;&lt;/a&gt; function in CSS returns a color — either black or white. It puts the burden on the browser to choose whichever has higher contrast with the color specified in the function.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;keyword builtin&quot;&gt;.button&lt;/span&gt; {
  &lt;span class=&quot;attribute&quot;&gt;background&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;var&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;--brand-color&lt;/span&gt;);
  &lt;span class=&quot;attribute&quot;&gt;color&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;contrast-color&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;var&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;--brand-color&lt;/span&gt;));
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By having the browser make the choice, you can architect your design system in a simpler fashion. You don’t need to manually define every color pairing. Safari and Firefox both shipped support in 2025, and now Interop 2026 will ensure this powerful function works consistently across all browsers.&lt;/p&gt;
&lt;p&gt;Note, &lt;code&gt;contrast-color()&lt;/code&gt; does not magically solve all accessibility concerns. Read about all the details in &lt;a href=&quot;https://webkit.org/blog/16929/contrast-color/&quot;&gt;&lt;em&gt;How to have the browser pick a contrasting color in CSS&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;css-zoom&quot;&gt;&lt;/a&gt;CSS Zoom&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/zoom&quot;&gt;CSS &lt;code&gt;zoom&lt;/code&gt;&lt;/a&gt; property scales an element and its contents, affecting layout and making the element take up more (or less) space. Unlike &lt;code&gt;transform: scale()&lt;/code&gt;, which is purely visual, &lt;code&gt;zoom&lt;/code&gt; changes how the element participates in layout.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;keyword builtin&quot;&gt;.card&lt;/span&gt; {
  &lt;span class=&quot;attribute&quot;&gt;zoom&lt;/span&gt;: &lt;span class=&quot;number&quot;&gt;1.5&lt;/span&gt;; &lt;span class=&quot;comment&quot;&gt;/* Element is 150% larger and takes up more space */&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;While &lt;code&gt;zoom&lt;/code&gt; was supported in browsers for years as a non-standard property, it’s been plagued by inconsistencies in edge cases and how it interacts with other layout features. Now that it’s standardized, CSS zoom returns as a focus area in Interop 2026, continuing from 2025.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;custom-highlights&quot;&gt;&lt;/a&gt;Custom Highlights&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/CSS_Custom_Highlight_API&quot;&gt;CSS Custom Highlight API&lt;/a&gt; lets you style arbitrary text ranges without adding extra elements to the DOM. Using JavaScript, you create a highlight range, then style it with the pseudo-elements.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/::highlight&quot;&gt;&lt;code&gt;::highlight()&lt;/code&gt;&lt;/a&gt; pseudo-element is perfect for highlighting in-page search results, customizing syntax highlighting in code editors, creating an app that allows collaborative editing with user cursors, or any situation where you need to visually mark text without changing the document structure. The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/::target-text&quot;&gt;&lt;code&gt;::target-text&lt;/code&gt;&lt;/a&gt; pseudo-element styles the text that’s scrolled to when a user taps a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Fragment/Text_fragments&quot;&gt;link with a text fragment&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With implementations progressing across browsers, Interop 2026 ensures these highlighting capabilities work consistently, giving you reliable tools for text-based interactions.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;dialog-and-popover-additions&quot;&gt;&lt;/a&gt;Dialog and popover additions&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/dialog&quot;&gt;&lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;&lt;/a&gt; element and &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Popover_API&quot;&gt;popover&lt;/a&gt; attribute have transformed how developers build overlays on the web. Dialog was part of Interop 2022 and Popover was in Interop 2024. This year, three recent enhancements to these features make up this focus area for Interop 2026.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;closedby&lt;/code&gt; attribute lets you control how users can dismiss dialogs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;span class=&quot;keyword&quot;&gt;dialog&lt;/span&gt; &lt;span class=&quot;keyword attribute&quot;&gt;closedby&lt;/span&gt;=&lt;span class=&quot;attribute value string&quot;&gt;&quot;any&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;&amp;lt;!-- Can be closed by clicking outside or pressing Escape --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;span class=&quot;keyword&quot;&gt;dialog&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;popover=&quot;hint&quot;&lt;/code&gt; attribute creates subordinate popovers that don’t dismiss other auto popovers — perfect for tooltips:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;span class=&quot;keyword&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;keyword attribute&quot;&gt;popover&lt;/span&gt;=&lt;span class=&quot;attribute value string&quot;&gt;&quot;hint&quot;&lt;/span&gt; &lt;span class=&quot;keyword attribute&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;attribute value string&quot;&gt;&quot;tooltip&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
  This tooltip won’t close the menu!
&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;span class=&quot;keyword&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;:open&lt;/code&gt; pseudo-class matches elements with open states, working with &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;dialog&lt;/span&gt;&lt;span class=&quot;preprocessor&quot;&gt;:open&lt;/span&gt; {
  &lt;span class=&quot;attribute&quot;&gt;animation&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;slideIn&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;0.3s&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Together, these additions make building accessible, user-friendly UI overlays easier than ever.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;fetch-uploads-and-ranges&quot;&gt;&lt;/a&gt;Fetch uploads and ranges&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Fetch_API&quot;&gt;&lt;code&gt;fetch()&lt;/code&gt;&lt;/a&gt; method is getting three new powerful capabilities for handling uploads and partial content.&lt;/p&gt;
&lt;p&gt;ReadableStream request bodies enable true streaming uploads, letting you upload large files or real-time data without loading everything into memory first:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;identifier&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;fetch&lt;/span&gt;(&lt;span class=&quot;char&quot;&gt;&#x27;/upload&#x27;&lt;/span&gt;, {
  &lt;span class=&quot;identifier&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;char&quot;&gt;&#x27;POST&#x27;&lt;/span&gt;,
  &lt;span class=&quot;identifier&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;readableStream&lt;/span&gt;,
  &lt;span class=&quot;identifier&quot;&gt;duplex&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;char&quot;&gt;&#x27;half&#x27;&lt;/span&gt;
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enhanced &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/FormData&quot;&gt;FormData&lt;/a&gt; support improves multipart uploads and responses.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Range&quot;&gt;Range header&lt;/a&gt; support allows partial content requests, essential for video streaming and resumable downloads:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;identifier&quot;&gt;fetch&lt;/span&gt;(&lt;span class=&quot;char&quot;&gt;&#x27;/video.mp4&#x27;&lt;/span&gt;, {
  &lt;span class=&quot;identifier&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; { &lt;span class=&quot;char&quot;&gt;&#x27;Range&#x27;&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;char&quot;&gt;&#x27;bytes=0-1023&#x27;&lt;/span&gt; }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These enhancements bring &lt;code&gt;fetch()&lt;/code&gt; up to par with more specialized APIs, reducing the need for custom solutions.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;getallrecords-for-indexeddb&quot;&gt;&lt;/a&gt;getAllRecords() for IndexedDB&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/IndexedDB_API&quot;&gt;IndexedDB&lt;/a&gt; is a low-level API that lets you store large amounts of structured data in the browser, including files and blobs. It’s been supported in browsers for &lt;a href=&quot;https://caniuse.com/?search=indexdb&quot;&gt;many years&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now, IndexedDB is getting a significant performance boost with the new &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/IDBObjectStore/getAllRecords&quot;&gt;&lt;code&gt;getAllRecords()&lt;/code&gt;&lt;/a&gt; methods for &lt;code&gt;IDBObjectStore&lt;/code&gt; and &lt;code&gt;IDBIndex&lt;/code&gt;. These methods allow you to retrieve records in batches and in reverse order:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;records&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;objectStore&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;getAllRecords&lt;/span&gt;({
  &lt;span class=&quot;identifier&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;IDBKeyRange&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;bound&lt;/span&gt;(&lt;span class=&quot;char&quot;&gt;&#x27;A&#x27;&lt;/span&gt;, &lt;span class=&quot;char&quot;&gt;&#x27;M&#x27;&lt;/span&gt;),
  &lt;span class=&quot;identifier&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;100&lt;/span&gt;,
  &lt;span class=&quot;identifier&quot;&gt;direction&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;char&quot;&gt;&#x27;prev&#x27;&lt;/span&gt;
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It’s just this new method that’s being included in Interop 2026. The score only reports the percentage of &lt;code&gt;getAllRecords()&lt;/code&gt; tests that are passing  — not all IndexDB tests.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;jspi-for-wasm&quot;&gt;&lt;/a&gt;JSPI for Wasm&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://webassembly.org/&quot;&gt;WebAssembly&lt;/a&gt; has opened the door for running high-performance applications in the browser — games, productivity tools, scientific simulations, and more. But there’s been a fundamental mismatch. Many of these applications were originally written for environments where operations like file I/O or network requests are synchronous (blocking), while the web is fundamentally asynchronous.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://v8.dev/blog/jspi&quot;&gt;JavaScript Promise Integration API (JSPI)&lt;/a&gt; bridges this gap. It lets WebAssembly code that expects synchronous operations work smoothly with JavaScript’s Promise-based async APIs, without requiring you to rewrite the entire application. This means you can port existing C, C++, or Rust applications to the web more easily, unlocking a wider range of software that can run in the browser.&lt;/p&gt;
&lt;p&gt;Interop 2026 will ensure JSPI works consistently across browsers, making WebAssembly a more viable platform for complex applications.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;media-pseudo-classes&quot;&gt;&lt;/a&gt;Media pseudo-classes&lt;/h2&gt;
&lt;p&gt;We’ve proposed media pseudo-classes for inclusion in the Interop Project for many years in a row. We are excited that it’s being included this year!&lt;/p&gt;
&lt;p&gt;Seven CSS pseudo-classes let you apply CSS based on the playback state of &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; elements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:playing&quot;&gt;&lt;code&gt;:playing&lt;/code&gt;&lt;/a&gt; — media is currently playing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:paused&quot;&gt;&lt;code&gt;:paused&lt;/code&gt;&lt;/a&gt; — media is paused&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:seeking&quot;&gt;&lt;code&gt;:seeking&lt;/code&gt;&lt;/a&gt; — user is seeking to a new position&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:buffering&quot;&gt;&lt;code&gt;:buffering&lt;/code&gt;&lt;/a&gt; — media is buffering&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:stalled&quot;&gt;&lt;code&gt;:stalled&lt;/code&gt;&lt;/a&gt; — playback has stalled&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:muted&quot;&gt;&lt;code&gt;:muted&lt;/code&gt;&lt;/a&gt; — audio is muted&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:volume-locked&quot;&gt;&lt;code&gt;:volume-locked&lt;/code&gt;&lt;/a&gt; — volume cannot be changed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These all shipped in Safari many years ago, but without support in any other browser, most developers don’t use them — or even know they exist. Instead developers need JavaScript to sync UI state with media playback state.&lt;/p&gt;
&lt;p&gt;It’s far simpler and more efficient to use media state pseudo-classes in CSS.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;preprocessor&quot;&gt;:buffering&lt;/span&gt;::&lt;span class=&quot;keyword&quot;&gt;after&lt;/span&gt; {
  &lt;span class=&quot;attribute&quot;&gt;content&lt;/span&gt;: &lt;span class=&quot;string&quot;&gt;&quot;Loading...&quot;&lt;/span&gt;;
}
&lt;span class=&quot;keyword&quot;&gt;audio&lt;/span&gt;&lt;span class=&quot;preprocessor&quot;&gt;:muted&lt;/span&gt; {
  &lt;span class=&quot;attribute&quot;&gt;opacity&lt;/span&gt;: &lt;span class=&quot;number&quot;&gt;0.5&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;They are especially powerful combined with &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/:has&quot;&gt;&lt;code&gt;:has()&lt;/code&gt;&lt;/a&gt;, since it unlocks the ability to style anything on the page based on playback state, not just elements that are descendants of the media player.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;preprocessor&quot;&gt;:has&lt;/span&gt;(&lt;span class=&quot;keyword&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;preprocessor&quot;&gt;:playing&lt;/span&gt;) {
  &lt;span class=&quot;attribute&quot;&gt;background-color&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;var&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;--backgroundColor&lt;/span&gt;); 
  &lt;span class=&quot;attribute&quot;&gt;color&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;contrast-color&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;var&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;--backgroundColor&lt;/span&gt;));
  &lt;span class=&quot;attribute&quot;&gt;transition&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;background-color&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;0.5s&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;ease&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Learn more about the power of &lt;code&gt;:has()&lt;/code&gt; in &lt;em&gt;&lt;a href=&quot;https://webkit.org/blog/13096/css-has-pseudo-class/&quot;&gt;Using :has() as a CSS Parent Selector and much more&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;navigation-api&quot;&gt;&lt;/a&gt;Navigation API&lt;/h2&gt;
&lt;p&gt;If you’ve built single-page applications, you may have experienced the pain of managing navigation state with &lt;code&gt;history.pushState()&lt;/code&gt; and &lt;code&gt;popstate&lt;/code&gt; events. &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Navigation_API&quot;&gt;Navigation API&lt;/a&gt; gives you a cleaner, more powerful way to intercept and control navigation.&lt;/p&gt;
&lt;p&gt;This focus area is a continuation of Interop 2025, where significant progress was made to empower developers to initiate, intercept, and modify browser navigation actions. This year continues work on interoperability, to get the overall score up from the 92.3% test pass result during Interop 2025. Plus, there’s one new feature being added — the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/NavigationPrecommitController&quot;&gt;&lt;code&gt;precommitHandler&lt;/code&gt;&lt;/a&gt; option. It lets you defer navigation until critical resources are ready, preventing jarring flashes of incomplete content.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;identifier&quot;&gt;navigation&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;addEventListener&lt;/span&gt;(&lt;span class=&quot;char&quot;&gt;&#x27;navigate&#x27;&lt;/span&gt;, (&lt;span class=&quot;identifier&quot;&gt;e&lt;/span&gt;) &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;gt;&lt;/span&gt; {
  &lt;span class=&quot;identifier&quot;&gt;e&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;intercept&lt;/span&gt;({
    &lt;span class=&quot;identifier&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;precommitHandler&lt;/span&gt;() {
      &lt;span class=&quot;comment&quot;&gt;// Load critical resources before commit
&lt;/span&gt;      &lt;span class=&quot;identifier&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;loadCriticalData&lt;/span&gt;();
    },
    &lt;span class=&quot;identifier&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;handler&lt;/span&gt;() {
      &lt;span class=&quot;comment&quot;&gt;// Render the new view
&lt;/span&gt;      &lt;span class=&quot;identifier&quot;&gt;renderPage&lt;/span&gt;();
    }
  });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Interop 2026 will ensure Navigation API works reliably across browsers, a solid foundation for web applications.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;scoped-custom-element-registries&quot;&gt;&lt;/a&gt;Scoped custom element registries&lt;/h2&gt;
&lt;p&gt;Working with web components, you may have run into a frustrating limitation: the global &lt;code&gt;customElements&lt;/code&gt; registry only allows one definition per tag name across your entire application. When two different libraries both define a &lt;code&gt;&amp;lt;my-button&amp;gt;&lt;/code&gt; component, they conflict.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry&quot;&gt;&lt;code&gt;CustomElementRegistry()&lt;/code&gt;&lt;/a&gt; constructor solves this by letting you create scoped registries. Different parts of your application — or different shadow roots — can have their own definitions for the same tag name.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;registry&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;keyword operator&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;CustomElementRegistry&lt;/span&gt;();
&lt;span class=&quot;identifier&quot;&gt;registry&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;define&lt;/span&gt;(&lt;span class=&quot;char&quot;&gt;&#x27;my-button&#x27;&lt;/span&gt;, &lt;span class=&quot;identifier&quot;&gt;MyButtonV2&lt;/span&gt;);
&lt;span class=&quot;identifier&quot;&gt;shadowRoot&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;registry&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;registry&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is especially valuable for microfrontends, component libraries, and any situation where you’re integrating third-party web components.&lt;/p&gt;
&lt;p&gt;Safari 26.0 was the first &lt;a href=&quot;https://caniuse.com/wf-scoped-custom-element-registries&quot;&gt;browser to ship&lt;/a&gt; Scoped custom element registries. Inclusion in Interop 2026 will help ensure this capability works consistently across all browsers.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;scroll-driven-animations&quot;&gt;&lt;/a&gt;Scroll-driven Animations&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_scroll-driven_animations&quot;&gt;Scroll-driven animations&lt;/a&gt; let you more easily create animations that respond to scroll position, now entirely in CSS. As a user scrolls, the animation progresses — no JavaScript needed. You can build scroll-triggered reveals, progress indicators, parallax effects, and interactive storytelling experiences.&lt;/p&gt;
&lt;p&gt;Define animations with standard CSS keyframes, then connect them to scroll using &lt;code&gt;animation-timeline&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;keyword builtin&quot;&gt;.reveal&lt;/span&gt; {
  &lt;span class=&quot;attribute&quot;&gt;animation&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;fade-in&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;linear&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;forwards&lt;/span&gt;;
  &lt;span class=&quot;attribute&quot;&gt;animation-timeline&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;view&lt;/span&gt;();
  &lt;span class=&quot;attribute&quot;&gt;animation-range&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;entry&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;entry&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;100%&lt;/span&gt;;
}

&lt;span class=&quot;keyword&quot;&gt;@keyframes&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;fade-in&lt;/span&gt; {
  &lt;span class=&quot;attribute&quot;&gt;from&lt;/span&gt; { &lt;span class=&quot;attribute&quot;&gt;opacity&lt;/span&gt;: &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;; }
  &lt;span class=&quot;keyword&quot;&gt;to&lt;/span&gt; { &lt;span class=&quot;attribute&quot;&gt;opacity&lt;/span&gt;: &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use &lt;code&gt;view()&lt;/code&gt; to trigger animations as elements enter and exit the viewport, or &lt;code&gt;scroll()&lt;/code&gt; to tie animations to a scrolling container’s position. Learn much more in &lt;a href=&quot;https://webkit.org/blog/17101/a-guide-to-scroll-driven-animations-with-just-css/&quot;&gt;&lt;em&gt;A guide to Scroll-driven Animations with just CSS&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We shipped support for scroll-driven animations in Safari 26.0. Interop 2026 will help ensure this feature works consistently across all browsers.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;scroll-snap&quot;&gt;&lt;/a&gt;Scroll Snap&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_scroll_snap&quot;&gt;CSS Scroll Snap&lt;/a&gt; controls the panning and scrolling behavior within a scroll container, creating carousel-like experiences:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;keyword builtin&quot;&gt;.carousel&lt;/span&gt; {
  &lt;span class=&quot;attribute&quot;&gt;scroll-snap-type&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;mandatory&lt;/span&gt;;
  &lt;span class=&quot;attribute&quot;&gt;overflow-x&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;scroll&lt;/span&gt;;
}
&lt;span class=&quot;keyword builtin&quot;&gt;.carousel&lt;/span&gt; &amp;gt; * {
  &lt;span class=&quot;attribute&quot;&gt;scroll-snap-align&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;center&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Scroll Snap has been &lt;a href=&quot;https://caniuse.com/css-snappoints&quot;&gt;supported&lt;/a&gt; in all modern browsers for many years. But like many of the older CSS specifications, multiple rounds of changes to the specification while early versions were already shipping in browsers created a deep lack of interoperability. With a far more mature web standard, it’s time to circle back and improve interoperability. This is the power of the Interop Project — focusing all the browser teams on a particular feature, and using automated tests to find inconsistencies and disagreements.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;shape&quot;&gt;&lt;/a&gt;shape()&lt;/h2&gt;
&lt;p&gt;For years, when you wanted to create a complex clipping path to use with &lt;code&gt;clip-path&lt;/code&gt; or &lt;code&gt;shape-outside&lt;/code&gt; you’ve been limited to &lt;code&gt;polygon()&lt;/code&gt;, which only supports straight lines, or SVG paths, which aren’t responsive to element size changes.&lt;/p&gt;
&lt;p&gt;Now, the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/basic-shape/shape&quot;&gt;&lt;code&gt;shape()&lt;/code&gt;&lt;/a&gt; function lets you create complex shapes with path-like commands (&lt;code&gt;move&lt;/code&gt;, &lt;code&gt;line&lt;/code&gt;, &lt;code&gt;curve&lt;/code&gt;). It gives you the best of both worlds — curves like SVG paths, but with percentage-based coordinates that adapt as elements resize.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;keyword builtin&quot;&gt;.element&lt;/span&gt; {
  &lt;span class=&quot;attribute&quot;&gt;clip-path&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;shape&lt;/span&gt;(
    &lt;span class=&quot;identifier&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;0%&lt;/span&gt;,
    &lt;span class=&quot;identifier&quot;&gt;line&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;0%&lt;/span&gt;,
    &lt;span class=&quot;identifier&quot;&gt;line&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;100%&lt;/span&gt;,
    &lt;span class=&quot;identifier&quot;&gt;curve&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;via&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;50%&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;150%&lt;/span&gt;,
    &lt;span class=&quot;identifier&quot;&gt;close&lt;/span&gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We shipped support for the &lt;code&gt;shape()&lt;/code&gt; function in Safari 18.4. And we look forward to Interop 2026 improving browser implementations so you can confidently use it to render of complex, responsive curves.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;view-transitions&quot;&gt;&lt;/a&gt;View transitions&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API&quot;&gt;View Transitions&lt;/a&gt; was a focus area in Interop 2025, narrowly defined to include &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API&quot;&gt;same-document view transitions&lt;/a&gt; and &lt;code&gt;view-transition-class&lt;/code&gt;. These features allow for smooth, animated transitions between UI states within a single page, as well as flexible control over styling those transitions.&lt;/p&gt;
&lt;p&gt;While Safari finished Interop 2025 with a score of 99.2% for view transitions, the overall interoperability score is at 90.8% — so the group decided to continue the effort, carrying over the tests from 2025.&lt;/p&gt;
&lt;p&gt;For Interop 2026, the focus area expands to also include &lt;a href=&quot;https://webkit.org/blog/16967/two-lines-of-cross-document-view-transitions-code-you-can-use-on-every-website-today/&quot;&gt;cross-document view transitions&lt;/a&gt;. This allows you to create smooth, animated transitions in the moments between pages as users navigate your site, rather than an abrupt jump when new page loads. Cross-document view transitions shipped in Safari 18.2. Learn more about it in &lt;a href=&quot;https://webkit.org/blog/16967/two-lines-of-cross-document-view-transitions-code-you-can-use-on-every-website-today/&quot;&gt;&lt;em&gt;Two lines of Cross-Document View Transitions code you can use on every website today&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;web-compat&quot;&gt;&lt;/a&gt;Web Compat&lt;/h2&gt;
&lt;p&gt;Web compatibility refers to whether or not a real world website works correctly in a particular browser. When a site works in one browser, but not another — that’s a “compat” problem. This focus area is made up of a small collection of Web Platform Tests selected because the fact they fail in some browsers causes real websites to not work &lt;em&gt;in other browsers&lt;/em&gt; — thus creating problems for both web developers and users.&lt;/p&gt;
&lt;p&gt;Each time Web Compat has been a focus area as part of the Interop Project, it’s targeted a different set of compat challenges. This year, Interop 2026’s web compatibility work includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tc39.es/ecma262/#cyclic-module-record&quot;&gt;ESM module loading&lt;/a&gt;, ensuring cyclic module records and multiple top-level awaits work consistently.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://html.spec.whatwg.org/#event-loop-processing-model&quot;&gt;Timing of scroll events relative to animation events&lt;/a&gt;, used to make sure scroll and animation events fire in a predictable, interoperable order.&lt;/li&gt;
&lt;li&gt;Support for &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/user-select&quot;&gt;&lt;code&gt;user-select&lt;/code&gt;&lt;/a&gt;, rather than just &lt;code&gt;-webkit-user-select&lt;/code&gt;. It controls whether users can select text. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a name=&quot;webrtc&quot;&gt;&lt;/a&gt;WebRTC&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/WebRTC_API&quot;&gt;WebRTC&lt;/a&gt; (Web Real-Time Communication) enables real-time audio, video, and data communication directly between browsers, without requiring plugins or intermediate servers. You can build video conferencing apps, live streaming platforms, peer-to-peer file sharing, and collaborative tools.&lt;/p&gt;
&lt;p&gt;Having reached a 91.6% pass rate, WebRTC continues as a focus area in 2026, building on the progress made during Interop 2025. We’re looking forward to fixing the long tail of interop issues of the main spec for WebRTC.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;webtransport&quot;&gt;&lt;/a&gt;WebTransport&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/WebTransport_API&quot;&gt;WebTransport&lt;/a&gt; provides a modern way to transmit data between client and server using the HTTP/3 protocol. It gives you low-latency bidirectional communication with multiple streams over a single connection. You get both unreliable datagram support (like UDP) for speed and reliable stream support (like TCP) for guaranteed delivery.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;transport&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;keyword operator&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;WebTransport&lt;/span&gt;(&lt;span class=&quot;char&quot;&gt;&#x27;https://example.com/endpoint&#x27;&lt;/span&gt;);
&lt;span class=&quot;identifier&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;transport&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;ready&lt;/span&gt;;
&lt;span class=&quot;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;stream&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;transport&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;createBidirectionalStream&lt;/span&gt;();
&lt;span class=&quot;comment&quot;&gt;// Stream data efficiently
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;WebTransport is ideal for gaming, real-time collaboration tools, and applications where you need more control than WebSocket provides but don’t want to manage WebRTC’s complexity. Being part of Interop 2026 ensures WebTransport works consistently across all browsers, making it a reliable choice for real-time data transmission.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;investigation-efforts-a-look-ahead&quot;&gt;&lt;/a&gt;Investigation Efforts: A Look Ahead&lt;/h2&gt;
&lt;p&gt;In addition to the focus areas, the Interop Project includes four investigation areas. These are projects where teams gather to assess the current state of testing infrastructure and sort through issues that are blocking progress.&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;accessibility-testing&quot;&gt;&lt;/a&gt;Accessibility testing&lt;/h3&gt;
&lt;p&gt;Continuing from previous years, the Accessibility Testing investigation aims to work towards generating consistent accessibility trees across browsers. This effort will improve the WPT testing infrastructure for accessibility on top of the foundation from Interop 2024. This work ensures that accessibility features are reliable and consistent, helping developers create more inclusive web experiences.&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;jpeg-xl&quot;&gt;&lt;/a&gt;JPEG XL&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://jpegxl.info/&quot;&gt;JPEG XL&lt;/a&gt; is a next-generation raster graphics format that supports animation, alpha transparency, and lossy as well as lossless compression. We shipped support for it in Safari 17.0. This investigation will focus on making the feature properly testable by developing comprehensive test suites, opening up the possibility that JPEG XL could be a focus area in the future.&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;mobile-testing&quot;&gt;&lt;/a&gt;Mobile testing&lt;/h3&gt;
&lt;p&gt;The Mobile Testing investigation continues work started in 2025. This year, we will focus on improving infrastructure for mobile-specific features like dynamic viewport changes which are crucial for building responsive mobile web experience that billions of users rely on every day.&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;webvtt&quot;&gt;&lt;/a&gt;WebVTT&lt;/h3&gt;
&lt;p&gt;Continuing from 2025, the WebVTT investigation addresses a critical challenge facing the web platform. Developers cite WebVTT’s inconsistent behavior across browsers as a major reason for choosing other subtitling and captioning solutions. Our investment in WebVTT last year primarily consisted of validating and fixing the existing test suite, as well as making any necessary spec changes along the way.  We are excited to continue that effort this year to ensure synchronized text tracks and closed captioning work seamlessly across the web.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;a-more-interoperable-web&quot;&gt;&lt;/a&gt;A more interoperable web&lt;/h2&gt;
&lt;p&gt;Interop 2026 brings together twenty focus areas that matter to you as a web developer. Some, like &lt;code&gt;attr()&lt;/code&gt; and &lt;code&gt;contrast-color()&lt;/code&gt;, give you more flexible ways to architect your CSS. Others, like Scroll-Driven Animations and View Transitions, let you create smoother, more engaging experiences without reaching for JavaScript. Features like WebTransport and the Navigation API give you more powerful tools for building modern web applications.&lt;/p&gt;
&lt;p&gt;Just as important are the focus areas working to fix long-standing inconsistencies — ensuring Scroll Snap works reliably, bringing all browsers up to speed on &lt;code&gt;shape()&lt;/code&gt;, and solving real-world compatibility problems that have been frustrating developers and breaking sites.&lt;/p&gt;
&lt;p&gt;The WebKit team is committed to making these features work consistently across all browsers. Whether you’re building a design system, a single-page application, a video streaming platform, or anything in between, Interop 2026 is working to give you a more reliable foundation to build on.&lt;/p&gt;
&lt;p&gt;Here’s to another year of making the web better, together!&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>https://webkit.org</uri>
		</author>
		<source>
			<title type="html">Blog – WebKit</title>
			<subtitle type="html">Open Source Web Browser Engine</subtitle>
			<link rel="self" href="https://webkit.org/blog/feed/"/>
			<id>https://webkit.org/blog/feed/</id>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Release Notes for Safari Technology Preview 237</title>
		<link href="https://webkit.org/blog/17842/release-notes-for-safari-technology-preview-237/"/>
		<id>https://webkit.org/?p=17842</id>
		<updated>2026-02-12T16:59:49+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://webkit.org/blog/6017/introducing-safari-technology-preview/&quot;&gt;Safari Technology Preview&lt;/a&gt; Release 237 is now &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;available for download&lt;/a&gt; for macOS Tahoe and macOS Sequoia. If you already have Safari Technology Preview installed, you can update it in System Settings under General → Software Update.&lt;/p&gt;
&lt;p&gt;This release includes WebKit changes between: &lt;a href=&quot;https://github.com/WebKit/WebKit/compare/aaeffadb0b6313d7188ebc636446532d1d459c2b...caed0239ff1d606ff67879ac662c1ae83c4aec9a&quot;&gt;305774@main&amp;#8230;306595@main&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Accessibility&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed slot elements referenced by &lt;code&gt;aria-labelledby&lt;/code&gt; to correctly use their assigned slotted content for accessible names and ignore hidden slotted nodes. (&lt;a href=&quot;https://commits.webkit.org/305882@main&quot;&gt;305882@main&lt;/a&gt;)  (114500560)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;&amp;lt;meter&amp;gt;&lt;/code&gt; element to have consistent labels between &lt;code&gt;aria-label&lt;/code&gt; and &lt;code&gt;title&lt;/code&gt; attributes. (&lt;a href=&quot;https://commits.webkit.org/305883@main&quot;&gt;305883@main&lt;/a&gt;)  (127460695)&lt;/li&gt;
&lt;li&gt;Fixed elements with &lt;code&gt;display: contents&lt;/code&gt; and content in a shadow root to have their content properly read when referenced by &lt;code&gt;aria-labelledby&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/305918@main&quot;&gt;305918@main&lt;/a&gt;)  (129361833)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;aria-labelledby&lt;/code&gt; to use the checkbox name instead of its value when the checkbox name comes from an associated &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; element. (&lt;a href=&quot;https://commits.webkit.org/305894@main&quot;&gt;305894@main&lt;/a&gt;)  (141564913)&lt;/li&gt;
&lt;li&gt;Fixed grid elements with child rows in a shadow root to properly work with VoiceOver. (&lt;a href=&quot;https://commits.webkit.org/306159@main&quot;&gt;306159@main&lt;/a&gt;)  (153134654)&lt;/li&gt;
&lt;li&gt;Fixed elements with &lt;code&gt;aria-controls&lt;/code&gt; or &lt;code&gt;aria-expanded&lt;/code&gt; and the &lt;code&gt;hidden&lt;/code&gt; attribute to no longer appear in VoiceOver&amp;#8217;s Form Control menu. (&lt;a href=&quot;https://commits.webkit.org/305902@main&quot;&gt;305902@main&lt;/a&gt;)  (162783041)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;::first-letter&lt;/code&gt; text not being exposed in the accessibility tree when no other text accompanies it. (&lt;a href=&quot;https://commits.webkit.org/305884@main&quot;&gt;305884@main&lt;/a&gt;)  (168458291)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CSS&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for the &lt;code&gt;:heading&lt;/code&gt; pseudo-class selector. (&lt;a href=&quot;https://commits.webkit.org/306151@main&quot;&gt;306151@main&lt;/a&gt;)  (158759228)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed CSS rules within &lt;code&gt;@scope&lt;/code&gt; not being applied to &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; elements. (&lt;a href=&quot;https://commits.webkit.org/306129@main&quot;&gt;306129@main&lt;/a&gt;)  (168101378)&lt;/li&gt;
&lt;li&gt;Fixed dynamic &lt;code&gt;flow-tolerance&lt;/code&gt; changes to trigger relayout for &lt;code&gt;display: grid-lanes&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/306093@main&quot;&gt;306093@main&lt;/a&gt;)  (168711707)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;DOM&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;offsetX&lt;/code&gt; and &lt;code&gt;offsetY&lt;/code&gt; for SVG elements to use the outermost SVG as the base for coordinate calculation. (&lt;a href=&quot;https://commits.webkit.org/305993@main&quot;&gt;305993@main&lt;/a&gt;)  (168548585)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;HTML&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for the &lt;code&gt;source&lt;/code&gt; attribute on &lt;code&gt;ToggleEvent&lt;/code&gt; interface. (&lt;a href=&quot;https://commits.webkit.org/306152@main&quot;&gt;306152@main&lt;/a&gt;)  (152580641)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Networking&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;X-Frame-Options&lt;/code&gt; to only strip tab or space characters, not vertical tabs. (&lt;a href=&quot;https://commits.webkit.org/306279@main&quot;&gt;306279@main&lt;/a&gt;)  (126915315)&lt;/li&gt;
&lt;li&gt;Fixed range request validation to properly handle HTTP 416 (Requested Range Not Satisfiable) responses. (&lt;a href=&quot;https://commits.webkit.org/305866@main&quot;&gt;305866@main&lt;/a&gt;)  (168487440)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Rendering&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed table rendering for rowspanned cells and bottom border color. (&lt;a href=&quot;https://commits.webkit.org/306471@main&quot;&gt;306471@main&lt;/a&gt;)  (94163960)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;&amp;lt;marquee&amp;gt;&lt;/code&gt; elements causing incorrect table width calculations. (&lt;a href=&quot;https://commits.webkit.org/306059@main&quot;&gt;306059@main&lt;/a&gt;)  (99826593)&lt;/li&gt;
&lt;li&gt;Fixed table layout to properly handle &lt;code&gt;visibility: collapse&lt;/code&gt; on columns. (&lt;a href=&quot;https://commits.webkit.org/305997@main&quot;&gt;305997@main&lt;/a&gt;)  (168556786)&lt;/li&gt;
&lt;li&gt;Fixed intrinsic sizing for absolutely positioned replaced elements. (&lt;a href=&quot;https://commits.webkit.org/306309@main&quot;&gt;306309@main&lt;/a&gt;)  (168815514)&lt;/li&gt;
&lt;li&gt;Fixed percentage padding in table cells to resolve against column widths. (&lt;a href=&quot;https://commits.webkit.org/306281@main&quot;&gt;306281@main&lt;/a&gt;)  (168940907)&lt;/li&gt;
&lt;li&gt;Fixed table height distribution to apply to tbody sections instead of only the first section. (&lt;a href=&quot;https://commits.webkit.org/306457@main&quot;&gt;306457@main&lt;/a&gt;)  (169154677)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SVG&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for the &lt;code&gt;color-interpolation&lt;/code&gt; attribute for SVG gradients. (&lt;a href=&quot;https://commits.webkit.org/305921@main&quot;&gt;305921@main&lt;/a&gt;)  (87294645)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;:visited&lt;/code&gt; link color to properly propagate to SVG through &lt;code&gt;currentColor&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/306387@main&quot;&gt;306387@main&lt;/a&gt;)  (98776770)&lt;/li&gt;
&lt;li&gt;Fixed removing an item from &lt;code&gt;SVGTransformList&lt;/code&gt; to properly allow attribute removal. (&lt;a href=&quot;https://commits.webkit.org/306162@main&quot;&gt;306162@main&lt;/a&gt;)  (117840533)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web API&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for async iteration over &lt;code&gt;ReadableStream&lt;/code&gt; objects using &lt;code&gt;for await...of&lt;/code&gt; loops. (&lt;a href=&quot;https://commits.webkit.org/305808@main&quot;&gt;305808@main&lt;/a&gt;)  (168049382)&lt;/li&gt;
&lt;li&gt;Added support for the Service Worker static routing Resource Timing API. (&lt;a href=&quot;https://commits.webkit.org/306006@main&quot;&gt;306006@main&lt;/a&gt;)  (168499249)&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;srgb-linear&lt;/code&gt; and &lt;code&gt;display-p3-linear&lt;/code&gt; to &lt;code&gt;PredefinedColorSpace&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/306563@main&quot;&gt;306563@main&lt;/a&gt;)  (169340732)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed Content Security Policy to only recognize ASCII whitespace excluding vertical tabs to align with the specification. (&lt;a href=&quot;https://commits.webkit.org/306222@main&quot;&gt;306222@main&lt;/a&gt;)  (108559413)&lt;/li&gt;
&lt;li&gt;Fixed emoji input on Google Docs and similar web applications by supressing keypress events for supplementary characters. (&lt;a href=&quot;https://commits.webkit.org/305914@main&quot;&gt;305914@main&lt;/a&gt;)  (122678873)&lt;/li&gt;
&lt;li&gt;Fixed an issue where selecting credentials in the Digital Credentials API sometimes required a second click to trigger verification. (&lt;a href=&quot;https://commits.webkit.org/305868@main&quot;&gt;305868@main&lt;/a&gt;)  (163295172)&lt;/li&gt;
&lt;li&gt;Fixed window bar visibility properties (&lt;code&gt;toolbar.visible&lt;/code&gt;, &lt;code&gt;statusbar.visible&lt;/code&gt;, &lt;code&gt;menubar.visible&lt;/code&gt;) to return static values per the HTML specification for privacy and interoperability. (&lt;a href=&quot;https://commits.webkit.org/306391@main&quot;&gt;306391@main&lt;/a&gt;)  (166554327)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;layerX&lt;/code&gt; and &lt;code&gt;layerY&lt;/code&gt; to return correct values with CSS transforms. (&lt;a href=&quot;https://commits.webkit.org/306300@main&quot;&gt;306300@main&lt;/a&gt;)  (168968832)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web Authentication&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue in Safari Technology Preview where WebAuthn authentication over NFC failed. (&lt;a href=&quot;https://commits.webkit.org/306280@main&quot;&gt;306280@main&lt;/a&gt;)  (168456474)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web Extensions&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for &lt;code&gt;runtime.getDocumentId()&lt;/code&gt; web extension API. (&lt;a href=&quot;https://commits.webkit.org/305912@main&quot;&gt;305912@main&lt;/a&gt;)  (168060269)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web Inspector&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support to show each individual request when there are redirects in the Network tab. (&lt;a href=&quot;https://commits.webkit.org/306537@main&quot;&gt;306537@main&lt;/a&gt;)  (152606018)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where a large number of search results in the Search tab would freeze Web Inspector. (&lt;a href=&quot;https://commits.webkit.org/306429@main&quot;&gt;306429@main&lt;/a&gt;)  (49234522)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebRTC&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for the &lt;code&gt;targetLatency&lt;/code&gt; attribute in WebRTC. (&lt;a href=&quot;https://commits.webkit.org/306062@main&quot;&gt;306062@main&lt;/a&gt;)  (168225793)&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>https://webkit.org</uri>
		</author>
		<source>
			<title type="html">Blog – WebKit</title>
			<subtitle type="html">Open Source Web Browser Engine</subtitle>
			<link rel="self" href="https://webkit.org/blog/feed/"/>
			<id>https://webkit.org/blog/feed/</id>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">WebKit features for Safari 26.3</title>
		<link href="https://webkit.org/blog/17798/webkit-features-for-safari-26-3/"/>
		<id>https://webkit.org/?p=17798</id>
		<updated>2026-02-11T18:00:49+00:00</updated>
		<content type="html">&lt;p&gt;Safari 26.3 is here, with practical improvements for performance and user experience. This release gives you new tools for optimizing how your content is delivered and better control over navigation in single-page applications. We’ve also fixed issues developers have run into with anchor positioning, multi-column layouts, and other features — making them more robust and reliable. Plus, we’ve refined the everyday browsing experience by fixing issues we found while testing real websites.&lt;/p&gt;
&lt;h3&gt;Video in visionOS&lt;/h3&gt;
&lt;p&gt;Now in Safari 26.3 in visionOS, fullscreen video playback automatically dims the user’s surroundings to help put the focus on content.&lt;/p&gt;
&lt;figure&gt;&lt;img alt=&quot;A floating rectangular image of a dog running at a dog show, covered by the site &amp;quot;The Ultimate Spectacular&amp;quot;. This rectangle is floating in a world covered by sandy hills, with mountains in the background, and a big cloudy sky above. This is a 3D environment in visionOS. The image is a video that&amp;#039;s full brightness, while the environment around it is not as bright as normal. It&amp;#039;s dimmed.&quot; class=&quot;aligncenter size-full wp-image-17799 preserve-color&quot; height=&quot;1080&quot; src=&quot;https://webkit.org/wp-content/uploads/world_around_video_dimmed_Safari263_visionOS.png&quot; width=&quot;1920&quot; /&gt;&lt;figcaption&gt;Now when a user plays a video in Safari (like &lt;a href=&quot;https://www.youtube.com/watch?v=Z6wnDWzhaDA&quot;&gt;this trailer&lt;/a&gt; on YouTube for &lt;a href=&quot;https://tv.apple.com/us/show/top-dogs/umc.cmc.6snqtei46tkkch7odsnoq9nac&quot;&gt;&lt;i&gt;Top Dogs&lt;/i&gt;&lt;/a&gt;) and enters fullscreen, the world around the video is dimmed in visionOS 26.3.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Zstandard&lt;/h2&gt;
&lt;p&gt;Safari 26.3 supports Zstandard (Zstd), a compression algorithm you can use to make your website’s files smaller before sending them to browsers. Like gzip and Brotli, it compresses text-based assets — HTML, CSS, JavaScript, JSON, and SVG — so less data travels over the network.&lt;/p&gt;
&lt;p&gt;Zstandard decompresses quickly, reducing the workload on users’ devices. It also compresses fast enough to do on-the-fly, whereas Brotli is typically pre-compressed during your build process.&lt;/p&gt;
&lt;p&gt;To use it, configure your server to compress responses with Zstandard and send the &lt;code&gt;Content-Encoding: zstd&lt;/code&gt; header. Servers will automatically fall back to other compression methods for browsers that don’t have support yet.&lt;/p&gt;
&lt;p&gt;Zstandard support is available in Safari 26.3 on iOS 26.3, iPadOS 26.3, visionOS 26.3, and macOS Tahoe 26.3 — and not in Safari 26.3 on earlier versions of macOS. This is because support comes from the system networking stack used by Safari.&lt;/p&gt;
&lt;h2&gt;Navigation API&lt;/h2&gt;
&lt;p&gt;When building single-page applications with the Navigation API, you might need a reliable way to cancel ongoing work when a navigation gets interrupted. Maybe the user clicked another link before the previous navigation finished, they hit the back button, or your code called &lt;code&gt;navigation.navigate()&lt;/code&gt; again. Whatever the reason, you don’t want to keep processing a navigation that&amp;#8217;s no longer relevant.&lt;/p&gt;
&lt;p&gt;In Safari 26.3, the Navigation API exposes a &lt;code&gt;AbortSignal&lt;/code&gt; on &lt;code&gt;NavigateEvent&lt;/code&gt; which triggers when the navigation is aborted, giving you a standard way to clean up and cancel work:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;identifier&quot;&gt;navigation&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;addEventListener&lt;/span&gt;(&lt;span class=&quot;char&quot;&gt;&#x27;navigate&#x27;&lt;/span&gt;, (&lt;span class=&quot;identifier&quot;&gt;event&lt;/span&gt;) &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;&amp;gt;&lt;/span&gt; {
  &lt;span class=&quot;identifier&quot;&gt;event&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;intercept&lt;/span&gt;({
    &lt;span class=&quot;identifier&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;handler&lt;/span&gt;() {
      &lt;span class=&quot;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;fetch&lt;/span&gt;(&lt;span class=&quot;char&quot;&gt;&#x27;/api/data&#x27;&lt;/span&gt;, {
        &lt;span class=&quot;identifier&quot;&gt;signal&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;event&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;signal&lt;/span&gt;  &lt;span class=&quot;comment&quot;&gt;// Automatically cancels if navigation is aborted
&lt;/span&gt;      });

      &lt;span class=&quot;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;response&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;json&lt;/span&gt;();
      &lt;span class=&quot;identifier&quot;&gt;renderContent&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;data&lt;/span&gt;);
    }
  });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the user navigates away before the fetch completes, the request automatically cancels. You can also listen to the signal’s &lt;code&gt;abort&lt;/code&gt; event to clean up other resources like timers or animations.&lt;/p&gt;
&lt;p&gt;This gives you fine-grained control over what happens when navigations don’t complete, helping you avoid memory leaks and unnecessary work.&lt;/p&gt;
&lt;h2&gt;Bug fixes and more&lt;/h2&gt;
&lt;p&gt;Along with the new features, WebKit for Safari 26.3 includes additional improvements to existing features.&lt;/p&gt;
&lt;h3&gt;CSS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a style resolution loop that occurred when a &lt;code&gt;position-try&lt;/code&gt; box was inside a &lt;code&gt;display: none&lt;/code&gt; ancestor. (163691885)&lt;/li&gt;
&lt;li&gt;Fixed an issue where anchor-positioned elements repeatedly transitioning from &lt;code&gt;display: block&lt;/code&gt; to &lt;code&gt;display: none&lt;/code&gt; cause position jumps during animation. (163862003)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;fixed&lt;/code&gt;-positioned boxes using &lt;code&gt;position-area&lt;/code&gt; were incorrectly included in the scrollable containing block calculation. (164017310)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;text-decoration: underline&lt;/code&gt; was rendered too high when &lt;code&gt;text-box-trim&lt;/code&gt; was applied to the root inline box. (165945326)&lt;/li&gt;
&lt;li&gt;Fixed a multi-column layout issue where the &lt;code&gt;widows&lt;/code&gt; and &lt;code&gt;text-indent&lt;/code&gt; properties are applied cause an incorrect indent on the portion of the paragraph that flows into the next column. (165945497)&lt;/li&gt;
&lt;li&gt;Fixed an issue where CSS cursors like &lt;code&gt;move&lt;/code&gt;, &lt;code&gt;all-scroll&lt;/code&gt;, &lt;code&gt;ew-resize&lt;/code&gt;, and &lt;code&gt;ns-resize&lt;/code&gt; did not display correctly. (166731882)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;DOM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed incorrect timestamp handling and switched to use the raw touch timestamp. (164262652)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Media&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where the fullscreen button in visionOS inline video controls did not visually indicate interactivity by extending the glow effect to all &lt;code&gt;button.circular&lt;/code&gt; elements. (164259201)&lt;/li&gt;
&lt;li&gt;Fixed Video Viewer mode for &lt;code&gt;iframe&lt;/code&gt; videos on macOS. (164484608)&lt;/li&gt;
&lt;li&gt;Fixed an issue where Safari could not play live videos when the &lt;code&gt;sourceBuffer&lt;/code&gt; content is removed and re-added causing the seek to not complete. (165628836)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Rendering&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where positioned or transformed &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; elements containing HDR JPEGs with gain maps would incorrectly render as SDR. (163517157)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Safe Browsing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a bug where if Safe Browsing queried for an entry on the Public Suffix List, and a Safe Browsing vendor responded that the whole effective TLD was unsafe, the whole site would be marked as unsafe. (168155375)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;We love hearing from you. To share your thoughts, find us online: Jen Simmons on &lt;a href=&quot;https://bsky.app/profile/jensimmons.bsky.social&quot;&gt;Bluesky&lt;/a&gt; / &lt;a href=&quot;https://front-end.social/@jensimmons&quot;&gt;Mastodon&lt;/a&gt;, Saron Yitbarek on &lt;a href=&quot;https://bsky.app/profile/saron.bsky.social&quot;&gt;BlueSky&lt;/a&gt; / &lt;a href=&quot;https://front-end.social/@saron&quot;&gt;Mastodon&lt;/a&gt;, and Jon Davis on &lt;a href=&quot;https://bsky.app/profile/jondavis.bsky.social&quot;&gt;Bluesky&lt;/a&gt; / &lt;a href=&quot;https://mastodon.social/@jondavis&quot;&gt;Mastodon&lt;/a&gt;. You can follow WebKit &lt;a href=&quot;https://www.linkedin.com/in/apple-webkit/&quot;&gt;on LinkedIn&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you run into any issues, we welcome your &lt;a href=&quot;https://bugs.webkit.org/&quot;&gt;bug report&lt;/a&gt;. Filing issues really does make a difference.&lt;/p&gt;
&lt;p&gt;You can also find this information in the &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/&quot;&gt;Safari release notes&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>https://webkit.org</uri>
		</author>
		<source>
			<title type="html">Blog – WebKit</title>
			<subtitle type="html">Open Source Web Browser Engine</subtitle>
			<link rel="self" href="https://webkit.org/blog/feed/"/>
			<id>https://webkit.org/blog/feed/</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #56</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-56/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-56/</id>
		<updated>2026-02-09T23:21:30+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from February 2 to February 9.&lt;/p&gt;
&lt;p&gt;
The main event this week was FOSDEM (pun intended), which included
presentations related to WebKit; but also we got a batch of stable
and development releases, asynchronous scrolling work, OpenGL
logging, cleanups, and improving the inspector for the WPE work.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics 🖼️&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;While asynchronous scrolling for mouse wheel events was already supported,
scrollbar layers were still being painted on the main thread. This has been
&lt;a href=&quot;https://commits.webkit.org/306838@main&quot; rel=&quot;external&quot;&gt;changed&lt;/a&gt; to paint scrollbars on the
scrolling thread instead, which avoids scrollbars to “lag” behind scrolled
content.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/306987@main&quot; rel=&quot;external&quot;&gt;Fixed&lt;/a&gt; flickering caused by the
combination of damage tracking and asynchronous scrolling for mouse wheel
events.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;It is now possible to &lt;a href=&quot;https://commits.webkit.org/306778@main&quot; rel=&quot;external&quot;&gt;enable debug logging for OpenGL
contexts&lt;/a&gt; using the new &lt;code&gt;GLContext&lt;/code&gt; log
channel, which takes advantage of the message events produced by the
&lt;a href=&quot;https://wikis.khronos.org/opengl/Debug_Output&quot; rel=&quot;external&quot;&gt;widespread KHR_debug
extension&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Figuring out the exact location inside WebKit that triggered an OpenGL issue
may still be challenging with this aid, and therefore &lt;a href=&quot;https://commits.webkit.org/306862@main&quot; rel=&quot;external&quot;&gt;a backtrace will be
appended&lt;/a&gt; in case of errors to help
pinpoint the source, when the log channel is enabled at the “debug” level with
&lt;code&gt;GLContext=debug&lt;/code&gt;.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Configuring the build with &lt;code&gt;USE_SKIA=OFF&lt;/code&gt; to make WebKit use the
&lt;a href=&quot;https://cairographics.org/&quot; rel=&quot;external&quot;&gt;Cairo&lt;/a&gt; graphics library &lt;a href=&quot;https://commits.webkit.org/306343@main&quot; rel=&quot;external&quot;&gt;is no longer
supported&lt;/a&gt;. Using
&lt;a href=&quot;https://skia.org&quot; rel=&quot;external&quot;&gt;Skia&lt;/a&gt; has been the default &lt;a href=&quot;https://blogs.igalia.com/carlosgc/2024/09/27/graphics-improvements-in-webkitgtk-and-wpewebkit-2-46/&quot; rel=&quot;external&quot;&gt;since  late
2024&lt;/a&gt;,
and after two full years the 2.54.0 release (due in September 2026)
will be the first one where the choice is no longer possible.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;webkitgtk-desktop&quot;&gt;WebKitGTK 🖥️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The “on demand” hardware acceleration policy has been rarely used lately, and
thus support for it has been &lt;a href=&quot;https://commits.webkit.org/306855@main&quot; rel=&quot;external&quot;&gt;removed&lt;/a&gt;.
Note that this affects only the GTK port when built with GTK 3—the option never
existed when using GTK 4.&lt;/p&gt;
&lt;p&gt;Existing GTK 3 applications that use
&lt;code&gt;WEBKIT_HARDWARE_ACCELERATION_POLICY_ON_DEMAND&lt;/code&gt; will continue to work and do
&lt;strong&gt;not&lt;/strong&gt; need rebuilding: they will be promoted to use the “always enabled” policy
starting with WebKitGTK 2.54.0 (due in September 2026).&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit 📟&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The Web Inspector &lt;a href=&quot;https://commits.webkit.org/306914@main&quot; rel=&quot;external&quot;&gt;has received
support&lt;/a&gt; for saving data to local
files, allowing things such as saving page resources or exporting the network
session to a &lt;a href=&quot;https://en.wikipedia.org/wiki/HAR_(file_format)&quot; rel=&quot;external&quot;&gt;HAR archive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that using the Web Inspector locally is supported when using the
WPEPlatform API, and the keyboard shortcut &lt;kbd title=&quot;Control + Shift + I&quot;&gt;Ctrl+Shift+I&lt;/kbd&gt; may be used to bring it up.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases 📦️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://webkitgtk.org/2026/02/09/webkitgtk2.50.5-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK
2.50.5&lt;/a&gt; and
&lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.50.5.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.50.5&lt;/a&gt; have
been released. These are stable maintenance releases that improves stability,
correct bugs, and fixes small rendering issues.&lt;/p&gt;
&lt;p&gt;The second release candidates for the upcoming stable branch, &lt;a href=&quot;https://webkitgtk.org/2026/02/06/webkitgtk2.51.91-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK
2.51.91&lt;/a&gt; and
&lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.51.91.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.51.91&lt;/a&gt;,
have been published as well. Those using those to preview the upcoming 2.52.x
series are encouraged to provide &lt;a href=&quot;https://bugs.webkit.org/&quot; rel=&quot;external&quot;&gt;bug reports in
Bugzilla&lt;/a&gt; for any issue they may experience.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;community-events-handshake&quot;&gt;Community &amp;amp; Events 🤝&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;We have published a &lt;a href=&quot;https://blogs.igalia.com/compilers/2026/02/02/implementing-the-temporal-proposal-in-javascriptcore/&quot; rel=&quot;external&quot;&gt;blog
post&lt;/a&gt;
on our work implementing the
&lt;a href=&quot;https://tc39.es/proposal-temporal/docs/&quot; rel=&quot;external&quot;&gt;Temporal&lt;/a&gt; proposal in JavaScriptCore,
WebKit&#x27;s JavaScript engine.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;This year&#x27;s edition of &lt;a href=&quot;https://fosdem.org/2026/&quot; rel=&quot;external&quot;&gt;FOSDEM&lt;/a&gt; took place in
Brussels between January 31st and February 1st, and featured a number of
sessions related to WebKitGTK and WPE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fosdem.org/2026/schedule/event/8ZL9BZ-web-platform-on-linux-devices-with-webkit/&quot; rel=&quot;external&quot;&gt;The Web Platform on Linux devices with WebKit: where are we
now?&lt;/a&gt;,
by Mario Sánchez, is a good introduction-level talk about the GTK and WPE
WebKit ports.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fosdem.org/2026/schedule/event/KMMLGM-webrtc_support_in_webkitgtk_and_wpewebkit_with_gstreamer_current_status_and_plan/&quot; rel=&quot;external&quot;&gt;WebRTC support in WebKitGTK and WPEWebKit with GStreamer: Current status and
plans&lt;/a&gt;
by Philippe Normand. Exactly what it says on the tin.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fosdem.org/2026/schedule/event/NJM3KB-mathml-core/&quot; rel=&quot;external&quot;&gt;Interop and MathML
Core&lt;/a&gt; by Eri
Pazos, about the ongoing effort to improve how different Web engines handle
MathML—including WebKit!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The videos for the talks are already available, too.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Interop 2025: A year of convergence</title>
		<link href="https://webkit.org/blog/17808/interop-2025-review/"/>
		<id>https://webkit.org/?p=17808</id>
		<updated>2026-02-06T17:45:28+00:00</updated>
		<content type="html">&lt;p&gt;Interop 2025 has come to a close, and the results speak for themselves. Now in its fourth year, the Interop project brings together Apple, Bocoup, Google, Igalia, Microsoft, and Mozilla to identify the areas of the web platform where interoperability matters most to you as a web developer — and then do the work to get there. This year was the most ambitious yet: the group selected 19 focus areas and 5 investigation areas spanning CSS, JavaScript, Web APIs, and performance. At the start of 2025, only 29% of the selected tests passed across all browsers. By the end of the year, the Interop score reached a 97% pass rate — and all four experimental browsers (Chrome Canary, Edge Dev, Firefox Nightly, and Safari Technology Preview) reached 99%.&lt;/p&gt;
&lt;figure class=&quot;preserve-color mattewhite&quot;&gt;&lt;img alt=&quot;Interop 2025 end of year results. Chrome Canary, Edge Dev, Firefox Nightly, and Safari Technology Preview all have a score of 99%. The overall interop score is 97%. &quot; class=&quot;aligncenter size-full wp-image-17812&quot; height=&quot;1146&quot; src=&quot;https://webkit.org/wp-content/uploads/Interop-2025-experimental-scores.png&quot; width=&quot;1116&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;Each year, the Interop project chooses its focus areas through a collaborative process with proposals, research into what web developers need, and debates about priorities. For Interop 2025, our team advocated for including focus areas that we knew would require significant engineering investment from WebKit — because we knew those areas would make a real difference to you. The results show that commitment paid off. Safari made the largest jump of any browser this year, climbing from 43 to 99.&lt;/p&gt;
&lt;p&gt;As always, this year’s focus areas were chosen based on developer feedback, including results from the State of CSS survey, and we’re proud of how much ground we covered. The 19 focus areas touched nearly every corner of the platform. On the CSS and UI side, the project tackled &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning&quot;&gt;Anchor Positioning&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API&quot;&gt;View Transitions&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/@scope&quot;&gt;&lt;code&gt;@scope&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter&quot;&gt;&lt;code&gt;backdrop-filter&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/text-decoration&quot;&gt;&lt;code&gt;text-decoration&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_writing_modes&quot;&gt;Writing modes&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout&quot;&gt;Layout&lt;/a&gt; (both Flexbox and Grid, continued from prior years),  and the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details&quot;&gt;&lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; element&lt;/a&gt;. For APIs and platform features, we worked on the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API&quot;&gt;Navigation API&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API&quot;&gt;Storage Access API&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/URLPattern&quot;&gt;&lt;code&gt;URLPattern&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules&quot;&gt;Modules&lt;/a&gt;, the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollend_event&quot;&gt;&lt;code&gt;scrollend&lt;/code&gt; event&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API&quot;&gt;WebRTC&lt;/a&gt;, and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/WebAssembly&quot;&gt;WebAssembly&lt;/a&gt;. And on the health and compatibility front, there was focused work on &lt;a href=&quot;https://web.dev/articles/vitals&quot;&gt;Core Web Vitals&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events&quot;&gt;Pointer and Mouse events&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/MutationEvent&quot;&gt;removing Mutation events&lt;/a&gt;, and general &lt;a href=&quot;https://wpt.fyi/interop-2025&quot;&gt;web compatibility&lt;/a&gt;. Five investigation areas — accessibility testing, Gamepad API testing, mobile testing, privacy testing, and WebVTT — laid groundwork for future Interop cycles.&lt;/p&gt;
&lt;p&gt;We want to highlight three focus areas that were especially meaningful this year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning&quot;&gt;Anchor positioning&lt;/a&gt; lets you position popovers, tooltips, and menus relative to any element purely in CSS — no JavaScript positioning libraries required. It’s one of the most requested CSS features of the last several years, and it now works interoperably across all browsers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API&quot;&gt;Same-document View Transitions&lt;/a&gt; allow smooth, animated transitions between UI states natively in the browser, along with the new &lt;code&gt;view-transition-class&lt;/code&gt; CSS property for flexible styling of those transitions. We shipped support in fall 2024, in &lt;a href=&quot;https://webkit.org/blog/15865/webkit-features-in-safari-18-0/&quot;&gt;Safari 18.0&lt;/a&gt; and &lt;a href=&quot;https://webkit.org/blog/16301/webkit-features-in-safari-18-2/&quot;&gt;Safari 18.2&lt;/a&gt;. Web developers are excited about View Transitions! This extra attention on interoperability across browsers means it’s ready for you to use. &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API&quot;&gt;Navigation API&lt;/a&gt; — a modern replacement for &lt;code&gt;history.pushState()&lt;/code&gt; — gives single-page applications proper navigation handling with interception, traversal, and entries. We shipped support in &lt;a href=&quot;https://webkit.org/blog/17640/webkit-features-for-safari-26-2/&quot;&gt;Safari 26.2&lt;/a&gt;, and we’re glad to see it arrive interoperably from the start.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;preserve-color mattewhite&quot;&gt;&lt;img alt=&quot;The graphs of scores across the year. A black line shows the overall interoperability rising from around 30% in January to 97% at the end. A blue line representing Safari&amp;#039;s progress rises from 43% to be the best score at the top in December, almost at 100%. Orange representing Firefox starts just above Safari, and also follows a similar trajectory across the year. Edge and Chrome have kind of flat progress, starting around 80 and converging with all the other lines at the top at the end.&quot; class=&quot;aligncenter size-full wp-image-17813&quot; height=&quot;770&quot; src=&quot;https://webkit.org/wp-content/uploads/Interop-2025-progress-graph.png&quot; width=&quot;1218&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;The graph above tells the story of the year: every browser engine invested heavily, and the lines converge at the top. That convergence is what makes the Interop project so valuable — the shared progress that means you can write code once and trust that it works everywhere.&lt;/p&gt;
&lt;p&gt;We want to thank our colleagues across the industry who made this possible. Interoperability is one of the foundational strengths of the web, and we remain committed to this collaboration. You can explore the full results, including scores for each individual focus area, on the &lt;a href=&quot;https://wpt.fyi/interop-2025&quot;&gt;Interop 2025 dashboard&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>https://webkit.org</uri>
		</author>
		<source>
			<title type="html">Blog – WebKit</title>
			<subtitle type="html">Open Source Web Browser Engine</subtitle>
			<link rel="self" href="https://webkit.org/blog/feed/"/>
			<id>https://webkit.org/blog/feed/</id>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Release Notes for Safari Technology Preview 236</title>
		<link href="https://webkit.org/blog/17791/release-notes-for-safari-technology-preview-236/"/>
		<id>https://webkit.org/?p=17791</id>
		<updated>2026-02-03T00:08:11+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://webkit.org/blog/6017/introducing-safari-technology-preview/&quot;&gt;Safari Technology Preview&lt;/a&gt; Release 236 is now &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;available for download&lt;/a&gt; for macOS Tahoe and macOS Sequoia. If you already have Safari Technology Preview installed, you can update it in System Settings under General → Software Update.&lt;/p&gt;
&lt;p&gt;This release includes WebKit changes between: &lt;a href=&quot;https://github.com/WebKit/WebKit/compare/49f002f9b2e10a1e7271d2cc9c4fd253257e42e9...bf61e7bd613b04b3648cac72b6197056c0094de2&quot;&gt;305084@main&amp;#8230;305413@main&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;CSS&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed handling of padding and margins for flex and grid layouts across all writing modes. (&lt;a href=&quot;https://commits.webkit.org/301814@main&quot;&gt;301814@main&lt;/a&gt;)  (71046552)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;text-combine-upright&lt;/code&gt; to properly ignore &lt;code&gt;letter-spacing&lt;/code&gt; when composing text horizontally, aligning with the CSS Writing Modes specification. (&lt;a href=&quot;https://commits.webkit.org/305116@main&quot;&gt;305116@main&lt;/a&gt;)  (116562622)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;background-blend-mode&lt;/code&gt; was not applied correctly when combined with &lt;code&gt;background-clip: text&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/305118@main&quot;&gt;305118@main&lt;/a&gt;)  (120901898)&lt;/li&gt;
&lt;li&gt;Fixed an issue where CSS &lt;code&gt;@starting-style&lt;/code&gt; entry animations were only applied on the first transition, especially when interacting with anchor positioning or position fallbacks. (&lt;a href=&quot;https://commits.webkit.org/305371@main&quot;&gt;305371@main&lt;/a&gt;)  (163928932)&lt;/li&gt;
&lt;li&gt;Fixed table column width distribution when a &lt;code&gt;colspan&lt;/code&gt; spans mixed percentage and auto-width columns to properly respect percentage constraints. (&lt;a href=&quot;https://commits.webkit.org/305120@main&quot;&gt;305120@main&lt;/a&gt;)  (165561401)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;shape-outside&lt;/code&gt; did not update correctly after web fonts loaded. (&lt;a href=&quot;https://commits.webkit.org/305299@main&quot;&gt;305299@main&lt;/a&gt;)  (166336491)&lt;/li&gt;
&lt;li&gt;Fixed table height calculation to correctly account for captions with orthogonal &lt;code&gt;writing-mode&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/305110@main&quot;&gt;305110@main&lt;/a&gt;)  (167220730)&lt;/li&gt;
&lt;li&gt;Fixed an issue where grid-lanes items incorrectly used a grid area as their containing block in the stacking axis, ensuring proper sizing for cases like &lt;code&gt;fit-content&lt;/code&gt; and percentage-based dimensions. (&lt;a href=&quot;https://commits.webkit.org/305319@main&quot;&gt;305319@main&lt;/a&gt;)  (167221488)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;counter-*&lt;/code&gt; properties serialization order. (&lt;a href=&quot;https://commits.webkit.org/305086@main&quot;&gt;305086@main&lt;/a&gt;)  (167518994)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;outline-width&lt;/code&gt; and &lt;code&gt;outline-offset&lt;/code&gt; to follow updated computed style resolution rules. (&lt;a href=&quot;https://commits.webkit.org/305153@main&quot;&gt;305153@main&lt;/a&gt;)  (167618367)&lt;/li&gt;
&lt;li&gt;Fixed the computed style resolution for &lt;code&gt;border-*-width&lt;/code&gt; properties. (&lt;a href=&quot;https://commits.webkit.org/305212@main&quot;&gt;305212@main&lt;/a&gt;)  (167689519)&lt;/li&gt;
&lt;li&gt;Fixed the computed style resolution for the &lt;code&gt;column-rule-width&lt;/code&gt; property. (&lt;a href=&quot;https://commits.webkit.org/305240@main&quot;&gt;305240@main&lt;/a&gt;)  (167725940)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;border-*-width&lt;/code&gt;, &lt;code&gt;outline-width&lt;/code&gt;, and &lt;code&gt;column-rule-width&lt;/code&gt; so they now pixel snap correctly during CSS animations and transitions. (&lt;a href=&quot;https://commits.webkit.org/305272@main&quot;&gt;305272@main&lt;/a&gt;)  (167763497)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Forms&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;input[type=&quot;search&quot;]&lt;/code&gt; fields with &lt;code&gt;appearance: none&lt;/code&gt; incorrectly reserved space for the datalist dropdown button. (&lt;a href=&quot;https://commits.webkit.org/305314@main&quot;&gt;305314@main&lt;/a&gt;)  (166754216)&lt;/li&gt;
&lt;li&gt;Fixed an incorrect fallback for the menu style for empty lists, improving readability and correctness. (&lt;a href=&quot;https://commits.webkit.org/305228@main&quot;&gt;305228@main&lt;/a&gt;)  (167662316)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;HTML&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for using the &lt;code&gt;min()&lt;/code&gt;, &lt;code&gt;max()&lt;/code&gt;, and &lt;code&gt;clamp()&lt;/code&gt; math functions in the &lt;code&gt;sizes&lt;/code&gt; attribute of &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; elements. (&lt;a href=&quot;https://commits.webkit.org/305226@main&quot;&gt;305226@main&lt;/a&gt;)  (167526292)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where nested &lt;code&gt;about:blank&lt;/code&gt; frames were incorrectly treated as self-referencing, preventing them from loading. (&lt;a href=&quot;https://commits.webkit.org/305404@main&quot;&gt;305404@main&lt;/a&gt;)  (148373033)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Images&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed image uploading to not transcode images when &lt;code&gt;accept=&quot;image/*&quot;&lt;/code&gt; is specified. (&lt;a href=&quot;https://commits.webkit.org/305283@main&quot;&gt;305283@main&lt;/a&gt;)  (166124206)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Media&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; poster images were incorrectly double-scaled when &lt;code&gt;zoom&lt;/code&gt; was applied by using the cached intrinsic poster size without reapplying zoom. (&lt;a href=&quot;https://commits.webkit.org/305347@main&quot;&gt;305347@main&lt;/a&gt;)  (150976146)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the macOS inline media controls timeline scrubber overlapped the right container buttons. (&lt;a href=&quot;https://commits.webkit.org/305177@main&quot;&gt;305177@main&lt;/a&gt;)  (167634241)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Rendering&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where auto-positioned absolutely positioned descendants were not always marked for layout when their parent’s border box moved. (&lt;a href=&quot;https://commits.webkit.org/305229@main&quot;&gt;305229@main&lt;/a&gt;)  (131806062)&lt;/li&gt;
&lt;li&gt;Fixed an issue where color fonts could affect the color of other DOM elements. (&lt;a href=&quot;https://commits.webkit.org/305254@main&quot;&gt;305254@main&lt;/a&gt;)  (166631312)&lt;/li&gt;
&lt;li&gt;Fixed an issue by disabling CoreGraphics blur and drop-shadow filters due to system framework bugs and reverting the previous workaround. (&lt;a href=&quot;https://commits.webkit.org/305216@main&quot;&gt;305216@main&lt;/a&gt;)  (166631624)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;&amp;lt;col&amp;gt;&lt;/code&gt; elements with &lt;code&gt;span &amp;gt; 1&lt;/code&gt; not applying their width to all spanned columns during table layout, aligning behavior with other browsers. (&lt;a href=&quot;https://commits.webkit.org/305113@main&quot;&gt;305113@main&lt;/a&gt;)  (167225435)&lt;/li&gt;
&lt;li&gt;Fixed table layout &lt;code&gt;min-width&lt;/code&gt; distribution for spanning cells with mixed &lt;code&gt;percent&lt;/code&gt;, &lt;code&gt;fixed&lt;/code&gt;, and &lt;code&gt;auto&lt;/code&gt; columns. (&lt;a href=&quot;https://commits.webkit.org/305215@main&quot;&gt;305215@main&lt;/a&gt;)  (167684748)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SVG&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed breaking SVG resource referencing when removing a resource which shares its id with other resources. (&lt;a href=&quot;https://commits.webkit.org/305197@main&quot;&gt;305197@main&lt;/a&gt;)  (147015037)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;&amp;lt;clipPath&amp;gt;&lt;/code&gt; to clip to its &lt;code&gt;&amp;lt;use&amp;gt;&lt;/code&gt; child element based on the visibility of the &lt;code&gt;&amp;lt;use&amp;gt;&lt;/code&gt; target element. (&lt;a href=&quot;https://commits.webkit.org/305374@main&quot;&gt;305374@main&lt;/a&gt;)  (167491519)&lt;/li&gt;
&lt;li&gt;Fixed displaying an SVG filter referencing an element with a huge stroke. (&lt;a href=&quot;https://commits.webkit.org/305136@main&quot;&gt;305136@main&lt;/a&gt;)  (167516452)&lt;/li&gt;
&lt;li&gt;Fixed hit testing for overlapping &lt;code&gt;&amp;lt;text&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;tspan&amp;gt;&lt;/code&gt; elements in SVG. (&lt;a href=&quot;https://commits.webkit.org/305221@main&quot;&gt;305221@main&lt;/a&gt;)  (167691166)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web API&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;DeviceMotionEvent&lt;/code&gt; and &lt;code&gt;DeviceOrientationEvent&lt;/code&gt; interfaces so that they only show up in secure contexts just like the corresponding events and made &lt;code&gt;ondevicemotion&lt;/code&gt; and &lt;code&gt;ondeviceorientation&lt;/code&gt; enumerable, aligning with the specification. (&lt;a href=&quot;https://commits.webkit.org/305266@main&quot;&gt;305266@main&lt;/a&gt;)  (44804273)&lt;/li&gt;
&lt;li&gt;Fixed handling of unknown &lt;code&gt;DigitalCredential&lt;/code&gt; protocols by gracefully filtering them out and showing a console warning instead of throwing an error. (&lt;a href=&quot;https://commits.webkit.org/305257@main&quot;&gt;305257@main&lt;/a&gt;)  (166673454)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebRTC&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;RTCConfiguration.iceServers&lt;/code&gt; to be a non-optional sequence with an empty array as the default, improving spec compliance and ensuring &lt;code&gt;RTCPeerConnection&lt;/code&gt; behaves correctly when &lt;code&gt;iceServers&lt;/code&gt; is undefined. (&lt;a href=&quot;https://commits.webkit.org/305152@main&quot;&gt;305152@main&lt;/a&gt;)  (167607478)&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>https://webkit.org</uri>
		</author>
		<source>
			<title type="html">Blog – WebKit</title>
			<subtitle type="html">Open Source Web Browser Engine</subtitle>
			<link rel="self" href="https://webkit.org/blog/feed/"/>
			<id>https://webkit.org/blog/feed/</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #55</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-55/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-55/</id>
		<updated>2026-02-02T20:11:18+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from January 26 to February 2.&lt;/p&gt;
&lt;p&gt;
A calm week for sure! The highlight this week is the fix for scrolling not starting when the main thread is blocked.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics 🖼️&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/306396@main&quot; rel=&quot;external&quot;&gt;Fixed&lt;/a&gt; the problem of wheel event async scrolling doesn&#x27;t start while the main thread is blocked. This should make WebKit feel more responsive even on heavier websites.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #54</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-54/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-54/</id>
		<updated>2026-01-26T21:00:55+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from January 19 to January 26.&lt;/p&gt;
&lt;p&gt;
The main event this week has been the creation of the branch for the upcoming stable series, accompanied by the first release candidate before 2.52.0. But there&#x27;s more: the WPE port gains hyphenation support and the ability to notify of graphics buffer changes; both ports get graphics fixes and a couple of new Web features, and WPE-Android also gets a new stable release.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/305917@main&quot; rel=&quot;external&quot;&gt;Implemented&lt;/a&gt; support for the &lt;code&gt;:open&lt;/code&gt;
pseudo-class on dialog and details elements. This is currently behind the
&lt;code&gt;OpenPseudoClass&lt;/code&gt; feature flag.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/306152@main&quot; rel=&quot;external&quot;&gt;Implemented&lt;/a&gt; the &lt;code&gt;source&lt;/code&gt; property for
&lt;code&gt;ToggleEvent&lt;/code&gt;. This can be used to run code dependent on the triggering element
in response to a popover or dialog toggle.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics 🖼️&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/306119@main&quot; rel=&quot;external&quot;&gt;Fixed&lt;/a&gt; the rendering glitches with
wheel event asynchronous scrolling, which occurred when the page was scrolled
to areas not covered by tiles while the main thread was blocked.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit 📟&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Support for
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/hyphens&quot; rel=&quot;external&quot;&gt;hyphenation&lt;/a&gt;
has been &lt;a href=&quot;https://commits.webkit.org/305816@main&quot; rel=&quot;external&quot;&gt;added to WPE&lt;/a&gt;. This requires
&lt;code&gt;libhyphen&lt;/code&gt; and can be disabled at build-time with the &lt;code&gt;USE_LIBHYPHEN=OFF&lt;/code&gt;
CMake option.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;wpe-platform-api-jigsaw&quot;&gt;WPE Platform API 🧩&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;New, modern platform API that supersedes usage of libwpe and WPE backends.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;WPEPlatform &lt;a href=&quot;https://commits.webkit.org/306008@main&quot; rel=&quot;external&quot;&gt;gained support&lt;/a&gt; to notify
changes in the configuration of graphics buffers allocated to render the
contents of a web view, either by handling the &lt;code&gt;WPEView::buffers-changed&lt;/code&gt;
signal or by overriding the &lt;code&gt;WPEViewClass.buffers_changed&lt;/code&gt; virtual function.
This feature is mainly useful for platform implementations which may need to
perform additional setup in advance, before updated web view contents are
provided in the buffers configured by WebKit.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases 📦️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Igalia/wpe-android/releases/tag/v0.3.1&quot; rel=&quot;external&quot;&gt;WPE-Android 0.3.0&lt;/a&gt;
has been released, and prebuilt packages are available &lt;a href=&quot;https://central.sonatype.com/artifact/org.wpewebkit.wpeview/wpeview/&quot; rel=&quot;external&quot;&gt;at the Maven Central
repository&lt;/a&gt;.
The main change in this this version is the update to WPE WebKit 2.50.4, which
is the most recent stable release.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/WebKit/WebKit/commits/webkitglib/2.52&quot; rel=&quot;external&quot;&gt;A new branch has been
created&lt;/a&gt; for the
upcoming 2.52.x stable release series of the GTK and WPE WebKit ports. The
first release candidates from this branch, &lt;a href=&quot;https://webkitgtk.org/2026/01/23/webkitgtk2.51.90-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK
2.51.90&lt;/a&gt; and
&lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.51.90.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.51.90&lt;/a&gt; are
now available. Testing and &lt;a href=&quot;https://bugs.webkit.org&quot; rel=&quot;external&quot;&gt;issue reports in Bugzilla&lt;/a&gt;
are welcome to help with stabilization before the first stable release, which
is planned for mid-March.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Enrique Ocaña: Igalia Multimedia contributions in 2025</title>
		<link href="https://eocanha.org/blog/2026/01/26/igalia-multimedia-contributions-in-2025/"/>
		<id>https://eocanha.org/blog/?p=701</id>
		<updated>2026-01-26T09:34:37+00:00</updated>
		<content type="html">&lt;p&gt;Now that 2025 is over, it&amp;#8217;s time to look back and feel proud of the path we&amp;#8217;ve walked. Last year has been really exciting in terms of contributions to GStreamer and WebKit for the Igalia Multimedia team.&lt;/p&gt;



&lt;p&gt;With more than 459 contributions along the year, we&amp;#8217;ve been one of the top contributors to the GStreamer project, in areas like Vulkan Video, GstValidate, VA, GStreamer Editing Services, WebRTC or H.266 support.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;a href=&quot;https://eocanha.org/blog/wp-content/uploads/2026/01/gstreamer-contributions.jpg&quot;&gt;&lt;img alt=&quot;Pie chart of Igalia&#x27;s contributions to different areas of the GStreamer project:
other (30%)
vulkan (24%)
validate (7%)
va (6%)
ges (4%)
webrtc (3%)
h266parse (3%)
python (3%)
dots-viewer (3%)
tests (2%)
docs (2%)
devtools (2%)
webrtcbin (1%)
tracers (1%)
qtdemux (1%)
gst (1%)
ci (1%)
y4menc (1%)
videorate (1%)
gl (1%)
alsa (1%)&quot; class=&quot;wp-image-706&quot; height=&quot;530&quot; src=&quot;https://eocanha.org/blog/wp-content/uploads/2026/01/gstreamer-contributions.jpg&quot; width=&quot;943&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Igalia&amp;#8217;s contributions to the GStreamer project&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;In Vulkan Video we&amp;#8217;ve worked on the VP9 video decoder, and cooperated with other contributors to push the AV1 decoder as well. There&amp;#8217;s now an H.264 base class for video encoding that is designed to support general hardware-accelerated processing.&lt;/p&gt;



&lt;p&gt;GStreaming Editing Services, the framework to build video editing applications, has gained time remapping support, which now allows to include fast/slow motion effects in the videos. Video transformations (scaling, cropping, rounded corners, etc) are now hardware-accelerated thanks to the addition of new Skia-based GStreamer elements and integration with OpenGL. Buffer pool tuning and pipeline improvements have helped to optimize memory usage and performance, enabling the edition of 4K video at 60 frames per second. Much of this work to improve and ensure quality in GStreamer Editing Services has also brought improvements in the GstValidate testing framework, which will be useful for other parts of GStreamer.&lt;/p&gt;



&lt;p&gt;Regarding H.266 (VVC), full playback support (with decoders such as &lt;code&gt;vvdec&lt;/code&gt; and &lt;code&gt;avdec_h266&lt;/code&gt;, demuxers and muxers for Matroska, MP4 and TS, and parsers for the &lt;code&gt;vvc1&lt;/code&gt; and &lt;code&gt;vvi1&lt;/code&gt; formats) is now available in GStreamer 1.26 thanks to Igalia&amp;#8217;s work. This allows user applications such as the WebKitGTK web browser to leverage the hardware accelerated decoding provided by VAAPI to play H.266 video using GStreamer.&lt;/p&gt;



&lt;p&gt;Igalia has also been one of the top contributors to GStreamer Rust, with 43 contributions. Most of the commits there have been related to Vulkan Video.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;a href=&quot;https://eocanha.org/blog/wp-content/uploads/2026/01/gstreamer-rs-contributions.jpg&quot;&gt;&lt;img alt=&quot;Pie chart of Igalia&#x27;s contributions to different areas of the GStreamer Rust project:
vulkan (28%)
other (26%)
gstreamer (12%)
ci (12%)
tracer (7%)
validate (5%)
ges (7%)
examples (5%)&quot; class=&quot;wp-image-708&quot; height=&quot;530&quot; src=&quot;https://eocanha.org/blog/wp-content/uploads/2026/01/gstreamer-rs-contributions.jpg&quot; width=&quot;943&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Igalia&amp;#8217;s contributions to the GStreamer Rust project&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;In addition to GStreamer, the team also has a strong presence in WebKit, where we leverage our GStreamer knowledge to implement many features of the web engine related to multimedia. From the 1739 contributions to the WebKit project done last year by Igalia, the Multimedia team has made 323 of them. Nearly one third of those have been related to generic multimedia playback, and the rest have been on areas such as WebRTC, MediaStream, MSE, WebAudio, a new Quirks system to provide adaptations for specific hardware multimedia platforms at runtime, WebCodecs or MediaRecorder.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;a href=&quot;https://eocanha.org/blog/wp-content/uploads/2026/01/webkit-contributions.jpg&quot;&gt;&lt;img alt=&quot;Pie chart of Igalia&#x27;s contributions to different areas of the WebKit project:
Generic Gstreamer work (33%)
WebRTC (20%)
Regression bugfixing (9%)
Other (7%)
MSE (6%)
BuildStream SDK (4%)
MediaStream (3%)
WPE platform (3%)
WebAudio (3%)
WebKitGTK platform (2%)
Quirks (2%)
MediaRecorder (2%)
EME (2%)
Glib (1%)
WTF (1%)
WebCodecs (1%)
GPUProcess (1%)
Streams (1%) &quot; class=&quot;wp-image-709&quot; height=&quot;530&quot; src=&quot;https://eocanha.org/blog/wp-content/uploads/2026/01/webkit-contributions.jpg&quot; width=&quot;943&quot; /&gt;&lt;/a&gt;&lt;figcaption&gt;Igalia Multimedia Team&amp;#8217;s contributions to different areas of the WebKit project&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;We&amp;#8217;re happy about what we&amp;#8217;ve achieved along the year and look forward to maintaining this success and bringing even more exciting features and contributions in 2026.&lt;/p&gt;</content>
		<author>
			<name>eocanha</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">When will CSS Grid Lanes arrive? How long until we can use it?</title>
		<link href="https://webkit.org/blog/17758/when-will-css-grid-lanes-arrive-how-long-until-we-can-use-it/"/>
		<id>https://webkit.org/?p=17758</id>
		<updated>2026-01-22T10:00:30+00:00</updated>
		<content type="html">&lt;p&gt;Anytime an exciting new web technology starts to land in browsers, developers want to know “when in the world am I going to be able to use this?”&lt;/p&gt;
&lt;p&gt;Currently, the finalized syntax for Grid Lanes is available in &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;Safari Technology Preview&lt;/a&gt;. Edge, Chrome and Firefox have all made significant progress on their implementations, so it’s going to arrive sooner than you think.&lt;/p&gt;
&lt;p&gt;Plus, you can start using it as soon as you want with progressive enhancement. This article will show you how.&lt;/p&gt;
&lt;figure class=&quot;&quot;&gt;&lt;img alt=&quot;Web page of content items — each item is a group with an image, headline and text inside a card with rounded corners. The page is in a browser window on the left, with a layout created with Grid Lanes. The items have different aspect ratios, and nestle together into columns, where all of the content for each item can be seen. On the right, is another browser window with the same content — this time laid out in columns again, but also rows. In order for the items to fit into the rows, the photos have all been cropped into squares, the headlines are truncated to fit onto one line, and the teaser descriptions are all chopped to only be three paragraphs long. All the rest of the content is simply missing, not shown in order to force each item to be the same shape and size as the others. And fit on the grid. &quot; class=&quot;aligncenter size-full wp-image-17762&quot; height=&quot;1436&quot; src=&quot;https://webkit.org/wp-content/uploads/Grid-Lanes-with-Grid-fallback-scaled.webp&quot; width=&quot;2560&quot; /&gt;&lt;figcaption&gt;Deliver the layout on the left using Grid Lanes to browsers with support, while providing a fallback for other browsers.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;(If you haven’t heard of Grid Lanes yet, it’s a new tool for layout that makes it easy to create masonry-style layouts in CSS alone. Read &lt;a href=&quot;https://webkit.org/blog/17660/introducing-css-grid-lanes/&quot;&gt;Introducing CSS Grid Lanes&lt;/a&gt; to learn all about it. And read &lt;a href=&quot;https://webkit.org/blog/17746/new-safari-developer-tools-provide-insight-into-css-grid-lanes/&quot;&gt;New Safari developer tools provide insight into CSS Grid Lanes&lt;/a&gt; to learn about our new developer tooling that makes using Grid Lanes it even easier.)&lt;/p&gt;
&lt;h2&gt;Current status of implementations&lt;/h2&gt;
&lt;p&gt;Where are browsers in the process of getting ready to ship support for Grid Lanes? Let’s look at the progress that’s been made over the last seven years.&lt;/p&gt;
&lt;h3&gt;Firefox was first&lt;/h3&gt;
&lt;p&gt;It’s the team that was at Mozilla in 2019-2020 who wrote the original CSS Working Group Editor’s Draft for Grid level 3, proposing concrete ideas for how masonry-style layouts would work in CSS. The feature shipped in Firefox Nightly in very early 2020. Some of the syntax has since changed, but under the hood, the way this new layout feature relies on and expands CSS Grid is basically the same, which means much of the heavy lifting for implementing it in the Gecko layout engine is underway.&lt;/p&gt;
&lt;p&gt;Firefox does need to update their implementation (including updating to the new syntax and adding the new &lt;code&gt;flow-tolerance&lt;/code&gt; property, among other things) but if you want to try it out in Firefox today, you can enter &lt;code&gt;about:config&lt;/code&gt; in the URL bar, search for “masonry” and set the flag to true — or use Firefox Nightly where it’s already on by default. (At the moment, remember to use the original &lt;code&gt;grid-template-*: masonry&lt;/code&gt; syntax to trigger this layout, instead of &lt;code&gt;display: grid-lanes&lt;/code&gt;.)&lt;/p&gt;
&lt;h3&gt;Safari picked up the pace&lt;/h3&gt;
&lt;p&gt;In 2022, Safari’s WebKit team picked up where Mozilla left off in 2020, and started implementing the same original proposal for CSS Grid Layout Level 3. We also restarted the discussion inside the CSS Working Group, hoping to advance the original Editor’s Draft to a point where it was mature enough that browsers could feel confident shipping.&lt;/p&gt;
&lt;p&gt;The WebKit implementation was enabled on-by-default in Safari Technology Preview 163 in February 2023. It’s been updated continuously as the CSS specification has changed.&lt;/p&gt;
&lt;p&gt;You can use Safari Technology Preview today to try out &lt;a href=&quot;https://www.w3.org/TR/css-grid-3/&quot;&gt;the official web standard&lt;/a&gt;, make demos using &lt;code&gt;display: grid-lanes&lt;/code&gt;, and learn how it works. Keep an eye on the &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes&quot;&gt;Safari Release notes&lt;/a&gt; to see when it ships in Safari beta.&lt;/p&gt;
&lt;figure class=&quot;&quot;&gt;&lt;source media=&quot;(prefers-color-scheme: dark)&quot; type=&quot;image/png&quot; /&gt;&lt;img alt=&quot;Screenshot of webpage for CSS Grid Layout Module level 3 specification.&quot; class=&quot;aligncenter size-full wp-image-17767&quot; height=&quot;1811&quot; src=&quot;https://webkit.org/wp-content/uploads/Grid-3-spec-light-scaled.webp&quot; width=&quot;2560&quot; /&gt;&lt;figcaption&gt;Grid Lanes is defined in &lt;a href=&quot;https://www.w3.org/TR/css-grid-3/&quot;&gt;CSS Grid Layout Module Level 3&lt;/a&gt;.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3&gt;Chrome &amp;amp; Edge are on board, too&lt;/h3&gt;
&lt;p&gt;A variation for how masonry layouts could work in CSS &lt;a href=&quot;https://developer.chrome.com/blog/masonry-update&quot;&gt;landed in Chrome and Edge 140&lt;/a&gt; behind a flag in July 2025. Rather than implementing the same syntax as Safari and Firefox, Chromium experimented with an alternative proposal. This drove debates in the CSSWG about how exactly this feature should work and what its syntax should be. With key syntax decisions now finalized, Chromium engineers at Edge are updating their implementation. Keep an eye &lt;a href=&quot;https://chromestatus.com/feature/5149560434589696&quot;&gt;on the Chrome Status issue&lt;/a&gt; for the latest news.&lt;/p&gt;
&lt;p&gt;Bottom line — all the major browser engines are making progress. Now is a great time to learn &lt;a href=&quot;https://webkit.org/blog/17660/introducing-css-grid-lanes/&quot;&gt;how Grid Lanes works&lt;/a&gt;. And consider if, when and how you could start using it.&lt;/p&gt;
&lt;h2&gt;Yes, you can start using it kinda soon-ish&lt;/h2&gt;
&lt;p&gt;Great developers are always mindful of users whose browsers don’t have support. Not only does it take time for all browsers to ship new features, it takes time for all users to update. But this does not mean you have to wait multiple years before using new technologies. It just means you just have to be savvy.&lt;/p&gt;
&lt;p&gt;You can progressively enhance your code to create masonry-style layouts, and support older browsers, both at the same time. How? As always, there are multiple options. Which choice is best for you depends on your use case, your team, and your code base. Let’s go through three different approaches you could use:&lt;/p&gt;
&lt;h3&gt;Option 1: Polyfill — use a JavaScript library as a backup for Grid Lanes&lt;/h3&gt;
&lt;p&gt;One common trick for using a new CSS feature when it’s still not available in all browsers is to use a &lt;a href=&quot;https://en.wikipedia.org/wiki/Polyfill_(programming)&quot;&gt;polyfill&lt;/a&gt; — i.e.: use JavaScript to fill in the missing functionality.&lt;/p&gt;
&lt;p&gt;Lucky for you, there are already tried and true JS libraries out in the world for creating masonry layouts. &lt;a href=&quot;https://masonry.desandro.com/&quot;&gt;Masonry.js&lt;/a&gt; is a popular one. Perhaps you are using it now. You can keep using it by itself, and ignore Grid Lanes. Or you can switch to using the JS library as a polyfill.&lt;/p&gt;
&lt;p&gt;The approach here is to go ahead and use CSS Grid Lanes to handle the layout in CSS alone — in browsers with support for Grid Lanes, even if that’s still only preview browsers. At the same time, architect your code to also work with a JavaScript library. Test in a browser &lt;a href=&quot;https://caniuse.com/css-grid-lanes&quot;&gt;without support&lt;/a&gt; for Grid Lanes to make sure the JS layout works.&lt;/p&gt;
&lt;p&gt;The key is to structure your code with conditionals, so browsers with Grid Lanes support use CSS, while those without use JS. In your CSS, use &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Conditional_rules/Using_feature_queries&quot;&gt;Feature Queries&lt;/a&gt; to ensure the right CSS is used under the right conditions. In JavaScript, use &lt;code&gt;if&lt;/code&gt; statements.&lt;/p&gt;
&lt;p&gt;For example, you can structure your CSS like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;comment&quot;&gt;/* Native Grid Lanes for supporting browsers */&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;@supports&lt;/span&gt; (&lt;span class=&quot;keyword&quot;&gt;display&lt;/span&gt;: &lt;span class=&quot;keyword&quot;&gt;grid-lanes&lt;/span&gt;) {
  .&lt;span class=&quot;attribute&quot;&gt;grid&lt;/span&gt; {
    &lt;span class=&quot;attribute&quot;&gt;display&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;grid-lanes&lt;/span&gt;;
    &lt;span class=&quot;attribute&quot;&gt;grid-template-columns&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;repeat&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;auto-fill&lt;/span&gt;, &lt;span class=&quot;identifier&quot;&gt;minmax&lt;/span&gt;(&lt;span class=&quot;number&quot;&gt;200px&lt;/span&gt;, &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;identifier&quot;&gt;fr&lt;/span&gt;));
    &lt;span class=&quot;attribute&quot;&gt;gap&lt;/span&gt;: &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;identifier&quot;&gt;lh&lt;/span&gt;;
  }
}

&lt;span class=&quot;comment&quot;&gt;/* Additional CSS needed only for browsers without Grid Lanes */&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;@supports&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;not&lt;/span&gt; (&lt;span class=&quot;keyword&quot;&gt;display&lt;/span&gt;: &lt;span class=&quot;keyword&quot;&gt;grid-lanes&lt;/span&gt;) {
  .&lt;span class=&quot;attribute&quot;&gt;grid-item&lt;/span&gt; {
    &lt;span class=&quot;attribute&quot;&gt;margin&lt;/span&gt;: &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;identifier&quot;&gt;lh&lt;/span&gt;;
  }
  &lt;span class=&quot;comment&quot;&gt;/* Perhaps also include a fallback layout in case JS doesn&#x27;t run */&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then in JavaScript, you can check to see whether or not Grid Lanes is supported. If not, load the file. And then start using Masonry JS (or another library), according to its documentation.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;comment&quot;&gt;// Check if CSS Grid Lanes is NOT supported
&lt;/span&gt;&lt;span class=&quot;keyword control&quot;&gt;if&lt;/span&gt; (&lt;span class=&quot;operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;identifier&quot;&gt;CSS&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;supports&lt;/span&gt;(&lt;span class=&quot;char&quot;&gt;&#x27;display&#x27;&lt;/span&gt;, &lt;span class=&quot;char&quot;&gt;&#x27;grid-lanes&#x27;&lt;/span&gt;)) {

    &lt;span class=&quot;comment&quot;&gt;// Dynamically load masonry.js
&lt;/span&gt;    &lt;span class=&quot;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;script&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;createElement&lt;/span&gt;(&lt;span class=&quot;char&quot;&gt;&#x27;script&#x27;&lt;/span&gt;);
    &lt;span class=&quot;identifier&quot;&gt;script&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;src&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;char&quot;&gt;&#x27;https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js&#x27;&lt;/span&gt;;
    &lt;span class=&quot;identifier&quot;&gt;script&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;onload&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;keyword type&quot;&gt;function&lt;/span&gt;() {

    &lt;span class=&quot;comment&quot;&gt;// Use Masonry.js after the script loads
&lt;/span&gt;    &lt;span class=&quot;keyword operator&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;Masonry&lt;/span&gt;(&lt;span class=&quot;char&quot;&gt;&#x27;.grid&#x27;&lt;/span&gt;, {
        &lt;span class=&quot;identifier&quot;&gt;itemSelector&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;char&quot;&gt;&#x27;.grid-item&#x27;&lt;/span&gt;,
        &lt;span class=&quot;identifier&quot;&gt;columnWidth&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;200&lt;/span&gt;,
    });
    };
    &lt;span class=&quot;identifier&quot;&gt;document&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;head&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;appendChild&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;script&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It’s important to conditionally load the JS library only if the browser doesn’t support Grid Lanes. There’s no reason to have all users download and run the JS file when some percent don’t need it. That percentage might be small today (even zero), but over time it will grow to 100%.&lt;/p&gt;
&lt;p&gt;Save future you the task of having to change your code later. Structure it today so in a future when all users have Grid Lanes, no one has to do anything. Users get the best experience, even if no one on your team ever cleans out the old code.&lt;/p&gt;
&lt;p&gt;With this technique, browsers with Grid Lanes support use pure CSS, while older browsers load and use JavaScript. By switching to using the JavaScript library a polyfill, not as the primary layout mechanism, increasing numbers of users will get the benefit of a faster and more robust layout sooner.&lt;/p&gt;
&lt;p&gt;Of course, maybe this won’t work for your project. Maybe it’s too complicated to architect your HTML and surrounding layout to work for both Grid Lanes and a masonry library at the same time. So what are the other options?&lt;/p&gt;
&lt;h3&gt;Option 2: Don’t use Grid Lanes — use another layout in CSS instead&lt;/h3&gt;
&lt;p&gt;Of course, you might be screaming “it’s too early to use Grid Lanes!” There is always the option of simply waiting to use a new technology. Perhaps another layout mode in CSS like Grid level 1, Flexbox or Multicolumn are good enough for your needs. And you can hold off using any tool for accomplishing a masonry-style layout until you feel more confident about Grid Lanes.&lt;/p&gt;
&lt;p&gt;CSS Multicolumn is an interesting option that you might not be familiar with. It shipped in browsers decades ago (before Can I Use kept track). With &lt;a href=&quot;https://www.w3.org/1999/06/WD-css3-multicol-19990623&quot;&gt;origins&lt;/a&gt; that date back to the 1990s, Multicolumn suffered from the fate of most early CSS — the specification was not detailed enough, and that resulted in a lot of differences between browser implementations. This frustrated developers, resulting in Multicolumn falling out of favor.&lt;/p&gt;
&lt;p&gt;In more recent years, &lt;a href=&quot;https://drafts.csswg.org/css-multicol-1/&quot;&gt;Multicolumn level 1&lt;/a&gt; has gotten a lot of love, and the specification now contains far more detail. This has helped browsers squash interop bugs. There’s even a &lt;a href=&quot;https://drafts.csswg.org/css-multicol-2/&quot;&gt;Multicolumn level 2&lt;/a&gt; specification bringing new features in the future. There’s still more work to do to create true interoperability, but it’s worth &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Multicol_layout&quot;&gt;reconsidering Multicolumn&lt;/a&gt; to see if can solve your use case today.&lt;/p&gt;
&lt;p&gt;Multicolumn and Grid Lanes can result in very similar-looking layouts. They are fundamentally different, however, in the way content flows. These differences impact the order of what comes into focus when tabbing through content, readability / scanability, and user experience. So consider carefully.&lt;/p&gt;
&lt;figure class=&quot;https://webkit.org/wp-content/uploads/Grid-vs-Multicolumn-dark-scaled.webp&quot;&gt;&lt;source media=&quot;(prefers-color-scheme: dark)&quot; type=&quot;image/png&quot; /&gt;&lt;img alt=&quot;graphic comparing Grid Lanes layout vs Multicolumn. Two browser windows side by side. The layouts are basically the same visually, but Grid Lanes flows the content across the page, keeping 20 items above the bottom edge of the viewport. Multicolumn pours the items 1 to 5 down the first column, then starts the next column with the 16th item, showing 16-19... etc. Where is item 6-15? Not on screen. &quot; class=&quot;aligncenter size-full wp-image-17770&quot; height=&quot;1434&quot; src=&quot;https://webkit.org/wp-content/uploads/Grid-vs-Multicolumn-light-scaled.webp&quot; width=&quot;2560&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;Try out the &lt;a href=&quot;https://webkit.org/demos/grid3/&quot;&gt;demos we created&lt;/a&gt; to compare how Multicolumn and Grid Lanes work. Select different layouts from the dropdown menus, and turn on item numbers to emphasize the difference.&lt;/p&gt;
&lt;h3&gt;Option 3: Use Grid Lanes — along with a fallback layout in CSS&lt;/h3&gt;
&lt;p&gt;While “don’t use Grid Lanes” is always an option, perhaps the best approach is to write your code so that Grid Lanes is used when supported, and another layout mode in CSS is used as the fallback. This avoids using JavaScript for layout, while still delivering the newer layout to the users who do have support.&lt;/p&gt;
&lt;p&gt;For example, let’s imagine we want to use Grid Lanes, and leverage CSS Grid (level 1) when Grid Lanes isn’t supported. To make the original Grid layout work, can use CSS to force all the items be the same aspect ratio by cropping images and truncating text.&lt;/p&gt;
&lt;p&gt;To do this, we can apply layout to the container using the &lt;code&gt;display&lt;/code&gt; property — twice. First we’ll declare &lt;code&gt;display: grid&lt;/code&gt;, then we’ll immediately declare &lt;code&gt;display: grid-lanes&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;keyword builtin&quot;&gt;.grid-container&lt;/span&gt; {
  &lt;span class=&quot;attribute&quot;&gt;display&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;grid&lt;/span&gt;;
  &lt;span class=&quot;attribute&quot;&gt;display&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;grid-lanes&lt;/span&gt;; &lt;span class=&quot;comment&quot;&gt;/* will override grid in browsers that support */&lt;/span&gt;
  &lt;span class=&quot;attribute&quot;&gt;grid-template-columns&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;repeat&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;auto-fill&lt;/span&gt;, &lt;span class=&quot;identifier&quot;&gt;minmax&lt;/span&gt;(&lt;span class=&quot;number&quot;&gt;200px&lt;/span&gt;, &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;identifier&quot;&gt;fr&lt;/span&gt;));
  &lt;span class=&quot;attribute&quot;&gt;gap&lt;/span&gt;: &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;identifier&quot;&gt;lh&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In browsers that support Grid Lanes, the second declaration will override the first. The &lt;code&gt;display: grid&lt;/code&gt; rule will be ignored. And the layout will use Grid Lanes, resulting in a layout that packs content of different aspect ratios into a set of columns.&lt;/p&gt;
&lt;p&gt;In browsers that do not support Grid Lanes, the browser will ignore the second declaration. It sees &lt;code&gt;display: grid-lanes&lt;/code&gt; and goes “what? That’s not a thing. You must have misspelled something. Ignore!” This leaves &lt;code&gt;grid&lt;/code&gt; as the layout that’s applied. The content will be laid out into clear rows as well as columns.&lt;/p&gt;
&lt;p&gt;This is a tried and true technique that’s been used by developers for over two decades — relying on the fact that CSS just ignores anything it doesn’t understand. It does not throw an error message. It does not stop parsing. It just ignores that line of code and moves along.&lt;/p&gt;
&lt;p&gt;We can also use a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Conditional_rules/Using_feature_queries&quot;&gt;Feature Query&lt;/a&gt; to write code that only gets applied in browsers without support for Grid Lanes. Let’s use the &lt;code&gt;aspect-ratio&lt;/code&gt; property to force all images into the same aspect ratio. And use &lt;code&gt;object-fit: cover&lt;/code&gt; to crop those images to fit in the box, instead of letting them be squished.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;css&quot;&gt;&lt;span class=&quot;comment&quot;&gt;/* Additional CSS for browsers without Grid Lanes support */&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;@supports&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;not&lt;/span&gt; (&lt;span class=&quot;keyword&quot;&gt;display&lt;/span&gt;: &lt;span class=&quot;keyword&quot;&gt;grid-lanes&lt;/span&gt;) {
  .&lt;span class=&quot;attribute&quot;&gt;grid-item&lt;/span&gt; {
    &lt;span class=&quot;attribute&quot;&gt;img&lt;/span&gt; {
      &lt;span class=&quot;attribute&quot;&gt;aspect-ratio&lt;/span&gt;: &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;; &lt;span class=&quot;comment&quot;&gt;/* resize every image into a square */&lt;/span&gt;
      &lt;span class=&quot;attribute&quot;&gt;object-fit&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;cover&lt;/span&gt;; &lt;span class=&quot;comment&quot;&gt;/* crop, don&#x27;t squish the image */&lt;/span&gt;
    }
    &lt;span class=&quot;keyword&quot;&gt;h3&lt;/span&gt; {
      &lt;span class=&quot;attribute&quot;&gt;white-space&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;nowrap&lt;/span&gt;; &lt;span class=&quot;comment&quot;&gt;/* don&#x27;t wrap the headline */&lt;/span&gt;
      &lt;span class=&quot;attribute&quot;&gt;overflow&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;hidden&lt;/span&gt;; &lt;span class=&quot;comment&quot;&gt;/* crop the extra */&lt;/span&gt;
      &lt;span class=&quot;attribute&quot;&gt;text-overflow&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;ellipsis&lt;/span&gt;; &lt;span class=&quot;comment&quot;&gt;/* add an ellipsis if it overflows */&lt;/span&gt;
    }
    &lt;span class=&quot;keyword&quot;&gt;p&lt;/span&gt; {
      &lt;span class=&quot;attribute&quot;&gt;display&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;-webkit-box&lt;/span&gt;; &lt;span class=&quot;comment&quot;&gt;/* current practice in all browsers */&lt;/span&gt;
      &lt;span class=&quot;attribute&quot;&gt;-webkit-box-orient&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;vertical&lt;/span&gt;;
      &lt;span class=&quot;attribute&quot;&gt;-webkit-line-clamp&lt;/span&gt;: &lt;span class=&quot;number&quot;&gt;3&lt;/span&gt;; &lt;span class=&quot;comment&quot;&gt;/* clamps to this many lines of text */&lt;/span&gt;
      &lt;span class=&quot;attribute&quot;&gt;overflow&lt;/span&gt;: &lt;span class=&quot;identifier&quot;&gt;hidden&lt;/span&gt;;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can force our headline to not wrap with &lt;code&gt;white-space: nowrap&lt;/code&gt;. Once the headline is on one line, we can hide whatever doesn’t fit with &lt;code&gt;overflow: hidden&lt;/code&gt;. Then, &lt;code&gt;text-overflow: ellipsis&lt;/code&gt; adds “…” to the end of what’s visible.&lt;/p&gt;
&lt;p&gt;When we want to truncate multi-line text to a specific number of lines, we can use the &lt;code&gt;-webkit-line-clamp&lt;/code&gt; technique. While originally invented by the WebKit team long ago when prefixes were the best practice for browsers rolling out new ideas, today &lt;code&gt;-webkit-box&lt;/code&gt;, &lt;code&gt;-webkit-box-orient&lt;/code&gt; and &lt;code&gt;-webkit-line-clamp&lt;/code&gt; are supported by all browsers. (No browser has shipped a replacement yet because a complete web standard for defining such a tool is still under debate.)&lt;/p&gt;
&lt;figure class=&quot;&quot;&gt;&lt;img alt=&quot;This is the exact same image from the opening of the article. Web page of content items — each item is a group with an image, headline and text inside a card with rounded corners. The page is in a browser window on the left, with a layout created with Grid Lanes. The items have different aspect ratios, and nestle together into columns, where all of the content for each item can be seen. On the right, is another browser window with the same content — this time laid out in columns again, but also rows. In order for the items to fit into the rows, the photos have all been cropped into squares, the headlines are truncated to fit onto one line, and the teaser descriptions are all chopped to only be three paragraphs long. All the rest of the content is simply missing, not shown in order to force each item to be the same shape and size as the others. And fit on the grid. &quot; class=&quot;aligncenter size-full wp-image-17762&quot; height=&quot;1436&quot; src=&quot;https://webkit.org/wp-content/uploads/Grid-Lanes-with-Grid-fallback-scaled.webp&quot; width=&quot;2560&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;This approach results in a masonry-style waterfall layout being delivered to the browsers that support Grid Lanes, while a more traditional layout of equal-sized boxes are delivered using CSS Grid level 1 to browsers that don’t yet support Grid Lanes.&lt;/p&gt;
&lt;h3&gt;It’s up to you&lt;/h3&gt;
&lt;p&gt;It’s totally up to you how you want to handle the fallback for a lack of support for Grid Lanes, but you definitely have options. This is one of the benefits of writing CSS, and not just using a 3rd-party utility framework that abstracts all the flexibility away. Progressive enhancement techniques bring the future into the present, and let you start using Grid Lanes far sooner!&lt;/p&gt;
&lt;h2&gt;Learn more about Grid Lanes&lt;/h2&gt;
&lt;p&gt;This is our third article in a series about Grid Lanes. The first introduces CSS Grid Lanes, explaining what it is and how to use it (and yes, it can be used “in the other direction”). The second article shows off our new developer tools and explains why they are particularly helpful for setting flow tolerance. Also, check out our demos in Safari Technology Preview. And be sure to come back to &lt;a href=&quot;http://webkit.org/&quot;&gt;webkit.org&lt;/a&gt; soon for more articles about Grid Lanes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/17660/introducing-css-grid-lanes/&quot;&gt;Introducing CSS Grid Lanes&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/17746/new-safari-developer-tools-provide-insight-into-css-grid-lanes/&quot;&gt;New Safari developer tools provide insight into CSS Grid Lanes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/demos/grid3/&quot;&gt;Demos of Grid Lanes&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>https://webkit.org</uri>
		</author>
		<source>
			<title type="html">Blog – WebKit</title>
			<subtitle type="html">Open Source Web Browser Engine</subtitle>
			<link rel="self" href="https://webkit.org/blog/feed/"/>
			<id>https://webkit.org/blog/feed/</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #53</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-53/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-53/</id>
		<updated>2026-01-19T19:25:32+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from December 26 to January 19.&lt;/p&gt;
&lt;p&gt;
We&#x27;re back! The first periodical of 2026 brings you performance optimizations, improvements to the memory footprint calculation, new APIs, the removal of the legacy Qt5 WPE backend, and as always, progress on JSC&#x27;s Temporal implementation.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The memory footprint calculation mechanism &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/56493&quot; rel=&quot;external&quot;&gt;has been unified&lt;/a&gt; across GTK, JSC, and WPE ports. Therefore, the expensive &lt;code&gt;/proc/self/smaps&lt;/code&gt; is not used anymore and the WPE uses &lt;code&gt;/proc/self/statm&lt;/code&gt; with extra cache now to prevent frequent file reading.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/305444@main&quot; rel=&quot;external&quot;&gt;Added&lt;/a&gt; a new &lt;code&gt;webkit_context_menu_get_position()&lt;/code&gt; function to the API that allows obtaining the pointer coordinates, relative to the web view origin, at the moment when a context menu was triggered.&lt;/p&gt;
&lt;p&gt;Additionally, behaviour of context menus &lt;a href=&quot;https://commits.webkit.org/305461@main&quot; rel=&quot;external&quot;&gt;has been made more consistent&lt;/a&gt; between the GTK and WPE ports, and handling of &lt;code&gt;GAction&lt;/code&gt; objects attached to menu items has been &lt;a href=&quot;https://commits.webkit.org/305267@main&quot; rel=&quot;external&quot;&gt;rewritten&lt;/a&gt; and &lt;a href=&quot;https://commits.webkit.org/305504@main&quot; rel=&quot;external&quot;&gt;improved&lt;/a&gt; with the goal of better supporting context menus in the WPE port.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;javascriptcore-fish&quot;&gt;JavaScriptCore 🐟&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;The built-in JavaScript/ECMAScript engine for WebKit, also known as JSC or SquirrelFish.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;In JavaScriptCore&#x27;s implementation of Temporal, &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/56210/&quot; rel=&quot;external&quot;&gt;fixed a bug&lt;/a&gt; in &lt;code&gt;Temporal.PlainTime.from&lt;/code&gt; that read options in the wrong order, which caused a test262 test to fail.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;In JavaScriptCore&#x27;s implementation of Temporal, &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/56460&quot; rel=&quot;external&quot;&gt;fixed several bugs&lt;/a&gt; in &lt;code&gt;PlainYearMonth&lt;/code&gt; methods and enabled all &lt;code&gt;PlainYearMonth&lt;/code&gt; tests that don&#x27;t depend on the &lt;code&gt;Intl&lt;/code&gt; object. This completes the implementation of Temporal &lt;code&gt;PlainYearMonth&lt;/code&gt; objects in JSC.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics 🖼️&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;In WebKit&#x27;s Skia graphics backend, &lt;a href=&quot;https://commits.webkit.org/304898@main&quot; rel=&quot;external&quot;&gt;fixed GrDirectContext management&lt;/a&gt; for GPU resources. Operations on GPU-backed resources must use the context that created them, not the current thread&#x27;s context. The fix stores &lt;code&gt;GrDirectContext&lt;/code&gt; at creation time for &lt;code&gt;NativeImage&lt;/code&gt; and uses &lt;code&gt;surface-&amp;gt;recordingContext()-&amp;gt;asDirectContext()&lt;/code&gt; for SkSurface, correcting multiple call sites that previously used the shared display&#x27;s context incorrectly.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Damage propagation &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/55697&quot; rel=&quot;external&quot;&gt;has been added&lt;/a&gt; to the recently-added, non-composited mode in WPE.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;In WebKit&#x27;s Skia graphics backend for GTK/WPE, &lt;a href=&quot;https://commits.webkit.org/305273@main&quot; rel=&quot;external&quot;&gt;added canvas 2D operation recording&lt;/a&gt; for GPU-accelerated rendering. Instead of executing drawing commands immediately, operations are recorded into an &lt;code&gt;SkPicture&lt;/code&gt; and replayed in batch when the canvas contents are needed, reducing GPU state change overhead for workloads with many small drawing operations, improving the MotionMark &lt;em&gt;Canvas Lines&lt;/em&gt; performance on embedded devices with low-end tiled GPUs.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit 📟&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Due to Qt5 not receiving maintenance since mid-2025, the WPE Qt5 binding that used the legacy libwpe API &lt;a href=&quot;https://commits.webkit.org/305824@main&quot; rel=&quot;external&quot;&gt;has been removed&lt;/a&gt; from the tree. The Qt6 binding &lt;a href=&quot;https://github.com/WebKit/WebKit/tree/main/Source/WebKit/UIProcess/API/wpe/qt6&quot; rel=&quot;external&quot;&gt;remains part of the source tree&lt;/a&gt;, which is a better alternative that allows using supported Qt versions, and is built atop the new WPEPlatform API, making it a future-proof option. The WPE Qt API may be enabled when configuring the build with CMake, using the &lt;code&gt;ENABLE_WPE_QT_API&lt;/code&gt; option.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;wpe-platform-api-jigsaw&quot;&gt;WPE Platform API 🧩&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;New, modern platform API that supersedes usage of libwpe and WPE backends.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The &lt;code&gt;WPEScreenSyncObserver&lt;/code&gt; class has been improved to &lt;a href=&quot;https://commits.webkit.org/305509@main&quot; rel=&quot;external&quot;&gt;support multiple callbacks&lt;/a&gt;. Instead of a single callback set with &lt;code&gt;wpe_screen_sync_observer_set_callback()&lt;/code&gt;, clients of the API can now use &lt;code&gt;wpe_screen_sync_observer_add_callback()&lt;/code&gt; and &lt;code&gt;wpe_screen_sync_observer_remove_callback()&lt;/code&gt;. The observer will be paused automatically when there are no callbacks attached to it.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">New Safari developer tools provide insight into CSS Grid Lanes</title>
		<link href="https://webkit.org/blog/17746/new-safari-developer-tools-provide-insight-into-css-grid-lanes/"/>
		<id>https://webkit.org/?p=17746</id>
		<updated>2026-01-14T22:45:00+00:00</updated>
		<content type="html">&lt;p&gt;You might have &lt;a href=&quot;https://webkit.org/blog/17660/introducing-css-grid-lanes/&quot;&gt;heard recently&lt;/a&gt; that Safari Technology Preview 234 landed the final plan for supporting masonry-style layouts in CSS. It’s called Grid Lanes.&lt;/p&gt;
&lt;figure class=&quot;&quot;&gt;&lt;source media=&quot;(prefers-color-scheme: dark)&quot; type=&quot;image/png&quot; /&gt;&lt;img alt=&quot;web browser showing a 6-column layout of photos of various aspect ratios, packed vertically&quot; class=&quot;aligncenter size-full wp-image-17717&quot; height=&quot;1667&quot; src=&quot;https://webkit.org/wp-content/uploads/grid-lanes-photos-light-scaled.webp&quot; width=&quot;2560&quot; /&gt;&lt;figcaption&gt;Try out all &lt;a href=&quot;https://webkit.org/demos/grid3/&quot;&gt;our demos of CSS Grid Lanes&lt;/a&gt; today in Safari Technology Preview.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://webkit.org/blog/17660/introducing-css-grid-lanes/&quot;&gt;CSS Grid Lanes&lt;/a&gt; adds a whole new capability to CSS Grid. It lets you line up content in &lt;em&gt;either&lt;/em&gt; columns or rows — and not both.&lt;/p&gt;
&lt;p&gt;This layout pattern allows content of various aspect ratios to pack together. No longer do you need to truncate content artificially to make it fit. Plus, the content that’s earlier in the HTML gets grouped together towards the start of the container. If new items get lazy loaded, they appear at the end without reshuffling what&amp;#8217;s already on screen.&lt;/p&gt;
&lt;p&gt;It can be tricky to understand the content flow pattern as you are learning Grid Lanes. The content is not flowing down the first column to the very bottom of the container, and then back up to the top of the second column. (If you want that pattern, use &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Multicol_layout&quot;&gt;CSS Multicolumn&lt;/a&gt; or Flexbox.)&lt;/p&gt;
&lt;p&gt;With Grid Lanes, the content flows perpendicular to the layout shape you created. When you define columns, the content flows back and forth across those columns, just like to how it would if rows existed. If you define rows, the content will flow up and down through the rows — in the column direction, as if columns were there.&lt;/p&gt;
&lt;figure class=&quot;&quot;&gt;&lt;img alt=&quot;diagram showing how for waterfall layout there are columns, while content flows side to side. And for brick, the content is laid out in rows, while it the order flows up and down.&quot; class=&quot;aligncenter size-full wp-image-17751&quot; height=&quot;1439&quot; src=&quot;https://webkit.org/wp-content/uploads/grid-lane-content-flow-scaled.webp&quot; width=&quot;2560&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;Having a way to see the order of items can make it easier to understand this content flow. Introducing the CSS Grid Lanes Inspector in Safari. It’s just the regular Grid Inspector, now with more features.&lt;/p&gt;
&lt;figure class=&quot;&quot;&gt;&lt;source media=&quot;(prefers-color-scheme: dark)&quot; type=&quot;image/png&quot; /&gt;&lt;img alt=&quot;Grid Lanes photo demo in Safari, with Web Inspector open to the Layout panel, and all the tools for the Grid Inspector turned on. Grid lines are marked with dotted lines. Columns are labeled with numbers and sizes. And each photo is marked with a label like Item 1 — which makes it clear the order of content in the layout.&quot; class=&quot;aligncenter size-full wp-image-17721&quot; height=&quot;1667&quot; src=&quot;https://webkit.org/wp-content/uploads/grid-lanes-order-light-scaled.webp&quot; width=&quot;2560&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;Safari’s &lt;a href=&quot;https://webkit.org/blog/11588/introducing-css-grid-inspector/&quot;&gt;Grid Inspector&lt;/a&gt; already reveals the grid lines for Grid Lanes, and labels track sizes, line numbers, line names, and area names. Now it has a new feature — “Order Numbers”.&lt;/p&gt;
&lt;p&gt;By turning on the order numbers in the example above, we can clearly see how Item 1, 2, 3, and 4 flow across the columns, as if there were a row. Then Item 5 is in the middle right, followed by Item 6 on the far right, and so on.&lt;/p&gt;
&lt;p&gt;You might be tempted to believe the content order doesn’t matter. With pages like this photo gallery — most users will have no idea how the photos are ordered in the HTML. But for many users, the content order has a big impact on their experience. You should always consider what it’s like to tab through content — watching one item after another sequentially come into focus. Consider what it’s like to listen to the site through a screenreader while navigating by touch or keyboard. With Grid Lanes, you can adjust &lt;a href=&quot;https://webkit.org/blog/17660/introducing-css-grid-lanes/#:~:text=Flow%20Tolerance&quot;&gt;&lt;code&gt;flow-tolerance&lt;/code&gt;&lt;/a&gt; to reduce the jumping around and put items where people expect.&lt;/p&gt;
&lt;p&gt;To know which value for flow tolerance to choose, it really helps to quickly see the order of items. That makes it immediately clear how your CSS impacts the result.&lt;/p&gt;
&lt;p&gt;Order Numbers in the Grid Inspector is an extension of a feature Safari’s Flexbox Inspector has had &lt;a href=&quot;https://webkit.org/blog/13152/webkit-features-in-safari-16-0/#:~:text=Safari%2016.0%20adds%20Flexbox%20Inspector.&quot;&gt;since Safari 16.0&lt;/a&gt; — marking the order of Flex items. Seeing content order is also helpful when using the &lt;code&gt;order&lt;/code&gt; property in Flexbox.&lt;/p&gt;
&lt;figure class=&quot;&quot;&gt;&lt;source media=&quot;(prefers-color-scheme: dark)&quot; type=&quot;image/png&quot; /&gt;&lt;img alt=&quot;Web browser showing photo layout — this time a Flexbox layout. The Web Inspector is open to the Layout tab, and the Flexbox Inspector is enabled. The lines of the layout are marked with dotted lines... and each item is labeled with its order. &quot; class=&quot;aligncenter size-full wp-image-17724&quot; height=&quot;1667&quot; src=&quot;https://webkit.org/wp-content/uploads/flexbox-order-light-scaled.webp&quot; width=&quot;2560&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;Order Numbers in Safari’s Grid Inspector works for CSS Grid and Subgrid, as well as Grid Lanes.&lt;/p&gt;
&lt;h3&gt;Try out Safari’s layout tooling&lt;/h3&gt;
&lt;p&gt;The Grid and Flexbox layout inspectors might seem similar across browsers, but the team behind Safari’s Web Inspector has taken the time to finely polish the details. In both the Grid and Flexbox Inspectors, you can simultaneously activate as many overlays as you want. No limits. And no janky scrolling due to performance struggles.&lt;/p&gt;
&lt;p&gt;Safari’s Flexbox Inspector visually distinguishes between excess free space and Flex gaps, since knowing which is which can solve confusion. It shows the boundaries of items, revealing how they are distributed both on the main axis and the cross axis of Flexbox containers. And it lists all the Flexbox containers, making it easier to understand what’s happening overall.&lt;/p&gt;
&lt;p&gt;Our Grid Inspector has a simple and clear interface, making it easy to understand the options. It lists all of the Grid containers — and you can show the overlay for every single one at the same time. The overlays don’t disappear when you scroll. And of course, you can change the default colors of the overlays, to best contrast with your site content.&lt;/p&gt;
&lt;p&gt;And Safari’s Grid and Flexbox Inspectors are the only browser devtools that label content order. We hope seeing the order of content in Grid Lanes helps you understand it more thoroughly and enjoy using this powerful new layout mechanism.&lt;/p&gt;
&lt;h3&gt;Try out Order Numbers&lt;/h3&gt;
&lt;p&gt;Order Numbers in Safari’s Grid Inspector shipped today in Safari Technology Preview 235. Let us know what you think. There’s still time to polish the details to make the most helpful tool possible. You can ping Jen Simmons on &lt;a href=&quot;https://bsky.app/profile/jensimmons.bsky.social&quot;&gt;Bluesky&lt;/a&gt; or &lt;a href=&quot;https://front-end.social/@jensimmons&quot;&gt;Mastodon&lt;/a&gt; with links, comments and ideas.&lt;/p&gt;
&lt;h3&gt;For more&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/17660/introducing-css-grid-lanes/&quot;&gt;Introducing CSS Grid Lanes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/demos/grid3/&quot;&gt;Demos of Grid Lanes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/11588/introducing-css-grid-inspector/&quot;&gt;Safari’s Grid Inspector&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;note&quot;&gt;Note: Learn more about Web Inspector from the &lt;a href=&quot;https://webkit.org/web-inspector/&quot;&gt;Web Inspector Reference&lt;/a&gt; documentation.&lt;/div&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>https://webkit.org</uri>
		</author>
		<source>
			<title type="html">Blog – WebKit</title>
			<subtitle type="html">Open Source Web Browser Engine</subtitle>
			<link rel="self" href="https://webkit.org/blog/feed/"/>
			<id>https://webkit.org/blog/feed/</id>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Release Notes for Safari Technology Preview 235</title>
		<link href="https://webkit.org/blog/17739/release-notes-for-safari-technology-preview-235/"/>
		<id>https://webkit.org/?p=17739</id>
		<updated>2026-01-14T22:28:19+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://webkit.org/blog/6017/introducing-safari-technology-preview/&quot;&gt;Safari Technology Preview&lt;/a&gt; Release 235 is now &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;available for download&lt;/a&gt; for macOS Tahoe and macOS Sequoia. If you already have Safari Technology Preview installed, you can update it in System Settings under General → Software Update.&lt;/p&gt;
&lt;p&gt;This release includes WebKit changes between: &lt;a href=&quot;https://github.com/WebKit/WebKit/compare/aafd2ae784188062f91a671e378556ea14a2d7d9...9ac33ef78924d5f0c356587123825ba1c05097b1&quot;&gt;304072@main&amp;#8230;305083@main&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;CSS&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for parsing and evaluating name-only &lt;code&gt;@container&lt;/code&gt; queries that have no conditions, allowing named containers to match without explicit constraints. (&lt;a href=&quot;https://commits.webkit.org/304388@main&quot;&gt;304388@main&lt;/a&gt;)  (164648718)&lt;/li&gt;
&lt;li&gt;Added support for &lt;code&gt;math-depth&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/305010@main&quot;&gt;305010@main&lt;/a&gt;)  (167332590)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;display: list-item&lt;/code&gt; was incorrectly supported on &lt;code&gt;fieldset&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/304102@main&quot;&gt;304102@main&lt;/a&gt;)  (95638460)&lt;/li&gt;
&lt;li&gt;Fixed baseline handling for table cells when cell has no inflow children. (&lt;a href=&quot;https://commits.webkit.org/304477@main&quot;&gt;304477@main&lt;/a&gt;)  (160774504)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;-webkit-line-clamp&lt;/code&gt; so that it no longer propagates into &lt;code&gt;inline-block&lt;/code&gt; children. (&lt;a href=&quot;https://commits.webkit.org/304956@main&quot;&gt;304956@main&lt;/a&gt;)  (164488778)&lt;/li&gt;
&lt;li&gt;Fixed an issue where nested identical CSS &lt;code&gt;filter&lt;/code&gt; effects were not rendered. (&lt;a href=&quot;https://commits.webkit.org/304143@main&quot;&gt;304143@main&lt;/a&gt;)  (165163823)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;::first-line&lt;/code&gt; pseudo-element to always use &lt;code&gt;inline&lt;/code&gt; display to match the CSS Display specification. (&lt;a href=&quot;https://commits.webkit.org/304096@main&quot;&gt;304096@main&lt;/a&gt;)  (166068698)&lt;/li&gt;
&lt;li&gt;Fixed incorrect text selection ranges for truncated right-to-left content. (&lt;a href=&quot;https://commits.webkit.org/304821@main&quot;&gt;304821@main&lt;/a&gt;)  (166944754)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Deprecations&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Removed the &lt;code&gt;FontFaceSet&lt;/code&gt; constructor from the CSS Font Loading API as it was deemed unnecessary, aligning with the CSSWG resolution. (&lt;a href=&quot;https://commits.webkit.org/304912@main&quot;&gt;304912@main&lt;/a&gt;)  (132031306)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Canvas&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;ImageBitmap&lt;/code&gt; created from SVG image sources to correctly honor the &lt;code&gt;flipY&lt;/code&gt; orientation. (&lt;a href=&quot;https://commits.webkit.org/304137@main&quot;&gt;304137@main&lt;/a&gt;)  (83959718)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Clipboard&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where using the &amp;#8220;Copy Image&amp;#8221; context menu in Safari would also copy the image URL, causing some sites to paste the URL instead of the image. (&lt;a href=&quot;https://commits.webkit.org/304166@main&quot;&gt;304166@main&lt;/a&gt;)  (76598990)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Editing&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed incorrect text selection when dragging across pseudo elements. (&lt;a href=&quot;https://commits.webkit.org/304719@main&quot;&gt;304719@main&lt;/a&gt;)  (142905243)&lt;/li&gt;
&lt;li&gt;Fixed an issue where focusing a hidden editable element would incorrectly display the text cursor and selection at full opacity. (&lt;a href=&quot;https://commits.webkit.org/304160@main&quot;&gt;304160@main&lt;/a&gt;)  (165489471)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Encoding&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed incorrect handling of invalid UTF-8 sequences in the &lt;code&gt;TextDecoder&lt;/code&gt; streaming decoder to properly manage partial sequence buffers. (&lt;a href=&quot;https://commits.webkit.org/304496@main&quot;&gt;304496@main&lt;/a&gt;)  (166583808)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Forms&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where input fields did not display user input while typing . (&lt;a href=&quot;https://commits.webkit.org/304311@main&quot;&gt;304311@main&lt;/a&gt;)  (163613957)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;HTML&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;HTMLImageElement.currentSrc&lt;/code&gt; to return an empty string for &lt;code&gt;&amp;lt;img src=&quot;&quot;&amp;gt;&lt;/code&gt; instead of resolving to the document base URL. (&lt;a href=&quot;https://commits.webkit.org/304982@main&quot;&gt;304982@main&lt;/a&gt;)  (167229274)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;JavaScript&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;%TypedArray%.prototype.includes&lt;/code&gt; to correctly check that the &lt;code&gt;index&lt;/code&gt; is less than the array length, aligning its behavior with ECMA-262 (&lt;a href=&quot;https://commits.webkit.org/304485@main&quot;&gt;304485@main&lt;/a&gt;).  (166578170)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;%TypedArray%.prototype.includes&lt;/code&gt; to correctly check that the &lt;code&gt;index&lt;/code&gt; is less than the array length, aligning its behavior with ECMA-262. (&lt;a href=&quot;https://commits.webkit.org/304940@main&quot;&gt;304940@main&lt;/a&gt;)  (167183441)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;MathML&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for CSS size containment in MathML elements using &lt;code&gt;contain-intrinsic-inline-size&lt;/code&gt; and &lt;code&gt;contain-intrinsic-block-size&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/304458@main&quot;&gt;304458@main&lt;/a&gt;)  (166323213)&lt;/li&gt;
&lt;li&gt;Added support for &lt;code&gt;math-style&lt;/code&gt; and &lt;code&gt;math-shift&lt;/code&gt; to animate as discrete values. (&lt;a href=&quot;https://commits.webkit.org/305017@main&quot;&gt;305017@main&lt;/a&gt;)  (167369164)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed incorrect positioning of &lt;code&gt;mpadded&lt;/code&gt; content in right-to-left mode. (&lt;a href=&quot;https://commits.webkit.org/304087@main&quot;&gt;304087@main&lt;/a&gt;)  (166045517)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;RenderMathMLRoot&lt;/code&gt; did not reset its radical operator when &lt;code&gt;msqrt&lt;/code&gt; or &lt;code&gt;mroot&lt;/code&gt; children were dynamically added or removed.(&lt;a href=&quot;https://commits.webkit.org/304822@main&quot;&gt;304822@main&lt;/a&gt;)  (166556627)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;&amp;lt;mpadded&amp;gt;&lt;/code&gt; so that percentage values for &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, and &lt;code&gt;depth&lt;/code&gt; attributes are treated as absent and use content dimensions as defaults, matching the MathML Core specification. (&lt;a href=&quot;https://commits.webkit.org/305027@main&quot;&gt;305027@main&lt;/a&gt;)  (167350169)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Media&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where changing an &lt;code&gt;HTMLMediaElement&lt;/code&gt; volume from &lt;code&gt;0&lt;/code&gt; to &lt;code&gt;0&lt;/code&gt; did not activate the audio session or update the sleep disabler. (&lt;a href=&quot;https://commits.webkit.org/304297@main&quot;&gt;304297@main&lt;/a&gt;)  (161691743)&lt;/li&gt;
&lt;li&gt;Fixed playback of &lt;code&gt;application/ogg&lt;/code&gt; blob media. (&lt;a href=&quot;https://commits.webkit.org/304530@main&quot;&gt;304530@main&lt;/a&gt;)  (163119790)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;HTMLMediaElement&lt;/code&gt; did not correctly detect new audio or video tracks causing Safari to pause video when leaving a tab. (&lt;a href=&quot;https://commits.webkit.org/304336@main&quot;&gt;304336@main&lt;/a&gt;)  (164514685)&lt;/li&gt;
&lt;li&gt;Fixed a crash in &lt;code&gt;AudioData.copyTo()&lt;/code&gt; when copying the last channel of 3-channel audio. (&lt;a href=&quot;https://commits.webkit.org/304728@main&quot;&gt;304728@main&lt;/a&gt;)  (164730320)&lt;/li&gt;
&lt;li&gt;Fixed the caption menu&amp;#8217;s &lt;code&gt;On&lt;/code&gt; option to correctly enable the highest-scoring text track and mark the appropriate language as checked in the subtitle menu. (&lt;a href=&quot;https://commits.webkit.org/304462@main&quot;&gt;304462@main&lt;/a&gt;)  (166158394)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;parseSequenceHeaderOBU&lt;/code&gt; to return an &lt;code&gt;AV1CodecConfigurationRecord&lt;/code&gt;, fully decode the Sequence Header OBU, and capture the complete color profile. (&lt;a href=&quot;https://commits.webkit.org/304474@main&quot;&gt;304474@main&lt;/a&gt;)  (166439682)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Networking&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a regression where &lt;code&gt;fetch()&lt;/code&gt; would throw a &lt;code&gt;TypeError&lt;/code&gt; when using &lt;code&gt;targetAddressSpace: &#x27;loopback&#x27;&lt;/code&gt; for localhost requests. (&lt;a href=&quot;https://commits.webkit.org/304577@main&quot;&gt;304577@main&lt;/a&gt;)  (166574523)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Rendering&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where overconstrained sticky elements were not properly adjusting their insets when the sticky box rectangle was larger than the viewport. (&lt;a href=&quot;https://commits.webkit.org/304335@main&quot;&gt;304335@main&lt;/a&gt;)  (163654023)&lt;/li&gt;
&lt;li&gt;Fixed inconsistent text layout when using &lt;code&gt;list-style-type&lt;/code&gt; by ensuring outside list markers do not affect intrinsic width calculations. (&lt;a href=&quot;https://commits.webkit.org/304947@main&quot;&gt;304947@main&lt;/a&gt;)  (164650313)&lt;/li&gt;
&lt;li&gt;Fixed incorrect min and max width calculations for block-level boxes inside inline content. (&lt;a href=&quot;https://commits.webkit.org/304170@main&quot;&gt;304170@main&lt;/a&gt;)  (166157696)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;getClientRects&lt;/code&gt; returned an incomplete list of rectangles for inline boxes containing block elements. (&lt;a href=&quot;https://commits.webkit.org/304949@main&quot;&gt;304949@main&lt;/a&gt;)  (167209147)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SVG&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for the &lt;code&gt;lighter&lt;/code&gt; operator in &lt;code&gt;SVGFECompositeElement&lt;/code&gt; IDL to align with the Compositing and Blending specification. (&lt;a href=&quot;https://commits.webkit.org/304941@main&quot;&gt;304941@main&lt;/a&gt;)  (166704079)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;stroke-dasharray&lt;/code&gt; incorrectly propagated to SVG markers when explicitly marked as &amp;#8216;0&amp;#8217;. (&lt;a href=&quot;https://commits.webkit.org/305042@main&quot;&gt;305042@main&lt;/a&gt;)  (46607685)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;foreignObject&lt;/code&gt; elements in SVG incorrectly allowed margin collapsing. (&lt;a href=&quot;https://commits.webkit.org/304916@main&quot;&gt;304916@main&lt;/a&gt;)  (97208795)&lt;/li&gt;
&lt;li&gt;Fixed an issue where dynamically changing &lt;code&gt;marker-start&lt;/code&gt;, &lt;code&gt;marker-mid&lt;/code&gt;, or &lt;code&gt;marker-end&lt;/code&gt; attributes on SVG elements did not trigger re-rendering. (&lt;a href=&quot;https://commits.webkit.org/304880@main&quot;&gt;304880@main&lt;/a&gt;)  (130678384)&lt;/li&gt;
&lt;li&gt;Fixed tiling gaps in CSS reference filters using &lt;code&gt;&amp;lt;feDisplacementMap&amp;gt;&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/304830@main&quot;&gt;304830@main&lt;/a&gt;)  (135448018)&lt;/li&gt;
&lt;li&gt;Fixed behavior to avoid incorrect pruning of SVG mask subtrees based on visibility. (&lt;a href=&quot;https://commits.webkit.org/305047@main&quot;&gt;305047@main&lt;/a&gt;)  (157729389)&lt;/li&gt;
&lt;li&gt;Fixed an issue where SVG &lt;code&gt;animateTransform&lt;/code&gt; animations on hidden elements were triggering full-page rendering updates each frame. (&lt;a href=&quot;https://commits.webkit.org/304744@main&quot;&gt;304744@main&lt;/a&gt;)  (159647563)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;SVGLength&lt;/code&gt; percentage resolution for elements inside non-instanced &lt;code&gt;&amp;lt;symbol&amp;gt;&lt;/code&gt; elements. (&lt;a href=&quot;https://commits.webkit.org/304197@main&quot;&gt;304197@main&lt;/a&gt;)  (165431008)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;SVGLength.value&lt;/code&gt; did not update for font-relative units (e.g., &lt;code&gt;ch&lt;/code&gt;, &lt;code&gt;em&lt;/code&gt;) after changes to &lt;code&gt;writing-mode&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/304657@main&quot;&gt;304657@main&lt;/a&gt;)  (166190252)&lt;/li&gt;
&lt;li&gt;Fixed missing gradient fills when using paint-order &lt;code&gt;stroke fill&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/288788@main&quot;&gt;288788@main&lt;/a&gt;)  (166997630)&lt;/li&gt;
&lt;li&gt;Fixed embedded &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt; elements in &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; without an explicit &lt;code&gt;viewBox&lt;/code&gt; to synthesize &lt;code&gt;preserveAspectRatio=&#x27;none&#x27;&lt;/code&gt; so the SVG stretches to fill the container. (&lt;a href=&quot;https://commits.webkit.org/305043@main&quot;&gt;305043@main&lt;/a&gt;)  (167121931)&lt;/li&gt;
&lt;li&gt;Fixed the &lt;code&gt;&amp;lt;stop&amp;gt;&lt;/code&gt; element &lt;code&gt;offset&lt;/code&gt; attribute in SVG to reject invalid values with trailing characters and correctly fall back to &lt;code&gt;0&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/305036@main&quot;&gt;305036@main&lt;/a&gt;)  (167356988)&lt;/li&gt;
&lt;li&gt;Fixed the transform order for &lt;code&gt;clipPath&lt;/code&gt; elements so that the bounding box is scaled correctly before applying the local transform. (&lt;a href=&quot;https://commits.webkit.org/305078@main&quot;&gt;305078@main&lt;/a&gt;)  (167417135)&lt;/li&gt;
&lt;li&gt;Fixed incorrect rendering when combining &lt;code&gt;markerUnits=strokeWidth&lt;/code&gt; with &lt;code&gt;vector-effect=non-scaling-stroke&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/305077@main&quot;&gt;305077@main&lt;/a&gt;)  (167493417)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web API&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for  pointer event and mouse event button support for the back and forward mouse buttons when they are available. (&lt;a href=&quot;https://commits.webkit.org/304761@main&quot;&gt;304761@main&lt;/a&gt;)  (137592588)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;IntersectionObserver&lt;/code&gt; computed the root rectangle incorrectly when overflow clipping was present. (&lt;a href=&quot;https://commits.webkit.org/304296@main&quot;&gt;304296@main&lt;/a&gt;)  (117143395)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;DigitalCredential&lt;/code&gt; behavior to make user mediation implicitly required. (&lt;a href=&quot;https://commits.webkit.org/304676@main&quot;&gt;304676@main&lt;/a&gt;)  (165597827)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Big5 &lt;code&gt;TextDecoder&lt;/code&gt; failed to recover and emit ASCII characters after encountering an invalid leading byte. (&lt;a href=&quot;https://commits.webkit.org/304591@main&quot;&gt;304591@main&lt;/a&gt;)  (166672674)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web Inspector&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added a context menu option to DOM nodes in the Elements Tab to copy pretty-printed HTML. (&lt;a href=&quot;https://commits.webkit.org/304698@main&quot;&gt;304698@main&lt;/a&gt;)  (102125455)&lt;/li&gt;
&lt;li&gt;Added support for toggling the visibility of User Agent stylesheet rules in the Elements tab, including hiding related &amp;#8220;go-to&amp;#8221; arrows in the Computed panel when the setting is disabled. (&lt;a href=&quot;https://commits.webkit.org/304627@main&quot;&gt;304627@main&lt;/a&gt;)  (164265183)&lt;/li&gt;
&lt;li&gt;Added support for showing actual composited layer snapshots in the 3D Layers view. (&lt;a href=&quot;https://commits.webkit.org/304758@main&quot;&gt;304758@main&lt;/a&gt;)  (164977594)&lt;/li&gt;
&lt;li&gt;Added support for Web Inspector to fetch CSS property keyword completions based on feature support. (&lt;a href=&quot;https://commits.webkit.org/304195@main&quot;&gt;304195@main&lt;/a&gt;)  (165914089)&lt;/li&gt;
&lt;li&gt;Added support for displaying &lt;code&gt;Order Numbers&lt;/code&gt; in CSS Grid and CSS Grid Lanes overlays in Web Inspector, including new UI settings for toggling order number visibility. (&lt;a href=&quot;https://commits.webkit.org/304645@main&quot;&gt;304645@main&lt;/a&gt;)  (166648769)&lt;/li&gt;
&lt;li&gt;Added support for visualizing gaps between items in the masonry axis of &lt;code&gt;grid-lanes&lt;/code&gt; layouts within the Web Inspector grid overlay. (&lt;a href=&quot;https://commits.webkit.org/304861@main&quot;&gt;304861@main&lt;/a&gt;)  (166984079)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed the Styles sidebar filter in Web Inspector to be case-insensitive. (&lt;a href=&quot;https://commits.webkit.org/304153@main&quot;&gt;304153@main&lt;/a&gt;)  (36086981)&lt;/li&gt;
&lt;li&gt;Fixed context menu items to rename &lt;code&gt;Copy HTTP Request&lt;/code&gt; and &lt;code&gt;Copy HTTP Response&lt;/code&gt; to &lt;code&gt;Copy HTTP Request Headers&lt;/code&gt; and &lt;code&gt;Copy HTTP Response Headers&lt;/code&gt; for clarity. (&lt;a href=&quot;https://commits.webkit.org/304768@main&quot;&gt;304768@main&lt;/a&gt;)  (117708766)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Sources navigation sidebar could be empty when reloading the page. (&lt;a href=&quot;https://commits.webkit.org/304221@main&quot;&gt;304221@main&lt;/a&gt;)  (166141968)&lt;/li&gt;
&lt;li&gt;Fixed timestamp formatting in the Web Inspector to remove unnecessary trailing &lt;code&gt;.0&lt;/code&gt; values for readability. (&lt;a href=&quot;https://commits.webkit.org/304851@main&quot;&gt;304851@main&lt;/a&gt;)  (166500013)&lt;/li&gt;
&lt;li&gt;Fixed item order labels in the Web Inspector grid and flex overlays to remove the &lt;code&gt;#&lt;/code&gt; symbol, changing from &lt;code&gt;Item #N&lt;/code&gt; to &lt;code&gt;Item N&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/304771@main&quot;&gt;304771@main&lt;/a&gt;)  (166767949)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebAssembly&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;Error.isError(WebAssembly.Exception)&lt;/code&gt; to correctly return &lt;code&gt;false&lt;/code&gt; based on current WebAssembly spec semantics. (&lt;a href=&quot;https://commits.webkit.org/304917@main&quot;&gt;304917@main&lt;/a&gt;)  (167110254)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebRTC&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;RTCDataChannelInit&lt;/code&gt; to support &lt;code&gt;[EnforceRange]&lt;/code&gt; on the &lt;code&gt;maxPacketLifeTime&lt;/code&gt; and &lt;code&gt;maxRetransmits&lt;/code&gt; fields to align with the WebRTC specification. (&lt;a href=&quot;https://commits.webkit.org/304499@main&quot;&gt;304499@main&lt;/a&gt;)  (133630397)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;RTCDataChannel&lt;/code&gt; close events did not fire when &lt;code&gt;RTCPeerConnection&lt;/code&gt; was closed. (&lt;a href=&quot;https://commits.webkit.org/304859@main&quot;&gt;304859@main&lt;/a&gt;)  (165617848)&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>https://webkit.org</uri>
		</author>
		<source>
			<title type="html">Blog – WebKit</title>
			<subtitle type="html">Open Source Web Browser Engine</subtitle>
			<link rel="self" href="https://webkit.org/blog/feed/"/>
			<id>https://webkit.org/blog/feed/</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #52</title>
		<link href="https://blogs.igalia.com/webkit/blog/2025/wip-52/"/>
		<id>https://blogs.igalia.com/webkit/blog/2025/wip-52/</id>
		<updated>2025-12-25T18:26:43+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from December 16 to December 25.&lt;/p&gt;
&lt;p&gt;
Right during the holiday season 🎄, the last WIP installment of the year comes packed with new releases, a couple of functions added to the public API, cleanups, better timer handling, and improvements to MathML and WebXR support.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/WebKit/WebKit/pull/52066&quot; rel=&quot;external&quot;&gt;Landed support for &lt;code&gt;font-size: math&lt;/code&gt;&lt;/a&gt;. Now
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/math-depth&quot; rel=&quot;external&quot;&gt;&lt;code&gt;math-depth&lt;/code&gt;&lt;/a&gt;
can automatically control the font size inside of &lt;code&gt;&amp;lt;math&amp;gt;&lt;/code&gt; blocks, making
scripts and nested content smaller to improve readability and presentation.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Two new functions &lt;a href=&quot;https://commits.webkit.org/304810@main&quot; rel=&quot;external&quot;&gt;have been added&lt;/a&gt; to
the public API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;webkit_context_menu_item_get_gaction_target()&lt;/code&gt; to obtain the &lt;code&gt;GVariant&lt;/code&gt;
associated with a context menu item created from a &lt;code&gt;GAction&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;webkit_context_menu_item_get_title()&lt;/code&gt; may be used to obtain
the title of a context menu item.&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
&lt;div class=&quot;wip-item&quot;&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/304553@main&quot; rel=&quot;external&quot;&gt;Improved timers&lt;/a&gt;, by making some of
them use the &lt;a href=&quot;https://lwn.net/Articles/251413/&quot; rel=&quot;external&quot;&gt;timerfd API&lt;/a&gt;. This reduces
timer “lateness”—the amount of time elapsed between the configured trigger
time, and the effective one—, which in turn improves the perceived smoothness
of animations thanks to steadier frame delivery timings. Systems where the
&lt;code&gt;timerfd_create&lt;/code&gt; and &lt;code&gt;timerfd_settime&lt;/code&gt; functions are not available will
continue working as before.&lt;/p&gt;
  
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;On the WebXR front, support &lt;a href=&quot;https://commits.webkit.org/304631@main&quot; rel=&quot;external&quot;&gt;was added&lt;/a&gt;
for  &lt;code&gt;XR_TRACKABLE_TYPE_DEPTH_ANDROID&lt;/code&gt; through the &lt;code&gt;XR_ANDROID_trackables&lt;/code&gt;
extension, which allows reporting depth information for elements that take part
in hit testing.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics 🖼️&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Landed &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/54518&quot; rel=&quot;external&quot;&gt;a change&lt;/a&gt; that implements
non-composited page rendering in the WPE port. This new mode is disabled by
default, and may be activated by disabling the &lt;code&gt;AcceleratedCompositing&lt;/code&gt; runtime
preference. In such case, the frames are rendered using a simplified code path
that does not involve the internal WebKit compositor. Therefore it may offer a
better performance in some specific cases on constrained embedded devices.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Since version 2.10.2, the &lt;a href=&quot;https://freetype.org&quot; rel=&quot;external&quot;&gt;FreeType&lt;/a&gt; library can be built
with direct support for loading fonts in the
&lt;a href=&quot;https://www.w3.org/TR/WOFF2/&quot; rel=&quot;external&quot;&gt;WOFF2&lt;/a&gt; format. Until now, the WPE and GTK WebKit
ports used &lt;a href=&quot;https://github.com/google/woff2&quot; rel=&quot;external&quot;&gt;libwoff2&lt;/a&gt; in an intermediate step
to convert those fonts on-the-fly before handing them to FreeType for
rendering. The CMake build system will now &lt;a href=&quot;https://commits.webkit.org/304864@main&quot; rel=&quot;external&quot;&gt;detect when FreeType supports WOFF2
directly&lt;/a&gt; and skip the conversion step.
This way, in systems which provide a suitable version of FreeType, &lt;code&gt;libwoff2&lt;/code&gt;
will no longer be needed.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit 📟&lt;/h2&gt;
&lt;h3 id=&quot;wpe-platform-api-jigsaw&quot;&gt;WPE Platform API 🧩&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;New, modern platform API that supersedes usage of libwpe and WPE backends.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The legacy libwpe-based API &lt;a href=&quot;https://commits.webkit.org/304671@main&quot; rel=&quot;external&quot;&gt;can now be disabled at build
time&lt;/a&gt;, by toggling the
&lt;code&gt;ENABLE_WPE_LEGACY_API&lt;/code&gt; CMake option. This allows removal of uneeded code when
an application is exclusively using the new WPEPlatform API.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;wpe-android-robot&quot;&gt;WPE Android &lt;a href=&quot;https://github.com/Igalia/wpe-android&quot; rel=&quot;external&quot;&gt;↗&lt;/a&gt;  🤖&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;Adaptation of WPE WebKit targeting the Android operating system.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.android.com/ndk/reference/group/a-hardware-buffer&quot; rel=&quot;external&quot;&gt;AHardwareBuffer&lt;/a&gt;
is &lt;a href=&quot;https://commits.webkit.org/304567@main&quot; rel=&quot;external&quot;&gt;now supported&lt;/a&gt; as backing for
accelerated graphics surfaces that can be shared across processes. This is the
last piece of the puzzle to use WPEPlatform on Android without involving
expensive operations to copy rendered frames back-and-forth between GPU and
system memory.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases 📦️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://webkitgtk.org/2025/12/16/webkitgtk2.50.4-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK
2.50.4&lt;/a&gt; and
&lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.50.4.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.50.4&lt;/a&gt; have
been released. These stable releases include a number of important patches for
security issues, and we urge users and distributors to update to this release
if they have not yet done it. An accompanying security advisory,
&lt;code&gt;WSA-2025-0010&lt;/code&gt;, has been published
(&lt;a href=&quot;https://webkitgtk.org/security/WSA-2025-0010.html&quot; rel=&quot;external&quot;&gt;GTK&lt;/a&gt;,
&lt;a href=&quot;https://wpewebkit.org/security/WSA-2025-0010.html&quot; rel=&quot;external&quot;&gt;WPE&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Development releases of &lt;a href=&quot;https://webkitgtk.org/2025/12/19/webkitgtk2.51.4-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK
2.51.4&lt;/a&gt; and
&lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.51.4.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.51.4&lt;/a&gt; are
available as well, and may be used to preview upcoming features. As usual, bug
reports are &lt;a href=&quot;https://bugs.webkit.org&quot; rel=&quot;external&quot;&gt;welcome in Bugzilla&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;community-events-handshake&quot;&gt;Community &amp;amp; Events 🤝&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Paweł Lampe has published a &lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-performance-considerations-pre-rendering/&quot; rel=&quot;external&quot;&gt;blog
post&lt;/a&gt;
that discusses various pre-rendering techniques useful in the context of using
WPE on embedded devices.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Release Notes for Safari Technology Preview 234</title>
		<link href="https://webkit.org/blog/17674/release-notes-for-safari-technology-preview-234/"/>
		<id>https://webkit.org/?p=17674</id>
		<updated>2025-12-19T20:43:27+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://webkit.org/blog/6017/introducing-safari-technology-preview/&quot;&gt;Safari Technology Preview&lt;/a&gt; Release 234 is now &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;available for download&lt;/a&gt; for macOS Tahoe and macOS Sequoia. If you already have Safari Technology Preview installed, you can update it in System Settings under General → Software Update.&lt;/p&gt;
&lt;p&gt;This release includes WebKit changes between: &lt;a href=&quot;https://github.com/WebKit/WebKit/compare/c1c2613b5377530ae910fb4c4c12b15e437a52e0...3a46c8b831c8f3efbea062a3aa56781369c13bd3&quot;&gt;303092@main&amp;#8230;304071@main&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Accessibility&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed missing &lt;code&gt;aria-label&lt;/code&gt; on the button added by &lt;code&gt;&amp;lt;img controls&amp;gt;&lt;/code&gt; to improve accessibility for screen readers. (&lt;a href=&quot;https://commits.webkit.org/304013@main&quot;&gt;304013@main&lt;/a&gt;)  (164651880)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Animations&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for Threaded Scroll-driven Animations. With Threaded Scroll-driven Animations, eligible scroll-driven animations are updated as their associated timeline&amp;#8217;s source element is scrolled instead of when the page rendering is updated, yielding smoother animations on devices with Pro Motion displays. Additionally, since scrolling is performed in a separate process, those animations update as scrolling occurs no matter the load on the main thread. Eligible animations are any scroll-driven animations animating the &lt;code&gt;opacity&lt;/code&gt;, &lt;code&gt;transform&lt;/code&gt;, &lt;code&gt;translate&lt;/code&gt;, &lt;code&gt;scale&lt;/code&gt;, &lt;code&gt;rotate&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;backdrop-filter&lt;/code&gt; or any of the Motion Path properties. (&lt;a href=&quot;https://commits.webkit.org/303997@main&quot;&gt;303997@main&lt;/a&gt;)  (165924545)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CSS&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for CSS &lt;code&gt;display: grid-lanes&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/303114@main&quot;&gt;303114@main&lt;/a&gt;)  (164860495)&lt;/li&gt;
&lt;li&gt;Added support for an automatic initial value for &lt;code&gt;grid-auto-flow&lt;/code&gt; in CSS Grid Level 3 to switch flow orientation based on &lt;code&gt;grid-template-rows&lt;/code&gt; and &lt;code&gt;grid-template-columns&lt;/code&gt; for grid lane layouts. (&lt;a href=&quot;https://commits.webkit.org/303634@main&quot;&gt;303634@main&lt;/a&gt;)  (164791817)&lt;/li&gt;
&lt;li&gt;Added support for &lt;code&gt;item-tolerance&lt;/code&gt; in CSS Masonry layouts to improve flexible grid item placement. (&lt;a href=&quot;https://commits.webkit.org/303096@main&quot;&gt;303096@main&lt;/a&gt;)  (164043151)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;max-width&lt;/code&gt; was not correctly applied to tables with fixed widths. (&lt;a href=&quot;https://commits.webkit.org/303644@main&quot;&gt;303644@main&lt;/a&gt;)  (96554687)&lt;/li&gt;
&lt;li&gt;Fixed incorrect sizing and fragment URL handling for SVG images used in &lt;code&gt;-webkit-cross-fade()&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/303593@main&quot;&gt;303593@main&lt;/a&gt;)  (106633417)&lt;/li&gt;
&lt;li&gt;Fixed table layout so that fixed horizontal margins on &lt;code&gt;&amp;lt;caption&amp;gt;&lt;/code&gt; elements now contribute to the table’s minimum preferred logical width, preventing captions from causing narrower than expected tables. (&lt;a href=&quot;https://commits.webkit.org/303642@main&quot;&gt;303642@main&lt;/a&gt;)  (120990942)&lt;/li&gt;
&lt;li&gt;Fixed incorrect width calculation for &lt;code&gt;positioned&lt;/code&gt; elements using &lt;code&gt;box-sizing: border-box&lt;/code&gt; with an &lt;code&gt;aspect-ratio&lt;/code&gt;, ensuring borders and padding are not double-counted. (&lt;a href=&quot;https://commits.webkit.org/303834@main&quot;&gt;303834@main&lt;/a&gt;)  (121500004)&lt;/li&gt;
&lt;li&gt;Fixed the UA style sheet to use &lt;code&gt;:focus-visible&lt;/code&gt; instead of &lt;code&gt;:focus&lt;/code&gt; for outline properties. (&lt;a href=&quot;https://commits.webkit.org/303643@main&quot;&gt;303643@main&lt;/a&gt;)  (123155364)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;HighlightRegistry&lt;/code&gt; to remove its non-standard &lt;code&gt;constructor&lt;/code&gt; and updated tests to use &lt;code&gt;CSS.highlights&lt;/code&gt; while ensuring &lt;code&gt;Map.prototype&lt;/code&gt; is properly restored after tampering. (&lt;a href=&quot;https://commits.webkit.org/303858@main&quot;&gt;303858@main&lt;/a&gt;)  (125529396)&lt;/li&gt;
&lt;li&gt;Fixed handling of &lt;code&gt;@property&lt;/code&gt; registration so that the &lt;code&gt;initial-value&lt;/code&gt; descriptor can be optional. (&lt;a href=&quot;https://commits.webkit.org/303757@main&quot;&gt;303757@main&lt;/a&gt;)  (131288198)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;devicePixelRatio&lt;/code&gt; so that page zoom now affects the main frame consistently with iframes, keeping their values synchronized. (&lt;a href=&quot;https://commits.webkit.org/303397@main&quot;&gt;303397@main&lt;/a&gt;)  (163857955)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;line-height&lt;/code&gt; to correctly scale font-relative units when text zoom is applied. (&lt;a href=&quot;https://commits.webkit.org/304012@main&quot;&gt;304012@main&lt;/a&gt;)  (165073337)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;element.clientWidth&lt;/code&gt; and &lt;code&gt;element.clientHeight&lt;/code&gt; to correctly include padding for &lt;code&gt;content-box&lt;/code&gt; tables. (&lt;a href=&quot;https://commits.webkit.org/303641@main&quot;&gt;303641@main&lt;/a&gt;)  (165515755)&lt;/li&gt;
&lt;li&gt;Fixed: Refactored the handling of block-level boxes inside inline boxes. (&lt;a href=&quot;https://commits.webkit.org/303985@main&quot;&gt;303985@main&lt;/a&gt;)  (165523565)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;text-decoration: underline&lt;/code&gt; appeared higher than expected when &lt;code&gt;text-box-trim&lt;/code&gt; was applied to the root inline box. (&lt;a href=&quot;https://commits.webkit.org/303710@main&quot;&gt;303710@main&lt;/a&gt;)  (165614136)&lt;/li&gt;
&lt;li&gt;Fixed auto-placement cursor handling for spanning items in &lt;code&gt;grid-lanes&lt;/code&gt; layouts to correctly wrap within the valid range. (&lt;a href=&quot;https://commits.webkit.org/303815@main&quot;&gt;303815@main&lt;/a&gt;)  (165701659)&lt;/li&gt;
&lt;li&gt;Fixed an issue with grid lanes masonry layout where items with negative margins were incorrectly positioned too low by always taking the maximum running position. (&lt;a href=&quot;https://commits.webkit.org/303813@main&quot;&gt;303813@main&lt;/a&gt;)  (165718130)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;HTML&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;shadowrootcustomelementregistry&lt;/code&gt; attribute serialization to correctly compare ShadowRoot and document registries. (&lt;a href=&quot;https://commits.webkit.org/303841@main&quot;&gt;303841@main&lt;/a&gt;)  (165476421)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;JavaScript&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;Date&lt;/code&gt; constructor overflow handling so that invalid day values now return &lt;code&gt;NaN&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/303582@main&quot;&gt;303582@main&lt;/a&gt;)  (155776209)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;Intl.Locale.prototype.getWeekInfo()&lt;/code&gt; to remove the &lt;code&gt;minimalDays&lt;/code&gt; property for compliance with the specification. (&lt;a href=&quot;https://commits.webkit.org/303287@main&quot;&gt;303287@main&lt;/a&gt;)  (165083619)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;Intl.NumberFormat&lt;/code&gt; to properly apply &lt;code&gt;minimumFractionDigits&lt;/code&gt; and &lt;code&gt;maximumFractionDigits&lt;/code&gt; to ensure currency and compact notations behave correctly. (&lt;a href=&quot;https://commits.webkit.org/303943@main&quot;&gt;303943@main&lt;/a&gt;)  (165875014)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;MathML&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed default MathML rule thickness to use the font’s &lt;code&gt;underlineThickness&lt;/code&gt; metric with a zero fallback. (&lt;a href=&quot;https://commits.webkit.org/303108@main&quot;&gt;303108@main&lt;/a&gt;).  (164693673)&lt;/li&gt;
&lt;li&gt;Fixed painting empty &lt;code&gt;&amp;lt;msqrt&amp;gt;&lt;/code&gt; radical operator in MathML by removing an  incorrect check. (&lt;a href=&quot;https://commits.webkit.org/303134@main&quot;&gt;303134@main&lt;/a&gt;)  (164776629)&lt;/li&gt;
&lt;li&gt;Fixed MathML &lt;code&gt;&amp;lt;mpadded&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;mfrac&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;munderover&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;mover&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;mspace&amp;gt;&lt;/code&gt; elements not updating layout when attributes like &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;depth&lt;/code&gt;, &lt;code&gt;lspace&lt;/code&gt;, and &lt;code&gt;voffset&lt;/code&gt; etc. changed. (&lt;a href=&quot;https://commits.webkit.org/303508@main&quot;&gt;303508@main&lt;/a&gt;)  (164797996)&lt;/li&gt;
&lt;li&gt;Fixed MathML boolean attributes so they are now compared ASCII case-insensitively. (&lt;a href=&quot;https://commits.webkit.org/303107@main&quot;&gt;303107@main&lt;/a&gt;)  (164819048)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Media&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where Video Viewer UI elements overlapped or exited unexpectedly. (&lt;a href=&quot;https://commits.webkit.org/303256@main&quot;&gt;303256@main&lt;/a&gt;)  (164051864)&lt;/li&gt;
&lt;li&gt;Fixed an issue where WebM with VP9/Vorbis fallback would not play. (&lt;a href=&quot;https://commits.webkit.org/303100@main&quot;&gt;303100@main&lt;/a&gt;)  (164053503)&lt;/li&gt;
&lt;li&gt;Fixed an issue where empty &lt;code&gt;&amp;lt;track&amp;gt;&lt;/code&gt; elements prevented media from advancing its readyState and blocked &lt;code&gt;play()&lt;/code&gt; calls. (&lt;a href=&quot;https://commits.webkit.org/303314@main&quot;&gt;303314@main&lt;/a&gt;)  (164125914)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;MediaStreamTrackProcessor&lt;/code&gt; to respect &lt;code&gt;track.enabled = false&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/303389@main&quot;&gt;303389@main&lt;/a&gt;)  (165199900)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;ended&lt;/code&gt; event for Media Source Extensions might never fire by ensuring buffered ranges update correctly and playback gaps are observed even when the video does not start at time zero. (&lt;a href=&quot;https://commits.webkit.org/303596@main&quot;&gt;303596@main&lt;/a&gt;)  (165430052)&lt;/li&gt;
&lt;li&gt;Fixed an issue where caption previews were not shown in the default media controls. (&lt;a href=&quot;https://commits.webkit.org/304070@main&quot;&gt;304070@main&lt;/a&gt;)  (165931046)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SVG&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed SVG intrinsic sizing and &lt;code&gt;preferredAspectRatio()&lt;/code&gt; to correctly transpose dimensions for vertical writing modes. (&lt;a href=&quot;https://commits.webkit.org/303578@main&quot;&gt;303578@main&lt;/a&gt;)  (103262534)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;SVGLength&lt;/code&gt; parsing to correctly return the initial value when encountering parser errors or invalid values. (&lt;a href=&quot;https://commits.webkit.org/303577@main&quot;&gt;303577@main&lt;/a&gt;)  (136102554)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;SVGImage&lt;/code&gt; did not respect system dark mode changes. (&lt;a href=&quot;https://commits.webkit.org/303920@main&quot;&gt;303920@main&lt;/a&gt;)  (140661763)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;SVGLength.prototype.valueAsString&lt;/code&gt; to throw a &lt;code&gt;SyntaxError&lt;/code&gt; when assigned an empty string. (&lt;a href=&quot;https://commits.webkit.org/303594@main&quot;&gt;303594@main&lt;/a&gt;)  (165429393)&lt;/li&gt;
&lt;li&gt;Fixed an issue where lengths with leading or trailing whitespace failed to be parsed. (&lt;a href=&quot;https://commits.webkit.org/303951@main&quot;&gt;303951@main&lt;/a&gt;)  (165501190)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web API&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for &lt;code&gt;ReadableStream.getIterator()&lt;/code&gt; and the &lt;code&gt;[@@asyncIterator]&lt;/code&gt; methods to enable iteration over streams. (&lt;a href=&quot;https://commits.webkit.org/303970@main&quot;&gt;303970@main&lt;/a&gt;).  (96318671)&lt;/li&gt;
&lt;li&gt;Added support for the Keyboard Lock API. (&lt;a href=&quot;https://commits.webkit.org/303093@main&quot;&gt;303093@main&lt;/a&gt;)  (161422221)&lt;/li&gt;
&lt;li&gt;Added support for using readable byte streams as &lt;code&gt;fetch&lt;/code&gt; request and response bodies and enabling synchronous start behavior. (&lt;a href=&quot;https://commits.webkit.org/303115@main&quot;&gt;303115@main&lt;/a&gt;)  (162107262)&lt;/li&gt;
&lt;li&gt;Added support for &lt;code&gt;ReadableByteStream&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/303239@main&quot;&gt;303239@main&lt;/a&gt;)  (164877711)&lt;/li&gt;
&lt;li&gt;Added support for upgrading elements in &lt;code&gt;CustomElementRegistry.prototype.initialize&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/303250@main&quot;&gt;303250@main&lt;/a&gt;)  (165045530)&lt;/li&gt;
&lt;li&gt;Added support for the &lt;code&gt;customelementregistry&lt;/code&gt; content attribute and handling of &lt;code&gt;null&lt;/code&gt; &lt;code&gt;customElementRegistry&lt;/code&gt; values in &lt;code&gt;document.createElement&lt;/code&gt;, &lt;code&gt;document.createElementNS&lt;/code&gt;, and &lt;code&gt;element.attachShadow&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/303300@main&quot;&gt;303300@main&lt;/a&gt;)  (165096267)&lt;/li&gt;
&lt;li&gt;Expose &lt;code&gt;MediaDeviceInfo&lt;/code&gt; interface  in &lt;code&gt;SecureContext&lt;/code&gt; only as per web specification. (&lt;a href=&quot;https://commits.webkit.org/303512@main&quot;&gt;303512@main&lt;/a&gt;)  (165318702)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;scroll-margin&lt;/code&gt; from &lt;code&gt;IntersectionObserver&lt;/code&gt; incorrectly applied to scrollers inside cross-origin iframes. (&lt;a href=&quot;https://commits.webkit.org/303367@main&quot;&gt;303367@main&lt;/a&gt;)  (164994009)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;ReadableStream&lt;/code&gt; and &lt;code&gt;WritableStream&lt;/code&gt; to correctly pass abort and cancel reasons and improving &lt;code&gt;WebTransport&lt;/code&gt; stream handling. (&lt;a href=&quot;https://commits.webkit.org/303738@main&quot;&gt;303738@main&lt;/a&gt;)  (165474756)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web Authentication&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for the WebAuthn PRF extension that maps to the CTAP &lt;code&gt;hmac-secret&lt;/code&gt; extension, enabling credential-bound cryptographic secrets for both credential creation and authentication flows. (&lt;a href=&quot;https://commits.webkit.org/303406@main&quot;&gt;303406@main&lt;/a&gt;)  (113572812)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;excludeCredentials&lt;/code&gt; list was not sent to CTAP when its size was 1. (&lt;a href=&quot;https://commits.webkit.org/303120@main&quot;&gt;303120@main&lt;/a&gt;)  (164546088)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web Inspector&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for starting and stopping &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; recordings from the &lt;code&gt;console&lt;/code&gt; within a &lt;code&gt;Worker&lt;/code&gt; using &lt;code&gt;console.record()&lt;/code&gt; and &lt;code&gt;console.recordEnd()&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/303230@main&quot;&gt;303230@main&lt;/a&gt;)  (98223237)&lt;/li&gt;
&lt;li&gt;Added support in the Web Inspector Timelines Heap view to display the dominator object, if any, when viewing the shortest GC path. (&lt;a href=&quot;https://commits.webkit.org/303368@main&quot;&gt;303368@main&lt;/a&gt;)  (165177746)&lt;/li&gt;
&lt;li&gt;Added support for auto-completion of &lt;code&gt;sideways-lr&lt;/code&gt; and &lt;code&gt;sideways-rl&lt;/code&gt; values for the &lt;code&gt;writing-mode&lt;/code&gt; CSS property. (&lt;a href=&quot;https://commits.webkit.org/303884@main&quot;&gt;303884@main&lt;/a&gt;)  (165777054)&lt;/li&gt;
&lt;li&gt;Added support for auto-completion of &lt;code&gt;grid-lanes&lt;/code&gt; and &lt;code&gt;inline-grid-lanes&lt;/code&gt; values for the &lt;code&gt;display&lt;/code&gt; CSS property. (&lt;a href=&quot;https://commits.webkit.org/304001@main&quot;&gt;304001@main&lt;/a&gt;)  (165873256)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed incorrect breakpoint and search result positions in the Web Inspector after pretty-printing inline scripts containing multi-line template literals. (&lt;a href=&quot;https://commits.webkit.org/303680@main&quot;&gt;303680@main&lt;/a&gt;)  (29417859)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Console tab search bar in Web Inspector would disappear when the window was too narrow. (&lt;a href=&quot;https://commits.webkit.org/304057@main&quot;&gt;304057@main&lt;/a&gt;)  (50922509)&lt;/li&gt;
&lt;li&gt;Fixed an issue where breakpoints and search results in Web Inspector could point to the wrong location after a previously formatted source file was reopened in an unformatted state. (&lt;a href=&quot;https://commits.webkit.org/303327@main&quot;&gt;303327@main&lt;/a&gt;)  (165059693)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebRTC&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for capturing audio from multiple microphones on macOS with &lt;code&gt;getUserMedia&lt;/code&gt; while managing echo cancellation and dynamically migrating existing captures to non-VPIO units. (&lt;a href=&quot;https://commits.webkit.org/303113@main&quot;&gt;303113@main&lt;/a&gt;)  (163945062)&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Surfin&amp;rsquo; Safari</name>
			<uri>https://webkit.org</uri>
		</author>
		<source>
			<title type="html">Blog – WebKit</title>
			<subtitle type="html">Open Source Web Browser Engine</subtitle>
			<link rel="self" href="https://webkit.org/blog/feed/"/>
			<id>https://webkit.org/blog/feed/</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Pawel Lampe: WPE performance considerations: pre-rendering</title>
		<link href="https://blogs.igalia.com/plampe/wpe-performance-considerations-pre-rendering/"/>
		<id>https://blogs.igalia.com/plampe/wpe-performance-considerations-pre-rendering/</id>
		<updated>2025-12-19T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;This article is a continuation of the series on &lt;strong&gt;WPE performance considerations&lt;/strong&gt;. While the &lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-performance-considerations-dom-tree/&quot;&gt;previous article&lt;/a&gt; touched upon fairly low-level aspects of the DOM tree overhead,
this one focuses on more high-level problems related to managing the application’s workload over time. Similarly to before, the considerations and conclusions made in this blog post are strongly related to web applications
in the context of embedded devices, and hence the techniques presented should be used with extra care (and benchmarking) if one would like to apply those on desktop-class devices.&lt;/p&gt;
&lt;h2 id=&quot;the-workload&quot; tabindex=&quot;-1&quot;&gt;The workload &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-performance-considerations-pre-rendering/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Typical web applications on embedded devices have their workloads distributed over time in various ways. In practice, however, the workload distributions can usually be fitted into one of the following categories:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Idle applications with occasional updates&lt;/strong&gt; - the applications that present static content and are updated at very low intervals. As an example, one can think of some static dashboard that presents static content and switches
the page every, say, 60 seconds - such as e.g. a static departures/arrivals dashboard on the airport.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Idle applications with frequent updates&lt;/strong&gt; - the applications that present static content yet are updated frequently (or are presenting some dynamic content, such as animations occasionally). In that case, one can imagine a similar
airport departures/arrivals dashboard, yet with the animated page scrolling happening quite frequently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Active applications with occasional updates&lt;/strong&gt; - the applications that present some dynamic content (animations, multimedia, etc.), yet with major updates happening very rarely. An example one can think of in this case is an application
playing video along with presenting some metadata about it, and switching between other videos every few minutes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Active applications with frequent updates&lt;/strong&gt; - the applications that present some dynamic content and change the surroundings quite often. In this case, one can think of a stock market dashboard continuously animating the charts
and updating the presented real-time statistics very frequently.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Such workloads can be well demonstrated on charts plotting the browser’s CPU usage over time:&lt;/p&gt;
&lt;center&gt;
&lt;source type=&quot;image/avif&quot; /&gt;&lt;source type=&quot;image/webp&quot; /&gt;&lt;img alt=&quot;Typical web application workloads.&quot; height=&quot;360&quot; src=&quot;https://blogs.igalia.com/plampe/img/obgL44nHKc-1385.png&quot; width=&quot;1385&quot; /&gt;
&lt;/center&gt;
&lt;p&gt;As long as the peak workload (due to updates) is small, no negative effects are perceived by the end user. However, when the peak workload is significant, some negative effects may start getting noticeable.&lt;/p&gt;
&lt;p&gt;In case of applications from groups (1) and (2) mentioned above, a significant peak workload may not be a problem at all. As long as there are no continuous visual changes and no interaction is allowed during updates, the end-user
is unable to notice that the browser was not responsive or missed some frames for some period of time. In such cases, the application designer does not need to worry much about the workload.&lt;/p&gt;
&lt;p&gt;In other cases, especially the ones involving applications from groups (3) and (4) mentioned above, the significant peak workload may lead to visual stuttering, as any processing making the browser busy for longer than 16.6 milliseconds
will lead to lost frames. In such cases, the workload has to be managed in a way that the peaks are reduced either by optimizing them or distributing them over time.&lt;/p&gt;
&lt;h4 id=&quot;first-step-optimization&quot; tabindex=&quot;-1&quot;&gt;First step: optimization &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-performance-considerations-pre-rendering/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The first step to addressing the peak workload is usually optimization. Modern web platform gives a full variety of tools to optimize all the stages of web application processing done by the browser. The usual process of optimization is a
2-step cycle starting with measuring the bottlenecks and followed by fixing them. In the process, the usual improvements involve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;using CSS containment,&lt;/li&gt;
&lt;li&gt;using shadow DOM,&lt;/li&gt;
&lt;li&gt;promoting certain parts of the DOM to layers and manipulating them with transforms,&lt;/li&gt;
&lt;li&gt;parallelizing the work with workers/worklets,&lt;/li&gt;
&lt;li&gt;using the &lt;code&gt;visibility&lt;/code&gt; CSS property to separate painting from layout,&lt;/li&gt;
&lt;li&gt;optimizing the application itself (JavaScript code, the structure of the DOM, the architecture of the application),&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;second-step-pre-rendering&quot; tabindex=&quot;-1&quot;&gt;Second step: pre-rendering &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-performance-considerations-pre-rendering/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Unfortunately, in practice, it’s not uncommon that even very well optimized applications still have too much of a peak workload for the constrained embedded devices they’re used on. In such cases, the last resort solution is
&lt;strong&gt;pre-rendering&lt;/strong&gt;. As long as it’s possible from the application business-logic perspective, having at least some web page content pre-rendered is very helpful in situations when workload has to be managed, as &lt;strong&gt;pre-rendering&lt;/strong&gt;
allows the web application designer to choose the precise moment when the content should actually be rendered and how it should be done. With that, it’s possible to establish a proper trade-off between reduction in peak workload and
the amount of extra memory used for storing the pre-rendered contents.&lt;/p&gt;
&lt;h2 id=&quot;pre-rendering-techniques&quot; tabindex=&quot;-1&quot;&gt;Pre-rendering techniques &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-performance-considerations-pre-rendering/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nowadays, the web platform provides at lest a few widely-adapted APIs that provide means for the application to perform various kinds of pre-rendering. Also, due to the ways the browsers are implemented, some APIs can be purposely misused
to provide pre-rendering techniques not necessarily supported by the specification. However, in the pursuit of good trade-offs, all the possibilities should be taken into account.&lt;/p&gt;
&lt;p&gt;Before jumping into particular pre-rendering techniques, it’s necessary to emphasize that the &lt;strong&gt;pre-rendering&lt;/strong&gt; term used in this article refers to the actual rendering being done earlier than it’s visually presented. In that
sense, the resource is rasterized to some intermediate form when desired and then just composited by the browser engine’s compositor later.&lt;/p&gt;
&lt;h4 id=&quot;pre-rendering-offline&quot; tabindex=&quot;-1&quot;&gt;Pre-rendering offline &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-performance-considerations-pre-rendering/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The most basic (and limited at the same time) pre-rendering technique is one that involves rendering offline i.e. before the browser even starts. In that case, the first limitation is that the content to be rendered must be known
beforehand. If that’s the case, the rendering can be done in any way, and the result may be captured as e.g. raster or vector image (depending on the desired trade-off). However, the other problem is that such a rendering is usually out of
the given web application scope and thus requires extra effort. Moreover, depending on the situation, the amount of extra memory used, the longer web application startup (due to loading the pre-rendered resources), and the processing
power required to composite a given resource, it may not always be trivial to obtain the desired gains.&lt;/p&gt;
&lt;h4 id=&quot;pre-rendering-using-canvas&quot; tabindex=&quot;-1&quot;&gt;Pre-rendering using canvas &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-performance-considerations-pre-rendering/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The first group of actual pre-rendering techniques happening during web application runtime is related to &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API&quot;&gt;Canvas&lt;/a&gt; and
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas&quot;&gt;OffscreenCavas&lt;/a&gt;. Those APIs are really useful as they offer great flexibility in terms of usage and are usually very performant.
However, in this case, the natural downside is the lack of support for rendering the DOM inside the canvas. Moreover, canvas has a very limited support for painting text — unlike the DOM, where
CSS has a significant amount of features related to it. Interestingly, there’s an ongoing proposal called &lt;a href=&quot;https://github.com/WICG/html-in-canvas&quot;&gt;HTML-in-Canvas&lt;/a&gt; that could resolve those limitations
to some degree. In fact, Blink has a functioning prototype of it already. However, it may take a while before the spec is mature and widely adopted by other browser engines.&lt;/p&gt;
&lt;p&gt;When it comes to actual usage of canvas APIs for pre-rendering, the possibilities are numerous, and there are even more of them when combined with processing using &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API&quot;&gt;workers&lt;/a&gt;.
The most popular ones are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rendering to an invisible canvas and showing it later,&lt;/li&gt;
&lt;li&gt;rendering to a canvas detached from the DOM and attaching it later,&lt;/li&gt;
&lt;li&gt;rendering to an invisible/detached canvas and producing an image out of it to be shown later,&lt;/li&gt;
&lt;li&gt;rendering to an offscreen canvas and producing an image out of it to be shown later.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When combined with workers, some of the above techniques may be used in the worker threads with the rendered artifacts transferred to the main for presentation purposes. In that case, one must be careful with
the transfer itself, as some objects may get serialized, which is very costly. To avoid that, it’s recommended to use &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Transferable_objects&quot;&gt;transferable objects&lt;/a&gt;
and always perform a proper benchmarking to make sure the transfer is not involving serialization in the particular case.&lt;/p&gt;
&lt;p&gt;While the use of canvas APIs is usually very straightforward, one must be aware of two extra caveats.&lt;/p&gt;
&lt;p&gt;First of all, in the case of many techniques mentioned above, there is no guarantee that the browser will perform actual rasterization at the given point in time. To ensure the rasterization is triggered, it’s usually
necessary to enforce it using e.g. a dummy readback (&lt;code&gt;getImageData()&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Finally, one should be aware that the usage of canvas comes with some overhead. Therefore, creating many canvases or creating them often, may lead to performance problems that could outweigh the gains from the
pre-rendering itself.&lt;/p&gt;
&lt;h4 id=&quot;pre-rendering-using-eventually-invisible-layers&quot; tabindex=&quot;-1&quot;&gt;Pre-rendering using eventually-invisible layers &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-performance-considerations-pre-rendering/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The second group of pre-rendering techniques happening during web application runtime is limited to the DOM rendering and comes out of a combination of purposeful spec misuse and tricking the browser engine into making it rasterizing
on demand. As one can imagine, this group of techniques is very much browser-engine-specific. Therefore, it should always be backed by proper benchmarking of all the use cases on the target browsers and target hardware.&lt;/p&gt;
&lt;p&gt;In principle, all the techniques of this kind consist of 3 parts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enforcing the content to be pre-rendered being placed on a separate layer backed by an actual buffer internally in the browser,&lt;/li&gt;
&lt;li&gt;Tricking the browser’s compositor into thinking that the layer needs to be rasterized right away,&lt;/li&gt;
&lt;li&gt;Ensuring the layer won’t be composited eventually.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When all the elements are combined together, the browser engine will allocate an internal buffer (e.g. texture) to back the given DOM fragment, it will process that fragment (style recalc, layout), and rasterize it right away. It will do so
as it will not have enough information to allow delaying the rasterization of the layer (as e.g. in case of &lt;code&gt;display: none&lt;/code&gt;). Then, when the compositing time comes, the layer will turn out to be invisible in practice
due to e.g. being occluded, clipped, etc. This way, the rasterization will happen right away, but the results will remain invisible until a later time when the layer is made visible.&lt;/p&gt;
&lt;p&gt;In practice, the following approaches can be used to trigger the above behavior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;for &lt;strong&gt;(1)&lt;/strong&gt;, the CSS properties such as &lt;code&gt;will-change: transform&lt;/code&gt;, &lt;code&gt;z-index&lt;/code&gt;, &lt;code&gt;position: fixed&lt;/code&gt;, &lt;code&gt;overflow: hidden&lt;/code&gt; etc. can be used depending on the browser engine,&lt;/li&gt;
&lt;li&gt;for &lt;strong&gt;(2)&lt;/strong&gt; and &lt;strong&gt;(3)&lt;/strong&gt;, the CSS properties such as &lt;code&gt;opacity: 0&lt;/code&gt;, &lt;code&gt;overflow: hidden&lt;/code&gt;, &lt;code&gt;contain: strict&lt;/code&gt; etc. can be utilized, again, depending on the browser engine.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;The scrolling trick&lt;/h5&gt;
&lt;p&gt;While the above CSS properties allow for various combinations, in case of WPE WebKit in the context of embedded devices (tested on &lt;strong&gt;NXP i.MX8M Plus&lt;/strong&gt;), the combination that has proven to yield the best performance benefits turns
out to be a simple approach involving &lt;code&gt;overflow: hidden&lt;/code&gt; and scrolling. The example of such an approach is explained below.&lt;/p&gt;
&lt;p&gt;Suppose the goal of the application is to update a big table with numbers once every N frames — like in the following demo:
&lt;a href=&quot;https://scony.github.io/web-examples/text/random-numbers-bursting-in-table.html?cs=20&amp;amp;rs=20&amp;amp;if=59&quot;&gt;random-numbers-bursting-in-table.html?cs=20&amp;amp;rs=20&amp;amp;if=59&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;source type=&quot;image/avif&quot; /&gt;&lt;source type=&quot;image/webp&quot; /&gt;&lt;img alt=&quot;Bursting numbers demo.&quot; height=&quot;653&quot; src=&quot;https://blogs.igalia.com/plampe/img/0PwhZK5P7T-654.png&quot; width=&quot;654&quot; /&gt;
&lt;/center&gt;
&lt;p&gt;With the number of idle frames (&lt;code&gt;if&lt;/code&gt;) set to 59, the idea is that the application does nothing significant for the 59 frames, and then every 60th frame it updates all the numbers in the table.&lt;/p&gt;
&lt;p&gt;As one can imagine, on constrained embedded devices, such an approach leads to a very heavy workload during every 60th frame and hence to lost frames and unstable application’s FPS.&lt;/p&gt;
&lt;p&gt;As long as the numbers are available earlier than every 60th frame, the above application is a perfect example where pre-rendering could be used to reduce the peak workload.&lt;/p&gt;
&lt;p&gt;To simulate that, the 3 variants of the approach involving the &lt;strong&gt;scrolling trick&lt;/strong&gt; were prepared for comparison with the above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://scony.github.io/web-examples/text/random-numbers-bursting-in-table-prerendered-1.html?cs=20&amp;amp;rs=20&amp;amp;if=59&quot;&gt;random-numbers-bursting-in-table-prerendered-1.html?cs=20&amp;amp;rs=20&amp;amp;if=59&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://scony.github.io/web-examples/text/random-numbers-bursting-in-table-prerendered-2.html?cs=20&amp;amp;rs=20&amp;amp;if=59&quot;&gt;random-numbers-bursting-in-table-prerendered-2.html?cs=20&amp;amp;rs=20&amp;amp;if=59&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://scony.github.io/web-examples/text/random-numbers-bursting-in-table-prerendered-3.html?cs=20&amp;amp;rs=20&amp;amp;if=59&quot;&gt;random-numbers-bursting-in-table-prerendered-3.html?cs=20&amp;amp;rs=20&amp;amp;if=59&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the above demos, the idea is that each cell with a number becomes a scrollable container with 2 numbers actually — one above the other. In that case, because &lt;code&gt;overflow: hidden&lt;/code&gt; is set, only one of the numbers is visible while the
other is hidden — depending on the current scrolling:&lt;/p&gt;
&lt;center&gt;
&lt;source type=&quot;image/avif&quot; /&gt;&lt;source type=&quot;image/webp&quot; /&gt;&lt;img alt=&quot;Scrolling trick explained.&quot; height=&quot;348&quot; src=&quot;https://blogs.igalia.com/plampe/img/qFqjTXuuSo-611.png&quot; width=&quot;611&quot; /&gt;
&lt;/center&gt;
&lt;p&gt;With such a setup, it’s possible to update the invisible numbers during &lt;strong&gt;idle&lt;/strong&gt; frames without the user noticing. Due to how WPE WebKit accelerates the scrolling, changing the invisible
numbers, in practice, triggers the layout and rendering right away. Moreover, the actual rasterization to the buffer backing the scrollable container happens immediately (depending on the tiling settings), and hence the high cost of layout
and text rasterization can be distributed. When the time comes, and all the numbers need to be updated, the scrollable containers can be just scrolled, which in that case turns out to be ~2 times faster than updating all the numbers in place.&lt;/p&gt;
&lt;p&gt;To better understand the above effect, it’s recommended to compare the mark views from sysprof traces of the
&lt;a href=&quot;https://scony.github.io/web-examples/text/random-numbers-bursting-in-table.html?cs=10&amp;amp;rs=10&amp;amp;if=11&quot;&gt;random-numbers-bursting-in-table.html?cs=10&amp;amp;rs=10&amp;amp;if=11&lt;/a&gt; and
&lt;a href=&quot;https://scony.github.io/web-examples/text/random-numbers-bursting-in-table-prerendered-1.html?cs=10&amp;amp;rs=10&amp;amp;if=11&quot;&gt;random-numbers-bursting-in-table-prerendered-1.html?cs=10&amp;amp;rs=10&amp;amp;if=11&lt;/a&gt; demos:&lt;/p&gt;
&lt;center&gt;
&lt;source type=&quot;image/avif&quot; /&gt;&lt;source type=&quot;image/webp&quot; /&gt;&lt;img alt=&quot;Sysprof from basic demo.&quot; height=&quot;1169&quot; src=&quot;https://blogs.igalia.com/plampe/img/NVtyG7e_K1-2363.png&quot; width=&quot;2363&quot; /&gt;
&lt;/center&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;center&gt;
&lt;source type=&quot;image/avif&quot; /&gt;&lt;source type=&quot;image/webp&quot; /&gt;&lt;img alt=&quot;Sysprof from pre-rendering demo.&quot; height=&quot;1172&quot; src=&quot;https://blogs.igalia.com/plampe/img/6du_zbm-hI-2363.png&quot; width=&quot;2363&quot; /&gt;
&lt;/center&gt;
&lt;p&gt;While the first sysprof trace shows very little processing during 11 idle frames and a big chunk of processing (21 ms) every 12th frame, the second sysprof trace shows how the distribution of load looks. In
that case, the amount of work during 11 idle frames is much bigger (yet manageable), but at the same time, the formerly big chunk of processing every 12th frame is reduced almost 2 times (to 11 ms). Therefore, the overall
frame rate in the application is much better.&lt;/p&gt;
&lt;h5&gt;Results&lt;/h5&gt;
&lt;p&gt;Despite the above improvement speaking for itself, it’s worth summarizing the improvement with the benchmarking results of the above demos obtained from the &lt;strong&gt;NXP i.MX8M Plus&lt;/strong&gt; and presenting the application’s average
frames per second (FPS):&lt;/p&gt;
&lt;center&gt;
&lt;source type=&quot;image/avif&quot; /&gt;&lt;source type=&quot;image/webp&quot; /&gt;&lt;img alt=&quot;Benchmarking results.&quot; height=&quot;204&quot; src=&quot;https://blogs.igalia.com/plampe/img/YqNYgMaEpQ-1104.png&quot; width=&quot;1104&quot; /&gt;
&lt;/center&gt;
&lt;p&gt;Clearly, the positive impact of pre-rendering can be substantial depending on the conditions. In practice, when the rendered DOM fragment is more complex, the trick such as above can yield even better results.
However, due to how tiling works, the effect can be minimized if the content to be pre-rendered spans multiple tiles. In that case, the browser may defer rasterization until the tiles are actually needed. Therefore,
the above needs to be used with care and always with proper benchmarking.&lt;/p&gt;
&lt;h2 id=&quot;conclusions&quot; tabindex=&quot;-1&quot;&gt;Conclusions &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-performance-considerations-pre-rendering/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As demonstrated in the above sections, when it comes to pre-rendering the contents to distribute the web application workload over time, the web platform gives both the official APIs to do it, as well as unofficial
means through purposeful misuse of APIs and exploitation of browser engine implementations. While this article hasn’t covered all the possibilities available, the above should serve as a good initial read with some easy-to-try
solutions that may yield surprisingly good results. However, as some of the ideas mentioned above are very much browser-engine-specific, they should be used with extra care and with the limitations (lack of portability)
in mind.&lt;/p&gt;
&lt;p&gt;As the web platform constantly evolves, the pool of pre-rendering techniques and tricks should keep evolving as well. Also, as more and more web applications are used on embedded devices, more pressure should be
put on the specification, which should yield more APIs targeting the low-end devices in the future. With that in mind, it’s recommended for the readers to stay up-to-date with the latest specification and
perhaps even to get involved if some interesting use cases would be worth introducing new APIs.&lt;/p&gt;</content>
		<author>
			<name>Igalia WebKit</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #51</title>
		<link href="https://blogs.igalia.com/webkit/blog/2025/wip-51/"/>
		<id>https://blogs.igalia.com/webkit/blog/2025/wip-51/</id>
		<updated>2025-12-15T19:58:42+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from December 8 to December 15.&lt;/p&gt;
&lt;p&gt;
In this end-of-year special have a new GMallocString helper that makes
management of malloc-based strings more efficient, development releases,
and a handful of advancements on JSC&#x27;s implementation of Temporal, in
particular the PlainYearMonth class.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Added &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/55162&quot; rel=&quot;external&quot;&gt;GMallocString&lt;/a&gt; class to WTF to adopt UTF8 C strings and make them WebKit first class citizens efficiently (no copies). Applied in GStreamer code together with &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/51259&quot; rel=&quot;external&quot;&gt;other improvements by using CStringView&lt;/a&gt;. Fixed other &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/54312&quot; rel=&quot;external&quot;&gt;two&lt;/a&gt; &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/54762&quot; rel=&quot;external&quot;&gt;bugs&lt;/a&gt; about string management.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;javascriptcore-fish&quot;&gt;JavaScriptCore 🐟&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;The built-in JavaScript/ECMAScript engine for WebKit, also known as JSC or SquirrelFish.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;In JavaScriptCore&#x27;s implementation of Temporal, &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/55153&quot; rel=&quot;external&quot;&gt;added the &lt;code&gt;with&lt;/code&gt; method for &lt;code&gt;PlainYearMonth&lt;/code&gt; objects&lt;/a&gt;, as well as &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/55076&quot; rel=&quot;external&quot;&gt;the &lt;code&gt;equals&lt;/code&gt;, &lt;code&gt;compare&lt;/code&gt;, and &lt;code&gt;valueOf&lt;/code&gt; methods&lt;/a&gt;, &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/54800&quot; rel=&quot;external&quot;&gt;and also the &lt;code&gt;from&lt;/code&gt; method&lt;/a&gt;. Also &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/55201&quot; rel=&quot;external&quot;&gt;implemented the &lt;code&gt;toPlainDate&lt;/code&gt; method for PlainYearMonth objects&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases 📦️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Development releases of &lt;a href=&quot;https://webkitgtk.org/2025/12/09/webkitgtk2.51.3-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK 2.51.3&lt;/a&gt;
and &lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.51.3.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.51.3&lt;/a&gt;
are now available. These include a number of API additions and new features,
and are intended to allow interested parties to test those in advance, prior
to the next stable release series. As usual, bug reports are
&lt;a href=&quot;https://bugs.webkit.org/&quot; rel=&quot;external&quot;&gt;welcome in Bugzilla&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #50</title>
		<link href="https://blogs.igalia.com/webkit/blog/2025/wip-50/"/>
		<id>https://blogs.igalia.com/webkit/blog/2025/wip-50/</id>
		<updated>2025-12-08T20:26:32+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from December 1 to December 8.&lt;/p&gt;
&lt;p&gt;
In this edition of the periodical we have further advancements on
the Temporal implementation, support for Vivante super-tiled format,
and an adaptation of the DMA-BUF formats code to the Android port.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
&lt;h3 id=&quot;javascriptcore-fish&quot;&gt;JavaScriptCore 🐟&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;The built-in JavaScript/ECMAScript engine for WebKit, also known as JSC or SquirrelFish.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/WebKit/WebKit/pull/54717&quot; rel=&quot;external&quot;&gt;Implemented&lt;/a&gt; the &lt;code&gt;toString&lt;/code&gt;, &lt;code&gt;toJSON&lt;/code&gt;, and &lt;code&gt;toLocaleString&lt;/code&gt; methods for &lt;code&gt;PlainYearMonth&lt;/code&gt; objects in JavaScriptCore&#x27;s implementation of Temporal.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics 🖼️&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;code&gt;BitmapTexture&lt;/code&gt; and &lt;code&gt;TextureMapper&lt;/code&gt; &lt;a href=&quot;https://commits.webkit.org/303849@main&quot; rel=&quot;external&quot;&gt;were prepared&lt;/a&gt; to handle textures where the logical size (e.g. 100×100) differs from the allocated size (e.g. 128×128) due to alignment requirements. This allowed &lt;a href=&quot;https://commits.webkit.org/303900@main&quot; rel=&quot;external&quot;&gt;to add support&lt;/a&gt; for using memory-mapped GPU buffers in the Vivante super-tiled format available on i.MX platforms. Set &lt;code&gt;WEBKIT_SKIA_USE_VIVANTE_SUPER_TILED_TILE_TEXTURES=1&lt;/code&gt; to activate at runtime.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit 📟&lt;/h2&gt;
&lt;h3 id=&quot;wpe-platform-api-jigsaw&quot;&gt;WPE Platform API 🧩&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;New, modern platform API that supersedes usage of libwpe and WPE backends.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The &lt;code&gt;WPEBufferDMABufFormats&lt;/code&gt; class has been &lt;a href=&quot;https://commits.webkit.org/303891@main&quot; rel=&quot;external&quot;&gt;renamed&lt;/a&gt; to &lt;code&gt;WPEBufferFormats&lt;/code&gt;, as it can be used in situations where mechanisms other than DMA-BUF may be used for buffer sharing—on Android targets &lt;a href=&quot;https://developer.android.com/ndk/reference/group/a-hardware-buffer&quot; rel=&quot;external&quot;&gt;AHardwareBuffer&lt;/a&gt; is used instead, for example. The naming change involved also &lt;code&gt;WPEBufferFormatsBuilder&lt;/code&gt; (renamed from &lt;code&gt;WPEBufferDMABufFormatsBuilder&lt;/code&gt;), and methods and signals in other classes that use these types. Other than the renames, there is no change in functionality.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Enrique Ocaña: Meow: Process log text files as if you could make cat speak</title>
		<link href="https://eocanha.org/blog/2025/12/05/meow-process-log-text-files-as-if-you-could-make-cat-speak/"/>
		<id>https://eocanha.org/blog/?p=684</id>
		<updated>2025-12-05T11:16:07+00:00</updated>
		<content type="html">&lt;p&gt;Some years ago I had mentioned &lt;a href=&quot;https://eocanha.org/blog/2021/05/25/gstreamer-webkit-debugging-by-using-external-tools-2-2/&quot;&gt;some command line tools&lt;/a&gt; I used to analyze and find useful information on GStreamer logs. I&amp;#8217;ve been using them consistently along all these years, but some weeks ago I thought about unifying them in a single tool that could provide more flexibility in the mid term, and also as an excuse to unrust my Rust knowledge a bit. That&amp;#8217;s how I wrote Meow, a tool to make &lt;code&gt;cat&lt;/code&gt; speak (that is, to provide meaningful information).&lt;/p&gt;



&lt;p&gt;The idea is that you can &lt;code&gt;cat&lt;/code&gt; a file through &lt;code&gt;meow&lt;/code&gt; and apply the filters, like this:&lt;/p&gt;



&lt;p&gt;&lt;code&gt;cat /tmp/log.txt | meow appsinknewsample n:V0 n:video ht: \&lt;br /&gt;  ft:-0:00:21.466607596 &#x27;s:#([A-za-z][A-Za-z]*/)*#&#x27;&lt;/code&gt;&lt;/p&gt;



&lt;p&gt;which means &amp;#8220;select those lines that contain &lt;code&gt;appsinknewsample&lt;/code&gt; (with case insensitive matching), but don&amp;#8217;t contain &lt;code&gt;V0&lt;/code&gt; nor &lt;code&gt;video&lt;/code&gt; (that is, by exclusion, only that contain audio, probably because we&amp;#8217;ve analyzed both and realized that we should focus on audio for our specific problem), highlight the different thread ids, only show those lines with timestamp lower than 21.46 sec, and change strings like &lt;code&gt;Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp&lt;/code&gt; to become just &lt;code&gt;AppendPipeline.cpp&lt;/code&gt;&amp;#8220;, to get an output as shown in this terminal screenshot:&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;a href=&quot;https://eocanha.org/blog/wp-content/uploads/2025/12/image.png&quot;&gt;&lt;img alt=&quot;Screenshot of a terminal output showing multiple log lines. Some of them have the word &quot; height=&quot;254&quot; src=&quot;https://eocanha.org/blog/wp-content/uploads/2025/12/image-1024x254.png&quot; width=&quot;1024&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;Cool, isn&amp;#8217;t it? After all, I&amp;#8217;m convinced that the answer to any GStreamer bug is always hidden in the logs (or will be, as soon as I add &amp;#8220;&lt;em&gt;just a couple of log lines more, bro&lt;/em&gt;&amp;#8221; &lt;img alt=&quot;🤭&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/13.1.0/72x72/1f92d.png&quot; /&gt;).&lt;/p&gt;



&lt;p&gt;Currently, meow supports this set of manipulation commands:&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Word filter and highlighting by regular expression&lt;/strong&gt; (&lt;code&gt;fc:REGEX&lt;/code&gt;, or just &lt;code&gt;REGEX&lt;/code&gt;): Every expression will highlight its matched words in a different color.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Filtering without highlighting&lt;/strong&gt; (&lt;code&gt;fn:REGEX&lt;/code&gt;): Same as &lt;code&gt;fc:&lt;/code&gt;, but without highlighting the matched string. This is useful for those times when you want to match lines that have two expressions (&lt;code&gt;E1&lt;/code&gt;, &lt;code&gt;E2&lt;/code&gt;) but the highlighting would pollute the line too much. In those case you can use a regex such as &lt;code&gt;E1.*E2&lt;/code&gt; and then highlight the subexpressions manually later with an &lt;code&gt;h:&lt;/code&gt; rule.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Negative filter&lt;/strong&gt; (&lt;code&gt;n:REGEX&lt;/code&gt;): Selects only the lines that don&amp;#8217;t match the regex filter. No highlighting.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Highlight with no filter&lt;/strong&gt; (&lt;code&gt;h:REGEX&lt;/code&gt;): Doesn&amp;#8217;t discard any line, just highlights the specified regex.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Substitution&lt;/strong&gt; (&lt;code&gt;s:/REGEX/REPLACE&lt;/code&gt;): Replaces one pattern for another. Any other delimiter character can be used instead of /, it that&amp;#8217;s more convenient to the user (for instance, using # when dealing with expressions to manipulate paths).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Time filter&lt;/strong&gt; (&lt;code&gt;ft:TIME-TIME&lt;/code&gt;): Assuming the lines start with a GStreamer log timestamp, this filter selects only the lines between the target start and end time. Any of the time arguments (or both) can be omitted, but the &lt;code&gt;-&lt;/code&gt; delimiter must be present. Specifying multiple time filters will generate matches that fit on any of the time ranges, but overlapping ranges can trigger undefined behaviour.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Highlight threads&lt;/strong&gt; (&lt;code&gt;ht:&lt;/code&gt;): Assuming a GStreamer log, where the thread id appears as the third word in the line, highlights each thread in a different color.&lt;/li&gt;&lt;/ul&gt;



&lt;p&gt;The &lt;code&gt;REGEX&lt;/code&gt; pattern is a regular expression. All the matches are case insensitive. When used for substitutions, capture groups can be defined as &lt;code&gt;(?&lt;span class=&quot;has-inline-color has-medium-pink-color&quot;&gt;CAPTURE_NAME&lt;/span&gt;REGEX)&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;The &lt;code&gt;REPLACE&lt;/code&gt;ment string is the text that the &lt;code&gt;REGEX&lt;/code&gt; will be replaced by when doing substitutions. Text captured by a named capture group can be referred to by &lt;code&gt;${&lt;span class=&quot;has-inline-color has-medium-pink-color&quot;&gt;CAPTURE_NAME&lt;/span&gt;}&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;The &lt;code&gt;TIME&lt;/code&gt; pattern can be any sequence of numbers, &lt;code&gt;:&lt;/code&gt; or &lt;code&gt;.&lt;/code&gt; . Typically, it will be a GStreamer timestamp (eg: 0:01:10.881123150), but it can actually be any other numerical sequence. Times are compared lexicographically, so it&amp;#8217;s important that all of them have the same string length.&lt;/p&gt;



&lt;p&gt;The filtering algorithm has a custom set of priorities for operations, so that they get executed in an intuitive order. For instance, a sequence of filter matching expressions (&lt;code&gt;fc:&lt;/code&gt;, &lt;code&gt;fn:&lt;/code&gt;) will have the same priority (that is, any of them will let a text line pass if it matches, not forbidding any of the lines already allowed by sibling expressions), while a negative filter will only be applied on the results left by the sequence of filters before it. Substitutions will be applied at their specific position (not before or after), and will therefore modify the line in a way that can alter the matching of subsequent filters. In general, the user doesn&amp;#8217;t have to worry about any of this, because the rules are designed to generate the result that you would expect.&lt;/p&gt;



&lt;p&gt;Now some practical examples:&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Example 1&lt;/strong&gt;: Select lines with the word &amp;#8220;one&amp;#8221;, or the word &amp;#8220;orange&amp;#8221;, or a number, highlighting each pattern in a different color except the number, which will have no color:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ cat file.txt | meow one fc:orange &#x27;fn:[0-9][0-9]*&#x27;&lt;br /&gt;000 &lt;span class=&quot;has-inline-color has-medium-pink-color&quot;&gt;one&lt;/span&gt; small &lt;span class=&quot;has-inline-color has-yellow-color&quot;&gt;orange&lt;/span&gt;&lt;br /&gt;005 &lt;span class=&quot;has-inline-color has-medium-pink-color&quot;&gt;one&lt;/span&gt; big &lt;span class=&quot;has-inline-color has-yellow-color&quot;&gt;orange&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Example 2&lt;/strong&gt;: Assuming a pictures filename listing, select filenames not ending in &amp;#8220;jpg&amp;#8221; nor in &amp;#8220;jpeg&amp;#8221;, and rename the filename to &amp;#8220;.bak&amp;#8221;, preserving the extension at the end:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ cat list.txt | meow  &#x27;n:jpe?g&#x27; \&lt;/code&gt;&lt;br /&gt;&lt;code&gt; &lt;/code&gt;  &lt;code&gt;&#x27;s:#^(?&amp;lt;f&gt;[^.]*)(?&amp;lt;e&gt;[.].*)$#${f}.bak${e}&#x27;&lt;br /&gt;train.bak.png&lt;br /&gt;sunset.bak.gif&lt;/code&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Example 3&lt;/strong&gt;: Only print the log lines with times between 0:00:24.787450146 and 0:00:24.790741865 or those at 0:00:30.492576587 or after, and highlight every thread in a different color:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ cat log.txt | meow ft:0:00:24.787450146-0:00:24.790741865 \&lt;br /&gt; &lt;/code&gt;  &lt;code&gt;ft:0:00:30.492576587- ht:&lt;br /&gt;0:00:24.787450146 739 &lt;span class=&quot;has-inline-color has-medium-pink-color&quot;&gt;0x1ee2320&lt;/span&gt; DEBUG …&lt;br /&gt;0:00:24.790382735 739 &lt;span class=&quot;has-inline-color has-yellow-color&quot;&gt;0x1f01598&lt;/span&gt; INFO …&lt;br /&gt;0:00:24.790741865 739 &lt;span class=&quot;has-inline-color has-medium-pink-color&quot;&gt;0x1ee2320&lt;/span&gt; DEBUG …&lt;br /&gt;0:00:30.492576587 739 &lt;span class=&quot;has-inline-color has-yellow-color&quot;&gt;0x1f01598&lt;/span&gt; DEBUG …&lt;br /&gt;0:00:31.938743646 739 &lt;span class=&quot;has-inline-color has-yellow-color&quot;&gt;0x1f01598&lt;/span&gt; ERROR …&lt;/code&gt;&lt;/p&gt;



&lt;p&gt;This is only the begining. I have great ideas for this new tool (as time allows), such as support for parenthesis (so the expressions can be grouped), or call stack indentation on logs generated by tracers, in a similar way to what Alicia&amp;#8217;s &lt;a href=&quot;https://github.com/ntrrgc/dotfiles/blob/master/bin/gst-log-indent-tracers&quot;&gt;&lt;code&gt;gst-log-indent-tracers&lt;/code&gt; tool&lt;/a&gt; does. I might also predefine some common expressions to use in regular expressions, such as the ones to match paths (so that the user doesn&amp;#8217;t have to think about them and reinvent the wheel every time). Anyway, these are only ideas. Only time and hyperfocus slots will tell&amp;#8230;&lt;/p&gt;



&lt;p&gt;By now, you can &lt;a href=&quot;https://github.com/eocanha/meow&quot;&gt;find the source code on my github&lt;/a&gt;. Meow! &lt;img alt=&quot;&quot; class=&quot;wp-image-698&quot; height=&quot;128&quot; src=&quot;https://eocanha.org/blog/wp-content/uploads/2025/12/blobcat.png&quot; width=&quot;128&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>eocanha</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #49</title>
		<link href="https://blogs.igalia.com/webkit/blog/2025/wip-49/"/>
		<id>https://blogs.igalia.com/webkit/blog/2025/wip-49/</id>
		<updated>2025-12-02T14:15:36+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from November 24 to December 1.&lt;/p&gt;
&lt;p&gt;
The main highlights for this week are the completion of `PlainMonthDay`
in Temporal, moving networking access for GstWebRTC to the WebProcess,
and Xbox Cloud Gaming now working in the GTK and WPE ports.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
&lt;h3 id=&quot;multimedia-movie-camera&quot;&gt;Multimedia 🎥&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;GStreamer-based multimedia support for WebKit, including (but not limited to)
playback, capture, WebAudio, WebCodecs, and WebRTC.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://xbox.com/play&quot; rel=&quot;external&quot;&gt;Xbox Cloud Gaming&lt;/a&gt; is now usable in WebKitGTK and WPE
with the GstWebRTC backend, we had to fix &lt;a href=&quot;https://commits.webkit.org/303668@main&quot; rel=&quot;external&quot;&gt;non-spec compliant ICE candidates
handling&lt;/a&gt; and add a &lt;a href=&quot;https://commits.webkit.org/303669@main&quot; rel=&quot;external&quot;&gt;WebRTC quirk
forcing &lt;code&gt;max-bundle&lt;/code&gt; in PeerConnections&lt;/a&gt;
to make it work. Happy cloud gaming!&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Support for remote inbound RTP statistics was improved in
&lt;a href=&quot;https://commits.webkit.org/303671@main&quot; rel=&quot;external&quot;&gt;303671@main&lt;/a&gt;, we now properly report
&lt;code&gt;framesPerSecond&lt;/code&gt; and &lt;code&gt;totalDecodeTime&lt;/code&gt; metrics, those fields are used in the
Xbox Cloud Gaming service to show live stats about the connection and video
decoder performance in an overlay.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The GstWebRTC backend now relies on
&lt;a href=&quot;https://github.com/ystreet/librice&quot; rel=&quot;external&quot;&gt;librice&lt;/a&gt; for its
&lt;a href=&quot;https://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment&quot; rel=&quot;external&quot;&gt;ICE&lt;/a&gt;.
The Sans-IO architecture of librice allows us to keep the WebProcess sandboxed
and to route WebRTC-related UDP and (eventually) TCP packets using the
NetworkProcess. This work landed in
&lt;a href=&quot;https://commits.webkit.org/303623@main&quot; rel=&quot;external&quot;&gt;303623@main&lt;/a&gt;. The GNOME SDK should
also soon &lt;a href=&quot;https://gitlab.gnome.org/GNOME/gnome-build-meta/-/merge_requests/4146&quot; rel=&quot;external&quot;&gt;ship
librice&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Support for seeking in &lt;code&gt;loop&lt;/code&gt;ing videos was fixed in
&lt;a href=&quot;https://commits.webkit.org/303539@main&quot; rel=&quot;external&quot;&gt;303539@main&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;javascriptcore-fish&quot;&gt;JavaScriptCore 🐟&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;The built-in JavaScript/ECMAScript engine for WebKit, also known as JSC or SquirrelFish.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Implemented the &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/54563&quot; rel=&quot;external&quot;&gt;&lt;code&gt;valueOf&lt;/code&gt;&lt;/a&gt; and
&lt;a href=&quot;https://github.com/WebKit/WebKit/pull/54342&quot; rel=&quot;external&quot;&gt;&lt;code&gt;toPlainDate&lt;/code&gt;&lt;/a&gt; for &lt;code&gt;PlainMonthDay&lt;/code&gt; objects.
This completes the implementation of
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal&quot; rel=&quot;external&quot;&gt;Temporal&lt;/a&gt;
&lt;code&gt;PlainMonthDay&lt;/code&gt; objects in JSC!&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;webkitgtk-desktop&quot;&gt;WebKitGTK 🖥️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The GTK port has &lt;a href=&quot;https://commits.webkit.org/303532@main&quot; rel=&quot;external&quot;&gt;gained support&lt;/a&gt; for
interpreting touch input as &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events&quot; rel=&quot;external&quot;&gt;pointer
events&lt;/a&gt;. This
matches the behaviour of other browsers by following the corresponding
specifications.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit 📟&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/WebKit/WebKit/pull/54398&quot; rel=&quot;external&quot;&gt;Fixed&lt;/a&gt; an issue that prevented
WPE from processing further input events after receiving a secondary mouse
button press.&lt;/p&gt;
  &lt;/div&gt;
	&lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/303518@main&quot; rel=&quot;external&quot;&gt;Fixed&lt;/a&gt; an issue that caused right
mouse button clicks to prevent processing of further pointer events.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;wpe-platform-api-jigsaw&quot;&gt;WPE Platform API 🧩&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;New, modern platform API that supersedes usage of libwpe and WPE backends.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;We landed a &lt;a href=&quot;https://commits.webkit.org/303531@main&quot; rel=&quot;external&quot;&gt;patch&lt;/a&gt; to add a new signal
in &lt;code&gt;WPEDisplay&lt;/code&gt; to notify when the connection to the native display has been lost.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;infrastructure-construction-site&quot;&gt;Infrastructure 🏗️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Modernized the CMake modules used to find
&lt;a href=&quot;https://commits.webkit.org/303333@main&quot; rel=&quot;external&quot;&gt;libtasn1&lt;/a&gt;,
&lt;a href=&quot;https://commits.webkit.org/303341@main&quot; rel=&quot;external&quot;&gt;libsecret&lt;/a&gt;,
&lt;a href=&quot;https://commits.webkit.org/303118@main&quot; rel=&quot;external&quot;&gt;libxkbcommon&lt;/a&gt;,
&lt;a href=&quot;https://commits.webkit.org/303127@main&quot; rel=&quot;external&quot;&gt;libhyphen&lt;/a&gt;, and
&lt;a href=&quot;https://commits.webkit.org/303387@main&quot; rel=&quot;external&quot;&gt;Enchant&lt;/a&gt; libraries.&lt;/p&gt;
&lt;p&gt;Note that this work removed the support for building against
&lt;a href=&quot;https://rrthomas.github.io/enchant/&quot; rel=&quot;external&quot;&gt;Enchant&lt;/a&gt; 1.x, and only version 2 will be
supported. The first stable release to require Enchant 2.x will be 2.52.0 due
in March 2026. Major Linux and BSD distributions have included Enchant 2
packages for years, and therefore this change is not expected to cause any
trouble. The Enchant library is used by the GTK port for spell checking.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;community-events-handshake&quot;&gt;Community &amp;amp; Events 🤝&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;We have published &lt;a href=&quot;https://conflor.es/blog/2025-11-27-interop-and-mathml/&quot; rel=&quot;external&quot;&gt;an
article&lt;/a&gt; detailing our
work making &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/MathML&quot; rel=&quot;external&quot;&gt;MathML&lt;/a&gt;
interoperable across browser engines! It has live demonstrations and feature
tables with our progress on WebKit support.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;We have published new blogs post highlighting the most important changes in
both &lt;a href=&quot;https://wpewebkit.org/blog/2025-11-27-wpewebkit-2.50.html&quot; rel=&quot;external&quot;&gt;WPE WebKit&lt;/a&gt;
and &lt;a href=&quot;https://webkitgtk.org/2025/11/26/webkitgtk-2.50.html&quot; rel=&quot;external&quot;&gt;WebKitGTK&lt;/a&gt; 2.50.
Enjoy!&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WPE WebKit Blog: Highlights of the WPE WebKit 2.50 release series</title>
		<link href="https://wpewebkit.org/blog/2025-11-27-wpewebkit-2.50.html"/>
		<id>https://wpewebkit.org/blog/2025-11-27-wpewebkit-2.50.html</id>
		<updated>2025-11-27T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;This fall, the WPE WebKit team has released the 2.50 series of the Web engine after six months of hard work. Let’s have a deeper look at some of the most interesting changes in this release series!&lt;/p&gt;
&lt;h2 id=&quot;improved-rendering-performance&quot; tabindex=&quot;-1&quot;&gt;Improved rendering performance&lt;/h2&gt;
&lt;p&gt;For this series, the threaded rendering implementation has been switched to use the Skia API. What has changed is the way we record the painting commands for each layer. Previously we used WebCore’s built-in mechanism (&lt;code&gt;DisplayList&lt;/code&gt;) which is not thread-safe, and led to obscure rendering issues in release builds and/or sporadic assertions in debug builds when replaying the display lists in threads other than the main one. The &lt;code&gt;DisplayList&lt;/code&gt; usage was replaced with &lt;code&gt;SkPictureRecorder&lt;/code&gt;, Skia’s built-in facility, that provides similar functionality but in a thread-safe manner. Using the Skia API, we can leverage multithreading in a reliable way to replay recorded drawing commands in different worker threads, improving rendering performance.&lt;/p&gt;
&lt;p&gt;An experimental hybrid rendering mode has also been added. In this mode, WPE WebKit will attempt to use GPU worker threads for rendering but, if these are busy, CPU worker threads will be used whenever possible. This rendering mode is still under investigation, as it is unclear whether the improvements are substantial enough to justify the extra complexity.&lt;/p&gt;
&lt;p&gt;Damage propagation to the system compositor, which was added during the 2.48 cycle but remained disabled by default, has now been enabled. The system compositor may now leverage the damage information for further optimization.&lt;/p&gt;
&lt;p&gt;Vertical writing-mode rendering has also received improvements for this release series.&lt;/p&gt;
&lt;h2 id=&quot;changes-in-multimedia-support&quot; tabindex=&quot;-1&quot;&gt;Changes in Multimedia support&lt;/h2&gt;
&lt;p&gt;When available in the system, WebKit can now leverage the XDG desktop portal for accessing capture devices (like cameras) so that no specific sandbox exception is required. This provides secure access to capture devices in browser applications that use WPE WebKit.&lt;/p&gt;
&lt;p&gt;Managed Media Source support has been enabled. This potentially improves multimedia playback, for example in mobile devices, by allowing the user agent to react to changes in memory and CPU availability.&lt;/p&gt;
&lt;p&gt;Transcoding is now using the GStreamer built-in &lt;code&gt;uritranscodebin&lt;/code&gt; element instead of GstTranscoder, which improves stability of the media recording that needs transcoding.&lt;/p&gt;
&lt;p&gt;SVT-AV1 encoder support has been added to the media backend.&lt;/p&gt;
&lt;h2 id=&quot;webxr-support&quot; tabindex=&quot;-1&quot;&gt;WebXR support&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API/Fundamentals&quot;&gt;WebXR&lt;/a&gt; implementation had been stagnating since it was first introduced, and had a number of shortcomings. This was removed in favor of a new implementation, also built using &lt;a href=&quot;https://www.khronos.org/openxr/&quot;&gt;OpenXR&lt;/a&gt;, that better adapts to the multiprocess architecture of WebKit.&lt;/p&gt;
&lt;p&gt;This feature is considered experimental in 2.50, and while it is complete enough to load and display a number of immersive experiences, a number of improvements and optional features continue to be actively developed. Therefore, WebXR support needs to be enabled at build time with the &lt;code&gt;ENABLE_WEBXR=ON&lt;/code&gt; CMake option.&lt;/p&gt;
&lt;h2 id=&quot;android-support&quot; tabindex=&quot;-1&quot;&gt;Android support&lt;/h2&gt;
&lt;p&gt;Support for Android targets has been greatly improved. It is now possible to build WPE WebKit without the need for additional patches when using the libwpe-based &lt;a href=&quot;https://github.com/Igalia/WPEBackend-android&quot;&gt;WPEBackend-android&lt;/a&gt;. This was achieved by incorporating changes that make WebKit use more appropriate defaults (like disabling &lt;code&gt;MediaSession&lt;/code&gt;) or using platform-specific features (like &lt;a href=&quot;https://developer.android.com/ndk/reference/group/memory&quot;&gt;ASharedMemory&lt;/a&gt; and &lt;a href=&quot;https://developer.android.com/ndk/reference/group/a-hardware-buffer&quot;&gt;AHardwareBuffer&lt;/a&gt;) when targeting Android.&lt;/p&gt;
&lt;p&gt;The WebKit logging system has gained support to use &lt;a href=&quot;https://wpewebkit.org/reference/2.50.0/wpe-webkit-2.0/android.html&quot;&gt;the Android &lt;code&gt;logd&lt;/code&gt; service&lt;/a&gt;. This is particularly useful for both WebKit and application developers, allowing to configure logging channels at runtime in &lt;em&gt;any&lt;/em&gt; WPE WebKit build. For example, the following commands may be used before launching an application to debug WebGL setup and multimedia playback errors:&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;adb setprop log.tag.WPEWebKit VERBOSE   &lt;span class=&quot;token comment&quot;&gt;# Global logging filter&lt;/span&gt;
adb setprop debug.WPEWebKit.log &lt;span class=&quot;token string&quot;&gt;&#x27;WebGL,Media=error&#x27;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Channels&lt;/span&gt;
adb logcat &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; WPEWebKit                   &lt;span class=&quot;token comment&quot;&gt;# Follow log messages&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There is an ongoing effort to enable the WPEPlatform API on Android, and while it builds now, rendering is not yet working.&lt;/p&gt;
&lt;h2 id=&quot;web-platform-support&quot; tabindex=&quot;-1&quot;&gt;Web Platform support&lt;/h2&gt;
&lt;p&gt;As usual, changes in this area are extensive as WebKit constantly adopts, improves, and supports new Web Platform features. However, some interesting additions in this release cycle include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The new &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/CookieStore&quot;&gt;CookieStore API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ManagedMediaSource&quot;&gt;ManagedMediaSource&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;CSS &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/container-progress&quot;&gt;container-progress()&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;CSS &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/text-wrap-style&quot;&gt;text-wrap-style: pretty&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;CSS &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/font-family&quot;&gt;font-family: math&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;CSS Animation: support for the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Animation/overallProgress&quot;&gt;overallProgress property&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;HTML &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details#creating_an_auto-expanding_details_element&quot;&gt;auto-expanding &amp;lt;details&amp;gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;CSS &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/hidden&quot;&gt;hidden=“until-found”&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;api-changes&quot; tabindex=&quot;-1&quot;&gt;API changes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://wpewebkit.org/reference/2.50.0/wpe-webkit-2.0/property.Settings.enable-hyperlink-auditing.html&quot;&gt;WebKitSettings:enable-hyperlink-auditing&lt;/a&gt; option has been deprecated. This feature is now always enabled.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://wpewebkit.org/reference/2.50.0/wpe-webkit-2.0/method.WebView.get_theme_color.html&quot;&gt;&lt;code&gt;webkit_web_view_get_theme_color()&lt;/code&gt;&lt;/a&gt; function has been added to allow querying the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/meta/name/theme-color&quot;&gt;theme color&lt;/a&gt; declared by the content loaded in a web view. The corresponding &lt;a href=&quot;https://wpewebkit.org/reference/2.50.0/wpe-webkit-2.0/property.WebView.theme-color.html&quot;&gt;WebKitWebView:theme-color&lt;/a&gt; property is available as well, which allows using the &lt;a href=&quot;https://docs.gtk.org/gobject/vfunc.Object.notify.html&quot;&gt;&lt;code&gt;notify&lt;/code&gt; signal&lt;/a&gt; to watch for theme color changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;wpeplatform&quot; tabindex=&quot;-1&quot;&gt;WPEPlatform&lt;/h3&gt;
&lt;p&gt;Work continues on the new WPEPlatform API, which is still shipped as a preview feature in the 2.50 and needs to be explicitly enabled at build time with the &lt;code&gt;ENABLE_WPE_PLATFORM=ON&lt;/code&gt; CMake option. The API may still change and applications developed using WPEPlatform are likely to need changes with future WPE WebKit releases; but not for long: the current goal is to have it ready and enabled by default for the upcoming 2.52 series.&lt;/p&gt;
&lt;p&gt;One of the main changes is that WPEPlatform now gets built into &lt;code&gt;libWPEWebKit&lt;/code&gt;. The rationale for this change is avoiding shipping two copies of shared code from the Web Template Framework (WTF), which saves both disk and memory space usage. The &lt;code&gt;wpe-platform-2.0&lt;/code&gt; pkg-config module is still shipped, which allows application developers to know whether WPEPlatform support has been built into WPE WebKit.&lt;/p&gt;
&lt;p&gt;The abstract base class &lt;code&gt;WPEScreenSyncObserver&lt;/code&gt; has been introduced, and allows platform implementations to notify on display synchronization, allowing WebKit to better pace rendering.&lt;/p&gt;
&lt;p&gt;WPEPlatform has gained support for controllers like gamepads and joysticks through the new &lt;code&gt;WPEGamepadManager&lt;/code&gt; and &lt;code&gt;WPEGamepad&lt;/code&gt; classes. When building with the &lt;code&gt;ENABLE_MANETTE=ON&lt;/code&gt; CMake option a built-in implementation based on &lt;a href=&quot;https://gnome.pages.gitlab.gnome.org/libmanette/&quot;&gt;libmanette&lt;/a&gt; is used by default, if a custom one is not specified.&lt;/p&gt;
&lt;p&gt;WPEPlatform now includes a new &lt;code&gt;WPEBufferAndroid&lt;/code&gt; class, used to represent graphics buffers backed by &lt;a href=&quot;https://developer.android.com/ndk/reference/group/a-hardware-buffer&quot;&gt;AHardwareBuffer&lt;/a&gt;. These buffers support being imported into an &lt;code&gt;EGLImage&lt;/code&gt; using &lt;code&gt;wpe_buffer_import_to_egl_image()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;As part of the work to improve Android support, the buffer rendering and release fences have been moved from &lt;code&gt;WPEBufferDMABuf&lt;/code&gt; to the base class, &lt;code&gt;WPEBuffer&lt;/code&gt;. This is leveraged by &lt;code&gt;WPEBufferAndroid&lt;/code&gt;, and should be helpful if more buffer types are introduced in the future.&lt;/p&gt;
&lt;p&gt;Other additions include clipboard support, &lt;a href=&quot;https://www.w3.org/TR/mediaqueries-4/#mf-interaction&quot;&gt;Interaction Media Features&lt;/a&gt;, and an accessibility implementation using &lt;a href=&quot;https://gitlab.gnome.org/Archive/atk&quot;&gt;ATK&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what%E2%80%99s-new-for-webkit-developers%3F&quot; tabindex=&quot;-1&quot;&gt;What’s new for WebKit developers?&lt;/h2&gt;
&lt;p&gt;WebKit now supports sending tracing marks and counters to &lt;a href=&quot;https://gitlab.gnome.org/GNOME/sysprof/&quot;&gt;Sysprof&lt;/a&gt;. Marks indicate when certain events occur and their duration; while counters track variables over time. Together, these allow developers to find performance bottlenecks and monitor internal WebKit performance metrics like frame rates, memory usage, and more. This integration enables developers to analyze the performance of applications, including data for WebKit alongside system-level metrics, in a unified view. For more details see &lt;a href=&quot;https://feaneron.com/2025/09/08/marks-and-counters-in-sysprof/&quot;&gt;this article&lt;/a&gt;, which also details how Sysprof was improved to handle the massive amounts of data produced by WebKit.&lt;/p&gt;
&lt;p&gt;Finally, GCC 12.2 is now the minimum required version to build WPE WebKit. Increasing the minimum compiler version allows us to remove obsolete code and focus on improving code quality, while taking advantage of new C++ and compiler features.&lt;/p&gt;
&lt;h2 id=&quot;looking-forward-to-2.52&quot; tabindex=&quot;-1&quot;&gt;Looking forward to 2.52&lt;/h2&gt;
&lt;p&gt;The 2.52 release series will bring even more improvements, and we expect it to be released during the spring of 2026. Until then!&lt;/p&gt;</content>
		<author>
			<name>Igalia WebKit</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #48</title>
		<link href="https://blogs.igalia.com/webkit/blog/2025/wip-48/"/>
		<id>https://blogs.igalia.com/webkit/blog/2025/wip-48/</id>
		<updated>2025-11-24T20:12:28+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from November 17 to November 24.&lt;/p&gt;
&lt;p&gt;
In this week&#x27;s rendition, the WebView snapshot API was enabled on the WPE
port, further progress on the Temporal and Trusted Types implementations,
and the release of WebKitGTK and WPE WebKit 2.50.2.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;A WebKitImage-based implementation of WebView snapshot &lt;a href=&quot;https://commits.webkit.org/303449@main&quot; rel=&quot;external&quot;&gt;landed&lt;/a&gt; this week, enabling this feature on WPE when it was previously only available in GTK. This means you can now use &lt;code&gt;webkit_web_view_get_snapshot&lt;/code&gt; (and &lt;code&gt;webkit_web_view_get_snapshot_finish&lt;/code&gt;) to get a WebKitImage-representation of your screenshot.&lt;/p&gt;
&lt;p&gt;WebKitImage implements the &lt;code&gt;GLoadableIcon&lt;/code&gt; interface (as well as &lt;code&gt;GIcon&lt;/code&gt;&#x27;s), so you can get a PNG-encoded image using &lt;code&gt;g_loadable_icon_load&lt;/code&gt;.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/303376@main&quot; rel=&quot;external&quot;&gt;Remove&lt;/a&gt; incorrect early return in Trusted Types DOM attribute handling to align with spec changes.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;javascriptcore-fish&quot;&gt;JavaScriptCore 🐟&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;The built-in JavaScript/ECMAScript engine for WebKit, also known as JSC or SquirrelFish.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;In JavaScriptCore&#x27;s implementation of Temporal, &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/52251&quot; rel=&quot;external&quot;&gt;implemented&lt;/a&gt; the &lt;code&gt;with&lt;/code&gt; method for &lt;code&gt;PlainMonthDay&lt;/code&gt; objects.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;In JavaScriptCore&#x27;s implementation of Temporal, &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/54281&quot; rel=&quot;external&quot;&gt;implemented&lt;/a&gt; the &lt;code&gt;from&lt;/code&gt; and &lt;code&gt;equals&lt;/code&gt; methods for &lt;code&gt;PlainMonthDay&lt;/code&gt; objects.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases 📦️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://webkitgtk.org/2025/11/19/webkitgtk2.50.2-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK 2.50.2&lt;/a&gt; and &lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.50.2.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.50.2&lt;/a&gt; have been released.&lt;/p&gt;
&lt;p&gt;These stable releases include a number of patches for security issues, and as such a new security advisory, &lt;code&gt;WSA-2025-0008&lt;/code&gt;, has been issued (&lt;a href=&quot;https://webkitgtk.org/security/WSA-2025-0008.html&quot; rel=&quot;external&quot;&gt;GTK&lt;/a&gt;, &lt;a href=&quot;https://wpewebkit.org/security/WSA-2025-0008.html&quot; rel=&quot;external&quot;&gt;WPE&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;It is recommend to apply an &lt;a href=&quot;https://github.com/WebKit/WebKit/commit/730bffd856d2a1e56dd3bd2a0702282f19c5242a&quot; rel=&quot;external&quot;&gt;additional patch&lt;/a&gt; that fixes building with the JavaScriptCore “CLoop” interpreter is enabled, which is typicall for architectures where JIT compilation is unsupported. Releases after 2.50.2 will include it and manual patching will no longer be needed.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #47</title>
		<link href="https://blogs.igalia.com/webkit/blog/2025/wip-47/"/>
		<id>https://blogs.igalia.com/webkit/blog/2025/wip-47/</id>
		<updated>2025-11-17T21:22:23+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from November 10 to November 17.&lt;/p&gt;
&lt;p&gt;
This week&#x27;s update is composed of a new CStringView internal API, more
MathML progress with the implementation of the &quot;scriptlevel&quot; attribute,
the removal of the Flatpak-based SDK, and the maintanance update of
WPEBackend-fdo.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/WebKit/WebKit/pull/53028&quot; rel=&quot;external&quot;&gt;Implement&lt;/a&gt; the MathML &lt;code&gt;scriptlevel&lt;/code&gt; attribute using &lt;code&gt;math-depth&lt;/code&gt;.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Finished &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/51619&quot; rel=&quot;external&quot;&gt;implementing&lt;/a&gt; CStringView, which is a wrapper around UTF8 C strings. It allows you to recover the string without making any copies and perform string operations safely by taking into account the encoding at compile time.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases 📦️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://wpewebkit.org/release/wpebackend-fdo-1.16.1.html&quot; rel=&quot;external&quot;&gt;WPEBackend-fdo 1.16.1&lt;/a&gt; has been released. This is a maintenance update which adds compatibility with newer Mesa versions.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;infrastructure-construction-site&quot;&gt;Infrastructure 🏗️&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Most of the Flatpak-based SDK was &lt;a href=&quot;https://commits.webkit.org/303035@main&quot; rel=&quot;external&quot;&gt;removed&lt;/a&gt;. Developers are warmly encouraged to use the &lt;a href=&quot;https://github.com/Igalia/webkit-container-sdk&quot; rel=&quot;external&quot;&gt;new SDK&lt;/a&gt; for their contributions to the Linux ports, this SDK has been successfully deployed on EWS and post-commits bots.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Igalia WebKit Team: WebKit Igalia Periodical #46</title>
		<link href="https://blogs.igalia.com/webkit/blog/2025/wip-46/"/>
		<id>https://blogs.igalia.com/webkit/blog/2025/wip-46/</id>
		<updated>2025-11-10T23:04:17+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from November 3 to November 10.&lt;/p&gt;
&lt;p&gt;
This week brought a hodgepodge of fixes in Temporal and multimedia,
a small addition to the public API in preparation for future work,
plus advances in WebExtensions, WebXR, and Android support.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port 🐱&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The platform-independent part of the &lt;a href=&quot;https://www.w3.org/TR/webxr-hit-test-1/&quot; rel=&quot;external&quot;&gt;WebXR Hit Test Module&lt;/a&gt; has been &lt;a href=&quot;https://commits.webkit.org/302646@main&quot; rel=&quot;external&quot;&gt;implemented&lt;/a&gt;. The rest, including the &lt;code&gt;FakeXRDevice&lt;/code&gt; mock implementation used for testing will be done later.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;On the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions&quot; rel=&quot;external&quot;&gt;WebExtensions&lt;/a&gt; front, parts of the &lt;code&gt;WebExtensionCallbackHandler&lt;/code&gt; code &lt;a href=&quot;https://commits.webkit.org/302549@main&quot; rel=&quot;external&quot;&gt;have been rewritten&lt;/a&gt; to use more C++ constructs and helper functions, in preparation to share more code among the different WebKit ports.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;A new &lt;code&gt;WebKitImage&lt;/code&gt; utility class
&lt;a href=&quot;https://commits.webkit.org/302720@main&quot; rel=&quot;external&quot;&gt;landed&lt;/a&gt; this week. This image
abstraction is one of the steps towards delivering a &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=301086&quot; rel=&quot;external&quot;&gt;new improved API for page
favicons&lt;/a&gt;, and it is also expected to
be useful for the WebExtensions work, and to enable the &lt;code&gt;webkit_web_view_get_snapshot()&lt;/code&gt;
API for the WPE port.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;multimedia-movie-camera&quot;&gt;Multimedia 🎥&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;GStreamer-based multimedia support for WebKit, including (but not limited to) playback, capture, WebAudio, WebCodecs, and WebRTC.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Videos with BT2100-PQ colorspace are now &lt;a href=&quot;https://commits.webkit.org/302751@main&quot; rel=&quot;external&quot;&gt;tone-mapped to
SDR&lt;/a&gt; in WebKit&#x27;s compositor, ensuring
colours do not appear washed out.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Lots of deadlock fixes this week, one among many in the &lt;a href=&quot;https://commits.webkit.org/302641@main&quot; rel=&quot;external&quot;&gt;MediaStream GStreamer
source element&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Video frame rendering to WebGL was
&lt;a href=&quot;https://commits.webkit.org/302474@main&quot; rel=&quot;external&quot;&gt;fixed&lt;/a&gt;. Another pending improvement is
GPU-to-GPU texture copies, which might be coming soon.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;javascriptcore-fish&quot;&gt;JavaScriptCore 🐟&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;The built-in JavaScript/ECMAScript engine for WebKit, also known as JSC or SquirrelFish.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;JavaScriptCore&#x27;s implementation of
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal&quot; rel=&quot;external&quot;&gt;Temporal&lt;/a&gt;
received a number of improvements this week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/302573@main&quot; rel=&quot;external&quot;&gt;Fixed a bug&lt;/a&gt; that would cause wrong
results when adding a duration with a very large microseconds or nanoseconds
value to a &lt;code&gt;PlainTime&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/302403@main&quot; rel=&quot;external&quot;&gt;Fixed a rounding bug&lt;/a&gt; of &lt;code&gt;Instant&lt;/code&gt; values.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/302460@main&quot; rel=&quot;external&quot;&gt;Fixed a bug&lt;/a&gt; that resulted in
incorrect printing of certain &lt;code&gt;Instant&lt;/code&gt; values before the Epoch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://commits.webkit.org/302413@main&quot; rel=&quot;external&quot;&gt;Fixed a bug&lt;/a&gt; that resulted in wrong
results instead of exceptions when a date addition operation would result in
an out-of-range date.&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;


&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit 📟&lt;/h2&gt;
&lt;h3 id=&quot;wpe-android-robot&quot;&gt;WPE Android &lt;a href=&quot;https://github.com/Igalia/wpe-android&quot; rel=&quot;external&quot;&gt;↗&lt;/a&gt;  🤖&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;Adaptation of WPE WebKit targeting the Android operating system.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;One of the last pieces needed to have the WPEPlatform API working on Android
&lt;a href=&quot;https://commits.webkit.org/302638@main&quot; rel=&quot;external&quot;&gt;has been merged&lt;/a&gt;: a custom platform
EGL display implementation, and enabling the default display as fallback.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;community-events-handshake&quot;&gt;Community &amp;amp; Events 🤝&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The dates for the next &lt;a href=&quot;https://webengineshackfest.org/&quot; rel=&quot;external&quot;&gt;Web Engines Hackfest&lt;/a&gt;
have been announced: it will take place from Monday, June 15th to Wednesday,
June 17th. As it has been the case in the last years, it will be possible to
attend both on-site, and remotely for those who cannot to travel to A Coruña.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The video recording for Adrian Pérez&#x27;s “WPE Android 🤖 State of the Bot” talk from this year&#x27;s edition of the &lt;a href=&quot;https://webkit.org/meeting&quot; rel=&quot;external&quot;&gt;WebKit Contributors&#x27; Meeting&lt;/a&gt; has been &lt;a href=&quot;https://www.youtube.com/watch?v=arH93B82SJM&quot; rel=&quot;external&quot;&gt;published&lt;/a&gt;. This was an update on what the Igalia WebKit team has been done during the last year to improve WPE WebKit on Android, and what is coming up next.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That’s all for this week!&lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Igalia WebKit Team</name>
			<uri>https://planet.igalia.com/webkit</uri>
		</author>
		<source>
			<title type="html">Planet Igalia WebKit</title>
			<subtitle type="html">Planet Igalia WebKit - https://planet.igalia.com/webkit</subtitle>
			<link rel="self" href="https://planet.igalia.com/webkit/rss20.xml"/>
			<id>https://planet.igalia.com/webkit/rss20.xml</id>
		</source>
	</entry>

</feed>
