CEF / WebKitGTK / BlinkGTK — どれを選ぶか

作成者: BlinkGTK Project
バージョン: 1.2.0-build2

GTK4 のアプリに Web エンジンを組み込むとき、選択肢はおおむね 3 つです。
この文書は、その 3 つが構造としてどう違うかを整理したものです。

はじめにお断りしておきます。他エンジンの性能数値は載せていません。 公平に
測るには同じ条件で同じ内容を描かせる必要があり、それを継続的に維持できて
いないためです。推定値を並べるより、載せないほうが誠実だと考えました。
BlinkGTK 自身の数値は、測ったものだけを測った条件とともに書いています。

いちばん大きな違い

CEF WebKitGTK BlinkGTK
エンジン Blink (Chromium) WebKit Blink (Chromium)
JavaScript V8 JavaScriptCore V8
GTK との関係 独自のウィンドウ管理。GTK とは別世界 GTK ネイティブのウィジェット GTK4 ネイティブのウィジェット
ライセンス BSD-3-Clause LGPL-2.1 / BSD-2-Clause BSD-3-Clause
対応 OS Linux / Windows / macOS Linux ほか Linux (Wayland)

読み方はこうです。

BlinkGTK は「Chromium の描画」と「GTK ネイティブの扱いやすさ」を同時に取りに
いった、という位置にあります。逆に言えば、Linux/Wayland に絞ることでそれを
成立させています。複数 OS に配りたいなら CEF、WebKit の描画で構わないなら
WebKitGTK のほうが素直です。

組み込み方の違い

同じ「ウィンドウに Web を出す」でも、書き方の重さが違います。

BlinkGTK — GTK ウィジェットなので、窓に入れるだけです。

GtkWidget *view = blink_web_view_new();
gtk_window_set_child(GTK_WINDOW(window), view);
blink_web_view_load_uri(BLINK_WEB_VIEW(view), "https://example.com/");

WebKitGTK — ほぼ同じ形です。関数名と型が違うだけです。

GtkWidget *view = webkit_web_view_new();
gtk_window_set_child(GTK_WINDOW(window), view);
webkit_web_view_load_uri(WEBKIT_WEB_VIEW(view), "https://example.com/");

CEF — アプリ側にハンドラのクラス群を用意し、CEF のメッセージループに
制御を渡す形になります。C++ で数十行から始まり、GTK のウィジェット階層とは
別系統でウィンドウを扱います。

移行を検討されている場合、WebKitGTK からの移行はほぼ機械的です。
対応表は WebKitGTK からの移行
にあります。

Wayland と GObject Introspection

CEF WebKitGTK BlinkGTK
Wayland 対応 (X11 も) 対応 (X11 も) Wayland 専用
GObject Introspection なし あり あり
Python / Rust から 別途バインディングが要る GI 経由で直接 GI 経由で直接

BlinkGTK が X11 を切っているのは割り切りです。現在の主要デスクトップは
既定で Wayland なので実害は小さい一方、経路を 1 本に絞れる利点が大きいと
判断しました。X11 環境が要件なら BlinkGTK は選べません。

GObject Introspection に対応しているので、Python からはこう書けます。

import gi
gi.require_version('BlinkGTK', '0.1')
from gi.repository import BlinkGTK

view = BlinkGTK.WebView.new()
view.load_uri('https://example.com/')

配布物の大きさ

Chromium を抱える以上、小さくはありません。BlinkGTK 1.2.0-build2 の
実測値です。

実測
tarball (tar.gz) 約 220 MB
展開後 約 749 MB
共有ライブラリ 537 本 / 合計 約 710 MB
libblinkgtk-0.1.so 単体 約 10 MB

組み込み機器を検討されている場合は、この数字を先にご確認ください。
容量が厳しいなら、WebKit 系のほうが現実的です。Chromium ベースである以上、
CEF も同じ桁になります。

メモリも同様で、Chromium がプロセスを分けて動くため WebView 1 つあたり
数百 MB
を見込む必要があります。

配布形態は RPM (Fedora) / DEB (Debian・Ubuntu) / tarball を用意しています。
tarball は展開したその場で動きます。

API でできること

主要な機能はおおむね揃っています。BlinkGTK 側の詳細は各リファレンスへ。

できること BlinkGTK での入口
ページを開く・戻る・進む ナビゲーション API
JavaScript の実行とメッセージ交換 アプリ連携 API
独自 URL スキームでアプリ内配信 同上
Cookie の読み書き C API リファレンス
DevTools を繋ぐ DevTools API
PDF 出力・スクリーンショット C API リファレンス
コピー・保存・印刷の禁止 設定 API

デバッグ手段はエンジンの系統で分かれます。BlinkGTK と CEF は Chrome
DevTools
がそのまま使えます。WebKitGTK は Web Inspector です。

日本語組版

ここは BlinkGTK が意識的に力を入れている領域です。

縦書き・ルビ・圏点・縦中横・禁則処理に対応し、JLReq (日本語組版処理の要件)
に沿った組版を目指しています。見つけた問題は Chromium 本体にも修正を
提案しており、その成果は Blink を使う他のエンジンにも及びます。

電子書籍リーダーのように日本語組版の質が製品価値に直結する用途では、
ここが選定理由になり得ます。

選び方のまとめ

こういう場合 向いているもの
Windows / macOS にも配る CEF
容量・メモリを切り詰めたい WebKitGTK
X11 環境が要件 CEF / WebKitGTK
Chrome と同じ描画がほしい CEF / BlinkGTK
GTK ウィジェットとして自然に扱いたい WebKitGTK / BlinkGTK
Chrome DevTools でデバッグしたい CEF / BlinkGTK
日本語縦組みの質が要件 BlinkGTK
WebKitGTK から移りたい BlinkGTK (移行はほぼ機械的)

「どれが優れているか」ではなく、何を諦められるかで決まります。
BlinkGTK は容量と対応 OS を諦めるかわりに、Chromium の描画と GTK の
扱いやすさを取りました。

参考

変更履歴

変更
1.2.0-build2 全面的に書き直し。旧版は CEF 127 / WebKitGTK 2.44 / BlinkGTK v1.0.0-rc2 (Chromium 146) を前提としており、4 か月以上そのままだった。配布サイズも「約 65-80MB」と実際 (tarball 220MB / 展開後 749MB) から大きく外れていた。他エンジンの性能推定値は、公平に測り続けられないため削除