import { expect, test } from '@playwright/test'; test('viewer2d releases its canvas when disposed', async ({ page }) => { await page.goto('/'); await page.getByRole('button', { name: 'Sample DXF' }).click(); await expect(page.locator('#status')).toContainText('✓ simple.dxf'); await expect(page.locator('canvas')).toHaveCount(1); const lifecycle = await page.evaluate(() => { const viewer = ( window as Window & { __viewer2d?: { dispose?: () => void }; } ).__viewer2d; return { exposed: Boolean(viewer), disposable: typeof viewer?.dispose === 'function', }; }); expect(lifecycle).toEqual({ exposed: true, disposable: true }); await page.evaluate(() => { ( window as Window & { __viewer2d?: { dispose?: () => void }; } ).__viewer2d?.dispose?.(); }); await page.evaluate(() => { ( window as Window & { __viewer2d?: { dispose?: () => void }; } ).__viewer2d?.dispose?.(); }); await expect(page.locator('canvas')).toHaveCount(0); }); test('viewer3d releases its canvas on pagehide and remains disposable', async ({ page }) => { await page.goto('http://127.0.0.1:3333/?model=/samples/Box.glb'); await page.waitForFunction( () => Boolean( ( window as Window & { __viewer?: { current?: object }; } ).__viewer?.current, ), ); const result = await page.evaluate(() => { window.dispatchEvent(new PageTransitionEvent('pagehide')); const exposed = (window as Window & { __viewer?: { dispose: () => void } }).__viewer; exposed?.dispose(); return { canvases: document.querySelectorAll('canvas').length, exposed: Boolean(exposed), }; }); expect(result).toEqual({ canvases: 0, exposed: false }); }); test('viewer2d and viewer3d survive ten mount transitions without duplicate canvases', async ({ page, }) => { test.setTimeout(180_000); const runtimeErrors: string[] = []; page.on('pageerror', (error) => runtimeErrors.push(error.message)); for (let transition = 0; transition < 10; transition += 1) { await page.goto('http://127.0.0.1:5173/'); await page.getByRole('button', { name: 'Sample DWG' }).click(); await expect(page.locator('#status')).toContainText('7309 entities', { timeout: 20_000 }); await expect(page.locator('canvas')).toHaveCount(1); await page.goto('http://127.0.0.1:3333/?model=/samples/Box.glb'); await page.waitForFunction( () => Boolean( ( window as Window & { __viewer?: { current?: object }; } ).__viewer?.current, ), undefined, { timeout: 20_000 }, ); await expect(page.locator('canvas')).toHaveCount(1); } expect(runtimeErrors).toEqual([]); });