Files
pdf/tests/edits/forensic_wasm_keystroke.mjs
T
2026-07-31 10:50:37 +05:30

58 lines
2.1 KiB
JavaScript

/** Compare first-keystroke layouts in the SHIPPED browser WASM. */
import { readFileSync, writeFileSync } from "node:fs";
import { resolve, dirname } from "node:path";
import { fileURLToPath, pathToFileURL } from "node:url";
const here = dirname(fileURLToPath(import.meta.url));
const repo = resolve(here, "../../");
const payloads = JSON.parse(readFileSync(resolve(here, "forensic_real/wasm_keystroke_payloads.json"), "utf8"));
const pdfBytes = readFileSync(payloads.pdf);
const mjsPath = resolve(repo, "frontend/public/pdfium-engine.mjs");
const wasmPath = resolve(repo, "frontend/public/pdfium-engine.wasm");
const { default: createModule } = await import(pathToFileURL(mjsPath).href);
const Module = await createModule({
locateFile: (p) => (p.endsWith(".wasm") ? wasmPath : p),
});
const ptr = Module._malloc(pdfBytes.length);
Module.HEAPU8.set(pdfBytes, ptr);
const handle = Module.ccall("loadDocument", "number", ["number", "number"], [ptr, pdfBytes.length]);
Module._free(ptr);
function run(label, op) {
Module.ccall("previewRender", "number", ["number", "number", "number", "string"], [
handle, 0, 144, JSON.stringify(op),
]);
const layoutJson = Module.ccall("lastLayoutJson", "string", [], []) || "{}";
const layout = JSON.parse(layoutJson);
const line = layout.lines?.[0];
const adv = line?.adv || [];
const seed = payloads.seed_adv;
let firstAdvDiff = null;
for (let i = 0; i < Math.min(seed.length, adv.length); i++) {
if (Math.abs(seed[i] - adv[i]) > 0.05) {
firstAdvDiff = { i, seed: seed[i], got: adv[i], ch: "Professional Experience"[i] };
break;
}
}
return {
label,
text: line?.text,
x0: line?.x0,
advLen: adv.length,
advPrefix: adv.slice(0, 8),
seedPrefix: seed.slice(0, 8),
firstAdvDiff,
prefixAdvancesMatch: firstAdvDiff === null && adv.length >= seed.length,
};
}
const results = {};
for (const [k, op] of Object.entries(payloads.payloads)) {
results[k] = run(k, op);
}
writeFileSync(resolve(here, "forensic_real/wasm_keystroke_compare.json"), JSON.stringify(results, null, 2));
console.log(JSON.stringify(results, null, 2));
Module.ccall("freeDocument", null, ["number"], [handle]);