diff --git a/apps/viewer/e2e/dbg-outside.spec.ts b/apps/viewer/e2e/dbg-outside.spec.ts deleted file mode 100644 index 02b7e45..0000000 --- a/apps/viewer/e2e/dbg-outside.spec.ts +++ /dev/null @@ -1,106 +0,0 @@ -// 临时窗外释放调试(验证后删除) -import { createServer, type Server } from 'node:http'; -import { expect, test, type Page } from '@playwright/test'; -import { - cleanupSeededAlbums, createEmbedSlot, flushOutbox, flushSync, - seedAlbum, seedPhoto, updateEmbedSlot, -} from './helpers'; - -const HOST_PORT = 3976; -const MINUTE = 60_000; -let slotToken = ''; - -test.beforeAll(async () => { - const album = await seedAlbum({ - alias: 'outsidedbg', defaultLocale: 'zh-CN', - translations: [{ locale: 'zh-CN', title: '窗外释放调试' }], - }); - for (let i = 1; i <= 6; i++) { - await seedPhoto(album.id, `outsidedbg-p${i}`, { publishedAt: new Date(Date.now() - (7 - i) * MINUTE) }); - } - await flushSync(album.id); - const slot = await createEmbedSlot('outside-dbg'); - await updateEmbedSlot(slot.id, { - albumId: album.id, - settings: { - position: 'right', size: 'md', intervalMs: 5000, lang: 'auto', collapsedDefault: false, - imageFit: 'contain', offsetX: 16, offsetBottom: 24, zIndex: 1000, - displayMode: 'vertical-stream', scrollSpeed: 16, reactionsEnabled: true, - }, - }); - await flushOutbox(); - slotToken = slot.token; -}); - -const server: Server = createServer((_q, res) => { - res.setHeader('content-type', 'text/html; charset=utf-8'); - res.end(` - - `); -}); -test.afterAll(async () => { await cleanupSeededAlbums(); server.close(); }); - -test('outside release debug', async ({ page }: { page: Page }) => { - page.on('console', (m) => { - const txt = m.text(); - if (txt.includes('stream-frame-error') || txt.includes('host-msg') || txt.includes('[ev]')) { - console.log(txt.slice(0, 200)); - } - }); - await new Promise((r) => server.listen(HOST_PORT, '127.0.0.1', r)); - await page.setViewportSize({ width: 1440, height: 900 }); - await page.goto(`http://127.0.0.1:${HOST_PORT}`); - const frame = page.locator('iframe[src*="/embed/"][src*="v=2"]'); - await frame.waitFor({ timeout: 20000 }); - await page.waitForTimeout(3000); - const f = page.frames().find((fr) => fr.url().includes('v=2')); - expect(f).toBeDefined(); - const offset = async () => { - const t = await f!.locator('.stream-track').evaluate((el) => el.style.transform); - return Number.parseFloat((/translateY\((-?[\d.]+)px\)/.exec(t) ?? ['0', '0'])[1]); - }; - const box = await frame.boundingBox(); - const cx = (box ? box.x : 0) + 90; - const cy = (box ? box.y : 0) + 150; - - const b1 = await offset(); - await page.waitForTimeout(1000); - console.log('[1 baseline]', b1 !== (await offset())); - - await f!.evaluate(() => { - const log = (name: string) => (e: PointerEvent) => - console.log(`[ev] ${name} type=${e.type} x=${e.clientX} y=${e.clientY}`); - const vp = document.querySelector('.stream-viewport'); - vp?.addEventListener('pointerdown', log('vp'), true); - window.addEventListener('pointerup', log('win'), true); - window.addEventListener('pointercancel', log('win'), true); - window.addEventListener('pointerleave', log('win'), true); - window.addEventListener('pointerout', log('win'), true); - vp?.addEventListener('pointerleave', log('vp'), true); - }); - await page.mouse.move(cx, cy); - await page.mouse.down(); - await page.mouse.move(cx + 120, cy + 200, { steps: 4 }); - await page.mouse.up(); - await page.waitForTimeout(3500); - const w1 = await offset(); - await page.waitForTimeout(1000); - console.log('[2 after outside]', w1 !== (await offset()), 'offset =', w1); - console.log('[2 state]', await f!.evaluate(() => { - const d = (window as unknown as { __embedDebug?: { reasons: Set; userPaused: { value: boolean } } }).__embedDebug; - return `reasons=[${d ? [...d.reasons].join(',') : '?'}] userPaused=${d?.userPaused.value}`; - })); - - // 手动在 iframe window 派发 pointerup——验证组件监听是否注册生效 - await f!.evaluate(() => { - window.dispatchEvent(new PointerEvent('pointerup', { bubbles: true, clientX: 0, clientY: 0, pointerId: 1 })); - }); - await page.waitForTimeout(1500); - console.log('[2b after manual pointerup]', await f!.evaluate(() => { - const d = (window as unknown as { __embedDebug?: { reasons: Set } }).__embedDebug; - return `reasons=[${d ? [...d.reasons].join(',') : '?'}]`; - })); - const s1 = await offset(); - await page.waitForTimeout(15000); - console.log('[3 15s moved]', Math.abs((await offset()) - s1).toFixed(0), 'px'); -});