// test_crossorigin.js — Playwright test for cross-origin demo const { chromium } = require('playwright'); (async () => { const browser = await chromium.launch(); const page = await browser.newPage(); const consoleMessages = []; page.on('console', msg => consoleMessages.push(msg.text())); const errors = []; page.on('pageerror', err => errors.push(err.message)); console.log('Navigating to demo4_crossorigin.html...'); await page.goto('http://localhost:8080/odoc-interactive-extension/demo4_crossorigin.html'); // Wait for cells to render and execute (worker init + eval) console.log('Waiting for cells to execute...'); await page.waitForTimeout(15000); // Check for cross-origin indicators in console const hasCrossOriginWorker = consoleMessages.some(m => m.includes('9090')); const hasCrossOriginFetch = consoleMessages.some(m => m.includes('Cross-origin import via fetch+eval')); const hasInitFinished = consoleMessages.some(m => m.includes('init() finished')); const hasSetupFinished = consoleMessages.some(m => m.includes('setup() finished')); // Check for init_error const hasInitError = consoleMessages.some(m => m.includes('init_error')); // Check for correct output in page (x-ocaml uses Shadow DOM, so we // look at worker output messages in the console instead) const hasInt7 = consoleMessages.some(m => m.includes('int = 7')); const hasGreeting = consoleMessages.some(m => m.includes('Hello, Cross-Origin World')); console.log(''); console.log('=== Results ==='); console.log(` Worker loaded from port 9090: ${hasCrossOriginWorker ? 'YES' : 'NO'}`); console.log(` Cross-origin fetch+eval used: ${hasCrossOriginFetch ? 'YES' : 'NO'}`); console.log(` Init completed: ${hasInitFinished ? 'YES' : 'NO'}`); console.log(` Setup completed: ${hasSetupFinished ? 'YES' : 'NO'}`); console.log(` Init error: ${hasInitError ? 'YES (BAD)' : 'NO (good)'}`); console.log(` Output "int = 7": ${hasInt7 ? 'YES' : 'NO'}`); console.log(` Output "Hello, Cross-Origin": ${hasGreeting ? 'YES' : 'NO'}`); let passed = true; if (!hasInitFinished) { console.log('\nFAIL: Worker init did not complete'); passed = false; } if (!hasSetupFinished) { console.log('\nFAIL: Worker setup did not complete'); passed = false; } if (hasInitError) { console.log('\nFAIL: Worker reported init_error'); const errMsg = consoleMessages.find(m => m.includes('init_error')); console.log(` ${errMsg}`); passed = false; } if (!hasInt7 || !hasGreeting) { console.log('\nFAIL: Expected output not found in page'); passed = false; } if (passed) { console.log('\nPASS: Cross-origin demo working correctly'); } else { console.log('\n--- Console messages (last 40) ---'); consoleMessages.slice(-40).forEach(m => console.log(` ${m.substring(0, 150)}`)); } await browser.close(); process.exit(passed ? 0 : 1); })();