WebKit について (基本的な構成とかAPIとか)
なんかしばらく WebKit について書いてみたいと思います。開発するために必要な基本的なこととかより、まぁなんか個人的に話として面白いと思ったことについて。
とりあえず WebKit 内のコンポーネントの構成とかから。 WebKit ってのはまぁライブラリなわけで、かつ Win/Mac/Linux などで動いてるので、「WebKit を使って書いたら portable なコード一個管理したら OK」的な感じなのかなーと思うんですが、その実 WebKit API は環境ごとに少しずつ違う物体だったりします。
例えば Windows だったら COM を使ったり Mac だったら ObjC だったり gtk とか kde もそれぞれのシグナル配送モデルを使って色々やったりとか。 portable なライブラリっていうと portable に書けない部分は最小限のライブラリを環境ごとに実装して、その上に環境非依存なレイヤーが…みたいなイメージがあったので、始めて知った時はちょっとびっくりしました。
WebKit のソースコードを展開すると、 WebKit というディレクトリがあって、それが今説明した API の部分のコードになっています。例えば WebKit/mac には Mac 用の API があると。
他のメインのソースコードは JavaScriptCore, WebCore のどちらかに入ってると思います。 JavaScriptCore はその名の通り JS のエンジンが入ってるとこなのですが、他の部分から使う共通コードなんかもこの中の JavaScriptCore/wtf に入っています。例えば基本的なデータ構造、スマートポインタ、文字列など。 wtf は Web Template Framework であると主張してますがどう考えても what the fuck にするためのこじつけでしょうね。
WebCore が一番メインの部分で、ダウンロードしてきて DOM ツリー作ってレイアウトして描画して…というのをやる部分です。ネットワークだの描画だのは portable じゃないので、 WebCore/platform というディレクトリにそのへんの環境ごとに必要な処理をまとめています。
WebCore の API 自体は環境非依存なコードで、その API を使って環境依存な WebKit API が実装されます。 WebCore.base.exp なんかに WebKit API から使うために export されているシンボル一覧がありますが、この API が安定してることとかは全く保証されてないし実際たまに変わってるので、これをユーザーが使うのは現実的ではないようです。 DOM の部分だけ使いたいんだけどどうすんのーとかそういう質問は時々あるようなので需要はありそうですが。
ところで、 WebCore の API を変えるというのは、自分が作業してる環境以外の WebKit API 部分のビルドを全て破壊することを意味します。例えば自分がいじった内容で覚えているものでは、プロトタイプが WebCore::externalRepresentation(WebCore::RenderObject*) だった関数を WebCore::externalRepresentation(WebCore::Frame*) に変えるというちょっとしたリファクタリングがあります。これはすごい簡単なリファクタリングなわけですが、それなのに win, mac, gtk, qt と同時に変更する必要があったのでパッチ自体も 12 ファイルをいじってたりして面倒な感じですし、動作検証とかもうざい感じでした。
というわけで、ある程度慣れている人や環境がない人とかめんどがりな人とかは、とりあえずビルドぶっこわしておいて buildbot (常に最新の WebKit をビルドして壊れてるビルドやこけてるテストを早期に発見してくれる物体) のエラーメッセージを見てカンで修正したり、 Qt や Gtk+ は放置してそれぞれに詳しい人が修正するのを待ったりするみたいです。
カンで修正する場合は、1回でうまく直らなくて2回3回と適当なコミットが続いたりすることもあるし、放置もなんか微妙な感じです。 Apple の人は mac/win くらいは面倒を見て後は放置することが多いイメージがありますが、 Qt 系の人は自分が苦労してるからか、ちゃんと全環境面倒見る努力をするイメージがあったりします。
あとは内部構造とかどうでもいい人にとっても、 HTMLTagNames.in, HTMLAttributeNames.in, CSSPropertyNames.in, CSSValueKeywords.in なんかの、定義されてる HTML/CSS シンボル一覧みたいなファイルは割と有用だったりするかもしれません。