'use strict'; const { app, BrowserWindow } = require('electron'); const targetUrl = process.env.WEBAVP_SMOKE_WEB_URL || 'http://127.0.0.1:5152/'; let failed = false; app.commandLine.appendSwitch('disable-gpu'); app.whenReady().then(async () => { const win = new BrowserWindow({ show: false, webPreferences: { contextIsolation: true, nodeIntegration: false, sandbox: true } }); win.webContents.on('console-message', (_event, level, message) => { if (level >= 2) { failed = true; console.error(`[WebAVP] Browser console error: ${message}`); } }); try { await win.loadURL(targetUrl); const result = await win.webContents.executeJavaScript(`(async () => { const deadline = Date.now() + 12000; while (!document.getElementById('releaseStatus')?.textContent && Date.now() < deadline) { await new Promise(resolve => setTimeout(resolve, 100)); } async function importCameraCount(count) { const input = document.getElementById('fileInput'); const transfer = new DataTransfer(); for (let index = 1; index <= count; index += 1) { transfer.items.add(new File(['x'], 'Camera' + index + '.mp4', { type: 'video/mp4' })); } Object.defineProperty(input, 'files', { value: transfer.files, configurable: true }); input.dispatchEvent(new Event('change', { bubbles: true })); const importDeadline = Date.now() + 5000; while (document.querySelectorAll('.cam-cell').length < count && Date.now() < importDeadline) { await new Promise(resolve => setTimeout(resolve, 50)); } return [...document.querySelectorAll('.cam-cell')] .filter(cell => getComputedStyle(cell).display !== 'none').length; } document.querySelector('[data-layout="2x2"]').click(); const fixedVisible = await importCameraCount(5); document.getElementById('newSessionBtn').click(); document.querySelector('[data-layout="auto"]').click(); const autoVisible = await importCameraCount(17); return ({ title: document.title, hasUtils: !!window.WebAVPUtils, autoGrid16: window.WebAVPUtils?.getAutoGrid(16), releaseText: document.getElementById('releaseAction')?.textContent.trim(), releaseFallback: document.getElementById('releaseAction')?.href, releaseStatus: document.getElementById('releaseStatus')?.textContent, hasFourByFour: !!document.querySelector('[data-layout="4x4"]'), hasDewarp: /dewarp|fisheye/i.test(document.documentElement.textContent), fixedVisible, autoVisible }); })()`); const passed = result.title === 'Alta Video Player' && result.hasUtils && result.autoGrid16?.cols === 4 && result.autoGrid16?.rows === 4 && result.releaseText === 'Download Desktop App' && result.releaseFallback.startsWith('https://git.pejicorp.com/peji/WebAVP/releases') && result.releaseStatus.length > 0 && result.hasFourByFour && !result.hasDewarp && result.fixedVisible === 4 && result.autoVisible === 16 && !failed; if (!passed) throw new Error(`Browser assertions failed: ${JSON.stringify(result)}`); console.log(`[WebAVP] Browser smoke passed at ${targetUrl}`); app.exit(0); } catch (err) { console.error(`[WebAVP] Browser smoke failed: ${err.message}`); app.exit(1); } });