Files
ArtPlayer/refactor/changes/2026-09-14-PKG-DANMUKU-08-fullscreen-lifetimes.md
T

80 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PKG-DANMUKU-08 全屏生命周期与旧核心负载检查点
状态:仍 doing。起点 b54a890832ccfec82715129c319befa5d26ef942;本批只补充实际
浏览器验证和维护文档,没有修改生产运行时、声明、依赖或分发文件。
## 覆盖与测试设计
新增 `test/browser/danmuku-fullscreen.spec.js`:冻结 npm 核心 5.4.0/当前源码核心,
冻结 npm 弹幕 5.3.0/当前源码插件,CSS 网页全屏/真实 document 全屏,三个引擎。
每项连续创建三个独立播放器;每个播放器使用真实视频与原生 Worker,按媒体时间
加载可见弹幕,检查全屏图层宽度、设置/热力图单例、退出后的宽度恢复,以及销毁后
Worker 恰好终止一次、DOM 无残留。候选还检查 scheduler.frame/operation 清空。
文件/包哈希和每轮快照写入附件;不能把三个生命周期称作三小时耐久测试。
45 秒单项上限为新增三轮播放/全屏操作预留,没有增大旧用例的超时,也没有重试、
强制点击、伪造媒体事件、替换全屏 API 或跳过某个浏览器。兼容覆盖 API-04/05/07/08。
`danmuku-stability.spec.js` 的原有三轮 14 秒、每秒 2/20 条负载现在增加核心版本轴,
附件增加 core 字段,原候选逐条采样/显示/回收、状态池、节点复用和 Worker 断言不变。
本轮只运行新增旧核心子集;既有候选核心证据仍标明其实际运行日期与源码哈希。
## 首轮失败与修正依据
1. Chromium 首轮 3 通过、5 失败:旧插件保留同名隐藏测量节点,纯文本定位违反
唯一性;改为精确文本与可见节点交集,仍要求实际可见。旧核心销毁后留下的全屏
监听器通过测试的 window 全局数组写入下一实例记录;改为实例局部数组,并保留
每个旧实例后续收到的事件。BASE-LIFE-18 已在 CORE-16 复现和修复;冻结旧核心的
三个实例分别观察三轮/两轮/一轮事件,新核心的每个实例只能收到自己的一轮。
2. 三引擎首轮 20 通过、4 失败:WebKit 原生退出时 fullscreenElement 和布局先恢复,
change 事件稍后投递;测试提前 destroy 抑制了候选的后续通知。现在在销毁之前
使用原有 7 秒 expect 上限等待真实 [true,false] 事件序列,并继续精确断言次数。
这不是在缺少事件时跳过检查,也不是对生产代码增加延时。
两份失败报告、trace 和错误断言均保留。后续报告不覆盖它们,见机器证据中的路径及哈希。
## 已验证结果
固定 Node 24.21.0、Yarn 1.22.22;Windows Chromium 153.0.8010.12、Firefox 155.0、
WebKit 26.6。以下原生全屏均实际进入 document 全屏,未按 API 不可用计作通过。
| 输入与范围 | 实际结果 |
| --- | --- |
| 全屏源码,新旧核心/新旧插件/两个模式/三引擎 | 24 通过,87.07 秒 Yarn 总耗时 |
| 全屏 main,新旧核心/候选插件/两个模式/三引擎 | 12 通过,47.09 秒 |
| 全屏 legacy,同上 | 12 通过,47.13 秒 |
| 旧核心,旧/新插件,每秒 2/20 条,三引擎 | 12 通过,278.37 秒 |
| 两个测试文件的只读 ESLint | 通过 |
源码 72 次、main/legacy 各 36 次播放器生命周期;每个格式重新创建样本,不能
把累计次数当作一个播放器的长期稳定性证明。main/legacy 使用实际工作区分发字节,
不是仓库外安装验证;证据脚本核对加载 SHA 与对应 dist 文件完全一致。
完整快照见 [全屏证据](../baselines/danmuku-fullscreen-validation.json)和
[旧核心负载证据](../baselines/danmuku-old-core-load-validation.json)。本轮候选普通
负载三轮完整显示/回收 72 条,分配 3 节点、复用 69 次;密集负载完整处理 720 条,
分配 21–22 节点、复用 698–699 次。全部 Worker 正常终止,销毁后播放器根节点为零。
对照07的候选核心报告,先核验原报告哈希以及新旧报告加载的插件字节完全一致。
候选插件的 RAF 帧间隔 P95:Chromium 本轮 16.7/16.8ms,原报告 16.7/16.7ms;
Firefox 两档均约16.68ms;WebKit 本轮61/79ms,原报告61/80ms。WebKit在这台
Windows测试环境中本来就没有60fps,旧插件本轮62/79ms;不能把该差异隐去或声称
所有引擎流畅60fps。原始周期级帧间隔也保留,跨周期总体统计明确包含暂停间隙。
这些是不同时间运行的有限样本,没有随机化/同时运行对照,不能宣称因果性能提升。
也未用未强制GC的heap读数证明不存在泄漏。
## 重跑与后续
- 源码:`yarn test:browser:source test/browser/danmuku-fullscreen.spec.js --workers=2`。
- main/legacy:显式设置 `ARTPLAYER_DANMUKU_ARTIFACT`,同一入口加
`--grep 'candidate Danmuku'`。依次运行并在每次前归档前一报告。
- 旧核心负载:`yarn test:browser:source test/browser/danmuku-stability.spec.js
--grep 'published core /' --workers=2`。Playwright 匹配含项目和文件名的完整标题,
不使用 `^published core`;本轮第一次错误选择导致的 No tests found 已独立保留,
不能计作任何测试通过。
08 的完整旧插件组合与 Mask/PiP 组合负载仍待继续;09 承担最终仓库外安装、示例、
分发与声明收口。设备和远端 CI 也没有被本批桌面结果替代。不标任务完成或 npm 可发布。
回退本批提交即可撤销测试/文档覆盖,生产运行时无需回退。独立本地检查点提交后运行
提交审计,再继续下一批;没有 push、部署或发布。