Files
wordpress-theme-aksrt/.zcode/plans/plan-sess_624e69d1-0139-4583-9979-fd787b532bb1.md
T
2026-09-05 22:28:19 +08:00

1.9 KiB
Raw Blame History

诊断结论(已核实):

video-player.js:177 是 toggle() 中的 this.video.play()。播放器进入“无可播放源”状态后,点击封面/遮罩触发 toggle(),该 Promise 没有 catch,于是抛出 Uncaught (in promise) NotSupportedError: The element has no supported sources。播放器进入无源状态有四条已确认路径:

  1. .m3u8 在 Chrome:hls.js 从 cdn.jsdelivr.net 懒加载(video-player.js:22),CDN 不可达时 loadScript 静默失败(promise 也未 catch),<video> 始终没有源;
  2. .flv 同理(flv.js,video-player.js:23);
  3. 直链 mp4 地址 404/编码不支持,源加载失败后 currentSrc 为空;
  4. .switch-iframe 剧集按钮被 video-player 的委托处理器(video-player.js:225)捕获,把 iframe 嵌入页 URL 当 mp4 塞给 video.src,必然无源。.switch-iframe 本应由 runtime/main.js:1351 的 iframe 链路处理。

修复方案(单一路径,不引入双路/迁移):

  1. assets/js/video-player.js:
    • toggle():播放前守卫无源状态(video.currentSrc/video.src/this.hls/this.flvPlayer 均为空时直接返回),并对 play() 返回的 Promise 加 .catch(),播放失败不再产生未捕获异常;
    • 两处 loadScript()(hls/flv)加 .catch(),CDN 失败被收敛为“无源”状态,不再产生未处理 rejection;
    • 委托处理器限定为 .switch-video,移除对 .switch-iframe 的错误接管(iframe 剧集继续由 main.js 既有链路处理,属于删除错误重叠而非新增实现)。
  2. 契约测试 tests/widget-system/single-cover-height-contract.test.cjs 的 video cover 用例追加断言:toggle 守卫 + play catch、loadScript catch、处理器不含 .switch-iframe。
  3. 验证:node --check 播放器文件、运行 single-cover-height-contract 及相关契约测试、rg 复查、git diff --check;不做真实视觉效果验收。