52 lines
2.3 KiB
TypeScript
52 lines
2.3 KiB
TypeScript
/** Calendar fixtures leave browser scheduling and other pages independent. */
|
|
import { chromium, type Browser } from 'playwright'
|
|
import { expect, it } from 'vitest'
|
|
import { pinBrowserClock, pinHostClock, WEB_FIXTURE_TIME } from './support.ts'
|
|
|
|
it('advances pinned dates and native timers across navigation with a pinned Host clock', async () => {
|
|
const hostClock = pinHostClock()
|
|
let browser: Browser | undefined
|
|
try {
|
|
browser = await chromium.launch()
|
|
const context = await browser.newContext()
|
|
const page = await context.newPage()
|
|
await pinBrowserClock(page)
|
|
for (const navigation of ['initial', 'replacement']) {
|
|
await page.goto(`data:text/html,<body>${navigation}</body>`)
|
|
const startedAt = await page.evaluate(() => {
|
|
requestAnimationFrame(() => {
|
|
document.body.dataset.frame = 'complete'
|
|
setTimeout(() => { document.body.dataset.nested = 'complete' }, 0)
|
|
})
|
|
setTimeout(() => { document.body.dataset.timer = 'complete' }, 20)
|
|
return Date.now()
|
|
})
|
|
await expect.poll(() => page.evaluate(() => ({
|
|
frame: document.body.dataset.frame,
|
|
timer: document.body.dataset.timer,
|
|
nested: document.body.dataset.nested,
|
|
})), { timeout: 10_000 }).toEqual({ frame: 'complete', timer: 'complete', nested: 'complete' })
|
|
const dates = await page.evaluate(() => ({
|
|
now: Date.now(), constructed: new Date().getTime(), after: Date.now(),
|
|
day: new Date().toISOString().slice(0, 10),
|
|
explicit: new Date(0).getTime(), parsed: Date.parse('2000-01-01T00:00:00Z'),
|
|
}))
|
|
expect(startedAt).toBeGreaterThanOrEqual(WEB_FIXTURE_TIME)
|
|
expect(dates.now).toBeGreaterThan(startedAt)
|
|
expect(dates.constructed).toBeGreaterThanOrEqual(dates.now)
|
|
expect(dates.constructed).toBeLessThanOrEqual(dates.after)
|
|
expect(dates.day).toBe('2026-01-15')
|
|
expect(dates.explicit).toBe(0)
|
|
expect(dates.parsed).toBe(946684800000)
|
|
}
|
|
const independent = await context.newPage()
|
|
await independent.goto('data:text/html,<body>independent</body>')
|
|
const wallTime = performance.timeOrigin + performance.now()
|
|
expect(await independent.evaluate(() => Date.now())).toBeGreaterThanOrEqual(wallTime - 1000)
|
|
await page.close()
|
|
} finally {
|
|
try { await browser?.close() }
|
|
finally { hostClock.mockRestore() }
|
|
}
|
|
})
|