Browser & Framework Internals — Progress

Track: Browser & Framework Internals (browser-framework-internals.md). The sibling track (frontend-principal-engineering.md) is tracked in fe-00-roadmap/docs/progress.md. Neither claims progress on the other.

Map, phases and sequencing rationale: bi-00-roadmap/CONCEPTS.md. Build/debug/trace procedures: bi-00-roadmap/docs/chromium-build-debug-trace.md.

Current phase: 0 — Instrumentation Current module: bi-03-html-parsing (parsing lab) and bi-01-navigating-chromium (drills) Status: materials complete through the whole track; awaiting learner execution of Phase 0.

Status values: todo · in progress · lab done · complete · revisit

Shared with the sibling track, do not duplicate: learning-log.md §3 is the source-reading log for both tracks · decisions/ holds ADRs from either.


0. The loop (non-negotiable)

Use it -> predict (written, BEFORE observing) -> build a small version
-> intentionally break it -> debug it -> inspect production source
-> compare architectures -> explain why the complexity exists
-> modify production source where practical

A prediction written after observation is worth nothing. A clearly-stated wrong prediction is worth more than a vague right one.

0b. Source-reading gate (§44)

Not complete until all eight are answered in writing: why does this code exist · what invariant does it maintain · who calls it · what does it call · which process/thread runs it · what happens if removed · how is it tested · what simpler design would fail, and why.

0c. Navigation rule

Source paths are never handed to you. State a hypothesis, search, confirm or falsify, and record the query that worked. Queries transfer; paths rot — see §8.


1. Phase status

Phase 0 — Instrumentation (no build required)

ModuleStatusLabNotes
bi-01-navigating-chromiumtododrills8 timed drills; deliverable is the query log
bi-03-html-parsingtodoparsing labstart here; fixtures in src/
Chromium checkout✅ done~/chromium/src @ 7e6a84f5165fd, 26 GB
Chromium buildblockedtoolchain floor — see build guide §2.0
Architecture map from memory, then correctedtodo
DevTools → Perfetto: name 5 trace eventstodo

Phase 1 — Parser, DOM, Bindings

ModuleStatusLab
bi-02-architecture-process-modeltodo
bi-04-dom-internalstodo☐ mini-browser M3
bi-05-bindings-v8todo☐ mini-binding layer
fw-01-mini-reduxtodo☐ + reading ladder L1

Phase 2 — Style

ModuleStatusLab
bi-06-chromium-cpptodo☐ (JIT reference)
bi-07-css-enginetodo☐ mini-browser M4–M6
fw-02-mini-react-coretodo☐ stages 1–7
Vertical trace 1classList.addtodo

Phase 3 — Layout & Paint

ModuleStatusLab
bi-08-layouttodo☐ mini-browser M7–M9
bi-09-painttodo☐ mini-browser M10–M11
fw-03-reactivity-signalstodo☐ both, back to back
Vertical traces 2, 3getBoundingClientRect, DOM insertiontodo

Phase 4 — Compositor, Scheduling, Debugging

ModuleStatusLab
bi-10-compositor-gputodo
bi-11-schedulingtodoneeds fe-01 first
bi-12-debugging-tracingtodoneeds a build
fw-04-mini-react-schedulingtodo☐ derive Fiber
fw-10-virtual-listtodo
Vertical traces 4, 5, 8 — click, scroll, rAFtodo

Phase 5 — Compilers, Tooling, Production Source

ModuleStatus
fw-05-vue-renderertodo
fw-06-compilerstodo
fw-07-bundlertodo
fw-08-routertodo
fw-09-query-cachetodo
fw-11-production-sourcetodo
fw-12-testing-devtoolstodo
Vertical traces 6, 7setState, fetchtodo

Phase 6 — Tests, WPT, Contribution

ModuleStatus
bi-13-tests-wpttodo — needs a build
bi-14-contributiontodo — needs a build

Phase 7 — Capstone

ModuleStatus
bi-15-vertical-tracesongoing across phases
bi-16-capstonetodo

2. Vertical trace ledger (§43)

Record the deepest layer genuinely resolved with evidence, not the deepest you can name.

#OperationAfterStatusDeepest resolvedEvidence type
1classList.addbi-07
2getBoundingClientRectbi-08
3DOM insertionbi-04
4clickbi-10/11
5scrollbi-10
6setCount(count+1)fw-04
7fetchbi-02
8requestAnimationFramebi-11

2b. Archaeology missions (§25)

document.createElement ☐ · classList.add ☐ · getBoundingClientRect ☐ · requestAnimationFrame ☐ · fetch ☐ · CSS Grid ☐ · click/input ☐ · accessibility tree ☐


3. Complexity notebook (§46)

Observed complexity:
My simpler design:
What requirement breaks my design:
Production constraint:
Resulting architecture:
Classification: essential architecture | production hardening | accretion  (defend it)
#TopicModuleStatus
1HTML parser insertion modesbi-03
2Redux middleware vs enhancersfw-01
3Style invalidation setsbi-07
4Layout fragmentationbi-08
5Property treesbi-09
6Pending/active tree splitbi-10
7Mojo / multiprocess IPCbi-02
8Two garbage collectorsbi-04
9Vue schedulerfw-03
10Fiber (flagship)fw-04
11Hydrationfw-11
12Event delegation / synthetic eventsfw-11

4. Contribution ladder (§24)

RungTargetStatusCL
0Build Chromium⛔ blocked on toolchain
1Docs or test-only
2Small isolated correctness fix
3Blink behaviour bug + regression test
4Small rendering/style/layout improvement
5Cross-component change

Per rung retain: bug · reproduction · spec · subsystem · source path · call path · test · proposed fix · reviewer feedback · architectural lesson.

Candidate pool: build it in bi-13 lab step 4 from TestExpectations.


5. Lab log

LabDatePrediction correct?TimeBiggest surprise
parsing (bi-03)
navigation drills (bi-01)

Source-code readings go in fe-00-roadmap/docs/learning-log.md §3.


6. Environment

Checkout~/chromium/src @ 7e6a84f5165fd (VERSION 8002), 26 GB
git cache~/Library/Caches/depot_tools/git_cache, 24 GB — deletable
depot_tools~/depot_tools, on PATH via ~/.zshrc
Free disk~90 GB
HostmacOS 15.0 · Xcode 16.2 · SDK 15.2 · M2 Pro / 12 core / 32 GB
Build⛔ trunk requires macOS 26.2 / Xcode 26.5

What still works without a compiler: git grep over the full tree (faster than Code Search), git log -S archaeology, all in-tree docs, .json5/.idl/.mojom reading — i.e. everything through Phase 2.


7. Verification log

Chromium moves. Anything unchecked older than ~6 months is suspect.

DateClaimVerdict
2026-08-10Chromium trunk builds with Xcode 16.2 / SDK 15.2FALSE — requires Xcode 26.5 / SDK 26.5 (landed 2026-05-13), hence macOS 26.2+. gn gen can be forced with use_clang_modules=false + use_unified_system_module=false, but compilation fails on missing SDK symbols (posix_spawn_file_actions_addchdir).
2026-08-10Blink layout classes are prefixed ng_STALE — prefix removed; block_layout_algorithm.cc, constraint_space.h. layout_ng.md doc remains.
2026-08-10Chromium bugs live at bugs.chromium.orgSTALE — now issues.chromium.org. In-tree docs/contributing.md still has the old reference.
2026-08-10fetch --git-cache mirror lives in ~/.cacheFALSE — location is cache_dir in ~/chromium/.gclient; here ~/Library/Caches/depot_tools/git_cache. Roughly doubles peak disk.
2026-08-10Blink's HTML fastpath accelerates document parsingFALSETryParsingHTMLFragment is the fragment (innerHTML) path; bails out to the general algorithm on unsupported tags.
2026-08-10BackgroundHTMLScanner == the old threaded HTML parserFALSE — it runs on a worker thread scanning all body data for inline scripts to stream-compile; HTMLPreloadScanner is the main-thread, first-chunk preload scanner. Tree building remains main-thread.
2026-08-11Blink keeps DOM/JS heaps in sync via wrapper tracing (TraceWrapperMember<T>)STALE - deprecated, type removed. Blink uses V8's unified heap: Oilpan is cppgc, which lives in V8, so one collector traces both. Use Member<T> + TraceWrapperV8Reference<T>. Source: platform/bindings/TraceWrapperReference.md.
2026-08-11css_properties.json5 declares per-property pipeline invalidationConfirmed - invalidate: field. 822 property entries, 311 declare it. Distribution: 95 ["layout","paint"], 50 ["paint"], 34 ["layout"], 13 ["layout","scroll-anchor"], 4 ["compositing"], plus reshape, color, text-decoration, ax-style, transform-data.
2026-08-11Blink HTML tokenizer/tree-builder sizeConfirmed - 76 tokenizer states (html_tokenizer.h), 21 insertion modes (html_tree_builder.h). 7 of 21 modes are table-related; 3 are frameset.
2026-08-11Chromium process-model vocabularyConfirmed - SiteInfo (security principal), SiteInstance (principal instance, ~= agent cluster), BrowsingInstance (browsing context group), ProcessLock (enforcement). Source: docs/process_model_and_site_isolation.md.
2026-08-11Blink scheduler policy constantsConfirmed - tasks deferred 2 s after a user gesture; mobile freezes background pages after 5 min; only JS timers are currently throttleable; ScopedPagePauser stops all JS during alert()/print()/breakpoints. Source: platform/scheduler/TaskSchedulingInBlink.md.
2026-08-11Oilpan heap partitioningConfirmed - Node, CSSValue, LayoutObject get typed custom spaces; collection backings get compactable spaces; concurrent marking+sweeping; GC scheduled via the message loop for precision.
2026-08-11V8 has four execution tiersConfirmed in-tree: v8/src/interpreter (Ignition), baseline (Sparkplug), maglev (Maglev), compiler (TurboFan).
2026-08-11TestExpectations scale and policyConfirmed - 9,418 lines. Results vocabulary [ Timeout Crash Pass Failure Skip ]. Policy: a bare [ Skip ] is not allowed; failing tests keep running on bots so flakiness data accrues.
2026-08-11Paint architectureConfirmed - PrePaintTreeWalk does paint invalidation + property-tree building; one PaintController per LocalFrameView; a PaintChunk is "sequential display items sharing a common property tree state"; caching at display-item and subsequence level.
2026-08-11cc vocabularyConfirmed - CompositorFrame = RenderPasses of DrawQuads + metadata; Layer main-thread only, LayerImpl compositor-thread; composited effects are done by modifying the active tree; ElementID is the stable cross-update identifier.
2026-08-11Blink generated-input surfaceConfirmed - 57 .json5 files under third_party/blink/renderer. runtime_enabled_features.json5 status vocabulary is exactly ["stable","experimental","test"], optionally per-platform.
2026-08-11Trace categories are enumerable in-treeConfirmed - base/trace_event/builtin_categories.h (~500 strings). In core/ alone: blink 204 uses, navigation 41, loading 20, input 17, devtools.timeline 4.
2026-08-10fetch --git-cache chromium is the fast-checkout path on macOSConfirmed — docs/mac_build_instructions.md
2026-08-10Parser sources in third_party/blink/renderer/core/html/parser/Confirmed — 95 files incl. html_tokenizer.*, html_tree_builder.*, html_construction_site.*
2026-08-10Foster parenting: HTMLConstructionSite::{FosterParent,FindFosterSite,ShouldFosterParent}, HTMLStackItem::CausesFosterParenting, HTMLTreeBuilder::ProcessStartTagForInTableConfirmed against main
2026-08-10Build targets //content/shell:content_shell, //:blink_tests, //third_party/blink/renderer/controller:blink_unittestsConfirmed via gn ls
2026-08-10Style invalidation machinery: RuleFeatureSet, PendingInvalidationsMap, SelectorChecker::MatchSelector, Element::StyleForLayoutObjectConfirmed — core/css/style-invalidation.md, style-calculation.md