Files
linuxcncWebWASM/scripts/test_browser_opfs_firefox_s6_05.mjs

54 lines
2.9 KiB
JavaScript

import { createServer } from "node:http";
import { readFile } from "node:fs/promises";
import { join, normalize } from "node:path";
import { pathToFileURL } from "node:url";
const root = new URL("../web/", import.meta.url).pathname.replace(/\/$/, "");
const seleniumRoot = process.env.SELENIUM_ROOT;
function result(status, code = null, extra = {}) {
console.log(JSON.stringify({ schema: "browser-opfs-s6-05-firefox-sample.v1", status, browser: "firefox", ...extra, ...(code ? { code } : {}) }));
}
if (!seleniumRoot) {
result("blocked", "selenium_unavailable", { reason: "SELENIUM_ROOT is not set" });
} else {
let server;
let driver;
try {
const { Builder } = await import(pathToFileURL(join(seleniumRoot, "node_modules/selenium-webdriver/index.js")).href);
const firefox = await import(pathToFileURL(join(seleniumRoot, "node_modules/selenium-webdriver/firefox.js")).href);
server = createServer(async (request, response) => {
const requested = (request.url ?? "/").split("?")[0];
const file = normalize(join(root, requested === "/" ? "/app/browser-opfs-probe.html" : requested));
try {
const body = await readFile(file);
response.writeHead(200, { "content-type": file.endsWith(".html") ? "text/html" : "text/javascript", "cache-control": "no-store" });
response.end(body);
} catch {
if (!response.headersSent) { response.writeHead(404); response.end(); }
}
});
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
const port = server.address().port;
const options = new firefox.Options().setBinary(process.env.FIREFOX_BINARY || "/snap/firefox/current/usr/lib/firefox/firefox").addArguments("-headless");
const service = new firefox.ServiceBuilder(process.env.GECKODRIVER || "/snap/bin/geckodriver");
driver = await new Builder().forBrowser("firefox").setFirefoxOptions(options).setFirefoxService(service).build();
await driver.get(`http://127.0.0.1:${port}/app/browser-opfs-probe.html?mode=round_trip`);
let text = "pending";
for (let attempt = 0; attempt < 150; attempt += 1) {
text = await driver.executeScript("return document.querySelector('#result')?.textContent ?? 'pending';");
if (text !== "pending") break;
await new Promise((resolve) => setTimeout(resolve, 100));
}
const probe = JSON.parse(text);
if (probe.status !== "verified") throw new Error(probe.code ?? "firefox_opfs_probe_blocked");
result("verified", null, { browser_version: await driver.executeScript("return navigator.userAgent"), mode: probe.mode, project_id: probe.project_id, bytes: probe.bytes, commit_seq: probe.commit_seq, content_hash: probe.content_hash, cleanup: probe.cleanup });
} catch (error) {
result("blocked", "firefox_opfs_probe_failed", { reason: error?.message ?? error?.name ?? String(error) });
} finally {
await driver?.quit().catch(() => {});
server?.close();
}
}