# Qualitätsbericht – erster ausführbarer Prototyp ## Ergänzung: Verwaltung neu gestaltet, 12.09.2026 - **201 PHP-Tests / 716 Assertions** grün, Playwright-Editortest mit axe ohne Verstöße auf **Anmeldung, Seitenübersicht und Editor** (Desktop und Mobil), öffentliche Browserprüfung unverändert grün. - Zwei Testselektoren zeigten auf Klassen, die die Umgestaltung umbenannt hat; sie prüfen jetzt dieselbe Sache über den neuen Namen. Die Klasse, an der die Rechteprüfung für das endgültige Löschen hängt, ist absichtlich geblieben. - **Der Browsertest hat einen Fehler gefunden, den ich selbst eingebaut hatte.** Beim Zerlegen des Stylesheets schnitt mein Skript am Ende jedes `@media`-Blocks alle schließenden Klammern ab statt nur einer. Damit war `editor.css` ab dem ersten Medienblock ungültig: der Browser behielt 29 von 202 Regeln. Aufgefallen ist es an einer Vorschaubreite von 1236 statt 1240 Pixeln, weil der Standardrahmen des iframe nicht mehr entfernt wurde – vier Pixel als einziges Symptom dafür, dass dreiviertel des Editor-Stylesheets fehlte. Behoben, und die Datei wird jetzt auf ausgeglichene Klammern geprüft. - **Nicht geprüft:** kein Screenreader. Die Bildschirme Menüs, Formulare, Bereiche, Design, Einstellungen und Fassungen habe ich im Browser angesehen und ihre Tabellen und Formulare bedient, aber die automatische Barrierefreiheitsprüfung deckt sie nicht ab – sie prüft Anmeldung, Seitenübersicht und Editor. - Der Editor selbst behält seinen Aufbau. Er übernimmt die neuen Farben, Schaltflächen und die Systemschrift, ist aber nicht neu gestaltet worden. ## Ergänzung: Verwaltung neu gestaltet, 12.09.2026 - **201 PHP-Tests / 716 Assertions** grün, Playwright-Editortest mit axe ohne Verstöße auf **Anmeldung, Seitenübersicht und Editor** (Desktop und Mobil), öffentliche Browserprüfung unverändert grün. - Zwei Testselektoren zeigten auf Klassen, welche die Umgestaltung umbenannt hat; sie prüfen jetzt dieselbe Sache über den neuen Namen. Die Klasse, an der die Rechteprüfung für das endgültige Löschen hängt, ist absichtlich geblieben. - **Der Browsertest hat einen Fehler gefunden, den ich selbst eingebaut hatte.** Beim Zerlegen des Stylesheets schnitt mein Skript am Ende jedes `@media`-Blocks alle schließenden Klammern ab statt nur einer. Damit war `editor.css` ab dem ersten Medienblock ungültig: der Browser behielt 29 von 202 Regeln. Aufgefallen ist es an einer Vorschaubreite von 1236 statt 1240 Pixeln, weil der Standardrahmen des iframe nicht mehr entfernt wurde – vier Pixel als einziges Anzeichen dafür, dass dreiviertel des Editor-Stylesheets fehlte. Behoben und mit ausgeglichenen Klammern nachgerechnet. - Von Hand bedient: Seitenübersicht mit Aufklappfeld, Menüs, Formulare, Bereiche, Design, Einstellungen, Mediathek und der Editor in allen drei Vorschaugrößen. - **Nicht geprüft:** kein Screenreader. Die automatische Barrierefreiheitsprüfung deckt Anmeldung, Seitenübersicht und Editor ab, nicht die übrigen Verwaltungsbildschirme. ## Ergänzung: eigenes CSS und eigenes Skript, 12.09.2026 - **201 PHP-Tests / 716 Assertions** unter PHP 8.2.12 und PHP 8.4.22, **15 JavaScript-Modelltests**, der vollständige Playwright-Editortest mit axe (null Verstöße) und die öffentliche Browserprüfung. - **Zehn abgewiesene CSS-Eingaben** erreichen kein Dokument, darunter die Ausbruchsversuche: `color:red} body{display:none`, ein fremder Selektor `body { … }`, `@import`, `@media`, `url(javascript:alert(1))`, `url(//fremd.example/x.png)`, ein Backslash-Escape und `expression()`. - Fünf erlaubte CSS-Formen werden korrekt auf das Element bezogen, einschließlich `& > p` und `& .block-text`. - **Zwei echte Löcher kamen dabei heraus.** `& .block-text` wurde zu `#id.block-text`, weil das führende Leerzeichen wegtrimmt wurde – aus dem Nachfahren wurde derselbe Knoten, die Regel traf das falsche Element. Und `url(//fremd.example/x.png)` kam durch, weil jede Adresse mit `/` erlaubt war: eine protokollrelative Adresse hätte über das Schema der Seite von Dritten geladen. Beides behoben, beides durch einen Test abgedeckt. - Skriptauslieferung geprüft: eigenes Skript erscheint **nie** im HTML, sondern nur unter `/assets/seite/{id}.js` mit `text/javascript`, in einer eigenen Closure mit gesuchtem `element`. Die Seite mit Skript sendet `script-src 'self'`, eine Seite ohne behält `script-src 'none'` und liefert für ihre Adresse 404. **Ein Skript aus einem gespeicherten, aber unveröffentlichten Entwurf wird nicht ausgeliefert.** - Rollenprüfung geprüft: der Vergleich mit dem gespeicherten Stand weist Ändern, Entfernen und Hinzufügen eines Skripts ab und lässt ein unverändertes Skript durch – ein Editor kann eine Seite mit Skript also weiter bearbeiten, ohne das Skript anfassen zu können. - **Nicht geprüft:** der Reiter „Erweitert“ ist nicht von Hand bedient und nicht mit einem Screenreader getestet. Ob ein eingesetztes Skript im Browser tatsächlich läuft, ist ebenfalls nicht ausgeführt worden – geprüft ist, dass die Datei mit dem erwarteten Inhalt ausgeliefert wird und dass die Richtlinie sie zulässt. ## Ergänzung: formatierter Text, 12.09.2026 - **182 PHP-Tests / 685 Assertions** unter PHP 8.2.12 und PHP 8.4.22, **15 JavaScript-Modelltests**, der vollständige Playwright-Editortest mit axe (null Verstöße) und die öffentliche Browserprüfung. - **Dreizehn Fälle durch den Filter**, davon acht Angriffe: `Text danach` behält nur den Text, ein `onclick`-Attribut verschwindet, `class` und `style` verschwinden mitsamt dem Element (der Text bleibt), ein `javascript:`-Link wird zu Text, ein `` verschwindet vollständig, ein `