mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-08 19:06:15 -08:00
78 lines
3.1 KiB
JavaScript
78 lines
3.1 KiB
JavaScript
import { expect, test } from './fixtures.js'
|
|
|
|
async function setup(page, core) {
|
|
await page.addInitScript(() => {
|
|
Object.defineProperty(document, 'pictureInPictureEnabled', { configurable: true, value: false })
|
|
const modes = new WeakMap()
|
|
Object.defineProperties(HTMLVideoElement.prototype, {
|
|
webkitSupportsPresentationMode: { configurable: true, writable: true, value: () => true },
|
|
webkitPresentationMode: { configurable: true, get() { return modes.get(this) || 'inline' } },
|
|
webkitSetPresentationMode: { configurable: true, writable: true, value(mode) {
|
|
modes.set(this, mode)
|
|
this.dispatchEvent(new Event('webkitpresentationmodechanged'))
|
|
this.dispatchEvent(new Event(mode === 'picture-in-picture' ? 'enterpictureinpicture' : 'leavepictureinpicture'))
|
|
} },
|
|
})
|
|
})
|
|
await page.goto(`/test/player.html?core=${core}&chapter=published`)
|
|
await page.evaluate(() => {
|
|
window.createPlayer('/test/pattern.mp4')
|
|
window.pipEvents = []
|
|
window.art.on('pip', value => window.pipEvents.push(value))
|
|
})
|
|
await expect.poll(() => page.evaluate(() => window.art.isReady)).toBe(true)
|
|
}
|
|
|
|
for (const core of ['published', 'candidate']) {
|
|
test(`${core}: WebKit PiP keeps boolean state and repeated synchronous setter events`, async ({ page }) => {
|
|
await setup(page, core)
|
|
expect(await page.evaluate(() => {
|
|
const art = window.art
|
|
art.pip = true
|
|
art.pip = true
|
|
const entered = art.pip
|
|
art.pip = false
|
|
const result = { entered, exited: art.pip, events: [...window.pipEvents] }
|
|
art.destroy()
|
|
return result
|
|
})).toEqual({ entered: true, exited: false, events: [true, true, false] })
|
|
})
|
|
|
|
test(`${core}: WebKit PiP follows native UI transitions`, async ({ page }) => {
|
|
await setup(page, core)
|
|
expect(await page.evaluate(() => {
|
|
const video = window.art.template.$video
|
|
video.webkitSetPresentationMode('picture-in-picture')
|
|
video.webkitSetPresentationMode('inline')
|
|
const result = [...window.pipEvents]
|
|
window.art.destroy()
|
|
return result
|
|
})).toEqual(core === 'candidate' ? [true, false] : [])
|
|
})
|
|
|
|
test(`${core}: destroying WebKit PiP returns presentation to inline`, async ({ page }) => {
|
|
await setup(page, core)
|
|
expect(await page.evaluate(() => {
|
|
window.art.pip = true
|
|
window.pipEvents.length = 0
|
|
window.art.destroy(false)
|
|
return { mode: window.art.template.$video.webkitPresentationMode, events: window.pipEvents }
|
|
})).toEqual({ mode: core === 'candidate' ? 'inline' : 'picture-in-picture', events: [] })
|
|
})
|
|
}
|
|
|
|
test('candidate: WebKit PiP pending entry is cleaned up after destruction', async ({ page }) => {
|
|
await setup(page, 'candidate')
|
|
expect(await page.evaluate(() => {
|
|
const art = window.art
|
|
const video = art.template.$video
|
|
const setMode = video.webkitSetPresentationMode.bind(video)
|
|
video.webkitSetPresentationMode = () => {}
|
|
art.pip = true
|
|
art.destroy(false)
|
|
video.webkitSetPresentationMode = setMode
|
|
setMode('picture-in-picture')
|
|
return { mode: video.webkitPresentationMode, events: window.pipEvents }
|
|
})).toEqual({ mode: 'inline', events: [] })
|
|
})
|