BlinkGTK 1.2.2-build6 Release Notes

Released: 2026-09-19 / Chromium: 153.0.8010.36 / Language: 日本語 | English

The rendering engine is updated to Chromium 153.


What build6 adds

Each view can have its own profile and cache

GtkWidget *a = blink_web_view_new_with_profile("tab1");
GtkWidget *b = blink_web_view_new_with_profile("tab2");

Until now every WebView in a process shared one profile and cache. Opening the same
URL in several views served all but the first from that cache, so only one load
actually happened
. That made it impossible to measure what an additional view costs.

Permission requests can be told apart

The permission-request signal now names 40 kinds instead of 13. The 27 kinds
that used to arrive as "unknown" have names, so an application can decide based on
what is being asked for.

That includes what a reading application actually uses — screen-wake-lock (keep the
screen on while reading), local-fonts, persistent-storage, automatic-fullscreen
and pointer-lock.

What build6 fixes


New in build5

The rendering path can be chosen from the API

Call blink_gtk_set_gpu_mode() before blink_gtk_init() and the engine
starts on that path.

blink_gtk_set_gpu_mode(BLINK_GPU_MODE_EGL);   /* before init */
blink_gtk_init(&argc, &argv);

After initialisation, blink_web_view_get_gpu_mode() reports the path actually in
use
, and the startup log names it ("描画経路="), so you can confirm that
the request took effect.

About the previous form

Asking for EGL through blink_web_view_new_with_gpu_mode() did not change the
path
. An external user's report brought this to light.

The rendering path is settled during engine initialisation, together with the
startup flags handed to the GPU process. By the time a WebView is created it can
no longer be changed, so the environment variable this API sets has no effect.
The startup log named EGL in both cases, so there was no way to tell from
outside whether the request had taken effect
.

Delivery counts measured on the same compositor and the same page:

Form EGL deliveries via CPU
BLINKGTK_GPU_MODE=egl alone 5 0
new_with_gpu_mode(EGL) + the variable 5 0
new_with_gpu_mode(EGL) alone 0 5

Without also setting the environment variable, applications asking for EGL were
running on the CPU pixel path, which has different performance characteristics
from the zero-copy path.

blink_web_view_new_with_gpu_mode() still works when called before
initialisation. Asking for a different path after initialisation now emits a
warning
— the engine does not silently draw on another path.

Fixed in build4

The screen no longer stays blank on virtual machines

On systems using a Virtio GPU (virtual machines and the like), the GPU path
(BLINKGTK_GPU_MODE=egl) stayed blank from start to finish. Reported by an
external user.

To decide whether a frame is empty, the engine reads the drawn image from the CPU
side. On this kind of GPU the drawing happens outside the machine, so that read
sees nothing. Frames that did have content were judged empty and withheld.

Pages without animation were the most affected: only a handful of frames are drawn
at startup, and if all of them are withheld the window stays blank for as long as
it is open
. Animated pages appeared partway through.

A frame that reads as all zeros is no longer treated as "empty" but as "we cannot
tell from here"
, and display is withheld only when the frame is genuinely white.

We built an environment with the same GPU device id, reproduced the problem, and
confirmed the content appears after the fix.
On real GPUs neither the judgement
nor the display changes.

Assistive technology started after the application now works

Until now the accessibility tree appeared only if a screen reader was already
running when the application started
. By the time a user turned on a screen
reader it was too late, and the application had to be restarted.

The engine now notices assistive technology appearing later and exposes the tree
from that point. The explicit switch (BLINKGTK_A11Y=1) still works as before.

Fixed in build3

Closing the window no longer crashes

Closing the window before a page finished loading could crash. Opening a
book and closing it right away — an ordinary action — triggered it. Closing
after the page had rendered did not, which made it easy to miss.

The cause was ours. While the page container is being torn down, a
"navigation finished" notification is delivered, and our handler was still
looking at something we had already released. We now detach the handler
before the teardown.

The workaround (waiting for the load to finish before closing) is no longer
needed.

Reported by an external user. Verified across nine timings, from 50 ms to
3 seconds, all exiting cleanly.

A second failure with the same trigger (an abnormal-termination notice instead
of a crash) also stopped reproducing with the same fix.

Diagnostic records now state the action actually taken

When drawing through EGL we check whether a buffer is empty. For frames past
the eighth, that record said "not displaying" while the frame was in fact
displayed
.

Anyone using the record to diagnose a problem would be led further astray
the more carefully they read it
. That happened for about a month.

The measurement and the decision taken from it are now written as separate
terms.

New in build3

You can now ask the compositor whether a frame reached the screen

Until now our records ended at "the buffer was submitted". Whether it
actually reached the screen was not recorded.

This build uses the Wayland presentation-time protocol to ask the compositor.
Every submission gets exactly one outcome: presented (with a timestamp) or
discarded.

BJGX commit  t=391 buf=36 submit=2 op=attach+viewport w=861 h=553 ...
BJGX discard t=399 buf=36 submit=2

"The content was empty" and "the content was there but never displayed" are
different events.
The previous records could not tell them apart, which led
to misdiagnosis.

Nothing is printed by default. Set BLINKGTK_GX_LOG=1 to enable it. With
it unset, neither rendering nor the display decision changes in any way.

The format was agreed with an external user beforehand: one event per line,
key=value only, = as the sole separator. Lines are joined by the buffer id
and the submission counter.

Porting to a third platform got easier

Alongside the Windows and MIU Darwin ports, the view implementations now have
platform-neutral names, removing per-platform branches from the shared code.
No user-visible change.


What build2 corrects

The release notes shipped with build1 were wrong. They said our previous
workaround had been removed; it had not, and it is still present in this
release. The wording now matches the artifact. The program is otherwise identical to
build1
and typeset output does not change; only the version string it reports
becomes 1.2.2-build2.


What build1 makes possible

Vertical lines now fill to the end

In vertical writing, a line broke half-way when a closing bracket fell at the
line end
. A line with room for 35 characters held only 17, and because
text-align: justify then spread the remainder, the inter-character advance
doubled (16px to 33.5px)
. To a reader that line simply looks stretched.

This release resolves it. Under the same conditions all 35 characters fit on
one line.

It does not occur in horizontal writing. The problem is specific to vertical
writing. Within vertical writing, however, it did not depend on the
configuration: it appeared with every font we tried (serif, sans-serif,
Noto Serif CJK JP, Noto Sans CJK JP), with ruby, and with line-height: normal.
Of 13 configurations, 8 exhibited it; all 8 are resolved in this release.

The characters spread out only when text-align: justify is in effect. Without
it the spacing is unchanged and the line simply ends early. Either way the line
stops half-way.

We reported this upstream (crbug 542686223) and Chromium fixed it. The fix is in
Chromium 153.

In the previous release (1.2.1 / Chromium 152) we carried our own workaround,
which improved the count from 17 characters to 34. One character still moved
to the next line, so it was not complete. That workaround is still present in this
release; with the upstream fix in effect it did not change the result within the
range we measured.

What this item measures, and what it does not

We measured how many characters fit on one line. A single vertical paragraph
(35 characters) was laid out at heights from 544px to 564px in 1px steps, counting
the characters on the first line, across four fonts, with text-align: justify,
under software rendering.

We did not measure column filling. How much room is left at the end of a column
in multi-column layout (whether another line would still fit) is a different
quantity, and we cannot say it improved in this release. Columns not filling to
capacity is tracked separately.

The version can be queried at run time

The bundled demo answers --version. When reporting a problem, this single
line identifies the build.

$ blinkgtk_browser --version
BlinkGTK 1.2.2-build6 (Chromium 153.0.8010.36)

--help prints the usage and how to specify the URL to open.

Also in this release

Chromium 153 enables EventTimingMatchingHTML (which elements event timing
attributes to) by default, among others. For BlinkGTK users the change that
matters directly is the vertical-writing fix above.


What does not change


What we verified