/ concept-collection / shtns-webgpu
Sign in
concept-collection / shtns-webgpu
shtns-webgpu / scripts / screenshot.mjs
51 lines · 2.1 KBCodeBlameHistory
fe1c1afshtns-webgpu: fp32 spherical harmonic transforms on WebGPUJeremy Magland 1/** Screenshot the demo page (dist/) in headless Chrome. Usage: node scripts/screenshot.mjs out.png [light|dark] */
2import { createServer } from 'node:http';
3import { readFile } from 'node:fs/promises';
4import { extname, join } from 'node:path';
5import puppeteer from 'puppeteer-core';
7const out = process.argv[2] ?? 'demo.png';
8const scheme = process.argv[3] ?? 'light';
9const DIST = new URL('../dist/', import.meta.url).pathname;
10const MIME = { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css' };
12const server = createServer(async (req, res) => {
13 try {
14 const path = req.url === '/' ? '/index.html' : req.url.split('?')[0];
15 const data = await readFile(join(DIST, path));
16 res.writeHead(200, { 'content-type': MIME[extname(path)] ?? 'application/octet-stream' });
17 res.end(data);
18 } catch {
19 res.writeHead(404);
20 res.end();
21 }
22});
23await new Promise((r) => server.listen(0, '127.0.0.1', r));
24const port = server.address().port;
26const browser = await puppeteer.launch({
27 executablePath: process.env.CHROME_PATH ?? '/usr/bin/google-chrome',
28 args: ['--headless=new', '--no-sandbox', '--enable-unsafe-webgpu',
29 '--use-webgpu-adapter=swiftshader', '--enable-unsafe-swiftshader'],
30});
31const page = await browser.newPage();
32await page.setViewport({ width: 1000, height: 900 });
33await page.emulateMediaFeatures([{ name: 'prefers-color-scheme', value: scheme }]);
34page.on('console', (m) => console.log(' [page]', m.text()));
35await page.goto(`http://127.0.0.1:${port}/index.html`, { waitUntil: 'load' });
36await page.waitForFunction(
37 () => {
38 const s = document.getElementById('stats');
39 const e = document.getElementById('err');
40 return (s && /round-trip/.test(s.textContent)) || (e && e.textContent.length > 4);
41 },
42 { timeout: 120_000 },
43);
44await new Promise((r) => setTimeout(r, 300));
45await page.screenshot({ path: out });
46console.log('screenshot:', out);
47console.log('stats:', await page.$eval('#stats', (el) => el.textContent));
48const err = await page.$eval('#err', (el) => el.textContent);
49if (err) console.log('err:', err);
50await browser.close();
51server.close();
moveopenescclose