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:
@@ -1841,6 +1841,9 @@ const Studio = {
|
|||||||
// Die Oberflaeche nutzt das nicht mehr, zeigt einen so gestarteten Lauf
|
// Die Oberflaeche nutzt das nicht mehr, zeigt einen so gestarteten Lauf
|
||||||
// aber korrekt an, denn er kann aus der klassischen Ansicht kommen.
|
// aber korrekt an, denn er kann aus der klassischen Ansicht kommen.
|
||||||
_CANCELLABLE: ['collect', 'full'],
|
_CANCELLABLE: ['collect', 'full'],
|
||||||
|
// 'network' hat keine Karte mehr, das Label bleibt trotzdem stehen. Kaeme
|
||||||
|
// der Baustein im Server, meldete ein laufender Schritt sonst nur seinen
|
||||||
|
// technischen Schluessel.
|
||||||
_STAGE_LABELS: {
|
_STAGE_LABELS: {
|
||||||
collect: 'Artikel holen', analyze: 'Lagebild schreiben',
|
collect: 'Artikel holen', analyze: 'Lagebild schreiben',
|
||||||
factcheck: 'Fakten prüfen', geoparse: 'Orte erkennen',
|
factcheck: 'Fakten prüfen', geoparse: 'Orte erkennen',
|
||||||
|
|||||||
@@ -76,6 +76,35 @@ pruefe("B4 Panel vorhanden", '<div class="tab-panel" data-art="settings">' in st
|
|||||||
pruefe("B5 activateTab kennt den Reiter",
|
pruefe("B5 activateTab kennt den Reiter",
|
||||||
"if (key === 'settings') this.loadSettings();" in studio_js)
|
"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")
|
print("\nC) Jedes onclick zeigt auf eine vorhandene Methode")
|
||||||
for name, html, js, praefix in [
|
for name, html, js, praefix in [
|
||||||
("studio", studio_html, studio_js, "Studio"),
|
("studio", studio_html, studio_js, "Studio"),
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren