Slide 1

Slide 1 text

ブラウザの作り方
 Keiya Sasaki 2021/01/25


Slide 2

Slide 2 text

➔ Sasaki Keiya
 ➔ 大学4年生
 ➔ 4月からIT企業で
 フロントエンドエンジニア
 ➔ TypeScript・Rust
 ➔ Twitter: _keiya01
 ➔ Github: keiya01


Slide 3

Slide 3 text

話すこと


Slide 4

Slide 4 text

1. 実装状況
 2. 実装方法
 3. チュートリアル
 4. まとめ


Slide 5

Slide 5 text

実装状況


Slide 6

Slide 6 text

実装状況
 ● display … block, inline ● background, color ● width, height, margin, border, padding ● font-family(local fontのみ) ● font-size, font-weight, font-style ● line-height ● Scroll ● Text周り(改行など)

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

実装方法


Slide 9

Slide 9 text

手順
 1. ブラウザの仕組みを知る
 2. ブラウザを作る


Slide 10

Slide 10 text

ブラウザの仕組みを知る
 ● Populating the page: how browsers work
 ○ こっちはブラウザの詳しい説明というよりはWeb Performanceを中心にして 
 ブラウザの仕組みを解説している 
 ○ 最初にこっちを読むと下の記事が読みやすいかも 
 ● How Browsers Work: Behind the scenes of modern web browsers
 ○ Parserの仕組みからブラウザの詳細な仕組みについて解説している 
 


Slide 11

Slide 11 text

ブラウザを作る
 ● Let's build a browser engine! を読む
 ○ Servoのメンバーの人が書いた記事 
 ○ Rustを使って実装していく
 ○ Part1 ~ Part7まである
 ○ 機能を絞っているので、テンポ良く実装できる 
 ○ HTML・CSS のParse → Style → Box Model → Layout → Paint 
 ○ Paint部分は画像として出力している 
 ● W3C を読む
 ○ CSSなどの仕様
 ● WHATWG を読む
 ○ DOM, HTMLなどの仕様


Slide 12

Slide 12 text

仕様の読み方(W3C)
 ● Jxckさんの WEB技術の調査方法 の W3C/WHATWG のセクションを
 読むと読み方がわかってくる
 ● W3Cの Levels, snapshots, modules… を読むと、どのように仕様が
 策定されていくかがわかる


Slide 13

Slide 13 text

1. 実装したい機能をMDNで検索
 2. MDNの下の方にSpecificationsが
 出てくるので新しそうなやつを開く
 3. ざっと読んで、リンクを辿っていく
 4. 何となく理解したら、Servoなどの既存 のリポジトリの実装をみてみる
 5. 実装する
 進め方


Slide 14

Slide 14 text

参考になるリポジトリ
 ● Servo
 ○ `/components` 配下に各moduleが入っている
 ● twilco/kosmonaut 
 ○ Servoをインスパイアしたブラウザエンジン 
 ○ Let's build a browser engine!を参考にしている
 ○ parserとかはservoで使われているparserを使っている 
 ● maekawatoshiki/naglfar
 ○ 日本人の方が作っているブラウザ 
 ○ Let's build a browser engine!を参考にしている
 ● keiya01/kamaitachi
 ○ 今作っているやつ


Slide 15

Slide 15 text

チュートリアル


Slide 16

Slide 16 text

ブラウザの仕組み
 Parse
 Style
 Layout
 Paint
 HTML・CSSを Tree構造のデー タに変換する
 CSSルールをDOM と紐付ける(レン ダーツリー)
 Styleをもとに、
 それぞれの要素の Positionや高さ、
 幅を計算していく
 Layoutで計算した データをもとに
 描画していく


Slide 17

Slide 17 text

HTML Parse
 1. 1文字づつプログラム中の文字を読み込んでいく
 2. `<`が見つかったら、elementとして、タグの中身を読み取っていく
 ○ `
`の場合、`<`が見つかると、中身を1文字づつ`>`にぶつかるまで 
 探索していく
 3. `<..>`の中身を読みよったら、次に子要素を読み取っていく
 ○ `

children

`の場合、`

`を同じように読み取っていく 
 4. 子要素を読み取ったら最後に``があるかを確認する
 ○ HTMLは後方互換性のために基本的に構文エラーは起きない 
 ○ そのため、``がなかったとしてもそのまま処理を続ける 
 5. Text Nodeが存在する場合は、`<`に達するまで文字を読み取っていく


Slide 18

Slide 18 text

CSS Parse
 1. 先頭に`.`が見つかればclass、`#`が見つかればid、使用可能な文字列であれば
 要素名としてparseし、selectorsに格納する
 2. `{`にぶつかると宣言ブロックの処理に移る
 3. ここでは`property: value;`のペアをそれぞれparseし、declarationsに格納する
 4. CSSには詳細度(specificity)という、どのCSSルールを適用するかを決める
 重み付けのようなものがあるのでそれを求める
 ○ idをselectorに持つ宣言はclassよりも優先されるといったようなもの 
 5. 詳細度をもとにselectorsをsortしておく


Slide 19

Slide 19 text

Style
 1. HTMLのparseで得たDOMとCSSのparseで得たCSSOMを
 Root Nodeから順に見ていく
 2. CSSのRulesは詳細度によってsortされているので、
 NodeとSelectorが最初にmatchした要素を取得する
 3. matchしたCSS Rulesを詳細度の低いものから高いものへソートし、
 HashMapにpropertyをkeyとしてvalueをinsertしていく
 ○ これにより、先にinsertされた値は、後にinsertされる詳細度の高い値で 
 上書きされる
 4. ここでは省略するが、他にもUseragent Stylesheetとのmergeや、
 継承、computed valueなどの処理もここで行う


Slide 20

Slide 20 text

ElementにMatchしたCSS Rulesを詳細度の低いものから高いものへ ソートし、HashMapにinsertしていく

Slide 21

Slide 21 text

Layout
 1. StyleTreeからdisplayの値を受け取り、Box(display)ごとに分類する
 ○ BlockNode, InlineNode, TextNodeなど 
 ○ 分ける理由は、Boxによってpositionが異なるから 
 ○ 例えば、Blockは縦方向に配置されるが、Inlineは横方向に配置される 
 2. BlockNodeの場合、width => position => children => heightの順で
 計算していく
 3. InlineNodeの場合は、扱い方が2種類ある。
 ○ BlockNodeの中にInlineNodeのみが含まれている場合(abcdef) は、そのまま処理を進める
 ○ BlockNodeの中にInlineNodeとBlockNodeが含まれている場合、各Boxは同じTypeのBoxし か含めることができないので、InlineNodeをAnonymouseBlock 
 というBoxでラップする。これにより横に配置する処理を行いやすくする。 


Slide 22

Slide 22 text

BlockNodeの例


Slide 23

Slide 23 text

AnonymousBlock
 Block(div)
 Anonymous Block
 Block


Slide 24

Slide 24 text

Paint
 1. 最初にLayout TreeからDisplayListを作成する
 ○ DisplayListはbackground-colorやcolorなどの情報を切り出しておき、 
 レンダリング処理を行いやすくする 
 ○ DisplayListとして切り出しておくことで、colorの変更などが起こったときに、DisplayListを 探索すれば簡単にcolorの変更ができたりする 
 2. DisplayListからItemを取り出し描画していく


Slide 25

Slide 25 text

DisplayList


Slide 26

Slide 26 text

まとめ
 ● ブラウザの仕様はとても多い
 ● ブラウザを作り進めるにつれて無限に仕様が湧いてくる
 ● 一方で知らない世界を知れてとても楽しい(unicode, fontなど)
 ● 興味を持ってくれた方がいれば是非作ってみてください!


Slide 27

Slide 27 text

ありがとうございました!