this repo has no description
1// test_crossorigin.js — Playwright test for cross-origin demo
2const { chromium } = require('playwright');
3
4(async () => {
5 const browser = await chromium.launch();
6 const page = await browser.newPage();
7
8 const consoleMessages = [];
9 page.on('console', msg => consoleMessages.push(msg.text()));
10
11 const errors = [];
12 page.on('pageerror', err => errors.push(err.message));
13
14 console.log('Navigating to demo4_crossorigin.html...');
15 await page.goto('http://localhost:8080/odoc-interactive-extension/demo4_crossorigin.html');
16
17 // Wait for cells to render and execute (worker init + eval)
18 console.log('Waiting for cells to execute...');
19 await page.waitForTimeout(15000);
20
21 // Check for cross-origin indicators in console
22 const hasCrossOriginWorker = consoleMessages.some(m =>
23 m.includes('9090'));
24 const hasCrossOriginFetch = consoleMessages.some(m =>
25 m.includes('Cross-origin import via fetch+eval'));
26 const hasInitFinished = consoleMessages.some(m =>
27 m.includes('init() finished'));
28 const hasSetupFinished = consoleMessages.some(m =>
29 m.includes('setup() finished'));
30
31 // Check for init_error
32 const hasInitError = consoleMessages.some(m =>
33 m.includes('init_error'));
34
35 // Check for correct output in page (x-ocaml uses Shadow DOM, so we
36 // look at worker output messages in the console instead)
37 const hasInt7 = consoleMessages.some(m =>
38 m.includes('int = 7'));
39 const hasGreeting = consoleMessages.some(m =>
40 m.includes('Hello, Cross-Origin World'));
41
42 console.log('');
43 console.log('=== Results ===');
44 console.log(` Worker loaded from port 9090: ${hasCrossOriginWorker ? 'YES' : 'NO'}`);
45 console.log(` Cross-origin fetch+eval used: ${hasCrossOriginFetch ? 'YES' : 'NO'}`);
46 console.log(` Init completed: ${hasInitFinished ? 'YES' : 'NO'}`);
47 console.log(` Setup completed: ${hasSetupFinished ? 'YES' : 'NO'}`);
48 console.log(` Init error: ${hasInitError ? 'YES (BAD)' : 'NO (good)'}`);
49 console.log(` Output "int = 7": ${hasInt7 ? 'YES' : 'NO'}`);
50 console.log(` Output "Hello, Cross-Origin": ${hasGreeting ? 'YES' : 'NO'}`);
51
52 let passed = true;
53
54 if (!hasInitFinished) {
55 console.log('\nFAIL: Worker init did not complete');
56 passed = false;
57 }
58 if (!hasSetupFinished) {
59 console.log('\nFAIL: Worker setup did not complete');
60 passed = false;
61 }
62 if (hasInitError) {
63 console.log('\nFAIL: Worker reported init_error');
64 const errMsg = consoleMessages.find(m => m.includes('init_error'));
65 console.log(` ${errMsg}`);
66 passed = false;
67 }
68 if (!hasInt7 || !hasGreeting) {
69 console.log('\nFAIL: Expected output not found in page');
70 passed = false;
71 }
72
73 if (passed) {
74 console.log('\nPASS: Cross-origin demo working correctly');
75 } else {
76 console.log('\n--- Console messages (last 40) ---');
77 consoleMessages.slice(-40).forEach(m => console.log(` ${m.substring(0, 150)}`));
78 }
79
80 await browser.close();
81 process.exit(passed ? 0 : 1);
82})();