Spec-Conformer Script Execution Pipeline — Inline Isolation + Chunk Queue + Streaming Parser #37
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#37
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?
Spezifikationskonforme Script Execution Pipeline
Problembeschreibung
Drei Discord-interne Fehler verhindern dass discord.com/app vollständig in unserer Engine läuft:
__OVERLAY__ is not defined— Inline-Config-Script setzt Wert auf Happy DOMswindow, nicht auf Proxy-Windowwindow.GLOBAL_ENV.RELEASE_CHANNEL— Selbe Root-Cause: Inline-Scripts laufen in falschem KontextCannot access 'K' before initialization— Webpack-Chunks executieren in fetch-Complete-Reihenfolge statt DOM-Insertion-Reihenfolge → TDZAlle drei sind Artefakte unserer Engine, keine echten Browser-Fehler — Discord läuft fehlerfrei in Chrome/Firefox.
Root-Cause Analyse
Phase A — Inline Script Isolation (Errors 1 & 2)
Aktueller Flow in
parser.ts:Konsequenz:
__OVERLAY__undGLOBAL_ENVlanden auf Happy DOMs internemwindow, während external scripts (webpack etc.) viaExecutionRealm.execute()auf dem Proxy-Window laufen und die Config nicht sehen.Phase B — Parser-Execution Integration
Aktuell: Komplettes HTML wird vorausgescannt →
document.write()→ alle Scripts nachträglich. Spezifikationswidrig weil:Phase C — Dynamic Chunk Execution Order (Error 3)
Aktuell in
dynamic-scripts.ts:Spezifikation: Browser verarbeitet Chunks in DOM-Insertion-Reihenfolge. Script-Evaluation ist synchron pro Chunk, nur das Netzwerk-Fetching ist parallel.
Lösungsansatz
Phase A: Inline Script Isolation
Änderungen in
parser.ts:start()Methode: HTML-Template-Modus — Happy DOMs Script-Evaluation währenddocument.write()unterdrückenexecuteScriptsInOrder(): Alle Scripts (inline + external blocking) direkt viaScriptLoader.onScriptTag()ausführen, in Dokument-ReihenfolgeExecutionRealmÄnderungen in
dynamic-scripts.ts:4.
patchConnectedToDocument(): Inline-Scripts nicht mehr an Happy DOM delegieren5.
disableEvaluationbei inline scripts setzenÄnderungen in
execution-realm.ts:6. Strict-Mode-Stripping vor Ausführung (verhindert dass
"use strict"this-Binding zerstört)Phase B: Parser-Execution Integration
Änderungen in
parser.ts:7. HTML in Chunks parsen, Script-Token isolieren
8. Bei inline/blocking script: Parser pausieren → Script ausführen → Parser fortsetzen
9. Parser-Resume Mechanismus
Phase C: Dynamic Script Execution Queue
Änderungen in
dynamic-scripts.ts:10.
chunkQueue— FIFO-Queue für dynamische Scripts11.
processQueue()— sequentielle Verarbeitung (fetch parallel, execute serial)12.
loadAndExecute()→ Queue-Entry statt eigenständiger ProzessAkzeptanzkriterien
__OVERLAY__ = falsesetzt Wert auf Proxy-Window → visible für External-Scriptswindow.GLOBAL_ENV = {...}setzt Wert auf Proxy-Window__OVERLAY__ is not definedFehlerGLOBAL_ENV.RELEASE_CHANNELFehlerCannot access 'K'TDZBetroffene Dateien
src/dom/parser.tsstart()umbauen,_disableScriptEvaluation(),executeScriptsInOrder()src/js/dynamic-scripts.tspatchConnectedToDocument()fix,chunkQueue+processQueue()src/js/execution-realm.tssrc/js/script-loader.tsexecuteInline()ggf. anpassentests/unit/dynamic-scripts.test.tstests/unit/execution-realm.test.tsneu: tests/unit/script-pipeline.test.tsRisiken
document.write()erwartet inline execution_disableScriptEvaluationals Flag; langfristig eigenen Parser"use strict"Testplan
Unit-Tests:
inline script sets window.__OVERLAY__— nach Execution über Proxy lesbarinline script sets window.GLOBAL_ENV— via evaluate() lesbarinline script runs exactly once— Zähler vorher/nachherchunk queue executes in insertion order— 3 chunks mit sequentiellen IDschunk queue still loads concurrently— fetch-Zeit messen (parallel)deferred scripts execute in document order— Reihenfolge der Ausführungno double execution for pre-scanned scripts— Parser + DynamicHandlerIntegration-Tests:
8.
full page load with inline config + external scripts— simuliert Discord-Szenario9.
dynamic webpack chunks maintain correct TDZ ordering— zirkuläre Module simulieren10.
regression: alle 1300+ bestehenden Tests— voller SuiteE2E:
11.
discord.com/app— lädt ohne die 3 Engine-Fehler (manuell / CI)Spec-Conformer Script Execution Pipeline — Inline Isolation + Chunk Queue + Streaming Parser. ✅ Implementiert. Commit
72f91fe(feat) +7f32e85(fix) +12e6619(fix). Tests: 1423 pass.