From 78cbccfaeaba943c1ad959cc8f53b63bf8c3784e Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Tue, 25 Nov 2025 00:59:20 +0100 Subject: [PATCH] fakecheck --- public/assets/js/fakecheck.js | 67 ++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/public/assets/js/fakecheck.js b/public/assets/js/fakecheck.js index e92addc..9c9f8e5 100644 --- a/public/assets/js/fakecheck.js +++ b/public/assets/js/fakecheck.js @@ -136,6 +136,8 @@ document.addEventListener("DOMContentLoaded", () => { return "showDirectoryPicker" in window; } + // Kann theoretisch bleiben, wird aktuell aber NICHT benutzt, + // damit showDirectoryPicker direkt im Click-Handler liegt. async pickDirectory() { if (!this.hasFsApiSupport()) { throw new Error("File System Access API wird von diesem Browser nicht unterstützt."); @@ -495,25 +497,46 @@ document.addEventListener("DOMContentLoaded", () => { // --- Event-Handler ------------------------------------------------------ + // WICHTIG: showDirectoryPicker direkt im Click-Handler (ohne async/await), + // damit "User activation is required" nicht mehr triggert. + let isPickingDir = false; + if (btnPickDir) { - btnPickDir.addEventListener("click", async () => { - try { - const handle = await tester.pickDirectory(); - if (selectedPathText) { - selectedPathText.textContent = - 'USB-Ordner ausgewählt (Name: "' + (handle.name || "Unbekannt") + '").'; - } - if (btnClearSel) btnClearSel.disabled = false; - setStatus("USB-Verzeichnis ausgewählt. Wähle jetzt einen Testmodus."); - logLine("Verzeichnis ausgewählt: " + (handle.name || "[ohne Namen]")); - updateStartButtonState(); - } catch (err) { - if (err.name === "AbortError") { - logLine("Verzeichnisauswahl abgebrochen.", "warn"); - } else { - logLine("Fehler bei Verzeichnisauswahl: " + err.message, "error"); - } + btnPickDir.addEventListener("click", () => { + if (isPickingDir) return; // Doppelklick-Schutz + isPickingDir = true; + + if (!("showDirectoryPicker" in window)) { + logLine("File System Access API wird von diesem Browser nicht unterstützt.", "error"); + if (fsapiWarning) fsapiWarning.style.display = "block"; + isPickingDir = false; + return; } + + window.showDirectoryPicker() + .then((handle) => { + tester.rootHandle = handle; + if (selectedPathText) { + selectedPathText.textContent = + 'USB-Ordner ausgewählt (Name: "' + (handle.name || "Unbekannt") + '").'; + } + if (btnClearSel) btnClearSel.disabled = false; + setStatus("USB-Verzeichnis ausgewählt. Wähle jetzt einen Testmodus."); + logLine("Verzeichnis ausgewählt: " + (handle.name || "[ohne Namen]")); + updateStartButtonState(); + }) + .catch((err) => { + if (err && err.name === "AbortError") { + logLine("Verzeichnisauswahl abgebrochen.", "warn"); + } else if (err) { + logLine("Fehler bei Verzeichnisauswahl: " + err.message, "error"); + } else { + logLine("Unbekannter Fehler bei Verzeichnisauswahl.", "error"); + } + }) + .finally(() => { + isPickingDir = false; + }); }); } @@ -578,14 +601,18 @@ document.addEventListener("DOMContentLoaded", () => { // Ergebnis speichern: Backend entscheidet, ob der User eingeloggt ist await saveReportToBackend(report); } catch (err) { - if (err.name === "AbortError") { + if (err && err.name === "AbortError") { setStatus("Test wurde abgebrochen."); setOverallStatus("warn", "Test abgebrochen."); logLine("Test wurde vom Benutzer abgebrochen.", "warn"); - } else { + } else if (err) { setStatus("Fehler: " + err.message); setOverallStatus("bad", "Fehler im Browser-Test."); logLine("Fehler im Test: " + err.message, "error"); + } else { + setStatus("Unbekannter Fehler im Test."); + setOverallStatus("bad", "Fehler im Browser-Test."); + logLine("Unbekannter Fehler im Test.", "error"); } } finally { isRunning = false; @@ -689,7 +716,7 @@ document.addEventListener("DOMContentLoaded", () => { ); } catch (err) { if (saveError) saveError.style.display = "block"; - logLine("Fehler beim Speichern im Backend: " + err.message, "error"); + logLine("Fehler beim Speichern im Backend: " + (err ? err.message : "unbekannt"), "error"); } }