5.5 KiB
PKG-MB-07:HLS配对、选择意图与UI拓扑
任务通过完整CI后标记done,并立即以专用本地提交交付。来源ccee9157a70725e7f6bf77dc43ff2566bfa14540, 冻结源码及main见来源基线,最终检查、报告和哈希见 验证记录。
实际结构
删除m3u8.js,迁移为m3u8.ts,拆出m3u8-model.ts、m3u8-menu.ts、m3u8-types.ts。 协调模块管理refresh版本、选择意图、source与事件;model生成label、排序和selector; menu拥有controls/setting两个独立入口,types限定所需UI/shim能力,避免接收不受约束的art。 包内30个生产TS模块,剩index.js由MB-08接续。tsconfig引用现有共享assets.d.ts声明SVG导入; 没有新依赖,public Option/Result/factory声明未修改。
hls-selection.ts统一质量/音频请求的意图标识与source/Input检查,并分别保留配对策略。 较新的请求使尚在查询的旧请求失效,包括质量和音频交叉选择。已进入replaceTracks的操作 仍由Playback控制,到下一个replacement开始才被替代,不声称点击即同步终止SDK解码。 当先前replacement在最新查询期间安装另一份media时,最新查询对新的media重新计算, 避免简单的media相等检查丢弃最新意图,或Auto音轨按旧视频配对。当前查询失败仍拒绝; 过期查询/替换失败被观察,不覆盖当前选择。状态getter同时检查source代数和media身份。
兼容与生命周期修复
保留原有mediabunny-quality/audio名称、右侧control、setting宽度200、图标、间距、 标题/Auto/getName默认值、质量降序、通知格式、onSelect Promise与label返回值。 Auto仍是操作入口,显示与高亮基于实际选择轨道;自动模式下也不会只按mode伪造高亮。 相同label仍合并,但合并组中保留实际选中的ID,修复选中项被前一个同名条目遮蔽的问题。 排序改为提前建立height索引,避免比较器反复find数组。
refresh版本与选择意图分开:迟到状态不覆盖新模型,同一可见菜单在首个选择未完成时 仍接受下一次点击;自身loadedmetadata刷新不使有效选择的完成失效。被替换菜单或旧source 回调不再切轨、通知或刷新。选择失败恢复实际轨道高亮后保持原拒绝,恢复期间被新意图替代的 旧失败不再外溢;事件自动refresh明确观察拒绝。getName和registry回调的同步切源/销毁 在每个后续阶段前重新检查,避免重建已关闭UI。
control/setting分别拥有与移除。关闭一侧会清理它并保留另一侧;单音轨/纯视频清理audio, 非HLS清理两类菜单;loadstart/error/destroy立即使旧工作失效并清理已拥有入口。 清理尝试全部入口和全部监听器,即使其中一个抛错也继续,并保证入口的shim销毁仍执行。 这些模块不对外新增canvas属性或API;EnginePort补充已有只读source/destroyed能力用于内部检查。
复现与验证
- 首批27条旧main断言5通过/22失败;最终43条旧main为11通过/32失败,无取消或跳过。 候选全部通过,覆盖乱序刷新、旧回调、单入口关闭、失败恢复、清理异常、实际选中ID、 连续/跨类型轨道选择和配对期间media变化。配对和失败恢复的中间候选缺陷另有复现日志。
- 候选包专项226通过;main/legacy各202通过,每个产物命令含198候选断言及4冻结正常事件对照。
- 新增30浏览器场景:两套真实核心×五类场景×三个引擎。Chromium/Firefox共20项真实 MediaBunny解析/解码和DOM菜单验证;Windows WebKit10项明确媒体能力缺失对照。
- 同30条浏览器断言对旧main:14通过/16失败。四个正常菜单场景和十个能力对照通过; 失败分布在单侧control关闭、旧source/destroy状态写回、最新选择被早期请求覆盖。 单侧关闭失败是明确等待目标UI被删除未满足,其余是状态/写入次数/最终轨道断言。
- 真实菜单场景点击quality控件和audio设置项,再切Auto,验证实际配对与两个入口高亮; 每次替换恰好一套loadedmetadata/loadeddata/canplay/canplaythrough/seeked,三次共三套。
- 首次Firefox检查在解码完成前读取事件计数(为0)而失败,改用原超时等待精确完成序列; 下一轮暴露轮询未处理状态getter合法的临时null,改为等待非null目标值。没有放宽事件数量、 静默跳过或拉长超时,失败报告/results均保留。
- 最终构建main运行全部七个MediaBunny浏览器文件;详细结果在验证记录中核验。
- 严格TS、lint、三格式build、ESM默认factory及dist/docs逐字节一致性单独检查。 根test:unit与test:mediabunny加入HLS断言,完整CI持续执行。
最终完整CI1387项(1232单元+14工程+141基线)通过,另44重复契约;320生产TS。 全部七个MediaBunny浏览器文件108项通过,其中29项为Windows WebKit能力缺失对照。 最终源码/测试/产物/报告哈希已核验,main与浏览器所测文件字节一致,dist与docs三格式一致。
后续与回退
MB-LIFE-01仍open,剩长播放、完整媒体/核心/插件组合和物理设备证据归MB-09;编码能力/ undecodable fallback与公共shim/factory声明由MB-08及MB-CAP-01/MB-READY-01处理。 MB-10验证demo、真实安装包和MPL/source通知。本项通过不构成npm发布验收。 回退revert专用提交,历史冻结源码与报告保留。下一项MB-08完成入口TS、能力与声明边界。