mini-browser — the spine

This is not a project you sit down and build. It is a spine threaded through the browser strand: each milestone is built immediately before the Blink reading it motivates, so that the reading answers a question you already have.

Built as one block at the end, it teaches nothing — every "why is Blink like this?" question has already been answered by prose. That is specification §45 applied at module granularity.

MMilestoneBuilt inPaired reading
1hard-coded boxesbi-03
2HTML tokenizer + tree builderbi-03core/html/parser/
3DOMbi-04core/dom/
4CSS parserbi-07core/css/
5selector matchingbi-07SelectorChecker
6cascade, inheritance, computed stylebi-07StyleForLayoutObject
7layout treebi-08core/layout/
8block layoutbi-08block layout algorithm
9inline textbi-08core/layout/inline/
10display listbi-09core/paint/
11rasterbi-09paint → raster boundary
12eventsbi-11event dispatch
13incremental invalidationbi-11style + paint invalidation
14minimal JS integrationbi-05bindings
15profiling / optimisationbi-12tracing

At every milestone record the §47 comparison: ours vs production requirements vs Blink.

The rule that makes this work

For milestones 6, 8, 11 and 13, build the naive version first and measure it, then optimise. The cost curve you measure is the argument for the production design. Skipping the naive version means the optimisation is a fact you were told rather than a conclusion you reached.

src/foster.js from the parsing lab is the seed of M2.