BlinkGTK 1.2.2-build6 リリースノート

リリース日: 2026-09-19 / Chromium: 153.0.8010.36 / 言語: 日本語 | English

レンダリングエンジンを Chromium 153 に更新しました。


build6 でできるようになったこと

view ごとに profile と cache を分けられます

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

これまでは 1 プロセスの全 WebView が profile と cache を共有していました。同じ URL を
複数の view で開くと、2 つ目以降はキャッシュに当たるため、実際の読み込みは 1 回しか
起きません
。view を増やしたときのコストを測る用途では、そのままでは測れませんでした。

許可の種別を見分けられます

permission-request シグナルの種別名が 13 種から 40 種になりました。これまで
"unknown" で届いていた 27 種に名前が付き、アプリが何の許可かを見て判断できます。

読書アプリが実際に使うものが含まれます — screen-wake-lock (読書中に画面を消させない)
/ local-fonts / persistent-storage / automatic-fullscreen / pointer-lock

build6 で直したこと


build5 でできるようになったこと

描画経路を API から選べるようになりました

blink_gtk_set_gpu_mode()blink_gtk_init()に呼ぶと、その経路で
起動します。

blink_gtk_set_gpu_mode(BLINK_GPU_MODE_EGL);   /* init より前 */
blink_gtk_init(&argc, &argv);

blink_web_view_get_gpu_mode() は初期化の後、実際に動いている経路を返します。
起動完了のログにも「描画経路=」が出るので、指定が効いたかを確かめられます。

これまでの書き方について

blink_web_view_new_with_gpu_mode() で EGL を指定しても、経路は切り替わって
いませんでした
。外部利用者からのご報告で分かりました。

描画経路はエンジンの初期化中に確定し、GPU プロセスへ渡す起動フラグもそこで
決まります。WebView を作る時点ではもう変えられないため、この API が行う
環境変数の設定は効きません。起動ログはどちらの場合も EGL と表示するので、
指定が効いているかを外から確かめる手段もありませんでした

同じ compositor・同じページで測った配送の件数です。

書き方 EGL の配送 CPU 経由
環境変数 BLINKGTK_GPU_MODE=egl のみ 5 0
new_with_gpu_mode(EGL) + 環境変数 5 0
new_with_gpu_mode(EGL) のみ 0 5

環境変数を併用していない場合、EGL を指定したつもりで CPU ピクセル経路で
動いていました。ゼロコピーの経路とは性能特性が異なります。

blink_web_view_new_with_gpu_mode() は初期化より前に呼ぶ場合はこれまでどおり
使えます。初期化の後に別の経路を指定した場合は警告を出します — 黙って
別の経路で描くことはしません。

build4 でなおしたこと

仮想機械で画面が白いままになる問題を解消しました

Virtio GPU を使う環境 (仮想機械など) で、GPU 描画 (BLINKGTK_GPU_MODE=egl) の
画面が最初から最後まで白いまま
でした。外部利用者からのご報告です。

エンジンは「この画面は空だ」と判定するために、描かれた画像を CPU 側から読んで
います。ところがこの種の GPU では描画が機械の外側で行われるため、読み取り側
には何も見えません。中身はあるのに空と判定し、表示を見送っていました。

動きのないページほど当たりやすい形です。起動直後は数枚しか描かれないため、
その数枚がすべて見送られると、開いたまま白が続きます。動き続けるページは
途中から出ていました。

全部がゼロに見える状態は「空」ではなく「こちらからは確かめられない」として
扱い、表示を止めるのは本当に真っ白なときだけにしました。

同じ device id の GPU を持つ環境を用意して再現し、直したあとに出ることを
確認しています。
実 GPU の環境では、判定も表示も従来と変わりません。

支援技術を後から起動しても読み上げが効くようになりました

これまでは、アプリを起動した時点でスクリーンリーダが動いていないと
アクセシビリティの木が出ませんでした。読み上げを使い始めたときには手遅れで、
アプリを開き直す必要がありました。

起動後に支援技術が現れたことを受け取って、そこから木を出すようにしました。
環境変数での明示 (BLINKGTK_A11Y=1) も従来どおり使えます。

build3 でなおしたこと

閉じたときに落ちることがある問題を解消しました

ページの読み込みが終わる前に窓を閉じると落ちていました。 本を開いた直後に
閉じる、といった普通の操作で当たります。読み終わったあとに閉じる場合は
起きないため、気付きにくい形でした。

原因は当方の作りにあります。ページの入れ物を壊す途中で「読み込みが終わった」
という通知が配られるのですが、その通知の受け口が、既に手放したものを見て
いました。受ける前に受け口を外すようにしました。

利用者側の回避 (閉じる前に読み込みの完了を待つ) は、もう要りません

外部利用者からのご報告です。待ち時間を 50 ミリ秒から 3 秒まで 9 通りに
変えて、すべて正常に終わることを確認しています。

同じ引き金で別の落ち方 (異常終了の通知が出る形) もありましたが、こちらも
同じ修正で起きなくなりました。

診断の記録が、行った操作を正しく言うようになりました

EGL で描画するとき、当方は buffer の中身が空かどうかを検査しています。
その記録が、9 枚目以降のフレームについて「表示しない」と書きながら、
実際には表示していました。

利用者がこの記録を根拠に不具合を切り分けようとすると、正しく読むほど
誤った結論に導かれます
。実際に 1 か月ほど、そうなっていました。

測った結果と、それを受けて何をしたかを、別の語で書くようにしました。

build3 でできるようになったこと

画面に出たかどうかを、compositor に聞けるようになりました

これまで当方の記録で分かるのは「buffer を送った」ところまでで、
それが実際に画面に出たのかは分かりませんでした。

この版から、Wayland の presentation-time という仕組みを使って、
compositor に問い合わせます。1 回の提出につき「出た (時刻つき)」か
「出なかった」のどちらかが必ず返ります。

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

「中身は空だった」と「中身はあったが画面に出なかった」は別の事象です。
これまでの記録では区別できず、原因の取り違えが起きていました。

既定では 1 行も出ません。 BLINKGTK_GX_LOG=1 を指定したときだけ出ます。
指定しない通常の実行では、描画も表示の判定も一切変わりません。

書式は外部利用者と事前に取り決めたもので、1 行 1 事象・key=value のみ・
区切りは = のみです。buffer の識別子と提出の連番で、行どうしを結び付けられます。

三つ目の環境への移植がしやすくなりました

Windows 版 / MIU Darwin 版の作業に合わせて、画面まわりの実装に
環境非依存の名前を与えました。共通部分のコードから環境ごとの分岐が消えます。
利用者から見える変化はありません。


build2 でなおしたこと

同梱していたリリースノートに誤りがありました。build1 の記述で「前版の回避を
取り除いた」としていましたが、取り除いていません。この版でも入ったままです。
記述を実物に合わせました。プログラムの中身は build1 と同じで、組版の結果は
変わりません (版数を名乗る文字列だけが 1.2.2-build2 になります)。


build1 でできるようになったこと

縦組みの行が、最後まで埋まるようになりました

縦書きで閉じ括弧が行末に来ると、行が途中で切れる現象がありました。
35 文字入る行に 17 文字しか入らず、しかも text-align: justify が残りを
引き伸ばすため、字間が倍 (16px → 33.5px) に開きます。読み手には、
そこだけ間延びした行として見えます。

この版で解消します。同じ条件で 35 文字すべてが 1 行に収まります。

横組みでは起きません。 縦組みに固有の現象です。ただし縦組みの中では
条件を選ばず、書体を変えても (serif / sans-serif / Noto Serif CJK JP /
Noto Sans CJK JP)、ルビを併用しても、line-height: normal でも同じように
起きていました。13 通りの設定のうち 8 通りで発生し、この版ではすべて
解消しています。

字間が開くのは text-align: justify を指定している場合です。指定が無ければ
字間はそのままで、行が途中で終わります。どちらも行が半分で切れる点は同じです。

この現象は当方から上流へ報告し (crbug 542686223)、Chromium 側で修正されました。
修正は Chromium 153 に入っています。

前版 (1.2.1 / Chromium 152) では、当方が独自の回避を入れて
17 文字 → 34 文字まで改善していました。ただし 1 文字は次の行へ落ちたままで、
完全ではありませんでした。この版にもその回避は入ったままです。上流の修正が
効いている状態では、当方の測定範囲でこの回避は結果を変えていません。

この項目で測った量と、測っていないこと

測ったのは 1 行に入る文字数です。縦書き 1 段落 (35 文字) を、高さ 544〜564px の
範囲で 1px 刻みに変えながら、1 行目に何文字入るかを数えました。書体は 4 種、
text-align: justify あり、ソフトウェア描画です。

列の充填は測っていません。 段組みで列末にどれだけ余地が残るか (もう 1 行
入る余りがあるか) は別の量で、この版で改善したとは言えません。段組みの列が
最後まで埋まらない件は別途扱っています。

版を実行時に尋ねられるようになりました

同梱のデモが --version に応じます。不具合を報告する際は、この 1 行を貼れば
版が一意に決まります。

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

--help で使い方と、開く URL の指定方法を表示します。

併せて

Chromium 153 では、ほかに EventTimingMatchingHTML (イベント計時の対象判定)
などが既定で有効になりました。BlinkGTK の利用者が直接触れる範囲での変更は
上記の縦組みが中心です。


この版で変わらないこと


動作を確かめた範囲