Files
ArtPlayer/refactor/changes/2026-09-13-PKG-MULTI-SUB-07-timestamps.md
T

3.6 KiB
Raw Blame History

PKG-MULTI-SUB-07 内嵌时间戳与显示层修复

九份历史实现已复现 <00:02.000> 被包装成字符串并输出 <NaN:NaN.NaN>。 本次保留数字 TimestampNode,处理顶层与嵌套节点,在有效的 VTT class 节点中承载 时间戳。解析树仍不可变,重复选择/reset 不积累包装;文本、标签和轨序的原回归保留。 私有 WrappedNode 现在与 CueNode 一样要求数字时间戳,编译负例从 8 项增为 9 项。

原生与自定义字幕层

直接输出有效时间戳后,Chromium 中的发布/候选核心都把 <00:02.000> 显示成文字。 这不是测试超时或资源加载失败,最初两个失败断言及截图/trace 已保留。 因此新增 caption.ts,在既有 subtitleAfterUpdate 事件后处理插件生成的专用标记。

  • 原生 WebVTT 中的 <c.artplayer-multiple-subtitles-timestamp> 是合法 class 节点, 其中的数字时间戳仍解析为 processing instruction,cue.text 不被显示层修改。
  • HTML 不会把 <c.class> 与 </c> 配对,后面的字幕可能成为该元素的子节点。 直接删除标记曾导致后文丢失;已通过真实浏览器复现并修正为移除前导时间指令、 将其余子节点移回父层。对应失败报告保留,最终断言检查前后文字。
  • 不对整段文字做时间戳正则删除。仅处理专用标记中的前导指令,普通用户文字和 原有 .art-subtitle-<name> CSS 钩子保留。public cue.text 修改产生的字面量标签 有真实浏览器回归,清空/reset 后正常恢复原字幕。
  • 注册的监听器由当前 lifetime 管理,失败/销毁时移除;已有资源测试改为检查所有 监听器集合为空。没有增加新公开选项、返回值或事件,不改变逐 cue 显示策略。

验证范围

纯测试覆盖开始/中间/末尾、多个毫秒时间戳、Unicode、嵌套标签、冻结树、重复选择 和重新解析有效 VTT;历史时间戳失败仍保持,不将候选修复覆盖进旧预期。 原生场景检查开头/中间/末尾三个 processing instruction、前后文字、红色样式、 字面量标签保留、清空/reset,以及原有 SRT、销毁/HTTP/Blob/视频切源场景。 通过源码/main/legacy 与发布/候选核心,在 Chromium/Firefox/Windows WebKit 重跑。 具体结果、编译器和输入指纹见验证。

最终三入口各 37 项回归通过,本包 267 项通过;原生各 36 项,共 108 项通过, 原生 processing instruction 精确为 00:00:01.250、00:00:02.000、00:00:03.500。 完整 CI 2337 项通过(1987 单元、14 工程、336 基线),严格生产 TS 353 文件。 状态更新后 9 项元数据测试通过。显式 lint 无错误/警告,全量 lint 保留既有生成声明警告。

独立发现与后续边界

给字面量场景提供正常 &lt;...&gt; 输入时,vendor 生成了 <;...>;。九份历史实现 又复现 &lt;、&gt;、&amp; 的多余分号,新增 MULTI-SUB-ENTITY-01,由 05 处置。 本任务不改 vendor;最终字面量显示测试通过公开 cue.text 修改隔离显示层,明确不代表 该实体解码缺陷已修复。额外分号的初始六个浏览器失败记录保留。

04 的公开类型、完整旧核心/实体设备、实体解码、全部样式/编辑器和安装消费者仍待 后续任务。正常构建更新三个产物及 docs 副本;无新依赖、公开声明和版本变更。 本任务独立本地提交,不推送、不发布。回退恢复原 NaN 输出并移除显示监听器; 已发布失败基线及新发现记录仍可追溯。