Context
Phase 1 delivers browser infrastructure: window, tabs, bookmarks, networking, headless mode, e2e tests. Phase 2 makes the browser actually render web pages. The goal is a vertical slice where the user navigates to a URL and sees rendered HTML with styled text, colored blocks, and flexbox layouts — plus working JavaScript.
Steps
Step
Crate
What
Parallel?
1
ie-html
WHATWG HTML tokenizer (~80 states)
Yes (with 3)
2
ie-html
WHATWG tree builder (~20 insertion modes)
After 1
3
ie-css
CSS tokenizer + parser + selectors + cascade
Yes (with 1)
4
ie-css
Style resolution pipeline (matching + inheritance)
After 2+3
5
ie-layout
Block + inline layout, positioning
After 4
6
ie-render
GPU paint pipeline + text rendering + browser chrome
After 5, first visual
7
ie-layout
Flexbox layout
After 5
8
ie-js + ie-wasm
JS runtime with DOM bindings, events, wasm interop
After 2 (parallel with 6-7)
Step 1: HTML Tokenizer
Crate : ie-html — rewrite tokenizer.rs
Step 2: HTML Tree Builder
Crate : ie-html — rewrite tree_builder.rs
Step 3: CSS Tokenizer and Parser
Crate : ie-css — new tokenizer.rs, rewrite parser.rs/selector.rs/style.rs
CSS Syntax Level 3 tokenizer (iterator-based)
Parse rules: qualified rules, @media, @import
Selectors: combinators (descendant, child, sibling), pseudo-classes (:hover, :focus, :nth-child(), :not(), :root), attribute selectors, universal selector
Specificity computation (specificity.rs)
Cascade algorithm (cascade.rs): origin ordering + specificity + source order
Expand ComputedStyle to ~40 properties: box model, typography, positioning, flexbox, background, overflow, visibility
Extended Value types: all length units, colors (hex, rgb, hsl, named), calc() basic arithmetic
User-agent stylesheet (ua.css): WHATWG normative UA stylesheet, embedded as const
Tests: targeted unit tests for parsing, selector matching, cascade
Step 4: Style Resolution Pipeline
Crates : ie-css + ie-dom
Step 5: Block and Inline Layout
Crate : ie-layout — new box_generation.rs, block.rs, inline.rs, positioned.rs
Box tree construction from styled DOM (display → box type, anonymous boxes)
Block formatting context: vertical stacking, width algorithm, margin collapsing
Inline formatting context: line boxes, text measurement via TextMeasure trait, line breaking, text-align
Positioned layout: relative, absolute, fixed, stacking contexts
TextMeasure trait defined in ie-layout, implemented by ie-render (trait inversion)
Tests: hand-crafted styled DOM trees, mock TextMeasure, verify geometry
Step 6: GPU Paint Pipeline + Text + Chrome (first visual )
Crate : ie-render — major expansion
Step 7: Flexbox Layout
Crate : ie-layout — new flex.rs
Step 8: JavaScript + WebAssembly
Crates : ie-js + ie-wasm (parallel with 6-7)
DOM bindings: document.getElementById(), querySelector(), createElement(), appendChild(), etc.
Event system: addEventListener(), capture → target → bubble, click/keydown/keyup/DOMContentLoaded/load
console.log/warn/error → tracing
setTimeout/setInterval → event loop integration
Minimal Web API: window, location, navigator.userAgent
Document ownership: Rc<RefCell<Document>> for single-threaded renderer
ie-wasm: complete instantiate(), memory management, WebAssembly.instantiate() in Boa
Tree builder <script> callback, external script fetching
Tests: DOM manipulation, event dispatch, timer callbacks, wasm instantiate + call
Parallelism
Steps 1 + 3: fully parallel (no deps between them)
Steps 2, 4, 5, 6: sequential chain
Step 7: after 5 (parallel with 6)
Step 8: after 2 (parallel with 6+7)
What's Deferred (Phase 3+)
CSS Grid, transitions/animations, transforms, gradients
@font-face (system fonts only in Phase 2)
Image rendering (PNG, JPEG, WebP, SVG)
<canvas>, <video>, <audio>
Scrolling (scroll containers, scroll bars, hit testing)
Form elements (<input>, <select>, <textarea>)
fetch() API, Shadow DOM, @media query evaluation
Accessibility, DevTools protocol
Acceptance Criteria
Context
Phase 1 delivers browser infrastructure: window, tabs, bookmarks, networking, headless mode, e2e tests. Phase 2 makes the browser actually render web pages. The goal is a vertical slice where the user navigates to a URL and sees rendered HTML with styled text, colored blocks, and flexbox layouts — plus working JavaScript.
Steps
Step 1: HTML Tokenizer
Crate:
ie-html— rewritetokenizer.rsTokenizerStateenum)impl Iterator<Item = Token>(not batchVec<Token>)Tokenenum: StartTag getsattributes: Vec<(String, String)>, Doctype getsname/public_id/system_id/force_quirksentities.json, codegen viabuild.rsStep 2: HTML Tree Builder
Crate:
ie-html— rewritetree_builder.rs<script>pauses tree construction → callback to caller for script executionStep 3: CSS Tokenizer and Parser
Crate:
ie-css— newtokenizer.rs, rewriteparser.rs/selector.rs/style.rs@media,@import:hover,:focus,:nth-child(),:not(),:root), attribute selectors, universal selectorspecificity.rs)cascade.rs): origin ordering + specificity + source orderComputedStyleto ~40 properties: box model, typography, positioning, flexbox, background, overflow, visibilityValuetypes: all length units, colors (hex, rgb, hsl, named),calc()basic arithmeticua.css): WHATWG normative UA stylesheet, embedded as constStep 4: Style Resolution Pipeline
Crates:
ie-css+ie-dommatching.rs):matches(selector, node, doc) -> boolresolve.rs): produceComputedStyleper nodeem,rem,%) top-down<style>contents and<link rel="stylesheet">during tree building<style>, resolve styles, assert computed valuesStep 5: Block and Inline Layout
Crate:
ie-layout— newbox_generation.rs,block.rs,inline.rs,positioned.rsTextMeasuretrait, line breaking,text-alignTextMeasuretrait defined in ie-layout, implemented by ie-render (trait inversion)Step 6: GPU Paint Pipeline + Text + Chrome (first visual)
Crate:
ie-render— major expansionVec<PaintCommand>(PaintRect, PaintBorder, PaintText)glyphon(cosmic-text shaping + swash rasterization + wgpu integration)glyphonimplementsTextMeasuretrait for ie-layoutglyphon,cosmic-textStep 7: Flexbox Layout
Crate:
ie-layout— newflex.rsflex-grow/flex-shrinkflex-wrapjustify-content,align-items,align-selfgappropertyStep 8: JavaScript + WebAssembly
Crates:
ie-js+ie-wasm(parallel with 6-7)document.getElementById(),querySelector(),createElement(),appendChild(), etc.addEventListener(), capture → target → bubble, click/keydown/keyup/DOMContentLoaded/loadconsole.log/warn/error→ tracingsetTimeout/setInterval→ event loop integrationwindow,location,navigator.userAgentRc<RefCell<Document>>for single-threaded rendererinstantiate(), memory management,WebAssembly.instantiate()in Boa<script>callback, external script fetchingParallelism
What's Deferred (Phase 3+)
@font-face(system fonts only in Phase 2)<canvas>,<video>,<audio><input>,<select>,<textarea>)fetch()API, Shadow DOM,@mediaquery evaluationAcceptance Criteria
mise run checkpasses (all crates)cargo run -p ie-shellrenders actual web pages (text, colored blocks, flexbox)