Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
How the browser renders a web page (long version)
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Mehdi Lahmam B.
April 22, 2016
Programming
510
1
Share
How the browser renders a web page (long version)
Slides for my talk at Mix-It conference
https://www.mix-it.fr/session/2712/
Mehdi Lahmam B.
April 22, 2016
More Decks by Mehdi Lahmam B.
See All by Mehdi Lahmam B.
Beyond code: Becoming a Product Engineer
mehlah
0
55
Possible to measure developer productivity?
mehlah
0
62
PG FDW FTW
mehlah
0
190
Product culture
mehlah
0
95
OpenAPI and AsyncAPI specifications as contracts
mehlah
0
690
Technical Debt
mehlah
1
320
Data informed growth
mehlah
0
270
Serverless Ruby and AWS Lambda
mehlah
0
190
Middleware all the things
mehlah
2
880
Other Decks in Programming
See All in Programming
色即是空、空即是色、データサイエンス
kamoneggi
1
200
プロパティの順序で型推論が壊れる!? TypeScript6.0の修正からContext-Sensitivityの仕組みを追う
bicstone
2
1.2k
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
400
ビジネスモデルから紐解く、AI+型駆動開発
hirokiomote
2
3.2k
CSC307 Lecture 17
javiergs
PRO
0
240
バックエンドにElysiaJSを採用して気付いた、良い点・悪い点
wanko_it
1
180
LLM Plugin for Node-REDの利用方法と開発について
404background
0
130
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
140
Agentic UI beyond Chats Architecture Patterns & Open Standards @ngMunich 05/2026
manfredsteyer
PRO
0
160
SPMマルチモジュールで テストカバレッジを取得する技法
yosshi4486
0
120
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
300
RailsTokyo 2026#4: AI様があれば、 Hotwireの弱点は消えるか?
naofumi
5
990
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
42
3k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.8k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
310
The Spectacular Lies of Maps
axbom
PRO
1
770
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Tell your own story through comics
letsgokoyo
1
930
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
190
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Producing Creativity
orderedlist
PRO
348
40k
Docker and Python
trallard
47
3.8k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
570
Transcript
How.the.browser renders.a.web.page?¬ @mehlah
Mehdi Lahmam @mehlah Insert you fancy title here
The browser
Browser UI Browser Engine Rendering Engine Networking JavaScript Interpreter UI
Backend Data Persistence The browser's high level structure
WebKit
WebKit components WebCore JS Engine Platform API Webkit Embedding API
WebKit based Browser
Network Graphics Fonts Location Sensors … Storage A/V Platform API
WebKit Port (Safari, Safari iOS, Qt, Playstation, …) API Calls Events
Rendering Engine HTML CSS DOM CSSOM Render Tree Layout Paint
HTML CSS DOM CSSOM Render Tree Layout Paint Rendering Engine
HTML CSS DOM CSSOM Render Tree Layout Paint Rendering Engine
HTML CSS DOM CSSOM Render Tree Layout Paint Rendering Engine
HTML CSS DOM CSSOM Render Tree Layout Paint Rendering Engine
HTML CSS DOM CSSOM Render Tree Layout Paint Rendering Engine
HTML CSS DOM CSSOM Render Tree Layout Paint Loading &
Parsing
HTML CSS DOM CSSOM Render Tree Network Loading Loading
Split between WebKit and WebCore WebCore/loader WebCore/platform/network FrameLoaderClient 2 paths:
Frames vs Resources Loading
Mostly FrameLoader Instantiates a DocumentLoader object Policy stage: block pop-ups,
cross-process navigation Provisional phase: download or commit Committed phase: start of parsing Loading Frames
Use DocLoader & Cache DocLoader takes a URL talks to
Cache or Loader returns CachedResource CachedResource Handles callbacks produce objects (file, font, …) Loading Subresources
Render Tree Layout ork Loading Parsing HTML CSS DOM CSSOM
Parsing Parsing
Bytes Characters Tokens Nodes DOM 3C 62 6F 64 79
3E 48 65 6C 6C 6F 2C 20 <body>Hello, <span>world!</span></body> StartTag: body Hello, StartTag: span world! Parsing
Parsing <script> will halt the parser as it can alter
the document sync or defer to the rescue Speculative parsing with PreloadScanner Scripts that might need stylesheets are blocked too.
HTML CSS DOM CSSOM Render Tree Layout Paint The Document
Object Model
<html> <head></head> <body> <p class="wat"> My super markup </p> <div>
<span> Something great </span> </div> </body> </html> HTMLHtmlElement |-- HTMLHeadElement `-- HTMLBodyElement |-- HTMLParagraphElement | `-- Text `-- HTMLDivElement `-- HTMLSpanElement `-- Text
<body> <p class=wat>My super markup <div><span>Something great HTMLHtmlElement |-- HTMLHeadElement
`-- HTMLBodyElement |-- HTMLParagraphElement | `-- Text `-- HTMLDivElement `-- HTMLSpanElement `-- Text
CSSOM HTML CSS DOM CSSOM Render Tree Layout Paint
Render Tree HTML CSS DOM CSSOM Render Tree Layout Paint
DOM + CSSOM
Render Tree Combines the two object models, style resolution Not
a 1-to-1 mapping of your HTML This is the actual representation of what will show on screen
Render Tree Forest Actually 4 trees : RenderObject tree RenderLayer
tree RenderStyle tree InlineBox tree
RenderObject Tree Owned by DOM tree Only exists for rendered
content Responsible for layout and paint Answers DOM API measurement requests layer tree
RenderObject class RenderObject { virtual void layout(); virtual void paint(PaintInfo);
virtual void rect repaintRect(); Node* node; //the DOM node RenderStyle* style; // the computed style RenderLayer* containgLayer; //the containing layer }
|-- HTMLBodyElement |-- HTMLDivElement |-- Text(“foo”) |-- HTMLSpanElement |-- Text(“bar”)
|-- RenderBlock |-- RenderBlock |-- RenderText(“foo”) |-- RenderInline |-- RenderText(“bar”) DOM representation Render objects RenderObject Tree
|-- HTMLBodyElement |-- HTMLDivElement |-- Text(“foo”) |-- HTMLSpanElement |-- Text(“bar”)
|-- HTMLDivElement |-- Text(“foobar”) |-- RenderBlock |-- RenderBlock |-- RenderBlock(anonymous) |-- RenderText(“foo”) |-- RenderInline |-- RenderText(“bar”) |-- RenderBlock |-- RenderText(“foobar”) DOM representation Render objects Anonymous blocks
RenderStyle Tree Contains all computed style values for renderers Owned
by RenderObject tree RenderObjects share RenderStyles RenderStyles share data members
RenderLayer Tree Like a helper class for rendering Used for
<video>, <canvas> with WebGL, positioned, transformed, transparent, masked, clipped, scrollable, or reflected elements Establishes coordinate space and z-ordering At least one per document, sparsely maps to renderers
InlineBox Tree Owned by RenderBlock One RootInlineBox per lineRootInlineBox has
list of InlineBoxes in that line Each InlineBox has a RenderObject A renderer may have many InlineBoxes relies on RenderBlock for layout
|-- RenderBlock |-- RenderText(“foo”) |-- RenderInline(b) |-- RenderText(“bar”) |-- RenderBR
|-- RenderText(“foobar”) Render Tree Line Box Tree |-- RenderBlock |-- RootInlineBox |-- InlineTextBox(“foo”) |-- InlineFlowBox(b) |-- InlineTextBox(“bar”) |-- InlineBox(br) |-- RootInlineBox |-- InlineTextBox(“foobar”) Markup <div>foo<b>bar</b><br>foobar</div>
Layout HTML CSS DOM CSSOM Render Tree Layout Paint Computing
geometric information for each node
Recursive process Traverse Render Tree Nodes position and size Global
and Incremental layouts Layout
https://www.youtube.com/watch?v=ZTnIxIA5KGw Layout in slow motion
HTML CSS DOM CSSOM Render Tree Layout Paint Display content
on the screen Painting
Painting Generally the more time consuming 10 stages (CSS2 specs)
Global and Incremental All painting commands go to GraphicsContext abstraction Compositing
Painting Promote elements that move or fade .moving-element { will-change:
transform; } .moving-element { transform: translateZ(0); } vs
Painting Don’t promote elements without profiling.
Recap Parsing --> DOMTree DOM Tree --> Render Tree Is
actually 4 trees Layout computes where a Node will be on the screen Painting computes bitmaps and composites to screen
Performance insights
Layout Invalidation div1.style.marginLeft = “10px”; var h1 = div1.clientHeight; div2.classList.add(“x”);
var h2 = div2.clientHeight; doSomething(h1, h2);
Layout Invalidation div1.style.marginLeft = “10px”; // layout invalidated var h1
= div1.clientHeight; // layout div2.classList.add(“x”); // layout invalidated var h2 = div2.clientHeight; // layout doSomething(h1, h2); div1.style.marginLeft = “10px”; // layout invalidated div2.classList.add(“x”); // layout invalidated var h1 = div1.clientHeight; // layout var h2 = div2.clientHeight; doSomething(h1, h2);
Avoid repaints .button:hover { border: 2px solid red; margin: -2px;
} .button { border: 2px solid transparent; } .button:hover { border-color: red; }
A way lot more to learn Let's build a browser
engine! http://limpet.net/mbrubeck/2014/08/08/toy-layout-engine-1.html HTML5 Rocks How Browsers works http://www.html5rocks.com/en/tutorials/internals/howbrowserswork Rendering in Webkit https://www.youtube.com/watch?gl=US&v=RVnARGhhs9w Website Performance Optimization https://developers.google.com/web/fundamentals/performance/ critical-rendering-path/?hl=en
/_ __/ /_ ____ _____ / /_______ / / /
__ \/ __ `/ __ \/ //_/ ___/ / / / / / / /_/ / / / / ,< (__ ) /_/ /_/ /_/\__,_/_/ /_/_/|_/____/