annotate mrjunejune/test/latex_editor_test.js @ 247:70f2a3dafc1c

[build] Bundle offline Tectonic runtime Co-authored-by: Copilot <[email protected]>
author MrJuneJune <me@mrjunejune.com>
date Mon, 03 Aug 2026 20:20:06 -0700
parents 4f2b50bc78e7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
1 const assert = require('node:assert/strict');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
2 const fs = require('node:fs');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
3 const http = require('node:http');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
4 const net = require('node:net');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
5 const path = require('node:path');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
6 const { spawn } = require('node:child_process');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
7
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
8 const RUNFILES = process.env.JS_BINARY__RUNFILES;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
9 const WORKSPACE = process.env.JS_BINARY__WORKSPACE;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
10 const runfilesWorkspace = path.join(RUNFILES, WORKSPACE);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
11 const playwrightPath = path.join(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
12 runfilesWorkspace,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
13 'hg-web/e2e/node_modules/playwright-core',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
14 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
15 const { chromium } = require(playwrightPath);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
16
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
17 function findFreePort() {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
18 return new Promise((resolve, reject) => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
19 const socket = net.createServer();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
20 socket.once('error', reject);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
21 socket.listen(0, '127.0.0.1', () => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
22 const address = socket.address();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
23 socket.close(error => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
24 if (error) reject(error);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
25 else resolve(String(address.port));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
26 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
27 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
28 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
29 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
30
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
31 async function waitForServer(server, baseUrl, logs) {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
32 const deadline = Date.now() + 15000;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
33 while (Date.now() < deadline) {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
34 if (server.exitCode !== null) {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
35 throw new Error(`Server exited with ${server.exitCode}\n${logs.join('')}`);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
36 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
37 try {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
38 const response = await fetch(baseUrl);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
39 if (response.ok) return;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
40 } catch {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
41 // Keep waiting for startup.
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
42 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
43 await new Promise(resolve => setTimeout(resolve, 100));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
44 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
45 throw new Error(`Server startup timed out\n${logs.join('')}`);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
46 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
47
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
48 async function stopProcess(child) {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
49 if (!child || child.exitCode !== null) return;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
50 child.kill('SIGTERM');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
51 await new Promise(resolve => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
52 const timer = setTimeout(() => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
53 if (child.exitCode === null) child.kill('SIGKILL');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
54 }, 3000);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
55 child.once('exit', () => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
56 clearTimeout(timer);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
57 resolve();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
58 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
59 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
60 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
61
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
62 async function render(baseUrl, source) {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
63 return fetch(`${baseUrl}/api/latex/render`, {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
64 method: 'POST',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
65 headers: { 'Content-Type': 'text/plain; charset=utf-8' },
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
66 body: source,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
67 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
68 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
69
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
70 function requestWithoutReuse(baseUrl, method, requestPath, body = '') {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
71 const url = new URL(requestPath, baseUrl);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
72 return new Promise((resolve, reject) => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
73 const request = http.request({
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
74 host: url.hostname,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
75 port: url.port,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
76 path: url.pathname,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
77 method,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
78 agent: false,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
79 headers: {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
80 Connection: 'close',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
81 'Content-Type': 'text/plain; charset=utf-8',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
82 'Content-Length': Buffer.byteLength(body),
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
83 },
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
84 }, response => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
85 const chunks = [];
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
86 response.on('data', chunk => chunks.push(chunk));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
87 response.on('end', () => resolve({
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
88 status: response.statusCode,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
89 body: Buffer.concat(chunks),
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
90 }));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
91 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
92 request.on('error', reject);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
93 request.end(body);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
94 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
95 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
96
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
97 (async () => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
98 assert.ok(RUNFILES);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
99 assert.ok(WORKSPACE);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
100 const serverBinary = path.join(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
101 runfilesWorkspace,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
102 'mrjunejune/mrjunejune_server',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
103 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
104 const chromiumPath = path.resolve(process.env.CHROMIUM_PATH);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
105 const port = await findFreePort();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
106 const baseUrl = `http://127.0.0.1:${port}`;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
107 const logs = [];
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
108 let server;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
109 let browser;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
110
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
111 try {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
112 server = spawn(serverBinary, [], {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
113 cwd: runfilesWorkspace,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
114 env: {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
115 ...process.env,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
116 MRJUNEJUNE_PORT: port,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
117 },
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
118 stdio: ['ignore', 'pipe', 'pipe'],
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
119 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
120 server.stdout.on('data', chunk => logs.push(chunk.toString()));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
121 server.stderr.on('data', chunk => logs.push(chunk.toString()));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
122 await waitForServer(server, baseUrl, logs);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
123
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
124 const valid = String.raw`\documentclass{article}
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
125 \begin{document}
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
126 Hello from the API. $a^2 + b^2 = c^2$
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
127 \end{document}
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
128 `;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
129 let response = await render(baseUrl, valid);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
130 assert.equal(response.status, 200, await response.clone().text());
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
131 assert.match(response.headers.get('content-type') || '', /^application\/pdf/);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
132 assert.equal(response.headers.get('cache-control'), 'no-store');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
133 const pdf = Buffer.from(await response.arrayBuffer());
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
134 assert.ok(pdf.length > 1000);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
135 assert.equal(pdf.subarray(0, 5).toString(), '%PDF-');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
136
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
137 response = await render(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
138 baseUrl,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
139 String.raw`\documentclass{article}\begin{document}\badcommand\end{document}`,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
140 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
141 assert.equal(response.status, 422);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
142 assert.match(await response.text(), /Undefined control sequence/);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
143
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
144 response = await render(baseUrl, 'x'.repeat(64 * 1024 + 1));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
145 assert.equal(response.status, 413);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
146 assert.match(await response.text(), /64 KiB/);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
147
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
148 response = await render(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
149 baseUrl,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
150 String.raw`\documentclass{article}\begin{document}\input{/etc/passwd}\end{document}`,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
151 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
152 assert.equal(response.status, 422);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
153 assert.doesNotMatch(await response.text(), /root:x:/);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
154
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
155 const shellPath = `/tmp/mrjunejune-latex-browser-${process.pid}`;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
156 response = await render(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
157 baseUrl,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
158 String.raw`\documentclass{article}
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
159 \begin{document}
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
160 \immediate\write18{touch ${shellPath}}
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
161 Shell escape stays disabled.
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
162 \end{document}`,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
163 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
164 assert.equal(response.status, 200);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
165 assert.equal(fs.existsSync(shellPath), false);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
166
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
167 const infiniteRender = requestWithoutReuse(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
168 baseUrl,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
169 'POST',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
170 '/api/latex/render',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
171 String.raw`\documentclass{article}\begin{document}\loop\iftrue\repeat\end{document}`,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
172 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
173 await new Promise(resolve => setTimeout(resolve, 200));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
174 const healthStarted = Date.now();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
175 let isolatedResponse = await requestWithoutReuse(baseUrl, 'GET', '/tools');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
176 assert.equal(isolatedResponse.status, 200);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
177 assert.ok(Date.now() - healthStarted < 1500);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
178 isolatedResponse = await requestWithoutReuse(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
179 baseUrl,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
180 'POST',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
181 '/api/latex/render',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
182 valid,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
183 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
184 assert.equal(isolatedResponse.status, 429);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
185 assert.match(isolatedResponse.body.toString(), /compiler is busy/);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
186 isolatedResponse = await infiniteRender;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
187 assert.equal(isolatedResponse.status, 504);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
188 assert.match(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
189 isolatedResponse.body.toString(),
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
190 /CPU or memory limit|8 second limit/,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
191 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
192
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
193 browser = await chromium.launch({
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
194 executablePath: chromiumPath,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
195 headless: true,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
196 args: ['--no-sandbox'],
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
197 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
198 const context = await browser.newContext();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
199 await context.addInitScript(() => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
200 window.__pdfUrls = { created: [], revoked: [] };
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
201 const createObjectURL = URL.createObjectURL.bind(URL);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
202 const revokeObjectURL = URL.revokeObjectURL.bind(URL);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
203 URL.createObjectURL = value => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
204 const url = createObjectURL(value);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
205 window.__pdfUrls.created.push(url);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
206 return url;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
207 };
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
208 URL.revokeObjectURL = url => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
209 window.__pdfUrls.revoked.push(url);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
210 revokeObjectURL(url);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
211 };
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
212 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
213 const page = await context.newPage();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
214 const browserErrors = [];
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
215 let testingExpectedFailure = false;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
216 page.on('pageerror', error => browserErrors.push(error.message));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
217 page.on('console', message => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
218 if (message.type() !== 'error') return;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
219 if (testingExpectedFailure &&
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
220 message.text().startsWith('Failed to load resource:')) return;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
221 browserErrors.push(message.text());
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
222 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
223
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
224 await page.goto(`${baseUrl}/tools/latex_editor`, {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
225 waitUntil: 'networkidle',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
226 });
247
70f2a3dafc1c [build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents: 246
diff changeset
227 await page.waitForFunction(() => {
70f2a3dafc1c [build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents: 246
diff changeset
228 const state = document.querySelector('#latexStatus')?.dataset.state;
70f2a3dafc1c [build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents: 246
diff changeset
229 return state === 'ready' || state === 'error';
70f2a3dafc1c [build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents: 246
diff changeset
230 }, null, {
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
231 timeout: 15000,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
232 });
247
70f2a3dafc1c [build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents: 246
diff changeset
233 assert.equal(
70f2a3dafc1c [build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents: 246
diff changeset
234 await page.locator('#latexStatus').getAttribute('data-state'),
70f2a3dafc1c [build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents: 246
diff changeset
235 'ready',
70f2a3dafc1c [build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents: 246
diff changeset
236 await page.locator('#latexDiagnostics').textContent(),
70f2a3dafc1c [build] Bundle offline Tectonic runtime
MrJuneJune <me@mrjunejune.com>
parents: 246
diff changeset
237 );
246
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
238 const editorAppearance = await page.locator('#latexSource').evaluate(element => {
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
239 const style = getComputedStyle(element);
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
240 const bounds = element.getBoundingClientRect();
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
241 return {
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
242 background: style.backgroundColor,
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
243 color: style.color,
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
244 display: style.display,
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
245 height: bounds.height,
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
246 value: element.value,
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
247 width: bounds.width,
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
248 };
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
249 });
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
250 assert.equal(editorAppearance.display, 'block');
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
251 assert.ok(editorAppearance.width > 300, JSON.stringify(editorAppearance));
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
252 assert.ok(editorAppearance.height > 400, JSON.stringify(editorAppearance));
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
253 assert.notEqual(editorAppearance.background, editorAppearance.color);
4f2b50bc78e7 [tools] Fix LaTeX editor visibility
MrJuneJune <me@mrjunejune.com>
parents: 245
diff changeset
254 assert.match(editorAppearance.value, /\\documentclass/);
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
255 assert.match(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
256 await page.locator('#pdfPreview').getAttribute('src'),
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
257 /^blob:/,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
258 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
259 assert.equal(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
260 await page.locator('#downloadButton').getAttribute('download'),
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
261 'document.pdf',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
262 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
263
245
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
264 let livePreviewRequests = 0;
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
265 const countLivePreviewRequest = request => {
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
266 if (request.url().endsWith('/api/latex/render')) livePreviewRequests++;
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
267 };
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
268 page.on('request', countLivePreviewRequest);
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
269 const livePreviewResponse = page.waitForResponse(response =>
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
270 response.url().endsWith('/api/latex/render') &&
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
271 response.status() === 200
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
272 );
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
273 await page.locator('#latexSource').fill(valid.replace('API.', 'API change one.'));
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
274 await page.waitForTimeout(100);
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
275 await page.locator('#latexSource').fill(valid.replace('API.', 'API change two.'));
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
276 await page.waitForTimeout(100);
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
277 await page.locator('#latexSource').fill(valid.replace('API.', 'API final change.'));
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
278 await livePreviewResponse;
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
279 await page.locator('#latexStatus[data-state="ready"]').waitFor();
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
280 page.off('request', countLivePreviewRequest);
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
281 assert.equal(livePreviewRequests, 1);
3843bb6253ac [tools] Debounce live LaTeX preview
MrJuneJune <me@mrjunejune.com>
parents: 244
diff changeset
282
244
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
283 await page.locator('#autoCompile').uncheck();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
284 await page.locator('#latexSource').fill(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
285 String.raw`\documentclass{article}\begin{document}\badcommand\end{document}`,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
286 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
287 testingExpectedFailure = true;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
288 await page.getByRole('button', { name: 'Compile PDF' }).click();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
289 await page.locator('#latexStatus[data-state="error"]').waitFor();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
290 testingExpectedFailure = false;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
291 assert.match(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
292 await page.locator('#latexDiagnostics').textContent(),
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
293 /Undefined control sequence/,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
294 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
295
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
296 await page.locator('#latexSource').fill(valid);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
297 await page.getByRole('button', { name: 'Compile PDF' }).click();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
298 await page.locator('#latexStatus[data-state="ready"]').waitFor();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
299 const objectUrls = await page.evaluate(() => window.__pdfUrls);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
300 assert.ok(objectUrls.created.length >= 2, JSON.stringify(objectUrls));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
301 assert.ok(objectUrls.revoked.length >= 1, JSON.stringify(objectUrls));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
302
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
303 let delayNextRender = true;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
304 await page.route('**/api/latex/render', async route => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
305 if (!delayNextRender) {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
306 await route.continue();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
307 return;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
308 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
309 delayNextRender = false;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
310 await new Promise(resolve => setTimeout(resolve, 300));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
311 try {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
312 await route.fulfill({
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
313 status: 200,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
314 contentType: 'application/pdf',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
315 body: pdf,
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
316 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
317 } catch {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
318 // The corrected client aborts this stale request.
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
319 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
320 });
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
321 await page.locator('#latexSource').fill(valid);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
322 await page.getByRole('button', { name: 'Compile PDF' }).click();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
323 await page.locator('#latexStatus[data-state="working"]').waitFor();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
324 await page.locator('#latexSource').fill('x'.repeat(64 * 1024 + 1));
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
325 await page.locator('#latexStatus[data-state="error"]').waitFor();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
326 await page.waitForTimeout(500);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
327 assert.equal(
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
328 await page.locator('#latexStatus').getAttribute('data-state'),
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
329 'error',
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
330 );
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
331 await page.unroute('**/api/latex/render');
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
332
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
333 assert.deepEqual(browserErrors, []);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
334 await context.close();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
335 } finally {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
336 if (browser) await browser.close();
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
337 await stopProcess(server);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
338 }
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
339 })().catch(error => {
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
340 console.error(error.stack || error);
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
341 process.exitCode = 1;
b8aa08503378 [tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
342 });