test(studio): Zugriffe auf nicht vorhandene Elemente werden geprüft
Nachtrag aus der Endkontrolle nach dem Umbau der Bausteinspalte. Ein getElementById auf ein entferntes Element scheitert still, genau das wäre beim Entfernen der Artefakt-Karten leicht passiert. Die Strukturprüfung gleicht jetzt jede gesuchte ID gegen das Dokument ab, inklusive der zur Laufzeit erzeugten. Für studio.js sind alle 109 Zugriffe sauber. In app.js sind fünf Verweise ins Leere aufgefallen, alle aus der Domain-Sperrliste im Quellen-Modal und alle hinter einer Existenzprüfung, showBlockDomainDialog kehrt bei fehlendem Formular sofort zurück. Kein Absturzrisiko, aber toter Code. Sie stehen als bekannte Altlast in der Prüfung, werden gemeldet und zählen nicht als Fehler. Ein neuer Fall fällt weiterhin auf. Dazu ein Kommentar am Label der Netzwerkanalyse, das ohne zugehörige Karte stehen bleibt, damit später niemand rätselt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -76,6 +76,35 @@ pruefe("B4 Panel vorhanden", '<div class="tab-panel" data-art="settings">' in st
|
||||
pruefe("B5 activateTab kennt den Reiter",
|
||||
"if (key === 'settings') this.loadSettings();" in studio_js)
|
||||
|
||||
# Bekannte tote Verweise aus der Domain-Sperrliste im Quellen-Modal. Alle
|
||||
# Zugriffe liegen hinter einer Existenzpruefung (showBlockDomainDialog kehrt
|
||||
# bei fehlendem Formular sofort zurueck), es droht also kein Absturz. Sie
|
||||
# werden gemeldet, zaehlen aber nicht als Fehler, damit die Pruefung nicht
|
||||
# dauerhaft rot steht und niemand mehr hinsieht.
|
||||
ALTLASTEN = {
|
||||
"block-domain-input", "block-domain-notes", "source-overview-chevron",
|
||||
"sources-block-form", "sources-hint",
|
||||
}
|
||||
|
||||
print("\nB2) Kein Zugriff auf Elemente, die es nicht gibt")
|
||||
# Ein getElementById auf ein entferntes Element scheitert still. Beim Umbau
|
||||
# der Bausteinspalte waere genau das leicht passiert.
|
||||
for name, js_quelle, html_quelle in [("studio", studio_js, studio_html),
|
||||
("dashboard", app_js, dash_html)]:
|
||||
vorhanden = set(re.findall(r'\bid="([^"]+)"', html_quelle))
|
||||
# Was das Skript selbst erzeugt, steht nicht im Dokument
|
||||
vorhanden |= set(re.findall(r"\.id = '([^']+)'", js_quelle))
|
||||
vorhanden |= set(re.findall(r'id="([^"]+)"', js_quelle))
|
||||
vorhanden |= set(re.findall(r'\bid="([^"]+)"', comp_js))
|
||||
gesucht = set(re.findall(r"getElementById\('([^']+)'\)", js_quelle))
|
||||
fehlend = sorted(g for g in gesucht if g not in vorhanden)
|
||||
neue = [g for g in fehlend if g not in ALTLASTEN]
|
||||
pruefe(f"B2 {name}.js greift nur auf vorhandene Elemente zu "
|
||||
f"({len(gesucht)} geprueft)", not neue, neue)
|
||||
bekannt = [g for g in fehlend if g in ALTLASTEN]
|
||||
if bekannt:
|
||||
print(f" bekannte Altlast, abgesichert: {', '.join(bekannt)}")
|
||||
|
||||
print("\nC) Jedes onclick zeigt auf eine vorhandene Methode")
|
||||
for name, html, js, praefix in [
|
||||
("studio", studio_html, studio_js, "Studio"),
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren