<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>
	<title>Planet Igalia WebKit</title>
	<link>https://planet.igalia.com/webkit</link>
	<language>en</language>
	<description>Planet Igalia WebKit - https://planet.igalia.com/webkit</description>

<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #65</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-65/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-65/</link>
	<description>
&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's
news for everyone.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port &#128049;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/313246@main&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/313302&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/313239@main&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/313251@main&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 &#128444;&#65039;&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/313063@main&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/313297@main&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 &#127959;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/313201@main&quot;&gt;Added&lt;/a&gt; opt-in auto-enter for the &lt;a rel=&quot;external&quot; href=&quot;https://github.com/Igalia/webkit-container-sdk&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 rel=&quot;external&quot; href=&quot;https://github.com/Igalia/webkit-container-sdk/commit/120e2ddefe90cb07a784d5a3169e23b1d669d651&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 rel=&quot;external&quot; href=&quot;https://github.com/Igalia/webkit-container-sdk&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/313275@main&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&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Mon, 18 May 2026 19:39:42 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #64</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-64/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-64/</link>
	<description>
&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 &#128049;&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/312611@main&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 &#128246;&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 rel=&quot;external&quot; href=&quot;https://gitlab.gnome.org/GNOME/libsoup/-/commit/579ff56747c3aea2fa7dcbf125bfbd424b3ac59a&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 &#127909;&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/312594@main&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/312603@main&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 &#128444;&#65039;&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/312599@main&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/312992@main&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/311589@main&quot;&gt;has&lt;/a&gt; &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/312072@main&quot;&gt;gained&lt;/a&gt; &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/312596@main&quot;&gt;support&lt;/a&gt; for &lt;a rel=&quot;external&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/XRQuadLayer&quot;&gt;quad&lt;/a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/XREquirectLayer&quot;&gt;equirect&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/XRCylinderLayer&quot;&gt;cylinder&lt;/a&gt; layers.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases &#128230;&#65039;&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 rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/05/06/webkitgtk2.53.2-released.html&quot;&gt;WebKitGTK 2.53.2&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/release/wpewebkit-2.53.2.html&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 rel=&quot;external&quot; href=&quot;https://bugs.webkit.org&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&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Mon, 11 May 2026 20:04:43 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #63</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-63/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-63/</link>
	<description>
&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 &#128049;&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's behaviour around real-time thread promotion and demotion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310907@main&quot;&gt;Real-time soft and hard limits are now set&lt;/a&gt; both when &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/311660@main&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 rel=&quot;external&quot; href=&quot;https://gitlab.freedesktop.org/pipewire/rtkit/&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310907@main&quot;&gt;async-signal-safe&lt;/a&gt; &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/311082@main&quot;&gt;manner&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Additionally, the NetworkProcess' Cache Storage thread is now &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/311064@main&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'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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310444@main&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/311850@main&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/311597@main&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/311847@main&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 &#8220;Layout &amp;amp; Rendering&#8221; timeline view and reveals it in the element tree by clicking a little &#8220;go to&#8221; arrow button.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases &#128230;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/04/13/webkitgtk2.52.2-released.html&quot;&gt;WebKitGTK 2.52.2&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/release/wpewebkit-2.52.2.html&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 rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/04/16/webkitgtk2.52.3-released.html&quot;&gt;WebKitGTK 2.52.3&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/release/wpewebkit-2.52.3.html&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 rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/04/17/webkitgtk2.53.1-released.html&quot;&gt;WebKitGTK 2.53.1&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/release/wpewebkit-2.53.1.html&quot;&gt;WPE WebKit 2.53.1&lt;/a&gt;. These are the first published versions that remove the option to use &lt;a rel=&quot;external&quot; href=&quot;https://cairographics.org/&quot;&gt;Cairo&lt;/a&gt; for 2D rendering&#8212;only &lt;a rel=&quot;external&quot; href=&quot;https://skia.org/&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 rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Profile-guided_optimization&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 rel=&quot;external&quot; href=&quot;https://bugs.webkit.org&quot;&gt;in Bugzilla&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;infrastructure-construction-site&quot;&gt;Infrastructure &#127959;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;PGO (Profile-Guided Optimization) builds with Clang are &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310954@main&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&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Tue, 28 Apr 2026 08:05:47 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #62</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-62/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-62/</link>
	<description>
&lt;p&gt;Update on what happened in WebKit in the week from March 31 to April 7.&lt;/p&gt;
&lt;p&gt;
Support for iOS dialog light dismiss, a new API to obtain page icons,
WebKit nightly builds for Epiphany Canary produced by
GNOME GitLab, and more conservative checks for MPEG-4 Audio object types
are all part of this week's edition of the WebKit periodical.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port &#128049;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310308@main&quot;&gt;A new API to obtain page icons&lt;/a&gt; (a.k.a. &#8220;favicons&#8221;) has been added to the GTK port. The new functionality reuses the recently added &lt;code&gt;WebKitImage&lt;/code&gt; class and provides access to multiple page icons at once through the added &lt;code&gt;WebKitImageList&lt;/code&gt; type, allowing applications to better choose an icon that suits their needs. Changes to the &lt;code&gt;WebKitWebView.page-icons&lt;/code&gt; property are guaranteed to be done once per page load, when all icon images are available to be used. This new API has been also &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310697@main&quot;&gt;enabled for the WPE port&lt;/a&gt;, and the plan is to deprecate the old page favicon functionality going forward.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310478@main&quot;&gt;Added iOS support for dialog light dismiss&lt;/a&gt;, part of the experimental &lt;code&gt;closedby&lt;/code&gt; attribute implementation.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;multimedia-movie-camera&quot;&gt;Multimedia &#127909;&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310634@main&quot;&gt;canPlayType() is now more conservative regarding MPEG-4 Audio object types&lt;/a&gt;. This primarily affects AAC extensions: In the past, as long as there was an AAC decoder installed, WebKit was accepting any codec string that started with &lt;code&gt;mp4a&lt;/code&gt;. Now it only accepts codec strings that correspond to object types that have widespread support. This can prevent accidental playback of newer formats like xHE-AAC, which many decoders don't yet support &#8212; for example, as of writing, FFmpeg support for xHE-AAC is only very recent and still incomplete.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310381@main&quot;&gt;canPlayType() now also reports support for Dolby AC-4&lt;/a&gt; in systems with a decoder capable of handling it.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The GStreamer WebRTC backend &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310637@main&quot;&gt;now&lt;/a&gt; rejects SDP including &lt;code&gt;rtpmap&lt;/code&gt; attributes in the disallowed range of 64-95 payload types. Compliance with RFC 7587 was also improved.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;infrastructure-construction-site&quot;&gt;Infrastructure &#127959;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The WebKitGTK nightly builds for Epiphany Canary are now handled entirely by the &lt;a rel=&quot;external&quot; href=&quot;https://gitlab.gnome.org&quot;&gt;GNOME GitLab&lt;/a&gt; infrastructure, many thanks to them! The previous approach was not optimal, producing release builds without debug symbols. With the new builds, it is now easier to get crash stack traces including more information.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Tue, 07 Apr 2026 17:07:37 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #61</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-61/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-61/</link>
	<description>
&lt;p&gt;Update on what happened in WebKit in the week from March 23 to March 30.&lt;/p&gt;
&lt;p&gt;
This week comes with a mixed bag of new features, incremental improvements,
and a new release with the ever important security issue fixes. Also: more
blog posts!
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port &#128049;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/309558@main&quot;&gt;Implemented&lt;/a&gt; initial support for
&lt;code&gt;closedby=any&lt;/code&gt; on dialog elements, which adds light dismiss behaviour. This is
behind the &lt;code&gt;ClosedbyAttributeEnabled&lt;/code&gt; feature flag.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/309802@main&quot;&gt;Added&lt;/a&gt; the remaining values for the
experimental &lt;code&gt;closedby&lt;/code&gt; attribute implementation.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310070@main&quot;&gt;MiniBrowser now has&lt;/a&gt; a
&lt;code&gt;--profile-dir=DIR&lt;/code&gt; command line option that can be used to specify a custom
directory where website data and cache can be stored, to test, for example,
behavior in a clean session.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;multimedia-movie-camera&quot;&gt;Multimedia &#127909;&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;Video decoding limits had been enforced on &lt;code&gt;HTMLMediaElement.canPlayType()&lt;/code&gt; so
far, but &lt;a rel=&quot;external&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=310192&quot;&gt;they are now also enforced in MediaCapabilities
queries&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics &#128444;&#65039;&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310220@main&quot;&gt;Fixed&lt;/a&gt; several OpenGL state
restoration bugs in &lt;code&gt;BitmapTexture&lt;/code&gt; . These could cause a mismatch between the
GL state assumed by Skia and the actual one, leading to rendering artifacts
with certain GPU drivers and configurations.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The &lt;code&gt;SKIA_DEBUG&lt;/code&gt; CMake option &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/310215@main&quot;&gt;has been
enabled&lt;/a&gt; for &lt;code&gt;Debug&lt;/code&gt; builds, enabling
Skia's internal assertions, debug logging, and consistency checks (e.g. bounds
checking, resource key diagnostics). It remains off by default for &lt;code&gt;Release&lt;/code&gt;
and &lt;code&gt;RelWithDebInfo&lt;/code&gt; builds, and can still be explicitly configured via
&lt;code&gt;-DSKIA_DEBUG=ON|OFF&lt;/code&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit &#128223;&lt;/h2&gt;
&lt;h3 id=&quot;wpe-platform-api-jigsaw&quot;&gt;WPE Platform API &#129513;&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;New, modern platform API that supersedes usage of libwpe and WPE backends.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The new &lt;code&gt;WPE_SETTING_OVERLAY_SCROLLBARS&lt;/code&gt; setting &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/309811@main&quot;&gt;is now
available&lt;/a&gt;, and disabling it will use a
more traditional, always visible scrollbar style.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases &#128230;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;A new &lt;code&gt;USE_GSTREAMER&lt;/code&gt; build option &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/309883@main&quot;&gt;may now be
used&lt;/a&gt; to toggle the features that
require GStreamer at once. This can be used to effectively disable all
multimedia support, which previously needed toggling four CMake options.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/03/27/webkitgtk2.52.1-released.html&quot;&gt;WebKitGTK
2.52.1&lt;/a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/release/wpewebkit-2.52.1.html&quot;&gt;WPE WebKit 2.52.1&lt;/a&gt; have
been released. On top of a small corrections typical of the first point
releases in a new stable series, this one includes a number of fixes for
security issues, and it is a recommended update. The corresponding security
advisory, &lt;code&gt;WSA-2026-0002&lt;/code&gt;
(&lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/security/WSA-2026-0002.html&quot;&gt;GTK&lt;/a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/security/WSA-2026-0002.html&quot;&gt;WPE&lt;/a&gt;) has been published as
well.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;community-events-handshake&quot;&gt;Community &amp;amp; Events &#129309;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Sim&#243;n Pena wrote a blog post showing &lt;a rel=&quot;external&quot; href=&quot;https://simonpena.com/blog/2026/03/20/getting-started-with-wpe-webkit/&quot;&gt;how to create a minimal WPE
launcher&lt;/a&gt;,
which uses a Fedora Podman container with pre-built WPE WebKit libraries and a
launcher with barely 10 lines of code to display a web view. This complements
Kate Lee's &lt;a rel=&quot;external&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;custom HTML context menu blog
post&lt;/a&gt;
from last week.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Mon, 30 Mar 2026 21:46:57 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>Sim&#243;n Pena: Getting started with WPE WebKit: a minimal launcher</title>
	<guid>https://simonpena.com/blog/2026/03/20/getting-started-with-wpe-webkit</guid>
	<link>https://simonpena.com/blog/2026/03/20/getting-started-with-wpe-webkit/</link>
	<description>
&lt;p&gt;My colleague Kate recently &lt;a href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;demonstrated on her blog&lt;/a&gt; how simple it is to write a WPE Platform-based launcher, and did so by building it side-by-side with MiniBrowser, inside the WebKit tree.&lt;/p&gt;

&lt;p&gt;This entry takes one step back, and demonstrates the same concepts assuming you are not building WPE WebKit yourself, but rather getting it from your distribution. Many of the steps below would apply if you were using a &lt;a href=&quot;https://www.yoctoproject.org/&quot;&gt;Yocto/OpenEmbedded-based image&lt;/a&gt;, but that can be the focus of another post.&lt;/p&gt;

&lt;h2 id=&quot;getting-wpe-webkit&quot;&gt;Getting WPE WebKit&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://wpewebkit.org/about/get-wpe.html&quot;&gt;Get WPE&lt;/a&gt; lists a number of options to get WPE from your preferred distribution. At the moment of writing, Fedora, Debian and ArchLinux are your best choices to get a recent version of WPE:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2.52 on Fedora&lt;/li&gt;
  &lt;li&gt;2.50 on Debian Forky, 2.52 on Debian Sid&lt;/li&gt;
  &lt;li&gt;2.50 on ArchLinux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, since WPE Platform hasn&#8217;t officially been released, we need to use Fedora, where my colleague &lt;a href=&quot;https://www.igalia.com/team/pnormand&quot;&gt;Philippe&lt;/a&gt; maintains a Copr repository with it enabled.&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;dnf copr &lt;span class=&quot;nb&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; philn/wpewebkit
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;dnf &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;wpewebkit-devel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Alternatively, you can use a container. Here is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Containerfile&lt;/code&gt; based on Fedora 42:&lt;/p&gt;

&lt;div class=&quot;language-dockerfile highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; fedora:42&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;RUN &lt;/span&gt;dnf &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    dnf-plugins-core &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dnf copr &lt;span class=&quot;nb&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; philn/wpewebkit &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dnf &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    gcc-c++ &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    cmake &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    pkg-config &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    wpewebkit-devel

&lt;span class=&quot;k&quot;&gt;WORKDIR&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; /src&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Build and run it with:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;podman build &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; wpe-dev &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
podman run &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;WAYLAND_DISPLAY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$WAYLAND_DISPLAY&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/run/user/&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$XDG_RUNTIME_DIR&lt;/span&gt;/&lt;span class=&quot;nv&quot;&gt;$WAYLAND_DISPLAY&lt;/span&gt;:/run/user/&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/&lt;span class=&quot;nv&quot;&gt;$WAYLAND_DISPLAY&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; /dev/dri:/dev/dri &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
wpe-dev bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;the-build-system&quot;&gt;The build system&lt;/h2&gt;

&lt;p&gt;Kate&#8217;s post builds the launcher as part of the WebKit tree using WebKit&#8217;s own CMake infrastructure. For a standalone project, we need a self-contained &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CMakeLists.txt&lt;/code&gt; that finds WPE WebKit through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pkg-config&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-cmake highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;VERSION 3.16&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;wpe_sample CXX&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;CMAKE_CXX_STANDARD 17&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;find_package&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;PkgConfig REQUIRED&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# The Wayland WPE Platform already depends on wpe-platform-2.0&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;pkg_check_modules&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;WebKitDeps REQUIRED
    IMPORTED_TARGET
    wpe-webkit-2.0
    wpe-platform-wayland-2.0
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;add_executable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;wpe_sample main.cpp&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;wpe_sample
    PRIVATE
        PkgConfig::WebKitDeps
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;the-launcher&quot;&gt;The launcher&lt;/h2&gt;

&lt;p&gt;Here is a minimal launcher &#8212; the smallest amount of code needed to display a web page with WPE WebKit:&lt;/p&gt;

&lt;div class=&quot;language-cpp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&amp;lt;wpe/webkit.h&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;
&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;g_autoptr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GMainLoop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g_main_loop_new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;nullptr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;g_autoptr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WebKitWebView&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;view&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WEBKIT_WEB_VIEW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g_object_new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WEBKIT_TYPE_WEB_VIEW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;nullptr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;webkit_web_view_load_uri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;view&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://wpewebkit.org&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;g_main_loop_run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EXIT_SUCCESS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This snippet relies heavily on default behaviours: it will create a default WPE view, with default top levels, with the default display selection behaviour (Wayland), default context, settings&#8230;&lt;/p&gt;

&lt;p&gt;Again, &lt;a href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;Kate&#8217;s post&lt;/a&gt; does a more realistic job at showing how the various pieces are created and connected together.&lt;/p&gt;

&lt;h2 id=&quot;building-and-running&quot;&gt;Building and running&lt;/h2&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cmake &lt;span class=&quot;nt&quot;&gt;-B&lt;/span&gt; build
cmake &lt;span class=&quot;nt&quot;&gt;--build&lt;/span&gt; build
./build/wpe_sample https://wpewebkit.org/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://simonpena.com/assets/images/wpe-webkit-sample-screenshot.png&quot; alt=&quot;WPE WebKit minimal launcher&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;display-backends&quot;&gt;Display backends&lt;/h2&gt;

&lt;p&gt;WPE WebKit can render to different display backends depending on your environment, which you can select through environment variables:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Wayland (e.g. desktop, Weston).&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;WPE_DISPLAY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;wpe-display-wayland &lt;span class=&quot;nv&quot;&gt;WAYLAND_DISPLAY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;wayland-1 ./build/wpe_sample https://wpewebkit.org/

&lt;span class=&quot;c&quot;&gt;# DRM/KMS (e.g. embedded, no compositor)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;WPE_DISPLAY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;wpe-display-drm ./build/wpe_sample https://wpewebkit.org/

&lt;span class=&quot;c&quot;&gt;# Headless (e.g. testing, CI)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;WPE_DISPLAY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;wpe-display-headless ./build/wpe_sample https://wpewebkit.org/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can take a look at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wpe_display_get_default()&lt;/code&gt; in &lt;a href=&quot;https://github.com/WebKit/WebKit/blob/wpewebkit-2.52.0/Source/WebKit/WPEPlatform/wpe/WPEDisplay.cpp&quot;&gt;WPEPlatform/wpe/WPEDisplay.cpp&lt;/a&gt; to understand how the automatic selection takes place in the absence of an explicit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WPE_DISPLAY&lt;/code&gt; request.&lt;/p&gt;

&lt;p&gt;(In our example, we are only listing Wayland as a CMake dependency. If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libwpewebkit&lt;/code&gt; was compiled without DRM or headless support, the environment variable approach would not work.)&lt;/p&gt;

&lt;h2 id=&quot;next-steps&quot;&gt;Next steps&lt;/h2&gt;

&lt;p&gt;This is all for now. The next entry in the series will cover classic kiosk features: preventing navigation to unwanted sites, controlling whether new windows can be opened, and intercepting requests through policy decisions.&lt;/p&gt;

&lt;p&gt;For a more complete example that includes a custom HTML context menu and JavaScript injection, see &lt;a href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;Kate&#8217;s post&lt;/a&gt;.&lt;/p&gt;        </description>
	<pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate>
	<dc:creator>Sim&#243;n</dc:creator>
</item>
<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #60</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-60/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-60/</link>
	<description>
&lt;p&gt;Update on what happened in WebKit in the week from March 10 to March 18.&lt;/p&gt;
&lt;p&gt;
The big ticket item in this week's update are the 2.52.0 releases, which
include the work from the last six-month development period, and come with
a security advisory. Meanwhile, WPE-Android also gets a release, and a number
of featured blog posts.
&lt;/p&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit &#128223;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Last week we &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/309047@main&quot;&gt;added support&lt;/a&gt; to WPE
MiniBrowser to load &lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-webkit-2.0/class.Settings.html&quot;&gt;settings&lt;/a&gt; from a key file. This extended the existing
&lt;code&gt;--config-file=FILE&lt;/code&gt; feature, which previously only loaded WPEPlatform
settings under the &lt;code&gt;[wpe-platform]&lt;/code&gt; group. Now the feature uses
&lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-webkit-2.0/method.Settings.apply_from_key_file.html&quot;&gt;webkit_settings_apply_from_key_file()&lt;/a&gt;
to load properties such as &lt;code&gt;user-agent&lt;/code&gt; or &lt;code&gt;enable-developer-extras&lt;/code&gt;
from the &lt;code&gt;[websettings]&lt;/code&gt; group as well.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases &#128230;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/03/18/webkitgtk2.52.0-released.html&quot;&gt;WebKitGTK
2.52.0&lt;/a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/release/wpewebkit-2.52.0.html&quot;&gt;WPE WebKit 2.52.0&lt;/a&gt; are
now available. These include the results of the effort made by the team during
the last six months, including rendering improvements and performance
optimizations, better security for WebRTC, a more complete WebXR
implementation, and a second preview of the WPEPlatform API for the WPE
port&#8212;among many other changes.&lt;/p&gt;
&lt;p&gt;More information about the changes and improvements brought by these major
releases can be found at the &lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/03/18/webkitgtk-2.52-highlights.html&quot;&gt;blog post about WebKitGTK
2.52&lt;/a&gt;, and the
&lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/blog/2026-03-18-wpewebkit-2.52.html&quot;&gt;corresponding one for WPE WebKit
2.52&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Accompanying these releases there is security advisory &lt;code&gt;WSA-2026-0001&lt;/code&gt;
(&lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/security/WSA-2026-0001.html&quot;&gt;GTK&lt;/a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/security/WSA-2026-0001.html&quot;&gt;WPE&lt;/a&gt;), with information
about solved security issues. As usual, we encourage everybody to use the most
recent versions where such issues are known to be fixed.&lt;/p&gt;
&lt;p&gt;Bug reports are always welcome &lt;a rel=&quot;external&quot; href=&quot;https://bugs.webkit.org/&quot;&gt;at the WebKit
Bugzilla&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Igalia/wpe-android/releases/tag/v0.3.3&quot;&gt;WPE Android 0.3.3&lt;/a&gt; has been released, and prebuilt packages are available &lt;a rel=&quot;external&quot; href=&quot;https://central.sonatype.com/artifact/org.wpewebkit.wpeview/wpeview/&quot;&gt;at the Maven Central repository&lt;/a&gt;. This is a maintenance release which updates the included WPE WebKit version to 2.50.6 and libsoup to 3.6.6, both of which include security fixes.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;community-events-handshake&quot;&gt;Community &amp;amp; Events &#129309;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Kate Lee wrote a &lt;a rel=&quot;external&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;very interesting blog
post&lt;/a&gt;
showing how to create a small application using the WPEPlatform API to
demonstrate one of its newly available features: the Context Menu API. It is
rendered entirely as an HTML overlay, enabling richer and more portable context
menu implementations.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;WebXR support for WebKitGTK and WPE has been reworked and aligned with the
modern multi-process architecture, using OpenXR to enable XR device integration
on Linux and Android. Sergio Villar &lt;a rel=&quot;external&quot; href=&quot;https://blogs.igalia.com/svillar/post/webkitgtk-wpe-webxr/&quot;&gt;wrote a blog post that explains all the
work done&lt;/a&gt; in the
last months around it.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Wed, 18 Mar 2026 19:46:56 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>WPE WebKit Blog: WPE WebKit 2.52 highlights</title>
	<guid>https://wpewebkit.org/blog/2026-03-18-wpewebkit-2.52.html</guid>
	<link>https://wpewebkit.org/blog/2026-03-18-wpewebkit-2.52.html</link>
	<description>
&lt;p&gt;The WebKit team at Igalia is happy to announce a new release series of WPE WebKit. This is a summary of the most noteworthy changes from the latest release cycle.&lt;/p&gt;
&lt;h2 id=&quot;graphics-improvements&quot; tabindex=&quot;-1&quot;&gt;Graphics improvements&lt;/h2&gt;
&lt;p&gt;WPE&#8217;s graphics support has seen numerous improvements with a positive impact in rendering performance, resource usage, and better rendering. Let&#8217;s have a look at some of the most significant changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compute the layers tile size, using a different strategy depending on whether GPU rendering is enabled. This optimizes resource usage depending on both hardware and software rendering mode.&lt;/li&gt;
&lt;li&gt;WPE now uses run-loop observers to properly schedule layer flushing and composition, which results in snappier and better performing rendering and animation.&lt;/li&gt;
&lt;li&gt;2D-canvas acceleration has now improved performance, as operations are recorded for batched replay.&lt;/li&gt;
&lt;li&gt;Text rendering has better performance too.&lt;/li&gt;
&lt;li&gt;In non-composite mode, it&#8217;s now also possible to use damage propagation.&lt;/li&gt;
&lt;li&gt;Asynchronous scrolling has also seen performance improvements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On top of this, as usual, many rendering issues have been fixed, making this release of WPE one of the best in terms of graphics support.&lt;/p&gt;
&lt;h2 id=&quot;multimedia-improvements&quot; tabindex=&quot;-1&quot;&gt;Multimedia improvements&lt;/h2&gt;
&lt;h3 id=&quot;webrtc&quot; tabindex=&quot;-1&quot;&gt;WebRTC&lt;/h3&gt;
&lt;p&gt;When using &lt;code&gt;GstWebRTC&lt;/code&gt;, WebRTC network access has been moved to the network process. This also requires librice, and building with the CMake &lt;code&gt;USE_LIBRICE&lt;/code&gt; option. When this is enabled, it is still possible to choose the older libnice-based implementation at runtime by setting &lt;code&gt;WEBKIT_GST_DISABLE_WEBRTC_NETWORK_SANDBOX=1&lt;/code&gt; in the environment.&lt;/p&gt;
&lt;p&gt;Having WebRTC network access in the network process is a security improvement, as it reduces the surface of attack in other more sensitive processes.&lt;/p&gt;
&lt;h3 id=&quot;other-multimedia-improvements&quot; tabindex=&quot;-1&quot;&gt;Other multimedia improvements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Videos with BT2100-PQ colorspace are now tone-mapped to SDR, ensuring colours do not appear washed out.&lt;/li&gt;
&lt;li&gt;Support for the &lt;a href=&quot;https://w3c.github.io/mediacapture-output/&quot;&gt;Audio Output Devices API&lt;/a&gt;, which allows Web content to enumerate audio devices and decide which one to use for output. This feature is disabled by default, and may be previewed using the &lt;code&gt;ExposeSpeakers&lt;/code&gt;, &lt;code&gt;ExposeSpeakersWithoutMicrophone&lt;/code&gt;, and &lt;code&gt;PerElementSpeakerSelection&lt;/code&gt; &lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-webkit-2.0/struct.Feature.html&quot;&gt;feature flags&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Many code improvements to the GStreamer backend that will result in a more stable multimedia experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;webxr&quot; tabindex=&quot;-1&quot;&gt;WebXR&lt;/h2&gt;
&lt;p&gt;WebXR support through OpenXR has seen substantial development this cycle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New API has been added in order to support &lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-webkit-2.0/class.XRPermissionRequest.html&quot;&gt;WebXR session permissions&lt;/a&gt;, &lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-webkit-2.0/method.WebView.is_immersive_mode_enabled.html&quot;&gt;querying whether a session is active&lt;/a&gt; and &lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-webkit-2.0/method.WebView.leave_immersive_mode.html&quot;&gt;requesting to leave a session&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Support for &lt;a href=&quot;https://www.w3.org/TR/webxr-hand-input-1/&quot;&gt;WebXR Hand Input module&lt;/a&gt; has been added for ports using OpenXR.&lt;/li&gt;
&lt;li&gt;Support for &lt;a href=&quot;https://www.w3.org/TR/webxr-hit-test-1/&quot;&gt;WebXR Hit Test Module&lt;/a&gt; is added with &lt;em&gt;testable&lt;/em&gt; status, so it can be enabled at runtime (&lt;code&gt;--features=+WebXRHitTestModule&lt;/code&gt;) or at build time passing &lt;code&gt;-DENABLE_WEBXR_HIT_TEST=ON&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;api-changes&quot; tabindex=&quot;-1&quot;&gt;API Changes&lt;/h2&gt;
&lt;h3 id=&quot;the-future-of-the-wpe-api&quot; tabindex=&quot;-1&quot;&gt;The future of the WPE API&lt;/h3&gt;
&lt;p&gt;The traditional &lt;code&gt;libwpe&lt;/code&gt;-based API remains in WPE for this release cycle, but we are planning to sunset it starting with the following one (2.54). This applies to &lt;a href=&quot;https://github.com/Igalia/cog&quot;&gt;Cog&lt;/a&gt;, which is no longer in active development and won&#8217;t have any more stable releases beyond the 0.18.x series. While both &lt;code&gt;libwpe&lt;/code&gt; and Cog will remain available, we encourage developers to transition to the new WPEPlatform API, which will be considered stable by then.&lt;/p&gt;
&lt;p&gt;This means that it is the perfect time to test the WPEPlatform API and provide feedback, as it&#8217;s still possible to make changes to it to better suit users&#8217; needs.&lt;/p&gt;
&lt;h3 id=&quot;wpeplatform-api-changes&quot; tabindex=&quot;-1&quot;&gt;WPEPlatform API changes&lt;/h3&gt;
&lt;p&gt;New platform APIs include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-platform-2.0/method.Display.create_toplevel.html&quot;&gt;&lt;code&gt;wpe_display_create_toplevel()&lt;/code&gt;&lt;/a&gt;. This way it&#8217;s possible to create a toplevel using the common API which allows the inspector to work when the application is handling toplevels.&lt;/li&gt;
&lt;li&gt;A new &lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-platform-2.0/signal.Display.disconnected.html&quot;&gt;&lt;code&gt;WPEDisplay::disconnected&lt;/code&gt;&lt;/a&gt; signal has been added, which allows platform implementations to notify when the native display gets &#8220;disconnected&#8221; and thus no longer usable. Applications can handle it to attempt recovery, or to know when they may free resources.&lt;/li&gt;
&lt;li&gt;A new &lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-platform-2.0/signal.View.buffers-changed.html&quot;&gt;&lt;code&gt;WPEView::buffers-changed&lt;/code&gt;&lt;/a&gt; signal, alongside the associated &lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-platform-2.0/vfunc.View.buffers_changed.html&quot;&gt;&lt;code&gt;WPEViewClass.buffers_changed&lt;/code&gt;&lt;/a&gt; virtual function, have been added. These may be used to know in advance which graphics buffers will be used for rendering the content for a given web view. This feature is mainly useful for platform implementations which may need to perform additional setup in advance, before updated web view contents are provided in the buffers configured by WebKit.&lt;/li&gt;
&lt;li&gt;Two new functions, &lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-platform-2.0/method.ClipboardContent.get_text.html&quot;&gt;&lt;code&gt;wpe_clipboard_content_get_text()&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-platform-2.0/method.ClipboardContent.get_bytes.html&quot;&gt;&lt;code&gt;wpe_clipboard_content_get_bytes()&lt;/code&gt;&lt;/a&gt;, allow applications to obtain the contents held in the clipboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The public API has received the following changes, which might require changes to existing platform implementations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple callbacks are now supported for &lt;code&gt;WPEScreenSyncObserver&lt;/code&gt;, the API has changed from &lt;code&gt;wpe_screen_sync_observer_set_callback()&lt;/code&gt; to a pair of &lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-platform-2.0/method.ScreenSyncObserver.add_callback.html&quot;&gt;&lt;code&gt;wpe_screen_sync_observer_add_callback()&lt;/code&gt;&lt;/a&gt;/&lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-platform-2.0/method.ScreenSyncObserver.remove_callback.html&quot;&gt;&lt;code&gt;_remove_callback()&lt;/code&gt;&lt;/a&gt; functions. The functions to start/stop the observer are no longer available, and instead the observer will be activated automatically when there are one or more callbacks attached to it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The WPEPlatform API can now be used on Android.&lt;/p&gt;
&lt;h3 id=&quot;legacy-api&quot; tabindex=&quot;-1&quot;&gt;Legacy API&lt;/h3&gt;
&lt;p&gt;The legacy &lt;code&gt;libwpe&lt;/code&gt;-based API can be disabled at build time, by toggling the &lt;code&gt;ENABLE_WPE_LEGACY_API&lt;/code&gt; CMake option. This allows removal of uneeded code when an application is exclusively using the new WPEPlatform API.&lt;/p&gt;
&lt;h3 id=&quot;new-webkit-api&quot; tabindex=&quot;-1&quot;&gt;New WebKit API&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-webkit-2.0/class.Image.html&quot;&gt;WebKitImage&lt;/a&gt;, an image abstraction that is used when taking snapshots of webviews.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-webkit-2.0/method.WebView.get_snapshot.html&quot;&gt;webkit_webview_get_snapshot()&lt;/a&gt; and &lt;a href=&quot;https://wpewebkit.org/reference/2.52.0/wpe-webkit-2.0/method.WebView.get_snapshot_finish.html&quot;&gt;webkit_webview_get_snapshot_finish()&lt;/a&gt; can be used to fetch a snapshot of a webview contents.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;web-standards-support&quot; tabindex=&quot;-1&quot;&gt;Web Standards support&lt;/h2&gt;
&lt;p&gt;As usual, this list is not exhaustive as WebKit continuously progresses in its support for new standards. Some of the highlights for this release are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/largest-contentful-paint/&quot;&gt;Largest Contentful Paint&lt;/a&gt; is now enabled.&lt;/li&gt;
&lt;li&gt;Pointer and Touch Events now use more precise fractional coordinates.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API&quot;&gt;Fetch API&lt;/a&gt; now accepts local connections.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API&quot;&gt;Navigation API&lt;/a&gt; is now enabled.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEventTiming&quot;&gt;Event Timing API&lt;/a&gt; is now enabled.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://drafts.csswg.org/css-values-5/#random&quot;&gt;CSS random() function&lt;/a&gt; (in draft status) is now available.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/field-sizing&quot;&gt;CSS field-sizing&lt;/a&gt; is now available.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Keyboard/lock&quot;&gt;Keyboard lock API&lt;/a&gt; is now available.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://html.spec.whatwg.org/multipage/browsers.html#the-origin-interface&quot;&gt;Origin API&lt;/a&gt; is now available.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Streams_API&quot;&gt;Readable Byte Streams API&lt;/a&gt; is now available.&lt;/li&gt;
&lt;li&gt;Enabled CSS grid-lanes (a.k.a. Masonry layout), part of &lt;a href=&quot;https://www.w3.org/TR/css-grid-3/&quot;&gt;CSS Grid Layout Module Level 3&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;other-notes&quot; tabindex=&quot;-1&quot;&gt;Other notes&lt;/h2&gt;
&lt;p&gt;The Flatpak-based development SDK has been removed. Developers are encouraged to use the
&lt;a href=&quot;https://github.com/Igalia/webkit-container-sdk&quot;&gt;&lt;strong&gt;WebKit Container SDK&lt;/strong&gt;&lt;/a&gt; instead.&lt;/p&gt;        </description>
	<pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Sergio Villar: Implementing WebXR in WebKit for WPE</title>
	<guid>https://blogs.igalia.com/svillar/post/wpe-webxr/</guid>
	<link>https://blogs.igalia.com/svillar/post/wpe-webxr/</link>
	<description>
&lt;p&gt;Since 2022, my main focus has been working on the &lt;a href=&quot;https://wolvic.com&quot;&gt;Wolvic browser&lt;/a&gt;, still the only open source WebXR-capable browser for Android/AOSP devices (Meta, Pico, Huawei, Lenovo, Lynx, HTC&amp;hellip;) out there. That&amp;rsquo;s an effort that continues to this day (although to a &lt;a href=&quot;https://wolvic.com/blog/next-steps/&quot;&gt;much lesser extent nowadays&lt;/a&gt;). In early 2025, as a consequence of all that work in XR on the web, an opportunity emerged to implement WebXR support in WebKit for the WPE port, and we decided to take it.&lt;/p&gt;        </description>
	<pubDate>Tue, 17 Mar 2026 08:46:59 +0000</pubDate>
</item>
<item>
	<title>Hironori Fujii: Async Scrolling Improvements</title>
	<guid>https://blogs.igalia.com/fujii/async-scrolling-improvements/</guid>
	<link>https://blogs.igalia.com/fujii/async-scrolling-improvements/</link>
	<description>
&lt;p&gt;WPE WebKit and WebKitGTK support &lt;a href=&quot;https://docs.webkit.org/Ports/WebKitGTK%20and%20WPE%20WebKit/Graphics.html#async-scrolling&quot;&gt;async scrolling&lt;/a&gt; for wheel events.
I landed several improvements for the upcoming 2.52 release.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=305451&quot;&gt;Bug 305451&lt;/a&gt; &#8211; wheel event async scrolling doesn&#8217;t start while the main thread is blocked&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=305560&quot;&gt;Bug 305560&lt;/a&gt; &#8211; rendering glitches for unpainted tiles&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=305561&quot;&gt;Bug 305561&lt;/a&gt; &#8211; Paint scrollbars in the scrolling thread for async scrolling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are videos of before and after the changes.
This is &lt;a href=&quot;https://bug-305441-attachments.webkit.org/attachment.cgi?id=477989&quot;&gt;the test content&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://blogs.igalia.com/fujii/video/async-scrolling-before.mp4&quot; controls=&quot;&quot;&gt;&lt;/video&gt;
&lt;video src=&quot;https://blogs.igalia.com/fujii/video/async-scrolling-after.mp4&quot; controls=&quot;&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;There is still room for further improvement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The scrollbar hiding animation timer is still running in the main thread.
&lt;ul&gt;
&lt;li&gt;It can use CoordinatedPlatformLayer::setAnimations.&lt;/li&gt;
&lt;li&gt;Or CoordinatedPlatformLayer::setOpacity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add the showing animation and transition animations of mouse hover states like GTK Adwaita theme&lt;/li&gt;
&lt;li&gt;Support touch and gesture events async scrolling&lt;/li&gt;
&lt;/ul&gt;        </description>
	<pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Kate Lee: Building a Custom HTML Context Menu with the New WPEPlatform API</title>
	<guid>https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/</guid>
	<link>https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/</link>
	<description>
&lt;p&gt;&lt;a href=&quot;https://wpewebkit.org/&quot;&gt;WPE WebKit&lt;/a&gt; is a WebKit port optimized for embedded devices &#8212; think set-top boxes, digital signage, kiosk displays, and in-vehicle infotainment systems. It is developed by &lt;a href=&quot;https://www.igalia.com/&quot;&gt;Igalia&lt;/a&gt; and powers web experiences on millions of devices worldwide, from set-top boxes to smart TVs and beyond.&lt;/p&gt;
&lt;p&gt;WPE WebKit has recently introduced a &lt;strong&gt;brand-new platform API called WPEPlatform&lt;/strong&gt;, which replaces the legacy &lt;code&gt;libwpe&lt;/code&gt; + &lt;code&gt;wpebackend-fdo&lt;/code&gt; stack. In this post, I will walk you through building a minimal WPE browser launcher using &lt;strong&gt;only the new WPEPlatform API&lt;/strong&gt;, and demonstrate one of its newly available features: the &lt;strong&gt;Context Menu API&lt;/strong&gt; &#8212; rendered entirely as an HTML overlay.&lt;/p&gt;
&lt;h2 id=&quot;why-a-new-api&quot; tabindex=&quot;-1&quot;&gt;Why a New API? &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The legacy stack (&lt;code&gt;libwpe&lt;/code&gt; + &lt;code&gt;wpebackend-fdo&lt;/code&gt; + Cog platform plugins) had several pain points: nested Wayland compositor complexity, dependency on Mesa&#8217;s now-deprecated &lt;code&gt;EGL_WL_bind_wayland_display&lt;/code&gt; extension, rigid C function-pointer tables, and platform code scattered across three libraries.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;new WPEPlatform API&lt;/strong&gt; replaces all of this with a single, clean &lt;a href=&quot;https://docs.gtk.org/gobject/&quot;&gt;GObject&lt;/a&gt;-based layer &#8212; providing automatic backend creation, DMA-BUF direct buffer sharing, unified window management (fullscreen, maximize, resize, title), and easy language bindings via GObject Introspection.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Timeline&lt;/strong&gt;: The stable release of WPEPlatform is planned for &lt;strong&gt;September 2026&lt;/strong&gt;. At that point, the legacy API will be officially deprecated. We strongly recommend new projects to adopt the WPEPlatform API from the start.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;wpeplatform-launcher-a-minimal-browser-in-250-lines&quot; tabindex=&quot;-1&quot;&gt;WPEPlatform Launcher: A Minimal Browser in ~250 Lines &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To demonstrate the new API, I built &lt;strong&gt;WPEPlatformLauncher&lt;/strong&gt; &#8212; a minimal but functional WPE WebKit browser that uses only the WPEPlatform API. No legacy &lt;code&gt;libwpe&lt;/code&gt;, no &lt;code&gt;wpebackend-fdo&lt;/code&gt;, no Cog &#8212; just the new API.&lt;/p&gt;
&lt;p&gt;The full source code is available at:
&lt;strong&gt;&lt;a href=&quot;https://github.com/kate-k-lee/WebKit/commit/aed6402b267475f79ae7a8d417d18239b53be651&quot;&gt;kate-k-lee/WebKit@aed6402&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;how-simple-is-it&quot; tabindex=&quot;-1&quot;&gt;How Simple Is It? &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here is the core of the launcher &#8212; creating a WebView with the new API:&lt;/p&gt;
&lt;pre class=&quot;language-cpp&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* WPEPlatform backend is created automatically &#8212; no manual setup needed */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; webView &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;WEBKIT_WEB_VIEW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;g_object_new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;WEBKIT_TYPE_WEB_VIEW&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token string&quot;&gt;&quot;web-context&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; webContext&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token string&quot;&gt;&quot;network-session&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; networkSession&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token string&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; settings&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token string&quot;&gt;&quot;user-content-manager&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; userContentManager&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;nullptr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;/* Get the WPEPlatform view &#8212; this is where the new API shines */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; wpeView &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;webkit_web_view_get_wpe_view&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;webView&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; toplevel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wpe_view_get_toplevel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wpeView&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;/* Window management: fullscreen, resize, title &#8212; all built-in */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;wpe_toplevel_fullscreen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toplevel&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;wpe_toplevel_resize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toplevel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1920&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1080&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;wpe_toplevel_set_title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toplevel&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;WPEPlatform Launcher&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;/* Input events: just connect a GObject signal */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;g_signal_connect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wpeView&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;event&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;G_CALLBACK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;onViewEvent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; webView&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Compare this with the legacy API, which required:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Manually creating a &lt;code&gt;WPEToolingBackends::ViewBackend&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Wrapping it in a &lt;code&gt;WebKitWebViewBackend&lt;/code&gt; with a destroy callback&lt;/li&gt;
&lt;li&gt;Creating a C++ &lt;code&gt;InputClient&lt;/code&gt; class and registering it&lt;/li&gt;
&lt;li&gt;Having no window management (no maximize, minimize, title, etc.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The new API handles backend creation, display detection, and input forwarding automatically.&lt;/p&gt;
&lt;h3 id=&quot;keyboard-shortcuts&quot; tabindex=&quot;-1&quot;&gt;Keyboard Shortcuts &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Handling keyboard events is straightforward with the WPEPlatform event system:&lt;/p&gt;
&lt;pre class=&quot;language-cpp&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; gboolean &lt;span class=&quot;token function&quot;&gt;onViewEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;WPEView&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; view&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; WPEEvent&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; WebKitWebView&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; webView&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;wpe_event_get_event_type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; WPE_EVENT_KEYBOARD_KEY_DOWN&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; FALSE&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt; modifiers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wpe_event_get_modifiers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt; keyval &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wpe_event_keyboard_get_keyval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;/* Ctrl+Q: Quit */&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;modifiers &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt; WPE_MODIFIER_KEYBOARD_CONTROL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; keyval &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; WPE_KEY_q&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token function&quot;&gt;g_application_quit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;g_application_get_default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; TRUE&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;/* F11: Toggle fullscreen via WPEToplevel */&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyval &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; WPE_KEY_F11&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; toplevel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wpe_view_get_toplevel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;view&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;wpe_toplevel_get_state&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toplevel&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt; WPE_TOPLEVEL_STATE_FULLSCREEN&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token function&quot;&gt;wpe_toplevel_unfullscreen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toplevel&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token function&quot;&gt;wpe_toplevel_fullscreen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toplevel&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; TRUE&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; FALSE&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;html-based-context-menu-solving-the-no-native-ui-challenge&quot; tabindex=&quot;-1&quot;&gt;HTML-Based Context Menu: Solving the &#8220;No Native UI&#8221; Challenge &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;WPE WebKit is designed for embedded environments where there is &lt;strong&gt;no native UI toolkit&lt;/strong&gt; &#8212; no GTK, no Qt. This means features like context menus (right-click menus) that desktop browsers take for granted need to be implemented by the application.&lt;/p&gt;
&lt;p&gt;The approach: &lt;strong&gt;intercept WebKit&#8217;s &lt;code&gt;context-menu&lt;/code&gt; signal, read the menu items, and render them as an HTML/CSS overlay&lt;/strong&gt; injected into the page DOM.&lt;/p&gt;
&lt;h3 id=&quot;the-architecture&quot; tabindex=&quot;-1&quot;&gt;The Architecture &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;User right-clicks
  &#8594; WebKit emits &amp;quot;context-menu&amp;quot; signal
  &#8594; onContextMenu() handler:
      1. Reads menu items via webkit_context_menu_get_items()
      2. Gets position via webkit_context_menu_get_position()
      3. Builds JavaScript that creates DOM elements
      4. Injects via webkit_web_view_evaluate_javascript()
      5. Returns TRUE (suppresses default menu)

User clicks a menu item
  &#8594; JS: window.webkit.messageHandlers.contextMenuAction.postMessage(actionId)
  &#8594; C: onContextMenuAction() receives the action ID
      &#8594; Executes: webkit_web_view_go_back(), execute_editing_command(&amp;quot;Copy&amp;quot;), etc.

User clicks outside the menu
  &#8594; JS: overlay click handler removes the DOM elements
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;reading-context-menu-items&quot; tabindex=&quot;-1&quot;&gt;Reading Context Menu Items &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Context Menu API provides everything we need:&lt;/p&gt;
&lt;pre class=&quot;language-cpp&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; gboolean &lt;span class=&quot;token function&quot;&gt;onContextMenu&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;WebKitWebView&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; webView&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    WebKitContextMenu&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; contextMenu&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gpointer &lt;span class=&quot;token comment&quot;&gt;/* event */&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    WebKitHitTestResult&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; hitTestResult&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gpointer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;/* Save hit test result for link-related actions */&lt;/span&gt;&lt;br /&gt;    savedHitTestResult &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;WEBKIT_HIT_TEST_RESULT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;g_object_ref&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hitTestResult&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;/* Iterate through menu items */&lt;/span&gt;&lt;br /&gt;    GList&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; items &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;webkit_context_menu_get_items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;contextMenu&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;GList&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; l &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; l&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; l &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; l&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;next&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;WEBKIT_CONTEXT_MENU_ITEM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;l&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;webkit_context_menu_item_is_separator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token comment&quot;&gt;/* Render as a horizontal line */&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; title &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;webkit_context_menu_item_get_title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt; action &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;webkit_context_menu_item_get_stock_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token comment&quot;&gt;/* Build HTML element with title and action ID */&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;/* Get position for menu placement */&lt;/span&gt;&lt;br /&gt;    gint posX &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; posY &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token function&quot;&gt;webkit_context_menu_get_position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;contextMenu&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;posX&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;posY&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; TRUE&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* Suppress default menu */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;the-html-menu-dark-theme-for-embedded&quot; tabindex=&quot;-1&quot;&gt;The HTML Menu: Dark Theme for Embedded &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The context menu is rendered with a dark theme CSS, designed for embedded/kiosk displays:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#__wpe_ctx_menu&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; fixed&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 180px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #2b2b2b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px solid #505050&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 6px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4px 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 8px 24px &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0.4&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; system-ui&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 13px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #e0e0e0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token selector&quot;&gt;.__wpe_ctx_item:hover&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #0060df&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #ffffff&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;handling-actions-via-script-message-handler&quot; tabindex=&quot;-1&quot;&gt;Handling Actions via Script Message Handler &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Communication between the HTML menu and the C application uses WebKit&#8217;s script message handler mechanism:&lt;/p&gt;
&lt;pre class=&quot;language-cpp&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Register message handler */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; ucm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;webkit_user_content_manager_new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;webkit_user_content_manager_register_script_message_handler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;br /&gt;    ucm&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;contextMenuAction&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;nullptr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;g_signal_connect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ucm&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;script-message-received::contextMenuAction&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token function&quot;&gt;G_CALLBACK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;onContextMenuAction&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;nullptr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// In the generated HTML menu item:&lt;/span&gt;&lt;br /&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;'click'&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;webkit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messageHandlers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contextMenuAction&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;postMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;actionId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-cpp&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Handle the action in C */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onContextMenuAction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;WebKitUserContentManager&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; JSCValue&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gpointer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; actionId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;jsc_value_to_int32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;actionId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; WEBKIT_CONTEXT_MENU_ACTION_RELOAD&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token function&quot;&gt;webkit_web_view_reload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;webView&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; WEBKIT_CONTEXT_MENU_ACTION_COPY&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token function&quot;&gt;webkit_web_view_execute_editing_command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;webView&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Copy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; WEBKIT_CONTEXT_MENU_ACTION_OPEN_LINK&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token function&quot;&gt;webkit_web_view_load_uri&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;webView&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token function&quot;&gt;webkit_hit_test_result_get_link_uri&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;savedHitTestResult&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;/* ... more actions ... */&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;demo&quot; tabindex=&quot;-1&quot;&gt;Demo &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here is the WPEPlatformLauncher in action, showing the HTML context menu with various actions:&lt;/p&gt;
&lt;img src=&quot;https://blogs.igalia.com/klee/blog/wpeplatform-launcher-context-menu/context-menu-demo.gif&quot; alt=&quot;WPEPlatformLauncher context menu demo&quot; /&gt;
&lt;p&gt;&lt;em&gt;Right-clicking shows the HTML context menu. Clicking &#8220;Reload&#8221; triggers an actual page reload.&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;https://blogs.igalia.com/klee/blog/wpeplatform-launcher-context-menu/context-menu-link-demo.gif&quot; alt=&quot;Context menu on a link&quot; /&gt;
&lt;p&gt;&lt;em&gt;Right-clicking a link shows link-specific actions like &#8220;Open Link&#8221; and &#8220;Copy Link Address&#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;building-and-running&quot; tabindex=&quot;-1&quot;&gt;Building and Running &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I built and ran the WPEPlatformLauncher inside a container using the &lt;a href=&quot;https://github.com/Igalia/webkit-container-sdk&quot;&gt;WebKit Container SDK&lt;/a&gt;, which provides a pre-configured development environment with all the dependencies needed to build WPE WebKit.&lt;/p&gt;
&lt;p&gt;The WPEPlatformLauncher integrates into the WebKit build system:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Build WPE WebKit with the launcher&lt;/span&gt;&lt;br /&gt;Tools/Scripts/build-webkit &lt;span class=&quot;token parameter variable&quot;&gt;--wpe&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--release&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;# Run&lt;/span&gt;&lt;br /&gt;./WebKitBuild/WPE/Release/bin/WPEPlatformLauncher https://wpewebkit.org&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;# Run in fullscreen (kiosk mode)&lt;/span&gt;&lt;br /&gt;./WebKitBuild/WPE/Release/bin/WPEPlatformLauncher &lt;span class=&quot;token parameter variable&quot;&gt;--fullscreen&lt;/span&gt; https://your-app.com&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The full source is a single &lt;code&gt;main.cpp&lt;/code&gt; file (~600 lines including the context menu), integrated into the WebKit tree alongside MiniBrowser:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WebKit/Tools/
&#9500;&#9472;&#9472; MiniBrowser/wpe/          &#8592; Existing (supports both old + new API)
&#9500;&#9472;&#9472; WPEPlatformLauncher/      &#8592; New (WPEPlatform API only)
&#9474;   &#9500;&#9472;&#9472; main.cpp
&#9474;   &#9492;&#9472;&#9472; CMakeLists.txt
&#9492;&#9472;&#9472; PlatformWPE.cmake         &#8592; Modified to add WPEPlatformLauncher
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The new &lt;strong&gt;WPEPlatform API&lt;/strong&gt; makes building WPE WebKit applications significantly simpler:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No manual backend setup&lt;/strong&gt; &#8212; the platform is detected and configured automatically&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GObject-based&lt;/strong&gt; &#8212; signals, properties, and ref counting instead of C function pointers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DMA-BUF direct sharing&lt;/strong&gt; &#8212; no dependency on Mesa&#8217;s deprecated EGL extensions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified window management&lt;/strong&gt; &#8212; fullscreen, maximize, minimize, resize, and title&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Language binding friendly&lt;/strong&gt; &#8212; works with Python, JavaScript, and more via GObject Introspection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For embedded browser developers building kiosk UIs, set-top box interfaces, or digital signage with WPE WebKit &#8212; now is the time to adopt the new API. The stable release is coming in September 2026, and the legacy stack (&lt;code&gt;libwpe&lt;/code&gt;, &lt;code&gt;wpebackend-fdo&lt;/code&gt;, Cog) will be deprecated at that point.&lt;/p&gt;
&lt;h2 id=&quot;resources&quot; tabindex=&quot;-1&quot;&gt;Resources &lt;a class=&quot;header-anchor&quot; href=&quot;https://blogs.igalia.com/klee/building-a-custom-html-context-menu-with-the-new-wpeplatform-api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wpewebkit.org/&quot;&gt;WPE WebKit official site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wpewebkit.org/reference/2.51.92/wpe-webkit-2.0/index.html&quot;&gt;WPE WebKit API Reference (2.51.92)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wpewebkit.org/reference/2.51.92/wpe-webkit-2.0/class.ContextMenu.html&quot;&gt;WebKitContextMenu API Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kate-k-lee/WebKit/commit/aed6402b267475f79ae7a8d417d18239b53be651&quot;&gt;WPEPlatformLauncher source code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.igalia.com/project/wpe&quot;&gt;Igalia &#8212; WPE WebKit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Igalia/cog&quot;&gt;Cog &#8212; WPE launcher (legacy)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;        </description>
	<pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Hironori Fujii: Building WebKit and libsoup with AddressSanitizer (ASan)</title>
	<guid>https://blogs.igalia.com/fujii/building-webkit-and-libsoup-with-addresssanitizer-asan/</guid>
	<link>https://blogs.igalia.com/fujii/building-webkit-and-libsoup-with-addresssanitizer-asan/</link>
	<description>
&lt;p&gt;I built libsoup and WebKit with ASan today.
It works almost out of the box.
I used Clang.
GCC also supports ASan, but WebKit has a problem with it.
&lt;a href=&quot;https://github.com/Igalia/webkit-container-sdk&quot;&gt;WebKit Container SDK&lt;/a&gt; is based on Ubuntu 20.04 LTS at the moment.
It contains clang 18 by default.&lt;/p&gt;
&lt;p&gt;Installed required packages.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; libclang-rt-18-dev llvm-18-dev&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set env vars.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;CC&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;clang &lt;span class=&quot;token assign-left variable&quot;&gt;CXX&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;clang++&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Passed some flags to libsoup.&lt;/p&gt;
&lt;pre class=&quot;language-diff&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token coord&quot;&gt;--- /jhbuild/webkit-sdk-deps.modules.orig&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token coord&quot;&gt;+++ /jhbuild/webkit-sdk-deps.modules&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token coord&quot;&gt;@@ -149,7 +149,7 @@&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;    &amp;lt;/dependencies&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;  &amp;lt;/meson&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;  &amp;lt;meson id=&quot;libsoup&quot; mesonargs=&quot;-Dtests=false&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;  &amp;lt;meson id=&quot;libsoup&quot; mesonargs=&quot;-Dtests=false -Db_sanitize=address -Db_lundef=false&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;    &amp;lt;branch repo=&quot;github.com&quot;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;            checkoutdir=&quot;libsoup&quot;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;            module=&quot;GNOME/libsoup.git&quot; tag=&quot;3.6.6&quot;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, build and install libsoup.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;jhbuild buildone &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; libsoup&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, build WebKit with ASan.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;./Tools/Scripts/build-webkit &lt;span class=&quot;token parameter variable&quot;&gt;--gtk&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--release&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cmakeargs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;-DENABLE_SANITIZERS&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;address&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;WebKit has a lot of memory leaks by design. Don&#8217;t detect leaks.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ASAN_OPTIONS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;detect_leaks&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For run-webkit-tests, I had to modify a script a bit.&lt;/p&gt;
&lt;pre class=&quot;language-diff&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;diff --git a/Tools/Scripts/webkitpy/port/driver.py b/Tools/Scripts/webkitpy/port/driver.py&lt;br /&gt;index eb12801a455b..c9f74eeab4e2 100644&lt;br /&gt;&lt;span class=&quot;token coord&quot;&gt;--- a/Tools/Scripts/webkitpy/port/driver.py&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token coord&quot;&gt;+++ b/Tools/Scripts/webkitpy/port/driver.py&lt;/span&gt;&lt;br /&gt;@@ -482,7 +482,7 @@ class Driver(object):&lt;br /&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;        else:&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;            environment['DUMPRENDERTREE_TEMP'] = str(self._driver_tempdir)&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;        environment['LOCAL_RESOURCE_ROOT'] = str(self._port.layout_tests_dir())&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;        environment['ASAN_OPTIONS'] = &quot;allocator_may_return_null=1&quot;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;        environment['ASAN_OPTIONS'] = &quot;allocator_may_return_null=1:detect_leaks=0&quot;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;        environment['__XPC_ASAN_OPTIONS'] = environment['ASAN_OPTIONS']&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token line&quot;&gt;        # Disable vnode-guard related simulated crashes for WKTR / DRT (rdar://problem/40674034).&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#8217;s it. Enjoy.&lt;/p&gt;        </description>
	<pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #59</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-59/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-59/</link>
	<description>
&lt;p&gt;Update on what happened in WebKit in the week from March 2 to March 9.&lt;/p&gt;
&lt;p&gt;
As part of this week's handful of news, WebKitGTK and WPE WebKit
now have support for Gamepad's &quot;VibationActuator&quot; property, the
video decoding limit is now configurable at runtime in addition
to build time, and an interesting fix that makes WebKit render
fonts like other browsers by making it blend text incorrectly (!).
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port &#128049;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Using &lt;code&gt;libmanette&lt;/code&gt;'s &lt;em&gt;rumble&lt;/em&gt; support, enabled &lt;a rel=&quot;external&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Gamepad/vibrationActuator&quot;&gt;Gamepad &lt;em&gt;VibrationActuator&lt;/em&gt;&lt;/a&gt; for &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/308799@main&quot;&gt;WebKitGTK&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/308792@main&quot;&gt;WPE WebKit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With these changes, &lt;a rel=&quot;external&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/GamepadHapticActuator/playEffect&quot;&gt;playEffect()&lt;/a&gt; can be used to play &lt;em&gt;dual-rumble&lt;/em&gt; vibration effects.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;multimedia-movie-camera&quot;&gt;Multimedia &#127909;&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;VIDEO_DECODING_LIMIT&lt;/code&gt; is now &lt;a rel=&quot;external&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=308969&quot;&gt;configurable at runtime&lt;/a&gt;, in addition to build time. That will allow vendors that share a single binary build on different platforms to fine-tune their needs without a rebuild.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics &#128444;&#65039;&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Landed &lt;a rel=&quot;external&quot; href=&quot;https://github.com/WebKit/WebKit/pull/59880&quot;&gt;a change&lt;/a&gt; that tweaks the text rendering done with Skia. With this change, the text looks more natural now - just like in other browsers. However, this is done by blending text incorrectly as a compromise.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases &#128230;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;One more set of release candidates for the upcoming stable branch,
&lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/03/06/webkitgtk2.51.93-released.html&quot;&gt;WebKitGTK 2.51.93&lt;/a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/release/wpewebkit-2.51.93.html&quot;&gt;WPE WebKit 2.51.93&lt;/a&gt;,
have been published. For those interested in previewing the upcoming 2.52.x
series this release is expected to be quite stable. Reporting &lt;a rel=&quot;external&quot; href=&quot;https://bugs.webkit.org/&quot;&gt;issues in Bugzilla&lt;/a&gt; are,
as usual, more than welcome.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Mon, 09 Mar 2026 20:02:33 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #58</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-58/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-58/</link>
	<description>
&lt;p&gt;Update on what happened in WebKit in the week from February 23 to March 2.&lt;/p&gt;
&lt;p&gt;
This installment of the periodical brings news about support
for Qualcomm qtivdec2 and qtivenc2 on GStreamer, GPU texture
atlas creation and replay substitution, enhancement of the scroll
gesture in WPE, and two new releases: WebKitGTK 2.51.92 and WPE
WebKit 2.51.92.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port &#128049;&lt;/h2&gt;
&lt;h3 id=&quot;multimedia-movie-camera&quot;&gt;Multimedia &#127909;&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;GStreamer-based multimedia support for WebKit, including (but not limited to) playback, capture, WebAudio, WebCodecs, and WebRTC.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Work on adding support for the Qualcomm GStreamer qtivdec2 and qtivenc2 elements is on-going&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics &#128444;&#65039;&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/308458@main&quot;&gt;Implemented GPU texture atlas creation and replay substitution&lt;/a&gt; in the Skia painting engine on GTK/WPE. After recording, raster images are packed into GPU atlases via &lt;code&gt;BitmapTexture&lt;/code&gt;, with two upload paths: an optimized DMA-buf path that memory-maps GPU buffers and dispatches uploading to a dedicated worker thread, and a synchronous GL fallback using &lt;code&gt;BitmapTexture::updateContents()&lt;/code&gt;. Atlas uploads are synchronized across workers using a countdown-latch fence. During replay, &lt;code&gt;SkiaReplayCanvas&lt;/code&gt; intercepts raster image draws and substitutes them with atlas texture draws, mapping source coordinates into atlas space.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit &#128223;&lt;/h2&gt;
&lt;h3 id=&quot;wpe-platform-api-jigsaw&quot;&gt;WPE Platform API &#129513;&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;New, modern platform API that supersedes usage of libwpe and WPE backends.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The recent WPE WebKit 2.51.92 release is the first one to have its &lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/reference/2.51.92/wpe-platform-2.0/&quot;&gt;WPEPlatform documentation online&lt;/a&gt;, but it was not included in the tarball. This issue &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/308408@main&quot;&gt;has been corrected&lt;/a&gt; and tarballs for future releases  will also include this documentation.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Scrolling using touch input with WPEPlatform would result in scrolling faster when more than one touch point was in effect. The gesture detector &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/308271@main&quot;&gt;has been fixed&lt;/a&gt; to make scrolling have always a consistent speed.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases &#128230;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The third &#8212;and likely the last&#8212; release candidates for the upcoming stable branch, &lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/02/27/webkitgtk2.51.92-released.html&quot;&gt;WebKitGTK 2.51.92&lt;/a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/release/wpewebkit-2.51.92.html&quot;&gt;WPE WebKit 2.51.92&lt;/a&gt;, have been published. For those interested in previewing the upcoming 2.52.x series this release is expected to be quite stable; but there might be still some rough edges. Reporting &lt;a rel=&quot;external&quot; href=&quot;https://bugs.webkit.org/&quot;&gt;issues in Bugzilla&lt;/a&gt; are, as usual, more than welcome.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Mon, 02 Mar 2026 20:11:00 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #57</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-57/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-57/</link>
	<description>
&lt;p&gt;Update on what happened in WebKit in the week from February 9 to February 23.&lt;/p&gt;
&lt;p&gt;
In this week we have a nice fix for video streams timestamps, a fix
for a PDF rendering regression, support for rendering video buffers
provided by Qualcomm video decoders, and a fix for a font selection
issue. Also notable we had a new WPE Android release, and the libsoup
3.6.6 release.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port &#128049;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Added a &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/307348@main&quot;&gt;new &lt;code&gt;webkit_feature_list_find()&lt;/code&gt; convenience function&lt;/a&gt; to the public API, which searches for a &lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/reference/webkitgtk/2.51.91/struct.Feature.html&quot;&gt;WebKitFeature&lt;/a&gt; given its identifier.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;multimedia-movie-camera&quot;&gt;Multimedia &#127909;&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 rel=&quot;external&quot; href=&quot;https://commits.webkit.org/307359@main&quot;&gt;Opportunistically fix decoding timestamps to prevent deletion of preexisting samples when PTS doesn't conflict&lt;/a&gt;, fixing potential glitches when inserting videos (eg: ad insertion).&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics &#128444;&#65039;&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/308033@main&quot;&gt;Fixed&lt;/a&gt; a &lt;a rel=&quot;external&quot; href=&quot;https://bugs.webkit.org/show_bug.cgi?id=306621&quot;&gt;PDF rendering regression&lt;/a&gt; caused by the canvas 2D operation recording feature, where switching between the recording canvas and the GPU surface canvas failed to preserve the full save/restore nesting, clip stack, and transparency layer state. Replaced the fragile state-copying approach with a state replay mechanism in GraphicsContextSkia that tracks the full sequence of save restore, clip, and transparency layer operations, then reconstructs the exact nesting on the target canvas when flushing a recording.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/307174@main&quot;&gt;Added support&lt;/a&gt; for rendering video buffers provided by Qualcomm hardware-accelerated decoders, with aid from the &lt;a rel=&quot;external&quot; href=&quot;https://registry.khronos.org/OpenGL/extensions/EXT/EXT_YUV_target.txt&quot;&gt;EXT_YUV_target&lt;/a&gt; OpenGL extension.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/307565@main&quot;&gt;Fixed&lt;/a&gt; the font selection issue that the system fallback font cache mixed up different font styles.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases &#128230;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Igalia/wpe-android/releases/tag/v0.3.2&quot;&gt;WPE Android 0.3.2&lt;/a&gt; has been released, and prebuilt packages are available &lt;a rel=&quot;external&quot; href=&quot;https://central.sonatype.com/artifact/org.wpewebkit.wpeview/wpeview/&quot;&gt;at the Maven Central repository&lt;/a&gt;. This is a stable maintenance release which updates WPE WebKit to 2.50.5, which is the most recent stable release.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://gitlab.gnome.org/GNOME/libsoup/-/releases/3.6.6&quot;&gt;libsoup 3.6.6&lt;/a&gt; has been released with numerous bug and security fixes.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Mon, 23 Feb 2026 19:52:49 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #56</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-56/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-56/</link>
	<description>
&lt;p&gt;Update on what happened in WebKit in the week from February 2 to February 9.&lt;/p&gt;
&lt;p&gt;
The main event this week was FOSDEM (pun intended), which included
presentations related to WebKit; but also we got a batch of stable
and development releases, asynchronous scrolling work, OpenGL
logging, cleanups, and improving the inspector for the WPE work.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port &#128049;&lt;/h2&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics &#128444;&#65039;&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;While asynchronous scrolling for mouse wheel events was already supported,
scrollbar layers were still being painted on the main thread. This has been
&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/306838@main&quot;&gt;changed&lt;/a&gt; to paint scrollbars on the
scrolling thread instead, which avoids scrollbars to &#8220;lag&#8221; behind scrolled
content.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/306987@main&quot;&gt;Fixed&lt;/a&gt; flickering caused by the
combination of damage tracking and asynchronous scrolling for mouse wheel
events.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;It is now possible to &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/306778@main&quot;&gt;enable debug logging for OpenGL
contexts&lt;/a&gt; using the new &lt;code&gt;GLContext&lt;/code&gt; log
channel, which takes advantage of the message events produced by the
&lt;a rel=&quot;external&quot; href=&quot;https://wikis.khronos.org/opengl/Debug_Output&quot;&gt;widespread KHR_debug
extension&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Figuring out the exact location inside WebKit that triggered an OpenGL issue
may still be challenging with this aid, and therefore &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/306862@main&quot;&gt;a backtrace will be
appended&lt;/a&gt; in case of errors to help
pinpoint the source, when the log channel is enabled at the &#8220;debug&#8221; level with
&lt;code&gt;GLContext=debug&lt;/code&gt;.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Configuring the build with &lt;code&gt;USE_SKIA=OFF&lt;/code&gt; to make WebKit use the
&lt;a rel=&quot;external&quot; href=&quot;https://cairographics.org/&quot;&gt;Cairo&lt;/a&gt; graphics library &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/306343@main&quot;&gt;is no longer
supported&lt;/a&gt;. Using
&lt;a rel=&quot;external&quot; href=&quot;https://skia.org&quot;&gt;Skia&lt;/a&gt; has been the default &lt;a rel=&quot;external&quot; href=&quot;https://blogs.igalia.com/carlosgc/2024/09/27/graphics-improvements-in-webkitgtk-and-wpewebkit-2-46/&quot;&gt;since  late
2024&lt;/a&gt;,
and after two full years the 2.54.0 release (due in September 2026)
will be the first one where the choice is no longer possible.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;webkitgtk-desktop&quot;&gt;WebKitGTK &#128421;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The &#8220;on demand&#8221; hardware acceleration policy has been rarely used lately, and
thus support for it has been &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/306855@main&quot;&gt;removed&lt;/a&gt;.
Note that this affects only the GTK port when built with GTK 3&#8212;the option never
existed when using GTK 4.&lt;/p&gt;
&lt;p&gt;Existing GTK 3 applications that use
&lt;code&gt;WEBKIT_HARDWARE_ACCELERATION_POLICY_ON_DEMAND&lt;/code&gt; will continue to work and do
&lt;strong&gt;not&lt;/strong&gt; need rebuilding: they will be promoted to use the &#8220;always enabled&#8221; policy
starting with WebKitGTK 2.54.0 (due in September 2026).&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit &#128223;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;The Web Inspector &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/306914@main&quot;&gt;has received
support&lt;/a&gt; for saving data to local
files, allowing things such as saving page resources or exporting the network
session to a &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/HAR_(file_format)&quot;&gt;HAR archive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that using the Web Inspector locally is supported when using the
WPEPlatform API, and the keyboard shortcut &lt;kbd title=&quot;Control + Shift + I&quot;&gt;Ctrl+Shift+I&lt;/kbd&gt; may be used to bring it up.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases &#128230;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/02/09/webkitgtk2.50.5-released.html&quot;&gt;WebKitGTK
2.50.5&lt;/a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/release/wpewebkit-2.50.5.html&quot;&gt;WPE WebKit 2.50.5&lt;/a&gt; have
been released. These are stable maintenance releases that improves stability,
correct bugs, and fixes small rendering issues.&lt;/p&gt;
&lt;p&gt;The second release candidates for the upcoming stable branch, &lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/02/06/webkitgtk2.51.91-released.html&quot;&gt;WebKitGTK
2.51.91&lt;/a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/release/wpewebkit-2.51.91.html&quot;&gt;WPE WebKit 2.51.91&lt;/a&gt;,
have been published as well. Those using those to preview the upcoming 2.52.x
series are encouraged to provide &lt;a rel=&quot;external&quot; href=&quot;https://bugs.webkit.org/&quot;&gt;bug reports in
Bugzilla&lt;/a&gt; for any issue they may experience.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;community-events-handshake&quot;&gt;Community &amp;amp; Events &#129309;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;We have published a &lt;a rel=&quot;external&quot; href=&quot;https://blogs.igalia.com/compilers/2026/02/02/implementing-the-temporal-proposal-in-javascriptcore/&quot;&gt;blog
post&lt;/a&gt;
on our work implementing the
&lt;a rel=&quot;external&quot; href=&quot;https://tc39.es/proposal-temporal/docs/&quot;&gt;Temporal&lt;/a&gt; proposal in JavaScriptCore,
WebKit's JavaScript engine.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;This year's edition of &lt;a rel=&quot;external&quot; href=&quot;https://fosdem.org/2026/&quot;&gt;FOSDEM&lt;/a&gt; took place in
Brussels between January 31st and February 1st, and featured a number of
sessions related to WebKitGTK and WPE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://fosdem.org/2026/schedule/event/8ZL9BZ-web-platform-on-linux-devices-with-webkit/&quot;&gt;The Web Platform on Linux devices with WebKit: where are we
now?&lt;/a&gt;,
by Mario S&#225;nchez, is a good introduction-level talk about the GTK and WPE
WebKit ports.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://fosdem.org/2026/schedule/event/KMMLGM-webrtc_support_in_webkitgtk_and_wpewebkit_with_gstreamer_current_status_and_plan/&quot;&gt;WebRTC support in WebKitGTK and WPEWebKit with GStreamer: Current status and
plans&lt;/a&gt;
by Philippe Normand. Exactly what it says on the tin.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://fosdem.org/2026/schedule/event/NJM3KB-mathml-core/&quot;&gt;Interop and MathML
Core&lt;/a&gt; by Eri
Pazos, about the ongoing effort to improve how different Web engines handle
MathML&#8212;including WebKit!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The videos for the talks are already available, too.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Mon, 09 Feb 2026 23:21:30 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #55</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-55/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-55/</link>
	<description>
&lt;p&gt;Update on what happened in WebKit in the week from January 26 to February 2.&lt;/p&gt;
&lt;p&gt;
A calm week for sure! The highlight this week is the fix for scrolling not starting when the main thread is blocked.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port &#128049;&lt;/h2&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics &#128444;&#65039;&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/306396@main&quot;&gt;Fixed&lt;/a&gt; the problem of wheel event async scrolling doesn't start while the main thread is blocked. This should make WebKit feel more responsive even on heavier websites.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Mon, 02 Feb 2026 20:11:18 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>Igalia WebKit Team: WebKit Igalia Periodical #54</title>
	<guid>https://blogs.igalia.com/webkit/blog/2026/wip-54/</guid>
	<link>https://blogs.igalia.com/webkit/blog/2026/wip-54/</link>
	<description>
&lt;p&gt;Update on what happened in WebKit in the week from January 19 to January 26.&lt;/p&gt;
&lt;p&gt;
The main event this week has been the creation of the branch for the upcoming stable series, accompanied by the first release candidate before 2.52.0. But there's more: the WPE port gains hyphenation support and the ability to notify of graphics buffer changes; both ports get graphics fixes and a couple of new Web features, and WPE-Android also gets a new stable release.
&lt;/p&gt;
&lt;h2 id=&quot;cross-port-cat&quot;&gt;Cross-Port &#128049;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/305917@main&quot;&gt;Implemented&lt;/a&gt; support for the &lt;code&gt;:open&lt;/code&gt;
pseudo-class on dialog and details elements. This is currently behind the
&lt;code&gt;OpenPseudoClass&lt;/code&gt; feature flag.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/306152@main&quot;&gt;Implemented&lt;/a&gt; the &lt;code&gt;source&lt;/code&gt; property for
&lt;code&gt;ToggleEvent&lt;/code&gt;. This can be used to run code dependent on the triggering element
in response to a popover or dialog toggle.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;graphics-frame-photo&quot;&gt;Graphics &#128444;&#65039;&lt;/h3&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/306119@main&quot;&gt;Fixed&lt;/a&gt; the rendering glitches with
wheel event asynchronous scrolling, which occurred when the page was scrolled
to areas not covered by tiles while the main thread was blocked.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;wpe-webkit-pager&quot;&gt;WPE WebKit &#128223;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;Support for
&lt;a rel=&quot;external&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/hyphens&quot;&gt;hyphenation&lt;/a&gt;
has been &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/305816@main&quot;&gt;added to WPE&lt;/a&gt;. This requires
&lt;code&gt;libhyphen&lt;/code&gt; and can be disabled at build-time with the &lt;code&gt;USE_LIBHYPHEN=OFF&lt;/code&gt;
CMake option.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;wpe-platform-api-jigsaw&quot;&gt;WPE Platform API &#129513;&lt;/h3&gt;
&lt;div class=&quot;wip-description&quot;&gt;
&lt;p&gt;New, modern platform API that supersedes usage of libwpe and WPE backends.&lt;/p&gt;
&lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;WPEPlatform &lt;a rel=&quot;external&quot; href=&quot;https://commits.webkit.org/306008@main&quot;&gt;gained support&lt;/a&gt; to notify
changes in the configuration of graphics buffers allocated to render the
contents of a web view, either by handling the &lt;code&gt;WPEView::buffers-changed&lt;/code&gt;
signal or by overriding the &lt;code&gt;WPEViewClass.buffers_changed&lt;/code&gt; virtual function.
This feature is mainly useful for platform implementations which may need to
perform additional setup in advance, before updated web view contents are
provided in the buffers configured by WebKit.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;releases-package&quot;&gt;Releases &#128230;&#65039;&lt;/h2&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/Igalia/wpe-android/releases/tag/v0.3.1&quot;&gt;WPE-Android 0.3.0&lt;/a&gt;
has been released, and prebuilt packages are available &lt;a rel=&quot;external&quot; href=&quot;https://central.sonatype.com/artifact/org.wpewebkit.wpeview/wpeview/&quot;&gt;at the Maven Central
repository&lt;/a&gt;.
The main change in this this version is the update to WPE WebKit 2.50.4, which
is the most recent stable release.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;wip-item&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/WebKit/WebKit/commits/webkitglib/2.52&quot;&gt;A new branch has been
created&lt;/a&gt; for the
upcoming 2.52.x stable release series of the GTK and WPE WebKit ports. The
first release candidates from this branch, &lt;a rel=&quot;external&quot; href=&quot;https://webkitgtk.org/2026/01/23/webkitgtk2.51.90-released.html&quot;&gt;WebKitGTK
2.51.90&lt;/a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https://wpewebkit.org/release/wpewebkit-2.51.90.html&quot;&gt;WPE WebKit 2.51.90&lt;/a&gt; are
now available. Testing and &lt;a rel=&quot;external&quot; href=&quot;https://bugs.webkit.org&quot;&gt;issue reports in Bugzilla&lt;/a&gt;
are welcome to help with stabilization before the first stable release, which
is planned for mid-March.&lt;/p&gt;
  &lt;/div&gt;
&lt;div class=&quot;wip-end&quot;&gt;
&lt;p&gt;That&#8217;s all for this week!&lt;/p&gt;
&lt;/div&gt;        </description>
	<pubDate>Mon, 26 Jan 2026 21:00:55 +0000</pubDate>
	<dc:creator>Igalia WebKit Team</dc:creator>
</item>
<item>
	<title>Enrique Oca&#241;a: Igalia Multimedia contributions in 2025</title>
	<guid>https://eocanha.org/blog/?p=701</guid>
	<link>https://eocanha.org/blog/2026/01/26/igalia-multimedia-contributions-in-2025/</link>
	<description>
&lt;p&gt;Now that 2025 is over, it&amp;#8217;s time to look back and feel proud of the path we&amp;#8217;ve walked. Last year has been really exciting in terms of contributions to GStreamer and WebKit for the Igalia Multimedia team.&lt;/p&gt;



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



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



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



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



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



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



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



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



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



&lt;p&gt;We&amp;#8217;re happy about what we&amp;#8217;ve achieved along the year and look forward to maintaining this success and bringing even more exciting features and contributions in 2026.&lt;/p&gt;        </description>
	<pubDate>Mon, 26 Jan 2026 09:34:37 +0000</pubDate>
	<dc:creator>eocanha</dc:creator>
</item>

</channel>
</rss>
