Test: laesst den Service Worker jetzt wirklich arbeiten

Die Luecke, durch die der Fehler von heute bis zum Benutzer
durchgerutscht ist.

Der Test hat 48 Seiten in einem echten Browser geoeffnet und nichts
bemerkt -- weil er den Service Worker nie hat arbeiten lassen. Er war
gruen und wertlos zugleich: Der entscheidende Weg wurde nicht
begangen.

Neu geprueft wird jetzt:
  - der Service Worker meldet sich an und wird aktiv
  - er darf tatsaechlich etwas abrufen (das war der kaputte Punkt)
  - dabei entsteht kein Richtlinien-Verstoss
  - sw.js traegt selbst KEINE Richtlinie, denn sie wuerde zu SEINER

Ausserdem umgedreht: Ein Test verlangte fuer Nicht-Seiten ausdruecklich
"default-src 'none'" -- und sicherte damit genau den Fehler ab, der die
App lahmlegte. Er haette den naechsten Versuch, es richtig zu machen,
als Fehler gemeldet. Jetzt wird geprueft, dass CSS, JavaScript, Bilder
und der Service Worker KEINE Richtlinie bekommen.

22 Pruefungen gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-26 14:47:10 +02:00
co-authored by Claude Opus 5
parent 0f253df134
commit 77b395e2b4
+78 -3
View File
@@ -134,9 +134,84 @@ try {
fs.writeFileSync(pruefDatei, inhaltVorher, "utf8");
}
const a2 = await fetch("http://127.0.0.1:4408/assets/css/main.css");
pruefe(" auch fuer Nicht-Seiten (CSS)",
(a2.headers.get("content-security-policy") || "").includes("default-src 'none'"));
/* Umgedreht am 26.08.2026. Vorher verlangte dieser Test fuer
Nicht-Seiten ausdruecklich "default-src 'none'" -- und hat damit
genau den Fehler abgesichert, der die App lahmgelegt hat.
Eine Richtlinie steuert, was ein DOKUMENT nachladen darf. Ein
Stylesheet laedt nichts nach, dort ist sie wirkungslos. Bei einem
Service-Worker-Skript ist sie das Gegenteil von wirkungslos: Sie
wird zur Richtlinie des Workers und kann ihn stilllegen.
Deshalb gilt jetzt: Richtlinie nur fuer HTML. Ein Test, der das
Gegenteil verlangt, haette den naechsten Versuch, es richtig zu
machen, als Fehler gemeldet. */
for (const pfad of ["/assets/css/main.css", "/assets/js/wd-core.js",
"/webdesign/sw.js", "/assets/img/favicon.png"]) {
const a = await fetch("http://127.0.0.1:4408" + pfad);
const r = a.headers.get("content-security-policy");
pruefe(` ${pfad}: keine Richtlinie`, !r, r ? "hat eine: " + r.slice(0, 40) : "keine");
}
/* =====================================================================
2c. DER SERVICE WORKER MUSS ARBEITEN KOENNEN
⚠️ Dieser Abschnitt fehlte, und genau durch die Luecke ist am
26.08.2026 ein Fehler bis zum Benutzer durchgerutscht:
Die erste Fassung setzte fuer alles, was keine Seite ist,
"default-src 'none'" -- mit dem Gedanken "kostet nichts, schadet
nie". Ein Service Worker uebernimmt aber die Richtlinie, die beim
Herunterladen SEINER EIGENEN Skriptdatei galt. Mit 'none' darf er
nichts mehr abrufen; jede Anfrage scheitert, und er zeigt seine
Offline-Seite. Fuer den Benutzer sah das aus wie ein Netzausfall --
bei laufendem Server und einer Seite, die im Browser tadellos lud.
Der Test von damals hat alle 48 Seiten geoeffnet und nichts bemerkt,
weil er den Service Worker nie hat arbeiten lassen. Eine Pruefung,
die den entscheidenden Weg auslaesst, ist gruen und wertlos zugleich.
===================================================================== */
console.log("\n2c. KANN DER SERVICE WORKER ARBEITEN?");
{
const kontext = await browser.newContext({ serviceWorkers: "allow" });
const sw = await kontext.newPage();
const verstoesse = [];
sw.on("console", (m) => {
if (/Content Security Policy|Refused to/i.test(m.text())) verstoesse.push(m.text().slice(0, 110));
});
await sw.goto("http://127.0.0.1:4408/webdesign/zugang.html", { waitUntil: "networkidle" });
await sw.waitForTimeout(3500);
const stand = await sw.evaluate(async () => {
const r = await navigator.serviceWorker.getRegistration("/webdesign/");
return { da: !!r, aktiv: !!(r && r.active) };
});
pruefe(" Service Worker meldet sich an", stand.da, stand.aktiv ? "aktiv" : "noch nicht aktiv");
/* Der Kern: Ein Service Worker, der nichts holen darf, ist genau der
Fehler von damals -- und von aussen nicht zu sehen. */
const holen = await sw.evaluate(async () => {
try {
const a = await fetch("/assets/css/webdesign.css", { cache: "no-store" });
return { ok: a.ok, laenge: (await a.text()).length };
} catch (e) {
return { ok: false, fehler: String(e).slice(0, 70) };
}
});
pruefe(" er darf auch etwas abrufen", holen.ok,
holen.ok ? holen.laenge + " Bytes" : holen.fehler);
pruefe(" dabei kein Richtlinien-Verstoss", verstoesse.length === 0, verstoesse[0] || "sauber");
/* Und die Skriptdatei selbst darf keine Richtlinie mitbekommen -- sie
wuerde sonst zur Richtlinie des Workers. */
const kopf = (await fetch("http://127.0.0.1:4408/webdesign/sw.js"))
.headers.get("content-security-policy");
pruefe(" sw.js traegt selbst KEINE Richtlinie", !kopf, kopf || "keine — richtig so");
await kontext.close();
}
console.log("\n3. GEGENPROBE: VERBIETET SIE AUCH WIRKLICH ETWAS?");
/* Ohne diesen Abschnitt waere Teil 1 wertlos: Eine Richtlinie, die