↫ Home

WebKit Igalia Periodical #80

5 October, 2026 - Categories: wip

Update on what happened in WebKit in the week from September 28 to October 5.

Another week populated with updates! This time we sweep through a new crypto backend, more layer-based SVG engine updates, better filters, and some miscellaneous updates.

Cross-Port 🐱

Add moving steps handling to map, img, label and radio input elements to handle their internal book keeping. This also handles custom element registries.

Initial support to build WPE and WebKitGTK with the OpenSSL crypto backend has landed. This is still in development and not yet intended for use, but progress on bringing it to parity with the libgcrypt backend is ongoing.

Graphics 🖼️

Fixed stacked backdrop filters in the Skia compositor, so an element with a backdrop-filter placed over an earlier element with its own backdrop-filter now shows that earlier element with its filter applied, instead of without it.

Removed redundant save/restore pairs when painting transformed SVG shapes in the Layer-Based SVG Engine (LBSE), so each shape now uses a single pair, just like the legacy SVG engine. When DOM rendering happens in the GPU process, every state change is an IPC message, so this cuts LBSE from about 8.5 to about 6.5 messages per shape and closes the gap to the legacy engine.

Fixed transformed <clipPath> elements that use clipPathUnits="objectBoundingBox" in the Layer-Based SVG Engine (LBSE), whose transform was wrongly applied in bounding box units instead of user space. Rendering and hit testing now apply it in user space, matching the legacy SVG engine.

Fixed hit testing and repainting of non-scaling strokes in the Layer-Based SVG Engine (LBSE), which kept using the old stroke width after the transform of the shape or one of its ancestors changed. A vector-effect: non-scaling-stroke stroke depends on every transform up to the outermost <svg> element, so its cached bounds are now cleared whenever one of those transforms changes.

Fixed the source area of filters and backdrop filters: a filter's offscreen surface only covered the visible part of its layer, so when a layer was partly scrolled out of the viewport, its drop shadow was cut off even where the shadow itself fell inside the viewport. The surface now also covers the area the filter reads from outside the visible part, as in Chromium, and a backdrop-filter blur is mirrored at the border box as the spec requires, which fixes several web-platform-tests.

Fixed viewport clipping of nested <svg> elements with overflow: hidden in the Layer-Based SVG Engine (LBSE), which did not clip descendants that have their own layer, such as a transformed <g>. Containers that clip their overflow now get their own layer, like containers using clip-path or mask already do, so layered descendants are clipped correctly.

Fixed misplaced child layers of SVG elements with a filter in the Layer-Based SVG Engine (LBSE), which were drawn in the wrong position whenever an ancestor layer had a transform applied.

WPE WebKit 📟

Restored the Direct Rendering Manager (DRM) vertical blank monitor for the legacy WPE API, so rendering is once again paced by the display's actual refresh cycle instead of a fixed 60 Hz timer. Two regressions had silently disabled it: a missing display ID forced the timer fallback, and a shadowed variable broke the display controller lookup.

That’s all for this week!