Chromium 147 → 152 — BlinkGTK に何が増えたか

バージョン: 1.2.2-build6 / 言語: 日本語 | English

BlinkGTK は Chromium のレンダリングエンジン Blink をそのまま載せています。つまり
Chromium が新しい版で獲得した Web の能力は、BlinkGTK を新しい版に上げるとそのまま
手に入ります
。この文書は、BlinkGTK がベースにしてきた Chromium 147・148・149・150・151・152
の間で何が変わったのかを、実際にできるようになったことの側から辿ったものです。

仕様書の抜粋ではありません。エンジンのソースツリーそのものを版ごとに突き合わせて
差分を取り、そこから読者に関係するものを選んでいます(取得方法は末尾に書きます)。


この文書の読み方 — 「入った」と「使える」は違う

Web の機能は、ある日いきなり全ユーザーに届くわけではありません。Blink では機能ごとに
ランタイムフラグという札が付いていて、その状態によって既定で動くかどうかが決まります。
本文ではこの 3 つを区別します。ここを混ぜると「ドキュメントには書いてあるのに動かない」
という事故になるので、最初に約束しておきます。

表記 フラグの状態 意味
既定で有効 stable 何もしなくても効きます。BlinkGTK でもそのまま使えます
試験段階 experimental 既定では無効。起動フラグで明示的に有効化すれば動きます
開発中 test テスト実行時のみ。プロパティが CSS として解釈されても、描画には反映されません

3 番目が曲者です。たとえば hanging-punctuation(行末の句読点をぶら下げる、日本語組版で
長く待たれてきたもの)は、149 で CSS プロパティとしての受け皿が入りました
getComputedStyle() で値も返ります。しかし実装のフラグは 151 の時点でも test のままで、
実際の行組版には効きません。「プロパティが存在する」ことと「組版が変わる」ことは
別の出来事です。

実際に測ると、この食い違いは 機能検出のコードを裏切る形で出ます
(BlinkGTK v1.2.0 / Chromium 151 実測):

フラグなし                                        → CSS.supports(...) = false
--enable-blink-features=CSSHangingPunctuation で  → CSS.supports(...) = true
                                                     getComputedStyle = "allow-end"

CSS.supports() が true を返しますが、行組版は 1px も変わりません。
版面をちょうど本文 8 字幅にして「本文 8 字 + 句点」を流すと、ぶら下げが効けば
1 行に収まるはずのところ、none でも allow-end でも 2 行のままでした。

つまり CSS.supports('hanging-punctuation', ...) を機能検出に使うと外します。
現時点では「使えない」前提で版面を組んでください。


全体像

7 つの版で、エンジンが持つ機能フラグは 1,103 → 1,220 になりました。152 で一度 1,240 まで増え、153 で定着した切替フラグの整理により減っています。

Chromium 機能フラグ総数 前版から既定で有効になったもの 新規追加 削除 CSS プロパティ BlinkGTK 側
147 1,103 800 v1.0.6 〜 v1.0.10-build16
148 1,116 34 47 34 800 v1.0.11-dev
149 1,140 39 52 28 803 (追従のみ)
150 1,172 48 51 19 820 v1.1.0-build1 〜 build6
151 1,214 44 64 22 822 v1.2.0-build1 〜 build9
152 1,240 41 56 29 820 v1.2.1-build1 〜 build3
153 1,220 28 39 59 824 v1.2.2-build1 〜

1 版あたり 28〜48 個の機能が既定で有効になり、20〜59 個が消えています。153 の削除 59 件は他の版より多く、そのうち 48 件は「すでに既定で有効だった切替フラグ」でした。
削除があるという
点は見落とされがちですが、上げるときに壊れる可能性があるのはむしろこちら側です。
各章の最後に「移行の注意」を置いたのはそのためです。


147 → 148 — 下線とコンテナクエリが整った版

一言で: 派手な新機能より、CSS の細部の辻褄合わせが多い版です。

文字まわり

下線が文字を避けるようになりました(text-decoration-skip-ink の適用範囲拡大)。
日本語だと p のように基線より下に出る部分に下線が重なると、可読性が目に見えて
落ちます。147 では試験段階でしたが、148 から既定で有効になりました。

可変フォントの avar2 対応も入りました。1 つのフォントファイルで太さや字幅を連続的に
変えられる仕組みの、新しい版のテーブルに対応したものです。

CSS

そのほか

移行の注意

<command> 要素の残骸が削除されました。ほとんどのアプリには影響しませんが、
古いコードをそのまま持ち込んでいる場合は確認してください。


148 → 149 — 段組みの罫線と、ぶら下げの「受け皿」

一言で: 多段レイアウトの表現力が増え、日本語組版の器がひとつ用意された版です。

日本語組版に効いたもの

hanging-punctuation が CSS プロパティとして入りました。行頭・行末に句読点や
括弧が来たとき、版面の外へぶら下げる指定です(none / first / last / allow-end)。
JIS X 4051 と JLReq が求めるぶら下げ組版に直結するプロパティで、値のパースも
getComputedStyle() も動きます。

ただし前述のとおり、実装フラグは 151 の時点でも test のままです
書けるようになったが、まだ効きません。ここは Chromium の今後を待つ部分であり、
BlinkGTK としても継続して追っている項目です。

ルビが入った行での編集操作が直りました(行単位のカーソル移動)。ルビ付きの本文で
上下キーを押したときの挙動が、ルビの有無で崩れなくなります。編集系アプリには効きます。

text-decoration-skip-spaces も追加されました。下線を引くとき、単語間のスペースを
飛ばすかどうかを制御できます。

段組みの罫線

段と段のあいだに罫線を引く仕組み(column-rule / row-rule)が大きく拡張されました。
罫線の端をどこで止めるか、交差部でどう振る舞うかを、*-inset-cap *-inset-junction
系のプロパティで指定できます。多段組みの版面を作るときに、罫線が段の端まで伸び切って
しまう問題を CSS だけで解けます。

なお 148 の時点では column-rule-edge-inset column-rule-interior-inset という名前
でしたが、149 で -inset-cap -inset-junction改名されました。仕様側の議論が
落ち着いた結果です。

そのほか

移行の注意

段罫線プロパティの改名(上記)は、149 より前の名前で書いたスタイルが無効になります
使っている場合は書き換えが必要です。


149 → 150 — 版面を詰める道具が増えた版

一言で: この 5 版でいちばん実りが多く、BlinkGTK v1.1.0 の土台になった版です。

日本語組版に効いたもの

text-box-trim が入れ子リストでも効くようになりました。行の上下に生じるフォント
由来のアキ(ハーフレディング)を削って、指定した文字の高さで版面を作るための仕組みです。
日本語では、見出しと本文のアキを設計値どおりに詰めるときにこれが要ります。

全角スペースの扱いが直りました。テキストの位置対応表(オフセットマッピング)を
再利用する際に全角スペースで崩れる不具合が修正され、選択範囲や折り返し位置が
全角スペース混じりの文章でずれなくなりました。

書記素クラスタの境界チェックが入りました。絵文字の合字や結合文字を、
カーソル移動や削除で分断しにくくなります。

::first-linetext-transform が効くようになり、行分割の中断処理も改善されました。

CSS

そのほか

移行の注意


150 → 151 — ルビと圏点が仕様として整った版

一言で: 日本語組版にとって、この 5 版でもっとも直接的な収穫がある版です。

日本語組版に効いたもの

ルビのはみ出し(ruby-overhang)が既定で有効になりました。147 からずっと
試験段階だったものが、151 でようやく既定になります。ルビ文字が親文字より長いとき、
隣の文字の上へどこまではみ出してよいかの制御です。はみ出しを許さない none 値も
同時に入りました。JLReq がルビの掛け方について定めている部分に、エンジン側が
正面から対応した形です。

圏点(傍点)がルビと同じ経路で処理されるようになりました。これは実装の内側の
話に見えますが、組版結果が変わります。従来は圏点を付けると行の高さそのものが
広がっていましたが、151 では行の高さは line-height のまま保たれ、
必要なぶんは外側のコンテナが伸びます。

この変更の効き方を、151 のビルドで実測しました。縦組み、font-size: 16px
text-emphasis-style: sesame で、段落の実 pitch を測った値です。

行間の余裕 圏点なし 圏点あり
あり (line-height: 2.6 = 41.59px) 150 41.59 44.09 +2.50
151 41.59 41.59 0
なし (line-height: 1.75 = 28px) 150 28.00 37.00 +9.00
151 28.00 30.00 +2.00

行間に余裕があれば、圏点で行送りが太らなくなりました。 余裕がない場合も、
150 の +9.00 から +2.00 へ縮んでいます。縦組みで圏点を多用する日本語文書では、
版面の行数が変わり、総ページ数が減ることがあります。既存レイアウトの確認を
おすすめするのはそのためです (良い方向の変化ですが、変化は変化です)。

text-autospace がルビ注記を無視するようになりました。和欧混植の自動アキ調整が、
ルビのテキストに引きずられて本文の字間を乱すことがなくなります。

開きタグ直前のスペースの後で改行できるようになりました
日本語 <span>語</span> のようなマークアップで、意図しない位置に改行が寄る問題が減ります。

試験段階では AnnotationSpaceOnStart(注記の開始側のアキ)が入りました。既定では
無効ですが、ルビや圏点の前後アキの制御に関わる項目として、次版以降の動きを注視する
価値があります。

編集・選択

そのほか

移行の注意 — ここは壊れる可能性があります

変更 影響
圏点がルビ経路に 圏点付き文書の行の高さと総行数が変わる可能性
document.implementation.createHTMLDocument()readyState 生成直後の状態が仕様準拠に変わりました
ポップオーバー hint の入れ子表示 入れ子で表示しようとすると例外を投げるようになりました
getComputedStyle のフラットツリー外要素 既定で無効化されました
Sub Apps API 削除されました

151 → 152 — ルビの置き方が作り直された版

一言で: 151 で「次版以降の動きを注視する価値がある」と書いた注記のアキが、
152 で既定になりました。あわせてルビの配置計算そのものが作り直されています。

日本語組版に効いたもの

注記の開始側のアキ(AnnotationSpaceOnStart)が既定で有効になりました。
151 では試験段階でした。ブロックの開始側に境界線が無いとき、ルビの注記が
その余白へはみ出せるようになります。行の高さを膨らませずにルビを置くための
仕組みです。

ただし適用されない場面があります。実装は列が均等割りのとき
(balanced columns)を除外条件にしています。縦書きの段組みでこの経路を
当てにしないでください。
上流が付けたテストも横書き(writing-mode
指定なし)で、ページや列の断片化を使っていません。

ルビの配置計算が木構造になりました(TreeRubyPlacement)。
注記の行を平坦に並べて位置を決めるのではなく、親子関係のある木として組み立て、
基準となる行からの相対位置で配置します。上下両方に注記が付く場合や、
入れ子になったルビ(熟語ルビ・二重ルビ)の位置決めがこの経路を通ります。

ルビの親文字の中のタブ位置が仕様どおりになりました(TabSizeInRubyBase)。
タブ位置は「最も近いブロックコンテナの content edge から数えた倍数」と
CSS Text 3 が定めています。152 でその定義に合わせました。

測っていないこと: 上の 3 つはフラグとコードが実在することを確かめたもので、
組版結果がどう変わるかは測っていません。150 → 151 の圏点のような実測は、
152 についてはまだありません。実際の版面で確かめてから使ってください。

CSS

新しく増えたプロパティは 2 つだけで、いずれも日本語組版には関係しません
(row-rule-visibility-items / window-drag)。

試験段階から既定へ移ったものがあります。

機能 151 152
CSSAlphaColorFunction(色の alpha 指定) 試験段階 既定
CSSPseudoElementBackdrop(::backdrop) 試験段階 既定
CSSPseudoElementViewTransitions(ビュー遷移の擬似要素) 開発中 既定
CompositeClipPathAnimation(clip-path のアニメーション合成) 試験段階 既定

そのほか既定になったもの

151 で試験段階だったものを含め、43 種が既定になりました。主なものです。

領域 機能
Shadow DOM ShadowRootReferenceTarget / ShadowRootSlotAssignment
ストレージアクセス RequestStorageAccessFor
Range API OpaqueRange / LegacyAbstractRange / RangeBoundaryFastPath
画面共有の音声選択 GetDisplayMediaAudioSelection
サニタイザ StreamingSanitizer

移行の注意 — 消えたフラグ

152 でフラグが 29 種消えました。ただし、そのうち 25 種は 151 の時点で既に既定 (stable) でした
これは挙動が恒久化して、切り替える口が無くなったことを意味します。

逃げ道として設定していた場合は効かなくなります。 代表的なもの:

消えたフラグ 151 での状態
MulticolColumnWrapping(段組みの折り返し) 既定
OffMainThreadCSSPaint 既定
PageRevealEvent 既定
PaintTimingMixin 既定
SystemFallbackEmojiVSSupport 既定

残る 4 種は既定ではなかったものです。

ConnectionAllowlistConnectionAllowlistEmbeddedEnforcement
置き換わりました。

152 → 153 — 縦組みの行末に、上流の手が入った版

この版の主役は、縦書きで行が途中までしか埋まらない現象の解消です。
当方から上流へ報告し (crbug 542686223)、
Chromium 側で修正されました。

差分の規模は、追加 39 件 (既定で有効 18 / 試験段階 14 / 開発中 3 / その他 4)、
削除 59 件、状態が変わったもの 19 件 (うち既定で有効へ昇格 10 件)。
CSS プロパティは追加 5 件・削除 1 件です。

縦組みで、閉じ括弧が行末に来ても行が埋まります (既定で有効)

縦書きの段落で、閉じ括弧が行末に来ると行が半分ほどで折り返す現象がありました。
35 文字入る行に 17 文字しか入らず、text-align: justify を指定していると
残りを引き伸ばすため、字間が倍 (16px → 33.5px) に開きます。読み手には、
そこだけ間延びした行として見えます。

153 で LineBreakerHanKerningEnd という機能が新設され、最初から既定で有効です。
152 のツリーにはこの名前が 1 件も存在しません。

実測 (縦書き 1 段落 35 文字、高さ 544〜564px を 1px 刻み、ソフトウェア描画):

フラグ 1 行に入る文字数 (552〜559px)
既定 (何も指定しない) 35
明示的に有効化 35 (既定と同じ)
明示的に無効化 17

明示的に無効化すると 17 文字に戻ります。これが、この機能が効いていることの
裏付けです。存在しないフラグ名を渡した対照では 35 のままで、スイッチそのものは
結果に影響しないことも確かめています。

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

ぶら下げは、この版でもまだ使えません

行末の句読点をぶら下げる hanging-punctuation は、149 で CSS プロパティとしての
受け皿が入って以来、149・150・151・152・153 と 5 版続けて実装フラグが test
のままです。CSS.supports() は真を返しますが、行組版は変わりません。
機能検出に使うと外します。詳しくは冒頭の「この文書の読み方」を参照してください。

ルビのはみ出し (CSSRubyOverhang) と圏点のルビ経路処理 (TextEmphasisAsRuby) は
151 以降そのまま既定で有効です。この版で変わったところはありません。

文字入力の自動修正が、HTML の指定どおりに働きます (既定で有効)

HTML の autocorrect 属性が、プラットフォームの入力方式 (IME) に反映されるように
なりました。自動修正は既定で有効で、URL・メールアドレス・パスワードの入力欄では
強制的に無効になります (autocorrect=off を持つフォームに属する場合も同様)。
仕様は HTML Standard にあります。

日本語入力そのものの挙動を変えるものではありませんが、氏名や住所のように
自動修正が邪魔になる欄を持つフォームでは、autocorrect=off の指定が効くように
なった、と考えてください。

カメラとマイクの許可を、ページの中に置けます (既定で有効)

<camera><microphone> という HTML 要素が加わりました。カメラ・マイクの
使用許可を求める操作部品を、ブラウザのダイアログではなくページの中に直接
埋め込める
ようになります。

XML の解析が Rust の実装に替わりました (既定で有効)

JavaScript の DOMParser で XML を解析する場合と、XMLHttpRequest
responseXML を使う場合に、Rust で書かれた XML パーサが使われるようになりました。
XSLT 処理が要らないと分かっている経路に限った切り替えです。
EPUB のように XML を多く扱う用途では、解析まわりの堅牢性に関わります。

追加された CSS プロパティ

プロパティ 状態 備考
text-decoration-inset 試験段階 下線などの位置を内側にずらす指定
overscroll-container-type 試験段階 端を超えたスクロールの扱い
max-content-sizing 開発中 プロパティは解釈されますが、描画には反映されません

-internal- で始まる 2 件はブラウザ内部用で、ページからは使えません。
-internal-overscroll-area は削除され、-internal-overscroll-container
置き換わっています。

削除された 59 件について

削除の 59 件は、その大半 (48 件) がすでに既定で有効だった切替フラグです。
挙動が定着したあと、切り替える必要がなくなったものを整理したものと読めます。
機能が失われたわけではありません。

なお、この差分の取り方と、載せる項目の選び方は末尾の「出典と、この差分の取り方」に
書いたとおりです。名前から意味を推測すると誤りが混ざるため、実装を確かめられなかった
ものは本文に載せていません
。既定で有効へ昇格した 10 件のうち本文で触れたのは
3 件で、残りは確かめきれなかったか、ページの表示に関わらないものです。


日本語組版の現在地 — 7 版を通した俯瞰

BlinkGTK の主な用途が日本語縦組みの電子書籍であることを踏まえて、
関係する項目だけを版ごとに並べます。空欄はその版に存在しなかったことを意味します。

項目 147 148 149 150 151 152 153
縦組みの行末で行が埋まる 既定で有効
ルビのはみ出し (ruby-overhang) 試験 試験 試験 試験 既定で有効 既定で有効 既定で有効
圏点をルビ経路で処理 既定で有効 既定で有効 既定で有効
ルビの置き方の再実装 既定で有効 既定で有効
ルビの親文字での tab-size 既定で有効 既定で有効
text-autospace がルビ注記を無視 既定で有効 既定で有効 既定で有効
開きタグ前スペース後の改行 既定で有効 既定で有効 既定で有効
注記の開始側アキ 試験 既定で有効 既定で有効
入れ子リストの text-box-trim 既定で有効 既定で有効 既定で有効 既定で有効
全角スペースの位置対応修正 既定で有効 既定で有効 既定で有効 既定で有効
ルビ行での編集カーソル移動修正 既定で有効 既定で有効 既定で有効 既定で有効 既定で有効
下線が文字を避ける 試験 既定で有効 既定で有効 既定で有効 既定で有効 既定で有効 既定で有効
ぶら下げ (hanging-punctuation) プロパティのみ (開発中) 同左 同左 同左 同左
縦組み多段の分割 (BlinkGTK 独自) 試験 試験 試験 試験

読み取れることは 2 つあります。

ひとつ、ルビと圏点は 151 で一気に前進しました。長く試験段階に置かれていた
ruby-overhang が既定になり、圏点の実装が整理されました。縦組みリーダーを作るなら、
151 ベースの BlinkGTK は明確に価値があります。

ふたつ、ぶら下げ組版はまだ届いていません。プロパティは 149 で用意されましたが、
実装は 151 でも開発中のままです。JLReq の完全準拠にはこの一手が要ります。
BlinkGTK はここを継続課題として追っています。

最後の行の「縦組み多段の分割」は上流 Chromium にはない、BlinkGTK が独自に足している
機能です(縦組みで段組みを使ったときの分割処理)。Chromium から受け取るだけでなく、
足りないところは自分で埋める、という立ち位置を示しています。


出典と、この差分の取り方

推測を含めないために、すべてエンジンのソースツリーから機械的に抽出しています。
同じ手順で誰でも再現できます。

見たもの ファイル
機能フラグと既定の有効/無効 third_party/blink/renderer/platform/runtime_enabled_features.json5
CSS プロパティの一覧 third_party/blink/renderer/core/css/css_properties.json5

さらに、151 については BlinkGTK のビルドで実際にどうなっているかを確認しています。
上流の宣言が stable でも、ビルド構成によって最終的な既定値は変わりうるためです。
下表は、生成されたコード (runtime_enabled_features.cc) から読んだ実際の初期値です。

機能 BlinkGTK 151 ビルドの既定値
ルビのはみ出し (CSSRubyOverhang) 有効
圏点をルビ経路で処理 (TextEmphasisAsRuby) 有効
text-autospace がルビ注記を無視 有効
開きタグ前スペース後の改行 有効
ぶら下げ (CSSHangingPunctuation) 無効
縦組み多段の分割 (BlinkGTK 独自) 無効 (要求時のみ有効)

153 についても同じ確認をしています。LineBreakerHanKerningEnd は上流の宣言が
stable ですが、宣言を読むだけでは実際に効いているか分かりません。そこで
起動時にこのフラグを明示的に無効化して測り直し、1 行に入る文字数が 35 から
17 に戻ることを確かめました。存在しないフラグ名を渡した対照では 35 のままです。
つまりこのフラグが結果を作っていることが、宣言ではなく挙動で裏付けられています。

本文の記述はこの実測と一致しています。ぶら下げが使えないと書いたのは、
上流の宣言だけでなく実際のビルドでも無効だからです。

各版のツリーからこの 2 ファイルを解析して「機能名 → 状態」の対応表を作り、
隣り合う版どうしで差を取っています。本文で挙げた件数(既定で有効になった数、
追加数、削除数)はすべてこの差分の実数です。

機能名から意味を推測すると誤りが混ざるため、内容に確信が持てないものは
本文に載せていません
。件数と、この文書に挙げた項目の数が合わないのはそのためです。


関連する文書