HTML5 Parser — Spec-Compliant Tokenizer + Tree Construction #97
Labels
No labels
bug
docs
feature
housekeeping
html-spec
performance
react-compat
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
glow-all/true-headless-browser#97
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Issue #97 — HTML5 Parser — Spec-Compliant Tokenizer + Tree Construction
Problembeschreibung
Der aktuelle Parser (
src/dom/parser.ts) nutzt Happy DOMsinnerHTML-Setter für HTML-Parsing. Happy DOMs Parser ist nicht spec-konform — er erzeugt kaputte DOMs für echte Webseiten (fehlende Implied-Tags, falsche Foster-Parenting, kein korrektes Script-Execution-Modell).Konkret betroffen:
<!DOCTYPE html>wird ignoriert (kein Quirks/Almost-Standards/Full-Standards Mode)<html>,<head>,<body>werden falsch gesetzt<table>stehen) fehlt</p>ohne öffnendes<p>erzeugt falsche DOMs<template>content parsing (DocumentFragment) fehltArchitektur-Analyse
Aktueller Stand (
src/dom/parser.ts)Der IncrementalParser wrapped nur Happy DOMs Parser:
awaitParser()→ wartet auf Script-FetchesaddChunk()→ hängt an bestehenden DOM ranSpec-konformer Parser (Ziel)
Lösungsansätze
Option A — Full Tokenizer + Tree Construction (Empfohlen)
Eigene Implementierung nach HTML5 Spec (WHATWG):
Tokenizer (Phase 1):
&,{,😀)Tree Construction (Phase 2):
Tokenizer States (80+) — minimal:
Data,PLAINTEXT,RCDATA,RAWTEXT,Script dataTagOpen,EndTagOpen,TagName,BeforeAttributeName,AttributeNameAfterAttributeName,BeforeAttributeValue,AttributeValueDoubleQuotedSelfClosingStartTag,BogusComment,MarkupDeclarationOpenCommentStart,CommentStartDash,Comment,CommentEndDash,CommentEndTree Construction Insertion Modes (ca. 30):
Code-Architektur:
Vorteile:
Nachteile:
Option B — Happy DOM Parser verbessern
Happy DOMs Parser forken/patchen:
Nachteile:
Option C — Drittanbieter-Parser (htmlparser2 + domino)
htmlparser2als Tokenizer + eigener TreeBuilder:htmlparser2hat spec-konformen TokenizerVorteile: Weniger Code (~1.500 Zeilen statt 4.000)
Nachteile: Abhängigkeit von Drittanbieter, Anpassungen nötig
Entscheidung
Option A — Full eigene Implementierung. Der Parser ist das Herzstück eines spec-konformen Browsers. Externe Abhängigkeiten lohnen sich nicht, weil wir genaue Kontrolle über jedes Token brauchen (Script-Execution-Timing, document.write()).
Akzeptanzkriterien
<!DOCTYPE html>→ korrekter Quirks/Standards Mode<html><head><body>werden impliziert wenn fehlend<p>-Implied-End-Tags:<p>a<p>b→<p>a</p><p>b</p><table><b><tr><td>test→<b></b><table><tr><td>test<script>var a=1</script>+ Folgendes wird nicht als Script content interpretiert</script>im Script-Content beendet Script-Tag<template>content parsed als DocumentFragment&→&,{→{,😀→ 😀Betroffene Dateien
src/dom/parser.tssrc/html/tokenizer.tssrc/html/token-types.tssrc/html/tree-construction.tssrc/html/DOMBuilder.tssrc/html/script-runner.tssrc/pages/page.tssrc/pages/stabilizer.tstests/unit/html-parser.test.tstests/integration/html-parser.test.tsDependencies
Technische Risiken
Performance-Impact
Testplan
Unit-Tests (30+)
Integration-Tests (20+)
E2E (5+)
✅ Issue #97 implementiert — Commit
80d4c0aGeliefert
40+ neue Dateien / ~85.000 Zeilen Code
token-types.ts,char-refs.tstokenizer.ts(~1.900 Z.)DOMBuilder.tstree-construction.ts(~2.300 Z.)script-runner.tsHTMLParser.ts,parser.tsTest-Ergebnisse
✅ 83 Tests, 0 Failures
Spezifikations-Abdeckung
<!DOCTYPE html>→ korrekter no-quirks/limited-quirks/quirks Mode<html><head><body>impliziert wenn fehlend<p>a<p>b→<p>a</p><p>b</p><table></script>im Script-Content beendet Script-Tag<template>content parsed als DocumentFragment&→&,😀→ 😀