<?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-08-17T18:53:02+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en-US">
		<title type="html">Release Notes for Safari Technology Preview 250</title>
		<link href="https://webkit.org/blog/18191/release-notes-for-safari-technology-preview-250/"/>
		<id>https://webkit.org/?p=18191</id>
		<updated>2026-08-13T21:24:55+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 250 is now &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;available for download&lt;/a&gt; for macOS Golden Gate and macOS Tahoe. 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/b1a790aab65acaee0e7395b20fe98bff3d539ada...41655c489e18c93c2bf0614173c3ac942fbf35fe&quot;&gt;317507@main&amp;#8230;317934@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 VoiceOver reading a stray newline and skipping lines when navigating a &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; whose value ends in a line break. (&lt;a href=&quot;https://commits.webkit.org/317784@main&quot;&gt;317784@main&lt;/a&gt;)  (182912872)&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;spaces&lt;/code&gt; value of the &lt;code&gt;ruby-overhang&lt;/code&gt; property, which limits annotation overhang to adjacent spaces and punctuation, with &lt;code&gt;none&lt;/code&gt; now an alias for &lt;code&gt;spaces&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/317569@main&quot;&gt;317569@main&lt;/a&gt;)  (181808420)&lt;/li&gt;
&lt;li&gt;Added support for the &lt;code&gt;content&lt;/code&gt; property on the &lt;code&gt;::marker&lt;/code&gt; pseudo-element. (&lt;a href=&quot;https://commits.webkit.org/317570@main&quot;&gt;317570@main&lt;/a&gt;)  (182750380)&lt;/li&gt;
&lt;li&gt;Added support for the &lt;code&gt;text-decoration-inset&lt;/code&gt; property. (&lt;a href=&quot;https://commits.webkit.org/317571@main&quot;&gt;317571@main&lt;/a&gt;)  (182750933)&lt;/li&gt;
&lt;li&gt;Added support for the &lt;code&gt;white-space-trim&lt;/code&gt; property. (&lt;a href=&quot;https://commits.webkit.org/317573@main&quot;&gt;317573@main&lt;/a&gt;)  (182751076)&lt;/li&gt;
&lt;li&gt;Added support for the &lt;code&gt;wrap-inside&lt;/code&gt; property. (&lt;a href=&quot;https://commits.webkit.org/317574@main&quot;&gt;317574@main&lt;/a&gt;)  (182751559)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a &lt;code&gt;list-style-position: inside&lt;/code&gt; marker glyph being painted one device pixel away from the equivalent inline text. (&lt;a href=&quot;https://commits.webkit.org/317789@main&quot;&gt;317789@main&lt;/a&gt;)  (182447949)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;text-decoration&lt;/code&gt; specified on &lt;code&gt;::selection&lt;/code&gt; never being painted. (&lt;a href=&quot;https://commits.webkit.org/317673@main&quot;&gt;317673@main&lt;/a&gt;)  (182757292)&lt;/li&gt;
&lt;li&gt;Fixed a text decoration on &lt;code&gt;::selection&lt;/code&gt; not being painted when the selected text had no decoration of its own. (&lt;a href=&quot;https://commits.webkit.org/317695@main&quot;&gt;317695@main&lt;/a&gt;)  (182864748)&lt;/li&gt;
&lt;li&gt;Fixed a &lt;code&gt;max-content&lt;/code&gt; sized block collapsing to zero width when its child used an orthogonal writing mode. (&lt;a href=&quot;https://commits.webkit.org/317781@main&quot;&gt;317781@main&lt;/a&gt;)  (183026896)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Deprecations&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Removed support for the non-standard &lt;code&gt;text&lt;/code&gt; color value; use &lt;code&gt;canvastext&lt;/code&gt; instead. (&lt;a href=&quot;https://commits.webkit.org/317687@main&quot;&gt;317687@main&lt;/a&gt;)  (100364547)&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 support for copying and pasting &lt;code&gt;image/svg+xml&lt;/code&gt; data with the Clipboard API, sanitizing the markup on both read and write. (&lt;a href=&quot;https://commits.webkit.org/317528@main&quot;&gt;317528@main&lt;/a&gt;)  (137553836)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;JavaScript&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for the Explicit Resource Management proposal, including &lt;code&gt;using&lt;/code&gt; and &lt;code&gt;await using&lt;/code&gt; declarations, &lt;code&gt;Symbol.dispose&lt;/code&gt;, &lt;code&gt;DisposableStack&lt;/code&gt;, and &lt;code&gt;AsyncDisposableStack&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/317894@main&quot;&gt;317894@main&lt;/a&gt;)  (103209363)&lt;/li&gt;
&lt;li&gt;Added support for &lt;code&gt;Iterator.zip()&lt;/code&gt; and &lt;code&gt;Iterator.zipKeyed()&lt;/code&gt; from the Joint Iteration proposal. (&lt;a href=&quot;https://commits.webkit.org/317886@main&quot;&gt;317886@main&lt;/a&gt;)  (180967133)&lt;/li&gt;
&lt;li&gt;Added JavaScript and WebAssembly feature flags alongside other web feature settings. (317306@main (https://commits.webkit.org/317306@main))  (182210113)&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 a spurious &lt;code&gt;pause&lt;/code&gt; and &lt;code&gt;ended&lt;/code&gt; event firing on a live HLS stream when playback reached the live edge. (&lt;a href=&quot;https://commits.webkit.org/317626@main&quot;&gt;317626@main&lt;/a&gt;)  (100556746)&lt;/li&gt;
&lt;li&gt;Fixed a media fragment with an out-of-range hours value being accepted as a valid seek instead of being rejected. (&lt;a href=&quot;https://commits.webkit.org/317869@main&quot;&gt;317869@main&lt;/a&gt;)  (181820705)&lt;/li&gt;
&lt;li&gt;Fixed a WebVTT cue incorrectly inheriting a preceding line as its identifier across a &lt;code&gt;REGION&lt;/code&gt; or &lt;code&gt;STYLE&lt;/code&gt; block. (&lt;a href=&quot;https://commits.webkit.org/317811@main&quot;&gt;317811@main&lt;/a&gt;)  (181977285)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Networking&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added initial support for uploading a &lt;code&gt;ReadableStream&lt;/code&gt; body with &lt;code&gt;fetch()&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/317724@main&quot;&gt;317724@main&lt;/a&gt;)  (182510365)&lt;/li&gt;
&lt;li&gt;Added support for the &lt;code&gt;duplex&lt;/code&gt; option on &lt;code&gt;Request&lt;/code&gt;, which is required when uploading a &lt;code&gt;ReadableStream&lt;/code&gt; body. (&lt;a href=&quot;https://commits.webkit.org/317768@main&quot;&gt;317768@main&lt;/a&gt;)  (182802330)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Scrolling&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;scrollIntoView()&lt;/code&gt; on an inline element sharing a line with a much taller element scrolling to the top of the line box instead of to the element. (&lt;a href=&quot;https://commits.webkit.org/317933@main&quot;&gt;317933@main&lt;/a&gt;)  (178491868)&lt;/li&gt;
&lt;li&gt;Fixed paged scrolling with Page Down or the spacebar skipping over intermediate scroll snap points. (&lt;a href=&quot;https://commits.webkit.org/317562@main&quot;&gt;317562@main&lt;/a&gt;)  (182562852)&lt;/li&gt;
&lt;li&gt;Fixed a crash that could occur while sending a scroll update during window tear-down. (&lt;a href=&quot;https://commits.webkit.org/317785@main&quot;&gt;317785@main&lt;/a&gt;)  (182972245)&lt;/li&gt;
&lt;li&gt;Fixed re-snapping after layout always preferring a focused element, instead of only when focus has changed. (&lt;a href=&quot;https://commits.webkit.org/317892@main&quot;&gt;317892@main&lt;/a&gt;)  (183146768)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Storage&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an IndexedDB &lt;code&gt;put()&lt;/code&gt; that fails a unique index constraint deleting the record it would have overwritten, leaving the object store with neither the old nor the new record. (&lt;a href=&quot;https://commits.webkit.org/317632@main&quot;&gt;317632@main&lt;/a&gt;)  (181513905)&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 Digital Credentials &lt;code&gt;get()&lt;/code&gt; being rejected in an iframe inside a focused window. (&lt;a href=&quot;https://commits.webkit.org/317656@main&quot;&gt;317656@main&lt;/a&gt;)  (109191868)&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 showing WebAssembly modules in the Sources tab. (&lt;a href=&quot;https://commits.webkit.org/317891@main&quot;&gt;317891@main&lt;/a&gt;)  (182605814)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed disabling the resource cache overwriting a &lt;code&gt;Cache-Control&lt;/code&gt; header already set by the page. (&lt;a href=&quot;https://commits.webkit.org/317814@main&quot;&gt;317814@main&lt;/a&gt;)  (183072123)&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 relaxed SIMD instructions. (&lt;a href=&quot;https://commits.webkit.org/317549@main&quot;&gt;317549@main&lt;/a&gt;)  (180967232)&lt;/li&gt;
&lt;li&gt;Added support for multiple memories in a single WebAssembly module. (&lt;a href=&quot;https://commits.webkit.org/317636@main&quot;&gt;317636@main&lt;/a&gt;)  (182219080)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebDriver&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for the &amp;#8220;consume user activation&amp;#8221; extension command, which consumes the current browsing context&amp;#8217;s transient user activation and reports whether it was present. (&lt;a href=&quot;https://commits.webkit.org/317715@main&quot;&gt;317715@main&lt;/a&gt;)  (102634281)&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 #72</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-72/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-72/</id>
		<updated>2026-08-10T18:51:04+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from July 28 to August 10.&lt;/p&gt;
&lt;p&gt;
Quite a packed pair of weeks this time! The range of updates is big, but some
highlights are the handful of Layer-Based SVG Engine updates, performance
improvements, and the new WPE APIs. Finally, the Web Engines Hackfest
recordings are now published!
&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/commit/31a2484dd863a7a449323c3c222b47e028c2acf1&quot; rel=&quot;external&quot;&gt;Fixed&lt;/a&gt; &lt;code&gt;webkit_website_data_get_size()&lt;/code&gt; looking up sizes for localStorage, indexedDB, and the DOM Cache.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Enabled support for the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/File_System_API&quot; rel=&quot;external&quot;&gt;File System&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Storage_API&quot; rel=&quot;external&quot;&gt;Storage&lt;/a&gt; APIs.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Added &lt;a href=&quot;https://github.com/WebKit/WebKit/commit/bc363a82cf22f21fbe5472135e5bafc9b67b0bb3&quot; rel=&quot;external&quot;&gt;WEBKIT_WEBSITE_DATA_FILE_SYSTEM&lt;/a&gt; API to enable fetching/clearing File System data sites use.&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;Landed a &lt;a href=&quot;https://commits.webkit.org/318708@main&quot; rel=&quot;external&quot;&gt;follow-up fix for the h264 edit list support&lt;/a&gt; to prevent regressions on YouTube MSE Conformance Tests 2019 when using older versions of GStreamer.&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/318859@main&quot; rel=&quot;external&quot;&gt;Avoided a spurious seek to zero&lt;/a&gt; when seeking to the end of an audio/video when playback starts.&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/318856@main&quot; rel=&quot;external&quot;&gt;Recovered a MotionMark compositing regression&lt;/a&gt; in the Skia backend, where respecting damage information during compositing cost about 20% on the composition suite and more than 50% on two of its tests. Restricting a draw to the damaged area means splitting it into source-rect-to-destination-rect pieces or drawing it under a device-space clip, and neither is needed when the damage already covers the whole draw, which is the common case in those tests because a composited layer is much smaller than a damage grid cell. Those draws are now issued exactly as they would be with damage turned off, avoiding a clip path that flushed the image set batch and left it an order of magnitude smaller, and with the regressions gone, using damage information for compositing was &lt;a href=&quot;https://commits.webkit.org/318857@main&quot; rel=&quot;external&quot;&gt;enabled again&lt;/a&gt; along with unifying damaged regions that are sent to the system compositor.&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/318440@main&quot; rel=&quot;external&quot;&gt;Skipped a per-frame visual overflow recomputation&lt;/a&gt; in the container paint cull of the Layer-Based SVG Engine (LBSE). The cull used a cached overflow rect that was recomputed by unioning all descendant bounds on a miss, which happened every frame for containers with an animated transform. It now only runs when the rect is already cached.&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/318410@main&quot; rel=&quot;external&quot;&gt;Skipped the outline paint pass&lt;/a&gt; for SVG renderers without an &lt;code&gt;outline&lt;/code&gt; in the Layer-Based SVG Engine (LBSE). Every shape used to be painted twice per frame, the second pass being a no-op in the common outline-free case, so guarding it behind &lt;code&gt;hasOutline()&lt;/code&gt; removes a redundant traversal from every frame.&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/318816@main&quot; rel=&quot;external&quot;&gt;Fixed masked SVG content being cut off&lt;/a&gt; at the edges in the Layer-Based SVG Engine (LBSE), where the mask image was sized over the enclosing integer rect of the mask content bounds in device space while the transparency layer clip was computed differently, losing the outermost pixels. An SVG renderer that is a box (&lt;code&gt;&amp;lt;text&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;foreignObject&amp;gt;&lt;/code&gt;) also used the CSS mask clip rect derived from the border box, which leaves out SVG content spilling outside it, and now uses the visual overflow rect instead&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/318817@main&quot; rel=&quot;external&quot;&gt;Fixed most of the remaining &lt;code&gt;&amp;lt;mask&amp;gt;&lt;/code&gt; issues&lt;/a&gt; in the Layer-Based SVG Engine (LBSE): masks were displaced on targets whose children carry transforms, the mask region given by &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt;, &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; was ignored so content reaching past it was not cut off, and the cached mask image was never dropped on layout, leaving a resized viewport masking with an image rasterized for the old size.&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/318873@main&quot; rel=&quot;external&quot;&gt;Stopped rebuilding &lt;code&gt;objectBoundingBox&lt;/code&gt; gradients&lt;/a&gt; on every layout size change in the Layer-Based SVG Engine (LBSE), which used to discard the cached gradient and re-collect its attributes (serializing every animated property back to a string, including &lt;code&gt;gradientTransform&lt;/code&gt;) on the next paint. That work is wasted for &lt;code&gt;objectBoundingBox&lt;/code&gt; units, whose coordinates resolve against the object bounding box with the userspace transform recomputed on every paint anyway, so only the clients are repainted now, while &lt;code&gt;userSpaceOnUse&lt;/code&gt; gradients resolve against the viewport and are still invalidated as before.&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/318882@main&quot; rel=&quot;external&quot;&gt;Cached the SVG fill and stroke paint server directly on the renderer&lt;/a&gt; in the Layer-Based SVG Engine (LBSE), instead of in the shared referenced-resources table living in a renderer&#x27;s rar data, where every fill and every stroke paid the cost of a hash map lookup just to reach the cache, which gives a small win on the MotionMark/Suits performance test. It also fixed a shape referencing a paint server that does not exist yet, which kept painting unfilled once an element finally took that id, because the shape registered itself as a pending resource under the full resolved URL while the lookups used the bare fragment identifier.&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/318411@main&quot; rel=&quot;external&quot;&gt;Sped up mapping the paint dirty rect&lt;/a&gt; through transforms in the Layer-Based SVG Engine (LBSE). Transformed SVG paints inverted the full 4x4 matrix on every paint, and now use the cheaper inverse of the 2x3 affine transform whenever the transform is affine, falling back to the 4x4 inverse only for 3D transforms.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Made SVG &lt;code&gt;clip-path&lt;/code&gt; no longer force a &lt;code&gt;RenderLayer&lt;/code&gt; in the Layer-Based SVG Engine (LBSE). A bare clip is now applied during painting through a shared &lt;code&gt;ClipPathPaintScope&lt;/code&gt;, a scope object that sets up the clip in its constructor and tears it down afterwards, handling CSS basic-shape and box clips as well as SVG clipper resources so both regular CSS boxes and SVG content share one path. This is a further step in &lt;a href=&quot;https://commits.webkit.org/318375@main&quot; rel=&quot;external&quot;&gt;removing the intrinsic need for layers&lt;/a&gt; on SVG renderers, continuing the effort to close the performance gap between LBSE and the legacy SVG engine.&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/318669@main&quot; rel=&quot;external&quot;&gt;Fixed dynamic &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; updates&lt;/a&gt; on SVG &lt;code&gt;&amp;lt;foreignObject&amp;gt;&lt;/code&gt; elements, which stopped taking effect after the viewport geometry started being derived from the resolved style. The &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt;, &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; attributes are presentation attributes mapped to the CSS &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt;, &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; properties, but only &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; marked the presentational hint style as dirty when they changed, so a style recalc never ran for &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; and layout kept reading stale values. All four geometry attributes now invalidate the presentational hint style, matching how &lt;code&gt;&amp;lt;rect&amp;gt;&lt;/code&gt; handles its geometry, so setting &lt;code&gt;x.baseVal.value&lt;/code&gt; from script repositions the &lt;code&gt;&amp;lt;foreignObject&amp;gt;&lt;/code&gt; as expected.&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/318412@main&quot; rel=&quot;external&quot;&gt;Added support for external and &lt;code&gt;data:&lt;/code&gt; URL references&lt;/a&gt; to &lt;code&gt;clip-path&lt;/code&gt;, markers and paint servers (gradients and patterns) in the Layer-Based SVG Engine (LBSE). Until now the LBSE resource resolvers only looked for the referenced fragment inside the local document, so markup like &lt;code&gt;url(file.svg#id)&lt;/code&gt; silently resolved to nothing, while filters already worked and the legacy SVG engine handled all of these since a few weeks.&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/318751@main&quot; rel=&quot;external&quot;&gt;Fixed SVG filters vanishing&lt;/a&gt; on elements with a very large bounding box in the Layer-Based SVG Engine (LBSE). The filter region was seeded with the element&#x27;s object bounding box and then united with each referenced &lt;code&gt;&amp;lt;filter&amp;gt;&lt;/code&gt; region, but a referenced &lt;code&gt;&amp;lt;filter&amp;gt;&lt;/code&gt; brings its own region, and that region alone decides where the filter paints, so the union could grow far past the image buffer limits and get clamped down to scale that made the output disappear. When every function in the chain is a &lt;code&gt;&amp;lt;filter&amp;gt;&lt;/code&gt; reference the bounding box is now dropped and only the referenced regions are kept, matching what the legacy SVG engine does, while &lt;code&gt;objectBoundingBox&lt;/code&gt; filter units still resolve exactly as before and HTML/CSS filters are untouched.&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/commit/0496fa627ebfc60e411c0a52009387ca10b4e584&quot; rel=&quot;external&quot;&gt;Add&lt;/a&gt; the &lt;code&gt;WebView::run-color-chooser&lt;/code&gt; API to WPE to allow applications to show color choosers, similar to WebKitGTK&#x27;s API.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The WPE port can now &lt;a href=&quot;https://commits.webkit.org/317752@main&quot; rel=&quot;external&quot;&gt;use libsecret for persistent credential storage&lt;/a&gt;, reusing the implementation from the WebKitGTK port. This is disabled by default and can be toggled passing &lt;code&gt;-DUSE_LIBSECRET=ON&lt;/code&gt; to CMake when configuring the build.&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/commit/062e3932bff008ef3a6c1069e561b372ad534547&quot; rel=&quot;external&quot;&gt;Add&lt;/a&gt; the &lt;code&gt;WebKitClipboardPermissionRequest&lt;/code&gt; API to WPE, allowing support for the clipboard permission similar to WebKItGTK.&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 videos of the &lt;a href=&quot;https://webengineshackfest.org/&quot; rel=&quot;external&quot;&gt;Web Engines Hackfest&lt;/a&gt; 2026 talks have been &lt;a href=&quot;https://www.youtube.com/playlist?list=PL4sEzdAGvRgDkOXbVAbnOWCaIOV_evSfo&quot; rel=&quot;external&quot;&gt;published&lt;/a&gt;, including the sessions from the new WPE WebKit track. This year the following WebKit-related talks have been recorded:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=-68_9Sg2VWk&quot; rel=&quot;external&quot;&gt;From libwpe to WPEPlatform: Building Embedded Browser on RPi with New WPE API&lt;/a&gt;, by Kate Lee, about new embedding API that is planned to be deemed stable for the 2.54 release series.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=qVc0I1Z1ZKU&quot; rel=&quot;external&quot;&gt;Refactoring composition in WPE with Skia&lt;/a&gt;, by Carlos García Campos, about the new Skia-based compositor currently in development that has been recently featured in our weekly dispatches.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=W2pfbFeV1Pk&quot; rel=&quot;external&quot;&gt;Techniques for reducing GPU usage in WPE&lt;/a&gt;, by  Paweł Lampe, which is exactly what reads in the tin and how to balance CPU and GPU usage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=rX6y219m3OU&quot; rel=&quot;external&quot;&gt;Speeding up WPEWebKit and WebKitGTK with Profile-Guided Optimization&lt;/a&gt;, by Lauro Moura, because everybody likes to squeeze performance out of an existing codebase without rewriting it thanks to compiler techniques.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=dnZ4jNKZzcY&quot; rel=&quot;external&quot;&gt;No QA, No WPE: Catch Regressions Before You Do&lt;/a&gt;, by Claudio Saavedra and Nikolas Zimmermann, about how continuous integration and quality assurance has been improved (and continues to) to improve stability and performance in the GTK and WPE WebKit ports.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=f6fM0B0kcPk&quot; rel=&quot;external&quot;&gt;WPEPlatform API for Android&lt;/a&gt;, by Alejandro G. Castro, which is not only this year&#x27;s update on WPE Android but also covers how the platform-dependent components have been partially rewritten and migrated to the WPEPlatform API.&lt;/p&gt;
&lt;/li&gt;&lt;/ul&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 249</title>
		<link href="https://webkit.org/blog/18182/release-notes-for-safari-technology-preview-249/"/>
		<id>https://webkit.org/?p=18182</id>
		<updated>2026-07-29T21:46:12+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 249 is now &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;available for download&lt;/a&gt; for macOS Golden Gate and macOS Tahoe. 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/402dc1b3bf265f5afd15d1b68374ef0885824299...82913509604940fdfe247e5da3609c6de6e44d89&quot;&gt;316531@main&amp;#8230;317820@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 an issue where an &lt;code&gt;aria-labelledby&lt;/code&gt; relation was not built when its target element was inserted via &lt;code&gt;innerHTML&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/316913@main&quot;&gt;316913@main&lt;/a&gt;)  (179677418)&lt;/li&gt;
&lt;li&gt;Fixed an issue where VoiceOver was silent during character navigation inside a local iframe. (&lt;a href=&quot;https://commits.webkit.org/317264@main&quot;&gt;317264@main&lt;/a&gt;)  (182229891)&lt;/li&gt;
&lt;li&gt;Fixed an issue where web content somtimes appeared empty to assistive technology after navigation. (&lt;a href=&quot;https://commits.webkit.org/317449@main&quot;&gt;317449@main&lt;/a&gt;)  (182544199)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Animations&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where calling &lt;code&gt;play()&lt;/code&gt; on a finite scroll-driven animation timeline did not reset its start time to the current time. (&lt;a href=&quot;https://commits.webkit.org/316745@main&quot;&gt;316745@main&lt;/a&gt;)  (181712713)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;animation-timeline&lt;/code&gt; did not use the last matching timeline when it matched multiple timelines. (&lt;a href=&quot;https://commits.webkit.org/317330@main&quot;&gt;317330@main&lt;/a&gt;)  (182405676)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;animation-timeline&lt;/code&gt; could match a timeline outside the nearest &lt;code&gt;timeline-scope&lt;/code&gt; element with that name. (&lt;a href=&quot;https://commits.webkit.org/317376@main&quot;&gt;317376@main&lt;/a&gt;)  (182417407)&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;attr()&lt;/code&gt; function. (&lt;a href=&quot;https://commits.webkit.org/316672@main&quot;&gt;316672@main&lt;/a&gt;)  (173992627)&lt;/li&gt;
&lt;li&gt;Added support for &lt;code&gt;outline-offset: inset&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/316677@main&quot;&gt;316677@main&lt;/a&gt;)  (180547604)&lt;/li&gt;
&lt;li&gt;Added support for the &lt;code&gt;@function&lt;/code&gt; custom functions rule. (&lt;a href=&quot;https://commits.webkit.org/316671@main&quot;&gt;316671@main&lt;/a&gt;)  (181625123)&lt;/li&gt;
&lt;li&gt;Added preview support for the &lt;code&gt;wrap-inside&lt;/code&gt; property. (&lt;a href=&quot;https://commits.webkit.org/317182@main&quot;&gt;317182@main&lt;/a&gt;)  (181751564)&lt;/li&gt;
&lt;li&gt;Added support for the &lt;code&gt;if()&lt;/code&gt; function. (&lt;a href=&quot;https://commits.webkit.org/316813@main&quot;&gt;316813@main&lt;/a&gt;)  (181806268)&lt;/li&gt;
&lt;li&gt;Added support for &lt;code&gt;calc-mix()&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/316847@main&quot;&gt;316847@main&lt;/a&gt;)  (181839626)&lt;/li&gt;
&lt;li&gt;Added support for &lt;code&gt;justify-self&lt;/code&gt; on block-level boxes. (&lt;a href=&quot;https://commits.webkit.org/317212@main&quot;&gt;317212@main&lt;/a&gt;)  (181926245)&lt;/li&gt;
&lt;li&gt;Added preview support for &lt;code&gt;text-decoration-inset&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/317230@main&quot;&gt;317230@main&lt;/a&gt;)  (182019037)&lt;/li&gt;
&lt;li&gt;Added preview support for the &lt;code&gt;content&lt;/code&gt; property on the &lt;code&gt;::marker&lt;/code&gt; pseudo-element. (&lt;a href=&quot;https://commits.webkit.org/317211@main&quot;&gt;317211@main&lt;/a&gt;)  (182066124)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where setting &lt;code&gt;view-transition-name&lt;/code&gt; dynamically did not create a stacking context. (&lt;a href=&quot;https://commits.webkit.org/317310@main&quot;&gt;317310@main&lt;/a&gt;)  (178316558)&lt;/li&gt;
&lt;li&gt;Fixed an issue where CSS Grid items with a computed preferred size that behaves as &lt;code&gt;auto&lt;/code&gt; did not correctly compute their minimum content contribution. (&lt;a href=&quot;https://commits.webkit.org/316697@main&quot;&gt;316697@main&lt;/a&gt;)  (181146154)&lt;/li&gt;
&lt;li&gt;Fixed an issue where visually overflowing content in a CSS Grid item was not painted. (&lt;a href=&quot;https://commits.webkit.org/316668@main&quot;&gt;316668@main&lt;/a&gt;)  (181277780)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;anchor-center&lt;/code&gt; in vertical writing modes not being scroll-adjusted along the block axis. (&lt;a href=&quot;https://commits.webkit.org/316537@main&quot;&gt;316537@main&lt;/a&gt;)  (181413103)&lt;/li&gt;
&lt;li&gt;Fixed an issue where an empty editable flex container did not reserve a line&amp;#8217;s worth of block size in vertical writing modes. (&lt;a href=&quot;https://commits.webkit.org/317467@main&quot;&gt;317467@main&lt;/a&gt;)  (181485387)&lt;/li&gt;
&lt;li&gt;Fixed an issue where CSS Grid did not correctly increase track sizes to accommodate items spanning flexible tracks. (&lt;a href=&quot;https://commits.webkit.org/317426@main&quot;&gt;317426@main&lt;/a&gt;)  (181635324)&lt;/li&gt;
&lt;li&gt;Fixed an issue where stretch alignment did not trigger stretch sizing for CSS Grid items. (&lt;a href=&quot;https://commits.webkit.org/316949@main&quot;&gt;316949@main&lt;/a&gt;)  (181750071)&lt;/li&gt;
&lt;li&gt;Fixed an issue where CSS Grid items could retain stale block sizes after a subsequent layout. (&lt;a href=&quot;https://commits.webkit.org/317166@main&quot;&gt;317166@main&lt;/a&gt;)  (182144347)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;clip-path&lt;/code&gt; shapes could render with incorrect arcs. (&lt;a href=&quot;https://commits.webkit.org/317397@main&quot;&gt;317397@main&lt;/a&gt;)  (182443333)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;::highlight()&lt;/code&gt; and &lt;code&gt;::target-text&lt;/code&gt; ignored &lt;code&gt;text-underline-offset&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/317440@main&quot;&gt;317440@main&lt;/a&gt;)  (182466757)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;::highlight()&lt;/code&gt; decoration replaced the originating element&amp;#8217;s decoration instead of layering over it. (&lt;a href=&quot;https://commits.webkit.org/317439@main&quot;&gt;317439@main&lt;/a&gt;)  (182523249)&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 an issue that &lt;font face=&quot;face&quot;&gt; disallowed font names that were not a valid CSS identifiers. (&lt;a href=&quot;https://commits.webkit.org/316948@main&quot;&gt;316948@main&lt;/a&gt;)  (51409819)&lt;/li&gt;
&lt;li&gt;Fixed the Edit menu&amp;#8217;s Copy item being incorrectly enabled when there was no selection in the web page. (&lt;a href=&quot;https://commits.webkit.org/316571@main&quot;&gt;316571@main&lt;/a&gt;)  (176061974)&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 the &lt;code&gt;datalist&lt;/code&gt; popup menu was presented in the wrong place on a screen to the left of the main screen. (&lt;a href=&quot;https://commits.webkit.org/316965@main&quot;&gt;316965@main&lt;/a&gt;)  (181967418)&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 &lt;code&gt;popover=hint&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/317402@main&quot;&gt;317402@main&lt;/a&gt;)  (129495028)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;JavaScript&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for the &lt;code&gt;Temporal&lt;/code&gt; object. (&lt;a href=&quot;https://commits.webkit.org/316742@main&quot;&gt;316742@main&lt;/a&gt;)  (181723535)&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 an issue where U+2016 (DOUBLE VERTICAL LINE) was missing the symmetric property in the MathML operator dictionary. (&lt;a href=&quot;https://commits.webkit.org/316867@main&quot;&gt;316867@main&lt;/a&gt;)  (179558196)&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 finding text starting from a selection could resolve to the wrong caption cue instead of the one nearest the video&amp;#8217;s playhead. (&lt;a href=&quot;https://commits.webkit.org/317168@main&quot;&gt;317168@main&lt;/a&gt;)  (182001231)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Rendering&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for dark mode in the XML document viewer. (&lt;a href=&quot;https://commits.webkit.org/316832@main&quot;&gt;316832@main&lt;/a&gt;)  (122234600)&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;box-shadow&lt;/code&gt; rendering broke when the page was zoomed. (&lt;a href=&quot;https://commits.webkit.org/317080@main&quot;&gt;317080@main&lt;/a&gt;)  (169167365)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Scrolling&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where re-snapping did not select the snap area aligned in both axes when multiple targets were aligned. (&lt;a href=&quot;https://commits.webkit.org/317294@main&quot;&gt;317294@main&lt;/a&gt;)  (182285397)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;scroll-snap-align&lt;/code&gt; was not respected when scrolling to an anchor or calling &lt;code&gt;scrollIntoView()&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/317495@main&quot;&gt;317495@main&lt;/a&gt;)  (182544180)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Spatial Web&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where navigating back to a page with a previously active web environment left the UI stuck showing the environment as active. (&lt;a href=&quot;https://commits.webkit.org/316891@main&quot;&gt;316891@main&lt;/a&gt;)  (180966321)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the background color of &lt;code&gt;HTMLModelElement&lt;/code&gt; did not match spec for non-opaque colors. (&lt;a href=&quot;https://commits.webkit.org/316788@main&quot;&gt;316788@main&lt;/a&gt;)  (181641249)&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 subgroups in WebGPU. (&lt;a href=&quot;https://commits.webkit.org/317145@main&quot;&gt;317145@main&lt;/a&gt;)  (154874391)&lt;/li&gt;
&lt;li&gt;Added support for close watchers, including the &lt;code&gt;closedby&lt;/code&gt; attribute for &lt;code&gt;dialog&lt;/code&gt; elements. (&lt;a href=&quot;https://commits.webkit.org/316680@main&quot;&gt;316680@main&lt;/a&gt;)  (180105698)&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 user gesture authorization token was not properly verified for Digital Credentials requests. (&lt;a href=&quot;https://commits.webkit.org/317228@main&quot;&gt;317228@main&lt;/a&gt;)  (174908839)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;DOMMatrix&lt;/code&gt; and &lt;code&gt;IntersectionObserver&lt;/code&gt; correctly enforcing absolute-length unit requirements when parsing values. (&lt;a href=&quot;https://commits.webkit.org/316532@main&quot;&gt;316532@main&lt;/a&gt;)  (181453666)&lt;/li&gt;
&lt;li&gt;Fixed an issue where Scroll To Text Fragment directives could run outside &lt;code&gt;text/html&lt;/code&gt; and &lt;code&gt;text/plain&lt;/code&gt; documents. (&lt;a href=&quot;https://commits.webkit.org/316976@main&quot;&gt;316976@main&lt;/a&gt;)  (181763736)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;replaceChildren()&lt;/code&gt; could not replace a document&amp;#8217;s children. (&lt;a href=&quot;https://commits.webkit.org/316909@main&quot;&gt;316909@main&lt;/a&gt;)  (181921026)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web Audio&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed Web Audio &lt;code&gt;PannerNode&lt;/code&gt; orientation-only changes not updating the directional cone gain. (&lt;a href=&quot;https://commits.webkit.org/316541@main&quot;&gt;316541@main&lt;/a&gt;)  (181413407)&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 the range mappings proposal in source maps. (&lt;a href=&quot;https://commits.webkit.org/316748@main&quot;&gt;316748@main&lt;/a&gt;)  (178564308)&lt;/li&gt;
&lt;li&gt;Added per-element &lt;code&gt;Layout Invalidated&lt;/code&gt; events in Web Inspector to reflect the number of elements affected by a layout invalidation. (&lt;a href=&quot;https://commits.webkit.org/317302@main&quot;&gt;317302@main&lt;/a&gt;)  (181243589)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where every &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; element showed a Scroll badge in the Elements tab. (&lt;a href=&quot;https://commits.webkit.org/316773@main&quot;&gt;316773@main&lt;/a&gt;)  (101661656)&lt;/li&gt;
&lt;li&gt;Fixed an issue where search results did not select the corresponding source code line for fetched JSON. (&lt;a href=&quot;https://commits.webkit.org/317499@main&quot;&gt;317499@main&lt;/a&gt;)  (118115749)&lt;/li&gt;
&lt;li&gt;Fixed an issue where search in Web Inspector did not find results inside the shadow DOM. (&lt;a href=&quot;https://commits.webkit.org/317500@main&quot;&gt;317500@main&lt;/a&gt;)  (126458322)&lt;/li&gt;
&lt;li&gt;Fixed an issue where Web Inspector could crash when selecting a popover matching a nested &lt;code&gt;@scope&lt;/code&gt; with a bare declaration. (&lt;a href=&quot;https://commits.webkit.org/316987@main&quot;&gt;316987@main&lt;/a&gt;)  (181745000)&lt;/li&gt;
&lt;li&gt;Fixed an issue where Web Inspector mapped the &lt;code&gt;crimson&lt;/code&gt; named color to the wrong RGB value. (&lt;a href=&quot;https://commits.webkit.org/317047@main&quot;&gt;317047@main&lt;/a&gt;)  (182090064)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the gradient editor in Web Inspector dropped explicit &lt;code&gt;0%&lt;/code&gt; color stops and misparsed leading radial color stops. (&lt;a href=&quot;https://commits.webkit.org/317192@main&quot;&gt;317192@main&lt;/a&gt;)  (182172439)&lt;/li&gt;
&lt;li&gt;Fixed an issue where autocompleting a vendor-prefixed value in Styles could duplicate the prefix, for example producing &lt;code&gt;-apple--apple-system&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/317167@main&quot;&gt;317167@main&lt;/a&gt;)  (182178871)&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 an issue where &lt;code&gt;Error&lt;/code&gt; stack traces did not include names for modules instantiated with &lt;code&gt;WebAssembly.instantiateStreaming&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/316642@main&quot;&gt;316642@main&lt;/a&gt;)  (181523735)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebDriver&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added WebDriver support for the Digital Credentials API, including commands to simulate wallet payloads, indefinite waits, and user rejection. (&lt;a href=&quot;https://commits.webkit.org/316435@main&quot;&gt;316435@main&lt;/a&gt;)  (168941907)&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;OverconstrainedError&lt;/code&gt; to inherit from &lt;code&gt;DOMException&lt;/code&gt; and expose a &lt;code&gt;code&lt;/code&gt; attribute per the Media Capture spec. (&lt;a href=&quot;https://commits.webkit.org/316578@main&quot;&gt;316578@main&lt;/a&gt;)  (180728516)&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 #71</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-71/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-71/</id>
		<updated>2026-07-28T01:04:26+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from July 14 to July 27.&lt;/p&gt;
&lt;p&gt;
This two-week update includes plenty of changes to the Skia compositor,
changes to multimedia support, three blog posts, and assorted improvements.
&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 Web Inspector “Layout &amp;amp; Rendering” timeline &lt;a href=&quot;https://commits.webkit.org/317302@main&quot; rel=&quot;external&quot;&gt;now shows a &lt;code&gt;Layout Invalidated&lt;/code&gt; event for &lt;em&gt;every&lt;/em&gt; element&lt;/a&gt;
that needs relayout, not just the layout root (with the old root-only event
renamed to &lt;code&gt;Layout Scheduled&lt;/code&gt;). This unveils why some layouts take much longer
than others. No more guessing which of dozens of nodes is actually to blame!&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The &lt;code&gt;webkit://gpu&lt;/code&gt; page has &lt;a href=&quot;https://commits.webkit.org/317610@main&quot; rel=&quot;external&quot;&gt;gained a dark
style&lt;/a&gt;, which will be used when the
system settings indicate that dark mode is preferred by the user.&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;The experimental GstWebRTC backend was
&lt;a href=&quot;https://commits.webkit.org/317849@main&quot; rel=&quot;external&quot;&gt;removed&lt;/a&gt; and &lt;em&gt;libwebrtc&lt;/em&gt; usage was
&lt;a href=&quot;https://commits.webkit.org/317767@main&quot; rel=&quot;external&quot;&gt;enabled&lt;/a&gt; in the &lt;code&gt;main&lt;/code&gt; branch. We hope
to enable WebRTC support by default in the 2.56 series, scheduled around March
2027.&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/317765@main&quot; rel=&quot;external&quot;&gt;MP4 edit lists support&lt;/a&gt; was enabled in
the MSE backend, improving timestamp accuracy, specially when handling of
B-frames.&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/317256@main&quot; rel=&quot;external&quot;&gt;Split the compositing walk&lt;/a&gt; in the
Skia compositor into a damage pass and a paint pass, so the frame damage is
known before the first draw. The damage pass walks the layer tree with a
&lt;code&gt;SkNoDrawCanvas&lt;/code&gt; in place of the real canvas, so every draw is discarded and
only the damage is collected. Both passes run from a single &lt;code&gt;paint()&lt;/code&gt; that
applies animations and computes the transforms once, so the two see the same
tree. Knowing the damage up front is what lets the compositor eventually paint
only the parts of a frame that actually changed.&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/317400@main&quot; rel=&quot;external&quot;&gt;Wired up damage-driven compositing&lt;/a&gt; on
the Skia compositor, so a frame re-composites only the region that actually
changed instead of the whole surface, when the
&lt;code&gt;UseDamagingInformationForCompositing&lt;/code&gt; feature is enabled (not yet on by
default). Each frame&#x27;s damage is combined with what each swap-chain target
still needs to redraw since it was last drawn into, and the clear and every
draw are clipped to that region, which is a milestone towards no longer
repainting untouched pixels every frame.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Made the root layer &lt;a href=&quot;https://commits.webkit.org/317343@main&quot; rel=&quot;external&quot;&gt;collect the frame damage
itself&lt;/a&gt; in the Skia compositor, instead
of having each layer report its own changes. Reporting leaves a gap whenever a
layer is in no position to report, e.g. a destroyed one took its painted rectangle
with it, so what it had drawn stayed on screen. The root now holds one rectangle per
layer and compares it against what each frame&#x27;s walk finds, so a layer that
moved is repainted in both places, and a layer the walk never reaches is
repainted where it used to be and dropped. Nothing has to notice anything for
the pixels it left behind to be repainted, which is what makes it safe to
restrict composition to the damaged region by default in future commits.&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/317387@main&quot; rel=&quot;external&quot;&gt;Limited every content draw to the target&#x27;s repaint
region&lt;/a&gt; in the Skia compositor, so a
composited frame can redraw only the pixels that actually changed. Each content
type restricts itself to the region&#x27;s rectangles rather than clipping the
canvas, since a multi-rectangle clip cannot be a hardware scissor and would make
Skia build a mask and break batching. This is the groundwork for damage-driven
compositing, which stays off by default behind the damage-tracking feature
flag, as the compositor still passes no region and nothing is restricted yet.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Made each swap-chain target &lt;a href=&quot;https://commits.webkit.org/317342@main&quot; rel=&quot;external&quot;&gt;track its own
damage&lt;/a&gt; since it was last current.
Repainting only what changed is correct only when drawing into the target that
holds the previous frame, but the swap chain hands back whichever target is
free, and that one is a frame or more behind. Each frame&#x27;s damage is now added
to every target as it is recorded and cleared from a target when that target is
presented, instead of being built as a side effect of reading it.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Taught the tile and image draws in the Skia compositor to &lt;a href=&quot;https://commits.webkit.org/317247@main&quot; rel=&quot;external&quot;&gt;split themselves by
damage rectangle&lt;/a&gt;, so a frame only repaints
the parts of a layer that actually changed. A new &lt;code&gt;SkiaDamageRegion&lt;/code&gt; holds the
frame&#x27;s damage in device space and is built once per frame, and each draw is
restricted to it: skipped when it touches no damage, split into one sub-draw
per damage rectangle it overlaps, or drawn under a device-space clip when a rotated
or skewed transform rules out working with rectangles. Nothing feeds a damage region
in yet, so every draw still paints in full—this prepares for future patches
enabling using damage information in the composition&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/317142@main&quot; rel=&quot;external&quot;&gt;Fixed missing repaints&lt;/a&gt; when
compositor-applied layer state changes dynamically in the Coordinated Graphics
backend. A layer recorded damage when its backing store re-rendered or a new
contents buffer arrived, but the compositor also handles filters, masks, clip
path changes, the contents rectangle, the contents tiling, the blend mode and
contents visibility, and changing any of those alters the pixels it produces
without dirtying a tile. Those setters now damage the whole layer, so a
compositor that repaints only the damaged rectangles no longer leaves the previous
frame&#x27;s pixels on screen.&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;Nikolas Zimmermann has written a two-part blog series about the current the new
Layer-Based SVG Engine (LBSE), with the first post covering &lt;a href=&quot;https://blogs.igalia.com/nzimmermann/posts/2026-07-14-lbse-conditional-layers/&quot; rel=&quot;external&quot;&gt;the effort to
reduce layer
overhead&lt;/a&gt;
using layers conditionally, and the second about &lt;a href=&quot;https://blogs.igalia.com/nzimmermann/posts/2026-07-22-lbse-paint-order-segments/&quot; rel=&quot;external&quot;&gt;how compositing is being
implemented&lt;/a&gt;
and the complications introduced due to paint ordering rules.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Loïc Le Page has published a &lt;a href=&quot;https://blogs.igalia.com/llepage/the-wpe-platform-api/&quot; rel=&quot;external&quot;&gt;blog
post&lt;/a&gt; explaining how to
use the new &lt;a href=&quot;https://wpewebkit.org/reference/2.53.3/wpe-platform-2.0/&quot; rel=&quot;external&quot;&gt;WPEPlatform
API&lt;/a&gt; to implement a
custom WPE integration. While presented example uses
&lt;a href=&quot;https://www.glfw.org/&quot; rel=&quot;external&quot;&gt;GLFW&lt;/a&gt; and EGL to show Web content on an X11 window, the
concepts are useful for anyone looking into embedding WPE.&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">WebKit Features for Safari 26.6</title>
		<link href="https://webkit.org/blog/18178/webkit-features-for-safari-26-6/"/>
		<id>https://webkit.org/?p=18178</id>
		<updated>2026-07-27T18:00:52+00:00</updated>
		<content type="html">&lt;p&gt;Safari 26.6 is here. This release adds a small refinement to WebAssembly’s streaming compilation paths, and delivers eight bug fixes across CSS, service workers, networking, extensions, and WebRTC.&lt;/p&gt;
&lt;p&gt;This release continues the ongoing focus of this entire year — polishing how features fit together, and resolving issues you might have run into as a web developer.&lt;/p&gt;
&lt;h2&gt;WebAssembly&lt;/h2&gt;
&lt;p&gt;WebKit for Safari 26.6 adds a &lt;code&gt;compileOptions&lt;/code&gt; parameter to &lt;code&gt;WebAssembly.compileStreaming()&lt;/code&gt; and &lt;code&gt;WebAssembly.instantiateStreaming()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Safari 26.2 shipped support for &lt;a href=&quot;https://webkit.org/blog/17204/webkit-features-for-safari-26-2/&quot;&gt;Wasm JS String Builtins&lt;/a&gt; — a way for WebAssembly modules to import a set of standardized JavaScript string operations as builtins, which the engine can then optimize much more aggressively than a normal JS import. To turn them on, you pass an options object to &lt;code&gt;WebAssembly.compile()&lt;/code&gt; or &lt;code&gt;WebAssembly.instantiate()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The two streaming variants (&lt;code&gt;compileStreaming()&lt;/code&gt; and &lt;code&gt;instantiateStreaming()&lt;/code&gt;) didn’t yet accept that same options object. Now they do.&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;module&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;WebAssembly&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;compileStreaming&lt;/span&gt;(
  &lt;span class=&quot;identifier&quot;&gt;fetch&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&quot;example.wasm&quot;&lt;/span&gt;),
  { &lt;span class=&quot;identifier&quot;&gt;builtins&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; [&lt;span class=&quot;string&quot;&gt;&quot;js-string&quot;&lt;/span&gt;] }
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you don’t have to fall back from streaming compilation to use JS String Builtins.&lt;/p&gt;
&lt;h2&gt;Bug fixes and more&lt;/h2&gt;
&lt;p&gt;In addition to the WebAssembly update, WebKit for Safari 26.6 includes eight bug fixes:&lt;/p&gt;
&lt;h3&gt;CSS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;ic&lt;/code&gt; length unit scaled incorrectly with page zoom, causing it to no longer equal &lt;code&gt;1em&lt;/code&gt; as expected by the CSS specification. (174857144)&lt;/li&gt;
&lt;li&gt;Fixed an issue where fixed-positioned elements using &lt;code&gt;position-area&lt;/code&gt; did not fall back properly when the body was scrollable. (175544079)&lt;/li&gt;
&lt;li&gt;Fixed an issue where CSS &lt;code&gt;zoom&lt;/code&gt; interacted incorrectly with &lt;code&gt;font-size&lt;/code&gt;, &lt;code&gt;font-weight&lt;/code&gt;, &lt;code&gt;font-variant&lt;/code&gt;, and &lt;code&gt;font-style&lt;/code&gt; on iPad when requesting the desktop website. (176647969)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Networking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where partitioned cookies could not be deleted using &lt;code&gt;WKHTTPCookieStore&lt;/code&gt;. (176097960)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Service Workers&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where service worker registrations with missing main scripts were not automatically unregistered, preventing pages from re-registering new service workers. (175522651)&lt;/li&gt;
&lt;li&gt;Fixed an issue where service worker registrations with missing imported scripts were not automatically unregistered. (175522816)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web Extensions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where web extension service worker registration database files accumulated on each Safari launch, causing performance degradation. (175810627)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebRTC&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;RTCPeerConnection&lt;/code&gt; configured with &lt;code&gt;iceTransportPolicy: &quot;relay&quot;&lt;/code&gt; failed to gather any ICE candidates on macOS Sequoia. (175009190)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Updating to Safari 26.6&lt;/h2&gt;
&lt;p&gt;Safari 26.6 is available on iOS 26.6, iPadOS 26.6, visionOS 26.6, macOS Tahoe 26.6, macOS Sequoia, and macOS Sonoma. On iOS, iPadOS, and visionOS, you can update to Safari 26.6 as part of the OS update in Settings &gt; General &gt; Software Update. On macOS, Safari updates are delivered through System Settings &gt; General &gt; Software Update.&lt;/p&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-US">
		<title type="html">Release Notes for Safari Technology Preview 248</title>
		<link href="https://webkit.org/blog/18162/release-notes-for-safari-technology-preview-248/"/>
		<id>https://webkit.org/?p=18162</id>
		<updated>2026-07-22T18:58:31+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 248 is now &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;available for download&lt;/a&gt; for macOS Golden Gate and macOS Tahoe. 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/666fd351d376a96584c357fee973f74f701800be...84565916779faa5f54b09bc075add03a779723c1&quot;&gt;315567@main&amp;#8230;316817@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 VoiceOver on Safari unable to navigate to content revealed by disclosure widgets using &lt;code&gt;hidden=&quot;until-found&quot;&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/315964@main&quot;&gt;315964@main&lt;/a&gt;)  (173228707)&lt;/li&gt;
&lt;li&gt;Fixed stale &lt;code&gt;aria-labelledby&lt;/code&gt; when the referenced element dynamically changes its &lt;code&gt;aria-label&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/316316@main&quot;&gt;316316@main&lt;/a&gt;)  (180319221)&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 forwarding missing color components when interpolating between analogous color spaces. (&lt;a href=&quot;https://commits.webkit.org/315569@main&quot;&gt;315569@main&lt;/a&gt;)  (180239320)&lt;/li&gt;
&lt;li&gt;Added support for the &lt;code&gt;no-clamp&lt;/code&gt; option on the CSS &lt;code&gt;progress()&lt;/code&gt; function. (&lt;a href=&quot;https://commits.webkit.org/315977@main&quot;&gt;315977@main&lt;/a&gt;)  (180473472)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed serialization of various CSS at-rules not escaping identifiers. (&lt;a href=&quot;https://commits.webkit.org/315795@main&quot;&gt;315795@main&lt;/a&gt;)  (178750383)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;:last-child&lt;/code&gt; and related selectors incorrectly gating on parser state outside of style resolution. (&lt;a href=&quot;https://commits.webkit.org/316495@main&quot;&gt;316495@main&lt;/a&gt;)  (178879939)&lt;/li&gt;
&lt;li&gt;Fixed changing the &lt;code&gt;color-scheme&lt;/code&gt; of an &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; not invalidating the appearance of the embedded document. (&lt;a href=&quot;https://commits.webkit.org/316467@main&quot;&gt;316467@main&lt;/a&gt;)  (179177141)&lt;/li&gt;
&lt;li&gt;Fixed CSS scroll snap re-snap to prefer the fragment-targeted (&lt;code&gt;:target&lt;/code&gt;) snap area over other aligned snap targets. (&lt;a href=&quot;https://commits.webkit.org/315880@main&quot;&gt;315880@main&lt;/a&gt;)  (180108825)&lt;/li&gt;
&lt;li&gt;Fixed the CSS preload scanner failing to preload &lt;code&gt;@import&lt;/code&gt; rules that follow an &lt;code&gt;@layer&lt;/code&gt; statement rule. (&lt;a href=&quot;https://commits.webkit.org/315576@main&quot;&gt;315576@main&lt;/a&gt;)  (180170656)&lt;/li&gt;
&lt;li&gt;Fixed serialization of &lt;code&gt;CSSViewTransitionRule&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/315614@main&quot;&gt;315614@main&lt;/a&gt;)  (180170814)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;MediaList.deleteMedium()&lt;/code&gt; to parse its argument as a media query and remove all matching queries. (&lt;a href=&quot;https://commits.webkit.org/315579@main&quot;&gt;315579@main&lt;/a&gt;)  (180270019)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;MediaList.appendMedium()&lt;/code&gt; to parse its argument as a single media query and suppress duplicates. (&lt;a href=&quot;https://commits.webkit.org/315594@main&quot;&gt;315594@main&lt;/a&gt;)  (180291283)&lt;/li&gt;
&lt;li&gt;Fixed grid items with &lt;code&gt;stretch&lt;/code&gt; or &lt;code&gt;fit-content&lt;/code&gt; preferred sizes computing incorrect minimum-content contributions when sizing tracks. (&lt;a href=&quot;https://commits.webkit.org/316296@main&quot;&gt;316296@main&lt;/a&gt;)  (180748205)&lt;/li&gt;
&lt;li&gt;Fixed inserting a CSS rule while a view transition is active causing the group animation to snap to its final state. (&lt;a href=&quot;https://commits.webkit.org/316436@main&quot;&gt;316436@main&lt;/a&gt;)  (181100818)&lt;/li&gt;
&lt;li&gt;Fixed CSS &lt;code&gt;var()&lt;/code&gt; to only resolve its fallback when the first argument resolves to the guaranteed-invalid value. (&lt;a href=&quot;https://commits.webkit.org/316280@main&quot;&gt;316280@main&lt;/a&gt;)  (181114298)&lt;/li&gt;
&lt;li&gt;Fixed navigating away from a render-blocked document before its first rendering opportunity incorrectly firing &lt;code&gt;pagereveal&lt;/code&gt; and starting an outbound cross-document view transition. (&lt;a href=&quot;https://commits.webkit.org/316446@main&quot;&gt;316446@main&lt;/a&gt;)  (181191512)&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 drag images of DOM elements with CSS transforms not rendering correctly. (&lt;a href=&quot;https://commits.webkit.org/316077@main&quot;&gt;316077@main&lt;/a&gt;)  (99614217)&lt;/li&gt;
&lt;li&gt;Fixed opaque DOM mutations coming from dictation on iOS. (&lt;a href=&quot;https://commits.webkit.org/316049@main&quot;&gt;316049@main&lt;/a&gt;)  (163454428)&lt;/li&gt;
&lt;li&gt;Fixed deletion in an editable table leaving an empty trailing table row behind. (&lt;a href=&quot;https://commits.webkit.org/315990@main&quot;&gt;315990@main&lt;/a&gt;)  (180877315)&lt;/li&gt;
&lt;li&gt;Fixed vertical caret movement in editable content ignoring the requested editable-type parameter. (&lt;a href=&quot;https://commits.webkit.org/316241@main&quot;&gt;316241@main&lt;/a&gt;)  (181000174)&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 the concentric inner-button corner radius on horizontal text form controls incorrectly ignoring the bottom inset. (&lt;a href=&quot;https://commits.webkit.org/316022@main&quot;&gt;316022@main&lt;/a&gt;)  (180869927)&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 a regression where RGB gain map images were decoded to 8 bits per channel, causing a color shift and incorrect brightness. (&lt;a href=&quot;https://commits.webkit.org/316069@main&quot;&gt;316069@main&lt;/a&gt;)  (179152566)&lt;/li&gt;
&lt;li&gt;Fixed handling of the gain-map target pixel format when decoding HDR images to fall back safely when the format cannot be parsed. (&lt;a href=&quot;https://commits.webkit.org/316405@main&quot;&gt;316405@main&lt;/a&gt;)  (181180757)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;JavaScript&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for the TC39 BigInt Math proposal, exposing &lt;code&gt;Math&lt;/code&gt;-equivalent methods on &lt;code&gt;BigInt&lt;/code&gt; such as &lt;code&gt;BigInt.pow&lt;/code&gt; and &lt;code&gt;BigInt.sqrt&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/315974@main&quot;&gt;315974@main&lt;/a&gt;)  (152472996)&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 &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; controls rendering incorrectly when rotated via CSS transform. (&lt;a href=&quot;https://commits.webkit.org/315718@main&quot;&gt;315718@main&lt;/a&gt;)  (37516619)&lt;/li&gt;
&lt;li&gt;Fixed subtitles and closed captions not appearing in fullscreen video on iPhone. (&lt;a href=&quot;https://commits.webkit.org/315789@main&quot;&gt;315789@main&lt;/a&gt;)  (175298523)&lt;/li&gt;
&lt;li&gt;Fixed ArrayBuffer-backed YUV &lt;code&gt;VideoFrame&lt;/code&gt; with a &lt;code&gt;visibleRect&lt;/code&gt; rendering with offset chroma channels. (&lt;a href=&quot;https://commits.webkit.org/315742@main&quot;&gt;315742@main&lt;/a&gt;)  (180202939)&lt;/li&gt;
&lt;li&gt;Fixed video playback of streams from certain sources such as security cameras not working. (&lt;a href=&quot;https://commits.webkit.org/315774@main&quot;&gt;315774@main&lt;/a&gt;)  (180411019)&lt;/li&gt;
&lt;li&gt;Fixed transient device rotation resulting in captured video frames having the wrong orientation. (&lt;a href=&quot;https://commits.webkit.org/315821@main&quot;&gt;315821@main&lt;/a&gt;)  (180429147)&lt;/li&gt;
&lt;li&gt;Fixed Media Source Extensions playback and seek by loosening the gap tolerance between buffered ranges. (&lt;a href=&quot;https://commits.webkit.org/316146@main&quot;&gt;316146@main&lt;/a&gt;)  (180439090)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Navigation&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a &lt;code&gt;&amp;lt;meta http-equiv=&quot;refresh&quot;&amp;gt;&lt;/code&gt; to a URL differing only in fragment identifier being incorrectly treated as a page reload. (&lt;a href=&quot;https://commits.webkit.org/316001@main&quot;&gt;316001@main&lt;/a&gt;)  (176933795)&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 URL path separators being encoded as &lt;code&gt;%2F&lt;/code&gt; following a percent-encoded Armenian path segment. (&lt;a href=&quot;https://commits.webkit.org/315627@main&quot;&gt;315627@main&lt;/a&gt;)  (180067095)&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 the background of a composited &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; element not being repainted when the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; background changed. (&lt;a href=&quot;https://commits.webkit.org/316415@main&quot;&gt;316415@main&lt;/a&gt;)  (177975964)&lt;/li&gt;
&lt;li&gt;Fixed a regression where block-axis padding on a &lt;code&gt;flex&lt;/code&gt; column container with &lt;code&gt;overflow: auto&lt;/code&gt; was excluded from &lt;code&gt;scrollHeight&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/315813@main&quot;&gt;315813@main&lt;/a&gt;)  (179376053)&lt;/li&gt;
&lt;li&gt;Fixed an issue where an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; embedding an SVG with a near-integral intrinsic width rendered one device pixel narrower than expected. (&lt;a href=&quot;https://commits.webkit.org/315807@main&quot;&gt;315807@main&lt;/a&gt;)  (180490343)&lt;/li&gt;
&lt;li&gt;Fixed elements with &lt;code&gt;filter: drop-shadow()&lt;/code&gt; not being fully repainted when a child is resized. (&lt;a href=&quot;https://commits.webkit.org/316450@main&quot;&gt;316450@main&lt;/a&gt;)  (181284741)&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 SMIL length animations to reject invalid &lt;code&gt;to&lt;/code&gt;, &lt;code&gt;from&lt;/code&gt;, and &lt;code&gt;by&lt;/code&gt; values such as those with leading whitespace. (&lt;a href=&quot;https://commits.webkit.org/315949@main&quot;&gt;315949@main&lt;/a&gt;)  (118537155)&lt;/li&gt;
&lt;li&gt;Fixed Unicode text with complex scripts not rendering correctly along a curved &lt;code&gt;&amp;lt;textPath&amp;gt;&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/316144@main&quot;&gt;316144@main&lt;/a&gt;)  (120284006)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;SVGLength.convertToSpecifiedUnits()&lt;/code&gt; failing when converting from &lt;code&gt;px&lt;/code&gt; to &lt;code&gt;%&lt;/code&gt;, &lt;code&gt;em&lt;/code&gt;, or &lt;code&gt;ex&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/315953@main&quot;&gt;315953@main&lt;/a&gt;)  (172056830)&lt;/li&gt;
&lt;li&gt;Fixed SVG geometry presentation attributes like &lt;code&gt;cx&lt;/code&gt;, &lt;code&gt;cy&lt;/code&gt;, &lt;code&gt;r&lt;/code&gt;, &lt;code&gt;rx&lt;/code&gt;, &lt;code&gt;ry&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt;, &lt;code&gt;width&lt;/code&gt;, and &lt;code&gt;height&lt;/code&gt; being incorrectly applied to elements such as &lt;code&gt;&amp;lt;g&amp;gt;&lt;/code&gt; on which they are not permitted. (&lt;a href=&quot;https://commits.webkit.org/315946@main&quot;&gt;315946@main&lt;/a&gt;)  (175672111)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the per-character &lt;code&gt;rotate&lt;/code&gt; attribute was discarded on a &lt;code&gt;&amp;lt;textPath&amp;gt;&lt;/code&gt;, so it now composes with the path tangent angle. (&lt;a href=&quot;https://commits.webkit.org/315786@main&quot;&gt;315786@main&lt;/a&gt;)  (178044478)&lt;/li&gt;
&lt;li&gt;Fixed several SVG styling spec-compliance failures. (&lt;a href=&quot;https://commits.webkit.org/316174@main&quot;&gt;316174@main&lt;/a&gt;)  (181052042)&lt;/li&gt;
&lt;li&gt;Fixed dynamic changes to &lt;code&gt;orient&lt;/code&gt; and &lt;code&gt;markerUnits&lt;/code&gt; on &lt;code&gt;&amp;lt;marker&amp;gt;&lt;/code&gt; not repainting elements that reference it. (&lt;a href=&quot;https://commits.webkit.org/316350@main&quot;&gt;316350@main&lt;/a&gt;)  (181106538)&lt;/li&gt;
&lt;li&gt;Fixed SVG SMIL &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;integer-optional-integer&lt;/code&gt;, &lt;code&gt;number-optional-number&lt;/code&gt;, and &lt;code&gt;path&lt;/code&gt; animations to not apply when their &lt;code&gt;from&lt;/code&gt;, &lt;code&gt;to&lt;/code&gt;, or &lt;code&gt;by&lt;/code&gt; values fail to parse. (&lt;a href=&quot;https://commits.webkit.org/316468@main&quot;&gt;316468@main&lt;/a&gt;)  (181308150)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Scrolling&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed CSS scroll snap points inside zero-sized elements not working correctly. (&lt;a href=&quot;https://commits.webkit.org/315948@main&quot;&gt;315948@main&lt;/a&gt;)  (172863699)&lt;/li&gt;
&lt;li&gt;Fixed CSS scroll snap re-snap to prefer a snap area that contains the focused or fragment-targeted element. (&lt;a href=&quot;https://commits.webkit.org/315927@main&quot;&gt;315927@main&lt;/a&gt;)  (180707984)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a regression where some websites failed to display and logged Content Security Policy errors in the console. (&lt;a href=&quot;https://commits.webkit.org/316290@main&quot;&gt;316290@main&lt;/a&gt;)  (179684592)&lt;/li&gt;
&lt;li&gt;Fixed same-page navigations being incorrectly checked against Content Security Policy. (&lt;a href=&quot;https://commits.webkit.org/315759@main&quot;&gt;315759@main&lt;/a&gt;)  (180342503)&lt;/li&gt;
&lt;li&gt;Fixed Content Security Policy &lt;code&gt;frame-ancestors&lt;/code&gt; violations in report-only policies being ignored instead of reported. (&lt;a href=&quot;https://commits.webkit.org/315753@main&quot;&gt;315753@main&lt;/a&gt;)  (180447621)&lt;/li&gt;
&lt;li&gt;Fixed Content Security Policy parsing to reject trailing characters after the closing quote on &lt;code&gt;nonce-source&lt;/code&gt; and &lt;code&gt;hash-source&lt;/code&gt; values. (&lt;a href=&quot;https://commits.webkit.org/316008@main&quot;&gt;316008@main&lt;/a&gt;)  (180903857)&lt;/li&gt;
&lt;li&gt;Fixed Content Security Policy &lt;code&gt;trusted-types&lt;/code&gt; expressions to reject trailing characters after keywords and the wildcard. (&lt;a href=&quot;https://commits.webkit.org/316089@main&quot;&gt;316089@main&lt;/a&gt;)  (180973793)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Storage&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where IndexedDB transactions could be blocked for an extended period before starting when another page&amp;#8217;s transaction was suspended in the background. (&lt;a href=&quot;https://commits.webkit.org/315609@main&quot;&gt;315609@main&lt;/a&gt;)  (178769599)&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 the Async Clipboard API to request paste access asynchronously. (&lt;a href=&quot;https://commits.webkit.org/315997@main&quot;&gt;315997@main&lt;/a&gt;)  (75969974)&lt;/li&gt;
&lt;li&gt;Fixed Digital Credentials to surface &lt;code&gt;OperationError&lt;/code&gt; for platform-cancellation and unknown errors instead of &lt;code&gt;AbortError&lt;/code&gt; or &lt;code&gt;UnknownError&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/315973@main&quot;&gt;315973@main&lt;/a&gt;)  (174308268)&lt;/li&gt;
&lt;li&gt;Fixed Digital Credentials rejecting with the wrong error code and synchronously; rejections are now queued as a task with the correct error. (&lt;a href=&quot;https://commits.webkit.org/315895@main&quot;&gt;315895@main&lt;/a&gt;)  (174895437)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;KeyboardEvent.getModifierState(&quot;AltGraph&quot;)&lt;/code&gt; and &lt;code&gt;MouseEvent.getModifierState(&quot;AltGraph&quot;)&lt;/code&gt; always returning &lt;code&gt;false&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/315804@main&quot;&gt;315804@main&lt;/a&gt;)  (180597374)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;Credential.type&lt;/code&gt; returning &lt;code&gt;&quot;digital-credential&quot;&lt;/code&gt; instead of &lt;code&gt;&quot;digital&quot;&lt;/code&gt; for digital credentials. (&lt;a href=&quot;https://commits.webkit.org/315891@main&quot;&gt;315891@main&lt;/a&gt;)  (180618646)&lt;/li&gt;
&lt;li&gt;Fixed aborting &lt;code&gt;navigator.credentials.get()&lt;/code&gt; leaving the digital-credentials document picker stuck on screen. (&lt;a href=&quot;https://commits.webkit.org/316494@main&quot;&gt;316494@main&lt;/a&gt;)  (180812397)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;FileReader.readAsText()&lt;/code&gt; ignoring the &lt;code&gt;charset&lt;/code&gt; parameter of the &lt;code&gt;Blob&lt;/code&gt;&amp;#8216;s MIME type. (&lt;a href=&quot;https://commits.webkit.org/315996@main&quot;&gt;315996@main&lt;/a&gt;)  (180890703)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web Inspector&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed showing ES2022 class private fields, methods, and accessors when inspecting object instances in the Console. (&lt;a href=&quot;https://commits.webkit.org/316171@main&quot;&gt;316171@main&lt;/a&gt;)  (88527162)&lt;/li&gt;
&lt;li&gt;Fixed symbolic breakpoints in the debugger so they work with intrinsic functions. (&lt;a href=&quot;https://commits.webkit.org/315713@main&quot;&gt;315713@main&lt;/a&gt;)  (99037335)&lt;/li&gt;
&lt;li&gt;Fixed a JavaScript breakpoint on a line containing only a semicolon not being triggered. (&lt;a href=&quot;https://commits.webkit.org/316519@main&quot;&gt;316519@main&lt;/a&gt;)  (126707973)&lt;/li&gt;
&lt;li&gt;Fixed the Console REPL to allow redefinition of variables declared with &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/316523@main&quot;&gt;316523@main&lt;/a&gt;)  (143140659)&lt;/li&gt;
&lt;li&gt;Fixed the Timeline exporting and importing the wrong timestamp for &lt;code&gt;performance.mark()&lt;/code&gt; records. (&lt;a href=&quot;https://commits.webkit.org/316073@main&quot;&gt;316073@main&lt;/a&gt;)  (145226764)&lt;/li&gt;
&lt;li&gt;Fixed local response overrides mapped to a file being interpreted as Latin-1 (ISO-8859-1) instead of their actual encoding. (&lt;a href=&quot;https://commits.webkit.org/316074@main&quot;&gt;316074@main&lt;/a&gt;)  (149847746)&lt;/li&gt;
&lt;li&gt;Fixed the Media Logging setting not persisting across page loads. (&lt;a href=&quot;https://commits.webkit.org/315758@main&quot;&gt;315758@main&lt;/a&gt;)  (154766890)&lt;/li&gt;
&lt;li&gt;Fixed symbolic breakpoints to work with native constructors such as &lt;code&gt;Array&lt;/code&gt;, &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;EventTarget&lt;/code&gt;, and &lt;code&gt;Worker&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/316262@main&quot;&gt;316262@main&lt;/a&gt;)  (157178256)&lt;/li&gt;
&lt;li&gt;Fixed missing stack traces for MIME type errors when importing modules. (&lt;a href=&quot;https://commits.webkit.org/316529@main&quot;&gt;316529@main&lt;/a&gt;)  (169396940)&lt;/li&gt;
&lt;li&gt;Fixed the Accessibility sidebar being empty for nodes inside cross-origin iframes. (&lt;a href=&quot;https://commits.webkit.org/316399@main&quot;&gt;316399@main&lt;/a&gt;)  (178562336)&lt;/li&gt;
&lt;li&gt;Fixed inline style invalidation to batch &lt;code&gt;DOM.getAttributes&lt;/code&gt; commands per tick in cross-origin iframes instead of issuing one command per node. (&lt;a href=&quot;https://commits.webkit.org/316487@main&quot;&gt;316487@main&lt;/a&gt;)  (178830496)&lt;/li&gt;
&lt;li&gt;Fixed DOM Storage read and write commands to resolve against the frame&amp;#8217;s own origin in cross-origin iframes. (&lt;a href=&quot;https://commits.webkit.org/316501@main&quot;&gt;316501@main&lt;/a&gt;)  (179249711)&lt;/li&gt;
&lt;li&gt;Fixed a moved breakpoint reverting to its original location after closing and reopening Web Inspector. (&lt;a href=&quot;https://commits.webkit.org/315585@main&quot;&gt;315585@main&lt;/a&gt;)  (180083858)&lt;/li&gt;
&lt;li&gt;Fixed showing the formatted parameters string for prototype objects such as &lt;code&gt;Map.prototype&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/315599@main&quot;&gt;315599@main&lt;/a&gt;)  (180298712)&lt;/li&gt;
&lt;li&gt;Fixed missing formatted parameter strings for object shorthand methods and arrow functions. (&lt;a href=&quot;https://commits.webkit.org/315723@main&quot;&gt;315723@main&lt;/a&gt;)  (180466459)&lt;/li&gt;
&lt;li&gt;Fixed an unnecessary colon appearing in front of non-class function properties. (&lt;a href=&quot;https://commits.webkit.org/315731@main&quot;&gt;315731@main&lt;/a&gt;)  (180476445)&lt;/li&gt;
&lt;li&gt;Fixed a self-canceling ternary that produced an incorrect cross-axis direction in the flex overlay. (&lt;a href=&quot;https://commits.webkit.org/316429@main&quot;&gt;316429@main&lt;/a&gt;)  (181198803)&lt;/li&gt;
&lt;li&gt;Fixed the color picker force-converting picked colors to Display P3. (&lt;a href=&quot;https://commits.webkit.org/316419@main&quot;&gt;316419@main&lt;/a&gt;)  (181201503)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;Page.searchInResources&lt;/code&gt; silently omitting cache-backed resources from search results. (&lt;a href=&quot;https://commits.webkit.org/316421@main&quot;&gt;316421@main&lt;/a&gt;)  (181202027)&lt;/li&gt;
&lt;li&gt;Fixed duplicate invalid CSS declarations both incorrectly displaying as Active in the Styles sidebar. (&lt;a href=&quot;https://commits.webkit.org/316418@main&quot;&gt;316418@main&lt;/a&gt;)  (181203080)&lt;/li&gt;
&lt;li&gt;Fixed adopted constructable stylesheets being misclassified as User Agent stylesheets in cross-origin iframes. (&lt;a href=&quot;https://commits.webkit.org/316433@main&quot;&gt;316433@main&lt;/a&gt;)  (181204768)&lt;/li&gt;
&lt;li&gt;Fixed an unsigned underflow that caused the DOM agent to spuriously report power-efficient playback. (&lt;a href=&quot;https://commits.webkit.org/316443@main&quot;&gt;316443@main&lt;/a&gt;)  (181205602)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;Network.setExtraHTTPHeaders&lt;/code&gt; to replace previously set headers instead of accumulating them. (&lt;a href=&quot;https://commits.webkit.org/316444@main&quot;&gt;316444@main&lt;/a&gt;)  (181282814)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebDriver&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added WebDriver support for the Digital Credentials API, including commands to simulate wallet payloads, indefinite waits, and user rejection. (&lt;a href=&quot;https://commits.webkit.org/316435@main&quot;&gt;316435@main&lt;/a&gt;)  (168941907)&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 the WebProcess &lt;code&gt;AudioSession&lt;/code&gt; to remain active while microphone capture is live. (&lt;a href=&quot;https://commits.webkit.org/316394@main&quot;&gt;316394@main&lt;/a&gt;)  (180505014)&lt;/li&gt;
&lt;li&gt;Fixed the &lt;code&gt;configurationchange&lt;/code&gt; event being dropped when a source-side change occurred while a &lt;code&gt;MediaStreamTrack&lt;/code&gt; was muted; the event is now deferred until unmute. (&lt;a href=&quot;https://commits.webkit.org/316301@main&quot;&gt;316301@main&lt;/a&gt;)  (180728609)&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">Nikolas Zimmermann: Implementing compositing in LBSE</title>
		<link href="https://blogs.igalia.com/nzimmermann/posts/2026-07-22-lbse-paint-order-segments/"/>
		<id>https://blogs.igalia.com/nzimmermann/posts/2026-07-22-lbse-paint-order-segments/</id>
		<updated>2026-07-22T00:00:00+00:00</updated>
		<content type="html">Keeping paint order correct with paint order segments</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">Nikolas Zimmermann: Reducing layer overhead in LBSE</title>
		<link href="https://blogs.igalia.com/nzimmermann/posts/2026-07-14-lbse-conditional-layers/"/>
		<id>https://blogs.igalia.com/nzimmermann/posts/2026-07-14-lbse-conditional-layers/</id>
		<updated>2026-07-14T00:00:00+00:00</updated>
		<content type="html">Conditional layer creation in the layer based SVG engine</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 #70</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-70/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-70/</id>
		<updated>2026-07-13T22:59:14+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from June 30 to July 13.&lt;/p&gt;
&lt;p&gt;
The summer continues with many updates to the new SVG engine (LBSE),
improvements to the new Skia-based compositor, some small API additions,
and ever-important stable releases with security fixes.
&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/316680@main&quot; rel=&quot;external&quot;&gt;Enabled&lt;/a&gt; the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/CloseWatcher&quot; rel=&quot;external&quot;&gt;CloseWatcher
API&lt;/a&gt; and
dialog&#x27;s &lt;code&gt;closedby&lt;/code&gt; attribute in stable.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;New API &lt;a href=&quot;https://commits.webkit.org/316808@main&quot; rel=&quot;external&quot;&gt;has been added&lt;/a&gt; which allows
specifying per-navigation &lt;code&gt;User-Agent&lt;/code&gt; string values using
&lt;a href=&quot;https://wpewebkit.org/reference/stable/wpe-webkit-2.0/method.PolicyDecision.use_with_policies.html&quot; rel=&quot;external&quot;&gt;webkit_policy_decision_use_with_policies()&lt;/a&gt;.
Applications now have more
granularity to decide which &lt;code&gt;User-Agent&lt;/code&gt; websites are presented with,
complementing the existing global
&lt;a href=&quot;https://wpewebkit.org/reference/stable/wpe-webkit-2.0/property.Settings.user-agent.html&quot; rel=&quot;external&quot;&gt;WebKitSettings:user-agent&lt;/a&gt;
setting.&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;Roughly &lt;a href=&quot;https://commits.webkit.org/316833@main&quot; rel=&quot;external&quot;&gt;halved the cost of the Skia based
compositor&lt;/a&gt; on WPE running on Vivante
GPUs with the Etnaviv driver, by turning off Skia&#x27;s mipmap sharpening option.
That option is enabled by default and makes the Skia shader generator append a
small negative level-of-detail (LOD) bias to every mipmap-capable texture
sample.  WPE does not use mipmapping at all, so the bias sharpened nothing,
but it still turned each texture fetch into a LOD lookup, which is a slow path
on the tiled GPUs found in the i.MX series. Disabling it restores usage of
faster, plain fetch operations.&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/316716@main&quot; rel=&quot;external&quot;&gt;Fixed broken rendering with the Skia
compositor&lt;/a&gt; on WPE when super-tiled
textures are enabled on Vivante GPUs. Those tile buffers are allocated padded
up to a multiple of 64 pixels, so the physical texture is larger than the
logical tile, but the Skia backing failed to take this difference into
account, leading to distorted tile images being rendered.&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/316881@main&quot; rel=&quot;external&quot;&gt;Stopped the Skia compositor from blending opaque
layers&lt;/a&gt; on WPE. Every layer was drawn
with the default source-over blend mode, which leaves GPU blending switched on
even for fully opaque layers that do not need it, so the cost was paid on
every composited frame.&lt;/p&gt;
&lt;p&gt;Layers that are opaque, drawn at full opacity and using the default blend mode
are now composited with a plain source blend mode instead, which lets Skia
turn blending off and lowers GPU bandwidth usage, benefiting tiled GPUs the
most.&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/316543@main&quot; rel=&quot;external&quot;&gt;Cached the concatenated SVG &lt;code&gt;transform&lt;/code&gt; attribute
matrix&lt;/a&gt; on graphics elements in the
Layer-Based SVG Engine (LBSE).&lt;/p&gt;
&lt;p&gt;Reading the &lt;code&gt;transform&lt;/code&gt; attribute walked the whole transform list and
multiplied every item together again, and that happened around three times per
animation frame for each element, even though the result only changes when the
transform list itself is mutated.&lt;/p&gt;
&lt;p&gt;The concatenated matrix is now stored on the element and invalidated whenever
a transform-related attribute changes, so the multiplication runs once per
mutation instead of once per read. This cuts repeated matrix work out of the
per-frame path for animated SVG 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/317036@main&quot; rel=&quot;external&quot;&gt;Moved the clip out of the SVG child-paint
loop&lt;/a&gt; in the Layer-Based SVG Engine
(LBSE).&lt;/p&gt;
&lt;p&gt;Painting a container used to set up a clip rectangle for every child shape in
turn, so each shape did its own graphics-context save, clip and restore even
though the clip rectangle was identical for all of them. When there is a
single region to clip to and no child paints into its own layer, that clip is
now established once and shared by every child, transformed or not.&lt;/p&gt;
&lt;p&gt;This removes a per-shape save and clip from the hot painting path of SVG
documents with many children.&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/317077@main&quot; rel=&quot;external&quot;&gt;Cached the SVG transform origin&lt;/a&gt; on
SVG renderers in the Layer-Based SVG Engine (LBSE).&lt;/p&gt;
&lt;p&gt;Every transform flush recomputed the origin for each non-layered SVG shape,
even though it only depends on the &lt;code&gt;transform-origin&lt;/code&gt; style and the transform
reference box, and sampling MotionMark&#x27;s Suits test at fixed complexity showed
that computation taking around 1% of the WebProcess main thread.&lt;/p&gt;
&lt;p&gt;The origin is now cached and keyed on the reference box, with a style change
to &lt;code&gt;transform-origin&lt;/code&gt; or &lt;code&gt;transform-box&lt;/code&gt; dropping the cache, and the fast path
is limited to plain SVG transforms so viewport containers and CSS-transformed
renderers keep computing it directly. This removes a repeated per-shape cost
from animated SVG content, and the caching scope can be widened later.&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/316545@main&quot; rel=&quot;external&quot;&gt;Cached the SVG viewport size&lt;/a&gt; used to
resolve the transform reference box in the Layer-Based SVG Engine (LBSE).&lt;/p&gt;
&lt;p&gt;The default &lt;code&gt;transform-box&lt;/code&gt; for SVG is &lt;code&gt;view-box&lt;/code&gt;, so every transformed shape
resolved the viewport from the SVG root&#x27;s content box again on each query,
both when updating its local transform and again during paint. The viewport is
constant after layout, so it is now cached on the &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt; element and only
recomputed when layout actually changes it, on resize, zoom or a &lt;code&gt;viewBox&lt;/code&gt;
update. This removes another repeated per-frame computation from the transform
path for animated SVG 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/316880@main&quot; rel=&quot;external&quot;&gt;Coalesced the SVG transform flush&lt;/a&gt;
into one minimal repaint per container in the Layer-Based SVG Engine (LBSE).&lt;/p&gt;
&lt;p&gt;Once per rendering update WebKit processes every SVG renderer whose transform
changed, whether from script or an animation, and that repaint pass was the
dominant per-frame cost on MotionMark&#x27;s Suits subtest. Instead of walking each
moved renderer up to its repaint container, the flush now computes each
child&#x27;s rectangle in its parent&#x27;s coordinate space, unions the children per
parent, maps that single union up the chain once, and issues one
&lt;code&gt;repaintUsingContainer()&lt;/code&gt; call per repaint container rather than one per
shape.&lt;/p&gt;
&lt;p&gt;This also stops requesting outline bounds, which for SVG merely duplicated the
visual overflow rectangle, and refreshes the bounding-box and visual-overflow
caches that a layout would normally update, so &lt;code&gt;getBBox()&lt;/code&gt; and paint or
hit-test culling never read a stale rectangle. This collapses many
backing-store invalidations into one while keeping the repainted region
minimal, closing the performance gap to the legacy SVG engine.&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/316544@main&quot; rel=&quot;external&quot;&gt;Avoided re-resolving the SVG transform from style on every
paint&lt;/a&gt; in the Layer-Based SVG Engine
(LBSE).&lt;/p&gt;
&lt;p&gt;Non-layer SVG renderers already cache their transform in &lt;code&gt;m_localTransform&lt;/code&gt;,
but the painting code path used to recompute it from scratch each time,
concatenating the &lt;code&gt;transform&lt;/code&gt; list, applying &lt;code&gt;transform-origin&lt;/code&gt; and
multiplying matrices, only because the cached value uses a different transform
origin. The paint transform is now derived directly from the cached one by
translating around the nominal origin, which removes that per-paint
recomputation and cuts the cost of painting transformed SVG 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/316702@main&quot; rel=&quot;external&quot;&gt;Fixed a repaint bug&lt;/a&gt; in the
Layer-Based SVG Engine (LBSE) where dynamically changing a marker&#x27;s
&lt;code&gt;markerUnits&lt;/code&gt; or &lt;code&gt;orient&lt;/code&gt; attribute left stale pixels behind. Such a change
resizes every shape that references the marker, but a referencing shape
without a layer gets no post-layout position update, so only its new bounds
were repainted—a shrinking marker left its former area on screen.&lt;/p&gt;
&lt;p&gt;The visual overflow rectangle, markers included, is now cached at the end of
shape layout while the geometry is still current, so a marker change can
repaint the old bounds before recomputing the new ones. The extra repaint is
limited to markers, since gradients and patterns do not affect a client&#x27;s
bounds, and the resulting repaint rects are more accurate than the legacy SVG
engine&#x27;s.&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;Added a &lt;a href=&quot;https://commits.webkit.org/316840@main&quot; rel=&quot;external&quot;&gt;new feature flag&lt;/a&gt;,
&lt;code&gt;BackForwardCacheWithMedia&lt;/code&gt;, which may be used to disable storing pages with
media content in the back-forward cache. This should solve the problem with
hardware decoders kept occupied on low-end devices in case of caching pages
with media after navigation.&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/07/09/webkitgtk2.52.5-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK 2.52.5&lt;/a&gt; and &lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.52.5.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.52.5&lt;/a&gt; have been released, including a number of fixes for security issues, and therefore it is recommended to update. An accompanying security advisory will be published in the coming days. Additionally, these releases include small improvements and Web compatibility improvements.&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">Introducing the Safari MCP server for web developers</title>
		<link href="https://webkit.org/blog/18136/introducing-the-safari-mcp-server-for-web-developers/"/>
		<id>https://webkit.org/?p=18136</id>
		<updated>2026-07-01T21:28:16+00:00</updated>
		<content type="html">&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;In &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;Safari 27 beta&lt;/a&gt; and &lt;a href=&quot;https://developer.apple.com/safari/technology-preview/&quot;&gt;Safari Technology Preview 247&lt;/a&gt;, we’re introducing the Safari MCP server — a Model Context Protocol server for web developers that makes your web development and debugging workflow faster and more powerful. We know agents are increasingly integral to the coding process and the Safari MCP server gives your agent the ability to know how your code actually renders in the browser by connecting it to a Safari browser window.&lt;/p&gt;
&lt;p&gt;Any MCP-compatible client can connect to the Safari MCP server. By connecting your agent to a Safari browser window, your agent can emulate what your users experience, giving it the information it needs to debug more autonomously, like access to the DOM, network requests, screenshots, and console output.&lt;/p&gt;
&lt;p&gt;It speeds up your debugging process and lets you stay in the comfort of your terminal, which means fewer rounds of hopping windows and typing prompts to debug your code.&lt;/p&gt;
&lt;h2&gt;The use cases&lt;/h2&gt;
&lt;p&gt;If you build for the web, then you know about the debugging dance. It usually goes something like this:&lt;/p&gt;
&lt;p&gt;You see something wrong with your site in the browser. You open the console to hunt it down. You click into the styles tab. You see what’s broken. You go back to your code to fix it. Or maybe you take a screenshot, detail the problem to your agent, and let it do the fixing for you. Hopefully it gets it right, the bug is fixed, and you can move on.&lt;/p&gt;
&lt;p&gt;But when it isn’t fixed, you go through the workflow again — Browser. Prompt. Agent.&lt;/p&gt;
&lt;p&gt;And again and again, until you finally squash the bug.&lt;/p&gt;
&lt;p&gt;Regardless of the browser or tools you use, the debugging workflow is a lot of clicks, tools, and window hopping to make a single fix, but it doesn’t have to be that way. If you’re already using agents in your development workflow, the Safari MCP server makes your debugging faster and more efficient.&lt;/p&gt;
&lt;p&gt;The Safari MCP server enables your agent to do more debugging and troubleshooting on its own. Here are just a few examples of what it can help with:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Web development in Safari&lt;/strong&gt;. The next time you develop in Safari, you’ll benefit from an upgraded workflow. Your agent already helps you with your code, now it can do even more by checking out how your code actually renders in Safari.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Improve compatibility with Safari.&lt;/strong&gt; Testing in just one browser means missing potential bugs in another, giving those users a subpar experience. With the Safari MCP server, your agent can open your site in Safari, inspect computed styles, check layout, and compare it against what you expect without switching windows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Analyze performance.&lt;/strong&gt; See what parts of your site are slowing things down. The Safari MCP server lets your agent evaluate JavaScript on the page to surface performance metrics, like navigation timing and resource load times, so it can pinpoint what&amp;#8217;s slowing your site down and work on the right fix.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check for accessibility.&lt;/strong&gt; The Safari MCP server lets your agent check for common accessibility issues like missing labels, improper ARIA attributes, and poor contrast, so you can catch problems that impact your users.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verify any user state.&lt;/strong&gt; Know that the page is working and looking as it should. Your agent can check the state of the form, query an element using a selector, confirm specific interactions, show different states of a checkout flow, and more. Spend less time on these manual checks and empower the agent to do it for you.&lt;/p&gt;
&lt;p&gt;These are just a few of the use cases. However you decide to implement it, the Safari MCP server helps your agent do more for you and reduce all the back and forth that web development often requires. An easier workflow means more bugs squashed, happier users, and a better product.&lt;/p&gt;
&lt;h2&gt;The tools&lt;/h2&gt;
&lt;p&gt;Here are the available tools and what they do:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;browser_console_messages&lt;/td&gt;
&lt;td&gt;Return buffered console logs for the current or specified tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browser_dialogs&lt;/td&gt;
&lt;td&gt;List and respond to browser dialogs (accept, dismiss, or input text for JS prompts)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;close_tab&lt;/td&gt;
&lt;td&gt;Close a browser tab by its handle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;create_tab&lt;/td&gt;
&lt;td&gt;Create a new browser tab, optionally loading a URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;evaluate_javascript&lt;/td&gt;
&lt;td&gt;Execute JavaScript code within the page and return the result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;get_network_request&lt;/td&gt;
&lt;td&gt;Get full detail for a single recorded network request (headers, body, timing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;get_page_content&lt;/td&gt;
&lt;td&gt;Extract text content of a page in various formats (markdown, HTML, JSON, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;list_network_requests&lt;/td&gt;
&lt;td&gt;List network request summaries (URL, method, status, timing) for the current tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;list_tabs&lt;/td&gt;
&lt;td&gt;List all open browser tabs with their handles and URLs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;navigate_to_url&lt;/td&gt;
&lt;td&gt;Navigate to a URL and return the loaded page&amp;#8217;s content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;page_info&lt;/td&gt;
&lt;td&gt;Get info about the current page: URL, title, and loading state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;page_interactions&lt;/td&gt;
&lt;td&gt;Perform DOM interactions in sequence: click, type, scroll, hover, keyPress, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;screenshot&lt;/td&gt;
&lt;td&gt;Capture a screenshot of the current page as a PNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;set_emulated_media&lt;/td&gt;
&lt;td&gt;Emulate a CSS media type (e.g. &amp;#8220;print&amp;#8221;) for responsive-design testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;set_viewport_size&lt;/td&gt;
&lt;td&gt;Set the browser viewport size in CSS pixels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;switch_tab&lt;/td&gt;
&lt;td&gt;Switch to a different browser tab by its handle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wait_for_navigation&lt;/td&gt;
&lt;td&gt;Wait for the current page to finish loading; returns final URL and title&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;With the Safari MCP server, you no longer have to write the perfect prompt, carefully describing to your agent what you’re experiencing in the browser. You can give your agent the ability to find out for itself.&lt;/p&gt;
&lt;h2&gt;How to get started&lt;/h2&gt;
&lt;h3&gt;Safari 27 beta&lt;/h3&gt;
&lt;p&gt;First, you’ll need to install &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;Safari 27 beta&lt;/a&gt;. Once installed, make sure to enable web developer features and remote automation. To enable features for web developers choose Safari &gt; Settings &gt; Advanced &gt; check the Show features for web developers checkbox. Then go to Safari &gt; Settings &gt; Developer &gt; check &amp;#8220;Allow remote automation and external agents.&amp;#8221;&lt;/p&gt;
&lt;p&gt;If you’re using Claude, you can use the following command in your terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;claude mcp add safari-mcp -- &quot;/usr/bin/safaridriver&quot; --mcp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you’re using Codex, you can use the following command in your terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;codex mcp add safari-mcp -- &quot;/usr/bin/safaridriver&quot; --mcp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For other agents, you can put the following in your mcp.json or config.json file.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;json&quot;&gt;{
  &lt;span class=&quot;string&quot;&gt;&quot;mcpServers&quot;&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; {
    &lt;span class=&quot;string&quot;&gt;&quot;safari-mcp&quot;&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; {
      &lt;span class=&quot;string&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&quot;/usr/bin/safaridriver&quot;&lt;/span&gt;,
      &lt;span class=&quot;string&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; [&lt;span class=&quot;string&quot;&gt;&quot;--mcp&quot;&lt;/span&gt;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Safari Technology Preview&lt;/h3&gt;
&lt;p&gt;First, you’ll need to install &lt;a href=&quot;https://developer.apple.com/safari/technology-preview/&quot;&gt;Safari Technology Preview&lt;/a&gt;. Once installed, make sure you enable Safari Settings &gt; Advanced &gt; Show features for web developers. Then go to Safari Settings &gt; Developer &gt; Enable remote automation and external agents.&lt;/p&gt;
&lt;p&gt;If you’re using Claude, you can use the following command in your terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;claude mcp add safari-mcp-stp -- &quot;/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver&quot; --mcp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you’re using Codex, you can use the following command in your terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;codex mcp add safari-mcp-stp -- &quot;/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver&quot; --mcp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For other agents, you can put the following in your &lt;code&gt;mcp.json&lt;/code&gt; or &lt;code&gt;config.json&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;json&quot;&gt;&lt;span class=&quot;string&quot;&gt;&quot;safari-mcp-stp&quot;&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; {
  &lt;span class=&quot;string&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&quot;/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver&quot;&lt;/span&gt;,
  &lt;span class=&quot;string&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; [&lt;span class=&quot;string&quot;&gt;&quot;--mcp&quot;&lt;/span&gt;] 
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that while the above code names the server &lt;code&gt;safari-mcp-stp&lt;/code&gt;, you can name it whatever you like, even just &lt;code&gt;safari&lt;/code&gt;. Once you have the Safari MCP server installed, try one of the following prompts:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Find bugs on my site in Safari
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;How accessible is my site in Safari?
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;See how my website performs in Safari
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;While each agent works a little differently, it shouldn’t need to be told to use the Safari MCP server explicitly — it’ll figure it out on its own. Simple prompts like the ones above are enough to kickstart the MCP.&lt;/p&gt;
&lt;p&gt;Here’s how a conversation with an agent using the Safari MCP server might go:&lt;/p&gt;
&lt;div style=&quot;background: #1a1a1a; color: #e0e0e0; border-radius: 8px; padding: 20px; font-family: &#x27;Courier New&#x27;, monospace; font-size: 0.9em; width: 100%; line-height: 1.6;&quot;&gt;
&lt;div style=&quot;margin-bottom: 1em; text-indent: 0;&quot;&gt;&lt;span style=&quot;color: #0a84ff; font-weight: bold;&quot;&gt;You:&lt;/span&gt; Got a bug report — something&amp;#8217;s broken in Safari on the flight page. Can you figure out what&amp;#8217;s going on?&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 1em; text-indent: 0;&quot;&gt;&lt;span style=&quot;color: #aaa; font-weight: bold;&quot;&gt;Agent:&lt;/span&gt; Sure, let me take a look.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 1em; text-indent: 0;&quot;&gt;&lt;span style=&quot;color: #aaa; font-weight: bold;&quot;&gt;Agent:&lt;/span&gt; I found two distinct bugs on the flight page in Safari. Want me to fix them both?&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 1em; text-indent: 0;&quot;&gt;&lt;span style=&quot;color: #0a84ff; font-weight: bold;&quot;&gt;You:&lt;/span&gt; Yes. Anything else here that might be causing problems for Safari users?&lt;/div&gt;
&lt;div style=&quot;text-indent: 0;&quot;&gt;&lt;span style=&quot;color: #aaa; font-weight: bold;&quot;&gt;Agent:&lt;/span&gt; Yes, two more things worth flagging. The results reveal animation is silently broken and the API server startup log is wrong. Should I tackle both as well?&lt;/div&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;All you need is an initial request to get started, and with the help of the Safari MCP server, your agent can take it from there.&lt;/p&gt;
&lt;p&gt;The Safari MCP server runs entirely on your local machine and makes no network calls of its own. It also does not have access to your personal information in Safari (e.g. AutoFill or other browser activity). When it captures page content, screenshots, or console logs, that data goes directly to the agent you&amp;#8217;re running — not to Apple. What happens to that data from there depends on the agent and model you&amp;#8217;re using. As with any agent you give access to your browser, only use ones you trust.&lt;/p&gt;
&lt;h2&gt;Why we built this&lt;/h2&gt;
&lt;p&gt;There are many ways to build for the web, both with and without AI. If AI is a part of your workflow, we think this tool will help make it even more productive. And if it isn’t, that’s OK too.&lt;/p&gt;
&lt;p&gt;By creating this resource, we hope to make it easier than ever to test and debug in Safari by helping your agent understand how things look and work in the browser.&lt;/p&gt;
&lt;p&gt;If you end up giving it a try or if this is your first time using an MCP server, let us know what you think.&lt;/p&gt;
&lt;p&gt;Find us online: Saron Yitbarek on &lt;a href=&quot;https://bsky.app/profile/saron.bsky.social&quot;&gt;BlueSky&lt;/a&gt;, 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;, 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;. If you run into any issues, file a &lt;a href=&quot;https://bugs.webkit.org/&quot;&gt;WebKit bug report&lt;/a&gt;. Filing issues really does make a difference.&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 247</title>
		<link href="https://webkit.org/blog/18133/release-notes-for-safari-technology-preview-247/"/>
		<id>https://webkit.org/?p=18133</id>
		<updated>2026-07-01T21:28:08+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 247 is now &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;available for download&lt;/a&gt; for macOS Golden Gate and macOS Tahoe. 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/5826ce9b58c29fc5441c1e7c3fc1f981174c495e...bb9e30c2f7123d626ed9f0f271e31a0e0657d0e7&quot;&gt;314716@main&amp;#8230;315846@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 VoiceOver jumping to the top of the page when navigating to an element that immediately becomes accessibility-ignored via JavaScript. (&lt;a href=&quot;https://commits.webkit.org/315078@main&quot;&gt;315078@main&lt;/a&gt;)  (179065364)&lt;/li&gt;
&lt;li&gt;Fixed VoiceOver reporting the Recent Events table on parks.wa.gov as empty. (&lt;a href=&quot;https://commits.webkit.org/314901@main&quot;&gt;314901@main&lt;/a&gt;)  (179156593)&lt;/li&gt;
&lt;li&gt;Fixed VoiceOver not exposing &lt;code&gt;aria-actions&lt;/code&gt; custom actions when the action target is accessibility-ignored. (&lt;a href=&quot;https://commits.webkit.org/315097@main&quot;&gt;315097@main&lt;/a&gt;)  (179286650)&lt;/li&gt;
&lt;li&gt;Fixed an &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element with a click handler but no &lt;code&gt;href&lt;/code&gt; not being exposed as a link. (&lt;a href=&quot;https://commits.webkit.org/315102@main&quot;&gt;315102@main&lt;/a&gt;)  (179398579)&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 &lt;code&gt;calc-mix()&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314719@main&quot;&gt;314719@main&lt;/a&gt;)  (176199063)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed scroll overcompensation of fixed, nested anchor-positioned elements, so they no longer lose their position when scrolling. (&lt;a href=&quot;https://commits.webkit.org/314757@main&quot;&gt;314757@main&lt;/a&gt;)  (174010503)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;font-synthesis&lt;/code&gt; incorrectly applied synthetic oblique to variable fonts declared with &lt;code&gt;@font-face&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314814@main&quot;&gt;314814@main&lt;/a&gt;)  (178698772)&lt;/li&gt;
&lt;li&gt;Fixed synthetic bold not being applied for a variable font whose &lt;code&gt;@font-face&lt;/code&gt; &lt;code&gt;font-weight&lt;/code&gt; descriptor explicitly restricts it to &lt;code&gt;normal&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314537@main&quot;&gt;314537@main&lt;/a&gt;)  (179001275)&lt;/li&gt;
&lt;li&gt;Fixed an issue where CSS math functions produced an incorrect signed zero for subtraction, &lt;code&gt;min()&lt;/code&gt;, &lt;code&gt;max()&lt;/code&gt;, &lt;code&gt;clamp()&lt;/code&gt;, and &lt;code&gt;mod()&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/315188@main&quot;&gt;315188@main&lt;/a&gt;)  (179534440)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;input[type=hidden]&lt;/code&gt; was not set to &lt;code&gt;display: none !important&lt;/code&gt; in the user-agent stylesheet. (&lt;a href=&quot;https://commits.webkit.org/315559@main&quot;&gt;315559@main&lt;/a&gt;)  (180137214)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Fonts&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where synthetic bold incorrectly added advance width to zero-advance glyphs. (&lt;a href=&quot;https://commits.webkit.org/315157@main&quot;&gt;315157@main&lt;/a&gt;)  (179418570)&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 a positive &lt;code&gt;margin-top&lt;/code&gt; on a &lt;code&gt;&amp;lt;legend&amp;gt;&lt;/code&gt; element inside a &lt;code&gt;&amp;lt;fieldset&amp;gt;&lt;/code&gt; did not shift the fieldset down. (&lt;a href=&quot;https://commits.webkit.org/315391@main&quot;&gt;315391@main&lt;/a&gt;)  (141267953)&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 an issue where &lt;code&gt;&amp;lt;link rel=preload as=json&amp;gt;&lt;/code&gt; incorrectly triggered a preload. (&lt;a href=&quot;https://commits.webkit.org/315422@main&quot;&gt;315422@main&lt;/a&gt;)  (179843455)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the deprecated &lt;code&gt;align=&quot;center&quot;&lt;/code&gt; attribute was not treated as identical to &lt;code&gt;align=&quot;middle&quot;&lt;/code&gt; per spec. (&lt;a href=&quot;https://commits.webkit.org/315531@main&quot;&gt;315531@main&lt;/a&gt;)  (180128710)&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 an issue where &lt;code&gt;Temporal.Instant&lt;/code&gt; operations were not aligned with the spec&amp;#8217;s abstract operations. (&lt;a href=&quot;https://commits.webkit.org/315377@main&quot;&gt;315377@main&lt;/a&gt;)  (179844859)&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 embellished operator detection through &lt;code&gt;mrow&lt;/code&gt; for underover layout. (&lt;a href=&quot;https://commits.webkit.org/314924@main&quot;&gt;314924@main&lt;/a&gt;)  (173192995)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed MathML operators routed through &lt;code&gt;MathOperator&lt;/code&gt; being invisible when their glyph only exists in a fallback font. (&lt;a href=&quot;https://commits.webkit.org/314928@main&quot;&gt;314928@main&lt;/a&gt;)  (178096170)&lt;/li&gt;
&lt;li&gt;Fixed MathML to use MathML Core fallback values for script layout constants. (&lt;a href=&quot;https://commits.webkit.org/315004@main&quot;&gt;315004@main&lt;/a&gt;)  (179177178)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Media&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for overriding color space for hardware video decoders in WebCodecs. (&lt;a href=&quot;https://commits.webkit.org/314887@main&quot;&gt;314887@main&lt;/a&gt;)  (178717498)&lt;/li&gt;
&lt;li&gt;Added support for mapping &lt;code&gt;nextslide&lt;/code&gt; and &lt;code&gt;previousslide&lt;/code&gt; MediaSession actions to &lt;code&gt;nexttrack&lt;/code&gt; and &lt;code&gt;previoustrack&lt;/code&gt; platform commands, so pressing next/previous track invokes a registered slide handler when no direct track handler is registered. (&lt;a href=&quot;https://commits.webkit.org/314839@main&quot;&gt;314839@main&lt;/a&gt;)  (178744268)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed media controls not appearing when tapping videos in the LinkedIn feed on iPad. (&lt;a href=&quot;https://commits.webkit.org/315049@main&quot;&gt;315049@main&lt;/a&gt;)  (171231918)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;MediaSource&lt;/code&gt; text-track removal loop always processed only the last track. (&lt;a href=&quot;https://commits.webkit.org/315310@main&quot;&gt;315310@main&lt;/a&gt;)  (179508398)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;isValidVideoFrameBufferInit()&lt;/code&gt; tested &lt;code&gt;displayWidth&lt;/code&gt; and &lt;code&gt;displayHeight&lt;/code&gt; presence against themselves instead of the correct properties. (&lt;a href=&quot;https://commits.webkit.org/315401@main&quot;&gt;315401@main&lt;/a&gt;)  (179514279)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;MediaMetadata&lt;/code&gt; artwork &lt;code&gt;sizes&lt;/code&gt; parsing read the wrong substring for the height value. (&lt;a href=&quot;https://commits.webkit.org/315402@main&quot;&gt;315402@main&lt;/a&gt;)  (179523057)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;pictureInPictureElement&lt;/code&gt; getter inverted the shadow-host connectivity check. (&lt;a href=&quot;https://commits.webkit.org/315403@main&quot;&gt;315403@main&lt;/a&gt;)  (179675087)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Model Element&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed setting the &lt;code&gt;entityTransform&lt;/code&gt; on a &lt;code&gt;&amp;lt;model&amp;gt;&lt;/code&gt; element while the model is unloaded or hidden. (&lt;a href=&quot;https://commits.webkit.org/314951@main&quot;&gt;314951@main&lt;/a&gt;)  (179114750)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;&amp;lt;model&amp;gt;&lt;/code&gt; elements losing gesture interactivity after the model player is reloaded (for example, when the model scrolls out of and back into the viewport). (&lt;a href=&quot;https://commits.webkit.org/315026@main&quot;&gt;315026@main&lt;/a&gt;)  (179249565)&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 WebKit refused to load valid ASCII domains starting with &lt;code&gt;xn--&lt;/code&gt; that did not pass strict IDNA 2008 validation, aligning behavior with the WHATWG URL Standard. &lt;code&gt;xn--&lt;/code&gt; is the prefix of a punycode-encoded non-ASCII domain. (&lt;a href=&quot;https://commits.webkit.org/314820@main&quot;&gt;314820@main&lt;/a&gt;)  (177686282)&lt;/li&gt;
&lt;li&gt;Fixed an issue where arbitrary &lt;code&gt;Content-*&lt;/code&gt; headers from &lt;code&gt;304&lt;/code&gt; responses were not used to update cached entries. (&lt;a href=&quot;https://commits.webkit.org/315449@main&quot;&gt;315449@main&lt;/a&gt;)  (179864251)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;Cache-Control&lt;/code&gt; request directives &lt;code&gt;max-age&lt;/code&gt;, &lt;code&gt;min-fresh&lt;/code&gt;, and &lt;code&gt;no-store&lt;/code&gt; were not honored. (&lt;a href=&quot;https://commits.webkit.org/315447@main&quot;&gt;315447@main&lt;/a&gt;)  (179865576)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;Cache-Control: public&lt;/code&gt; was not honored on responses with unknown status codes. (&lt;a href=&quot;https://commits.webkit.org/315445@main&quot;&gt;315445@main&lt;/a&gt;)  (179870099)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the HTTP cache did not store responses with explicit freshness for all status codes. (&lt;a href=&quot;https://commits.webkit.org/315450@main&quot;&gt;315450@main&lt;/a&gt;)  (179871690)&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 &lt;code&gt;text-wrap: balance&lt;/code&gt; not being applied to content with &lt;code&gt;-webkit-line-clamp&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314783@main&quot;&gt;314783@main&lt;/a&gt;)  (172715503)&lt;/li&gt;
&lt;li&gt;Fixed an issue where text changes that did not modify the text element&amp;#8217;s size in a flex layout on a new compositing layer did not trigger re-rendering. (&lt;a href=&quot;https://commits.webkit.org/315173@main&quot;&gt;315173@main&lt;/a&gt;)  (179292409)&lt;/li&gt;
&lt;li&gt;Fixed an issue where an underline was drawn twice on &lt;code&gt;&amp;lt;sup&amp;gt;&lt;/code&gt; elements. (&lt;a href=&quot;https://commits.webkit.org/315220@main&quot;&gt;315220@main&lt;/a&gt;)  (179537119)&lt;/li&gt;
&lt;li&gt;Fixed an issue where an underline under a &lt;code&gt;&amp;lt;sup&amp;gt;&lt;/code&gt; element was offset by one device pixel from the rest of the line on subpixel displays. (&lt;a href=&quot;https://commits.webkit.org/315316@main&quot;&gt;315316@main&lt;/a&gt;)  (179586525)&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;ex&lt;/code&gt; unit in &lt;code&gt;text-box-edge&lt;/code&gt; misplaced the propagated underline, causing it to be painted twice. (&lt;a href=&quot;https://commits.webkit.org/315331@main&quot;&gt;315331@main&lt;/a&gt;)  (179769451)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;min-width&lt;/code&gt; was not honored over &lt;code&gt;max-width&lt;/code&gt; when sizing a shrink-to-fit container around a replaced element. (&lt;a href=&quot;https://commits.webkit.org/315396@main&quot;&gt;315396@main&lt;/a&gt;)  (179935558)&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 applying &lt;code&gt;text-decoration&lt;/code&gt; to elements with &lt;code&gt;display: contents&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314830@main&quot;&gt;314830@main&lt;/a&gt;)  (85691104)&lt;/li&gt;
&lt;li&gt;Fixed SVG &lt;code&gt;&amp;lt;text&amp;gt;&lt;/code&gt; with &lt;code&gt;textLength&lt;/code&gt; scaling each glyph separately when &lt;code&gt;x&lt;/code&gt; or &lt;code&gt;y&lt;/code&gt; is a list. (&lt;a href=&quot;https://commits.webkit.org/315146@main&quot;&gt;315146@main&lt;/a&gt;)  (94161279)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;box-shadow&lt;/code&gt; was not drawn on fixed-positioned SVG elements. (&lt;a href=&quot;https://commits.webkit.org/315468@main&quot;&gt;315468@main&lt;/a&gt;)  (97098951)&lt;/li&gt;
&lt;li&gt;Fixed an issue where an SVG filter applied via CSS to an element positioned below the viewport rendered a spurious black square at the viewport origin. (&lt;a href=&quot;https://commits.webkit.org/315329@main&quot;&gt;315329@main&lt;/a&gt;)  (177482001)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;IntersectionObserver&lt;/code&gt; not computing intersections for SVG element roots. (&lt;a href=&quot;https://commits.webkit.org/314837@main&quot;&gt;314837@main&lt;/a&gt;)  (177807041)&lt;/li&gt;
&lt;li&gt;Fixed SVG vertical &lt;code&gt;&amp;lt;text&amp;gt;&lt;/code&gt; to honor the CSS &lt;code&gt;text-orientation&lt;/code&gt; property instead of only the deprecated &lt;code&gt;glyph-orientation-vertical&lt;/code&gt; presentation attribute. (&lt;a href=&quot;https://commits.webkit.org/315080@main&quot;&gt;315080@main&lt;/a&gt;)  (178044217)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;getRotationOfChar()&lt;/code&gt; returned approximately 360° instead of 0° for full-turn rotations after normalisation into the [0°, 360°) range. (&lt;a href=&quot;https://commits.webkit.org/315293@main&quot;&gt;315293@main&lt;/a&gt;)  (178044934)&lt;/li&gt;
&lt;li&gt;Fixed an issue where a non-BMP character before a &lt;code&gt;&amp;lt;tspan&amp;gt;&lt;/code&gt; boundary shifted the &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; value lists by one position. (&lt;a href=&quot;https://commits.webkit.org/315418@main&quot;&gt;315418@main&lt;/a&gt;)  (178360036)&lt;/li&gt;
&lt;li&gt;Fixed interpolation of arc flags in the &lt;code&gt;d&lt;/code&gt; property to treat them as non-zero booleans. (&lt;a href=&quot;https://commits.webkit.org/314745@main&quot;&gt;314745@main&lt;/a&gt;)  (178950624)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;pathFromEllipseElement&lt;/code&gt; to honor &lt;code&gt;auto&lt;/code&gt; values for &lt;code&gt;rx&lt;/code&gt; and &lt;code&gt;ry&lt;/code&gt;, so APIs such as &lt;code&gt;getTotalLength()&lt;/code&gt; return the correct length for ellipses. (&lt;a href=&quot;https://commits.webkit.org/314846@main&quot;&gt;314846@main&lt;/a&gt;)  (178959205)&lt;/li&gt;
&lt;li&gt;Fixed animated GIFs freezing when presentation attributes are changed on an SVG image referenced by a &lt;code&gt;&amp;lt;use&amp;gt;&lt;/code&gt; element. (&lt;a href=&quot;https://commits.webkit.org/315094@main&quot;&gt;315094@main&lt;/a&gt;)  (179414226)&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;getBoundingClientRect()&lt;/code&gt; on an SVG &lt;code&gt;&amp;lt;tspan&amp;gt;&lt;/code&gt; element returned the bounds of the entire &lt;code&gt;&amp;lt;text&amp;gt;&lt;/code&gt; element instead of the &lt;code&gt;&amp;lt;tspan&amp;gt;&lt;/code&gt;&amp;#8216;s own area. (&lt;a href=&quot;https://commits.webkit.org/315234@main&quot;&gt;315234@main&lt;/a&gt;)  (179626476)&lt;/li&gt;
&lt;li&gt;Fixed an issue where a nested &lt;code&gt;clip-path&lt;/code&gt; on a &lt;code&gt;&amp;lt;clipPath&amp;gt;&lt;/code&gt; element ignored css zoom. (&lt;a href=&quot;https://commits.webkit.org/315562@main&quot;&gt;315562@main&lt;/a&gt;)  (180162723)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Scrolling&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;scrollIntoView&lt;/code&gt; with &lt;code&gt;nearest&lt;/code&gt; alignment incorrectly aligned to the far edge for an oversized target positioned before the scrollport. (&lt;a href=&quot;https://commits.webkit.org/315225@main&quot;&gt;315225@main&lt;/a&gt;)  (106356373)&lt;/li&gt;
&lt;li&gt;Fixed a regression on macOS 26 where horizontal rubber-banding interfered with vertical scrolling. (&lt;a href=&quot;https://commits.webkit.org/315424@main&quot;&gt;315424@main&lt;/a&gt;)  (165449829)&lt;/li&gt;
&lt;li&gt;Fixed an issue where scroll snapping selected a snap point that overshot the destination instead of the closest one in the scroll direction. (&lt;a href=&quot;https://commits.webkit.org/315522@main&quot;&gt;315522@main&lt;/a&gt;)  (179549119)&lt;/li&gt;
&lt;li&gt;Fixed an issue where interrupting a smooth scroll with a new &lt;code&gt;scrollTo()&lt;/code&gt; call to a different target fired the &lt;code&gt;scrollend&lt;/code&gt; event at the wrong position. (&lt;a href=&quot;https://commits.webkit.org/315471@main&quot;&gt;315471@main&lt;/a&gt;)  (179551854)&lt;/li&gt;
&lt;li&gt;Fixed an issue where re-snapping after a layout change moved away from a valid scroll position when the snap area was larger than the snapport. (&lt;a href=&quot;https://commits.webkit.org/315291@main&quot;&gt;315291@main&lt;/a&gt;)  (179553122)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where Content Security Policy &lt;code&gt;&#x27;self&#x27;&lt;/code&gt; did not match script sources in opaque-origin HTTP(S) documents. (&lt;a href=&quot;https://commits.webkit.org/314912@main&quot;&gt;314912@main&lt;/a&gt;)  (178638597)&lt;/li&gt;
&lt;li&gt;Fixed an issue where Content Security Policy incorrectly applied &lt;code&gt;script-src&lt;/code&gt; to JSON module imports instead of &lt;code&gt;connect-src&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/315497@main&quot;&gt;315497@main&lt;/a&gt;)  (180006320)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Spatial Web&lt;/h3&gt;
&lt;h4&gt;Known Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;WebXR might not render when you use Simulator.  (178666073)
&lt;p&gt;&lt;strong&gt;Workaround:&lt;/strong&gt; Use an Apple Vision Pro device instead of Simulator.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where transforming the camera instead of the model in a &lt;code&gt;&amp;lt;model&amp;gt;&lt;/code&gt; element led to undesirable lighting effects. (&lt;a href=&quot;https://commits.webkit.org/312407@main&quot;&gt;312407@main&lt;/a&gt;)  (179522538)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Deprecations&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Removed the Spatial Backdrop developer preview in favor of the Immersive API. (&lt;a href=&quot;https://commits.webkit.org/315100@main&quot;&gt;315100@main&lt;/a&gt;)  (160271766)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Text&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a line break appearing after a U+201D Right Double Quotation Mark. (&lt;a href=&quot;https://commits.webkit.org/314829@main&quot;&gt;314829@main&lt;/a&gt;)  (177952069)&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 an issue where the URL Pattern tokenizer emitted a spurious zero-length &lt;code&gt;Regexp&lt;/code&gt; token for empty regexp groups. (&lt;a href=&quot;https://commits.webkit.org/315289@main&quot;&gt;315289@main&lt;/a&gt;)  (179452346)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebDriver&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Allow your agent to connect to a Safari browser for development and debugging via the Safari MCP server.  (176038457)&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 WebDriver full page screenshot was clipped to the viewport dimensions instead of the full page. (&lt;a href=&quot;https://commits.webkit.org/315337@main&quot;&gt;315337@main&lt;/a&gt;)  (179840186)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebGL&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a regression where a WebGL canvas was filled with opaque content that hid stacked canvases beneath it. (&lt;a href=&quot;https://commits.webkit.org/315018@main&quot;&gt;315018@main&lt;/a&gt;)  (175352260)&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 #69</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-69/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-69/</id>
		<updated>2026-06-29T21:00:20+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from June 22 to June 29.&lt;/p&gt;
&lt;p&gt;
After a small break after the Web Engines Hackgest, we&#x27;re back with another
round of updates, this time with a couple of exciting improvements to the
SVG engine, a WebRTC fix, and support for WebP images with the toDataURL()
API.
&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;Made RenderLayer creation &lt;a href=&quot;https://commits.webkit.org/315610@main&quot; rel=&quot;external&quot;&gt;conditional&lt;/a&gt; for SVG renderers in the new Layer-Based SVG Engine (LBSE), so a layer is now only created when one is actually needed for intrinsic reasons (3D transforms, opacity, etc.) instead of unconditionally for every renderer. Plain 2D transforms no longer force a layer and are applied directly during painting. This is the groundwork for follow-up patches that remove the intrinsic need for layers when applying clipping, masking and filters to SVG subtrees. It is an important milestone towards reducing the overhead that has been holding back LBSE performance compared to the legacy SVG engine.&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/315674@main&quot; rel=&quot;external&quot;&gt;Fixed the paint order&lt;/a&gt; of non-composited children around composited SVG siblings  in the Layer-Based SVG Engine (LBSE). A layered container paints its children from a single flat list in DOM (and SVG paint) order, but some children are composited into their own GraphicsLayer for reasons like &lt;code&gt;will-change&lt;/code&gt;, a 3D transform or certain &lt;code&gt;opacity&lt;/code&gt; cases. The flat child list is now split into contiguous paint-order segments at those boundaries, with each run of plain children painted by its own overlay layer placed at the correct depth in the compositor&#x27;s child list. This keeps every child in its DOM order without giving trailing siblings a RenderLayer or backing store of their own, and a container with no composited children produces no segments at all, so the common case costs nothing. This allows us to support composition within LBSE subtrees in a performant way, after dropping the requirement that every renderer creates a layer.&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;Fixed &lt;a href=&quot;https://commits.webkit.org/315815@main&quot; rel=&quot;external&quot;&gt;initial decoding issues&lt;/a&gt; on LibWebRTC on platforms that do video decoding on the final playback stage (for efficiency and performance), instead of on the LibWebRTC decoder component.&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/315446@main&quot; rel=&quot;external&quot;&gt;Added support for producing WebP images&lt;/a&gt; with canvas&#x27; &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL&quot; rel=&quot;external&quot;&gt;.toDataURL()&lt;/a&gt;. Using &lt;code&gt;1.0&lt;/code&gt; as the quality setting will &lt;a href=&quot;https://commits.webkit.org/315446@main&quot; rel=&quot;external&quot;&gt;produce lossless images&lt;/a&gt;, which matches the behaviour of Chromium and Firefox.&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 246</title>
		<link href="https://webkit.org/blog/18128/release-notes-for-safari-technology-preview-246/"/>
		<id>https://webkit.org/?p=18128</id>
		<updated>2026-06-17T23:08:46+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 246 is now &lt;a href=&quot;https://developer.apple.com/safari/resources/&quot;&gt;available for download&lt;/a&gt; for macOS Golden Gate and macOS Tahoe. 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/69d300842d37d62d8e54a0e11c66dfcafec72e41...0bc15c78e5116da8de86f87c6deb9d19f0eba6ec&quot;&gt;313555@main…315033@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 an issue preventing VoiceOver from following &lt;code&gt;focus()&lt;/code&gt; calls for newly added elements. (&lt;a href=&quot;https://commits.webkit.org/313425@main&quot;&gt;313425@main&lt;/a&gt;)  (177167634)&lt;/li&gt;
&lt;li&gt;Fixed role computation for elements with prefixes. (&lt;a href=&quot;https://commits.webkit.org/314273@main&quot;&gt;314273@main&lt;/a&gt;)  (178399441)&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 &lt;code&gt;&amp;lt;image&amp;gt;&lt;/code&gt; values in &lt;code&gt;light-dark(&amp;lt;image&amp;gt;, &amp;lt;image&amp;gt;)&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314244@main&quot;&gt;314244@main&lt;/a&gt;)  (172290840)&lt;/li&gt;
&lt;li&gt;Added support for using the CSS &lt;code&gt;attr()&lt;/code&gt; substitution function on pseudo-elements with non-trivial originating elements. (&lt;a href=&quot;https://commits.webkit.org/313684@main&quot;&gt;313684@main&lt;/a&gt;)  (177595332)&lt;/li&gt;
&lt;li&gt;Added support for &lt;code&gt;image(&amp;lt;color&amp;gt;)&lt;/code&gt; in the &lt;code&gt;&amp;lt;image&amp;gt;&lt;/code&gt; value type. (&lt;a href=&quot;https://commits.webkit.org/314204@main&quot;&gt;314204@main&lt;/a&gt;)  (178189616)&lt;/li&gt;
&lt;li&gt;Enabled the &lt;code&gt;font-variant-emoji&lt;/code&gt; property in preview. (&lt;a href=&quot;https://commits.webkit.org/314117@main&quot;&gt;314117@main&lt;/a&gt;)  (178193814)&lt;/li&gt;
&lt;li&gt;Enabled &lt;code&gt;word-break: auto-phrase&lt;/code&gt; in preview. (&lt;a href=&quot;https://commits.webkit.org/314118@main&quot;&gt;314118@main&lt;/a&gt;)  (178193962)&lt;/li&gt;
&lt;li&gt;Added support for &lt;code&gt;color-mix()&lt;/code&gt; with more than two colors. (&lt;a href=&quot;https://commits.webkit.org/314272@main&quot;&gt;314272@main&lt;/a&gt;)  (178349405)&lt;/li&gt;
&lt;li&gt;Added support for the &lt;code&gt;alpha()&lt;/code&gt; relative color function. (&lt;a href=&quot;https://commits.webkit.org/314397@main&quot;&gt;314397@main&lt;/a&gt;)  (178551773)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;aspect-ratio&lt;/code&gt; intrinsic-size handling in flex layout to align with the specification. (&lt;a href=&quot;https://commits.webkit.org/313536@main&quot;&gt;313536@main&lt;/a&gt;)  (83240099)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;text-decoration-thickness&lt;/code&gt; propagation to inner spans with non-inline style. (&lt;a href=&quot;https://commits.webkit.org/314502@main&quot;&gt;314502@main&lt;/a&gt;)  (111015539)&lt;/li&gt;
&lt;li&gt;Fixed unnecessary text truncation that could occur with always-on scrollbars. (&lt;a href=&quot;https://commits.webkit.org/313584@main&quot;&gt;313584@main&lt;/a&gt;)  (148428628)&lt;/li&gt;
&lt;li&gt;Fixed CSS Container Style Queries to work when the container has &lt;code&gt;display: contents&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/313677@main&quot;&gt;313677@main&lt;/a&gt;)  (164414720)&lt;/li&gt;
&lt;li&gt;Fixed CSS Style Container Query to recognize the default value of a custom property in multiline cases. (&lt;a href=&quot;https://commits.webkit.org/313957@main&quot;&gt;313957@main&lt;/a&gt;)  (165627262)&lt;/li&gt;
&lt;li&gt;Fixed CSS Anchor Positioning so that absolutely positioned elements no longer anchor to viewport-fixed-position elements unexpectedly. (&lt;a href=&quot;https://commits.webkit.org/314706@main&quot;&gt;314706@main&lt;/a&gt;)  (170323196)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;-webkit-box-pack&lt;/code&gt; to account for &lt;code&gt;box-direction&lt;/code&gt; and to handle overflow repositioning correctly. (&lt;a href=&quot;https://commits.webkit.org/313862@main&quot;&gt;313862@main&lt;/a&gt;)  (174588996)&lt;/li&gt;
&lt;li&gt;Fixed an emoji reaction overlapping the comment code box on GitHub. (&lt;a href=&quot;https://commits.webkit.org/311084@main&quot;&gt;311084@main&lt;/a&gt;)  (174652842)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;:hover&lt;/code&gt; state to repaint correctly on the customizable &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; element. (&lt;a href=&quot;https://commits.webkit.org/310623@main&quot;&gt;310623@main&lt;/a&gt;)  (175273152)&lt;/li&gt;
&lt;li&gt;Fixed text in nested CSS Subgrid with &lt;code&gt;overflow: hidden&lt;/code&gt; clipping content on subsequent items. (&lt;a href=&quot;https://commits.webkit.org/313503@main&quot;&gt;313503@main&lt;/a&gt;)  (175877530)&lt;/li&gt;
&lt;li&gt;Fixed an interaction between an &lt;code&gt;img&lt;/code&gt; with &lt;code&gt;max-width&lt;/code&gt; and surrounding elements that caused the parent&amp;#8217;s layout to compute incorrectly. (&lt;a href=&quot;https://commits.webkit.org/313105@main&quot;&gt;313105@main&lt;/a&gt;)  (176889859)&lt;/li&gt;
&lt;li&gt;Fixed incorrect margin offsets for inline &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; positioning to fix the broken layout of paragraph spacing on some sites. (&lt;a href=&quot;https://commits.webkit.org/313502@main&quot;&gt;313502@main&lt;/a&gt;)  (177139092)&lt;/li&gt;
&lt;li&gt;Fixed shrink-to-fit boxes to update their width when they gain or lose a scrollbar. (&lt;a href=&quot;https://commits.webkit.org/313390@main&quot;&gt;313390@main&lt;/a&gt;)  (177172896)&lt;/li&gt;
&lt;li&gt;Fixed CSS &lt;code&gt;zoom&lt;/code&gt; to be animatable by the computed value. (&lt;a href=&quot;https://commits.webkit.org/313735@main&quot;&gt;313735@main&lt;/a&gt;)  (177411607)&lt;/li&gt;
&lt;li&gt;Fixed preferred width to trim trailing whitespace before a preserved newline. (&lt;a href=&quot;https://commits.webkit.org/313480@main&quot;&gt;313480@main&lt;/a&gt;)  (177426037)&lt;/li&gt;
&lt;li&gt;Fixed inline layout to apply margins of preceding block content at the line start eagerly when block-in-inline content is involved. (&lt;a href=&quot;https://commits.webkit.org/313489@main&quot;&gt;313489@main&lt;/a&gt;)  (177438841)&lt;/li&gt;
&lt;li&gt;Fixed CSS &lt;code&gt;attr()&lt;/code&gt; to align with disallowing the &lt;code&gt;&amp;lt;url&amp;gt;&lt;/code&gt; type. (&lt;a href=&quot;https://commits.webkit.org/313593@main&quot;&gt;313593@main&lt;/a&gt;)  (177540489)&lt;/li&gt;
&lt;li&gt;Fixed CSS attribute selector case-insensitivity handling for HTML attributes. (&lt;a href=&quot;https://commits.webkit.org/313654@main&quot;&gt;313654@main&lt;/a&gt;)  (177547701)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;::first-letter&lt;/code&gt; to use the correct definition of punctuation. (&lt;a href=&quot;https://commits.webkit.org/313652@main&quot;&gt;313652@main&lt;/a&gt;)  (177599506)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;offset-path&lt;/code&gt; to respect &lt;code&gt;&amp;lt;coord-box&amp;gt;&lt;/code&gt; when blending &lt;code&gt;shape()&lt;/code&gt; and &lt;code&gt;basic-shape&lt;/code&gt; paths. (&lt;a href=&quot;https://commits.webkit.org/313737@main&quot;&gt;313737@main&lt;/a&gt;)  (177685457)&lt;/li&gt;
&lt;li&gt;Fixed stretch-fit width with &lt;code&gt;aspect-ratio&lt;/code&gt; providing a definite cross size to flex items when it should not. (&lt;a href=&quot;https://commits.webkit.org/313723@main&quot;&gt;313723@main&lt;/a&gt;)  (177705930)&lt;/li&gt;
&lt;li&gt;Fixed an aspect-ratio flex container resolving descendant percentage heights against a stale logical height. (&lt;a href=&quot;https://commits.webkit.org/313727@main&quot;&gt;313727@main&lt;/a&gt;)  (177711905)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;inline-block&lt;/code&gt; baseline to fall back to the bottom margin edge when the content has no in-flow line boxes. (&lt;a href=&quot;https://commits.webkit.org/313769@main&quot;&gt;313769@main&lt;/a&gt;)  (177753094)&lt;/li&gt;
&lt;li&gt;Fixed programmatic focus after keyboard interaction to match &lt;code&gt;:focus-visible&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314012@main&quot;&gt;314012@main&lt;/a&gt;)  (177850766)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;@font-face&lt;/code&gt; &lt;code&gt;font-style&lt;/code&gt; to serialize &amp;#8216;oblique 0deg&amp;#8217; as &amp;#8216;normal&amp;#8217;. (&lt;a href=&quot;https://commits.webkit.org/314128@main&quot;&gt;314128@main&lt;/a&gt;)  (178185291)&lt;/li&gt;
&lt;li&gt;Fixed serialization of explicit &lt;code&gt;font-variant&lt;/code&gt; longhands set after a system font. (&lt;a href=&quot;https://commits.webkit.org/314292@main&quot;&gt;314292@main&lt;/a&gt;)  (178251443)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;CSSFontFeatureValuesRule.fontFamily&lt;/code&gt; to be settable rather than &lt;code&gt;readonly&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314602@main&quot;&gt;314602@main&lt;/a&gt;)  (178323504)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;font-style: oblique&lt;/code&gt; to be clamped against the font&amp;#8217;s slant range rather than the &lt;code&gt;@font-face&lt;/code&gt; weight range. (&lt;a href=&quot;https://commits.webkit.org/314280@main&quot;&gt;314280@main&lt;/a&gt;)  (178324521)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;font-style: oblique&lt;/code&gt; angle being applied to the variable font &amp;#8216;slnt&amp;#8217; axis with the wrong sign. (&lt;a href=&quot;https://commits.webkit.org/314399@main&quot;&gt;314399@main&lt;/a&gt;)  (178326843)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;background&lt;/code&gt; and &lt;code&gt;mask&lt;/code&gt; coordinated property list resolved values to match the specification. (&lt;a href=&quot;https://commits.webkit.org/314242@main&quot;&gt;314242@main&lt;/a&gt;)  (178378309)&lt;/li&gt;
&lt;li&gt;Fixed longer hue interpolation when one input is &lt;code&gt;none&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314327@main&quot;&gt;314327@main&lt;/a&gt;)  (178476769)&lt;/li&gt;
&lt;li&gt;Fixed line-through to render with the correct thickness over a descendant inline box. (&lt;a href=&quot;https://commits.webkit.org/314391@main&quot;&gt;314391@main&lt;/a&gt;)  (178547557)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;font-synthesis&lt;/code&gt; to avoid synthesizing styles outside of a font&amp;#8217;s variable axis range. (&lt;a href=&quot;https://commits.webkit.org/314537@main&quot;&gt;314537@main&lt;/a&gt;)  (178550149)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;font-style: italic&lt;/code&gt; to slant a variable font whose &lt;code&gt;@font-face&lt;/code&gt; uses an oblique angle. (&lt;a href=&quot;https://commits.webkit.org/314681@main&quot;&gt;314681@main&lt;/a&gt;)  (178566326)&lt;/li&gt;
&lt;li&gt;Fixed SVG intrinsic sizing so that &lt;code&gt;height: max-content&lt;/code&gt; uses the used width rather than the default width. (&lt;a href=&quot;https://commits.webkit.org/314556@main&quot;&gt;314556@main&lt;/a&gt;)  (178712792)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;color-mix()&lt;/code&gt; to allow percentages that sum to zero. (&lt;a href=&quot;https://commits.webkit.org/314577@main&quot;&gt;314577@main&lt;/a&gt;)  (178758710)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;color-mix()&lt;/code&gt; resolution for the new 0% rules. (&lt;a href=&quot;https://commits.webkit.org/314714@main&quot;&gt;314714@main&lt;/a&gt;)  (178921722)&lt;/li&gt;
&lt;li&gt;Fixed a flex item with &lt;code&gt;min-width: min-content&lt;/code&gt; being clamped to a smaller &lt;code&gt;max-width&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314599@main&quot;&gt;314599@main&lt;/a&gt;)  (178777567)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Canvas&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Made the radii argument of &lt;code&gt;CanvasPath.roundRect()&lt;/code&gt; optional. (&lt;a href=&quot;https://commits.webkit.org/313882@main&quot;&gt;313882@main&lt;/a&gt;)  (177944903)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed canvas 2D context to set the &lt;code&gt;origin-clean&lt;/code&gt; flag when reset. (&lt;a href=&quot;https://commits.webkit.org/313824@main&quot;&gt;313824@main&lt;/a&gt;)  (177858398)&lt;/li&gt;
&lt;li&gt;Fixed canvas &lt;code&gt;fillText&lt;/code&gt; with &lt;code&gt;textAlign=center&lt;/code&gt; misplacing complex-shaped text. (&lt;a href=&quot;https://commits.webkit.org/314522@main&quot;&gt;314522@main&lt;/a&gt;)  (178682402)&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 typing Hindi (InScript) input on Google Docs. (&lt;a href=&quot;https://commits.webkit.org/297270@main&quot;&gt;297270@main&lt;/a&gt;)  (177643899)&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 identically sized buttons to render with consistent corner radius. (&lt;a href=&quot;https://commits.webkit.org/313535@main&quot;&gt;313535@main&lt;/a&gt;)  (173786057)&lt;/li&gt;
&lt;li&gt;Fixed a box with percentage offset (e.g. &lt;code&gt;top: 100%&lt;/code&gt;) being mispositioned when its containing block is out-of-flow with percentage height. (&lt;a href=&quot;https://commits.webkit.org/313364@main&quot;&gt;313364@main&lt;/a&gt;)  (177181803)&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 popover close watcher integration. (&lt;a href=&quot;https://commits.webkit.org/313838@main&quot;&gt;313838@main&lt;/a&gt;)  (129116634)&lt;/li&gt;
&lt;li&gt;Added support for SVG &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; as an argument to &lt;code&gt;Origin.from()&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314287@main&quot;&gt;314287@main&lt;/a&gt;)  (178426374)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed popover light dismiss to account for input buttons. (&lt;a href=&quot;https://commits.webkit.org/313840@main&quot;&gt;313840@main&lt;/a&gt;)  (171352032)&lt;/li&gt;
&lt;li&gt;Fixed popover light dismiss to account for disabled command buttons. (&lt;a href=&quot;https://commits.webkit.org/314400@main&quot;&gt;314400@main&lt;/a&gt;)  (171358576)&lt;/li&gt;
&lt;li&gt;Fixed a regression that broke &lt;code&gt;pushState&lt;/code&gt; with custom application URL schemes. (&lt;a href=&quot;https://commits.webkit.org/312738@main&quot;&gt;312738@main&lt;/a&gt;)  (177547157)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;outerHTML&lt;/code&gt; setter to align with the HTML standard. (&lt;a href=&quot;https://commits.webkit.org/313795@main&quot;&gt;313795@main&lt;/a&gt;)  (177788638)&lt;/li&gt;
&lt;li&gt;Fixed fragment parsing of &lt;code&gt;xmlns=&quot;&quot;&lt;/code&gt; inheritance and &lt;code&gt;annotation-xml&lt;/code&gt; encoding. (&lt;a href=&quot;https://commits.webkit.org/313803@main&quot;&gt;313803@main&lt;/a&gt;)  (177808494)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;createHTMLDocument()&lt;/code&gt; to no longer leave the body in a parsing state. (&lt;a href=&quot;https://commits.webkit.org/314295@main&quot;&gt;314295@main&lt;/a&gt;)  (178440940)&lt;/li&gt;
&lt;li&gt;Fixed text fragment matching so that a prefix is no longer matched outside of a word boundary near the start of the document. (&lt;a href=&quot;https://commits.webkit.org/314323@main&quot;&gt;314323@main&lt;/a&gt;)  (178467104)&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 images appearing then quickly disappearing on OpenTable search results. (&lt;a href=&quot;https://commits.webkit.org/313572@main&quot;&gt;313572@main&lt;/a&gt;)  (176275269)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; candidates being speculatively preloaded even when the inner &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; has &lt;code&gt;loading=lazy&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/313833@main&quot;&gt;313833@main&lt;/a&gt;)  (177833110)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;HTMLImageElement.decode()&lt;/code&gt; to no longer resolve spuriously after adoption, &lt;code&gt;src&lt;/code&gt; change, or cached-image reuse. (&lt;a href=&quot;https://commits.webkit.org/314536@main&quot;&gt;314536@main&lt;/a&gt;)  (178118012)&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 multiple &lt;code&gt;TypedArray&lt;/code&gt; constructor edge cases involving buffer sequences to align with the specification. (&lt;a href=&quot;https://commits.webkit.org/313401@main&quot;&gt;313401@main&lt;/a&gt;)  (176724918)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;WebAssembly.Memory&lt;/code&gt; and &lt;code&gt;WebAssembly.Module&lt;/code&gt; to align their cloning and transferring behavior with &lt;code&gt;SharedArrayBuffer&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/313482@main&quot;&gt;313482@main&lt;/a&gt;)  (176792374)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;Array.prototype.join&lt;/code&gt; to include prototype elements added during element &lt;code&gt;toString&lt;/code&gt; invocation. (&lt;a href=&quot;https://commits.webkit.org/314210@main&quot;&gt;314210@main&lt;/a&gt;)  (178055452)&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 WebVTT to not display cues that are larger than the viewport. (&lt;a href=&quot;https://commits.webkit.org/314333@main&quot;&gt;314333@main&lt;/a&gt;)  (136809012)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;&amp;lt;audio controls&amp;gt;&lt;/code&gt; to not show the &amp;#8220;Subtitles&amp;#8221; option when no subtitle track is present. (&lt;a href=&quot;https://commits.webkit.org/311465@main&quot;&gt;311465@main&lt;/a&gt;)  (175357130)&lt;/li&gt;
&lt;li&gt;Fixed MSE &lt;code&gt;SourceBuffer.remove()&lt;/code&gt; to no longer remove an extra sample, and fixed buffered ranges to cover the correct ranges. (&lt;a href=&quot;https://commits.webkit.org/313383@main&quot;&gt;313383@main&lt;/a&gt;)  (177065364)&lt;/li&gt;
&lt;li&gt;Fixed an HTMLMediaElement that doesn&amp;#8217;t display in an infinite scrolling webpage to use a viewport listener that notifies the media player about the visibility of the element. (&lt;a href=&quot;https://commits.webkit.org/311380@main&quot;&gt;311380@main&lt;/a&gt;)  (177081214)&lt;/li&gt;
&lt;li&gt;Fixed EME to use a 10 second key wait timeout. (&lt;a href=&quot;https://commits.webkit.org/313873@main&quot;&gt;313873@main&lt;/a&gt;)  (177936893)&lt;/li&gt;
&lt;li&gt;Fixed EME OCDM to prevent a spurious &lt;code&gt;keystatuses&lt;/code&gt; event when all keys have expired. (&lt;a href=&quot;https://commits.webkit.org/313876@main&quot;&gt;313876@main&lt;/a&gt;)  (177939767)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;getSupportedCapabilitiesForAudioVideoType&lt;/code&gt; (EME) to no longer include unsupported capabilities. (&lt;a href=&quot;https://commits.webkit.org/314032@main&quot;&gt;314032@main&lt;/a&gt;)  (178142768)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;MediaSession.setActionHandler&lt;/code&gt; to not throw an exception when called. (&lt;a href=&quot;https://commits.webkit.org/314546@main&quot;&gt;314546@main&lt;/a&gt;)  (178167294)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;AudioData.copyTo&lt;/code&gt; to throw &lt;code&gt;RangeError&lt;/code&gt; when &lt;code&gt;frameOffset&lt;/code&gt; equals &lt;code&gt;numberOfFrames&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/314451@main&quot;&gt;314451@main&lt;/a&gt;)  (178609688)&lt;/li&gt;
&lt;li&gt;Fixed MIDI and AVI MIME signature matching due to a typo in MIME sniffing. (&lt;a href=&quot;https://commits.webkit.org/314499@main&quot;&gt;314499@main&lt;/a&gt;)  (178661530)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;PannerNode&lt;/code&gt; to no longer produce non-finite samples for edge-case distance parameters. (&lt;a href=&quot;https://commits.webkit.org/314608@main&quot;&gt;314608@main&lt;/a&gt;)  (178784571)&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 URL parsing for &lt;code&gt;sendBeacon()&lt;/code&gt; and the Media Session API. (&lt;a href=&quot;https://commits.webkit.org/313403@main&quot;&gt;313403@main&lt;/a&gt;)  (177330315)&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 Google search-suggestion font sizes increasing on rotation from portrait to landscape. (&lt;a href=&quot;https://commits.webkit.org/313547@main&quot;&gt;313547@main&lt;/a&gt;)  (113801810)&lt;/li&gt;
&lt;li&gt;Fixed misrendering of Pahawh Hmong text on Wikipedia. (&lt;a href=&quot;https://commits.webkit.org/313458@main&quot;&gt;313458@main&lt;/a&gt;)  (167446860)&lt;/li&gt;
&lt;li&gt;Fixed a black region appearing on the right side of swift.org when the sidebar is open. (&lt;a href=&quot;https://commits.webkit.org/313513@main&quot;&gt;313513@main&lt;/a&gt;)  (173191807)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;&amp;lt;legend&amp;gt;&lt;/code&gt; to mask the &lt;code&gt;&amp;lt;fieldset&amp;gt;&lt;/code&gt;&amp;#8216;s border correctly when it has a negative left margin. (&lt;a href=&quot;https://commits.webkit.org/313863@main&quot;&gt;313863@main&lt;/a&gt;)  (174185071)&lt;/li&gt;
&lt;li&gt;Fixed a regression that caused incorrect layout in some content using &lt;code&gt;stretch&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/309433@main&quot;&gt;309433@main&lt;/a&gt;)  (176398251)&lt;/li&gt;
&lt;li&gt;Fixed justification expansion to apply around CJK Unified Ideographs Extensions E, F, G, and H. (&lt;a href=&quot;https://commits.webkit.org/313586@main&quot;&gt;313586@main&lt;/a&gt;)  (176759766)&lt;/li&gt;
&lt;li&gt;Fixed RTL position-fixed elements losing their contents when the document is scrolled on iOS. (&lt;a href=&quot;https://commits.webkit.org/313573@main&quot;&gt;313573@main&lt;/a&gt;)  (177454608)&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;Made SVG &lt;code&gt;&amp;lt;use&amp;gt;&lt;/code&gt; work without specifying a fragment identifier. (&lt;a href=&quot;https://commits.webkit.org/313550@main&quot;&gt;313550@main&lt;/a&gt;)  (148973201)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed the resolved value for the &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; properties on SVG &lt;code&gt;&amp;lt;rect&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;image&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt;, and other elements. (&lt;a href=&quot;https://commits.webkit.org/313859@main&quot;&gt;313859@main&lt;/a&gt;)  (96320059)&lt;/li&gt;
&lt;li&gt;Fixed an animated GIF freezing when referenced by SVG &lt;code&gt;&amp;lt;use&amp;gt;&lt;/code&gt; and the opacity was adjusted. (&lt;a href=&quot;https://commits.webkit.org/313531@main&quot;&gt;313531@main&lt;/a&gt;)  (96837306)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;vector-effect&lt;/code&gt; to apply a transform to path geometry rather than to stroke geometry. (&lt;a href=&quot;https://commits.webkit.org/314302@main&quot;&gt;314302@main&lt;/a&gt;)  (103573160)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;&amp;lt;animateMotion&amp;gt;&lt;/code&gt; non-path animations to apply the &lt;code&gt;rotate&lt;/code&gt; attribute. (&lt;a href=&quot;https://commits.webkit.org/314508@main&quot;&gt;314508@main&lt;/a&gt;)  (110915794)&lt;/li&gt;
&lt;li&gt;Fixed SVG elements with &lt;code&gt;display: contents&lt;/code&gt; being visually hidden. (&lt;a href=&quot;https://commits.webkit.org/314079@main&quot;&gt;314079@main&lt;/a&gt;)  (141825746)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;SVGPathElement.getTotalLength()&lt;/code&gt; and &lt;code&gt;. SVGPathElement.getTotalLength.getPointAtLength()&lt;/code&gt; to respect the CSS &lt;code&gt;d&lt;/code&gt; property. (&lt;a href=&quot;https://commits.webkit.org/314654@main&quot;&gt;314654@main&lt;/a&gt;)  (167195297)&lt;/li&gt;
&lt;li&gt;Fixed a rounding issue for SVG rect height with &lt;code&gt;em&lt;/code&gt; and percentage values. (&lt;a href=&quot;https://commits.webkit.org/313935@main&quot;&gt;313935@main&lt;/a&gt;)  (171587382)&lt;/li&gt;
&lt;li&gt;Fixed SVG intrinsic sizing so that &lt;code&gt;max-content&lt;/code&gt; and &lt;code&gt;min-content&lt;/code&gt; use the &lt;code&gt;viewBox&lt;/code&gt; aspect ratio when intrinsic sizes are missing. (&lt;a href=&quot;https://commits.webkit.org/313864@main&quot;&gt;313864@main&lt;/a&gt;)  (174568894)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;glyph-orientation-vertical: auto&lt;/code&gt; to decode surrogate pairs for UTR#50 lookup. (&lt;a href=&quot;https://commits.webkit.org/314070@main&quot;&gt;314070@main&lt;/a&gt;)  (175570881)&lt;/li&gt;
&lt;li&gt;Fixed handling of &lt;code&gt;pathLength=&quot;0&quot;&lt;/code&gt; and negative &lt;code&gt;pathLength&lt;/code&gt; for stroke dashing. (&lt;a href=&quot;https://commits.webkit.org/314001@main&quot;&gt;314001@main&lt;/a&gt;)  (175928827)&lt;/li&gt;
&lt;li&gt;Fixed hit-testing of &lt;code&gt;clip-path&lt;/code&gt; with nested &lt;code&gt;objectBoundingBox&lt;/code&gt; &lt;code&gt;&amp;lt;clipPath&amp;gt;&lt;/code&gt; to use the correct reference box. (&lt;a href=&quot;https://commits.webkit.org/313855@main&quot;&gt;313855@main&lt;/a&gt;)  (177605894)&lt;/li&gt;
&lt;li&gt;Fixed SVG overflowing edges when offset by a fractional value. (&lt;a href=&quot;https://commits.webkit.org/313886@main&quot;&gt;313886@main&lt;/a&gt;)  (177630386)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;feGaussianBlur&lt;/code&gt; not applying when &lt;code&gt;stdDeviation&lt;/code&gt; contains a 0 in the second component. (&lt;a href=&quot;https://commits.webkit.org/313874@main&quot;&gt;313874@main&lt;/a&gt;)  (177906905)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Deprecations&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Removed support for the non-standard &lt;code&gt;glyph-orientation-horizontal&lt;/code&gt; property. (&lt;a href=&quot;https://commits.webkit.org/314069@main&quot;&gt;314069@main&lt;/a&gt;)  (176134352)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Scrolling&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed scrolling of the &amp;#8220;Add Contacts&amp;#8221; drop-down on outlook.live.com by  narrowing the scope of a quirk. (&lt;a href=&quot;https://commits.webkit.org/314111@main&quot;&gt;314111@main&lt;/a&gt;)  (48008837)&lt;/li&gt;
&lt;li&gt;Fixed a &lt;code&gt;passive: false&lt;/code&gt; wheel event listener combined with &lt;code&gt;overscroll-behavior: contain&lt;/code&gt; preventing scrolling. (&lt;a href=&quot;https://commits.webkit.org/314170@main&quot;&gt;314170@main&lt;/a&gt;)  (137757208)&lt;/li&gt;
&lt;li&gt;Fixed the scroll anchoring behavior so that the comments panel on Quip is no longer blank when expanded. (&lt;a href=&quot;https://commits.webkit.org/314371@main&quot;&gt;314371@main&lt;/a&gt;)  (178255628)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Storage&lt;/h3&gt;
&lt;h4&gt;New Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Added support for storing &lt;code&gt;FileSystemHandle&lt;/code&gt; objects in IndexedDB. (&lt;a href=&quot;https://commits.webkit.org/314229@main&quot;&gt;314229@main&lt;/a&gt;)  (176102643)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed IndexedDB connections in workers to recover after a network process crash. (&lt;a href=&quot;https://commits.webkit.org/313509@main&quot;&gt;313509@main&lt;/a&gt;)  (177219395)&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 the &lt;code&gt;Origin-Agent-Cluster&lt;/code&gt; HTTP response header. (&lt;a href=&quot;https://commits.webkit.org/314346@main&quot;&gt;314346@main&lt;/a&gt;)  (69452369)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;IntersectionObserver&lt;/code&gt; to no longer notify targets in detached documents. (&lt;a href=&quot;https://commits.webkit.org/313834@main&quot;&gt;313834@main&lt;/a&gt;)  (162699098)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;IntersectionObserverEntry.boundingClientRect&lt;/code&gt; to honor CSS zoom aware &lt;code&gt;getBoundingClientRect&lt;/code&gt;. (&lt;a href=&quot;https://commits.webkit.org/313512@main&quot;&gt;313512@main&lt;/a&gt;)  (177250323)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;IntersectionObserver&lt;/code&gt; to report correct bounds for SVG element targets. (&lt;a href=&quot;https://commits.webkit.org/313596@main&quot;&gt;313596@main&lt;/a&gt;)  (177260411)&lt;/li&gt;
&lt;li&gt;Fixed Web Locks API to remove the &lt;code&gt;AbortSignal&lt;/code&gt; abort algorithm after a lock request settles. (&lt;a href=&quot;https://commits.webkit.org/314433@main&quot;&gt;314433@main&lt;/a&gt;)  (178589067)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Web Extensions&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed cross-origin &lt;code&gt;XMLHttpRequest&lt;/code&gt; from a Safari Web Extension to no longer trigger an additional permissions request. (&lt;a href=&quot;https://commits.webkit.org/313506@main&quot;&gt;313506@main&lt;/a&gt;)  (154866064)&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 separate column to show the node associated with layout and rendering events. (&lt;a href=&quot;https://commits.webkit.org/314460@main&quot;&gt;314460@main&lt;/a&gt;)  (177618501)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed hovering over a node in a preview for a collection to highlight the node in the inspected page. (&lt;a href=&quot;https://commits.webkit.org/314589@main&quot;&gt;314589@main&lt;/a&gt;)  (20341722)&lt;/li&gt;
&lt;li&gt;Fixed style sheets created via CSSOM (such as &lt;code&gt;adoptedStyleSheets&lt;/code&gt;) being incorrectly marked as User Agent Style Sheets. (&lt;a href=&quot;https://commits.webkit.org/313738@main&quot;&gt;313738@main&lt;/a&gt;)  (134101594)&lt;/li&gt;
&lt;li&gt;Fixed clearing the Console tab search field to dismiss the Clear Filters button. (&lt;a href=&quot;https://commits.webkit.org/313599@main&quot;&gt;313599@main&lt;/a&gt;)  (176388155)&lt;/li&gt;
&lt;li&gt;Fixed properties added to an element&amp;#8217;s Style Attribute sometimes disappearing momentarily. (&lt;a href=&quot;https://commits.webkit.org/314467@main&quot;&gt;314467@main&lt;/a&gt;)  (178053421)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebGPU&lt;/h3&gt;
&lt;h4&gt;Resolved Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed WGSL parser handling of identifiers per the latest specification. (&lt;a href=&quot;https://commits.webkit.org/313405@main&quot;&gt;313405@main&lt;/a&gt;)  (177008615)&lt;/li&gt;
&lt;li&gt;Fixed WGSL validation of binary expressions involving short-circuit and/or operators. (&lt;a href=&quot;https://commits.webkit.org/313467@main&quot;&gt;313467@main&lt;/a&gt;)  (177012957)&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 WebRTC media capabilities to report power-efficient AV1 decoding when supported. (&lt;a href=&quot;https://commits.webkit.org/313468@main&quot;&gt;313468@main&lt;/a&gt;)  (174686183)&lt;/li&gt;
&lt;li&gt;Fixed audio issues when joining Cisco Meeting Server meetings using Safari. (&lt;a href=&quot;https://commits.webkit.org/313415@main&quot;&gt;313415@main&lt;/a&gt;)  (175260977)&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 #68</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-68/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-68/</id>
		<updated>2026-06-16T10:14:06+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from June 9 to June 16.&lt;/p&gt;
&lt;p&gt;
The major highlight this week is the Web Engines Hackfest! Despite it, there
are a variety of updates as well, such as various improvements to input
handling in WPE WebKit and WebKitGTK, WPE menu rendering changes, and a
plethora of other smaller improvements.
&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;Input methods may now &lt;a href=&quot;https://commits.webkit.org/315091@main&quot; rel=&quot;external&quot;&gt;know whether a field is intended to be used as search input&lt;/a&gt;, in which case the &lt;code&gt;WebKitInputMethodContext:input-purpose&lt;/code&gt; property will have the value &lt;code&gt;WEBKIT_INPUT_PURPOSE_SEARCH&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Due to GTK not providing an equivalent value for &lt;code&gt;GtkInputPurpose&lt;/code&gt;, the default behaviour is to continue mapping search fields to &lt;code&gt;GTK_INPUT_PURPOSE_FREE_FORM&lt;/code&gt; as before; but custom input methods may use the new value to detect search inputs. When using WPEPlatform, the value is mapped to &lt;code&gt;WPE_INPUT_PURPOSE_SEARCH&lt;/code&gt;, which has been added as well.&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/314898@main&quot; rel=&quot;external&quot;&gt;Handle&lt;/a&gt; selections as part of &lt;code&gt;moveBefore&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/314884@main&quot; rel=&quot;external&quot;&gt;Corrected&lt;/a&gt; user activation propagation for close watchers.&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/314695@main&quot; rel=&quot;external&quot;&gt;Invalidate&lt;/a&gt; &lt;code&gt;:lang()&lt;/code&gt; and &lt;code&gt;:dir()&lt;/code&gt; selectors after &lt;code&gt;moveBefore&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/315081@main&quot; rel=&quot;external&quot;&gt;Enable&lt;/a&gt; Close Watchers in preview.&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;WPE &lt;a href=&quot;https://github.com/WebKit/WebKit/commit/5ccb692f3e65ac32d6d6b83796dd8c9ca0bf1e1b&quot; rel=&quot;external&quot;&gt;now&lt;/a&gt; renders its own popup menus for elements such as &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/select&quot; rel=&quot;external&quot;&gt;&lt;code&gt;select&lt;/code&gt;&lt;/a&gt;. It supports all styling options the web provides such as colors and fonts. The internal menu can be overriden with the existing &lt;a href=&quot;https://wpewebkit.org/reference/stable/wpe-webkit-2.0/signal.WebView.show-option-menu.html&quot; rel=&quot;external&quot;&gt;&lt;code&gt;WebView::show-option-menu&lt;/code&gt;&lt;/a&gt; signal. Cog for example still renders its own (with a &lt;a href=&quot;https://github.com/Igalia/cog/commit/8a7051b553328638772188f617e1e05e7a5ca486&quot; rel=&quot;external&quot;&gt;recent commit&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A colorful context menu&quot; src=&quot;https://blogs.igalia.com/webkit/blog/2026/wip-68/context-menu-1.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A context menu with a simpler style&quot; src=&quot;https://blogs.igalia.com/webkit/blog/2026/wip-68/context-menu-2.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A context menu inside an iFrame&quot; src=&quot;https://blogs.igalia.com/webkit/blog/2026/wip-68/context-menu-iframe.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A context menu inside a rotated container&quot; src=&quot;https://blogs.igalia.com/webkit/blog/2026/wip-68/context-menu-rotated.png&quot; /&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;The &lt;a href=&quot;https://webengineshackfest.org/&quot; rel=&quot;external&quot;&gt;Web Engines Hackfest&lt;/a&gt; started! We had a fantastic first day of talks, and now are heading to &lt;a href=&quot;https://webengineshackfest.org/#breakout-sessions&quot; rel=&quot;external&quot;&gt;breakout sessions&lt;/a&gt;. Make sure to check the schedule for sessions that may interest you!&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">The golden rule of Customizable Select</title>
		<link href="https://webkit.org/blog/18117/the-golden-rule-of-customizable-select/"/>
		<id>https://webkit.org/?p=18117</id>
		<updated>2026-06-15T21:20:31+00:00</updated>
		<content type="html">&lt;p&gt;Customizable select is coming to Safari 27. With this technology, developers can fully control the appearance of &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; elements — custom arrows, option layouts, color swatches, icons, full visual styling — without the need for JavaScript libraries or an endless parade of &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; elements. And because it’s a built-in control, you don’t have to compromise on keyboard navigation or accessibility semantics.&lt;/p&gt;
&lt;p&gt;But, to ensure this built-in control works well for everyone, it’s important to follow this single but essential rule: &lt;strong&gt;always provide text content or accessible text attributes for your &lt;code&gt;option&lt;/code&gt; elements.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every time that rule is broken, every time an option is styled to show a visual without any text and without any accessible fallbacks, three different problems get introduced all at once. The menu is harder to use for everyone, impossible to use with accessibility tools, and it becomes a completely broken experience in browsers that don’t support it yet.&lt;/p&gt;
&lt;p&gt;When you remember to follow the rule, you’ll improve the user experience, support accessibility, and provide progressive enhancement so it works for people regardless of what browser they choose.&lt;/p&gt;
&lt;p&gt;We’ll show you why following this mission critical rule gets you:&lt;/p&gt;
&lt;h2&gt;Better UX&lt;/h2&gt;
&lt;p&gt;Take this category filter from a photographer&amp;#8217;s gallery site. The version below uses icons alone — a building, a flower, a hummingbird — to represent each category:&lt;/p&gt;
&lt;figure&gt;&lt;source media=&quot;(prefers-color-scheme: dark)&quot; type=&quot;image/png&quot; /&gt;&lt;img alt=&quot;customizable select of categories for photo gallery with no labels&quot; class=&quot;aligncenter size-full wp-image-17357 preserve-color&quot; height=&quot;1080&quot; src=&quot;https://webkit.org/wp-content/uploads/customizable-select-no-labels-LIGHT.png&quot; width=&quot;1920&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;It looks clean. But a user who doesn&amp;#8217;t immediately recognize what the hummingbird icon represents has no fallback. The closed select shows only an icon in the button, with no other hint of what&amp;#8217;s currently selected. Add a text label to each option and the experience becomes immediately scannable. The selected state is readable at a glance, and every option is unambiguous:&lt;/p&gt;
&lt;figure&gt;&lt;source media=&quot;(prefers-color-scheme: dark)&quot; type=&quot;image/png&quot; /&gt;&lt;img alt=&quot;customizable select of categories for photo gallery with labels&quot; class=&quot;aligncenter size-full wp-image-17357 preserve-color&quot; height=&quot;1080&quot; src=&quot;https://webkit.org/wp-content/uploads/customizable-select-with-labels-LIGHT.png&quot; width=&quot;1920&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;The icons are still there. The labels make it readily decipherable for everyone.&lt;/p&gt;
&lt;h2&gt;Better accessibility&lt;/h2&gt;
&lt;p&gt;When a screen reader encounters an option with no text, the user may not hear a descriptive label for each option. Braille rendering and other assistive technology output may also be confusing. Text, even when hidden visually with a &lt;code&gt;.visually-hidden&lt;/code&gt; class, stays in the accessibility tree and gives screen readers, braille displays, and speech recognition software something real to work with. If you use an icon as an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;, add an &lt;code&gt;alt&lt;/code&gt; or &lt;code&gt;aria-label&lt;/code&gt; — or mark it decorative using &lt;code&gt;alt=&quot;&quot;&lt;/code&gt; and let the visible or visually-hidden label carry the meaning.&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;option&lt;/span&gt;&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;span class=&quot;keyword&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;keyword attribute&quot;&gt;src&lt;/span&gt;=&lt;span class=&quot;attribute value string&quot;&gt;&quot;bird.svg&quot;&lt;/span&gt; &lt;span class=&quot;keyword attribute&quot;&gt;alt&lt;/span&gt;=&lt;span class=&quot;attribute value string&quot;&gt;&quot;&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;span class=&quot;keyword&quot;&gt;span&lt;/span&gt;&amp;gt;&lt;/span&gt;Wildlife&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;span class=&quot;keyword&quot;&gt;span&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;span class=&quot;keyword&quot;&gt;option&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The problem you solve isn&amp;#8217;t just a compliance checkbox: it&amp;#8217;s the difference between a visitor completing your form and someone abandoning it.&lt;/p&gt;
&lt;h2&gt;Better progressive enhancement&lt;/h2&gt;
&lt;p&gt;Customizable select is a new feature. Browsers that don&amp;#8217;t yet support it fall back to the platform-native &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; — which is exactly the right behavior, as long as your options still make sense in that fallback state.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve removed text in favor of icons or swatches, a user on an older browser sees a dropdown full of empty options. The same is true when CSS fails to load at all: a slow connection, a corporate proxy stripping stylesheets, a user with custom styles enabled. Wrap your enhancements in &lt;code&gt;@supports (appearance: base-select)&lt;/code&gt; and keep plain text as your baseline. Adding a swatch is an enhancement. Removing the color name to make room for it is a regression.&lt;/p&gt;
&lt;p&gt;The rule for maximizing the power and utility of customizable select is simple: keep the text. You can hide it visually. You can make it tiny. You can position it off-screen. But it needs to be there. Icons, swatches, and illustrations are additions to an option — never substitutes for it. Follow that rule and the rest of customizable select is yours to play with.&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;We love hearing from you. To share your thoughts, find our web evangelists online: Saron Yitbarek on &lt;a href=&quot;https://bsky.app/profile/saron.bsky.social&quot;&gt;BlueSky&lt;/a&gt;, 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;, 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;. If you run into any issues, we welcome your &lt;a href=&quot;https://feedbackassistant.apple.com/&quot;&gt;feedback&lt;/a&gt; on Safari UI (learn more about &lt;a href=&quot;https://developer.apple.com/bug-reporting/&quot;&gt;filing Feedback&lt;/a&gt;), or your &lt;a href=&quot;https://bugs.webkit.org/&quot;&gt;WebKit bug report&lt;/a&gt; about web technologies or Web Inspector. If you run into a website that isn’t working as expected, please file a report at &lt;a href=&quot;https://webcompat.com/&quot;&gt;webcompat.com&lt;/a&gt;. Filing issues really does make a difference.&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">Introducing the Field Guide to Grid Lanes</title>
		<link href="https://webkit.org/blog/18098/introducing-the-field-guide-to-grid-lanes/"/>
		<id>https://webkit.org/?p=18098</id>
		<updated>2026-06-10T07:30:35+00:00</updated>
		<content type="html">&lt;p&gt;This week, we launched the Field Guide to Grid Lanes at &lt;a href=&quot;https://gridlanes.webkit.org/&quot;&gt;gridlanes.webkit.org&lt;/a&gt;.&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;Field Guide to Grid Lanes website header&quot; class=&quot;aligncenter size-full wp-image-18103&quot; height=&quot;1452&quot; src=&quot;https://webkit.org/wp-content/uploads/field-guide-top-light-scaled.png&quot; width=&quot;2560&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;If you ever bookmarked the CSS Tricks Complete Guide to Flexbox, HTML5 Rocks, or CSS Zen Garden, a guide like this might feel familiar. It’s designed to be an easy introduction, a reference guide — and just plain fun.&lt;/p&gt;
&lt;h2&gt;The interactive playground&lt;/h2&gt;
&lt;p&gt;At the top is a live, editable Grid Lanes layout. Switch between Waterfall and Brick. Try preset layouts. Drag the slider labeled “Flow tolerance” and click “Play tab order” to understand the impact of &lt;code&gt;flow-tolerance&lt;/code&gt;.&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;Interactive drawing of website with items laid out with Grid Lanes. Multiple buttons, sliders, and a code editor make it possible to try out many combinations quickly &amp;amp; see the results. &quot; class=&quot;aligncenter size-full wp-image-18108&quot; height=&quot;2099&quot; src=&quot;https://webkit.org/wp-content/uploads/field-guide-playground-light-scaled.png&quot; width=&quot;2560&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;Resize the demo browser window to test responsive behavior without resizing your whole window. Edit the CSS directly. Copy the code you create.&lt;/p&gt;
&lt;h2&gt;The cheat sheet&lt;/h2&gt;
&lt;p&gt;Next is the Field Guide itself — a single-page reference for every property, value, and option.&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 first part of the reference guide, showing lots of definitions, little diagrams, and tiny code snippets &quot; class=&quot;aligncenter size-full wp-image-18110&quot; height=&quot;2282&quot; src=&quot;https://webkit.org/wp-content/uploads/field-guide-ref-light-scaled.png&quot; width=&quot;2560&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;It has four sections:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grid Lanes Basics&lt;/strong&gt; — &lt;code&gt;display: grid-lanes&lt;/code&gt;, plus the difference between waterfall and brick layouts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Options for Lane Definitions&lt;/strong&gt; — Grid track-sizing with &lt;code&gt;fr&lt;/code&gt; units, fixed lengths, percentages, &lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;min-content&lt;/code&gt; &amp;amp; &lt;code&gt;max-content&lt;/code&gt;, &lt;code&gt;fit-content()&lt;/code&gt;, &lt;code&gt;minmax()&lt;/code&gt;, &lt;code&gt;repeat()&lt;/code&gt;, and &lt;code&gt;auto-fill&lt;/code&gt; vs &lt;code&gt;auto-fit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Options for Placement &amp;amp; Spacing&lt;/strong&gt; — &lt;code&gt;flow-tolerance&lt;/code&gt;, &lt;code&gt;gap&lt;/code&gt;, spanning tracks, and explicit placement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Good to Know&lt;/strong&gt; — info about source order, progressive enhancement, and switching layouts at different breakpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The demos&lt;/h2&gt;
&lt;p&gt;To showcase the possibilities of Grid Lanes, we created six demos, each available in several variations:&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;The six demos listed on the homepage — with a screenshot of each.&quot; class=&quot;aligncenter size-full wp-image-18112&quot; height=&quot;1714&quot; src=&quot;https://webkit.org/wp-content/uploads/field-guide-demos-light-scaled.png&quot; width=&quot;2560&quot; /&gt;&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Photos&lt;/strong&gt; — just images, in a variety of aspect ratios&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recipes&lt;/strong&gt; — components containing both flexible images and varying lengths of text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Newspaper&lt;/strong&gt; — longer passages of text, with a few images (and a lot of CSS puns)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mega Menu&lt;/strong&gt; — lists of very short text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timeline&lt;/strong&gt; — text in brick layout&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pinboard&lt;/strong&gt; — mixed media&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each demo opens with a floating control panel.&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 one of the demos, happens to be of photo layout. The controls are showing, as described in the article. &quot; class=&quot;aligncenter size-full wp-image-18114&quot; height=&quot;1966&quot; src=&quot;https://webkit.org/wp-content/uploads/field-guide-controls-light-scaled.png&quot; width=&quot;2560&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;“Layout” offers a dropdown of variations — showing off what Grid Lanes can do, and comparing it to Flexbox, Multicolumn, and Grid. “Numbers” shows item order. “Flow tolerance” lets you experiment with its effects. The code panel displays the key layout CSS.&lt;/p&gt;
&lt;p&gt;“Hide controls” puts the focus on the demo itself. To get the controls back, click the gear that appears in the lower-right corner.&lt;/p&gt;
&lt;h2&gt;Working with Safari’s developer tools&lt;/h2&gt;
&lt;p&gt;Web Inspector knows about Grid Lanes, too. Toggle “Order Numbers” to reveal overlays marking the DOM order of items. These numbers are extremely useful when experimenting to find the best &lt;code&gt;flow-tolerance&lt;/code&gt; value for your content.&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 photo demo, with Web Inspector open. The Grid Inspector is showing, with Item numbers are turned on. This creates lines all over the webpage, revealing the Grid Lanes layout, and marking each Item with a number. &quot; class=&quot;aligncenter size-full wp-image-18116&quot; height=&quot;2099&quot; src=&quot;https://webkit.org/wp-content/uploads/field-guide-inspector-light-scaled.png&quot; width=&quot;2560&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;Learn more by reading &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;/p&gt;
&lt;h2&gt;What about other browsers?&lt;/h2&gt;
&lt;p&gt;Grid Lanes works today in Safari 26.4+. For the latest information about other browsers, check &lt;a href=&quot;https://caniuse.com/css-grid-lanes&quot;&gt;Can I Use&lt;/a&gt;. For progressive enhancement guidance, read &lt;a href=&quot;https://webkit.org/blog/17758/when-will-css-grid-lanes-arrive-how-long-until-we-can-use-it/&quot;&gt;When will CSS Grid Lanes arrive? How long until we can use it?&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Made by the people who shipped it&lt;/h2&gt;
&lt;p&gt;The Field Guide was built by the same team behind Grid Lanes. We hope this is a fun experience that makes Grid Lanes easy to learn. Bookmark it, share it with colleagues, and let us know what you make.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gridlanes.webkit.org/&quot;&gt;&lt;strong&gt;Visit the Field Guide →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;We’d love to hear from you. 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;</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">Discover MapKit JS 6: Rebuilt for Today’s Web Developer</title>
		<link href="https://webkit.org/blog/18027/discover-mapkit-js-6-rebuilt-for-todays-web-developer/"/>
		<id>https://webkit.org/?p=18027</id>
		<updated>2026-06-09T17:00:35+00:00</updated>
		<content type="html">&lt;p&gt;MapKit JS allows you to bring the power and simplicity of Apple Maps to your website or web app.  Whether you&amp;#8217;re building a store locator, a travel planner, or a companion web experience for a native app, MapKit JS offers you a robust, privacy-first framework, providing the mapping data, services, and design quality behind Apple Maps, directly to your JavaScript code.&lt;/p&gt;
&lt;p&gt;If you haven’t tried MapKit JS lately, now is a great time to take another look. With our latest version 6 release, we’ve made it easier than ever for you to integrate MapKit JS into your apps and websites by modernizing around today’s web development patterns.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;see-it-in-action&quot;&gt;&lt;/a&gt;See It in Action&lt;/h2&gt;
&lt;p&gt;Getting a MapKit JS map onto a page takes a few lines of code. In this post, we’ll guide you, step-by -step, through how to build a sample app — Yosemite Explorer — featuring points of interest across Yosemite National Park in California. &lt;a href=&quot;https://webkit.org/demos/yosemite/&quot;&gt;Explore the demo&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt=&quot;image, showing the full app: POIs marked on the map with one selected, showing place detail popover and driving directions&quot; class=&quot;preserve-color wp-image-18034&quot; height=&quot;1656&quot; src=&quot;https://webkit.org/wp-content/uploads/yosemite-explorer-hero.png&quot; width=&quot;2136&quot; /&gt;&lt;br /&gt;
&lt;/figure&gt;
&lt;h2&gt;&lt;a name=&quot;try-it-yourself&quot;&gt;&lt;/a&gt;Try it yourself&lt;/h2&gt;
&lt;h3&gt;&lt;a name=&quot;apple-developer-account&quot;&gt;&lt;/a&gt;Apple Developer Account&lt;/h3&gt;
&lt;p&gt;To display a map, provide a developer token to MapKit JS. You generate that token through an Apple Developer account — and that same account unlocks a lot more than just maps. With an Apple Developer account, you get access to Apple&amp;#8217;s full suite of developer services: publish Safari Web Extensions, and use powerful web frameworks like MusicKit JS for Apple Music integration, CloudKit JS for iCloud-backed data storage, and more. &lt;a href=&quot;https://developer.apple.com/account&quot;&gt;Sign up for an Apple Developer account&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;MapKit JS 6 makes token setup significantly simpler. You can now use a static token bound to your website&amp;#8217;s domain, generated directly from the Apple Developer website — no private key management or self-signing required. For details, see &lt;a href=&quot;https://developer.apple.com/documentation/mapkitjs/creating-a-maps-token&quot;&gt;Creating a Maps token&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;load-the-framework&quot;&gt;&lt;/a&gt;Load the Framework&lt;/h3&gt;
&lt;p&gt;New in v6, the MapKit JS loader ships as an NPM package, so the framework integrates directly into modern build pipelines. If you are looking to build a quick prototype or load MapKit JS directly in HTML, you can also skip to [Loading the MapKit JS script in your browser] below.&lt;/p&gt;
&lt;h4&gt;&lt;a name=&quot;load-with-mapkit-js-loader&quot;&gt;&lt;/a&gt;Load with MapKit JS Loader&lt;/h4&gt;
&lt;p&gt;To get our Yosemite map running, the next step is to install the package:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;sh&quot;&gt;npm install @apple/mapkit-loader
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you can load the framework with the token you generated in the previous step:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;keyword control&quot;&gt;import&lt;/span&gt; { &lt;span class=&quot;identifier&quot;&gt;load&lt;/span&gt; } &lt;span class=&quot;identifier&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&quot;@apple/mapkit-loader&quot;&lt;/span&gt;;

&lt;span class=&quot;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;mapkit&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;load&lt;/span&gt;({
    &lt;span class=&quot;identifier&quot;&gt;libraries&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; [&lt;span class=&quot;string&quot;&gt;&quot;map&quot;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&quot;services&quot;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&quot;annotations&quot;&lt;/span&gt;],
    &lt;span class=&quot;identifier&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&quot;your-token-here&quot;&lt;/span&gt;
});
&lt;span class=&quot;identifier&quot;&gt;console&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&quot;MapKit loads&quot;&lt;/span&gt;, &lt;span class=&quot;identifier&quot;&gt;mapkit&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;loadedLibraries&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let’s reload the page. The &lt;code&gt;console.log()&lt;/code&gt; output should appear in Web Inspector:&lt;/p&gt;
&lt;figure&gt;&lt;img alt=&quot;screenshot of Web Inspector showing MapKit JS loads&quot; class=&quot;preserve-color wp-image-18045&quot; height=&quot;1024&quot; src=&quot;https://webkit.org/wp-content/uploads/web-inspector-mapkit.png&quot; width=&quot;2212&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;MapKit JS partitions its features into libraries, so you load only what you need. Set the &lt;code&gt;libraries&lt;/code&gt; array to the minimal set for the best performance. When you load MapKit JS through MapKit JS Loader, it automatically sources full TypeScript support through DefinitelyTyped into your project. &lt;a href=&quot;https://developer.apple.com/documentation/mapkitjs/loading-the-latest-version-of-mapkit-js#Select-MapKit-JS-libraries&quot;&gt;Find a list of available libraries in developer documentation for MapKit JS&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;a name=&quot;alternative-load-the-mapkit-js-script-in-html&quot;&gt;&lt;/a&gt;Alternative: Load the MapKit JS script in HTML&lt;/h4&gt;
&lt;p&gt;For quick prototyping or web apps without a build pipeline, you can load and initialize MapKit JS with a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag:&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;script&lt;/span&gt; &lt;span class=&quot;keyword attribute&quot;&gt;src&lt;/span&gt;=&lt;span class=&quot;attribute value string&quot;&gt;&quot;https://cdn.apple-mapkit.com/mk/6/mapkit.core.js&quot;&lt;/span&gt;
     &lt;span class=&quot;keyword attribute&quot;&gt;crossorigin&lt;/span&gt; &lt;span class=&quot;keyword attribute&quot;&gt;async&lt;/span&gt;
     &lt;span class=&quot;keyword attribute&quot;&gt;data-callback&lt;/span&gt;=&lt;span class=&quot;attribute value string&quot;&gt;&quot;initMapKit&quot;&lt;/span&gt;
     &lt;span class=&quot;keyword attribute&quot;&gt;data-libraries&lt;/span&gt;=&lt;span class=&quot;attribute value string&quot;&gt;&quot;map,services,annotations&quot;&lt;/span&gt;
     &lt;span class=&quot;keyword attribute&quot;&gt;data-token&lt;/span&gt;=&lt;span class=&quot;attribute value string&quot;&gt;&quot;your-token-here&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;span class=&quot;keyword&quot;&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the script loads, it invokes &lt;code&gt;window.initMapKit&lt;/code&gt; — a callback you define — after which the &lt;code&gt;mapkit&lt;/code&gt; namespace is available under &lt;code&gt;window&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;create-a-map&quot;&gt;&lt;/a&gt;Create a Map&lt;/h3&gt;
&lt;p&gt;You create a map by passing the ID of a container element and a region. For our example, we center the map view on Yosemite Valley and set the camera high enough to cover the whole valley.&lt;/p&gt;
&lt;p&gt;First, in HTML, define a sized container for the map view:&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;id&lt;/span&gt;=&lt;span class=&quot;attribute value string&quot;&gt;&quot;map-container&quot;&lt;/span&gt; &lt;span class=&quot;keyword attribute&quot;&gt;style&lt;/span&gt;=&lt;span class=&quot;attribute value string&quot;&gt;&quot;width: 500px; height: 500px;&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&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;In JavaScript, frame the map viewport by setting a center coordinate (latitude and longitude) and a camera distance (in meters):&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;map&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;mapkit&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;Map&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&quot;map-container&quot;&lt;/span&gt;, {
    &lt;span class=&quot;identifier&quot;&gt;center&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;mapkit&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;Coordinate&lt;/span&gt;(&lt;span class=&quot;number&quot;&gt;37.7456&lt;/span&gt;, &lt;span class=&quot;operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;119.5936&lt;/span&gt;),
    &lt;span class=&quot;identifier&quot;&gt;cameraDistance&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;28000&lt;/span&gt;
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With that, the framework renders an interactive map in your container, centered on Yosemite Valley:&lt;/p&gt;
&lt;figure class=&quot;widescreen&quot;&gt;&lt;img alt=&quot;image showing map loads inside the container&quot; class=&quot;preserve-color wp-image-18047&quot; height=&quot;1616&quot; src=&quot;https://webkit.org/wp-content/uploads/yosemite-explorer-map.png&quot; width=&quot;2130&quot; /&gt;&lt;/figure&gt;
&lt;h4&gt;&lt;a name=&quot;alternative-create-a-map-with-frameworks&quot;&gt;&lt;/a&gt;Alternative: Create a Map with frameworks&lt;/h4&gt;
&lt;p&gt;When using a UI framework, pass in the DOM element directly. For example, in React:&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;mapRef&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;useRef&lt;/span&gt;(&lt;span class=&quot;keyword literal&quot;&gt;null&lt;/span&gt;);

&lt;span class=&quot;identifier&quot;&gt;useEffect&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;keyword operator&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;mapkit&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;Map&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;mapRef&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;current&lt;/span&gt;, {
            &lt;span class=&quot;identifier&quot;&gt;region&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;mapkit&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;CoordinateRegion&lt;/span&gt;(
                &lt;span class=&quot;keyword operator&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;mapkit&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;Coordinate&lt;/span&gt;(&lt;span class=&quot;number&quot;&gt;37.3349&lt;/span&gt;, &lt;span class=&quot;operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;122.0090&lt;/span&gt;),
            &lt;span class=&quot;keyword operator&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;mapkit&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;CoordinateSpan&lt;/span&gt;(&lt;span class=&quot;number&quot;&gt;0.01&lt;/span&gt;, &lt;span class=&quot;number&quot;&gt;0.01&lt;/span&gt;)
        )
    });
}, []);

&lt;span class=&quot;keyword control&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;identifier&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt;{&lt;span class=&quot;identifier&quot;&gt;mapRef&lt;/span&gt;} &lt;span class=&quot;identifier&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt;{{ &lt;span class=&quot;identifier&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&quot;500px&quot;&lt;/span&gt;, &lt;span class=&quot;identifier&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&quot;500px&quot;&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;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a name=&quot;add-place-annotations&quot;&gt;&lt;/a&gt;Add Place Annotations&lt;/h3&gt;
&lt;p&gt;You can add custom annotations or overlays to the interactive map view. In this example, we&amp;#8217;ll showcase places in Yosemite National Park with &lt;code&gt;PlaceAnnotation&lt;/code&gt; — an annotation that automatically picks up the place&amp;#8217;s title, coordinate, and iconography from Apple&amp;#8217;s data.&lt;/p&gt;
&lt;p&gt;Each place in Apple Maps is referenced by a Place ID, an opaque string that represents a point of interest rather than a specific coordinate or address. You can find Place IDs with the &lt;a href=&quot;https://developer.apple.com/maps/place-id-lookup/&quot;&gt;Place ID Lookup tool&lt;/a&gt; or &lt;a href=&quot;https://developer.apple.com/documentation/mapkitjs/search&quot;&gt;the Search service&lt;/a&gt;. New in v6, &lt;code&gt;PlaceLookup&lt;/code&gt; returns a promise, so you can pass a Place ID, &lt;code&gt;await&lt;/code&gt; the result, and create the annotation in a single flow:&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;placeLookup&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;mapkit&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;PlaceLookup&lt;/span&gt;();

&lt;span class=&quot;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&quot;I7408F9590EC1AB75&quot;&lt;/span&gt;;
&lt;span class=&quot;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;place&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;placeLookup&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;getPlace&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;id&lt;/span&gt;);
&lt;span class=&quot;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;annotation&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;mapkit&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;PlaceAnnotation&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;place&lt;/span&gt;, {
    &lt;span class=&quot;identifier&quot;&gt;selectionAccessory&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;mapkit&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;PlaceSelectionAccessory&lt;/span&gt;()
});

&lt;span class=&quot;identifier&quot;&gt;addToList&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;annotation&lt;/span&gt;);
&lt;span class=&quot;identifier&quot;&gt;map&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;addAnnotation&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;annotation&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The code snippet above adds a &lt;code&gt;PlaceAnnotation&lt;/code&gt; to the map and populates the same place on a list. The list draws the place name using the &lt;code&gt;annotation.title&lt;/code&gt; property:&lt;/p&gt;
&lt;figure&gt;&lt;img alt=&quot;image showing the map with a PlaceAnnotation&quot; class=&quot;preserve-color wp-image-18049&quot; height=&quot;1578&quot; src=&quot;https://webkit.org/wp-content/uploads/yosemite-explorer-place-annotation.png&quot; width=&quot;2116&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;The snippet also sets a &lt;code&gt;selectionAccessory&lt;/code&gt; option to a &lt;code&gt;PlaceSelectionAccessory&lt;/code&gt; instance. When the user selects a marker, selection accessory displays detailed information of that place, like contact information or operating hours.&lt;/p&gt;
&lt;figure&gt;&lt;img alt=&quot;image showing the marker selected with selection accessory shown&quot; class=&quot;preserve-color wp-image-18050&quot; height=&quot;1706&quot; src=&quot;https://webkit.org/wp-content/uploads/yosemite-explorer-marker-selected.png&quot; width=&quot;2374&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;Repeat the place lookup to populate the app with all places.&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;respond-to-interactions&quot;&gt;&lt;/a&gt;Respond to Interactions&lt;/h3&gt;
&lt;p&gt;We want to present the user interface in a consistent state. New in v6, MapKit JS uses the standard browser &lt;code&gt;EventTarget&lt;/code&gt; model, so handling map events works like handling any other DOM event. When the user selects an annotation on the map, you can update the corresponding list item:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;identifier&quot;&gt;map&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;addEventListener&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&quot;select&quot;&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;keyword type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;identifier&quot;&gt;selected&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;annotation&lt;/span&gt;;
    &lt;span class=&quot;identifier&quot;&gt;setListSelected&lt;/span&gt;(&lt;span class=&quot;identifier&quot;&gt;selected&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;id&lt;/span&gt;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Likewise, when the user selects a list item, select the corresponding annotation on the map. Since each list item holds a reference to the annotation instance, set its &lt;code&gt;selected&lt;/code&gt; property to &lt;code&gt;true&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;identifier&quot;&gt;element&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;addEventListener&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&quot;click&quot;&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;annotation&lt;/span&gt;.&lt;span class=&quot;identifier&quot;&gt;selected&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;keyword literal&quot;&gt;true&lt;/span&gt;;
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This creates a two-way binding so the list and the map feel connected when either is interacted with. With that, we completed our app:&lt;/p&gt;
&lt;figure class=&quot;widescreen&quot;&gt;&lt;video controls=&quot;controls&quot; src=&quot;https://webkit.org/wp-content/uploads/yosemite-explorer-click.mov&quot;&gt;video, showing list item rendered as selected when the marker is selected&lt;/video&gt;&lt;/figure&gt;
&lt;p&gt;The same &lt;code&gt;addEventListener&lt;/code&gt; pattern applies to annotation selections, map region changes, and every other MapKit JS interaction. See &lt;a href=&quot;https://developer.apple.com/documentation/mapkitjs/handling-map-events&quot;&gt;Handling map events&lt;/a&gt; to learn about all available event types.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;apple-maps-built-for-the-web&quot;&gt;&lt;/a&gt;Apple Maps, Built for the Web&lt;/h2&gt;
&lt;p&gt;In walking through the Yosemite Explorer example, you&amp;#8217;ve seen several v6 changes working together. Installing MapKit JS as an npm package makes getting started more straightforward. Handling annotation selection with &lt;code&gt;addEventListener&lt;/code&gt; puts the standard browser &lt;code&gt;EventTarget&lt;/code&gt; model to work — one that v6 adopts consistently across the API. Using &lt;code&gt;await&lt;/code&gt; for place lookups uses native promises throughout. And the authentication token you configured at the start is scoped to specific capabilities, giving you fine-grained control over access. Together, these changes make bringing the power of Apple Maps to your website a natural part of your development process.&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;next-steps&quot;&gt;&lt;/a&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;Explore the &lt;a href=&quot;https://developer.apple.com/documentation/mapkitjs&quot;&gt;MapKit JS documentation&lt;/a&gt; to dive deeper into the API. If you are using an earlier version of MapKit JS, check out the &lt;a href=&quot;https://developer.apple.com/documentation/mapkitjs/migrating-from-version-5-to-version-6&quot;&gt;migration guide&lt;/a&gt;. Try the code samples in your own project, and share feedback through &lt;a href=&quot;https://feedbackassistant.apple.com/&quot;&gt;Feedback Assistant&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 #67</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-67/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-67/</id>
		<updated>2026-06-08T20:57:00+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from June 1 to June 8.&lt;/p&gt;
&lt;p&gt;
Another great week, this time we have a performance improvement implemented
in the Skia-based compositor, an excellent writeup about how to investigate
and isolate memory leaks in WPE WebKit, a couple of multimedia fixes, and a
variety of improvements and fixes across WebKit ports.
&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/313910@main&quot; rel=&quot;external&quot;&gt;Implement&lt;/a&gt; dialog integration with close watcher.&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/314384@main&quot; rel=&quot;external&quot;&gt;Implement&lt;/a&gt; node iterator and live range pre-remove steps for in-progress &lt;code&gt;moveBefore()&lt;/code&gt; implementation.&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/313888@main&quot; rel=&quot;external&quot;&gt;Fix&lt;/a&gt; an early return in CloseWatcher close to align with the spec.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The Web Inspector &lt;a href=&quot;https://github.com/WebKit/WebKit/commit/f7dd925a68af3c39406f6942a728e1428d00f802&quot; rel=&quot;external&quot;&gt;now shows&lt;/a&gt; DOM nodes associated with layout and rendering events in a separate column of layout timeline next to initiator, sizing, and timing information. Hovering over rows in the details table highlights the associated node, and clicking it reveals the node in the &quot;Elements&quot; tab. This makes it easier to match events with specific nodes and helps debugging changes to a web page.&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/314400@main&quot; rel=&quot;external&quot;&gt;Fix&lt;/a&gt; popover light dismiss to account for disabled command buttons.&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://bugs.webkit.org/show_bug.cgi?id=316190&quot; rel=&quot;external&quot;&gt;Fix&lt;/a&gt; &lt;code&gt;mediaTime&lt;/code&gt; provided with &lt;code&gt;requestVideoFrameCallback&lt;/code&gt; in case of captureCanvas as source.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=316404&quot; rel=&quot;external&quot;&gt;Don&#x27;t use the Rialto specific video decoder+sink on WebAudio, where its usage as a pure decoder isn&#x27;t compatible&lt;/a&gt; and would cause issues.&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/314626@main&quot; rel=&quot;external&quot;&gt;Batched painting&lt;/a&gt; support was implemented in the Skia-based compositor, improving the performance in several cases.&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;Pawel Lampe published &lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot; rel=&quot;external&quot;&gt;a blog post&lt;/a&gt; where he&#x27;s presenting and discussing a guide on structured approach to narrowing down and debugging memory leaks within WPE WebKit.&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 #66</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-66/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-66/</id>
		<updated>2026-06-02T00:12:49+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from May 19 to June 1.&lt;/p&gt;
&lt;p&gt;
The main feature of this week are new releases: stable ones with many security
fixes, and development ones with the new Skia-based compositor enabled. Additionally,
there was work on Web-facing features, optimizations, spell checking support for
the WPE port, and more.
&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;WebKit now &lt;a href=&quot;https://github.com/WebKit/WebKit/pull/63123&quot; rel=&quot;external&quot;&gt;supports&lt;/a&gt; mirroring
MathML stretchy operators using the OpenType &lt;code&gt;rtlm&lt;/code&gt; feature.&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/313671@main&quot; rel=&quot;external&quot;&gt;Replaced&lt;/a&gt; the &lt;code&gt;CloseWatcherManager&lt;/code&gt;&#x27;s
&lt;code&gt;escapeKeyHandler&lt;/code&gt;, which will allow other types of close signals to be supported.&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/313611@main&quot; rel=&quot;external&quot;&gt;Implemented&lt;/a&gt; queuing mutation observer
records in the work-in-progress &lt;code&gt;moveBefore()&lt;/code&gt; implementation.&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/313838@main&quot; rel=&quot;external&quot;&gt;Implemented&lt;/a&gt; popover integration with
close watcher.&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/313840@main&quot; rel=&quot;external&quot;&gt;Fixed&lt;/a&gt; popover light dismiss to
account for &lt;code&gt;popovertarget&lt;/code&gt; on input buttons.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Content filters now &lt;a href=&quot;https://commits.webkit.org/313681@main&quot; rel=&quot;external&quot;&gt;create temporary files in the compiled filters
directory&lt;/a&gt;, which ensures that a file
rename can always be used to place them at their final location. This avoids
falling back to a regular file copy, which can be slower, when the temporary
directory returned by &lt;code&gt;g_get_tmp_dir()&lt;/code&gt; (typically &lt;code&gt;/tmp&lt;/code&gt;) is in a different
volume than the filters&#x27; storage path configured for
&lt;a href=&quot;https://wpewebkit.org/reference/stable/wpe-webkit-2.0/class.UserContentFilterStore.html&quot; rel=&quot;external&quot;&gt;WebKitUserContentFilterStore&lt;/a&gt;.&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://commits.webkit.org/313825@main&quot; rel=&quot;external&quot;&gt;Enabled spell checking support in
WPE&lt;/a&gt;. The existing implementation for
the WebKitGTK port, which uses the
&lt;a href=&quot;https://rrthomas.github.io/enchant/&quot; rel=&quot;external&quot;&gt;Enchant&lt;/a&gt; library as a backend, was
generalized to provide spell checking support in WPE as well. The feature may
be toggled at build time using the &lt;code&gt;ENABLE_SPELLCHECK&lt;/code&gt; CMake option.&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/06/02/webkitgtk2.52.4-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK
2.52.4&lt;/a&gt; and
&lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.52.4.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.52.4&lt;/a&gt; have
been released; they include a number of fixes for security issues, and it is a
highly recommended update. The corresponding security advisory, &lt;code&gt;WSA-2026-0003&lt;/code&gt;
(&lt;a href=&quot;https://webkitgtk.org/security/WSA-2026-0003.html&quot; rel=&quot;external&quot;&gt;GTK&lt;/a&gt;,
&lt;a href=&quot;https://wpewebkit.org/security/WSA-2026-0003.html&quot; rel=&quot;external&quot;&gt;WPE&lt;/a&gt; is available as well.
The release also includes a number of small improvements and Web compatibility
fixes.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Additionally, development releases &lt;a href=&quot;https://webkitgtk.org/2026/05/28/webkitgtk2.53.3-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK
2.53.3&lt;/a&gt; and
&lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.53.3.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.53.3&lt;/a&gt; are
available since last week. These include a change to use a new Skia-based
compositor by default, which is intended to replace TextureMapper once ready.
Therefore, &lt;a href=&quot;https://bugs.webkit.org&quot; rel=&quot;external&quot;&gt;bug reports&lt;/a&gt; related to website rendering
are particularly welcome when using this and subsequent development releases.&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;The deprecated and un-maintained Flatpak-based SDK was
&lt;a href=&quot;https://github.com/WebKit/WebKit/pull/61566&quot; rel=&quot;external&quot;&gt;removed&lt;/a&gt;. Developers working on
the WPE and GTK WebKit ports are encouraged to migrate to the &lt;a href=&quot;https://github.com/Igalia/webkit-container-sdk&quot; rel=&quot;external&quot;&gt;new
SDK&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">Pawel Lampe: WPE memory leak investigation playbook</title>
		<link href="https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/"/>
		<id>https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/</id>
		<updated>2026-06-02T00:00:00+00:00</updated>
		<content type="html">&lt;!-- ############################################ SWEEP  ############################################--&gt;
&lt;p&gt;Depending on the web application, the WPE WebKit memory usage trend can vary. When simple web applications are being processed, the memory consumption tends to be virtually stable (the same) no matter the period. However, when more complicated web applications
are being executed, the memory usage usually grows over time while going back to normal from time to time e.g., when GC / memory pressure mechanism releases all kinds of caches and not-needed memory. Therefore, memory growth itself is not unusual.
Nevertheless, as the memory leaks happen in WPE at times, the memory growth is worth investigating — especially if very rapid or unbounded.&lt;/p&gt;
&lt;p&gt;This article presents a structured playbook for investigating such a memory growth and memory leaks in WPE. Rather than diving straight into debugging tools, it starts from first principles: confirming the problem is real, choosing the right
environment to work in, and narrowing down the leaking area before any heavy tooling is involved. The goal is to reach actual debugging as fast as possible, regardless of whether the environment is an embedded device or a desktop machine,
and regardless of how quickly the problem reproduces.&lt;/p&gt;
&lt;h2 id=&quot;playbook&quot; tabindex=&quot;-1&quot;&gt;Playbook &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The high-level list of recommended steps to follow is presented below. In a nutshell, the steps &lt;strong&gt;1&lt;/strong&gt;, &lt;strong&gt;2&lt;/strong&gt;, and &lt;strong&gt;3&lt;/strong&gt; are meant to choose and follow the fastest possible investigation path so that actual debugging of the problem
(step &lt;strong&gt;4&lt;/strong&gt;) can be started as soon as possible.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Confirming the problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Identifying the best setup for reproducing the problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Narrowing down&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;on &lt;strong&gt;embedded&lt;/strong&gt; when the problem takes a &lt;strong&gt;long time&lt;/strong&gt; to reproduce&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;on &lt;strong&gt;embedded&lt;/strong&gt; when the problem reproduces &lt;strong&gt;quickly&lt;/strong&gt;&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;on &lt;strong&gt;desktop&lt;/strong&gt; when the problem takes a &lt;strong&gt;long time&lt;/strong&gt; to reproduce&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;on &lt;strong&gt;desktop&lt;/strong&gt; when the problem reproduces &lt;strong&gt;quickly&lt;/strong&gt;&lt;/a&gt;,&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Debugging&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;1-confirming-the-problem&quot; tabindex=&quot;-1&quot;&gt;1. Confirming the problem &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The ultimate first step when working with alleged memory leak is to check whether the observed memory growth is actually abnormal. In the case of web browsers in general, the memory growth alone may not necessarily mean something is leaking.
&lt;strong&gt;There may be many regular reasons why the browser’s memory usage is growing&lt;/strong&gt;, but the usual suspects are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JavaScript-level memory allocations&lt;/strong&gt; — due to the very nature of JavaScript, the memory it allocates causes the overall web content process memory growth up until the garbage collector (GC) kicks in. Then (from the RSS perspective) some memory
is usually freed. However, as it’s not easy to predict when the GC will be invoked (e.g., when the browser processes an application that performs heavy rendering), it’s possible that memory will grow but remain garbage-collectible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript Just-in-Time (JIT) compilation&lt;/strong&gt; — when not explicitly disabled or limited, the processing of any web application that has JavaScript code associated with it will cause the browser to continuously compile the JavaScript code in the
background so that it executes such code faster in runtime at the expense of memory that is required for storing compiled artifacts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caches&lt;/strong&gt; — as the WPE operates, it caches things such as web resources, style resolution artifacts, textures, glyph atlases, layer tiles, display lists, rasterization artifacts, and many others. Naturally, the cache sizes are limited, however,
if many caches are growing at the same time, they may create an impression of a leak. The difference in that case is, the caches stop growing at some point.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Due to the above, to confirm the memory growth is abnormal, one should usually try the following first:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Triggering memory pressure&lt;/a&gt; to force the browser to trigger GC and evict as many cache entries as possible,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Rerunning the browser with JIT disabled&lt;/a&gt; to rule out the JIT-related memory growth — unless the application code is very small.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the memory growth doesn’t stop with JIT disabled or its level does not go back to normal after triggering memory pressure, the growth can be assumed to be abnormal, and one can proceed to the next step.&lt;/p&gt;
&lt;h3 id=&quot;2-identifying-the-best-setup-for-reproducing-the-problem&quot; tabindex=&quot;-1&quot;&gt;2. Identifying the best setup for reproducing the problem &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When the memory growth is atypical, it needs to be narrowed down in a way that the final debugging is possible. For both narrowing down and the debugging, &lt;strong&gt;one should aim at the most flexible development environment along with the smallest possible
web application that reproduces the problem quickly&lt;/strong&gt;. What it means in practice is — desktop environment along with small demo web application that reproduces the problem. Whilst it’s not always possible to have such an environment, the 3 general
rules are as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Desktop environment is usually better than embedded one&lt;/strong&gt; in terms of working with memory leaks as it offers minimal overhead (e.g., in terms of compilation times) and huge flexibility in choosing the industry standard tools for profiling/debugging.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small web application is always better than a big one as long as it still reproduces the same problem in the same amount of time&lt;/strong&gt;. In such case, a small application minimizes the amount of noise that usually stands in the way of profiling/debugging.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A web application that reproduces the problem quickly is always better than the one that needs much more time for it&lt;/strong&gt;. The worst thing that can happen in the case of narrowing down memory leaks, is when the memory growth is noticeable or starts
after a very long time such as hours/days+.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Given the above, at this point one should go through the below steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check if the setup is trivial enough already&lt;/strong&gt; — if the web application reproduces the problem quickly in a desktop environment and is simple enough, one should immediately jump to the &lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Debugging&lt;/a&gt; section.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check if the problem can be reproduced on desktop assuming it originally reproduces on embedded&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check if the problem can be reproduced faster if it’s not reproducing fast enough&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check if the web application could be simplified.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once the setup is simplified as much as possible, one should proceed to one of &lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;narrowing down&lt;/a&gt; sections depending on the setup. Also, if the setup is still not ideal, one should actively seek opportunities for simplifying the setup
even during &lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;narrowing down&lt;/a&gt; as it’s likely that some new information will eventually open new possibilities in terms of simplifying setup.&lt;/p&gt;
&lt;h3 id=&quot;3-narrowing-down&quot; tabindex=&quot;-1&quot;&gt;3. Narrowing down &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When the problem has been confirmed but there are not enough clues to tell exactly which parts leak, the &lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;debugging&lt;/a&gt; cannot be started right away. In such case, it’s necessary to narrow down the problem to the browser/application area
that can be easily debugged.&lt;/p&gt;
&lt;p&gt;While in some cases narrowing down is not even necessary, quite often it takes orders of magnitude more time than actual debugging, and hence one should pay special attention to this step.&lt;/p&gt;
&lt;h3 id=&quot;3a-narrowing-down-on-embedded-when-the-problem-takes-a-long-time-to-reproduce&quot; tabindex=&quot;-1&quot;&gt;3a. Narrowing down on embedded when the problem takes a long time to reproduce &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is the toughest situation one can find themselves in. When a problem takes a long time to reproduce (hours/days+), every iteration/test comes automatically with a significant cost. Moreover, when the environment is an embedded one,
rebuilding WPE is usually more time-consuming and the amount of tooling is usually limited — or requires some work to bring it to the image at least.&lt;/p&gt;
&lt;p&gt;Due to the above, narrowing down the problem in this setup requires a structured approach with extra care. In such case, the things to check should be approached in steps defined as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Things to check without rerunning the WebKit&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;in case of embedded devices, extra care is needed when attaching a memory profiler. On low-end devices, memory profilers tend to slow down the application hard enough to trigger otherwise non-existent problems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Things to check without rebuilding the WebKit&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;in case of embedded devices, one should prefer limiting JIT over disabling it as without it, the JS execution may be slow enough to trigger unexpected scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Things to check if rebuilding WebKit&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ideally, while checking various things along the above steps, one should batch as many checks as possible within individual tests.&lt;/p&gt;
&lt;h3 id=&quot;3b-narrowing-down-on-embedded-when-the-problem-reproduces-quickly&quot; tabindex=&quot;-1&quot;&gt;3b. Narrowing down on embedded when the problem reproduces quickly &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When the problem reproduces quickly, the limitations of embedded environment are not that relevant. In this scenario, one should prioritize getting debug symbols (&lt;code&gt;RelWithDebInfo&lt;/code&gt; build) into the image and utilizing them by running
the browser with whatever profilers are available. For the specific things to check, one should seek inspiration in the following groups:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Things to check without rebuilding the WebKit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Things to check if rebuilding WebKit&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;3c-narrowing-down-on-desktop-when-the-problem-takes-a-long-time-to-reproduce&quot; tabindex=&quot;-1&quot;&gt;3c. Narrowing down on desktop when the problem takes a long time to reproduce &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This situation is similar to &lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;3a&lt;/a&gt; and hence one should follow the things to check from the following groups:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Things to check without rerunning the WebKit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Things to check without rebuilding the WebKit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Things to check if rebuilding WebKit&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;However, this time, there are some extra opportunities around tooling:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;There should be many more tools available already in the system or available to be installed.&lt;/li&gt;
&lt;li&gt;Tools such as memory profilers that could slow down the application making it unusable on embedded, may turn out to be working well when the desktop-class processing power is available.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With the above in mind, it’s worth trying all the tools available with priority because if at least one tool works well, one can save hours of narrowing down.&lt;/p&gt;
&lt;h3 id=&quot;3d-narrowing-down-on-desktop-when-the-problem-reproduces-quickly&quot; tabindex=&quot;-1&quot;&gt;3d. Narrowing down on desktop when the problem reproduces quickly &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is technically the simplest possible scenario, so basically, all the possibilities are available. The most time-consuming activity in this case is very likely rebuilding WebKit itself — although it should still be relatively fast.
In such case, just after a few quick checks with the Web Inspector, it’s recommended to get debug symbols (&lt;code&gt;RelWithDebInfo&lt;/code&gt; build) and start with tools such as memory profilers.&lt;/p&gt;
&lt;p&gt;Other than the above, one should go through the following groups on things to check:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Things to check without rebuilding the WebKit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Things to check if rebuilding WebKit&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;4-debugging&quot; tabindex=&quot;-1&quot;&gt;4. Debugging &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The WPE debugging is twofold and depends on whether the problem is within the engine (usually C/C++ code) or the web application (JavaScript code).&lt;/p&gt;
&lt;h4 id=&quot;when-problem-lies-in-the-engine&quot; tabindex=&quot;-1&quot;&gt;When problem lies in the engine &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Debugging WPE WebKit is the same as debugging any other C/C++ application on Linux (or Mac if the issue is cross-port and one prefers an Apple port to work with), and hence is outside the scope of this article. Some WebKit-specific information
can be found in the &lt;a href=&quot;https://docs.webkit.org/Build%20%26%20Debug/BuildOptions.html&quot;&gt;WebKit Documentation article on building and debugging&lt;/a&gt; page and therefore is recommended as a first step.&lt;/p&gt;
&lt;h4 id=&quot;when-problem-lies-in-web-application&quot; tabindex=&quot;-1&quot;&gt;When problem lies in web application &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;When the problem lies in JavaScript code, the situation is usually fairly straightforward. The majority of bugs in this area should be reproducible across various browser engines and hence a full variety of tooling should be available.
If the WebKit is preferred or if the problem reproduces only there, the tooling available is still very useful and helps debugging problems quickly. The ultimate tool in such case is the
&lt;a href=&quot;https://developer.apple.com/documentation/safari-developer-tools/web-inspector&quot;&gt;Web Inspector&lt;/a&gt;. On official WebKit’s web page there’s entire index of &lt;a href=&quot;https://webkit.org/web-inspector/&quot;&gt;articles on Web Inspector&lt;/a&gt;. Among those, the most interesting
read is about &lt;a href=&quot;https://webkit.org/web-inspector/timelines-tab/&quot;&gt;Timelines Tab&lt;/a&gt; where the most useful debugging can be done. Once the features of &lt;strong&gt;Timelines Tab&lt;/strong&gt; are understood, the next important article is
&lt;a href=&quot;https://webkit.org/blog/6425/memory-debugging-with-web-inspector/&quot;&gt;the memory debugging guide&lt;/a&gt;. It dives into the most important &lt;strong&gt;Timelines Tab&lt;/strong&gt; subsections and showcases the work with heap snapshots which is a key. To supplement it,
it’s very important to know the &lt;strong&gt;heap snapshot delta&lt;/strong&gt; feature which is basically about button:&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;Web Inspector heap delta.&quot; height=&quot;285&quot; src=&quot;https://blogs.igalia.com/plampe/img/eSkdO_v8QP-1261.png&quot; width=&quot;1261&quot; /&gt;
&lt;/center&gt;
&lt;p&gt;that allows one to inspect the delta-snapshot between 2 snapshots. It’s critical as it answers the question on what JS objects were added between the base snapshot and the later one. If some objects are piling up, it immediately shows
which ones.&lt;/p&gt;
&lt;p&gt;One important note on snapshots is that in some cases when using Web Inspector is not possible, one can generate the snapshots manually from the web engine’s C++ code by just calling &lt;code&gt;GarbageCollectionController::singleton().dumpHeap();&lt;/code&gt; at
some appropriate moment. In this case, the dump will be written to standard output. It can be then turned into a file and imported from any &lt;strong&gt;Web Inspector&lt;/strong&gt; using &lt;strong&gt;Import&lt;/strong&gt; button.&lt;/p&gt;
&lt;p&gt;As the &lt;strong&gt;Timelines Tab&lt;/strong&gt; with its subsections should be able to answer on &lt;em&gt;what happens&lt;/em&gt;, to understand &lt;em&gt;why&lt;/em&gt; it actually happens, the last missing piece is the JS debugger within &lt;strong&gt;Web Inspector&lt;/strong&gt;. It’s not very different to debuggers in
other engines, but it’s worth checking a &lt;a href=&quot;https://webkit.org/web-inspector/javascript-breakpoints/&quot;&gt;dedicated article&lt;/a&gt; on it just to understand the capabilities.&lt;/p&gt;
&lt;h2 id=&quot;appendix&quot; tabindex=&quot;-1&quot;&gt;Appendix &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;things-to-check-without-rerunning-the-webkit&quot; tabindex=&quot;-1&quot;&gt;Things to check without rerunning the webkit &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Even if the WPE is running with default settings in release mode, there are plenty of useful things that can be checked while the browser is still running:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Identifying which WebKit process allocates abnormally,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;there are multiple ways to do this, but usually it’s as easy as using &lt;code&gt;ps&lt;/code&gt; utility.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identifying how fast the process in question allocates the memory,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;this is useful to know at least for comparison purposes, but it may hint some problems already if the numbers correlate with what web application does.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Checking logs from stdout, stderr, and journal (using &lt;code&gt;journalctl&lt;/code&gt;).&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Checking detailed process memory statistics&lt;/a&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Triggering and checking the impact of memory pressure&lt;/a&gt; on given processes RSS,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;in short, memory pressure triggers the cleanup of the majority of caches along with GC. Therefore, if this is able to bring memory back to normal level, then the problem is about caches, JS Heap / GC, or fragmentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Attaching memory profilers&lt;/a&gt; if available,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;even if the debug symbols are not present, this may be useful to see what data is being captured and how the web application behaves when slowed down by profiler.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Attaching other tools&lt;/a&gt; if available,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;even if the debug symbols are not present, various tools offer different perspectives on what the browser is doing. In some cases, such information may reveal some anomalies that may be related to the main issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-checking with other browsers,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;if other browsers show a similar pattern of memory usage, it’s very likely the problem lies in web application itself. Otherwise, it strongly suggests a bug in the WPE.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-checking with other ports,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;if any other WebKit port shows a similar pattern of memory usage, it allows one to narrow down the area in the code a bit based on what port it is:
&lt;ul&gt;
&lt;li&gt;if the same behavior is visible in any of &lt;strong&gt;Apple&lt;/strong&gt; ports, the problem is most likely related to cross-platform code,&lt;/li&gt;
&lt;li&gt;if the same behavior is visible only in &lt;strong&gt;GTK&lt;/strong&gt; port, then the problem is most likely related to GLib-related part, coordinated graphics part, GStreamer-related part, or others that are shared.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;things-to-check-without-rebuilding-the-webkit&quot; tabindex=&quot;-1&quot;&gt;Things to check without rebuilding the webkit &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Tweaking and checking the logs from WPE&lt;/a&gt;,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;while generic logs may hint some unusual behavior, more specific ones such as GC logs (&lt;code&gt;JSC_logGC=1&lt;/code&gt;) may be used to check how the individual JS heap sizes evolve over time and how GC behaves. &lt;strong&gt;If it’s JavaScript
leaking the memory, this log will quickly provide the evidence&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Enabling Remote Web Inspector&lt;/a&gt; and checking:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;both breakdown and trend of memory usage in the &lt;a href=&quot;https://webkit.org/web-inspector/timelines-tab/#memory-timeline&quot;&gt;memory timeline&lt;/a&gt; after doing a bit of recording,&lt;/li&gt;
&lt;li&gt;the effects of &lt;code&gt;takeHeapSnapshot()&lt;/code&gt; invoked from JS console:
&lt;ul&gt;
&lt;li&gt;as this function usually triggers GC internally, it may be used to check how much RSS memory is reclaimed by GC in isolation (followed up by scavenger),&lt;/li&gt;
&lt;li&gt;as this function takes a JS heap snapshot, it then can be used to explore &lt;a href=&quot;https://webkit.org/blog/6425/memory-debugging-with-web-inspector/&quot;&gt;manually&lt;/a&gt; if its contents point towards something interesting.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Disabling JIT&lt;/a&gt; and checking the memory usage,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;if the memory usage is stable with JIT disabled, one should proceed to the step below.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Limiting JIT&lt;/a&gt; and checking the memory usage,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;there are at least a few places (levels) where JIT compilation engine allocates memory. If limiting doesn’t resolve the issue completely, it’s likely the engine itself leaks some memory around temporary helper-heaps such as &lt;code&gt;AssemblerData&lt;/code&gt; etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Experimenting with environment variables and runtime preferences&lt;/a&gt;,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;some environment variables and runtime preferences change the behavior of the web engine significantly. If changing one of them makes the problem go away, it usually helps to narrow down the problematic area quickly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Running WPE with system malloc (environment variable &lt;code&gt;Malloc=1&lt;/code&gt;) and checking the memory usage,&lt;/strong&gt; &lt;!-- comparing memory usage vs bmalloc/libpas,** &lt;\!-- (`Malloc=1`) -\-&gt; --&gt;
&lt;ul&gt;
&lt;li&gt;when one suspects bmalloc/libpas issues with fragmentation or scavenger, it’s worth running a browser with system malloc to compare the memory evolution over time against the bmalloc/libpas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Limiting device memory&lt;/a&gt; and checking the memory usage,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;if &lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;triggering memory pressure&lt;/a&gt;&lt;/strong&gt; is not possible, an alternative solution is to limit the device memory so that the browser is under constant memory pressure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Running WPE with sysprof&lt;/a&gt; and checking:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;stack traces&lt;/strong&gt; — to see what parts of engine are particularly active as it may hint some problematic area,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebKit marks&lt;/strong&gt; — to see what the engine is doing as well as quantitative data in marks such as &lt;code&gt;EventLoopRun&lt;/code&gt; etc. as in those cases the numeric value trends may reveal resource pile up.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;things-to-check-if-rebuilding-webkit&quot; tabindex=&quot;-1&quot;&gt;Things to check if rebuilding webkit &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Building WPE in release mode with debug symbols&lt;/a&gt; and re-trying memory profilers or other tools if the debug symbols were not present before,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;if some desired tools such as &lt;strong&gt;heaptrack&lt;/strong&gt;, &lt;strong&gt;valgrind&lt;/strong&gt;, &lt;strong&gt;perf&lt;/strong&gt;, or &lt;strong&gt;strace&lt;/strong&gt; were not available before, it’s the right moment to get/build them as well,&lt;/li&gt;
&lt;li&gt;once the debug symbols are in, one should try:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;attaching memory profilers&lt;/a&gt;&lt;/strong&gt; if available, and inspecting detailed memory allocation reports,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;attaching other tools&lt;/a&gt;&lt;/strong&gt; if available, and investigating the traces.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Building and running with Google perftools,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;as WPE allows switching to system malloc as an allocator, it’s possible to use custom malloc implementation with instrumentation such as &lt;a href=&quot;https://github.com/gperftools/gperftools&quot;&gt;gperftools&lt;/a&gt;. For that, the recommended read is
&lt;a href=&quot;https://http503.gvatas.in/2024/10/09/diagnosing-memory-leaks-in-wpewebkit-with-google-perftools/&quot;&gt;this article&lt;/a&gt; from fellow Igalian, Pablo Saavedra.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Building and running with sanitizers&lt;/a&gt;,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;if the problem is about low-level leak, address/leak sanitizer should be able to help pointing out the problematic area.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Building and running with memory sampler&lt;/a&gt;,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;the data produced by memory sampler is roughly the same as inspector’s &lt;a href=&quot;https://webkit.org/web-inspector/timelines-tab/#memory-timeline&quot;&gt;memory timeline&lt;/a&gt;, however, it’s much more convenient as it doesn’t need web inspector at all.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Building and running with node statistics&lt;/a&gt;,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;when memory growth seems to be related to DOM mutations, it’s worth enabling and reporting node statistics periodically — in some cases, it may directly suggest what the problem is about.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Building and running with malloc heap breakdown,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;when all other means fail, a very good last-resort approach for investigating memory usage statistics via a debug-only WebKit feature called &lt;strong&gt;Malloc Heap Breakdown&lt;/strong&gt;. The details can be found in
&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/tracking-webkit-s-memory-allocations-with-malloc-heap-breakdown/&quot;&gt;the dedicated article about it&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;Building and running with libpas statistics&lt;/a&gt;,&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;On very rare occasions such as memory fragmentation or allocation issues, it may be worth checking the &lt;a href=&quot;https://docs.webkit.org/Deep%20Dive/Libpas/Libpas.html&quot;&gt;libpas&lt;/a&gt; (low-level memory allocation and management library)
statistics as WPE uses it by default on the vast majority of platforms.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;individual-instructions&quot; tabindex=&quot;-1&quot;&gt;Individual instructions &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;checking-detailed-process-memory-statistics&quot; tabindex=&quot;-1&quot;&gt;Checking detailed process memory statistics &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;As WPE WebKit uses multi-process architecture, there are multiple processes that can be checked, although the most interesting one is usually the &lt;strong&gt;Web Content Process&lt;/strong&gt;. Once the PID of the given process is determined (e.g., using &lt;code&gt;ps&lt;/code&gt; utility)
the usual steps to check detailed memory statistics are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat /proc/&amp;lt;PID&amp;gt;/status&lt;/code&gt; or &lt;code&gt;cat /proc/&amp;lt;PID&amp;gt;/statm&lt;/code&gt; for very basic statistics,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pmap -X &amp;lt;PID&amp;gt;&lt;/code&gt; - for detailed statistics (if available),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat /proc/&amp;lt;PID&amp;gt;/smaps_rollup&lt;/code&gt; and &lt;code&gt;cat /proc/&amp;lt;PID&amp;gt;/smaps&lt;/code&gt; for detailed statistics (requires &lt;code&gt;CONFIG_PROC_PAGE_MONITOR&lt;/code&gt; kernel configuration option).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;triggering-memory-pressure-from-os&quot; tabindex=&quot;-1&quot;&gt;Triggering memory pressure from OS &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;WPE uses a so-called &lt;strong&gt;Memory Pressure Monitor&lt;/strong&gt; to observe the memory usage in the system and to react if there’s not much memory left. The default thresholds are specified in &lt;code&gt;MemoryPressureMonitor.cpp&lt;/code&gt; and usually are
90% for non-critical and 95% for critical response. Depending on the response, WPE schedules GC and clears internal caches immediately.&lt;/p&gt;
&lt;p&gt;As the above is usually on by default, one can leverage it to trigger GC (along with cache cleanups) by filling up the available memory in the OS to 95+%. There are many ways to allocate memory, yet the simplest is using &lt;code&gt;stress&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;e.g. &lt;code&gt;stress --vm 1 --vm-bytes 1024M --vm-keep&lt;/code&gt; to allocate 1024 MB.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;attaching-memory-profilers&quot; tabindex=&quot;-1&quot;&gt;Attaching memory profilers &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;When attaching any memory profiler, unless one wants to profile only native allocations (Skia, GStreamer, ICU, etc.), the key is to use &lt;code&gt;Malloc=1&lt;/code&gt; environment variable on WPE startup so that bmalloc uses system malloc instead of libpas.
Also, if WebKit is using a sanboxed mode in given configuration, it’s usually necessary to use &lt;code&gt;WEBKIT_DISABLE_SANDBOX_THIS_IS_DANGEROUS=1&lt;/code&gt; as well. Then the commands are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;to attach &lt;strong&gt;heaptrack&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;heaptrack -p &amp;lt;PID&amp;gt;&lt;/code&gt; so e.g. &lt;code&gt;heaptrack -p $(pgrep WPEWebProcess)&lt;/code&gt; (see &lt;a href=&quot;https://blogs.igalia.com/plampe/tracking-webkit-s-memory-allocations-with-malloc-heap-breakdown/#heaptrack&quot;&gt;this article&lt;/a&gt; for details),&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;to run with &lt;strong&gt;valgrind’s massif&lt;/strong&gt; (as attaching to running process is not possible):
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;valgrind --tool=massif --trace-children=yes &amp;lt;WPE-BROWSER-COMMAND&amp;gt;&lt;/code&gt; (see &lt;a href=&quot;https://blogs.igalia.com/plampe/tracking-webkit-s-memory-allocations-with-malloc-heap-breakdown/#massif-valgrind&quot;&gt;this article&lt;/a&gt; for details).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;attaching-other-tools&quot; tabindex=&quot;-1&quot;&gt;Attaching other tools &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If memory profilers are unusable or unavailable, it’s worth checking if other tools are present and experimenting a bit with them if so. In some cases, tools other than memory profilers may give some hints on further investigation
or reveal a suspicious pattern within application execution. Some ideas for experiments with various tools are listed below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;strace:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;strace -c -p $(pgrep WPEWebProcess)&lt;/code&gt; — &lt;strong&gt;strace&lt;/strong&gt; called with &lt;code&gt;-c&lt;/code&gt; gives a nice summary of system calls executed by the traced application. It can be useful to check the overall syscall usage pattern to see if there are any anomalies.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;strace -p $(pgrep WPEWebProcess) -e trace=mmap,munmap,mremap,madvise -tt&lt;/code&gt; — &lt;strong&gt;strace&lt;/strong&gt; focused on &lt;code&gt;mmap()&lt;/code&gt;-related system calls may be useful to debug libpas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;perf:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;perf record -F 999 -ag -p $(pgrep WPEWebProcess) -- sleep 60&lt;/code&gt; — regular recording with &lt;strong&gt;perf&lt;/strong&gt; can be very useful, especially if symbols are available. With that, one can generate
&lt;a href=&quot;https://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html&quot;&gt;flamegraphs&lt;/a&gt; and investigate what’s going on in the browser. While it’s not about profiling memory, it may be helpful to narrow down at least a bit.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;perf record -F 999 -e syscalls:sys_enter_mmap,syscalls:sys_enter_munmap,syscalls:sys_enter_mremap:sys_enter_madvise -ag -p $(pgrep WPEWebProcess) -- sleep 60&lt;/code&gt; — &lt;strong&gt;perf&lt;/strong&gt; focused on &lt;code&gt;mmap()&lt;/code&gt;-related system calls is much more superior
than e.g. &lt;strong&gt;strace&lt;/strong&gt; as it also records stack traces. Therefore, if debug symbols are present, and if the memory growth is very rapid, it’s very likely the libpas &lt;code&gt;mmap()&lt;/code&gt; stacktraces will lead to the growth origin statistically.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;perf trace -e mmap,munmap,mremap,madvise -p $(pgrep WPEWebProcess)&lt;/code&gt; — this is very much similar to &lt;strong&gt;strace&lt;/strong&gt; focused on &lt;code&gt;mmap()&lt;/code&gt;-related system calls as it shows a live preview of what’s happening.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sysprof:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sysprof-cli -f&lt;/code&gt; — while running system-wide &lt;strong&gt;sysprof&lt;/strong&gt; won’t make WPE push marks into it, the profiling trace may still be useful to some degree, especially if debug symbols are available.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;disabling-jit&quot; tabindex=&quot;-1&quot;&gt;Disabling JIT &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This can be done using an environment variable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;JSC_useJIT=false&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;limiting-jit&quot; tabindex=&quot;-1&quot;&gt;Limiting JIT &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Limiting JIT can be achieved via environment variables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;JSC_jitMemoryReservationSize=&amp;lt;BYTES&amp;gt;&lt;/code&gt; to limit JIT memory usage (the limit is semi-strict as some JIT compilation engine buffers are limited by this value indirectly),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JSC_useFTLJIT=false&lt;/code&gt; to disable FTL tier,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JSC_useDFGJIT=false&lt;/code&gt; to disable DFG and FTL tiers,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JSC_useBaselineJIT=false&lt;/code&gt; to disable Baseline, DFG, and FTL tiers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;tweaking-wpe-logs&quot; tabindex=&quot;-1&quot;&gt;Tweaking WPE logs &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;WPE is a fairly complex piece of software and hence it offers various logging capabilities related to WebKit itself, as well as to related libraries. The vast majority of logging can be controlled via environment variables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WEBKIT_DEBUG=all&lt;/code&gt; to enable all logging channels,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WEBKIT_DEBUG=Layout,Media=debug,Events=debug&lt;/code&gt; to enable selected logging channels,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JSC_logGC=2&lt;/code&gt; to enable JS garbage collector logs,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GST_DEBUG=4&lt;/code&gt; to enable gstreamer (multimedia-related) logs (see &lt;a href=&quot;https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html?gi-language=c#printing-debug-information&quot;&gt;the documentation&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;G_MESSAGES_DEBUG=all&lt;/code&gt; to enable GLib-level logs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If &lt;strong&gt;MiniBrowser&lt;/strong&gt; (or similar browser) is used, one can also set a runtime preference to enable JS &lt;code&gt;console.log(...)&lt;/code&gt; logging to the standard output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--features=+LogsPageMessagesToSystemConsole&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;enabling-remote-web-inspector&quot; tabindex=&quot;-1&quot;&gt;Enabling remote web inspector &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Enabling WPE’s remote web inspector is a twofold process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The first step is to run WPE with the proper environment variable so that it starts listening on &lt;code&gt;IP:PORT&lt;/code&gt; using tcp socket:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WEBKIT_INSPECTOR_SERVER=IP:PORT&lt;/code&gt; is the most reasonable option as it uses &lt;code&gt;inspector://&lt;/code&gt; protocol that can be utilized by WebKit-native browsers such as &lt;a href=&quot;https://apps.gnome.org/Epiphany/&quot;&gt;GNOME Web (Epiphany)&lt;/a&gt; or Safari,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WEBKIT_INSPECTOR_HTTP_SERVER=IP:PORT&lt;/code&gt; is a less preferable alternative that uses HTTP protocol and technically works from any browser. However, no seamless integration is guaranteed in this case.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;The second step is to connect from a regular web browser to the WPE:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;using &lt;code&gt;inspector://IP:PORT/&lt;/code&gt; if native inspector server was started,&lt;/li&gt;
&lt;li&gt;using &lt;code&gt;http://IP:PORT/&lt;/code&gt; if HTTP inspector server was started,&lt;/li&gt;
&lt;li&gt;forwarding the ports using &lt;code&gt;socat tcp-l:PORT,fork,reuseaddr tcp:IP:PORT&lt;/code&gt; if the WPE is running in unreachable network.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;experimenting-with-environment-variables-and-runtime-preferences&quot; tabindex=&quot;-1&quot;&gt;Experimenting with environment variables and runtime preferences &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The most outstanding environment variables changing the behavior of WPE are the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WPE_DISPLAY&lt;/code&gt; — assuming the &lt;a href=&quot;https://wpewebkit.org/blog/2026-03-18-wpewebkit-2.52.html#api-changes&quot;&gt;new WPE platform API&lt;/a&gt; is used, this environment variable allows one to switch the pre-defined platform implementation thus
changing a platform-facing part of graphics pipeline. The valid options are:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WPE_DISPLAY=wpe-display-headless&lt;/code&gt; — for headless implementation,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WPE_DISPLAY=wpe-display-drm&lt;/code&gt; — for direct rendering manager integration,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WPE_DISPLAY=wpe-display-wayland&lt;/code&gt; — for wayland integration,&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WEBKIT_SKIA_ENABLE_CPU_RENDERING&lt;/code&gt; — when set to &lt;code&gt;1&lt;/code&gt;, rendering the DOM contents to the layers is done using Skia CPU backend instead of GPU one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The most outstanding runtime preferences changing the behavior of WPE are the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CanvasUsesAcceleratedDrawing&lt;/code&gt; — when disabled, 2D canvas will use Skia CPU backend instead of GPU one,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LayerBasedSVGEngine&lt;/code&gt; — when enabled, WPE uses a different SVG engine internally,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AcceleratedCompositing&lt;/code&gt; — when disabled, WPE uses experimental, non-composited mode that bypasses all of the compositor work.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;limiting-device-memory&quot; tabindex=&quot;-1&quot;&gt;Limiting device memory &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;On the majority of embedded devices, the device memory can be limited by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Interrupting the boot sequence (usually holding some key such as &lt;code&gt;z&lt;/code&gt; upon booting),&lt;/li&gt;
&lt;li&gt;Invoking the command to change the limit and booting, e.g.:&lt;pre&gt;&lt;code&gt;&amp;gt; global linux.bootargs.console=&amp;quot;console=ttymxc0,115200n8 mem=2G&amp;quot;
&amp;gt; boot
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;running-wpe-with-sysprof&quot; tabindex=&quot;-1&quot;&gt;Running WPE with sysprof &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Regardless of whether it’s done on desktop (using &lt;a href=&quot;https://github.com/Igalia/webkit-container-sdk&quot;&gt;wkdev-sdk&lt;/a&gt;) or on embedded device, the command is always as simple as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sysprof-cli -f -- &amp;lt;WPE-INVOCATION&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a href=&quot;https://wpewebkit.org/reference/unstable/wpe-webkit-2.0/profiling.html#profiling-with-sysprof&quot;&gt;the documentation entry&lt;/a&gt; for more details.&lt;/p&gt;
&lt;h4 id=&quot;building-wpe-in-release-mode-with-debug-symbols&quot; tabindex=&quot;-1&quot;&gt;Building WPE in release mode with debug symbols &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;On desktop, the simplest way to get release with debug symbols is to utilize CMake’s build type by using &lt;code&gt;-DCMAKE_BUILD_TYPE=RelWithDebInfo&lt;/code&gt; within WPE build command, so:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./Tools/Scripts/build-webkit --wpe --release --cmakeargs=&amp;quot;-DCMAKE_BUILD_TYPE=RelWithDebInfo&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On embedded, when Yocto is used, one should tweak settings such as:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;IMAGE_GEN_DEBUGFS &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;                                                         &lt;br /&gt;IMAGE_FSTYPES_DEBUGFS &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tar.bz2&quot;&lt;/span&gt;&lt;br /&gt;DEBUG_BUILD &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;br /&gt;EXTRA_IMAGE_FEATURES_append &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; dbg-pkgs&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and potentially &lt;code&gt;INHIBIT_PACKAGE_STRIP&lt;/code&gt; to control whether debug symbols should be kept with the binary or not. This may be necessary occasionally as some tools have problems reading &lt;code&gt;.gnu_debuglink&lt;/code&gt; and therefore work only
with symbols included in the binaries.&lt;/p&gt;
&lt;h4 id=&quot;building-and-running-with-sanitizers&quot; tabindex=&quot;-1&quot;&gt;Building and running with sanitizers &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;WebKit works pretty well with all kinds of sanitizers. To build with any of them a CMake-level helper called &lt;code&gt;ENABLE_SANITIZERS&lt;/code&gt; can be used by specifying &lt;code&gt;-DENABLE_SANITIZERS=address&lt;/code&gt;, &lt;code&gt;-DENABLE_SANITIZERS=leak&lt;/code&gt; etc. With that, the command for
building e.g. on desktop could look like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./Tools/Scripts/build-webkit --wpe --debug --cmakeargs=-DENABLE_SANITIZERS=address&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more details, one can refer to &lt;a href=&quot;https://blogs.igalia.com/fujii/building-webkit-and-libsoup-with-addresssanitizer-asan/&quot;&gt;this article&lt;/a&gt; from fellow Igalian, Fujii.&lt;/p&gt;
&lt;h4 id=&quot;building-and-running-with-memory-sampler&quot; tabindex=&quot;-1&quot;&gt;Building and running with memory sampler &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;When WPE is built with &lt;code&gt;-DENABLE_MEMORY_SAMPLER=ON&lt;/code&gt;, the simple memory sampler can be started along with the browser using environment variable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WEBKIT_SAMPLE_MEMORY=1&lt;/code&gt; (accompanied by &lt;code&gt;WEBKIT_DISABLE_SANDBOX_THIS_IS_DANGEROUS=1&lt;/code&gt; if needed).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With that, the memory of various WPE processes is sampled every second, and saved to the files under &lt;code&gt;/tmp&lt;/code&gt; directory continuously.&lt;/p&gt;
&lt;h4 id=&quot;building-and-running-with-node-statistics&quot; tabindex=&quot;-1&quot;&gt;Building and running with node statistics &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Node statistics are a debug-only feature that can be enabled by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;changing &lt;code&gt;0&lt;/code&gt; of &lt;code&gt;#define DUMP_NODE_STATISTICS 0&lt;/code&gt; to &lt;code&gt;1&lt;/code&gt; in &lt;code&gt;Source/WebCore/dom/Element.h&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;adding &lt;code&gt;dumpStatistics()&lt;/code&gt; call, to e.g. &lt;code&gt;Node&lt;/code&gt; constructor in &lt;code&gt;Source/WebCore/dom/Node.cpp&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;building-and-running-with-libpas-statistics&quot; tabindex=&quot;-1&quot;&gt;Building and running with libpas statistics &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/plampe/wpe-memory-leak-investigation-playbook/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Libpas statistics are a debug-only feature that can be enabled by changing &lt;code&gt;0&lt;/code&gt; of &lt;code&gt;#define PAS_ENABLE_STATS 0&lt;/code&gt; to &lt;code&gt;1&lt;/code&gt; in &lt;code&gt;Source/bmalloc/libpas/src/libpas/pas_config.h&lt;/code&gt; and then running WPE with environment variable &lt;code&gt;PAS_STATS_ENABLE=1&lt;/code&gt;.&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 #65</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-65/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-65/</id>
		<updated>2026-05-18T19:39:42+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from May 11 to May 18.&lt;/p&gt;
&lt;p&gt;
For this week we have quite a collection of news! Ranging a variety of improvements
to dialog.requestClose(), rendering fixes, the new Skia-based compositor enabled by
default, and proper versioning and improvements to the WebKit Container SDK, there&#x27;s
news for everyone.
&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/313246@main&quot; rel=&quot;external&quot;&gt;Update&lt;/a&gt; the &lt;code&gt;closeWatcher.requestClose()&lt;/code&gt; function to no longer require user activation, aligning with the spec.&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/313302&quot; rel=&quot;external&quot;&gt;Implement&lt;/a&gt; actually moving the node in the DOM when &lt;code&gt;moveBefore()&lt;/code&gt; is called.&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/313239@main&quot; rel=&quot;external&quot;&gt;Fix&lt;/a&gt; handling of nested calls to &lt;code&gt;dialog.requestClose()&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/313251@main&quot; rel=&quot;external&quot;&gt;Add&lt;/a&gt; missing preliminary checks to &lt;code&gt;dialog.requestClose()&lt;/code&gt;.&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/313063@main&quot; rel=&quot;external&quot;&gt;Fixed&lt;/a&gt; an issue where background images were unexpectedly stretched, primarily affecting the reCAPTCHA checkmark image.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The new compositor using Skia API instead of TextureMapper is &lt;a href=&quot;https://commits.webkit.org/313297@main&quot; rel=&quot;external&quot;&gt;now enabled by default&lt;/a&gt;.&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;&lt;a href=&quot;https://commits.webkit.org/313201@main&quot; rel=&quot;external&quot;&gt;Added&lt;/a&gt; opt-in auto-enter for the &lt;a href=&quot;https://github.com/Igalia/webkit-container-sdk&quot; rel=&quot;external&quot;&gt;WebKit Container SDK&lt;/a&gt; - the GTK/WPE wrapper scripts (build-webkit, run-webkit-tests, run-api-tests, etc.) now relaunch themselves inside a pinned &lt;code&gt;wkdev-build&lt;/code&gt; podman container when &lt;code&gt;WEBKIT_CONTAINER_SDK_ENABLE_AUTOENTER=1&lt;/code&gt; is set. A new &lt;code&gt;.wkdev-sdk-version&lt;/code&gt; file at the repo root pins the SDK image, so the image can be bumped in a PR and validated through EWS. Without the flag, wrappers run on the host exactly as before.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Igalia/webkit-container-sdk/commit/120e2ddefe90cb07a784d5a3169e23b1d669d651&quot; rel=&quot;external&quot;&gt;Introduced&lt;/a&gt; a proper version scheme for the &lt;code&gt;wkdev-sdk&lt;/code&gt; image provided by the &lt;a href=&quot;https://github.com/Igalia/webkit-container-sdk&quot; rel=&quot;external&quot;&gt;WebKit Container SDK&lt;/a&gt; so consumers can pin to a known revision. The &lt;code&gt;:latest&lt;/code&gt; tag, the WKDEV_SDK_TAG/--tag override and the tag/* branch mechanism are replaced by a single machine-checkable format &lt;strong&gt;&amp;lt;major&amp;gt;.&amp;lt;minor&amp;gt;-v&amp;lt;count&amp;gt;-&amp;lt;gitsha&amp;gt;&lt;/strong&gt; (e.g. 2.53-v1-916f9ef), where &lt;strong&gt;&amp;lt;major&amp;gt;.&amp;lt;minor&amp;gt;&lt;/strong&gt; tracks the WebKitGTK/WPE release cycle, &lt;strong&gt;v&amp;lt;count&amp;gt;&lt;/strong&gt; is the per-cycle SDK build counter, and &lt;strong&gt;&amp;lt;gitsha&amp;gt;&lt;/strong&gt; traces the image back to its source commit. &lt;code&gt;wkdev-create&lt;/code&gt; gains a &lt;code&gt;--version&lt;/code&gt; switch (full or bare &lt;strong&gt;&amp;lt;major&amp;gt;.&amp;lt;minor&amp;gt;&lt;/strong&gt;). &lt;code&gt;wkdev-update&lt;/code&gt; supports updating from &lt;code&gt;latest&lt;/code&gt; tag to the new versioning scheme, just run it on your host to update to the latest SDK.&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/313275@main&quot; rel=&quot;external&quot;&gt;Switched&lt;/a&gt; the &lt;code&gt;wkdev-build&lt;/code&gt; container from a persistent container to ephemeral &lt;code&gt;podman run --rm --init&lt;/code&gt; per invocation. This removes the manual &lt;code&gt;podman rm&lt;/code&gt; step necessary whenever container creation arguments changed (which the tooling was not handling by itself), the first-run recursive-chown cost, and the &lt;code&gt;podman start&lt;/code&gt; step after host reboots.&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 #64</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-64/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-64/</id>
		<updated>2026-05-11T20:04:43+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from May 4 to May 11.&lt;/p&gt;
&lt;p&gt;
This week we have a bag of exciting updates, such as fixes to crashes, better
YouTube playback, a handful of advancements to WebXR, and the development
releases of WebKitGTK and WPE WebKit 2.53.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;If the filesystem runs out of space while the NetworkProcess is writing into its network cache, the process will crash with &lt;code&gt;SIGBUS&lt;/code&gt;. This would surface to users as the &lt;em&gt;&quot;Internal error fired from WebLoaderStrategy.cpp(559) : internallyFailedLoadTimerFired&quot;&lt;/em&gt; error, and would be handled by re-spawning another NetworkProcess that would similarly fail.&lt;/p&gt;
&lt;p&gt;This was &lt;a href=&quot;https://commits.webkit.org/312611@main&quot; rel=&quot;external&quot;&gt;addressed&lt;/a&gt; by using &lt;code&gt;fallocate&lt;/code&gt;, if available, to reserve the required size. If &lt;code&gt;fallocate&lt;/code&gt; fails to reserve, the NetworkProcess will skip caching, avoiding the crash. If &lt;code&gt;fallocate&lt;/code&gt; is not available, the existing behaviour is preserved.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;networking-signal-strength&quot;&gt;Networking 📶&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;Networking support, including the libsoup HTTP library.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;libsoup &lt;a href=&quot;https://gitlab.gnome.org/GNOME/libsoup/-/commit/579ff56747c3aea2fa7dcbf125bfbd424b3ac59a&quot; rel=&quot;external&quot;&gt;now supports&lt;/a&gt; the zstd compression encoding.&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;code&gt;getUserMedia()&lt;/code&gt; and &lt;code&gt;getDisplayMedia()&lt;/code&gt; support should work better thanks to a couple &lt;a href=&quot;https://commits.webkit.org/312594@main&quot; rel=&quot;external&quot;&gt;PipeWire related fixes&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Playback of some YouTube videos (usually at low framerate) has been &lt;a href=&quot;https://commits.webkit.org/312603@main&quot; rel=&quot;external&quot;&gt;fixed&lt;/a&gt;. Eventually a better solution will involve supporting edit lists in the GStreamer MSE backend.&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;A crash when accessing the diagnostics &lt;code&gt;webkit://gpu&lt;/code&gt; page was &lt;a href=&quot;https://commits.webkit.org/312599@main&quot; rel=&quot;external&quot;&gt;fixed&lt;/a&gt;, making sure we handle the case where &lt;code&gt;libGL.so.1&lt;/code&gt; or &lt;code&gt;libOpenGL.so.0&lt;/code&gt; are missing.&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/312992@main&quot; rel=&quot;external&quot;&gt;Fixed&lt;/a&gt; missing glyph before ZWJ/ZWNJ if no font is found for the cluster.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The WebXR implementation based on OpenXR &lt;a href=&quot;https://commits.webkit.org/311589@main&quot; rel=&quot;external&quot;&gt;has&lt;/a&gt; &lt;a href=&quot;https://commits.webkit.org/312072@main&quot; rel=&quot;external&quot;&gt;gained&lt;/a&gt; &lt;a href=&quot;https://commits.webkit.org/312596@main&quot; rel=&quot;external&quot;&gt;support&lt;/a&gt; for &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/XRQuadLayer&quot; rel=&quot;external&quot;&gt;quad&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/XREquirectLayer&quot; rel=&quot;external&quot;&gt;equirect&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/XRCylinderLayer&quot; rel=&quot;external&quot;&gt;cylinder&lt;/a&gt; layers.&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 second unstable releases for the current development cycle have been published: &lt;a href=&quot;https://webkitgtk.org/2026/05/06/webkitgtk2.53.2-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK 2.53.2&lt;/a&gt; and &lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.53.2.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.53.2&lt;/a&gt;. Development releases are intended is to gather early feedback on upcoming changes, and as such issue reports are welcome &lt;a href=&quot;https://bugs.webkit.org&quot; rel=&quot;external&quot;&gt;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 #63</title>
		<link href="https://blogs.igalia.com/webkit/blog/2026/wip-63/"/>
		<id>https://blogs.igalia.com/webkit/blog/2026/wip-63/</id>
		<updated>2026-04-28T08:05:47+00:00</updated>
		<content type="html">&lt;p&gt;Update on what happened in WebKit in the week from April 8 to April 28.&lt;/p&gt;
&lt;p&gt;
After a short hiatus, we return with a galore of releases, more Web Platform improvements,
tricky tweaks to thread scheduling, new niceties in the Web Inspector, and new build
options to take advantage of compiler optimizations.
&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;Delivered a number of changes that have strengthened WPE WebKit and WebKitGTK&#x27;s behaviour around real-time thread promotion and demotion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://commits.webkit.org/310907@main&quot; rel=&quot;external&quot;&gt;Real-time soft and hard limits are now set&lt;/a&gt; both when &lt;a href=&quot;https://commits.webkit.org/311660@main&quot; rel=&quot;external&quot;&gt;&lt;code&gt;sched_setscheduler&lt;/code&gt;&lt;/a&gt; or D-Bus based paths are taken (i.e. through &lt;a href=&quot;https://gitlab.freedesktop.org/pipewire/rtkit/&quot; rel=&quot;external&quot;&gt;rtkit&lt;/a&gt; or the corresponding XDG portal), with the soft limit set at 80% of the hard one.&lt;/li&gt;
&lt;li&gt;This means WebKit now has time to gracefully handle &lt;code&gt;SIGXCPU&lt;/code&gt;, and will do it in an &lt;a href=&quot;https://commits.webkit.org/310907@main&quot; rel=&quot;external&quot;&gt;async-signal-safe&lt;/a&gt; &lt;a href=&quot;https://commits.webkit.org/311082@main&quot; rel=&quot;external&quot;&gt;manner&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Additionally, the NetworkProcess&#x27; Cache Storage thread is now &lt;a href=&quot;https://commits.webkit.org/311064@main&quot; rel=&quot;external&quot;&gt;defined as &lt;code&gt;QOS::UserInitiated&lt;/code&gt; on Linux&lt;/a&gt;, which no longer maps to real-time priority. Its earlier mapping to real-time was previously reported as a NetworkProcess crash in the logs (it was in practice a kernel-delivered &lt;code&gt;SIGKILL&lt;/code&gt;, but WebKit doesn&#x27;t make any distinction while logging). After limits were adjusted, this thread was successfully demoted, and now that the mapping has changed, this is no longer promoted to real-time to begin with.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, logging around portal-related failures has been &lt;a href=&quot;https://commits.webkit.org/310444@main&quot; rel=&quot;external&quot;&gt;updated&lt;/a&gt; to reduce noise.&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/311850@main&quot; rel=&quot;external&quot;&gt;Implemented&lt;/a&gt; the &lt;code&gt;connectedMoveCallback()&lt;/code&gt; for custom elements to react to &lt;code&gt;moveBefore()&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/311597@main&quot; rel=&quot;external&quot;&gt;Implemented&lt;/a&gt; the scaffolding for the &lt;code&gt;moveBefore()&lt;/code&gt; DOM function. This is the first step towards implementing the full feature and is currently behind a runtime feature flag.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The Web Inspector &lt;a href=&quot;https://commits.webkit.org/311847@main&quot; rel=&quot;external&quot;&gt;now highlights&lt;/a&gt; the layout root element by hovering over a &lt;code&gt;Layout&lt;/code&gt; event in the “Layout &amp;amp; Rendering” timeline view and reveals it in the element tree by clicking a little “go to” arrow button.&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/04/13/webkitgtk2.52.2-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK 2.52.2&lt;/a&gt; and &lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.52.2.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.52.2&lt;/a&gt; have been released, which include a number of fixes. In particular, building for some less tested configurations should now be possible, and the WPE port includes fixes for input event handling in the Qt API bindings.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The releases were quickly followed by &lt;a href=&quot;https://webkitgtk.org/2026/04/16/webkitgtk2.52.3-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK 2.52.3&lt;/a&gt; and &lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.52.3.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.52.3&lt;/a&gt;, with further fixes including an important patch for crashes in JavaScriptCore on architectures other than x86_64, support for the &lt;code&gt;scrollbar-color&lt;/code&gt; CSS property, and a fix for rendering certain emoji glyphs. Additionally, the WPE port also gained a new setting to disable overlay scroll bars and use always-visible ones, fixed focus handling for touch input in the built-in Wayland platform implementation, and a build fix for the Qt one.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;In addition to maintenance for the stable branch, the first unstable releases for the current development cycle are also available: &lt;a href=&quot;https://webkitgtk.org/2026/04/17/webkitgtk2.53.1-released.html&quot; rel=&quot;external&quot;&gt;WebKitGTK 2.53.1&lt;/a&gt; and &lt;a href=&quot;https://wpewebkit.org/release/wpewebkit-2.53.1.html&quot; rel=&quot;external&quot;&gt;WPE WebKit 2.53.1&lt;/a&gt;. These are the first published versions that remove the option to use &lt;a href=&quot;https://cairographics.org/&quot; rel=&quot;external&quot;&gt;Cairo&lt;/a&gt; for 2D rendering—only &lt;a href=&quot;https://skia.org/&quot; rel=&quot;external&quot;&gt;Skia&lt;/a&gt; will be supported going forward. On the additions front, there are graphics subsystem improvements, a few API additions, and initial support in the CMake build system for builds using &lt;a href=&quot;https://en.wikipedia.org/wiki/Profile-guided_optimization&quot; rel=&quot;external&quot;&gt;Profile-Guided Optimization&lt;/a&gt; (PGO, needs Clang for now). The goal of development releases is to gather early feedback on upcoming changes, and issue reports are welcome &lt;a href=&quot;https://bugs.webkit.org&quot; rel=&quot;external&quot;&gt;in Bugzilla&lt;/a&gt;.&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;PGO (Profile-Guided Optimization) builds with Clang are &lt;a href=&quot;https://commits.webkit.org/310954@main&quot; rel=&quot;external&quot;&gt;now supported&lt;/a&gt; by the CMake build system.&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>
