diff --git a/qa/probe_csp.mjs b/qa/probe_csp.mjs new file mode 100644 index 0000000..c964945 --- /dev/null +++ b/qa/probe_csp.mjs @@ -0,0 +1,20 @@ +import { chromium } from "playwright"; +const args = ["--host-resolver-rules=MAP canvas.flow-master.ai 65.21.71.186", "--ignore-certificate-errors"]; +const b = await chromium.launch({ headless: true, args }); +const p = await (await b.newContext()).newPage(); +const cspViolations = []; +const consoleErrors = []; +p.on("console", (msg) => { + if (msg.type() === "error") consoleErrors.push(msg.text()); + if (msg.text().includes("Content Security Policy")) cspViolations.push(msg.text()); +}); +p.on("pageerror", (err) => consoleErrors.push(`PAGE ERROR: ${err.message}`)); +await p.goto("https://canvas.flow-master.ai/", { waitUntil: "networkidle" }); +await p.waitForTimeout(2000); +const loginVisible = await p.locator(".login-page").count(); +console.log(`login page visible: ${loginVisible === 1 ? "YES" : "NO"}`); +console.log(`csp violations: ${cspViolations.length}`); +cspViolations.forEach((v) => console.log(" -", v.slice(0, 150))); +console.log(`console errors: ${consoleErrors.length}`); +consoleErrors.slice(0, 5).forEach((e) => console.log(" -", e.slice(0, 150))); +await b.close(); diff --git a/src/scenes/Chat.tsx b/src/scenes/Chat.tsx index 39f88ed..8500543 100644 --- a/src/scenes/Chat.tsx +++ b/src/scenes/Chat.tsx @@ -212,7 +212,7 @@ export default function Chat() { >
{t.display_name} - {preview && {relativeTime(preview.created_at)}} + {preview ? relativeTime(preview.created_at) : "—"}
{previewBody}
{unread && }