Webkit WebDriver開発ことはじめ

Webkit の WebDriver の wpt を動かすことまできたのでメモ。

環境

  • Ubuntu
    • 24.04.3
  • メモリ
    • 64GB
  • CPU
    • AMD Ryzen 9
    • 物理8コア/16スレッド
  • VSCode
    • 1.105.1

リポジトリのclone

GitHub にあるのでそのままクローンできる。

Build

まず Debug Build を行う。flatpak 関連のスクリプトを一通り実行したら次のビルドコマンドでビルドする。ターゲットはWebkit GTK で。

build-webkit --gtk --debug

自分の環境だとおおよそ2時間かかる。以降は差分ビルドなどで数分でビルドできる。WebCore の DerivedFile のビルド時に lld のエラーで落ちたりしたことが何度かあった。念の為スワップも 64GB まで上げておいたら安定した。

WPTの実行

TestExpectation.jsonでPASSもしくはFAILにしていないと実行しても無視されるので変えておく。

run-webdriver-tests --gtk --debug \
 imported/w3c/webdriver/tests/bidi/script/call_function/arguments.py

テストケース一つ単位でも指定できる

run-webdriver-tests --gtk --debug \
 imported/w3c/webdriver/tests/bidi/script/call_function/arguments.py::test_default_arguments

LSP

開発時にこれがないとやってられないのでセットアップ。公式の VSCode 拡張ではなく clangd を使っている。flatpak 環境なので wrapper-script が必要。下記の記事を参考にした。

https://blogs.igalia.com/aboya/2021/10/02/setting-up-visualstudio-code-to-work-with-webkitgtk-using-clangd/

このスクリプトを指定して clangd を再起動する。

clanged-wrapper.sh
#!/bin/bash
set -eu
# https://stackoverflow.com/a/17841619
function join_by { local d=${1-} f=${2-}; if shift 2; then printf %s "$f" "${@/#/$d}"; fi; }

local_webkit=/home/togami/Documents/GitHub/WebKit
include_path=("$local_webkit"/WebKitBuild/UserFlatpak/runtime/org.webkit.Sdk/x86_64/*/active/files/include)
if [ ! -f "${include_path[0]}/stdio.h" ]; then
  echo "Couldn't find the directory hosting the /usr/include of the flatpak SDK."
  exit 1
fi
include_path="${include_path[0]}"
mappings=(
  "$local_webkit/WebKitBuild/GTK/Debug=/app/webkit/WebKitBuild/Debug"
  "$local_webkit/WebKitBuild/GTK/Release=/app/webkit/WebKitBuild/Release"
  "$local_webkit=/app/webkit"
  "$include_path=/usr/include"
)

exec "$local_webkit"/Tools/Scripts/webkit-flatpak --gtk --debug run -c clangd --path-mappings="$(join_by , "${mappings[@]}")" "$@"

一個困ってることとしてそのままだと LSP が落ちる。どうやら flatpakutils.py のログが LSP の邪魔になっているみたい。直し方がわからないので該当部分のみをコメントアウトしたらあっさり治った。今もworkaroundとしてそのままで開発している。

flatpakutils.py
self.origin = os.environ.get('WEBKIT_SDK_ORIGIN', 'webkit')
# Console.message(f"SDK origin: {self.origin}") <-- このログがLSPの邪魔になっている

ここまでで一ヶ月!!