mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-08 19:06:15 -08:00
82 lines
4.0 KiB
JavaScript
82 lines
4.0 KiB
JavaScript
import process from 'node:process'
|
|
import { installChapterTiming, readChapterTiming } from './chapter-timing.js'
|
|
import { expect, test } from './fixtures.js'
|
|
|
|
test('native paused video restores position after quality URL replacement without ArtPlayer', async ({ page }, testInfo) => {
|
|
await page.route('**/chapter-native.html', route => route.fulfill({ contentType: 'text/html', body: '<!doctype html><video id="media" muted playsinline style="width:640px;height:300px"></video><button id="play">Play</button><button id="pause">Pause</button><button id="quality">Quality A</button>' }))
|
|
await page.goto('/chapter-native.html')
|
|
await installChapterTiming(page, '#media')
|
|
await page.evaluate((correctionMode) => {
|
|
const video = document.querySelector('#media')
|
|
video.muted = true
|
|
window.nativeRestarts = []
|
|
document.querySelector('#play').onclick = () => video.play()
|
|
document.querySelector('#pause').onclick = () => video.pause()
|
|
document.querySelector('#quality').onclick = () => {
|
|
const time = video.currentTime
|
|
window.nativeRestoreTarget = time
|
|
window.nativeCorrections = 0
|
|
window.nativeCorrectionMode = correctionMode
|
|
if (correctionMode !== 'none') {
|
|
video.addEventListener('seeked', () => {
|
|
if (!window.nativeCorrections && Math.abs(video.currentTime - time) > 0.05) {
|
|
window.nativeCorrections++
|
|
if (correctionMode === 'deferred') {
|
|
setTimeout(() => {
|
|
video.currentTime = time
|
|
}, 0)
|
|
}
|
|
else {
|
|
video.currentTime = time
|
|
}
|
|
}
|
|
})
|
|
}
|
|
video.addEventListener('loadedmetadata', () => {
|
|
video.currentTime = time
|
|
}, { once: true })
|
|
video.addEventListener('loadeddata', () => {
|
|
window.nativeRestarts.push(video.currentSrc)
|
|
}, { once: true })
|
|
video.src = '/test/pattern.mp4?quality=A'
|
|
}
|
|
video.src = '/test/pattern.mp4?quality=B'
|
|
}, process.env.ARTPLAYER_NATIVE_QUALITY_CORRECTION === 'deferred' ? 'deferred' : process.env.ARTPLAYER_NATIVE_QUALITY_CORRECTION === '1' ? 'direct' : 'none')
|
|
try {
|
|
await expect.poll(() => page.evaluate(() => document.querySelector('#media').readyState >= 2)).toBe(true)
|
|
await page.locator('#play').click()
|
|
await expect.poll(() => page.evaluate(() => document.querySelector('#media').currentTime)).toBeGreaterThan(0.2)
|
|
await page.locator('#pause').click()
|
|
await page.evaluate(() => {
|
|
document.querySelector('#media').currentTime = 3.008
|
|
})
|
|
await expect.poll(() => page.evaluate(() => !document.querySelector('#media').seeking)).toBe(true)
|
|
await page.locator('#quality').click()
|
|
await expect.poll(() => page.evaluate(() => window.nativeRestarts.length)).toBe(1)
|
|
await expect.poll(() => page.evaluate(() => {
|
|
const video = document.querySelector('#media')
|
|
return !video.seeking && video.readyState >= 2
|
|
})).toBe(true)
|
|
const state = await page.evaluate(() => {
|
|
const video = document.querySelector('#media')
|
|
return { time: video.currentTime, target: window.nativeRestoreTarget, corrections: window.nativeCorrections, correctionMode: window.nativeCorrectionMode, paused: video.paused, error: video.error?.code || null, artplayerLoaded: typeof window.Artplayer !== 'undefined' }
|
|
})
|
|
await testInfo.attach('native-quality-position', { contentType: 'application/json', body: JSON.stringify(state) })
|
|
expect(state.artplayerLoaded).toBe(false)
|
|
expect(state.time).toBeCloseTo(state.target, 1)
|
|
expect(state.paused).toBe(true)
|
|
expect(state.error).toBeNull()
|
|
await page.locator('#play').click()
|
|
await expect.poll(() => page.evaluate(() => document.querySelector('#media').currentTime)).toBeGreaterThan(state.time + 0.2)
|
|
}
|
|
finally {
|
|
await readChapterTiming(page, testInfo)
|
|
await page.evaluate(() => {
|
|
const video = document.querySelector('#media')
|
|
video.pause()
|
|
video.removeAttribute('src')
|
|
video.load()
|
|
})
|
|
}
|
|
})
|