fix: resolve workspace integration blockers (#5)

This commit is contained in:
2026-07-29 10:01:17 +09:00
parent 3279ac099e
commit cadbd5fb60
37 changed files with 1817 additions and 73 deletions
+96
View File
@@ -0,0 +1,96 @@
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([]);
});