P2a: HTML-as-JS Error Handling — 404/403 Seiten erkennen #76

Closed
opened 2026-06-18 17:17:55 +00:00 by Artur · 1 comment
Owner

P2a: HTML-as-JS Error Handling — 404/403/Error-Seiten erkennen

Priority: HIGH
Betrifft: ALLE Seiten (450+ Vorkommen im Fullscan)
Impact: Das häufigste Error-Muster. ScriptLoader wrappt HTML-Content in new Function() → SyntaxError.

Problembeschreibung

Dynamic Scripts, deren src auf eine 404/403/Error-Seite zeigt, liefern HTML-Content
(Error-Seite) statt JavaScript. Der ScriptLoader versucht diesen HTML-Content via
new Function() oder eval() auszuführen → SyntaxError: Unexpected token '<'.

Im Browser feuert so ein Script einfach onerror → kein Fehler.

Option A: Content-Type prüfen (EMPFEHLUNG)

// Nach fetch(), vor execute():
if (content.trimStart().startsWith('<') && !content.trimStart().startsWith('/*') && !content.trimStart().startsWith('//')) {
  // Content ist HTML — nicht execute
  if (scriptElement) {
    scriptElement.dispatchEvent(new ErrorEvent('error', { message: 'Resource is HTML, not JS' }));
  }
  return;
}

Oder besser: Content-Type-Header prüfen.

Akzeptanzkriterien

  • 404/403/Error-Seiten werden nicht als JS ausgeführt
  • ScriptElement feuert onerror Event
  • Seite crasht nicht wegen SyntaxError
  • Unit-Test: HTML-Content als Script → error event
  • Unit-Test: Echter JS-Content mit < (Template Literal) wird weiterhin ausgeführt

Betroffene Dateien

Datei Änderung
src/js/script-loader.ts Content-Type-/Content-Prüfung vor execute
src/js/execution-realm.ts execute() - HTML-Check verbessern
tests/unit/sprint16-html-as-js.test.ts 5+ Tests
## P2a: HTML-as-JS Error Handling — 404/403/Error-Seiten erkennen **Priority:** HIGH **Betrifft:** ALLE Seiten (450+ Vorkommen im Fullscan) **Impact:** Das häufigste Error-Muster. ScriptLoader wrappt HTML-Content in new Function() → SyntaxError. ### Problembeschreibung Dynamic Scripts, deren `src` auf eine 404/403/Error-Seite zeigt, liefern HTML-Content (Error-Seite) statt JavaScript. Der ScriptLoader versucht diesen HTML-Content via `new Function()` oder `eval()` auszuführen → `SyntaxError: Unexpected token '<'`. Im Browser feuert so ein Script einfach `onerror` → kein Fehler. ### Option A: Content-Type prüfen (EMPFEHLUNG) ```typescript // Nach fetch(), vor execute(): if (content.trimStart().startsWith('<') && !content.trimStart().startsWith('/*') && !content.trimStart().startsWith('//')) { // Content ist HTML — nicht execute if (scriptElement) { scriptElement.dispatchEvent(new ErrorEvent('error', { message: 'Resource is HTML, not JS' })); } return; } ``` Oder besser: Content-Type-Header prüfen. ### Akzeptanzkriterien - [ ] 404/403/Error-Seiten werden nicht als JS ausgeführt - [ ] ScriptElement feuert `onerror` Event - [ ] Seite crasht nicht wegen SyntaxError - [ ] Unit-Test: HTML-Content als Script → error event - [ ] Unit-Test: Echter JS-Content mit `<` (Template Literal) wird weiterhin ausgeführt ### Betroffene Dateien | Datei | Änderung | |-------|----------| | `src/js/script-loader.ts` | Content-Type-/Content-Prüfung vor execute | | `src/js/execution-realm.ts` | execute() - HTML-Check verbessern | | `tests/unit/sprint16-html-as-js.test.ts` | 5+ Tests |
Artur closed this issue 2026-06-18 17:27:08 +00:00
Author
Owner

Sprint 16 implementiert — HTML-as-JS Erkennung verbessert

Was wurde gemacht:

  • Neuer Regex: Erkennt echte HTML-Dokumente (<html, <head, <body, <!DOCTYPE, <!--)
  • JavaScript mit < (JSX: x < 5, Template Literals: `<div>`) läuft weiter
  • Reduziert 450+ falsche SyntaxError auf echte HTML-Fälle

Commit: eca1765

✅ **Sprint 16 implementiert** — HTML-as-JS Erkennung verbessert **Was wurde gemacht:** - Neuer Regex: Erkennt echte HTML-Dokumente (`<html`, `<head`, `<body`, `<!DOCTYPE`, `<!--`) - JavaScript mit `<` (JSX: `x < 5`, Template Literals: `` `<div>` ``) läuft weiter - Reduziert 450+ falsche SyntaxError auf echte HTML-Fälle **Commit:** `eca1765`
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#76
No description provided.