4.7 KiB
PKG-MULTI-SUB-02 错误与资源生命周期复现
在 01 的 9 份冻结实现上增加 18 类用例,共 162 项。测试读取真实 npm main/legacy 及固定 Git 源码/产物,预期内容明确描述旧行为,不将这些通过结果解释成候选已修复。 测试辅助宿主增加原始字节响应、独立 fetch/body 挂起、错误和真实活动 URL 计数; 既有正常契约继续检查,未改生产源码、公开声明、parser 或构建产物。
已复现的正常与边界行为
- 使用当前核心的真实 getExt/srtToVtt/assToVtt 及原生 TextDecoder,验证 SRT/ASS、URL query、大写扩展名、Windows-1252 和 UTF-16LE。不是将 converter stub 当作解码验收。
- 请求并行发出,返回先后不会改变轨序;名称等元数据在下载后读取,restart 不重复下载。
- 同名轨选择第一个匹配;未知名称抛 TypeError,保留原活动 URL,随后 reset 可以恢复。
- 各轨内部排序,但 1.1.0 起合并后不再全局排序;重叠 cue 保留各自时间。
- 1.0.0 遇到较短后轨会抛异常,较长后轨的尾 cue 会丢失;后续版本连接所有 cue。
- 空轨/未知格式产生空 VTT;parser 的诊断没有向外传递,坏 header 后仍可保留可用 cue。 这是旧 parser 的容错观察,不能未经评估就统一改成严格拒绝。
已复现的问题
| 问题 | 旧行为 | 03 应处理的边界 |
|---|---|---|
| 请求失败 | 原异常拒绝,但其他请求继续读取 body,没有共享取消 | 保留异常身份并回收同一注册的挂起请求 |
| HTTP 状态 | 404 配合可解析 body 仍安装字幕 | 显式处理原生 HTTP 失败,避免错误页面成为字幕 |
| destroy 中 fetch/body | Promise 不因 destroy 结束,响应到达后继续 init 和创建 URL | 区分两段异步边界与过期结果 |
| destroy 后方法 | 最后 URL 不释放,tracks/reset 仍创建新 URL 和调用 init | 关闭后不再写入或分配资源 |
| 同步 init 失败 | 原异常拒绝,但新 Blob URL 泄漏,escape 已修改 | 安装失败回滚和资源所有权 |
| 异步 init 失败 | 插件忽略实际返回的 Promise,注册仍成功 | 观察内部拒绝,同时保护 tracks/reset 的旧 void 接口 |
| URL 分配失败 | 先 revoke 旧 URL,随后分配失败,宿主仍指向失效资源 | 新旧资源的替换顺序与失败恢复 |
异步 init 失败用例由测试宿主观察真实 rejection,防止 Node 未处理拒绝结束测试; 没有把假设的 future handler 当作旧插件已有能力。浏览器测试也仅记录真实 init 返回值和 拒绝,不替换其实现;本次真实环境中的 init 错误数组为空。
原生浏览器证据
用真实 1.2.0 main 插件与发布/候选核心,在 Chromium、Firefox、Windows WebKit 上执行 三场景,共 18 项。核心和插件指纹、浏览器版本、请求/错误记录及观察数据见 验证记录。三个场景为:
- 真实 SRT 转换、原生 textTrack cue、播放时间推进和 DOM 字幕文本,切换/清空/reset。
- 原生 fetch 挂起期间 destroy:没有 AbortSignal、没有及时结束,放行后在已销毁宿主 调用 init;真实生成的 Blob URL 仍能被原生 fetch 读取。
- 正常加载后 destroy:插件 URL 仍可读取;保留的 reset 随后生成另一可读取 URL。
成功显示场景通过真实 plugins.add;资源观察场景直接执行公开注册函数,以区分插件 本身行为与核心插件管理器的结束保护。此证据不覆盖旧支持范围全部核心、ASS 原生显示、 实体 Safari/移动设备、全部样式组合或在线编辑器;这些仍归 05/06。
验证和接续
本包命令新增失败文件,并接入主 test:unit。helper/用例显式 lint;最终完整 CI 和准确 统计写入验证记录。包内维护文档同步。没有新依赖,不重建未改变的生产产物。 LIFE 风险从源码观察提升为已复现;HTTP/宿主 Promise 问题单独登记,全部保持 open。
最终本包 215 项、原生浏览器 18 项通过;完整 CI 2285 项通过(1937 单元、14 工程、 334 基线),严格生产 TS 仍 346 文件。任务状态更新后另跑 9 项风险/契约元数据测试通过。 声明字节与上次指纹的差异经 Git 对照确认仅为 CRLF;验证记录同时保留工作区和 Git 指纹。 全量 lint 保留既有生成声明的 unused-disable 警告;新增测试文件的显式 lint 无警告。
本任务独立本地提交,不推送、不发布。回退只移除新增复现和辅助宿主能力,生产行为不变。 接下来 03 拆清获取/转换、纯 merge、注册与资源所有权,保持冻结契约并增加候选修复断言。