const fs = require('node:fs'); const path = require('node:path'); const vm = require('node:vm'); const test = require('node:test'); const assert = require('node:assert/strict'); function loadScript(scriptPath, sandbox) { const source = fs.readFileSync(scriptPath, 'utf8'); vm.runInNewContext(source, sandbox, { filename: scriptPath }); } function createStyleStore() { const values = Object.create(null); return { values, getPropertyValue(name) { return values[name] || ''; }, setProperty(name, value) { values[name] = String(value || ''); }, removeProperty(name) { delete values[name]; } }; } test('primeSlideMarkup restores the current canvas dimensions', () => { const style = createStyleStore(); style.setProperty('--player-canvas-width', '1920px'); style.setProperty('--player-canvas-height', '1080px'); const sandbox = { window: null, document: { documentElement: { style } }, Date, JSON, Math, Number, String, Boolean, Array, Object, Promise, currentPlaylistSignature: 'signature', currentPlaylistEtag: '', currentPlaylistFadeBetweenSlides: false, currentPlaylistSkipUnavailableRtmp: false, videoRegionRenderVersion: 0, lastRenderedSlide: { id: 1 }, slideMarkupCache: Object.create(null), templateLayoutCache: Object.create(null), templateRenderPlanCache: Object.create(null), renderCacheViewportKey: '', window: null, innerWidth: 1280, innerHeight: 720, pulsePlayerRegionTypes: { get() { return null; } }, syncRenderCacheViewport() {}, syncBlackoutState() {}, setPlayerCanvasDimensions() {}, escapeHtml(value) { return String(value || ''); } }; sandbox.window = sandbox; const renderingPath = path.join(__dirname, '..', 'src', 'player', 'public', 'js', 'player-page-rendering.js'); loadScript(renderingPath, sandbox); const slide = { id: 2, kind: 'image', media_url: 'https://example.com/next.jpg', modified_at: '2026-08-07T00:00:00.000Z' }; const markup = sandbox.primeSlideMarkup(slide); assert.match(markup, / { const timers = []; const calls = []; const sandbox = { window: null, document: { documentElement: { style: createStyleStore() } }, Date, JSON, Math, Number, String, Boolean, Array, Object, Promise, currentPlaylistSignature: 'signature', currentPlaylistEtag: '', currentPlaylistFadeBetweenSlides: false, currentPlaylistSkipUnavailableRtmp: false, videoRegionRenderVersion: 0, innerWidth: 1280, innerHeight: 720, slideMarkupCache: Object.create(null), templateLayoutCache: Object.create(null), templateRenderPlanCache: Object.create(null), renderCacheViewportKey: '', escapeHtml(value) { return String(value || ''); }, syncRenderCacheViewport() {}, syncBlackoutState() {}, setPlayerCanvasDimensions() {}, primeSlideMarkup(slide) { calls.push(slide.id); return 'markup:' + slide.id; }, setTimeout(fn) { timers.push(fn); return timers.length; } }; sandbox.window = sandbox; const playlistPath = path.join(__dirname, '..', 'src', 'player', 'public', 'js', 'player-page-playlist.js'); loadScript(playlistPath, sandbox); const current = { id: 1 }; const next = { id: 2 }; const later = { id: 3 }; sandbox.scheduleSlideMarkupPreload([current, next, later], 0); assert.equal(timers.length, 1); timers.shift()(); assert.deepEqual(calls, [2]); });