ちいさな Web ブラウザを作ってみよう

はじめに

はじめに

この度は本オンラインブックに興味を持っていただきありがとうございます。

本オンラインブックの概要

一言で言うなら、本オンラインブックは「ちいさな Web ブラウザを作るプロセスを紹介し、実際にそれを追体験する機会を提供するもの」です。

ちいさな Web ブラウザを作る意義

しかし、世の中には既にいくつかの充分にリッチな Web ブラウザ実装が存在しています。 Chrome / Firefox / Safari などがその例です。 これらの Web ブラウザが数多の機能をもっていること、非常に効率良く動作するよう工夫されていることは、きっと読者のあなたにとっても疑いようのない事実でしょう。

そんな時代のなかで、あえてゼロからちいさな Web ブラウザを作成してみると、少なくとも以下のような効果が得られると筆者は考えています:

  1. 既存の Web ブラウザ実装を読む時の手がかり が得られる。
  2. 大量の Web 標準文書に目を通すだけでは得られない洞察 が得られる。

また、これからちいさな Web ブラウザを作ってみる意義というのは、これらの効果が得られることに他なりません。 以降では、もう少しだけこれら 2 つの効果について掘り下げて説明します。

既存の Web ブラウザ実装を読む時の手がかりが得られる

既存の Web ブラウザ実装のソースツリーはあまりに大きいものです1。 そのためもあってか、既存実装のコードリーディングで次のような推論を効かせるための知識ベースを、そのコードリーディングだけを通して獲得するのにはそれ相応の時間がかかるものです:

  • 「こういう機能はきっとこう実装するだろう」
  • 「この辺はきっとこの辺と繋がっているだろう」
  • 「この変数名・このクラス名はこういう意味だな」
  • 「このインターフェイスは一見不自然だけど、おそらくこういう都合があるんだろう」

一方、本オンラインブックで紹介するようなプロセスを追体験していくことで、きっと既存の Web ブラウザ実装のソースツリーを眺める際に、ような推論が効きやすくなるだろうと思います。車輪の再発明に挑戦した人にしか見えないこと、できないこと、というのは案外たくさんあるものです。

大量の Web 標準文書に目を通すだけでは得られない洞察が得られる

ちいさな Web ブラウザを実装する過程では、多くの Web 標準文書に目を通すことになると同時に、それらが規定する多く仕様を無視することになります。 これは現存する Web 標準すべてに一人で向き合うことはいささか現実的ではないのに加え、たった 1 つの Web 標準に完璧に向き合うことすら趣味程度の開発では難しいためです。

逆に、このような無視の繰り返しの中では、何をとって何を捨てるかを何度も考えることになります。 もうすこし具体的に書くならば、「こういった HTML ファイルはパースできなくてもいいことにしよう」「こういう機能は持たせないと後々困りそうだな」といったような取捨選択を繰り返すことになるのです。 また、自分の思い浮かべた仕様と、実際の Web 標準の記述を何度も比べることにもなります。

これらの営みは、きっとあなたの「Web 標準が語る多くの情報の中から、その標準の "幹" であるかを見抜く目」を磨き、「その標準の "枝" がいかにしてその標準を洗練させているかへの理解」を深めてくれることでしょう。 ちいさな Web ブラウザを実装することで得られるこのような洞察力や理解は、きっと千錯万綜している Web 標準から帰納的な思考をもって到達するのが難しいところに見えます。

全体の流れ

本オンラインブックの本編は Part 1 から Part 3 の 3 つに分かれています。

Part 1(”旅の始まり”)では、Web ブラウザの基礎的な仕事と、現代 Web ブラウザのサブセットの実装プロセスについて述べます。 ここで実装を試みる Web ブラウザは簡単にパースできるような形をした HTML と、同じく簡単にパースできるような形をした CSS を処理し、シンプルな TUI 画面にそれを描画する程度のものです。逆に GUI 画面やナビゲーション機能、Cookie を始めとしたブラウザ内ストレージ、拡張機能、…… といった現代 Web ブラウザのもつリッチな機能は持っていません。 しかし、Part 1 で紹介する開発プロセスを追体験すれば、充分に Web ブラウザの基礎は把握できることでしょう。

Part 2("動的な Web に向けて")では、Part 1 で作成したちいさな Web ブラウザに、JavaScript をロード・実行する機能を追加します。 また、JavaScript から Web ブラウザ中で表示している Web ページの情報にアクセスしたり、その情報を書き換えたりするための機能を実装します。

Part 3("安全な Web に向けて")は、Part 2 までで作成したちいさな Web ブラウザのセキュリティについて考えるための Part です。 Web ブラウザが満たすべきセキュリティ的性質に関する本格的な解説は拙著『Web ブラウザセキュリティ ― Web アプリケーションの安全性を支える仕組みを整理する』 に譲りますが、実装物の既存の脆弱性や将来的なリスクを抱える実装を探すことを通して、Web ブラウザのセキュリティについて理解を深めてもらえるはずです。


  1. OpenHub によるところでは、Chromium のソースコードの総行数はおよそ 3.5 千万行にも及んでいるようですし、Firefox もそれも約 3.2 千万行にまで上っています。正直なところ、筆者はこの調査がどの程度正しいのかを知らないので、あくまで参考程度の情報です。
Edit this page on GitHub