×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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. 子要素を読み取ったら最後に`
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のみが含まれている場合(
abc
def
) は、そのまま処理を進める ○ 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
ありがとうございました!