Sprint 5: IntersectionObserver fehlt in allowedGlobals — Happy DOM APIs systematisch bereitstellen #55
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#55
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?
Problembeschreibung
Nach Sprint 4 (NullBrowserClass) sehen wir den nächsten konkreten Fehler bei vuejs.org:
Root Cause:
allowedGlobalsinruntime-isolation.tslistet Happy DOM-APIs nicht vollständig. Fehlende Einträge fallen durch Layer E (NullBrowserClass) →new IntersectionObserver(...)wirft TypeError.Happy DOM v20.10.5 EXPORTIERT
IntersectionObserverbereits:Und der Happy DOM Window hat es auch:
Aber
allowedGlobalsinruntime-isolation.tsenthält es nicht → Proxy-Window gibt NullBrowserClass.Analyse: Welche APIs fehlen?
Happy DOM v20.10.5 exportiert folgende Konstruktoren, die NICHT in
allowedGlobalssind:IntersectionObserverResizeObserverSVGElemente instanceof SVGElement)HTMLDialogElementHTMLDetailsElement<details>ElementeShadowRootHTMLTemplateElement<template>ElementeCustomElementRegistrycustomElements)Hinzu kommen
MutationObserver,HTMLTemplateElement.contentetc. — manche sind bereits im Proxy, andere fehlen.Lösungsansätze
Option A: Manuelle Liste (minimal, risikoarm)
Die fehlenden APIs einzeln zu
allowedGlobalshinzufügen:✅ Minimal, kontrolliert
❌ Muss bei jedem Happy-DOM-Update gepflegt werden
❌ Neue Frameworks brauchen wieder manuelle Ergänzung
Option B: Systematischer Import (abstrakt, robust)
Happy DOM's Window.prototype hat ALLE Browser-Konstruktoren. Statt manueller Liste: dynamisch aus Window-Prototype importieren.
✅ Zukunftssicher — neue Happy-DOM-Versionen werden automatisch integriert
✅ Frameworks brauchen keine manuellen Einträge mehr
✅ Keine Regression — nur ergänzend zu bestehenden
❌ Etwas mehr Code, erfordert Verständnis der Happy-DOM-API-Oberfläche
Option C: Proxy scannt happyWindow als Fallback (am abstraktesten)
Statt
allowedGlobalszu erweitern: der Proxy-get-Trap fragthappyWindow[key]als Fallback vor NullBrowserClass.Das erfordert allerdings Zugriff auf
happyWindowim Proxy — aktuell haben die Proxy-Handler nurallowedGlobals(target) unddynamicStorage.Empfohlene Lösung
Option A + B kombinieren:
IntersectionObserver,ResizeObserver,SVGElement(und 2-3 weitere) als explizite Imports (A)HTML*,SVG*,*ObserverAkzeptanzkriterien
new IntersectionObserver(cb, opts)wirft keinen TypeErrornew ResizeObserver(cb)wirft keinen TypeErrortypeof window.SVGElement === "function"document.createElement("div") instanceof SVGElement === false(bleibt korrekt)typeof window.IntersectionObserver === "function"IntersectionObserver-Fehler hinaus (zum nächsten Fehler)Betroffene Dateien
src/runtime-isolation.tsallowedGlobalserweitern + systematischer Import aus Happy DOMsrc/tolerant-proxy.tsCross-Ref
✅ Sprint 5 abgeschlossen — Implementiert in
902a537Geliefert:
src/runtime-isolation.tsIntersectionObserver: happyWindow.IntersectionObserverResizeObserver— einfacher Shim (noop, kein Layout)SVGElement: happyWindow.SVGElementngDevMode: false,ngJitMode: false(Angular Dev-Mode)Neue Tests
tests/unit/sprint5-allowed-globals.test.ts— 6 Tests, alle ✅Keine Regressionen — 1182 Tests pass, 0 durch Änderungen
Branch-Merge: Source-Code aus
experiment/very-happy-domwar bereits in master.