Webブラウザ自作
公式ドキュメント
Webブラウザの機能
大きく3つに分けることができる
- Web ページを表示するための機能
- Web ページの動的性のための機能
- Web ブラウジングのための機能
Webページを表示する
HTMLファイルを取得した場合、以下のような処理を行う。
-
HTML・CSS を処理して以下の2つを構成する。
- Document Object Model(DOM)
- CSS Object Model(CSSOM)
これらは、HTML 文字列と CSS 文字列に対して字句解析と構文解析を施すことにより構成される。
-
DOM と CSSOM から**レンダリングツリー(Rendering Tree)**を生成する。
レンダリングツリーとは、ブラウザ内部での中間表現である。
-
レンダリングツリーを**レイアウト(Layout)**する。
レンダリングツリー内の要素の画面内での位置はこのレイアウトにより決定される。
-
レイアウト結果を画面に**ペイント(Paint)**する。
実際に描画する。
Web ページの動的に処理する
Web ブラウザによる JavaScript の実行のために、ブラウザは専用の実行エンジンを使う。例として、Chromium は V8 、Firefox は SpiderMonkey という JavaScript 実行エンジンを利用している。
JavaScript は Web ページ の情報と連動して実行される必要があり、JavaScript から DOM にアクセスできるなどの形で、Web ページには動的性がもたらされる。
このJavaScript エンジンと Web ブラウザの連携のために、Web ブラウザは DOM API や Fetch API といった JavaScript エンジン に対していくつかのインターフェイスを提供している。
また、このようなインターフェイスの定義は Web IDL と呼ばれる言語で記述される。JavaScript と Web ブラウザを繋げるコードは **バインディング(Binding)**などと呼ばれ、その一部は、Web IDL をもとに生成されている。
HTMLのパース処理
- バイト列をトークナイザ(tokernizer)の入力に変換する ← 符号化されているバイト列をHTML文字列にデコードする
- Tokenization stage(字句解析のイメージ): 1の出力をトークナイザでトークン列に変換する
- Tree construction stage(構文解析のイメージ): 2の出力から DOM ツリーを構築する
Servoでは、html5ever クレートを開発している
HTMLパース処理の難しさ
多少マークアップが雑でも Web ページの利用に支障が出ないように、HTML が非常にゆるい文法を採用している。
たとえ、タグが省略されていたとしても、再入処理を行うことで、HTMLが正しく解釈されるようにしなければならない。