test(canvas): [PKG-CANVAS-05] checkpoint installed native picture-in-picture

This commit is contained in:
Harvey Zhao committed 2026-09-14 19:08:22 +08:00
1 parent c3967bcbf4
commit 37ebb7a034
21 files changed
+2552 -16

No files matched your search

File diff suppressed because it is too large. Load diff
@@ -0,0 +1,42 @@
# PKG-CANVAS-05 Canvas + 原生 Document PiP 检查点
进行中。新增 canvas-dpip.spec.js 验证实际 requestWindow、Canvas/底层 video/字幕
轨道跨文档归属、持续绘制与时间推进、暂停寻址字幕、插件关闭/原生关闭/销毁。
使用真实本地媒体和 VTT,RAF 观察器转发原生调度,不替换 PiP API 或媒体状态。
不支持的引擎只记录能力缺口,不计作原生窗口播放通过。
首轮为源码组合,18 项成功退出包含 Chromium/Firefox 12 项真实窗口播放与
WebKit 6 项 API 不可用记录。初版明确拒绝安装 map,避免把源码 Document PiP
混称为已安装包;报告保留在 canvas-dpip-source-report。
## 安装与 CI 范围扩展
package-check 通过已有 dpip-contract 核对发布文件,将 Document PiP 加入显式
可选包注册表。现在五包经过源码快照、三格式构建、pack、仓库外离线安装和冻结
重装,再校验全部文件摘要。core/chapter 的36运行时、5旧类型+8精确类型模式
仍是原来的两包范围;不把它们当作 Document PiP 的完整消费者验收。
dpipCandidate 现在优先核验显式安装 map,缺文件/缺包/旧输入报错,不再回退到
源码;冻结 workspace 与独立 ARTPLAYER_DPIP_ARTIFACT 覆盖也不能混用。这个
错误已有旧红新绿:此前不存在的安装map被静默忽略,Node测试3通过1失败;
修正后包/runner/CI检查共46通过,包含缺 Document PiP 安装步骤的工作流反例。
installed scope 和 CI 准备步骤增加第五包及 canvas-dpip.spec.js,仍保留完整
source suite、不吞失败、两份独立报告及原消费者执行顺序。main/legacy 的实际
浏览器结果与输入摘要见[证据](../baselines/canvas-dpip-validation.json):每种格式
均为51项成功退出,其中12项原生PiP、6项API不可用、33项Canvas字幕/生命周期与
Ambilight组合。原生窗口覆盖六种 core/ending 组合各在 Chromium/Firefox 执行,
不把 WebKit 的能力分支计为原生播放。这里不代表远端 CI 已运行。
严格工具 TS、专项/根 lint(0错误/1既有warning)、actionlint 和固定工具链通过。
未新增依赖,也没有更改浏览器重试、超时或媒体断言;新测试初版样式诊断已修复。
## 维护与限制
Canvas、Document PiP 的架构说明和测试/CI入口已同步。本次没有生产运行时修改,
不修改已有全局源码/安装性能门槛。重跑时先提供含五包的安装map,再运行 README
所列命令;source 对照仍独立存在。报告中的 API 不可用分支不是设备支持通过。
PKG-CANVAS-05 仍 doing:实际Safari/移动设备、后台节流和完整生态组合没有闭环。
DPIP-05/06、Canvas-06 及全量远端 CI/发布任务仍开放。作为本任务检查点单独本地
提交,提交审计通过后接续;没有推送、部署或npm发布。回退需一并还原五包CI配置、
加载器、测试与文档,不能只删除安装准备步骤而保留依赖它的新scope。
+1 -1
View File
@@ -2,7 +2,7 @@
浏览器CI现在分别执行 `yarn test:browser:source` 和
`yarn test:browser:installed`。前者清除继承的安装map并保留全部spec;后者要求已
核验的core/chapter/Ambilight/Canvas安装,执行明确列出的installed子集。两步不
核验的core/chapter/Ambilight/Canvas/Document PiP安装,执行明确列出的installed子集。两步不
吞失败,普通失败后仍保存另一范围的证据,分别上传browser-source/browser-installed。
入口与报告规则见[维护说明](../scripts/browser-validation/README.md)。source全量
耗时/60分钟预算、其余插件安装矩阵与远端运行仍待CI-01/CI-04,不计为已通过。
+3 -2
View File
@@ -4,7 +4,7 @@
基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 259 项,范围 22 个包及工作区/示例。
状态:todo 50 / doing 19 / blocked 0 / done 190 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
状态:todo 49 / doing 20 / blocked 0 / done 190 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。
@@ -347,7 +347,7 @@
| PKG-CANVAS-02 | artplayer-proxy-canvas<br>建立特有行为与错误测试 | PKG-CANVAS-01, ENG-03, ENG-05 | ready/loadeddata/canplay、play/seek、回调、resize 与销毁 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | H | done |
| PKG-CANVAS-03 | artplayer-proxy-canvas<br>整理内部职责与资源 | PKG-CANVAS-02, CORE-06, CORE-11, CORE-16 | video adapter/原 canvas 方法/RAF 绘制/事件订阅分离 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | done |
| PKG-CANVAS-04 | artplayer-proxy-canvas<br>迁移自有源码和公开类型 | PKG-CANVAS-03, ENG-04, ENG-06, CORE-07 | canvas 与媒体能力的精确组合类型,保持 Result | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容 | H | done |
| PKG-CANVAS-05 | artplayer-proxy-canvas<br>验证新旧核心和组合 | PKG-CANVAS-04, CORE-22, PKG-DPIP-04, PKG-FACTORY-01, PKG-CANVAS-SUBTITLE-01 | 真实 video/canvas 绘制、字幕和 document PiP 恢复 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | H | todo |
| PKG-CANVAS-05 | artplayer-proxy-canvas<br>验证新旧核心和组合 | PKG-CANVAS-04, CORE-22, PKG-DPIP-04, PKG-FACTORY-01, PKG-CANVAS-SUBTITLE-01 | 真实 video/canvas 绘制、字幕和 document PiP 恢复 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | H | doing |
| PKG-CANVAS-06 | artplayer-proxy-canvas<br>验证分发并同步文档 | PKG-CANVAS-05, ENG-07 | canvas.js、三种产物、调用兼容与资源证据 | tarball 入口/资源、类型、8082 demo 和 README 一致,有回退记录 | H | todo |
| PKG-CANVAS-SUBTITLE-01 | artplayer-proxy-canvas<br>修复 Canvas 代理原生字幕轨道挂载 | PKG-CANVAS-04 | 初始字幕能力、原生轨道挂载与资源生命周期适配及新旧核心回归 | 复现旧字幕 cues 为空;新旧核心加载、寻址、切换、销毁通过;普通 Canvas 节点行为和分发入口保持兼容 | M | done |
@@ -611,6 +611,7 @@
- PKG-CANVAS-02: [记录](changes/2026-09-12-PKG-CANVAS-02-tests.md) [记录](baselines/canvas-behavior-validation.json) [记录](canvas-validation.md)
- PKG-CANVAS-03: [记录](changes/2026-09-12-PKG-CANVAS-03-lifecycle.md) [记录](baselines/canvas-lifecycle-validation.json) [记录](canvas-validation.md)
- PKG-CANVAS-04: [记录](changes/2026-09-12-PKG-CANVAS-04-types.md) [记录](baselines/canvas-types-validation.json) [记录](canvas-validation.md)
- PKG-CANVAS-05: [记录](changes/2026-09-14-PKG-CANVAS-05-native-pip.md) [记录](baselines/canvas-dpip-validation.json) [记录](baselines/canvas-subtitles-validation.json) [记录](baselines/ambilight-installed-validation.json)
- PKG-MB-01: [记录](baselines/mb-release.json) [记录](baselines/mb-surface.json) [记录](baselines/mb-contract.md) [记录](baselines/mb-contract-validation.json) [记录](mb-validation.md) [记录](changes/2026-09-12-PKG-MB-01-contract.md)
- PKG-MB-02: [记录](changes/2026-09-12-PKG-MB-02-checkpoint.md) [记录](baselines/mb-media-checkpoint.json) [记录](mb-validation.md) [记录](changes/2026-09-12-PKG-MB-02-baseline.md) [记录](baselines/mb-behavior-validation.json)
- PKG-MB-03: [记录](changes/2026-09-12-PKG-MB-03-input.md) [记录](baselines/mb-input-validation.json)
+15
View File
@@ -1,5 +1,20 @@
# 进度与证据
## PKG-CANVAS-05 原生 PiP 与五包安装检查点(仍 doing)
源码首轮18项:Chromium/Firefox实际原生窗口12通过,WebKit仅6项API不可用记录。
Canvas、底层video与track一起移入窗口,播放/绘制继续,暂停seek字幕正确;插件
关闭、原生关闭和销毁均恢复/释放节点、窗口、占位与RAF。不是iframe模拟。
进一步把Document PiP加入已核验安装包注册与CI:五包离线安装/冻结重装和指纹检查
通过,main/legacy各51项成功退出(各12原生PiP+6不可用+33其他组合)。
修复dpip加载器忽略安装map回退源码的问题:旧Node测试3通过1失败,修正后工程/
工作流46通过;DPIP-INSTALLED-PROVENANCE-01按该证据关闭。缺map/缺包/陈旧输入及
冲突覆盖均不允许源码替代。严格工具TS、lint(1既有warning)、actionlint/工具链通过。
见[检查点](changes/2026-09-14-PKG-CANVAS-05-native-pip.md)和
[证据](baselines/canvas-dpip-validation.json)。259项:190 done、20 doing、49 todo。
Canvas真机/后台节流、DPIP完整消费者/设备、完整远端CI和发布仍开放;没有生产
运行时修改、依赖新增、push、部署或发布。该检查点独立提交后审计再继续下一步。
## PKG-CANVAS-SUBTITLE-01 原生字幕轨道修复完成
新旧核心三引擎复现 Canvas 字幕为空。先前说明需修正:初始失败中的 $track
+1
View File
@@ -273,3 +273,4 @@
| VCONSOLE-LIFECYCLE-01 | resolved / 已复现 | vConsole delayed log, panel and scroller work outlives its owner | SITE-07, SITE-05, SITE-VCONSOLE-01 |
| CHAPTER-FULLSCREEN-GEOMETRY-01 | resolved / 已复现 | Chromium 原生全屏后章节 hover 标题曾出现后又隐藏 | PKG-CHAPTER-05, PKG-CHAPTER-HOVER-01 |
| CANVAS-SUBTITLE-01 | resolved / 已复现 | Canvas底层video缺初始字幕轨道且普通Canvas挂载不能加载原生字幕 | PKG-CANVAS-SUBTITLE-01, PKG-CANVAS-05 |
| DPIP-INSTALLED-PROVENANCE-01 | resolved / 已复现 | Document PiP测试加载器忽略显式安装map并回退到源码 | PKG-CANVAS-05, CI-01 |
+24
View File
@@ -6241,6 +6241,30 @@
"test/browser/canvas-subtitles.spec.js"
],
"resolutionRationale": "Initial candidate and routing-only controls each fail all six subtitle cases. Bootstrap + insertion adaptation passes; npm 1.1.0 independently fails all six. Expanded native source tests pass 24; installed main and legacy pass 33 each; final six pass after adding baseline selection. Captions also visibly render in the local demo. This fixes subtitle capability/insertion only; broader Canvas integration remains open."
},
{
"id": "DPIP-INSTALLED-PROVENANCE-01",
"title": "Document PiP测试加载器忽略显式安装map并回退到源码",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"PKG-CANVAS-05",
"CI-01"
],
"evidence": [
"test/package-check.test.js",
"refactor/baselines/canvas-dpip-validation.json"
],
"compatibleResolution": "使用已安装文件及source/build指纹,缺输入拒绝执行;保留独立source模式。",
"closureCriteria": "缺安装map旧红新绿,实际五包main/legacy原生组合与工作流配置验证。",
"workspaceState": "Explicit map takes precedence; DPIP frozen/artifact overrides conflict instead of overriding installed provenance. Current CI prepares five packages before browser scopes.",
"resolutionEvidence": [
"refactor/changes/2026-09-14-PKG-CANVAS-05-native-pip.md",
"refactor/baselines/canvas-dpip-validation.json",
"test/helpers/dpip.js",
"refactor/scripts/ci-workflow.test.mjs"
],
"resolutionRationale": "Old loader test reports missing expected rejection; updated loader rejects missing/stale maps and conflicting modes. Five-package isolated build/pack/install supplies main and legacy native PiP tests with package hashes. Local workflow mutation protects the required DPIP preparation; remote runs remain unverified."
}
]
}
+2 -2
View File
@@ -90,10 +90,10 @@ export function validateCIWorkflow(source) {
const vueIndex = browser.steps.findIndex(step => step.run === 'yarn test:vue-consumer 2>&1 | tee refactor/.cache/ci/vue-consumer.log')
assert(vueIndex > consumerIndex && !Object.hasOwn(browser.steps[vueIndex], 'if'), 'Run Vue installed consumers after restoring canonical Node')
assert(browser.steps.some(step => step.uses?.startsWith('actions/upload-artifact@') && step.if === 'always()' && step.with.path.split('\n').includes('refactor/.cache/vue-consumer-*/')), 'Retain Vue consumer failure evidence')
const extraIndex = browser.steps.findIndex(step => step.run?.startsWith('yarn test:package --include=artplayer-plugin-ambilight,artplayer-proxy-canvas '))
const extraIndex = browser.steps.findIndex(step => step.run?.startsWith('yarn test:package --include=artplayer-plugin-ambilight,artplayer-proxy-canvas,artplayer-plugin-document-pip '))
const sourceEngineIndex = browser.steps.findIndex(step => step.run === 'yarn test:browser:source 2>&1 | tee refactor/.cache/ci/browser-source.log')
const engineIndex = browser.steps.findIndex(step => step.run === 'yarn test:browser:installed 2>&1 | tee refactor/.cache/ci/browser-installed.log')
assert(extraIndex > Math.max(consumerIndex, reactIndex, vueIndex) && extraIndex < engineIndex, 'Prepare installed Ambilight/Canvas after consumer probes and before browser checks')
assert(extraIndex > Math.max(consumerIndex, reactIndex, vueIndex) && extraIndex < engineIndex, 'Prepare installed Ambilight/Canvas/Document PiP after consumer probes and before browser checks')
assert(!Object.hasOwn(browser.steps[extraIndex], 'if') && browser.steps[extraIndex].run.includes('GITHUB_ENV') && browser.steps[extraIndex].run.includes('ARTPLAYER_BROWSER_ARTIFACTS='), 'Always select the additional installed browser artifact map')
assert(sourceEngineIndex > extraIndex && sourceEngineIndex < engineIndex, 'Retain complete source checks before the additional installed suite')
for (const index of [sourceEngineIndex, engineIndex]) {
+4
View File
@@ -34,6 +34,10 @@ for (const [name, mutate] of [
['wrong consumer Node version', w => w.jobs['browser-smoke'].steps.find(s => s.id === 'consumer-node-20').with['node-version'] = '24'],
['skipped installed consumer', w => w.jobs['browser-smoke'].steps.find(s => s.run?.includes('--expected-node 22.12.0')).if = 'false'],
['missing browser plugin installation', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:package --include=')).run = 'echo omitted'],
['missing Document PiP browser installation', (w) => {
const step = w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:package --include='))
step.run = step.run.replace(',artplayer-plugin-document-pip', '')
}],
['skipped browser plugin installation', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:package --include=')).if = 'false'],
['missing source browser checks', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:browser:source ')).run = 'echo omitted'],
['filtered source browser checks', w => w.jobs['browser-smoke'].steps.find(s => s.run?.startsWith('yarn test:browser:source ')).run += ' --grep subset'],
+7 -2
View File
@@ -3638,11 +3638,16 @@
"PKG-FACTORY-01",
"PKG-CANVAS-SUBTITLE-01"
],
"status": "todo",
"status": "doing",
"risk": "H",
"deliverable": "真实 video/canvas 绘制、字幕和 document PiP 恢复",
"acceptance": "最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成",
"evidence": []
"evidence": [
"changes/2026-09-14-PKG-CANVAS-05-native-pip.md",
"baselines/canvas-dpip-validation.json",
"baselines/canvas-subtitles-validation.json",
"baselines/ambilight-installed-validation.json"
]
},
{
"id": "PKG-CANVAS-06",