Web Browser Engineering(2021)
(browser.engineering)- Web Browser Engineering は、ネットワーキングから JavaScript までを扱い、Python で数千行規模の基本的だが完全なウェブブラウザを実際に作ってみる本
- 学習の流れは、ページの読み込みから文書表示、アプリケーションの実行、現代的なブラウザ機能へと進み、HTTP、HTML、CSS、DOM、セキュリティ、レンダリングパイプラインを順に結び付けていく
- 前半では、URL と HTTP リクエスト、ウィンドウ生成とキャンバス描画、テキストの折り返しや行間といった ブラウザの基礎実装 に集中する
- 中盤から後半にかけては、HTML ツリー構築、レイアウト、スタイル適用、フォーム送信、イベント応答、Cookie とログイン、XSS と CSRF までを含む
- 後半では、コンポジット、イベントループ、GPU アニメーション、アクセシビリティツリー、iframe、無効化と編集の正確性へと進み、現代的なブラウザ実装要素 を幅広く見ていける
実装しながら学ぶブラウザの構造
- Web Browser Engineering は、ウェブブラウザがどのように動作するかを理解するために、基本的だが完全なブラウザを自分で実装する形で構成されている
- 実装言語は Python で、全体の実装規模は数千行レベル
- 範囲はネットワーキングから JavaScript まで及ぶ
- 紙の書籍は Bookshop、B&N、Amazon で購入できる
- 翻訳版は、日本語版 O’Reilly、韓国語版 Hanbit がある
- 更新情報は blog、Mastodon、Twitter で確認でき、GitHub の discussion forum もある
目次の流れ
-
導入部
-
Part 1: Loading Pages
- Downloading Web Pages: URL と HTTP リクエスト
- Drawing to the Screen: ウィンドウ生成とキャンバス描画
- Formatting Text: 単語の折り返しと行間
-
Part 2: Viewing Documents
- Constructing an HTML Tree: HTML パースと修正
- Laying Out Pages: インライン・ブロックレイアウト
- Applying Author Styles: CSS のパースと適用
- Handling Buttons and Links: ハイパーリンクとブラウザクローム
-
Part 3: Running Applications
- Sending Information to Servers: フォーム送信とウェブサーバー
- Running Interactive Scripts: DOM の変更とイベント応答
- Keeping Data Private: Cookie、ログイン、XSS、CSRF
-
Part 4: Modern Browsers
- Adding Visual Effects: ブレンディング、クリッピング、コンポジット
- Scheduling Tasks and Threads: イベントループとレンダリングパイプライン
- Animating and Compositing: GPU を使った滑らかなアニメーション
- Making Content Accessible: キーボード入力、ズーム、アクセシビリティツリー
- Supporting Embedded Content: 画像、iframe、スクリプティング
- Reusing Previous Computation: 無効化、編集、正確性
-
締めくくりと付録
1件のコメント
Hacker News の意見
この本の良い点のひとつは、「やらなかったこと」を別に取り上げているところ
レイアウトは本当に難しく、CSS なしでテーブルだけを扱っても難しい。CSS まで入ると、レイアウトはほとんど不可能なほど複雑になる
CSS 仕様全体と関連する挙動を頭の中にすべて収めておける人がいるのか疑問だ。現在の CSS+HTML+JavaScript は動的なページ記述言語(PDL)に近くなっており、今日最も複雑なソフトウェアのひとつである可能性が高い
付け加えると、動画デコードはハードウェアにオフロードされるため、昔ほどバッテリーを食うわけではない
たとえばこのファイルはブロック/インラインコンテキストだけを実装しているが、Rust のボイラープレートも少しあるとはいえ、大半は仕様のさまざまな部分を扱う実際のロジックだ。こういうファイルがフォルダいっぱいにある: https://github.com/servo/servo/blob/main/components/layout/f...
それでもレイアウトエンジンの実装は可能だ。CSS は魔法ではなく、丹念にコードへ落とし込める仕様がある。CSS が恣意的に見えていら立つ人たちにこうしたコードを見せると、実行環境にも論理があるのだと理解する助けになる
もちろんライブラリ実装を眺めるように頻繁にクリックして見るものではないだろうが、その点では React のようなものとも大きくは違わないと思う
第一に、CSS 2 のようなレイアウトの最も中核的な部分がかなり雑に設計されていて、奇妙な機能同士が奇妙に相互作用する。float と clearance、マージンの相殺などだ。この中核部分の一部はすべてのレイアウトモードで普遍的に使われることを意図していたが、他のモードにはうまく合わない。たとえば margin と padding は grid 要素では目的が明確ではない
第二に、JavaScript API のようにうまくモジュール化されていない。JavaScript API は独立して実装されることが多いが、レイアウトモジュールはさまざまな形で入れ子にできるため、互いにすべて影響し合う。grid のような新しい仕様はより厳密になろうとしているが、実際の 2D 画面という共有リソースを複数のレイアウトモードで分け合わなければならないという根本的な難題がある
CSS より単純でありながら、過去 20 年の教訓を反映し、単純さと表現力の積を最大化したレイアウト言語を望んでいるのは自分だけではないはずだ。こういうものを真剣に設計しているプロジェクトがあるのか、それともみんな CSS3 を受け入れて LLVM バックエンドを待っているか、単なるプレーンテキストに戻っただけなのか気になる
https://github.com/facebook/yoga
レイアウトがここまで複雑である必要はない。もっと単純なレイアウトシステムを持つ GUI フレームワークは何十もあり、人々が使うアプリケーションにはそれで十分だ
すごく良さそう。約 15 年前に ヘッドレスブラウザを作り始め、数年間保守していた
JavaScript インタプリタには SpiderMonkey を使い、DOM は自前で実装した。当時の最新 JavaScript や AJAX などをすべて実行し、後にはカスタム Flash ランタイムも追加した。画面に描画すること以外はほとんど全部やったプロジェクトで、本当に楽しかった
この本はぜひ読んでみたい
ブラウザエンジニアリングが今やトレンドになりつつあるようでうれしい
エコシステムは実質的に Google、Apple、Mozilla だけが定義している、かなり貧弱な状態だと思う。今後は、もっと多くの独立したブラウザエンジンがある未来を見てみたい
興味深い領域は脱 HTML の UI/ドキュメント技術だ。別スレッドの Typst は、より良い LaTeX のようなもので、Markdown も大きな影響を与えた。「HTML だが、より良いもの」を作る余地はたくさんある。必ずしもマークアップ形式である必要もない。Typst と React HTML はコードとデータの境界を曖昧にし、Jetpack Compose は Kotlin の DSL 機能で、UI 記述のように見えるが実際にはコードであるものを作る方法を示している
もちろん、そのためにはその形式用の「ブラウザ」を配布するか、既存ブラウザで表示する方法を見つける必要がある。それでも JavaScript/HTML/WASM へコンパイルすることは可能だ。JavaFX のような移植可能な GUI ツールキットを使ってもよいし、アクセシビリティも得られる。両方やることもできる
自分の UI 言語を定義すれば、HTML がうまくできないことをたくさん試せる。代表的なのはコンテンツとスタイルの分離だ。HTML は試みたが結局きちんと達成できず、XSL:T はさらに熱心に試みたが、XML 構文を使う奇妙な純粋関数型言語だった。React は JSON をボックスに変えるのはかなり得意だが、下層のプロトコルが常にその場しのぎで継ぎ足された形なので、その上に有用なツールを作るのが難しい
もう一つのアイデアとして、基本的にXSS に免疫のある形式もあり得る
ただし HTML の代替は欲しい。自分がブラウザを作るなら、HTML に耐えられないので置き換えることに集中すると思うし、JavaScript もランタイムが重いので変えたい
例えば、JavaScript ランタイムがほとんどなく、WASM だけを実行するブラウザならかなり笑えると思う
この本の著者の一人です。うれしい言葉をありがとう。質問があれば答えられます
ブラウザ実装言語として Python を選ぶに至った経緯が気になります。Node 経由の JavaScript のほうが、より関連性のあるプログラミング経験を提供できたようにも思えます
著者がなぜ Python を選んだのかを説明した記事: https://browserbook.substack.com/p/why-python
一部は Python を JavaScript にコンパイルして、今ではブラウザ内、つまり「本そのものの中」でも実行されているようだ
https://browserbook.substack.com/p/compiling-python-to-js
読んだあとに戻ってきて、もっと意味のある話ができるといい
こういう資料が作られているのを見ると本当にワクワクする
ブラウザは神秘的で解読不能なブラックボックスのように見えるし、おそらく Google もそう認識されることを望んでいる可能性が高い。だが Ladybird のようなプロジェクトの努力と成果を見ると、その壁に亀裂が入っている
いつか自分も飛び込んで、その堀を壊すことに貢献したい。この本は素晴らしい出発点に見える
Firefox はすでに存在している。ただ、ほとんど誰も使っておらず、Firefox で動かないウェブサイトに出会うと、ユーザーはただ Chrome を開くことを学んでしまった
堀が崩れることを願って Ladybird のようなブラウザエンジンに貢献するのは楽しいだろうが、それだけで堀を崩すことに貢献しているとは言いにくい。何が実際に役立つのか知りたい
むしろ Chrome、Firefox、Safari、Ladybird で働く人たちは皆、ブラウザとその動作について語ることにとてもワクワクしているように見えます。ブラウザ開発の世界は思ったより小さく、エンジニアも会社間をよく行き来するので、何らかの「陰謀」を維持し続けるのは難しそうです
ただ、教育資料が実際に不足しているという点はその通りです。だからこそこの本を書きましたし、特にレイアウトやラスタライズのような主要ステップにおけるブラウザ内部を議論するための共通語彙も不足しています。Chris と私は、この本でそうした基盤を作りたいと思っていました
始めるのに面白いプロジェクトを探していたところで、すでにこの本を本当に楽しく読んでいます。文章が特に興味深く書かれていて良いです
Chrome がどのように動作するかを説明したこの漫画も、始めるには良い資料です: https://www.google.com/googlebooks/chrome/med_00.html
ブラウザの内部構造を学んでいるところですが、この本は素晴らしいです
数百万行に及ぶ Chrome のコードに潜らなくても、ブラウザがどのように動作するかについての直感を築く助けになります
HN向けのプロモーションコードがあるのか気になる
以前、Jython [2] と一緒に HTMLUnit [1] を満足して使っていた。今後は、コード生成と検証手法によってブラウザコードの一部を自動生成できる未来に強い関心がある。Playwright/Cypress/Selenium のようなツールは尊重しているが、HTMLUnit ほど快適に感じたことはなかった
[1] https://htmlunit.sourceforge.io/
[2] https://www.jython.org/
良い本。第9章を2章に分けることを勧める
DuktapeでJavaScriptを実行する部分を1章にし、DOMおよびイベントとやり取りする部分は後の別章にするとよさそう
後半に進むほど章が長くなり、より高度なトピックを扱うので、本を読み進めながらコードも一緒に追っていくことを勧める