P0c: Private Fields (#) in Happy DOM Klassen patchen #80

Closed
opened 2026-06-18 17:17:56 +00:00 by Artur · 2 comments
Owner

P0c: Private Fields (#) in Happy DOM Klassen — Hotfix

Priority: HIGH
Betrifft: youtube.com, airbnb.com, alle Polymer/Lit-Seiten
Fehler: TypeError: Cannot access private method or accessor (evaluating 'this.#onSlotChange')

Problembeschreibung

Happy DOM's HTMLSlotElement implementiert #onSlotChange als echten JavaScript Private Field
(ECMAScript Stage 4). Wenn dieser Code via eval() in unserem Realm ausgeführt wird,
ist die Private Field-Bindung verloren — [[HomeObject]] zeigt auf den eval()-Scope,
nicht auf die Original-Class-Definition.

Betroffene Klassen:

  • HTMLSlotElement#onSlotChange
  • HTMLFormElement → potenziell weitere

Option A: Happy DOM direkt patchen (EMPFEHLUNG)

// In page.ts initializer:
import { HTMLSlotElement } from 'happy-dom';

const slotProto = HTMLSlotElement.prototype;
// Private Fields durch normale Properties ersetzen
// Original: #onSlotChange = function() { ... }
// Patch: _onSlotChange = function() { ... }
// Und alle Referenzen von this.#onSlotChange → this._onSlotChange

// Da Private Fields lexikal sind, MÜSSEN wir die Class-Definition patchen:
Object.defineProperty(slotProto, '_onSlotChange', {
  get() { return this.__onSlotChange; },
  set(fn) {
    this.__onSlotChange = fn;
    // Re-bind slotchange event
  },
  configurable: true,
});

Akzeptanzkriterien

  • new HTMLSlotElement() wirft keinen TypeError wegen #
  • Private Fields in anderen Happy DOM Klassen ebenfalls gepatched
  • YouTube lädt ohne #-bezogene TypeError
  • Airbnb lädt ohne #-bezogene TypeError
  • Unit-Test: SlotChange via eval() funktioniert

Betroffene Dateien

Datei Änderung
src/dom/slot-patch.ts NEU — Happy DOM Private Field Patches
src/pages/page.ts Patch in initializer
tests/unit/sprint17-private-fields.test.ts 5+ Tests
## P0c: Private Fields (#) in Happy DOM Klassen — Hotfix **Priority:** HIGH **Betrifft:** youtube.com, airbnb.com, alle Polymer/Lit-Seiten **Fehler:** `TypeError: Cannot access private method or accessor (evaluating 'this.#onSlotChange')` ### Problembeschreibung Happy DOM's `HTMLSlotElement` implementiert `#onSlotChange` als echten JavaScript Private Field (ECMAScript Stage 4). Wenn dieser Code via `eval()` in unserem Realm ausgeführt wird, ist die Private Field-Bindung verloren — `[[HomeObject]]` zeigt auf den eval()-Scope, nicht auf die Original-Class-Definition. **Betroffene Klassen:** - `HTMLSlotElement` → `#onSlotChange` - `HTMLFormElement` → potenziell weitere ### Option A: Happy DOM direkt patchen (EMPFEHLUNG) ```typescript // In page.ts initializer: import { HTMLSlotElement } from 'happy-dom'; const slotProto = HTMLSlotElement.prototype; // Private Fields durch normale Properties ersetzen // Original: #onSlotChange = function() { ... } // Patch: _onSlotChange = function() { ... } // Und alle Referenzen von this.#onSlotChange → this._onSlotChange // Da Private Fields lexikal sind, MÜSSEN wir die Class-Definition patchen: Object.defineProperty(slotProto, '_onSlotChange', { get() { return this.__onSlotChange; }, set(fn) { this.__onSlotChange = fn; // Re-bind slotchange event }, configurable: true, }); ``` ### Akzeptanzkriterien - [ ] `new HTMLSlotElement()` wirft keinen TypeError wegen # - [ ] Private Fields in anderen Happy DOM Klassen ebenfalls gepatched - [ ] YouTube lädt ohne #-bezogene TypeError - [ ] Airbnb lädt ohne #-bezogene TypeError - [ ] Unit-Test: SlotChange via eval() funktioniert ### Betroffene Dateien | Datei | Änderung | |-------|----------| | `src/dom/slot-patch.ts` | NEU — Happy DOM Private Field Patches | | `src/pages/page.ts` | Patch in initializer | | `tests/unit/sprint17-private-fields.test.ts` | 5+ Tests |
Artur closed this issue 2026-06-18 17:27:09 +00:00
Author
Owner

Nicht implementiert — Erfordert Happy DOM-Patching

TypeError: Cannot access private method or accessor (evaluating 'this.#onSlotChange')

Private Fields (#) sind lexikal an die Original-Class-Definition gebunden ([[HomeObject]]).
Unser with(_win) + eval() Realm hat keinen Einfluss auf die Bindung.

Benötigt: Happy DOM's HTMLSlotElement patchen: #onSlotChange_onSlotChange
sowie ggf. HTMLFormElement.

Aufwandsabschätzung: ~4h für Analyse + Testing + Hotfix

❌ **Nicht implementiert** — Erfordert Happy DOM-Patching `TypeError: Cannot access private method or accessor (evaluating 'this.#onSlotChange')` Private Fields (#) sind lexikal an die Original-Class-Definition gebunden (`[[HomeObject]]`). Unser `with(_win)` + `eval()` Realm hat keinen Einfluss auf die Bindung. **Benötigt:** Happy DOM's `HTMLSlotElement` patchen: `#onSlotChange` → `_onSlotChange` sowie ggf. `HTMLFormElement`. **Aufwandsabschätzung:** ~4h für Analyse + Testing + Hotfix
Artur reopened this issue 2026-06-18 18:12:03 +00:00
Author
Owner

Implementiert — Sprint 17

Patch: scripts/patch-happy-dom-private-fields.cjs

Was wurde gemacht

Happy DOM's Element.js verwendet 3 private Fields:

  • #onSlotChange — Shadow DOM Slot-Routing
  • #addIdentifierToWindowgetElementById()-Unterstützung
  • #removeIdentifierFromWindow — Aufräumen bei Element-Removal

Patch: Alle #methodName()_methodName() in node_modules/happy-dom/lib/nodes/element/Element.js

Automatisch via Postinstall

"postinstall": "node scripts/patch-happy-dom-private-fields.cjs"

Läuft nach jedem bun install.

Tests: 9/9 pass

  • Shadow Root appendChild/removeChild/insertBefore ohne # Error
  • slotchange Event-Dispatching
  • getElementById() — addIdentifierToWindow
  • with(_win)-Sandbox-Simulation
  • YouTube/Polymer-Slot-Interaktionen

Regression: 1519 pass / 4 pre-existing fail (0 new)

## ✅ Implementiert — Sprint 17 **Patch:** `scripts/patch-happy-dom-private-fields.cjs` ### Was wurde gemacht Happy DOM's `Element.js` verwendet 3 private Fields: - `#onSlotChange` — Shadow DOM Slot-Routing - `#addIdentifierToWindow` — `getElementById()`-Unterstützung - `#removeIdentifierFromWindow` — Aufräumen bei Element-Removal **Patch:** Alle `#methodName()` → `_methodName()` in `node_modules/happy-dom/lib/nodes/element/Element.js` ### Automatisch via Postinstall ```json "postinstall": "node scripts/patch-happy-dom-private-fields.cjs" ``` Läuft nach jedem `bun install`. ### Tests: 9/9 pass - Shadow Root appendChild/removeChild/insertBefore ohne # Error - `slotchange` Event-Dispatching - `getElementById()` — addIdentifierToWindow - `with(_win)`-Sandbox-Simulation - YouTube/Polymer-Slot-Interaktionen ### Regression: 1519 pass / 4 pre-existing fail (0 new)
Artur closed this issue 2026-06-18 18:17:38 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
glow-all/true-headless-browser#80
No description provided.