fix(thumbnail): [PKG-TOOL-THUMB-07] preserve falsy cleanup exceptions

This commit is contained in:
Harvey Zhao committed 2026-09-15 15:30:26 +08:00
1 parent 2a38067911
commit 1c522f181b
18 files changed
+5822 -20

No files matched your search

File diff suppressed because it is too large. Load diff
@@ -0,0 +1,60 @@
# PKG-TOOL-THUMB-07 保留清理中的原始异常值
来源 HEAD:`2a380679117b02499ff3a131cb449e1eda007cb2`。
本任务修复迁移中的兼容回归,不改变待批准的 Thumbnail 默认行为方案。
对应 API-04 事件异常传播和 API-05 销毁/资源清理。
## 缺陷与修复
恢复的3.5.31 CDN文件及冻结工作区 main/legacy 在 destroy 监听器抛出 undefined、
null、false、0、-0、空字符串或NaN时,均同步向调用方传播原值。迁移后的
cleanupAll 使用异常值的 truthiness 判断是否失败,导致这些异常被吞掉;如果
后续清理再抛出 Error,后一个异常还会覆盖第一个值。
新增回归在未修复候选上1通过、2失败:历史契约通过,候选在首个undefined的
传播及后续异常覆盖检查失败。修复后的全部七种值都被实际检查,使用独立的
threw 标记和 Object.is,避免“没有抛出”和“抛出undefined”混淆,也区分-0与0。
实现仅调整 src/lifecycle.ts 的 cleanupAll:使用单独 failed 布尔值记录异常发生,
保存第一个原始值;继续执行所有后续资源清理,然后按原值抛出。没有改变正常
返回路径、清理顺序、事件名称、默认参数、同步/异步形状或类型声明。
销毁先将实例关闭,失败后再次 destroy 仍不重复执行。cleanupAll 的继续清理
不代表 emitter 改为继续派发:destroy 的一个监听器抛出后,当前派发中其余
监听器仍不执行。测试同时检查这两层边界。
## 验证
| 验证 | 结果与范围 |
| --- | --- |
| 新回归旧红/新绿 | 未修复1通过2失败;修复后3通过,包含七种 falsy 值、原始异常身份、继续清理和重复销毁 |
| 源码专项 | yarn test:thumbnail:123通过 |
| 正式 main/legacy | 各49项输入、抽帧、清理和 emitter 单测通过 |
| 源码真实浏览器 | 15通过:3份历史实现及候选的原始异常、真实DOM清理,以及现有事件注册回归 |
| 已安装 main/legacy 浏览器 | 各21报告通过;每轮5项Windows WebKit为Blob能力受限对照,不计抽帧成功 |
| 其余检查 | 严格包类型、定向lint、正常三格式构建、严格工具链通过 |
浏览器共57报告通过,其中47项实际执行对应正常场景,10项是明确标注的
WebKit能力对照;没有失败或重试,也没有把受限对照记作成功抽帧。main/legacy
还覆盖正常PNG像素/重复生成、拖放、损坏媒体后切源、迟到编码与销毁/替换取消。
Node24.21.0、YarnClassic1.22.22;隔离包由
`yarn test:thumbnail-types-package` 实际打包、在仓库外安装、冻结离线重装并核对
每个文件。安装后的7项候选正例通过、52项预期负例诊断成立;5项历史工作区
缺入口/声明的预期失败保持原样。编译器为TS5.9.3及4.3.5,不能称为12项旧声明
全部编译通过。历史工作区夹具也不是已找回完整npm3.5.31归档。
包内 ARCHITECTURE 已在打包前更新。三份dist、docs/compiled副本和已安装副本
字节一致;公共types未变。源浏览器检查后仅规范了等价的window全局访问及格式,
最终测试文件已用于main/legacy运行。root test:thumbnail 与 test:unit 均新增此
回归,无新增依赖、版本变更或锁文件修改。
机器证据:[thumbnail-cleanup-errors-validation.json](../baselines/thumbnail-cleanup-errors-validation.json)。
命令入口和职责随包内文档一起维护。此任务不关闭04的默认值冲突,也不代替
05/06的最终组合、设备或完整分发验收;本轮未推送、部署或发布。
## 回退与交付
回退本独立提交会恢复有缺陷的 truthiness 判断,撤销对应测试、文档和本轮
构建产物;不撤销此前的TS迁移、输入/抽帧资源归属和emitter修复。
本任务以PKG-TOOL-THUMB-07单独完成并提交,04继续doing。
+6 -4
View File
@@ -2,9 +2,9 @@
> 由 tasks.json 生成。请修改数据后运行 `node refactor/scripts/plan.mjs --write`,不要手改本表。
基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 267 项,范围 22 个包及工作区/示例。
基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 268 项,范围 22 个包及工作区/示例。
状态:todo 43 / doing 21 / blocked 0 / done 203 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
状态:todo 43 / doing 21 / blocked 0 / done 204 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。
@@ -34,7 +34,7 @@
| artplayer-proxy-canvas | 1.1.0 | PKG-AMBILIGHT-PROXY-01, PKG-CANVAS-01, PKG-CANVAS-02, PKG-CANVAS-03, PKG-CANVAS-04, PKG-CANVAS-05, PKG-CANVAS-06, PKG-FACTORY-01, PKG-CANVAS-SUBTITLE-01 |
| artplayer-proxy-mediabunny | 1.2.0 | PKG-MB-01, PKG-MB-02, PKG-MB-03, PKG-MB-04, PKG-MB-05, PKG-MB-06, PKG-MB-07, PKG-MB-08, PKG-MB-09, PKG-MB-10 |
| artplayer-tool-iframe | 1.1.0 | PKG-IFRAME-01, PKG-IFRAME-02, PKG-IFRAME-03, PKG-IFRAME-04, PKG-IFRAME-05, PKG-IFRAME-06 |
| artplayer-tool-thumbnail | 4.4.0 | PKG-TOOL-THUMB-01, PKG-TOOL-THUMB-02, PKG-TOOL-THUMB-03, PKG-TOOL-THUMB-04, PKG-TOOL-THUMB-05, PKG-TOOL-THUMB-06 |
| artplayer-tool-thumbnail | 4.4.0 | PKG-TOOL-THUMB-01, PKG-TOOL-THUMB-02, PKG-TOOL-THUMB-03, PKG-TOOL-THUMB-04, PKG-TOOL-THUMB-05, PKG-TOOL-THUMB-06, PKG-TOOL-THUMB-07 |
| artplayer-vitepress | 1.1.0 | SITE-01, SITE-SMOKE-01, SITE-02, SITE-LOAD-01, SITE-AI-DOCS-01, SITE-BUILD-01, SITE-03, SITE-04, SITE-05, SITE-06, SITE-07, SITE-VCONSOLE-01, ENG-LINT-02, SITE-CONSOLE-01 |
## 0 规划
@@ -389,9 +389,10 @@
| PKG-TOOL-THUMB-01 | artplayer-tool-thumbnail<br>核对包契约与历史用法 | BASE-05 | 构造/defaults/事件/方法/历史拼写、.esm.js 入口和缺失 types | 源码/声明/README/demo/可恢复发布内容差异已登记;公开形状和版本范围冻结;区分旧 npm 的 main/CSS 与当前工作区无 main、.esm.js/类型缺失,不把工作区状态冒称旧 npm 发布事实 | H | done |
| PKG-TOOL-THUMB-02 | artplayer-tool-thumbnail<br>建立特有行为与错误测试 | PKG-TOOL-THUMB-01, ENG-03, ENG-05 | 文件输入/拖放、抽帧网格、begin/end、进度/失败/重复任务 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | H | done |
| PKG-TOOL-THUMB-03 | artplayer-tool-thumbnail<br>整理内部职责与资源 | PKG-TOOL-THUMB-02, CORE-01 | 输入、抽帧队列、网格导出、URL/监听清理分离 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | done |
| PKG-TOOL-THUMB-04 | artplayer-tool-thumbnail<br>迁移自有源码和公开类型 | PKG-TOOL-THUMB-03, ENG-04, ENG-06, CORE-07 | 补齐真实 API 声明,自有 emitter/utils TS 化 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容;为 BASE-DIST-01 提供兼容入口/声明及消费者验证 | H | doing |
| PKG-TOOL-THUMB-04 | artplayer-tool-thumbnail<br>迁移自有源码和公开类型 | PKG-TOOL-THUMB-03, ENG-04, ENG-06, CORE-07, PKG-TOOL-THUMB-07 | 补齐真实 API 声明,自有 emitter/utils TS 化 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容;为 BASE-DIST-01 提供兼容入口/声明及消费者验证 | H | doing |
| PKG-TOOL-THUMB-05 | artplayer-tool-thumbnail<br>验证新旧核心和组合 | PKG-TOOL-THUMB-04, CORE-22 | 工具独立浏览器使用,生成缩略图在核心中显示 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | H | todo |
| PKG-TOOL-THUMB-06 | artplayer-tool-thumbnail<br>验证分发并同步文档 | PKG-TOOL-THUMB-05, ENG-07 | tool.thumbnail.js、历史 ESM 兼容文件、types 路径和 tarball | tarball 入口/资源、类型、8082 demo 和 README 一致,有回退记录 | H | todo |
| PKG-TOOL-THUMB-07 | artplayer-tool-thumbnail<br>恢复清理和销毁中的原始异常传播 | PKG-TOOL-THUMB-03 | 清理记录与异常值分离,保留首个 falsy 抛出值并继续释放资源;历史对照、真实DOM、分发验证及维护记录 | 恢复旧 destroy 监听器同步异常语义,0/false/undefined/NaN等不被吞掉或覆盖;后续清理、重复销毁与正常抽帧回归通过,默认兼容决策不受影响 | M | done |
## 6 文档与消费者
@@ -700,3 +701,4 @@
- ENG-LINT-02: [记录](changes/2026-09-15-ENG-LINT-02-clean-checks.md) [记录](baselines/eng-lint02-validation.json)
- SITE-CONSOLE-01: [记录](console-modernization.md) [记录](changes/2026-09-15-SITE-CONSOLE-01-typescript.md) [记录](baselines/site-console01-validation.json)
- PKG-AUTO-THUMB-12: [记录](changes/2026-09-15-PKG-AUTO-THUMB-12-metadata.md) [记录](baselines/auto-thumbnail-metadata-validation.json)
- PKG-TOOL-THUMB-07: [记录](changes/2026-09-15-PKG-TOOL-THUMB-07-cleanup-errors.md) [记录](baselines/thumbnail-cleanup-errors-validation.json)
+14
View File
@@ -1,5 +1,19 @@
# 进度与证据
## PKG-TOOL-THUMB-07 清理异常传播修复
修复cleanupAll吞掉destroy监听器抛出的falsy值、或被后续异常覆盖的兼容回归。
历史3.5.31/工作区保留原值,未修复候选1通过2失败;修复后继续释放资源,保留
第一个原始异常,重复销毁仍不执行,普通事件派发遇错仍停止。
123源码专项、main/legacy各49专项通过;源码及实际安装产物共57浏览器报告
通过,其中10项是明确的Windows WebKit Blob能力对照,不计抽帧成功。7项安装
类型正例、52预期负例诊断、5历史缺入口/声明对照成立;三格式/文档副本字节
一致。详见[记录](changes/2026-09-15-PKG-TOOL-THUMB-07-cleanup-errors.md)和
[证据](baselines/thumbnail-cleanup-errors-validation.json)。
新增独立任务07完成,04的默认兼容决策保持待处理;204 done、21 doing、43 todo,
共268项。无新依赖、版本变更或发布操作。
## PKG-HLS-SDK-01 SDK顺序与销毁前崩溃
新增固定SDK序列诊断入口,逐页核验版本并保存实际顺序。在同一个Firefox实例
+1
View File
@@ -281,3 +281,4 @@
| CONSOLE-ERROR-01 | resolved / 已复现 | Firefox/WebKit 控制台丢失原生 Error 消息 | SITE-CONSOLE-01, SITE-07 |
| AUTO-THUMB-METADATA-01 | resolved / 已复现 | Private metadata loading can retain its decoder indefinitely without metadata or media errors | PKG-AUTO-THUMB-12 |
| ASR-MEDIA-01 | resolved / 已复现 | ASR accepts obsolete recognition after native media error without pause | PKG-ASR-10, PKG-ASR-05 |
| THUMB-CLEANUP-01 | resolved / 已复现 | Thumbnail 清理吞掉 falsy 监听器异常或覆盖第一个异常值 | PKG-TOOL-THUMB-07, PKG-TOOL-THUMB-04 |
+24
View File
@@ -6605,6 +6605,30 @@
"refactor/baselines/asr-media-error-validation.json"
],
"resolutionRationale": "Five prepatch unit failures and four native Chromium failures become passing cancellation/recovery checks. Source and actual installed main/legacy pass, including minimum5.3.0 and5.4.0 core controls; default routing and captured cleanup remain intact. WebKit capability skips and broader package acceptance are not waived."
},
{
"id": "THUMB-CLEANUP-01",
"title": "Thumbnail 清理吞掉 falsy 监听器异常或覆盖第一个异常值",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"PKG-TOOL-THUMB-07",
"PKG-TOOL-THUMB-04"
],
"evidence": [
"test/thumbnail-cleanup-errors.test.js",
"test/browser/thumbnail-emitter.spec.js",
"refactor/changes/2026-09-15-PKG-TOOL-THUMB-07-cleanup-errors.md",
"refactor/baselines/thumbnail-cleanup-errors-validation.json"
],
"compatibleResolution": "独立标记是否发生异常,保留首个值并完成其余清理,再原样抛出;普通事件派发遇错停止,重复销毁保持幂等。",
"closureCriteria": "历史/未修复/修复候选对照、七种falsy原值身份、资源释放与真实DOM验证通过;三格式和隔离安装消费者通过,默认兼容冲突独立保留。",
"workspaceState": "PKG-TOOL-THUMB-07: before 1 pass/2 fail; source 123 pass, main/legacy 49 each; browser 57 passed reports include 10 explicit Windows WebKit Blob capability controls. Installed candidate positive/negative types and byte identity verified; no public types or defaults changed.",
"resolutionEvidence": [
"refactor/changes/2026-09-15-PKG-TOOL-THUMB-07-cleanup-errors.md",
"refactor/baselines/thumbnail-cleanup-errors-validation.json"
],
"resolutionRationale": "Frozen historical destroy contracts preserve all seven falsy values; the prepatch candidate fails exception propagation and first-value ownership. Fixed source and rebuilt main/legacy pass cleanup/resource and actual browser DOM regressions. Installed artifact and type checks pass; historical defaults and WebKit media capability gaps remain outside this narrowly resolved regression."
}
]
}
+21 -1
View File
@@ -4205,7 +4205,8 @@
"PKG-TOOL-THUMB-03",
"ENG-04",
"ENG-06",
"CORE-07"
"CORE-07",
"PKG-TOOL-THUMB-07"
],
"status": "doing",
"risk": "H",
@@ -5746,6 +5747,25 @@
"changes/2026-09-15-PKG-AUTO-THUMB-12-metadata.md",
"baselines/auto-thumbnail-metadata-validation.json"
]
},
{
"id": "PKG-TOOL-THUMB-07",
"phase": "5 包迁移:artplayer-tool-thumbnail",
"title": "恢复清理和销毁中的原始异常传播",
"scope": [
"artplayer-tool-thumbnail"
],
"dependsOn": [
"PKG-TOOL-THUMB-03"
],
"status": "done",
"risk": "M",
"deliverable": "清理记录与异常值分离,保留首个 falsy 抛出值并继续释放资源;历史对照、真实DOM、分发验证及维护记录",
"acceptance": "恢复旧 destroy 监听器同步异常语义,0/false/undefined/NaN等不被吞掉或覆盖;后续清理、重复销毁与正常抽帧回归通过,默认兼容决策不受影响",
"evidence": [
"changes/2026-09-15-PKG-TOOL-THUMB-07-cleanup-errors.md",
"baselines/thumbnail-cleanup-errors-validation.json"
]
}
]
}