mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-20 12:11:20 -08:00
fix(core): [CORE-SUBTITLE-OFFSET-01] refresh paused native cue membership and order
This commit is contained in:
1 parent
b5dee252d4
commit
efed847cdf
23 files changed
+6789
-27
No files matched your search
@@ -0,0 +1,58 @@
|
||||
import { expect, test } from './fixtures.js'
|
||||
|
||||
for (const invalidation of ['time-only', 'remove-add', 'mode-toggle']) {
|
||||
test(`Native paused cue timing probe: ${invalidation}`, async ({ page, browser }, testInfo) => {
|
||||
await page.route('**/test/native-offset.vtt', route => route.fulfill({ contentType: 'text/vtt', body: 'WEBVTT\n\n00:01.000 --> 00:03.000\ncaption\n' }))
|
||||
await page.goto('/test/player.html')
|
||||
await page.evaluate(async () => {
|
||||
const video = document.createElement('video')
|
||||
video.muted = true
|
||||
video.src = '/test/pattern.mp4'
|
||||
document.body.append(video)
|
||||
window.probeVideo = video
|
||||
await new Promise(resolve => video.addEventListener('loadedmetadata', resolve, { once: true }))
|
||||
const element = document.createElement('track')
|
||||
element.kind = 'metadata'
|
||||
element.src = '/test/native-offset.vtt'
|
||||
const loaded = new Promise(resolve => element.addEventListener('load', resolve, { once: true }))
|
||||
video.append(element)
|
||||
const track = element.track
|
||||
track.mode = 'hidden'
|
||||
await loaded
|
||||
window.probeTrack = track
|
||||
window.probeCue = track.cues[0]
|
||||
await video.play()
|
||||
video.pause()
|
||||
const sought = new Promise(resolve => video.addEventListener('seeked', resolve, { once: true }))
|
||||
video.currentTime = 1.5
|
||||
await sought
|
||||
})
|
||||
await expect.poll(() => page.evaluate(() => window.probeTrack.activeCues.length)).toBe(1)
|
||||
const state = await page.evaluate(async (invalidation) => {
|
||||
const track = window.probeTrack
|
||||
const cue = window.probeCue
|
||||
const read = () => ({ time: window.probeVideo.currentTime, paused: window.probeVideo.paused, active: Array.from(track.activeCues || [], cue => [cue.startTime, cue.endTime]), sameCue: track.cues[0] === cue })
|
||||
const before = read()
|
||||
cue.startTime = 2
|
||||
cue.endTime = 4
|
||||
const changed = read()
|
||||
if (invalidation === 'remove-add') {
|
||||
track.removeCue(cue)
|
||||
track.addCue(cue)
|
||||
}
|
||||
if (invalidation === 'mode-toggle') {
|
||||
track.mode = 'disabled'
|
||||
track.mode = 'hidden'
|
||||
}
|
||||
const immediate = read()
|
||||
await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)))
|
||||
const painted = read()
|
||||
window.probeVideo.remove()
|
||||
return { before, changed, immediate, painted }
|
||||
}, invalidation)
|
||||
await testInfo.attach('native-offset-probe', { contentType: 'application/json', body: JSON.stringify({ invalidation, browser: browser.version(), state, scope: 'Native video/TextTrack only, no Artplayer instance; two paint callbacks observe invalidation without moving playback time' }) })
|
||||
expect(state.before.time).toBeGreaterThanOrEqual(1)
|
||||
expect(state.before.time).toBeLessThan(2)
|
||||
expect(state.before).toMatchObject({ paused: true, active: [[1, 3]], sameCue: true })
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user