Chromium の wpt/domxpath/fn-id のテスト落ちを修正した

Chromium で WPT の external/wpt/domxpath/fn-id.html が失敗している issue を見つけて修正出来た(嬉しい)ので、せっかくなのでその事をまとめる。

issue: https://issues.chromium.org/issues/422038088
対応した CL: https://chromium-review.googlesource.com/c/chromium/src/+/8041295

wpt とは

Web Platform Tests の略。各ブラウザが W3C や WHATWG の Web 標準の仕様に沿って実装されているか検証するためのテストスイート。
以下公式ドキュメントより引用。

The web-platform-tests project is a cross-browser test suite for the Web-platform stack.

詳細は公式ドキュメントを参照:https://web-platform-tests.org/
ちなみに、似たような立ち位置の test262 は、JS エンジンが JavaScript 言語仕様に沿って実装されているか検証するためのテストスイート。

おこなったこと

どんな風に issue に対応したのか箇条書きで書く。

上記を調べてみて、以下の事が分かった

  • 失敗しているこのテストは最近追加されたテストであること
  • id() によって 2つ返ってくる事を期待するテストへの違和感
  • 仕様書の以下の文との不整合
    • If an XML processor reports two elements in a document as having the same unique ID (which is possible only if the document is invalid) then the second element in document order must be treated as not having a unique ID.

  • 他の主要ブラウザも同様のエラーでテストが落ちている
    wpt.fyi

(引用: https://wpt.fyi/results/domxpath/fn-id.html)

よって、Chromium 側ではなく、テストを修正すれば良さそうだと判断し、CL を提出した。親切なレビュワーの方にレビューしていただいて無事 land された。

学び

wpt について

Chromium に wpt 用のディレクトリがあって、wpt と自動で同期する仕組みが興味深かった。リポジトリの運用について、monorepo vs polyrepo みたいな考えをしていたところがあり、そういうやり方もあるのか!と思った。

Chromium の開発をしていて、wpt にも PR を別途作るような手間がなく、Chromium のためにテストを直したら、それが他のブラウザにも反映される。もちろん wpt リポジトリを直接編集してもよく、それも各ブラウザに同期される。つまり wpt リポジトリを SSoT として、各ブラウザはそれと同期する事で、仕様通りに動作している事を保証している。
この 1つのリポジトリを SSoT として、それに依存する他のリポジトリでは、SSoT リポジトリの mirror ディレクトリを用意して、相互に同期する運用は色々使い所がありそう。

Chromium 開発について

既に色々な方が言っているように、ストレージ容量が沢山必要。fetch で 100GB, build すると +100GB で合計 200GB くらいになる。私は内部ストレージだと足りないので、外部 SSD を使っている。
最初試した時、どうしても fetch が最後まで正常に終わらず。SSD のファイルシステムを exFAT -> APFS に変えてトライしたら上手くいった。SSD が無駄にならなくてよかった。

また、最初の fetch と local での build に時間がかなり掛かる。最初の fetch は一晩実行して、朝確認した記憶。以降の pull や rebase は全然大丈夫。実は別の CL も挙げており、そのテストのために、最初は分からず full build していて、増分 build のはずだが、commit がどんどんされているので、結局毎回 5h くらいかかっていたと思う。test のための最小構成の build でも、変更内容次第では、数行程度の変更でも 5h くらい掛かる。もちろんマシンパワーに依存はあると思う。メモリ 16GB だとこんな感じ。

Chromium のドキュメントがすごく整備されていて、困りそうな事は大抵ドキュメントに書いてある。特にレビューのやり取りに関するコミュニケーションルールがあって、個人的にそれがとても有り難かった。

気になる方は、詳しくはドキュメントを:
https://chromium.googlesource.com/chromium/src/+/HEAD/docs/README.md

Design Docs のような興味深いドキュメントも沢山まとめられている。

また、Chromium のドキュメントではないのだけど、元 Google Chrome チームの Addy Osmani氏の Google Chrome at 17 - A history of our browser も Web とブラウザの歴史という感じでとても良い内容だった。philosophy の話が特に好き。

その他

github の activity に web-platform-tests と chromium が入った。おまけだけど、やっぱりこういう形で何かもらえるのは嬉しい。
activity graph

また、github はそのリポジトリ上に commit があっても、アカウントの activity が紐付かない事を知った。activity と紐付けるためには、fork 等で、リポジトリとアカウントに何らかの関係を作る必要がある様子。私は fork したら activity に反映された。