From 475d38043e917b412018c6851d6a7464ef7bda67 Mon Sep 17 00:00:00 2001 From: Harvey Zhao Date: Mon, 14 Sep 2026 21:32:10 +0800 Subject: [PATCH] test(danmuku): [PKG-DANMUKU-08] cover old plugin combinations and expose model load failures --- .../ARCHITECTURE.md | 7 + .../artplayer-plugin-danmuku/ARCHITECTURE.md | 13 +- .../danmuku-combined-load-validation.json | 10637 ++++++++++++++++ ...2026-09-14-PKG-DANMUKU-08-combined-load.md | 77 + refactor/plan.md | 21 +- refactor/progress.md | 21 + refactor/risk-table.md | 1 + refactor/risks.json | 20 + refactor/tasks.json | 32 +- test/browser/README.md | 8 + test/browser/danmuku-dpip.spec.js | 306 +- test/browser/danmuku-mask-native.spec.js | 278 +- test/helpers/danmuku-combination-load.js | 60 + 13 files changed, 11199 insertions(+), 282 deletions(-) create mode 100644 refactor/baselines/danmuku-combined-load-validation.json create mode 100644 refactor/changes/2026-09-14-PKG-DANMUKU-08-combined-load.md create mode 100644 test/helpers/danmuku-combination-load.js diff --git a/packages/artplayer-plugin-danmuku-mask/ARCHITECTURE.md b/packages/artplayer-plugin-danmuku-mask/ARCHITECTURE.md index 8b05aa4d0..4d6bf9d6c 100644 --- a/packages/artplayer-plugin-danmuku-mask/ARCHITECTURE.md +++ b/packages/artplayer-plugin-danmuku-mask/ARCHITECTURE.md @@ -1,5 +1,12 @@ # Danmuku Mask maintenance map +The native combination suite includes both frozen/current Danmuku with three core +versions and a bounded 20 rows/s load after model readiness. Model output must +continue during that load. Current Chromium/WebKit delivery failures block the +combination gate under PKG-DANMUKU-MASK-LOAD-01; Firefox passes do not close them. +See `refactor/changes/2026-09-14-PKG-DANMUKU-08-combined-load.md` for exact source +inputs, historical observations and the still-unproven performance cause. + The compatibility baseline is the actual npm 1.1.0 package and the earlier 1.0.0 export shape. Sources and historical failure probes are recorded in `refactor/baselines/danmuku-mask-contract.md`, `danmuku-mask-release.json` and diff --git a/packages/artplayer-plugin-danmuku/ARCHITECTURE.md b/packages/artplayer-plugin-danmuku/ARCHITECTURE.md index ea7272cb2..599d8b2c4 100644 --- a/packages/artplayer-plugin-danmuku/ARCHITECTURE.md +++ b/packages/artplayer-plugin-danmuku/ARCHITECTURE.md @@ -1,11 +1,14 @@ # Danmuku maintenance map -`test/browser/danmuku-dpip.spec.js` exercises the candidate with old/current cores +`test/browser/danmuku-dpip.spec.js` exercises frozen/current plugins with old/current cores in two sequential native Document PiP windows. It checks timestamp-delivered text, adopted layer and heatmap nodes, stylesheet layout, one surviving track Worker, close/native-close/destroy cleanup, and no retained scheduling operation. Native API absence is reported separately; it does not simulate a popup or count as -playback evidence. This is not a background-throttling or device benchmark. +playback evidence. Frozen 5.3.0 retains renderer/Setting nodes on destroy(false); +its explicit historical outcome is not candidate cleanup acceptance. The load +case runs 120 timestamped rows in each of two windows, observing native RAF in +the player's owning window. This is not a background-throttling or device benchmark. Set `ARTPLAYER_DANMUKU_ARTIFACT` and `ARTPLAYER_DPIP_ARTIFACT` together to check the corresponding built formats; both loaded hashes appear in each attachment. @@ -15,6 +18,12 @@ both plugins from source by default. `ARTPLAYER_MASK_ARTIFACT` and Do not substitute a stale dist file for source checks. Installation, remaining old-plugin combinations, combined-load performance and devices remain task 08/09. +The actual Mask combination now also tests frozen 5.3.0 and a 20 rows/s post-model +load. `test/helpers/danmuku-combination-load.js` owns only test RAF/listeners and +retains observations after failed assertions. Candidate complete delivery remains +mandatory. Chromium/WebKit failures are tracked by DANMUKU-MASK-LOAD-01 and +PKG-DANMUKU-MASK-LOAD-01; ordinary playback or Firefox passes cannot close them. + `danmuku-fullscreen.spec.js` tests all old/current core and plugin pairs in real document and CSS web fullscreen, with three fresh player lifetimes per case. Each lifetime must show a timestamp-delivered row, restore layout and release its diff --git a/refactor/baselines/danmuku-combined-load-validation.json b/refactor/baselines/danmuku-combined-load-validation.json new file mode 100644 index 000000000..7f5756788 --- /dev/null +++ b/refactor/baselines/danmuku-combined-load-validation.json @@ -0,0 +1,10637 @@ +{ + "schemaVersion": 1, + "task": "PKG-DANMUKU-08", + "status": "partial-with-failures", + "capturedAt": "2026-09-14T13:27:59.880Z", + "reports": [ + { + "file": "refactor/.cache/danmuku08-old-dpip-first-report/report.json", + "sha256": "ef21275ea1469e0ecb8664ecb112c59bb48370d8d524addca56c094496019a00", + "stats": { + "startTime": "2026-09-14T13:15:17.675Z", + "duration": 43219.858, + "expected": 6, + "skipped": 0, + "unexpected": 12, + "flaky": 0 + }, + "terminal": { + "scope": "source", + "exitCode": 1, + "signal": null, + "args": [ + "test", + "--config=playwright.source.config.js", + "test/browser/danmuku-dpip.spec.js", + "--grep", + "published Danmuku", + "--workers=2" + ] + }, + "cases": [ + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "chromium", + "status": "failed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.471765, + "rowTime": 0.952931, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.909444, + "rowTime": 2.417578, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "chromium", + "status": "failed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.437296, + "rowTime": 0.936, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.758481, + "rowTime": 2.252623, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "chromium", + "status": "failed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.462289, + "rowTime": 0.969727, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.89643, + "rowTime": 2.403676, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "chromium", + "status": "failed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.473581, + "rowTime": 0.952932, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.907508, + "rowTime": 2.417641, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "chromium", + "status": "failed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.427497, + "rowTime": 0.930632, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.734819, + "rowTime": 2.228827, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "chromium", + "status": "failed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.460072, + "rowTime": 0.968379, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.895661, + "rowTime": 2.400858, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "firefox", + "status": "failed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.543397, + "rowTime": 1.0432, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 3.003464, + "rowTime": 2.503059, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "firefox", + "status": "failed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.437792, + "rowTime": 0.952837, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.836449, + "rowTime": 2.335841, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "firefox", + "status": "failed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.085103, + "rowTime": 1.04307, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.544711, + "rowTime": 2.042573, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "firefox", + "status": "failed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.376535, + "rowTime": 0.876036, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.836592, + "rowTime": 2.335981, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "firefox", + "status": "failed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.418253, + "rowTime": 0.917937, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.793388, + "rowTime": 2.293155, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "firefox", + "status": "failed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "incomplete", + "supported": true, + "rounds": [ + { + "time": 1.669101, + "rowTime": 1.168235, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 3.168836, + "rowTime": 2.66948, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-dpip.spec.js", + "column": 96, + "line": 161 + } + ] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + } + ] + }, + { + "file": "refactor/.cache/danmuku08-dpip-matrix-report/report.json", + "sha256": "558ec90a55e6619fdc37476d5ca57f662c89b44bccd66556b3e75a1ffcaaec35", + "stats": { + "startTime": "2026-09-14T13:17:03.592Z", + "duration": 53459.149, + "expected": 36, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "terminal": { + "scope": "source", + "exitCode": 0, + "signal": null, + "args": [ + "test", + "--config=playwright.source.config.js", + "test/browser/danmuku-dpip.spec.js", + "--workers=2" + ] + }, + "cases": [ + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.429829, + "rowTime": 0.931207, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.851433, + "rowTime": 2.361696, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.455025, + "rowTime": 0.939535, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.765606, + "rowTime": 2.271871, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.438192, + "rowTime": 0.942169, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.835138, + "rowTime": 2.352415, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.426765, + "rowTime": 0.922001, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 2.84299, + "rowTime": 2.33608, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.41599, + "rowTime": 0.921451, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 2.706412, + "rowTime": 2.221257, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.422234, + "rowTime": 0.924167, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 2.829951, + "rowTime": 2.335797, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.437598, + "rowTime": 0.936319, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.876794, + "rowTime": 2.368695, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.43109, + "rowTime": 0.923512, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.751958, + "rowTime": 2.25446, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.42963, + "rowTime": 0.940172, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.838521, + "rowTime": 2.352911, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.391803, + "rowTime": 0.920637, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 2.813292, + "rowTime": 2.302494, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.40786, + "rowTime": 0.923829, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 2.702896, + "rowTime": 2.221246, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.433054, + "rowTime": 0.93887, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 2.849369, + "rowTime": 2.353618, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.460142, + "rowTime": 0.959542, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.961633, + "rowTime": 2.461228, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.627186, + "rowTime": 1.12518, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 3.003163, + "rowTime": 2.502678, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.545677, + "rowTime": 1.043286, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 3.002119, + "rowTime": 2.503042, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 0.917956, + "rowTime": 0.876127, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 2.335883, + "rowTime": 1.835574, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.668517, + "rowTime": 1.168362, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 3.086948, + "rowTime": 2.586274, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.626952, + "rowTime": 1.125112, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 2.586405, + "rowTime": 2.586405, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.460088, + "rowTime": 0.972765, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.982551, + "rowTime": 2.457345, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.62809, + "rowTime": 1.092546, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 2.627762, + "rowTime": 2.586168, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.626746, + "rowTime": 1.126289, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 3.137225, + "rowTime": 2.612965, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 3 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 3 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "nodes": 3, + "settings": 1, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.669155, + "rowTime": 1.126646, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 3.086722, + "rowTime": 2.586484, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.626838, + "rowTime": 1.126223, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 3.139004, + "rowTime": 2.613106, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.668895, + "rowTime": 1.168148, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 3.128411, + "rowTime": 2.628134, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 2 + } + ], + "errors": [], + "events": [ + true, + false, + true + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP native-close", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP destroy", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + } + ] + }, + { + "file": "refactor/.cache/danmuku08-mask-load-first-report/report.json", + "sha256": "30df88acdfd9ec0ddf9cc97575477b4de42320fee697fcfac3832f18b9f62cf7", + "stats": { + "startTime": "2026-09-14T13:20:32.018Z", + "duration": 220149.66, + "expected": 12, + "skipped": 0, + "unexpected": 6, + "flaky": 0 + }, + "terminal": { + "scope": "source", + "exitCode": 1, + "signal": null, + "args": [ + "test", + "--config=playwright.source.config.js", + "test/browser/danmuku-mask-native.spec.js", + "--grep", + "actual model and Danmuku", + "--workers=2" + ] + }, + "cases": [ + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with candidate core / published plugin", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "file": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 26.381382, + "end": 35.753538, + "startWall": 14522.399999976158, + "endWall": 23913.69999998808, + "scheduled": 120, + "visible": 34, + "uniqueVisible": 34, + "notVisible": [ + { + "id": "Mask load-5", + "text": "Mask load 5", + "time": 27.131382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-6", + "text": "Mask load 6", + "time": 27.181382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-7", + "text": "Mask load 7", + "time": 27.231382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-8", + "text": "Mask load 8", + "time": 27.281381999999997, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-9", + "text": "Mask load 9", + "time": 27.331381999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-10", + "text": "Mask load 10", + "time": 27.381382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-11", + "text": "Mask load 11", + "time": 27.431382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-12", + "text": "Mask load 12", + "time": 27.481382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-13", + "text": "Mask load 13", + "time": 27.531381999999997, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-18", + "text": "Mask load 18", + "time": 27.781381999999997, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-19", + "text": "Mask load 19", + "time": 27.831381999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-20", + "text": "Mask load 20", + "time": 27.881382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-21", + "text": "Mask load 21", + "time": 27.931382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-22", + "text": "Mask load 22", + "time": 27.981382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-23", + "text": "Mask load 23", + "time": 28.031381999999997, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-24", + "text": "Mask load 24", + "time": 28.081381999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-25", + "text": "Mask load 25", + "time": 28.131382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-26", + "text": "Mask load 26", + "time": 28.181382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-27", + "text": "Mask load 27", + "time": 28.231382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-32", + "text": "Mask load 32", + "time": 28.481382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-33", + "text": "Mask load 33", + "time": 28.531381999999997, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-34", + "text": "Mask load 34", + "time": 28.581381999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-35", + "text": "Mask load 35", + "time": 28.631382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-36", + "text": "Mask load 36", + "time": 28.681382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-37", + "text": "Mask load 37", + "time": 28.731382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-38", + "text": "Mask load 38", + "time": 28.781381999999997, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-39", + "text": "Mask load 39", + "time": 28.831381999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-40", + "text": "Mask load 40", + "time": 28.881382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-41", + "text": "Mask load 41", + "time": 28.931382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-46", + "text": "Mask load 46", + "time": 29.181382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-47", + "text": "Mask load 47", + "time": 29.231382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-48", + "text": "Mask load 48", + "time": 29.281381999999997, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-49", + "text": "Mask load 49", + "time": 29.331381999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-50", + "text": "Mask load 50", + "time": 29.381382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-51", + "text": "Mask load 51", + "time": 29.431382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-52", + "text": "Mask load 52", + "time": 29.481382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-53", + "text": "Mask load 53", + "time": 29.531381999999997, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-54", + "text": "Mask load 54", + "time": 29.581381999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-55", + "text": "Mask load 55", + "time": 29.631382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-56", + "text": "Mask load 56", + "time": 29.681382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-61", + "text": "Mask load 61", + "time": 29.931382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-62", + "text": "Mask load 62", + "time": 29.981382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-63", + "text": "Mask load 63", + "time": 30.031381999999997, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-64", + "text": "Mask load 64", + "time": 30.081381999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-65", + "text": "Mask load 65", + "time": 30.131382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-66", + "text": "Mask load 66", + "time": 30.181382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-67", + "text": "Mask load 67", + "time": 30.231382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-68", + "text": "Mask load 68", + "time": 30.281381999999997, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-69", + "text": "Mask load 69", + "time": 30.331381999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-70", + "text": "Mask load 70", + "time": 30.381382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-71", + "text": "Mask load 71", + "time": 30.431382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-72", + "text": "Mask load 72", + "time": 30.481382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-73", + "text": "Mask load 73", + "time": 30.531381999999997, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-78", + "text": "Mask load 78", + "time": 30.781381999999997, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-79", + "text": "Mask load 79", + "time": 30.831381999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-80", + "text": "Mask load 80", + "time": 30.881382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-81", + "text": "Mask load 81", + "time": 30.931382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-82", + "text": "Mask load 82", + "time": 30.981381999999996, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-83", + "text": "Mask load 83", + "time": 31.031382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-84", + "text": "Mask load 84", + "time": 31.081381999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-85", + "text": "Mask load 85", + "time": 31.131382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-86", + "text": "Mask load 86", + "time": 31.181382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-87", + "text": "Mask load 87", + "time": 31.231381999999996, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-88", + "text": "Mask load 88", + "time": 31.281382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-93", + "text": "Mask load 93", + "time": 31.531382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-94", + "text": "Mask load 94", + "time": 31.581381999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-95", + "text": "Mask load 95", + "time": 31.631382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-96", + "text": "Mask load 96", + "time": 31.681382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-97", + "text": "Mask load 97", + "time": 31.731381999999996, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-98", + "text": "Mask load 98", + "time": 31.781382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-99", + "text": "Mask load 99", + "time": 31.831381999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-100", + "text": "Mask load 100", + "time": 31.881382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-101", + "text": "Mask load 101", + "time": 31.931382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-102", + "text": "Mask load 102", + "time": 31.981381999999996, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-103", + "text": "Mask load 103", + "time": 32.031382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-104", + "text": "Mask load 104", + "time": 32.081382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-109", + "text": "Mask load 109", + "time": 32.331382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-110", + "text": "Mask load 110", + "time": 32.381382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-111", + "text": "Mask load 111", + "time": 32.431382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-112", + "text": "Mask load 112", + "time": 32.481381999999996, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-113", + "text": "Mask load 113", + "time": 32.531382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-114", + "text": "Mask load 114", + "time": 32.581382, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-115", + "text": "Mask load 115", + "time": 32.631382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-116", + "text": "Mask load 116", + "time": 32.681382, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-117", + "text": "Mask load 117", + "time": 32.731381999999996, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-118", + "text": "Mask load 118", + "time": 32.781382, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + } + ], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 11, + "pooled": 9, + "uniquePool": 9, + "modelOutputs": 57, + "frameGapsMs": { + "count": 50, + "median": 180.69999998807907, + "p95": 216.30000001192093, + "max": 233.5 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 9.510804, + "outputs": 18, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 11.718147, + "outputs": 31, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 31, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 24.096207, + "outputs": 55, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with candidate core / candidate plugin", + "engine": "chromium", + "status": "failed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "file": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "base": 25.322522, + "end": 34.401623, + "startWall": 12583.700000047684, + "endWall": 21682.700000047684, + "scheduled": 120, + "visible": 49, + "uniqueVisible": 49, + "notVisible": [ + { + "id": "Mask load-49", + "text": "Mask load 49", + "time": 28.272522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-50", + "text": "Mask load 50", + "time": 28.322522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-51", + "text": "Mask load 51", + "time": 28.372522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-52", + "text": "Mask load 52", + "time": 28.422522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-53", + "text": "Mask load 53", + "time": 28.472521999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-54", + "text": "Mask load 54", + "time": 28.522522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-55", + "text": "Mask load 55", + "time": 28.572522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-56", + "text": "Mask load 56", + "time": 28.622522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-57", + "text": "Mask load 57", + "time": 28.672522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-58", + "text": "Mask load 58", + "time": 28.722521999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-59", + "text": "Mask load 59", + "time": 28.772522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-60", + "text": "Mask load 60", + "time": 28.822522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-61", + "text": "Mask load 61", + "time": 28.872522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-62", + "text": "Mask load 62", + "time": 28.922522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-63", + "text": "Mask load 63", + "time": 28.972521999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-64", + "text": "Mask load 64", + "time": 29.022522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-65", + "text": "Mask load 65", + "time": 29.072522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-66", + "text": "Mask load 66", + "time": 29.122522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-67", + "text": "Mask load 67", + "time": 29.172522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-68", + "text": "Mask load 68", + "time": 29.222521999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-69", + "text": "Mask load 69", + "time": 29.272522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-70", + "text": "Mask load 70", + "time": 29.322522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-71", + "text": "Mask load 71", + "time": 29.372522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-72", + "text": "Mask load 72", + "time": 29.422522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-73", + "text": "Mask load 73", + "time": 29.472521999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-74", + "text": "Mask load 74", + "time": 29.522522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-75", + "text": "Mask load 75", + "time": 29.572522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-76", + "text": "Mask load 76", + "time": 29.622522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-77", + "text": "Mask load 77", + "time": 29.672522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-78", + "text": "Mask load 78", + "time": 29.722521999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-79", + "text": "Mask load 79", + "time": 29.772522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-80", + "text": "Mask load 80", + "time": 29.822522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-81", + "text": "Mask load 81", + "time": 29.872522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-82", + "text": "Mask load 82", + "time": 29.922522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-83", + "text": "Mask load 83", + "time": 29.972521999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-84", + "text": "Mask load 84", + "time": 30.022522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-85", + "text": "Mask load 85", + "time": 30.072522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-86", + "text": "Mask load 86", + "time": 30.122522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-87", + "text": "Mask load 87", + "time": 30.172522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-88", + "text": "Mask load 88", + "time": 30.222521999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-89", + "text": "Mask load 89", + "time": 30.272522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-90", + "text": "Mask load 90", + "time": 30.322522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-91", + "text": "Mask load 91", + "time": 30.372522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-92", + "text": "Mask load 92", + "time": 30.422522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-93", + "text": "Mask load 93", + "time": 30.472521999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-94", + "text": "Mask load 94", + "time": 30.522522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-95", + "text": "Mask load 95", + "time": 30.572522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-96", + "text": "Mask load 96", + "time": 30.622522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-97", + "text": "Mask load 97", + "time": 30.672522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-98", + "text": "Mask load 98", + "time": 30.722521999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-99", + "text": "Mask load 99", + "time": 30.772522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-100", + "text": "Mask load 100", + "time": 30.822522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-101", + "text": "Mask load 101", + "time": 30.872522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-102", + "text": "Mask load 102", + "time": 30.922522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-103", + "text": "Mask load 103", + "time": 30.972521999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-104", + "text": "Mask load 104", + "time": 31.022522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-105", + "text": "Mask load 105", + "time": 31.072522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-106", + "text": "Mask load 106", + "time": 31.122522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-107", + "text": "Mask load 107", + "time": 31.172522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-108", + "text": "Mask load 108", + "time": 31.222521999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-109", + "text": "Mask load 109", + "time": 31.272522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-110", + "text": "Mask load 110", + "time": 31.322522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-111", + "text": "Mask load 111", + "time": 31.372522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-112", + "text": "Mask load 112", + "time": 31.422522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-113", + "text": "Mask load 113", + "time": 31.472521999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-114", + "text": "Mask load 114", + "time": 31.522522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-115", + "text": "Mask load 115", + "time": 31.572522, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-116", + "text": "Mask load 116", + "time": 31.622522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-117", + "text": "Mask load 117", + "time": 31.672522, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-118", + "text": "Mask load 118", + "time": 31.722521999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-119", + "text": "Mask load 119", + "time": 31.772522, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + } + ], + "loaded": 120, + "waiting": 114, + "referenced": 7, + "nodes": 9, + "pooled": 2, + "uniquePool": 2, + "frameGapsMs": { + "count": 50, + "median": 173.10000002384186, + "p95": 218.69999998807907, + "max": 236 + }, + "errors": [] + } + ], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\helpers\\danmuku-combination-load.js", + "column": 54, + "line": 54 + } + ], + "maskSnapshots": [ + { + "phase": "playing", + "time": 9.312572, + "outputs": 25, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 10.971314, + "outputs": 38, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 38, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 23.075308, + "outputs": 61, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published core / published plugin", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "file": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 25.82895, + "end": 35.433578, + "startWall": 14010.300000011921, + "endWall": 23614.900000035763, + "scheduled": 120, + "visible": 49, + "uniqueVisible": 49, + "notVisible": [ + { + "id": "Mask load-2", + "text": "Mask load 2", + "time": 26.42895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-7", + "text": "Mask load 7", + "time": 26.67895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-8", + "text": "Mask load 8", + "time": 26.728949999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-9", + "text": "Mask load 9", + "time": 26.77895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-10", + "text": "Mask load 10", + "time": 26.82895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-11", + "text": "Mask load 11", + "time": 26.87895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-12", + "text": "Mask load 12", + "time": 26.92895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-13", + "text": "Mask load 13", + "time": 26.978949999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-18", + "text": "Mask load 18", + "time": 27.228949999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-19", + "text": "Mask load 19", + "time": 27.27895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-20", + "text": "Mask load 20", + "time": 27.32895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-21", + "text": "Mask load 21", + "time": 27.37895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-26", + "text": "Mask load 26", + "time": 27.62895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-27", + "text": "Mask load 27", + "time": 27.67895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-28", + "text": "Mask load 28", + "time": 27.728949999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-29", + "text": "Mask load 29", + "time": 27.77895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-30", + "text": "Mask load 30", + "time": 27.82895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-31", + "text": "Mask load 31", + "time": 27.87895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-32", + "text": "Mask load 32", + "time": 27.92895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-37", + "text": "Mask load 37", + "time": 28.17895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-38", + "text": "Mask load 38", + "time": 28.228949999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-39", + "text": "Mask load 39", + "time": 28.27895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-40", + "text": "Mask load 40", + "time": 28.32895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-41", + "text": "Mask load 41", + "time": 28.37895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-42", + "text": "Mask load 42", + "time": 28.42895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-43", + "text": "Mask load 43", + "time": 28.478949999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-48", + "text": "Mask load 48", + "time": 28.728949999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-49", + "text": "Mask load 49", + "time": 28.77895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-50", + "text": "Mask load 50", + "time": 28.82895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-51", + "text": "Mask load 51", + "time": 28.87895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-52", + "text": "Mask load 52", + "time": 28.92895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-53", + "text": "Mask load 53", + "time": 28.978949999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-54", + "text": "Mask load 54", + "time": 29.02895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-59", + "text": "Mask load 59", + "time": 29.27895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-60", + "text": "Mask load 60", + "time": 29.32895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-61", + "text": "Mask load 61", + "time": 29.37895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-62", + "text": "Mask load 62", + "time": 29.42895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-67", + "text": "Mask load 67", + "time": 29.67895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-68", + "text": "Mask load 68", + "time": 29.728949999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-69", + "text": "Mask load 69", + "time": 29.77895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-70", + "text": "Mask load 70", + "time": 29.82895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-71", + "text": "Mask load 71", + "time": 29.87895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-72", + "text": "Mask load 72", + "time": 29.92895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-73", + "text": "Mask load 73", + "time": 29.978949999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-78", + "text": "Mask load 78", + "time": 30.228949999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-79", + "text": "Mask load 79", + "time": 30.27895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-80", + "text": "Mask load 80", + "time": 30.32895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-81", + "text": "Mask load 81", + "time": 30.37895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-82", + "text": "Mask load 82", + "time": 30.42895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-83", + "text": "Mask load 83", + "time": 30.478949999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-84", + "text": "Mask load 84", + "time": 30.52895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-89", + "text": "Mask load 89", + "time": 30.77895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-90", + "text": "Mask load 90", + "time": 30.82895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-91", + "text": "Mask load 91", + "time": 30.87895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-92", + "text": "Mask load 92", + "time": 30.92895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-93", + "text": "Mask load 93", + "time": 30.978949999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-94", + "text": "Mask load 94", + "time": 31.02895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-95", + "text": "Mask load 95", + "time": 31.07895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-100", + "text": "Mask load 100", + "time": 31.32895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-101", + "text": "Mask load 101", + "time": 31.37895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-102", + "text": "Mask load 102", + "time": 31.42895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-103", + "text": "Mask load 103", + "time": 31.478949999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-104", + "text": "Mask load 104", + "time": 31.52895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-105", + "text": "Mask load 105", + "time": 31.57895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-110", + "text": "Mask load 110", + "time": 31.82895, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-111", + "text": "Mask load 111", + "time": 31.87895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-112", + "text": "Mask load 112", + "time": 31.92895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-113", + "text": "Mask load 113", + "time": 31.978949999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-114", + "text": "Mask load 114", + "time": 32.02895, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-115", + "text": "Mask load 115", + "time": 32.07895, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-116", + "text": "Mask load 116", + "time": 32.128949999999996, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + } + ], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 15, + "pooled": 13, + "uniquePool": 13, + "modelOutputs": 74, + "frameGapsMs": { + "count": 67, + "median": 137.5999999642372, + "p95": 166.20000004768372, + "max": 173.9000000357628 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 9.465812, + "outputs": 19, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 11.695252, + "outputs": 31, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 31, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 23.905478, + "outputs": 55, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published core / candidate plugin", + "engine": "chromium", + "status": "failed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "file": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "base": 26.334548, + "end": 35.499259, + "startWall": 14914.300000011921, + "endWall": 24177, + "scheduled": 120, + "visible": 48, + "uniqueVisible": 48, + "notVisible": [ + { + "id": "Mask load-48", + "text": "Mask load 48", + "time": 29.234548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-49", + "text": "Mask load 49", + "time": 29.284548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-50", + "text": "Mask load 50", + "time": 29.334548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-51", + "text": "Mask load 51", + "time": 29.384548000000002, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-52", + "text": "Mask load 52", + "time": 29.434548000000003, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-53", + "text": "Mask load 53", + "time": 29.484548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-54", + "text": "Mask load 54", + "time": 29.534548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-55", + "text": "Mask load 55", + "time": 29.584548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-56", + "text": "Mask load 56", + "time": 29.634548000000002, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-57", + "text": "Mask load 57", + "time": 29.684548000000003, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-58", + "text": "Mask load 58", + "time": 29.734548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-59", + "text": "Mask load 59", + "time": 29.784548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-60", + "text": "Mask load 60", + "time": 29.834548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-61", + "text": "Mask load 61", + "time": 29.884548000000002, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-62", + "text": "Mask load 62", + "time": 29.934548000000003, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-63", + "text": "Mask load 63", + "time": 29.984548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-64", + "text": "Mask load 64", + "time": 30.034548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-65", + "text": "Mask load 65", + "time": 30.084548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-66", + "text": "Mask load 66", + "time": 30.134548000000002, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-67", + "text": "Mask load 67", + "time": 30.184548000000003, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-68", + "text": "Mask load 68", + "time": 30.234548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-69", + "text": "Mask load 69", + "time": 30.284548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-70", + "text": "Mask load 70", + "time": 30.334548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-71", + "text": "Mask load 71", + "time": 30.384548000000002, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-72", + "text": "Mask load 72", + "time": 30.434548000000003, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-73", + "text": "Mask load 73", + "time": 30.484548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-74", + "text": "Mask load 74", + "time": 30.534548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-75", + "text": "Mask load 75", + "time": 30.584548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-76", + "text": "Mask load 76", + "time": 30.634548000000002, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-77", + "text": "Mask load 77", + "time": 30.684548000000003, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-78", + "text": "Mask load 78", + "time": 30.734548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-79", + "text": "Mask load 79", + "time": 30.784548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-80", + "text": "Mask load 80", + "time": 30.834548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-81", + "text": "Mask load 81", + "time": 30.884548000000002, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-82", + "text": "Mask load 82", + "time": 30.934548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-83", + "text": "Mask load 83", + "time": 30.984548000000004, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-84", + "text": "Mask load 84", + "time": 31.034548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-85", + "text": "Mask load 85", + "time": 31.084548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-86", + "text": "Mask load 86", + "time": 31.134548000000002, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-87", + "text": "Mask load 87", + "time": 31.184548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-88", + "text": "Mask load 88", + "time": 31.234548000000004, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-89", + "text": "Mask load 89", + "time": 31.284548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-90", + "text": "Mask load 90", + "time": 31.334548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-91", + "text": "Mask load 91", + "time": 31.384548000000002, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-92", + "text": "Mask load 92", + "time": 31.434548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-93", + "text": "Mask load 93", + "time": 31.484548000000004, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-94", + "text": "Mask load 94", + "time": 31.534548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-95", + "text": "Mask load 95", + "time": 31.584548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-96", + "text": "Mask load 96", + "time": 31.634548000000002, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-97", + "text": "Mask load 97", + "time": 31.684548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-98", + "text": "Mask load 98", + "time": 31.734548000000004, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-99", + "text": "Mask load 99", + "time": 31.784548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-100", + "text": "Mask load 100", + "time": 31.834548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-101", + "text": "Mask load 101", + "time": 31.884548000000002, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-102", + "text": "Mask load 102", + "time": 31.934548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-103", + "text": "Mask load 103", + "time": 31.984548000000004, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-104", + "text": "Mask load 104", + "time": 32.034548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-105", + "text": "Mask load 105", + "time": 32.084548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-106", + "text": "Mask load 106", + "time": 32.134548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-107", + "text": "Mask load 107", + "time": 32.184548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-108", + "text": "Mask load 108", + "time": 32.234548000000004, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-109", + "text": "Mask load 109", + "time": 32.284548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-110", + "text": "Mask load 110", + "time": 32.334548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-111", + "text": "Mask load 111", + "time": 32.384548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-112", + "text": "Mask load 112", + "time": 32.434548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-113", + "text": "Mask load 113", + "time": 32.484548000000004, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-114", + "text": "Mask load 114", + "time": 32.534548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-115", + "text": "Mask load 115", + "time": 32.584548, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-116", + "text": "Mask load 116", + "time": 32.634548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-117", + "text": "Mask load 117", + "time": 32.684548, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-118", + "text": "Mask load 118", + "time": 32.734548000000004, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-119", + "text": "Mask load 119", + "time": 32.784548, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + } + ], + "loaded": 120, + "waiting": 114, + "referenced": 7, + "nodes": 8, + "pooled": 1, + "uniquePool": 1, + "frameGapsMs": { + "count": 49, + "median": 181.29999995231628, + "p95": 214.20000004768372, + "max": 233.30000001192093 + }, + "errors": [] + } + ], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\helpers\\danmuku-combination-load.js", + "column": 54, + "line": 54 + } + ], + "maskSnapshots": [ + { + "phase": "playing", + "time": 9.996409, + "outputs": 21, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 12.094944, + "outputs": 34, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 34, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 24.083245, + "outputs": 58, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published-5.3.1-beta.1 core / published plugin", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published-5.3.1-beta.1", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.3.1-beta.1", + "integrity": "sha512-btjbQwXPl86U/Apja0WrCUF+AXLPacI60eUGAeJTx3EMuUKrVaOFrmWrIeeyMUi5aIzMSXM++tQjlSMJVnmhuQ==", + "member": "package/dist/artplayer.js" + }, + "sha256": "e91e64228c57bb97300c709789d5557ab07b133cab307267b4a2a4df3083c861", + "bytes": 159458 + }, + "danmuku": { + "file": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 26.268027, + "end": 34.724325, + "startWall": 14786.699999988079, + "endWall": 23243, + "scheduled": 120, + "visible": 45, + "uniqueVisible": 45, + "notVisible": [ + { + "id": "Mask load-3", + "text": "Mask load 3", + "time": 26.918027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-4", + "text": "Mask load 4", + "time": 26.968027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-9", + "text": "Mask load 9", + "time": 27.218027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-10", + "text": "Mask load 10", + "time": 27.268027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-11", + "text": "Mask load 11", + "time": 27.318027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-12", + "text": "Mask load 12", + "time": 27.368027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-13", + "text": "Mask load 13", + "time": 27.418027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-14", + "text": "Mask load 14", + "time": 27.468027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-15", + "text": "Mask load 15", + "time": 27.518027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-20", + "text": "Mask load 20", + "time": 27.768027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-21", + "text": "Mask load 21", + "time": 27.818027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-22", + "text": "Mask load 22", + "time": 27.868027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-23", + "text": "Mask load 23", + "time": 27.918027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-24", + "text": "Mask load 24", + "time": 27.968027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-25", + "text": "Mask load 25", + "time": 28.018027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-26", + "text": "Mask load 26", + "time": 28.068027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-31", + "text": "Mask load 31", + "time": 28.318027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-32", + "text": "Mask load 32", + "time": 28.368027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-33", + "text": "Mask load 33", + "time": 28.418027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-34", + "text": "Mask load 34", + "time": 28.468027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-35", + "text": "Mask load 35", + "time": 28.518027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-36", + "text": "Mask load 36", + "time": 28.568027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-37", + "text": "Mask load 37", + "time": 28.618027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-42", + "text": "Mask load 42", + "time": 28.868027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-43", + "text": "Mask load 43", + "time": 28.918027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-44", + "text": "Mask load 44", + "time": 28.968027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-45", + "text": "Mask load 45", + "time": 29.018027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-46", + "text": "Mask load 46", + "time": 29.068027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-47", + "text": "Mask load 47", + "time": 29.118027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-48", + "text": "Mask load 48", + "time": 29.168027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-49", + "text": "Mask load 49", + "time": 29.218027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-54", + "text": "Mask load 54", + "time": 29.468027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-55", + "text": "Mask load 55", + "time": 29.518027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-56", + "text": "Mask load 56", + "time": 29.568027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-57", + "text": "Mask load 57", + "time": 29.618027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-58", + "text": "Mask load 58", + "time": 29.668027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-59", + "text": "Mask load 59", + "time": 29.718027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-60", + "text": "Mask load 60", + "time": 29.768027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-65", + "text": "Mask load 65", + "time": 30.018027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-66", + "text": "Mask load 66", + "time": 30.068027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-67", + "text": "Mask load 67", + "time": 30.118027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-68", + "text": "Mask load 68", + "time": 30.168027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-69", + "text": "Mask load 69", + "time": 30.218027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-70", + "text": "Mask load 70", + "time": 30.268027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-71", + "text": "Mask load 71", + "time": 30.318027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-76", + "text": "Mask load 76", + "time": 30.568027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-77", + "text": "Mask load 77", + "time": 30.618027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-78", + "text": "Mask load 78", + "time": 30.668027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-79", + "text": "Mask load 79", + "time": 30.718027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-80", + "text": "Mask load 80", + "time": 30.768027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-81", + "text": "Mask load 81", + "time": 30.818027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-82", + "text": "Mask load 82", + "time": 30.868026999999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-87", + "text": "Mask load 87", + "time": 31.118026999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-88", + "text": "Mask load 88", + "time": 31.168027000000002, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-89", + "text": "Mask load 89", + "time": 31.218027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-90", + "text": "Mask load 90", + "time": 31.268027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-91", + "text": "Mask load 91", + "time": 31.318027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-92", + "text": "Mask load 92", + "time": 31.368026999999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-93", + "text": "Mask load 93", + "time": 31.418027000000002, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-94", + "text": "Mask load 94", + "time": 31.468027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-99", + "text": "Mask load 99", + "time": 31.718027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-100", + "text": "Mask load 100", + "time": 31.768027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-101", + "text": "Mask load 101", + "time": 31.818027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-102", + "text": "Mask load 102", + "time": 31.868026999999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-103", + "text": "Mask load 103", + "time": 31.918027000000002, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-104", + "text": "Mask load 104", + "time": 31.968027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-105", + "text": "Mask load 105", + "time": 32.018027000000004, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-106", + "text": "Mask load 106", + "time": 32.068027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-111", + "text": "Mask load 111", + "time": 32.318027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-112", + "text": "Mask load 112", + "time": 32.368027, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-113", + "text": "Mask load 113", + "time": 32.418027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-114", + "text": "Mask load 114", + "time": 32.468027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-115", + "text": "Mask load 115", + "time": 32.518027000000004, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-116", + "text": "Mask load 116", + "time": 32.568027, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-117", + "text": "Mask load 117", + "time": 32.618027, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + } + ], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 13, + "pooled": 11, + "uniquePool": 11, + "modelOutputs": 65, + "frameGapsMs": { + "count": 58, + "median": 140.5, + "p95": 155.30000001192093, + "max": 157.4000000357628 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 9.767664, + "outputs": 22, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 11.960178, + "outputs": 35, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 35, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 24.041368, + "outputs": 56, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published-5.3.1-beta.1 core / candidate plugin", + "engine": "chromium", + "status": "failed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published-5.3.1-beta.1", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.3.1-beta.1", + "integrity": "sha512-btjbQwXPl86U/Apja0WrCUF+AXLPacI60eUGAeJTx3EMuUKrVaOFrmWrIeeyMUi5aIzMSXM++tQjlSMJVnmhuQ==", + "member": "package/dist/artplayer.js" + }, + "sha256": "e91e64228c57bb97300c709789d5557ab07b133cab307267b4a2a4df3083c861", + "bytes": 159458 + }, + "danmuku": { + "file": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + null + ], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\browser\\danmuku-mask-native.spec.js", + "column": 107, + "line": 213 + } + ], + "maskSnapshots": [], + "preLoadVisible": [] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with candidate core / published plugin", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "file": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 22.69788, + "end": 30.840332, + "startWall": 10068, + "endWall": 18170, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 26, + "pooled": 24, + "uniquePool": 24, + "modelOutputs": 112, + "frameGapsMs": { + "count": 121, + "median": 69, + "p95": 89, + "max": 99 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 9.107242, + "outputs": 24, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.552846, + "outputs": 32, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 32, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 21.947249, + "outputs": 59, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.133331298828125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.133331298828125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with candidate core / candidate plugin", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "file": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": true, + "base": 22.285384, + "end": 31.149358, + "startWall": 8090, + "endWall": 16938, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 24, + "pooled": 24, + "uniquePool": 24, + "modelOutputs": 137, + "frameGapsMs": { + "count": 148, + "median": 62, + "p95": 78, + "max": 125 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 8.835469, + "outputs": 24, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.198817, + "outputs": 31, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 31, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 21.837499, + "outputs": 56, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.133331298828125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.133331298828125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published core / published plugin", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "file": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 22.231893, + "end": 31.147855, + "startWall": 8093, + "endWall": 17021, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 26, + "pooled": 24, + "uniquePool": 24, + "modelOutputs": 133, + "frameGapsMs": { + "count": 145, + "median": 63, + "p95": 85, + "max": 106 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 8.814058, + "outputs": 24, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.261231, + "outputs": 31, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 31, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 21.787623, + "outputs": 57, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.133331298828125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.133331298828125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published core / candidate plugin", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "file": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": true, + "base": 22.46184, + "end": 31.488007, + "startWall": 9908, + "endWall": 18872, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 24, + "pooled": 24, + "uniquePool": 24, + "modelOutputs": 134, + "frameGapsMs": { + "count": 151, + "median": 62, + "p95": 85, + "max": 116 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 9.349185, + "outputs": 24, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.83347, + "outputs": 31, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 31, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 22.017835, + "outputs": 58, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.133331298828125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.133331298828125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published-5.3.1-beta.1 core / published plugin", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published-5.3.1-beta.1", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.3.1-beta.1", + "integrity": "sha512-btjbQwXPl86U/Apja0WrCUF+AXLPacI60eUGAeJTx3EMuUKrVaOFrmWrIeeyMUi5aIzMSXM++tQjlSMJVnmhuQ==", + "member": "package/dist/artplayer.js" + }, + "sha256": "e91e64228c57bb97300c709789d5557ab07b133cab307267b4a2a4df3083c861", + "bytes": 159458 + }, + "danmuku": { + "file": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 22.190145, + "end": 31.169449, + "startWall": 8155, + "endWall": 17069, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 26, + "pooled": 24, + "uniquePool": 24, + "modelOutputs": 137, + "frameGapsMs": { + "count": 150, + "median": 64, + "p95": 79, + "max": 120 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 8.858281, + "outputs": 26, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.305648, + "outputs": 33, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 33, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 21.658378, + "outputs": 57, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.133331298828125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.133331298828125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published-5.3.1-beta.1 core / candidate plugin", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published-5.3.1-beta.1", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.3.1-beta.1", + "integrity": "sha512-btjbQwXPl86U/Apja0WrCUF+AXLPacI60eUGAeJTx3EMuUKrVaOFrmWrIeeyMUi5aIzMSXM++tQjlSMJVnmhuQ==", + "member": "package/dist/artplayer.js" + }, + "sha256": "e91e64228c57bb97300c709789d5557ab07b133cab307267b4a2a4df3083c861", + "bytes": 159458 + }, + "danmuku": { + "file": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": true, + "base": 22.273148, + "end": 31.144282, + "startWall": 8550, + "endWall": 17517, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 25, + "pooled": 25, + "uniquePool": 25, + "modelOutputs": 132, + "frameGapsMs": { + "count": 149, + "median": 63, + "p95": 84, + "max": 115 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 9.047727, + "outputs": 25, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.614952, + "outputs": 32, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 32, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 21.748388, + "outputs": 58, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.133331298828125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.133331298828125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with candidate core / published plugin", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "file": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 22.1214171, + "end": 30.5320434, + "startWall": 9166, + "endWall": 17577, + "scheduled": 120, + "visible": 104, + "uniqueVisible": 104, + "notVisible": [ + { + "id": "Mask load-18", + "text": "Mask load 18", + "time": 23.521417099999997, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-27", + "text": "Mask load 27", + "time": 23.9714171, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-36", + "text": "Mask load 36", + "time": 24.4214171, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-37", + "text": "Mask load 37", + "time": 24.4714171, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-42", + "text": "Mask load 42", + "time": 24.7214171, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-47", + "text": "Mask load 47", + "time": 24.9714171, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-52", + "text": "Mask load 52", + "time": 25.2214171, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-61", + "text": "Mask load 61", + "time": 25.6714171, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-66", + "text": "Mask load 66", + "time": 25.9214171, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-75", + "text": "Mask load 75", + "time": 26.3714171, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-76", + "text": "Mask load 76", + "time": 26.4214171, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-89", + "text": "Mask load 89", + "time": 27.071417099999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-94", + "text": "Mask load 94", + "time": 27.321417099999998, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-103", + "text": "Mask load 103", + "time": 27.7714171, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-108", + "text": "Mask load 108", + "time": 28.0214171, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-113", + "text": "Mask load 113", + "time": 28.2714171, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + } + ], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 25, + "pooled": 23, + "uniquePool": 23, + "modelOutputs": 42, + "frameGapsMs": { + "count": 40, + "median": 223, + "p95": 279, + "max": 280 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 8.8031256, + "outputs": 19, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.578209, + "outputs": 29, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20.01, + "outputs": 29, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 21.602292, + "outputs": 38, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with candidate core / candidate plugin", + "engine": "webkit", + "status": "failed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "file": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "base": 22.360063, + "end": 31.2819602, + "startWall": 9298, + "endWall": 18220, + "scheduled": 120, + "visible": 109, + "uniqueVisible": 109, + "notVisible": [ + { + "id": "Mask load-12", + "text": "Mask load 12", + "time": 23.460063, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-25", + "text": "Mask load 25", + "time": 24.110063, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-38", + "text": "Mask load 38", + "time": 24.760063, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-47", + "text": "Mask load 47", + "time": 25.210063, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-56", + "text": "Mask load 56", + "time": 25.660063, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-61", + "text": "Mask load 61", + "time": 25.910063, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-70", + "text": "Mask load 70", + "time": 26.360063, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-79", + "text": "Mask load 79", + "time": 26.810063, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-100", + "text": "Mask load 100", + "time": 27.860063, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-109", + "text": "Mask load 109", + "time": 28.310063, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-118", + "text": "Mask load 118", + "time": 28.760063000000002, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + } + ], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 23, + "pooled": 23, + "uniquePool": 23, + "frameGapsMs": { + "count": 46, + "median": 205, + "p95": 238, + "max": 250 + }, + "errors": [] + } + ], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\helpers\\danmuku-combination-load.js", + "column": 54, + "line": 54 + } + ], + "maskSnapshots": [ + { + "phase": "playing", + "time": 8.8570006, + "outputs": 19, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.5962924, + "outputs": 30, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20.01, + "outputs": 30, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 21.9967712, + "outputs": 42, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published core / published plugin", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "file": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 22.3797088, + "end": 31.099606, + "startWall": 9157, + "endWall": 17877, + "scheduled": 120, + "visible": 111, + "uniqueVisible": 111, + "notVisible": [ + { + "id": "Mask load-16", + "text": "Mask load 16", + "time": 23.6797088, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-29", + "text": "Mask load 29", + "time": 24.3297088, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-38", + "text": "Mask load 38", + "time": 24.779708799999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-47", + "text": "Mask load 47", + "time": 25.2297088, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-52", + "text": "Mask load 52", + "time": 25.4797088, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-65", + "text": "Mask load 65", + "time": 26.1297088, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-74", + "text": "Mask load 74", + "time": 26.5797088, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-87", + "text": "Mask load 87", + "time": 27.229708799999997, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-104", + "text": "Mask load 104", + "time": 28.0797088, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + } + ], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 25, + "pooled": 23, + "uniquePool": 23, + "modelOutputs": 47, + "frameGapsMs": { + "count": 45, + "median": 210, + "p95": 230, + "max": 237 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 8.8206256, + "outputs": 19, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.5500007, + "outputs": 30, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 30, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 21.9073337, + "outputs": 41, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published core / candidate plugin", + "engine": "webkit", + "status": "failed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "file": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "base": 22.1116671, + "end": 30.9662935, + "startWall": 9598, + "endWall": 18453, + "scheduled": 120, + "visible": 109, + "uniqueVisible": 109, + "notVisible": [ + { + "id": "Mask load-13", + "text": "Mask load 13", + "time": 23.261667099999997, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-26", + "text": "Mask load 26", + "time": 23.9116671, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-31", + "text": "Mask load 31", + "time": 24.1616671, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-36", + "text": "Mask load 36", + "time": 24.4116671, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-45", + "text": "Mask load 45", + "time": 24.8616671, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-66", + "text": "Mask load 66", + "time": 25.9116671, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-75", + "text": "Mask load 75", + "time": 26.3616671, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-84", + "text": "Mask load 84", + "time": 26.811667099999998, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-93", + "text": "Mask load 93", + "time": 27.261667099999997, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-106", + "text": "Mask load 106", + "time": 27.9116671, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-115", + "text": "Mask load 115", + "time": 28.3616671, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + } + ], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 23, + "pooled": 23, + "uniquePool": 23, + "frameGapsMs": { + "count": 46, + "median": 209, + "p95": 233, + "max": 249 + }, + "errors": [] + } + ], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\helpers\\danmuku-combination-load.js", + "column": 54, + "line": 54 + } + ], + "maskSnapshots": [ + { + "phase": "playing", + "time": 9.1382923, + "outputs": 17, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.9832924, + "outputs": 29, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 29, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 21.6633545, + "outputs": 39, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published-5.3.1-beta.1 core / published plugin", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published-5.3.1-beta.1", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.3.1-beta.1", + "integrity": "sha512-btjbQwXPl86U/Apja0WrCUF+AXLPacI60eUGAeJTx3EMuUKrVaOFrmWrIeeyMUi5aIzMSXM++tQjlSMJVnmhuQ==", + "member": "package/dist/artplayer.js" + }, + "sha256": "e91e64228c57bb97300c709789d5557ab07b133cab307267b4a2a4df3083c861", + "bytes": 159458 + }, + "danmuku": { + "file": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 22.0385421, + "end": 30.9020643, + "startWall": 9089, + "endWall": 17952, + "scheduled": 120, + "visible": 113, + "uniqueVisible": 113, + "notVisible": [ + { + "id": "Mask load-28", + "text": "Mask load 28", + "time": 23.9385421, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-41", + "text": "Mask load 41", + "time": 24.5885421, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-54", + "text": "Mask load 54", + "time": 25.2385421, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-63", + "text": "Mask load 63", + "time": 25.6885421, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-92", + "text": "Mask load 92", + "time": 27.138542100000002, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-105", + "text": "Mask load 105", + "time": 27.7885421, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-118", + "text": "Mask load 118", + "time": 28.4385421, + "mode": 1, + "style": {}, + "color": "#FFFFFF" + } + ], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 26, + "pooled": 24, + "uniquePool": 24, + "modelOutputs": 49, + "frameGapsMs": { + "count": 47, + "median": 201, + "p95": 222, + "max": 228 + }, + "errors": [] + } + ], + "errorLocations": [], + "maskSnapshots": [ + { + "phase": "playing", + "time": 8.6563964, + "outputs": 19, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.4251049, + "outputs": 29, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20, + "outputs": 29, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 21.7063545, + "outputs": 39, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.125, + "display": "block" + } + ] + }, + { + "title": "Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with published-5.3.1-beta.1 core / candidate plugin", + "engine": "webkit", + "status": "failed", + "browser": "26.6", + "platform": "win32", + "core": "published-5.3.1-beta.1", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.3.1-beta.1", + "integrity": "sha512-btjbQwXPl86U/Apja0WrCUF+AXLPacI60eUGAeJTx3EMuUKrVaOFrmWrIeeyMUi5aIzMSXM++tQjlSMJVnmhuQ==", + "member": "package/dist/artplayer.js" + }, + "sha256": "e91e64228c57bb97300c709789d5557ab07b133cab307267b4a2a4df3083c861", + "bytes": 159458 + }, + "danmuku": { + "file": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "mask": { + "file": "source UMD", + "sha256": "2b4c117b0c2ccf52258877c697a3d83908a23fe3b5c8d698728b98de470c0045" + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "base": 22.0725837, + "end": 30.5357726, + "startWall": 8895, + "endWall": 17358, + "scheduled": 120, + "visible": 116, + "uniqueVisible": 116, + "notVisible": [ + { + "id": "Mask load-30", + "text": "Mask load 30", + "time": 24.0725837, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-39", + "text": "Mask load 39", + "time": 24.5225837, + "mode": 0, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-44", + "text": "Mask load 44", + "time": 24.7725837, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + }, + { + "id": "Mask load-68", + "text": "Mask load 68", + "time": 25.972583699999998, + "mode": 2, + "style": {}, + "color": "#FFFFFF" + } + ], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 24, + "pooled": 24, + "uniquePool": 24, + "frameGapsMs": { + "count": 45, + "median": 190, + "p95": 227, + "max": 273 + }, + "errors": [] + } + ], + "errorLocations": [ + { + "file": "D:\\github\\ArtPlayer\\test\\helpers\\danmuku-combination-load.js", + "column": 54, + "line": 54 + } + ], + "maskSnapshots": [ + { + "phase": "playing", + "time": 9.0013339, + "outputs": 20, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "paused", + "time": 9.7188758, + "outputs": 30, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + }, + { + "phase": "fullscreen-paused", + "time": 20.01, + "outputs": 30, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 1280, + "height": 720, + "fullscreenWeb": true + }, + { + "phase": "restored", + "time": 21.517292, + "outputs": 40, + "sameLayer": true, + "mask": true, + "mode": "alpha", + "width": 640, + "height": 360, + "fullscreenWeb": false + } + ], + "preLoadVisible": [ + { + "text": "Ready mask combination", + "connected": true, + "inLayer": true, + "width": 275, + "height": 28.125, + "display": "block" + }, + { + "text": "After seek and visibility", + "connected": true, + "inLayer": true, + "width": 312.5, + "height": 28.125, + "display": "block" + } + ] + } + ] + }, + { + "file": "refactor/.cache/danmuku08-dpip-load-report/report.json", + "sha256": "8098c7c1b7770f5bbb0b9429e7c5257dbe26d561551647b2e864c6d1e61b698e", + "stats": { + "startTime": "2026-09-14T13:24:38.059Z", + "duration": 94081.75799999999, + "expected": 12, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "terminal": { + "scope": "source", + "exitCode": 0, + "signal": null, + "args": [ + "test", + "--config=playwright.source.config.js", + "test/browser/danmuku-dpip.spec.js", + "--grep", + "PiP load", + "--workers=2" + ] + }, + "cases": [ + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.466948, + "rowTime": 0.971264, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 11.944998, + "rowTime": 11.448219, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 123 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 243 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 23, + "settings": 1, + "placeholders": 0 + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 1.688911, + "end": 10.678454, + "startWall": 1281.5, + "endWall": 10271, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 23, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 538, + "median": 16.69999998807907, + "p95": 17.899999976158142, + "max": 19.69999998807907 + }, + "errors": [] + }, + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 11.950236, + "end": 20.945399, + "startWall": 1047.199999988079, + "endWall": 10042.599999964237, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 23, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 538, + "median": 16.69999998807907, + "p95": 18.400000035762787, + "max": 29.30000001192093 + }, + "errors": [] + } + ], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.43684, + "rowTime": 0.938019, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 11.87664, + "rowTime": 11.368205, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 122 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 242 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": true, + "base": 1.648909, + "end": 10.63322, + "startWall": 1271, + "endWall": 10255.800000011921, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 22, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 538, + "median": 16.69999998807907, + "p95": 17.899999976158142, + "max": 19.5 + }, + "errors": [] + }, + { + "rate": 20, + "seconds": 6, + "requiredComplete": true, + "base": 11.882729, + "end": 20.860763, + "startWall": 1057.9000000357628, + "endWall": 10034.600000023842, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 22, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 537, + "median": 16.69999998807907, + "p95": 18.19999998807907, + "max": 21.19999998807907 + }, + "errors": [] + } + ], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.463359, + "rowTime": 0.967926, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 11.909535, + "rowTime": 11.412312, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 123 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 243 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 23, + "settings": 1, + "placeholders": 0 + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 1.685208, + "end": 10.660798, + "startWall": 1280.800000011921, + "endWall": 10255.200000047684, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 23, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 537, + "median": 16.600000023841858, + "p95": 18, + "max": 20.200000047683716 + }, + "errors": [] + }, + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 11.91546, + "end": 20.895394, + "startWall": 1062.199999988079, + "endWall": 10042, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 23, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 538, + "median": 16.69999998807907, + "p95": 18.30000001192093, + "max": 23.19999998807907 + }, + "errors": [] + } + ], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "chromium", + "status": "passed", + "browser": "153.0.8010.12", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.449185, + "rowTime": 0.974214, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 11.910296, + "rowTime": 11.401177, + "width": 112.5, + "height": 28.125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 122 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 242 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": true, + "base": 1.677104, + "end": 10.671106, + "startWall": 1280.8999999761581, + "endWall": 10274.699999988079, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 22, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 539, + "median": 16.69999998807907, + "p95": 17.80000001192093, + "max": 19.399999976158142 + }, + "errors": [] + }, + { + "rate": 20, + "seconds": 6, + "requiredComplete": true, + "base": 11.914864, + "end": 20.909174, + "startWall": 1056.0999999642372, + "endWall": 10051, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 22, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 539, + "median": 16.600000023841858, + "p95": 18.099999964237213, + "max": 20 + }, + "errors": [] + } + ], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 0.882727, + "rowTime": 0.882727, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 11.42857, + "rowTime": 10.928168, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 123 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 243 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 23, + "settings": 1, + "placeholders": 0 + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 0.963587, + "end": 9.971365, + "startWall": 645, + "endWall": 9657, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 23, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 539, + "median": 17, + "p95": 18, + "max": 20 + }, + "errors": [] + }, + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 11.470159, + "end": 20.479893, + "startWall": 1115, + "endWall": 10154, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 23, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 541, + "median": 17, + "p95": 18, + "max": 19 + }, + "errors": [] + } + ], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.418621, + "rowTime": 0.917915, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 10.977772, + "rowTime": 10.436912, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 122 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 242 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": true, + "base": 1.501888, + "end": 9.503815, + "startWall": 1173, + "endWall": 9162, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 22, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 478, + "median": 17, + "p95": 17, + "max": 19 + }, + "errors": [] + }, + { + "rate": 20, + "seconds": 6, + "requiredComplete": true, + "base": 10.977772, + "end": 18.98371, + "startWall": 1108, + "endWall": 9113, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 22, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 479, + "median": 17, + "p95": 18, + "max": 20 + }, + "errors": [] + } + ], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-with-published-retained-dom", + "supported": true, + "rounds": [ + { + "time": 1.626713, + "rowTime": 1.084954, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 2 + } + ] + }, + { + "time": 11.136596, + "rowTime": 10.636196, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 123 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 243 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "nodes": 23, + "settings": 1, + "placeholders": 0 + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 1.668793, + "end": 9.680794, + "startWall": 1161, + "endWall": 9148, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 23, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 477, + "median": 17, + "p95": 18, + "max": 33 + }, + "errors": [] + }, + { + "rate": 20, + "seconds": 6, + "requiredComplete": false, + "base": 11.136596, + "end": 19.160011, + "startWall": 1113, + "endWall": 9126, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 23, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 479, + "median": 17, + "p95": 18, + "max": 34 + }, + "errors": [] + } + ], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "firefox", + "status": "passed", + "browser": "155.0", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-playback-danmuku-and-cleanup-passed", + "supported": true, + "rounds": [ + { + "time": 1.626752, + "rowTime": 1.168232, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 1 + } + ] + }, + { + "time": 11.219959, + "rowTime": 10.678577, + "width": 112.5, + "height": 28.133331298828125, + "adopted": true, + "inLayer": true, + "position": "absolute", + "player": true, + "heatmap": true, + "workers": [ + { + "terminated": 0, + "replies": 122 + } + ] + } + ], + "final": { + "active": false, + "workers": [ + { + "terminated": 1, + "replies": 242 + } + ], + "errors": [], + "events": [ + true, + false, + true, + false + ], + "frame": null, + "operation": null, + "nodes": 0, + "settings": 0, + "placeholders": 0 + }, + "loads": [ + { + "rate": 20, + "seconds": 6, + "requiredComplete": true, + "base": 1.708848, + "end": 9.718569, + "startWall": 1167, + "endWall": 9176, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 22, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 479, + "median": 17, + "p95": 18, + "max": 19 + }, + "errors": [] + }, + { + "rate": 20, + "seconds": 6, + "requiredComplete": true, + "base": 11.219959, + "end": 20.229513, + "startWall": 1112, + "endWall": 10123, + "scheduled": 120, + "visible": 120, + "uniqueVisible": 120, + "notVisible": [], + "loaded": 120, + "waiting": 120, + "referenced": 0, + "nodes": 22, + "pooled": 22, + "uniquePool": 22, + "frameGapsMs": { + "count": 539, + "median": 17, + "p95": 18, + "max": 19 + }, + "errors": [] + } + ], + "errorLocations": [] + }, + { + "title": "published: published Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "published", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "published: candidate Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "published", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: published Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "published", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "npm 5.3.0", + "sha256": "7c8749288711ef97e80b6f9f00981170aa73f62a8ae25d6d663749a4aef62a8f" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + }, + { + "title": "candidate: candidate Danmuku, heatmap and Worker survive native Document PiP load", + "engine": "webkit", + "status": "passed", + "browser": "26.6", + "platform": "win32", + "core": "candidate", + "implementation": "candidate", + "coreInput": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "5139cabd5abf9b92684ee2dcdaa620c4db7f67c0cb1aa3f654435d739468bf9d", + "bytes": 378931 + }, + "danmuku": { + "input": "source UMD", + "sha256": "e8193aa8fae3329b3a8e435fc450726d9305e258dddea043ff3114f058516a66" + }, + "dpip": { + "input": "candidate-source", + "sha256": "2daf44990a250f1122ce38481f3ed8c41d2f8c65a0d5ed99ab2633e46b703db1" + }, + "outcome": "native-document-pip-unavailable", + "supported": false, + "rounds": [], + "loads": [], + "errorLocations": [] + } + ] + } + ], + "conclusions": [ + "Frozen npm 5.3.0 PiP playback succeeds, but destroy(false) retains 3 renderer nodes and 1 Setting in the two-row fixture; this is not candidate cleanup acceptance.", + "Native PiP bounded 20 rows/s loads pass for candidate on Chromium/Firefox and both cores; WebKit API absence is not native playback evidence.", + "Actual Mask combined load has five candidate completeness failures and one pre-load delivery failure. Same nominal 20 rows/s on the earlier normal player passes; no root cause or regression relative to published plugin is claimed.", + "Mask published cases observe delivery loss rather than enforcing candidate completeness; twelve passing cases are not twelve complete-delivery results." + ] +} diff --git a/refactor/changes/2026-09-14-PKG-DANMUKU-08-combined-load.md b/refactor/changes/2026-09-14-PKG-DANMUKU-08-combined-load.md new file mode 100644 index 000000000..92b0b5e03 --- /dev/null +++ b/refactor/changes/2026-09-14-PKG-DANMUKU-08-combined-load.md @@ -0,0 +1,77 @@ +# PKG-DANMUKU-08 旧插件组合与真实组合负载 + +状态:仍 doing,存在未关闭失败。起点30363a5346e8d6b227651f224dd4d411289a9971。 +本批仅扩展测试和证据,不修改生产实现、声明、默认配置或依赖。下一修复由独立 +PKG-DANMUKU-MASK-LOAD-01负责。风险继续阻止弹幕08与Mask05终验;尚未启动的 +弹幕09与Mask06显式依赖该修复,确保它不能被分发阶段绕过。 + +## 真实输入与新增覆盖 + +画中画及Mask用例现在都加载冻结npm弹幕5.3.0或当前源码,校验tarball成员SHA。 +显式ARTPLAYER_DANMUKU_ARTIFACT仍只替换候选输入,不能覆盖冻结发布输入。 +画中画使用当前Document PiP,核心为5.4.0/当前源码;Mask使用当前插件及固定 +本地MediaPipe模型,另覆盖实际5.3.1-beta.1核心。没有修改模型或SDK字节。 + +`test/helpers/danmuku-combination-load.js`通过旧config/load调用设置speed=1、 +antiOverlap=false,6秒内每秒20条,观察到媒体推进8秒后核验120条。真实RAF来自 +播放器所属window,原生媒体时钟和Worker不被替换。临时可见/错误监听器及RAF在 +finally释放;失败后仍保存load快照。候选要求每行恰好可见一次、最终wait、无引用、 +节点池身份唯一;冻结旧插件仅观察其实际漏显,不能混称为完整交付通过。 + +Mask负载发生在真实模型就绪、pause/seek/网页全屏/hide-show验证之后,并检查 +负载期间模型确实继续产生输出。新画中画load用例在两个真实PiP窗口各运行一轮, +单项45秒只为新增16秒媒体推进留预算;原有close/native-close/destroy超时不变。 +这不是三小时耐久、后台节流保证、物理设备验收或私有GPU/WASM泄漏证明。 + +## 画中画结果与旧清理缺陷 + +Windows Chromium153.0.8010.12、Firefox155.0、WebKit26.6;Node24.21.0/Yarn1.22.22。 +新增旧插件首轮18项为6个API不可用记录、12个原生退出后零DOM断言失败。 +12个支持用例均已完成两次真实开窗、弹幕显示、热力图/设置迁移、关闭和Worker终止; +冻结5.3.0在destroy(false)后保留3个renderer节点及1个Setting,两个核心完全一致。 +旧destroy实现不移除这些节点,候选在05已修复其所有权清理;参考 +[资源修复](2026-09-13-PKG-DANMUKU-05-resources.md)。 + +因此旧分支单独断言该确定的历史残留,outcome明确为 +native-playback-with-published-retained-dom;候选仍要求零DOM与空scheduler。 +两行固定fixture精确断言3/1,load fixture按销毁前实际节点数验证旧保留行为。 +保留原12个失败报告;这不要求永久保留旧插件缺陷,也不豁免候选清理。 + +最终普通PiP矩阵36项退出0:12候选原生通过、12旧插件原生播放及残留观察、 +12 WebKit API不可用记录。新增load矩阵12项退出0:4候选原生、4旧插件原生、 +4 API不可用;每个候选原生用例两个窗口分别120行完整显示/回收,最终Worker终止。 +普通矩阵54.25秒、load矩阵94.81秒,均无重试。源码PiP测试不冒充最终安装分发。 + +## Mask负载失败:不能计入验收完成 + +18项组合为12 passed / 6 failed,运行退出1。12个通过中9项为旧插件观察、 +3项为Firefox候选完整交付;不能称12项候选负载通过。 + +| 引擎 | 候选负载显示 | 旧插件负载显示 | 结论 | +| --- | --- | --- | --- | +| Chromium | 49/120(当前核心)、48/120(5.4.0) | 34–49/120 | 候选仍有活动/待放置工作,串行放置积压需分析 | +| Chromium / beta核心 | 未进入负载 | 45/120 | 模型就绪后Ready mask combination一行未显示,原7秒断言失败 | +| Firefox | 三核心各120/120 | 三核心各120/120 | 本负载完整显示/回收 | +| WebKit | 三核心109/109/116条,共需各120 | 104/111/113条 | 有未显示行,最终已无行节点引用;检查未采样时间窗口 | + +本轮候选RAF帧间隔P95:Chromium约214–219ms,Firefox78–85ms,WebKit227–238ms。 +这些数据表明与普通播放器相比主线程推进明显变慢,但尚不能将模型、PNG编码、 +Worker往返或某个模块单独定为根因。旧插件也漏显;目前没有证据证明候选比旧插件 +回归。候选目标仍不达标,不能降低20条/秒、移除完整性断言或只跑Firefox。 +原始模型、源码/核心哈希、行与RAF/媒体时间快照均保留在报告中;机器摘要见 +[组合负载证据](../baselines/danmuku-combined-load-validation.json)。 + +## 修复接续与重跑 + +PKG-DANMUKU-MASK-LOAD-01首先区分未采样行与已采样待放置行,分析实际模型各阶段 +及Worker请求/回复成本,建立可控回归后修复。保持公开readys/回调串行顺序、 +seek/pause/hide/reset取消和显示寿命契约;涉及真实兼容冲突时明确决策。 +不得通过在调试夹具中停止模型、降低视频尺寸或改变媒体时钟作为正式通过结果。 +若某条诊断改变负载输入,必须保持原始失败并明确其反事实用途。 + +重跑:`yarn test:browser:source test/browser/danmuku-dpip.spec.js --workers=2`, +只选新增负载加`--grep 'PiP load'`;Mask用 +`yarn test:browser:source test/browser/danmuku-mask-native.spec.js +--grep 'actual model and Danmuku' --workers=2`。每次前归档前一份报告。 +三个修改文件的只读ESLint通过。任务、风险和生成文档同步校验后独立本地提交, +再运行提交审计。没有push、部署或发布;回退本检查点只撤销覆盖,不修复生产问题。 diff --git a/refactor/plan.md b/refactor/plan.md index 32783fa05..acb4481aa 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -2,9 +2,9 @@ > 由 tasks.json 生成。请修改数据后运行 `node refactor/scripts/plan.mjs --write`,不要手改本表。 -基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 261 项,范围 22 个包及工作区/示例。 +基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 262 项,范围 22 个包及工作区/示例。 -状态:todo 48 / doing 21 / blocked 0 / done 192 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 +状态:todo 49 / doing 21 / blocked 0 / done 192 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。 @@ -22,8 +22,8 @@ | artplayer-plugin-auto-thumbnail | 1.1.0 | PKG-AUTO-THUMB-01, PKG-AUTO-THUMB-02, PKG-AUTO-THUMB-03, PKG-AUTO-THUMB-04, PKG-AUTO-THUMB-05, PKG-AUTO-THUMB-06, PKG-AUTO-THUMB-07, PKG-AUTO-THUMB-08, PKG-AUTO-THUMB-09, PKG-AUTO-THUMB-10, PKG-AUTO-THUMB-11 | | artplayer-plugin-chapter | 1.1.0 | PILOT-01, PKG-CHAPTER-01, PKG-CHAPTER-02, PKG-CHAPTER-03, PKG-CHAPTER-04, PKG-CHAPTER-05, PKG-CHAPTER-06, PKG-CHAPTER-HOVER-01 | | artplayer-plugin-chromecast | 1.1.0 | PKG-CAST-01, PKG-CAST-02, PKG-CAST-03, PKG-CAST-04, PKG-CAST-05, PKG-CAST-06 | -| artplayer-plugin-danmuku | 5.3.0 | PKG-DANMUKU-01, PKG-DANMUKU-02, PKG-DANMUKU-03, PKG-DANMUKU-04, PKG-DANMUKU-05, PKG-DANMUKU-06, PKG-DANMUKU-07, PKG-DANMUKU-08, PKG-DANMUKU-09, PKG-DANMUKU-10, PKG-DANMUKU-11, PKG-DANMUKU-12 | -| artplayer-plugin-danmuku-mask | 1.1.0 | PKG-MASK-01, PKG-MASK-02, PKG-MASK-03, PKG-MASK-04, PKG-MASK-05, PKG-MASK-06, ENG-LINT-01 | +| artplayer-plugin-danmuku | 5.3.0 | PKG-DANMUKU-01, PKG-DANMUKU-02, PKG-DANMUKU-03, PKG-DANMUKU-04, PKG-DANMUKU-05, PKG-DANMUKU-06, PKG-DANMUKU-07, PKG-DANMUKU-08, PKG-DANMUKU-09, PKG-DANMUKU-10, PKG-DANMUKU-11, PKG-DANMUKU-12, PKG-DANMUKU-MASK-LOAD-01 | +| artplayer-plugin-danmuku-mask | 1.1.0 | PKG-MASK-01, PKG-MASK-02, PKG-MASK-03, PKG-MASK-04, PKG-MASK-05, PKG-MASK-06, ENG-LINT-01, PKG-DANMUKU-MASK-LOAD-01 | | artplayer-plugin-dash-control | 1.1.0 | PKG-DASH-01, PKG-DASH-02, PKG-DASH-03, PKG-DASH-04, PKG-DASH-SEEK-01, PKG-DASH-MENU-01, PKG-DASH-05, PKG-DASH-06 | | artplayer-plugin-document-pip | 1.1.0 | PKG-DPIP-01, PKG-DPIP-02, PKG-DPIP-03, PKG-DPIP-04, PKG-DPIP-05, PKG-DPIP-06 | | artplayer-plugin-hls-control | 1.1.0 | PKG-HLS-01, PKG-HLS-02, PKG-HLS-03, PKG-HLS-04, PKG-HLS-SDK-01, PKG-HLS-05, PKG-HLS-06 | @@ -263,7 +263,7 @@ | PKG-MASK-03 | artplayer-plugin-danmuku-mask
整理内部职责与资源 | PKG-MASK-02, CORE-18, PKG-DANMUKU-07 | 模型加载/推理/画布输出分离,阻止重叠推理与过期写入 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | done | | PKG-MASK-04 | artplayer-plugin-danmuku-mask
迁移自有源码和公开类型 | PKG-MASK-03, ENG-04, ENG-06, CORE-07 | 模型 adapter、canvas 和选项的精确类型 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容 | H | done | | PKG-MASK-05 | artplayer-plugin-danmuku-mask
验证新旧核心和组合 | PKG-MASK-04, CORE-22 | 真实模型和 danmuku/seek/全屏组合,GPU 资源释放 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | H | doing | -| PKG-MASK-06 | artplayer-plugin-danmuku-mask
验证分发并同步文档 | PKG-MASK-05, ENG-07 | danmuku.mask.js、资源版本/许可、CPU fallback 和包体积证据 | tarball 入口/资源、类型、8082 demo 和 README 一致,有回退记录 | H | todo | +| PKG-MASK-06 | artplayer-plugin-danmuku-mask
验证分发并同步文档 | PKG-MASK-05, ENG-07, PKG-DANMUKU-MASK-LOAD-01 | danmuku.mask.js、资源版本/许可、CPU fallback 和包体积证据 | tarball 入口/资源、类型、8082 demo 和 README 一致,有回退记录 | H | todo | ## 5 包迁移:artplayer-plugin-asr @@ -336,7 +336,7 @@ | PKG-DANMUKU-06 | artplayer-plugin-danmuku
迁移 TS 与公开声明 | PKG-DANMUKU-05, ENG-04, ENG-06 | 自有模块、worker 消息、option/item/result 类型 | 旧参数、扩展字段和事件消费通过,vendored 边界清楚 | H | done | | PKG-DANMUKU-07 | artplayer-plugin-danmuku
弹幕能力稳定性验收 | PKG-DANMUKU-06, PKG-DANMUKU-10, PKG-DANMUKU-11, PKG-DANMUKU-12 | 负载/渲染/资源对比及 mask 可依赖的稳定边界 | 在试点核心中旧插件 API 与关键帧路径通过 | H | done | | PKG-DANMUKU-08 | artplayer-plugin-danmuku
完成新旧核心与组合验收 | PKG-DANMUKU-07, CORE-22 | 最终核心/旧核心、mask/fullscreen/PiP 组合报告 | 性能无未解释退化,反复装卸无累计资源 | H | doing | -| PKG-DANMUKU-09 | artplayer-plugin-danmuku
完成分发、示例与文档 | PKG-DANMUKU-08, ENG-07 | danmuku.js、README、声明、worker 与产物 | tarball 和静态 icons 等旧调用通过,有独立回退版本 | H | todo | +| PKG-DANMUKU-09 | artplayer-plugin-danmuku
完成分发、示例与文档 | PKG-DANMUKU-08, ENG-07, PKG-DANMUKU-MASK-LOAD-01 | danmuku.js、README、声明、worker 与产物 | tarball 和静态 icons 等旧调用通过,有独立回退版本 | H | todo | | PKG-DANMUKU-10 | artplayer-plugin-danmuku
修复 issue958 密集热力图过高与曲线裁平 | PKG-DANMUKU-05 | 自动密度缩放与曲线边界、历史自定义坐标兼容及真实浏览器红绿证据 | 16000条三种分布在两核心三引擎和source/main/legacy不遮挡;显式轴和自定义points保持旧解释,有单独commit | M | done | | PKG-DANMUKU-11 | artplayer-plugin-danmuku
修复 Worker 隐藏等待吞掉可见寿命 | PKG-DANMUKU-06 | 成功放置时的可见计时与延迟回复回归 | 真实 Worker 延迟下完整显示寿命;保留暂停/回收/取消和公开契约 | M | done | | PKG-DANMUKU-12 | artplayer-plugin-danmuku
保持异步放置期间的原生帧采样与寿命维护 | PKG-DANMUKU-11 | 每帧采样与串行dispatcher、代际buffer及回归 | 异步等待不丢已到时采样、不延迟既有寿命维护;保留顺序、取消与公开readys窗口 | H | done | @@ -463,6 +463,12 @@ | ENG-LINT-01 | artplayer-plugin-danmuku-mask, workspace
修复 Mask manifest 排序并恢复全仓 lint | PKG-MASK-04 | 仅调整 manifest 字段顺序,独立验证全仓只读 lint 与元数据语义不变 | 根 lint 通过;解析后的 manifest 深度相等;不改包版本、依赖或公开入口 | L | done | | ENG-13 | workspace
保证性能资源探针的最小观察时长 | ENG-08 | 性能页面按实测时钟补足既有350ms观察窗口,保留冻结基线和原校验门槛;时钟边界测试和实际安装包配对证据 | 349ms仍被拒绝;早到定时器补足观察、正常超时保留实际值;冻结计时样本逻辑未变,三浏览器实际350ms观察及资源校验通过 | M | done | +## 5 包组合:Danmuku / Mask + +| ID | 范围 / 步骤 | 前置依赖 | 交付物 | 验收条件 | 风险 | 状态 | +| --- | --- | --- | --- | --- | --- | --- | +| PKG-DANMUKU-MASK-LOAD-01 | artplayer-plugin-danmuku, artplayer-plugin-danmuku-mask
修复真实Mask组合下的弹幕未采样与放置积压 | PKG-DANMUKU-12, PKG-MASK-04, CORE-22 | 分阶段性能/采样诊断、兼容实现修复及新旧核心/产物回归 | 关闭真实模型组合5项密集负载失败和1项负载前漏显,保持回调顺序、显示寿命与生命周期取消;不能以降低负载或关闭模型制造通过 | H | todo | + ## 完成证据与阻塞 - DOC-01: [记录](progress.md) @@ -611,7 +617,7 @@ - PKG-DANMUKU-05: [记录](changes/2026-09-13-PKG-DANMUKU-05-resources.md) [记录](baselines/danmuku-resources-validation.json) - PKG-DANMUKU-06: [记录](changes/2026-09-13-PKG-DANMUKU-06-types.md) [记录](baselines/danmuku-types-validation.json) - PKG-DANMUKU-07: [记录](changes/2026-09-13-PKG-DANMUKU-07-stability.md) [记录](baselines/danmuku-stability-validation.json) [记录](danmuku-stability.md) -- PKG-DANMUKU-08: [记录](changes/2026-09-14-PKG-DANMUKU-08-native-combinations.md) [记录](baselines/danmuku-combination-checkpoint.json) [记录](changes/2026-09-14-PKG-DANMUKU-08-fullscreen-lifetimes.md) [记录](baselines/danmuku-fullscreen-validation.json) [记录](baselines/danmuku-old-core-load-validation.json) +- PKG-DANMUKU-08: [记录](changes/2026-09-14-PKG-DANMUKU-08-native-combinations.md) [记录](baselines/danmuku-combination-checkpoint.json) [记录](changes/2026-09-14-PKG-DANMUKU-08-fullscreen-lifetimes.md) [记录](baselines/danmuku-fullscreen-validation.json) [记录](baselines/danmuku-old-core-load-validation.json) [记录](changes/2026-09-14-PKG-DANMUKU-08-combined-load.md) [记录](baselines/danmuku-combined-load-validation.json) - PKG-CANVAS-01: [记录](changes/2026-09-12-PKG-CANVAS-01-contract.md) [记录](baselines/canvas-contract.md) [记录](baselines/canvas-release.json) [记录](canvas-validation.md) [记录](baselines/canvas-contract-validation.json) - 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) @@ -678,3 +684,4 @@ - CI-BROWSER-01: [记录](changes/2026-09-14-CI-BROWSER-01-scopes.md) [记录](baselines/browser-scope-validation.json) - PKG-CHAPTER-HOVER-01: [记录](changes/2026-09-14-PKG-CHAPTER-HOVER-01-geometry.md) [记录](baselines/chapter-hover-validation.json) - PKG-CANVAS-SUBTITLE-01: [记录](changes/2026-09-14-PKG-CANVAS-SUBTITLE-01-track.md) [记录](baselines/canvas-subtitles-validation.json) +- PKG-DANMUKU-MASK-LOAD-01: [记录](changes/2026-09-14-PKG-DANMUKU-08-combined-load.md) [记录](baselines/danmuku-combined-load-validation.json) diff --git a/refactor/progress.md b/refactor/progress.md index 86c0a4c71..e79673899 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,26 @@ # 进度与证据 +## PKG-DANMUKU-08 旧插件组合与真实负载:新增必须修复项 + +扩展PiP/Mask测试加载校验后的npm弹幕5.3.0及候选源码。普通PiP矩阵36项退出0: +24原生播放(12候选清理、12旧插件残留观察),12WebKit API不可用;新load矩阵 +12项退出0:8原生(4候选/4旧插件)、4不可用。候选每个原生用例在两个窗口 +各完整显示/回收120行,Worker终止。旧插件destroy(false)残留renderer/Setting的 +12个首轮失败单独保留,并有明确历史outcome;候选零残留要求不变。 + +真实Mask模型保持运行并施加20条/秒负载,18项12通过6失败(退出1):候选 +5项负载显示不完整,另1项Chromium beta核心负载前行未显示。Firefox候选3项 +完整交付;旧插件在Chromium/WebKit也漏显,尚不能认定重构回归或单一根因。 +完整的行、帧间隔、输入哈希和原失败报告见 +[记录](changes/2026-09-14-PKG-DANMUKU-08-combined-load.md)及 +[证据](baselines/danmuku-combined-load-validation.json)。没有降低负载、扩大等待或 +关闭模型把该失败改为通过。原先只含稀疏行的Mask通过报告不能关闭新增负载要求。 + +新增PKG-DANMUKU-MASK-LOAD-01及DANMUKU-MASK-LOAD-01,接续区分未采样与已采样 +放置积压,分析真实模型/绘制/Worker往返成本后兼容修复。08/Mask05保持doing, +09/Mask06显式依赖修复。262项:192 done、21 doing、49 todo。专项lint和任务/风险 +校验通过;浏览器仍有上述6失败。本检查点独立本地提交并核验审计;无push/发布。 + ## PKG-DANMUKU-08 全屏生命周期与旧核心负载检查点(仍 doing) 三引擎/新旧核心/新旧弹幕的网页及原生document全屏源码24项通过,候选main与 diff --git a/refactor/risk-table.md b/refactor/risk-table.md index 98ed875e1..b8c0afb5f 100644 --- a/refactor/risk-table.md +++ b/refactor/risk-table.md @@ -275,3 +275,4 @@ | 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 | | DASH-MENU-01 | resolved / 已复现 | SDK 5.2.1 播放中设置质量选项在点击时变为不可见 | PKG-DASH-MENU-01, PKG-DASH-05, REVIEW-02 | +| DANMUKU-MASK-LOAD-01 | open / 已复现 | 真实Mask模型运行时弹幕存在未采样窗口及串行放置积压 | PKG-DANMUKU-MASK-LOAD-01, PKG-DANMUKU-08, PKG-MASK-05 | diff --git a/refactor/risks.json b/refactor/risks.json index 4a4f95dfd..ec3570714 100644 --- a/refactor/risks.json +++ b/refactor/risks.json @@ -6294,6 +6294,26 @@ "test/dash-events.test.js" ], "resolutionRationale": "原trace显示设置仍打开但导航退回根面板;真实SDK刷新在四组核心/SDK组合复现相同失败。修复后源码92、main设置32、legacy完整候选92通过,新旧核心/两SDK/两引擎覆盖质量及音轨,原失败与未加force/延长超时的回归均保留。Node446验证三格式及重入/销毁边界;DASH其他SDK/设备/发布风险仍独立开放。" + }, + { + "id": "DANMUKU-MASK-LOAD-01", + "title": "真实Mask模型运行时弹幕存在未采样窗口及串行放置积压", + "confirmation": "reproduced", + "status": "open", + "owners": [ + "PKG-DANMUKU-MASK-LOAD-01", + "PKG-DANMUKU-08", + "PKG-MASK-05" + ], + "evidence": [ + "refactor/changes/2026-09-14-PKG-DANMUKU-08-combined-load.md", + "refactor/baselines/danmuku-combined-load-validation.json", + "test/browser/danmuku-mask-native.spec.js", + "test/helpers/danmuku-combination-load.js" + ], + "compatibleResolution": "分析真实模型/绘制/Worker往返成本和未采样、待放置行,保持公共readys与回调顺序、显示寿命及生命周期取消;用独立回归验证兼容修复。", + "closureCriteria": "原始失败保留并有可解释修复;真实模型下120行完整交付、无活动引用积压,新旧核心和main/legacy以及暂停/seek/hide/destroy回归通过;不降低负载、停模型或扩大等待伪造结果。", + "workspaceState": "源码18项12通过6失败:5项候选密集负载不完整,1项Chromium beta核心负载前行未显示。旧插件同环境也漏显,尚未证明是重构回归或定位单一瓶颈。Firefox候选和原生PiP负载通过。" } ] } diff --git a/refactor/tasks.json b/refactor/tasks.json index 1b107cb01..0d47e9e6d 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -2764,7 +2764,8 @@ ], "dependsOn": [ "PKG-MASK-05", - "ENG-07" + "ENG-07", + "PKG-DANMUKU-MASK-LOAD-01" ], "status": "todo", "risk": "H", @@ -3565,7 +3566,9 @@ "baselines/danmuku-combination-checkpoint.json", "changes/2026-09-14-PKG-DANMUKU-08-fullscreen-lifetimes.md", "baselines/danmuku-fullscreen-validation.json", - "baselines/danmuku-old-core-load-validation.json" + "baselines/danmuku-old-core-load-validation.json", + "changes/2026-09-14-PKG-DANMUKU-08-combined-load.md", + "baselines/danmuku-combined-load-validation.json" ] }, { @@ -3577,7 +3580,8 @@ ], "dependsOn": [ "PKG-DANMUKU-08", - "ENG-07" + "ENG-07", + "PKG-DANMUKU-MASK-LOAD-01" ], "status": "todo", "risk": "H", @@ -5465,6 +5469,28 @@ "changes/2026-09-14-PKG-CANVAS-SUBTITLE-01-track.md", "baselines/canvas-subtitles-validation.json" ] + }, + { + "id": "PKG-DANMUKU-MASK-LOAD-01", + "phase": "5 包组合:Danmuku / Mask", + "title": "修复真实Mask组合下的弹幕未采样与放置积压", + "scope": [ + "artplayer-plugin-danmuku", + "artplayer-plugin-danmuku-mask" + ], + "dependsOn": [ + "PKG-DANMUKU-12", + "PKG-MASK-04", + "CORE-22" + ], + "status": "todo", + "risk": "H", + "deliverable": "分阶段性能/采样诊断、兼容实现修复及新旧核心/产物回归", + "acceptance": "关闭真实模型组合5项密集负载失败和1项负载前漏显,保持回调顺序、显示寿命与生命周期取消;不能以降低负载或关闭模型制造通过", + "evidence": [ + "changes/2026-09-14-PKG-DANMUKU-08-combined-load.md", + "baselines/danmuku-combined-load-validation.json" + ] } ] } diff --git a/test/browser/README.md b/test/browser/README.md index 30422e28f..b06f1a01f 100644 --- a/test/browser/README.md +++ b/test/browser/README.md @@ -250,6 +250,14 @@ with a missed narrow timestamp window. A passing post-ready combination is not proof of startup losslessness, private GPU/WASM closure, OS fullscreen or devices. See refactor/changes/2026-09-14-PKG-MASK-05-native-checkpoint.md for exact limits. +Its combination cases now include frozen/current Danmuku and a bounded 120-row +load while the actual model continues. `danmuku-combination-load.js` observes +real media/RAF and cleans up its test listeners; it does not seed eligible rows. +Candidate completeness failures remain failing under PKG-DANMUKU-MASK-LOAD-01. +`danmuku-dpip.spec.js` also includes two-window load cases and both plugin versions. +Frozen-plugin retained DOM, candidate cleanup and unsupported API outcomes remain +distinct; the old plugin's observed loss is not complete-delivery acceptance. + `jassub-native.spec.js` runs actual published JASSUB 1.1.0, its native Worker, fixed local WASM/font and authored ASS cues with offscreenRender=false. It checks real canvas pixels before/after seek, CSS web fullscreen and normal destruction. diff --git a/test/browser/danmuku-dpip.spec.js b/test/browser/danmuku-dpip.spec.js index ae50d732f..537627d24 100644 --- a/test/browser/danmuku-dpip.spec.js +++ b/test/browser/danmuku-dpip.spec.js @@ -1,161 +1,189 @@ +import assert from 'node:assert/strict' import fs from 'node:fs' import process from 'node:process' -import { hash } from '../../refactor/scripts/releases.mjs' +import { ensureArchive, hash, readMember } from '../../refactor/scripts/releases.mjs' +import { observeDanmukuLoad } from '../helpers/danmuku-combination-load.js' import { dpipCandidate } from '../helpers/dpip.js' import { compilePackage } from '../helpers/load.js' import { expect, test } from './fixtures.js' const dpip = await dpipCandidate() -let danmuku +const implementations = new Map() test.beforeAll(async () => { - danmuku = process.env.ARTPLAYER_DANMUKU_ARTIFACT + const release = JSON.parse(fs.readFileSync('refactor/baselines/danmuku-release.json', 'utf8')).release + const member = 'package/dist/artplayer-plugin-danmuku.js' + const published = readMember(await ensureArchive(release), member) + assert.equal(hash(published), release.files[member]) + implementations.set('published', { input: `npm ${release.version}`, code: published.toString() }) + const candidate = process.env.ARTPLAYER_DANMUKU_ARTIFACT ? fs.readFileSync(process.env.ARTPLAYER_DANMUKU_ARTIFACT, 'utf8') : await compilePackage('artplayer-plugin-danmuku', 'umd') + implementations.set('candidate', { input: process.env.ARTPLAYER_DANMUKU_ARTIFACT || 'source UMD', code: candidate }) }) for (const core of ['published', 'candidate']) { - for (const ending of ['close', 'native-close', 'destroy']) { - test(`${core}: Danmuku, heatmap and Worker survive native Document PiP ${ending}`, async ({ page, context }, testInfo) => { - await page.goto(`/test/player.html?core=${core}`) - const supported = await page.evaluate(() => typeof window.documentPictureInPicture?.requestWindow === 'function') - const evidence = { core, ending, supported, danmuku: { input: process.env.ARTPLAYER_DANMUKU_ARTIFACT || 'source UMD', sha256: hash(danmuku) }, dpip: { input: dpip.name, sha256: hash(dpip.code) }, outcome: 'incomplete', rounds: [] } - if (!supported) { - evidence.outcome = 'native-document-pip-unavailable' - await testInfo.attach('danmuku-dpip', { contentType: 'application/json', body: JSON.stringify(evidence) }) - return - } - await page.evaluate(() => { - window.combinationWorkers = [] - const NativeWorker = window.Worker - window.Worker = class extends NativeWorker { - constructor(...args) { - super(...args) - this.record = { terminated: 0, replies: 0 } - window.combinationWorkers.push(this.record) - this.addEventListener('message', () => this.record.replies++) - } - - terminate() { - this.record.terminated++ - return super.terminate() - } + for (const implementation of ['published', 'candidate']) { + for (const ending of ['close', 'native-close', 'destroy', 'load']) { + test(`${core}: ${implementation} Danmuku, heatmap and Worker survive native Document PiP ${ending}`, async ({ page, context }, testInfo) => { + if (ending === 'load') + test.setTimeout(45000) // Two native PiP loads add 16 seconds of actual media progression. + const input = implementations.get(implementation) + const danmuku = input.code + await page.goto(`/test/player.html?core=${core}`) + const supported = await page.evaluate(() => typeof window.documentPictureInPicture?.requestWindow === 'function') + const evidence = { core, implementation, ending, supported, danmuku: { input: input.input, sha256: hash(danmuku) }, dpip: { input: dpip.name, sha256: hash(dpip.code) }, outcome: 'incomplete', rounds: [], loads: [] } + if (!supported) { + evidence.outcome = 'native-document-pip-unavailable' + await testInfo.attach('danmuku-dpip', { contentType: 'application/json', body: JSON.stringify(evidence) }) + return } - }) - await page.addScriptTag({ content: danmuku }) - await page.addScriptTag({ content: `(() => { const module = { exports: {} }; const exports = module.exports; ${dpip.code}; window.dpipFactory = module.exports.default || module.exports; })();` }) - await page.evaluate(() => { - window.combinationVisible = [] - window.combinationErrors = [] - window.combinationEvents = [] - window.art = new window.Artplayer({ - container: '.player', - url: '/assets/sample/video.mp4', - muted: true, - plugins: [window.artplayerPluginDanmuku({ danmuku: [], heatmap: true, emitter: true, speed: 4 }), window.dpipFactory({ fallbackToVideoPiP: false })], - }) - window.danmuku = window.art.plugins.artplayerPluginDanmuku - window.danmukuOwner = window.danmuku.config({}) - window.pip = window.art.plugins.artplayerPluginDocumentPip - window.combinationPlayer = window.art.template.$player - window.combinationLayer = window.art.template.$danmuku - window.combinationParent = window.combinationPlayer.parentNode - window.art.on('document-pip', value => window.combinationEvents.push(value)) - window.art.on('artplayerPluginDanmuku:error', error => window.combinationErrors.push(String(error))) - window.art.on('artplayerPluginDanmuku:visible', row => window.combinationVisible.push({ text: row.text, ref: row.$ref, time: window.art.currentTime })) - document.querySelector('#play').onclick = () => window.art.play() - const open = document.createElement('button') - open.id = 'danmuku-open-pip' - open.textContent = 'Open Danmuku PiP' - open.onclick = () => { - window.openingDanmukuPip = window.pip.open() - } - document.body.append(open) - }) - try { - await expect.poll(() => page.evaluate(() => window.art.isReady)).toBe(true) - await page.click('#play') - await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThan(0.1) - for (let round = 0; round < 2; round++) { - const popupPromise = context.waitForEvent('page', { timeout: 8000 }) - await page.click('#danmuku-open-pip') - const popup = await popupPromise - await page.evaluate(() => window.openingDanmukuPip) - await expect(popup.locator('video.art-video')).toBeVisible() - await expect(popup.locator('.artplayer-plugin-danmuku')).toHaveCount(1) - const text = `PiP row ${round}` - await page.evaluate(async (text) => { - await window.danmuku.load([{ text, time: window.art.currentTime + 0.5, mode: 1 }]) - }, text) - await expect.poll(() => page.evaluate(text => window.combinationVisible.some(row => row.text === text), text)).toBe(true) - await expect(popup.getByText(text, { exact: true })).toBeVisible() - const snapshot = await page.evaluate((text) => { - const row = window.combinationVisible.find(row => row.text === text) - const rect = row.ref.getBoundingClientRect() - const popup = window.documentPictureInPicture.window - return { - time: window.art.currentTime, - rowTime: row.time, - width: rect.width, - height: rect.height, - adopted: row.ref.ownerDocument === popup.document && window.combinationLayer.ownerDocument === popup.document, - inLayer: window.combinationLayer.contains(row.ref), - position: popup.getComputedStyle(row.ref).position, - player: window.combinationPlayer.ownerDocument === popup.document, - heatmap: window.art.controls.heatmap.ownerDocument === popup.document && !!window.art.controls.heatmap.querySelector('svg'), - workers: window.combinationWorkers.map(worker => ({ ...worker })), + await page.evaluate(() => { + window.combinationWorkers = [] + const NativeWorker = window.Worker + window.Worker = class extends NativeWorker { + constructor(...args) { + super(...args) + this.record = { terminated: 0, replies: 0 } + window.combinationWorkers.push(this.record) + this.addEventListener('message', () => this.record.replies++) } - }, text) - evidence.rounds.push(snapshot) - expect(snapshot.adopted && snapshot.inLayer && snapshot.player && snapshot.heatmap).toBe(true) - expect(snapshot.width).toBeGreaterThan(0) - expect(snapshot.height).toBeGreaterThan(0) - expect(snapshot.position).toBe('absolute') - expect(snapshot.workers).toHaveLength(1) - expect(snapshot.workers[0].replies).toBeGreaterThan(0) - if (round === 0) - await testInfo.attach('native-danmuku-page', { contentType: 'image/png', body: await popup.screenshot() }) - if (round === 1 && ending === 'destroy') { + + terminate() { + this.record.terminated++ + return super.terminate() + } + } + }) + await page.addScriptTag({ content: danmuku }) + await page.addScriptTag({ content: `(() => { const module = { exports: {} }; const exports = module.exports; ${dpip.code}; window.dpipFactory = module.exports.default || module.exports; })();` }) + await page.evaluate(() => { + window.combinationVisible = [] + window.combinationErrors = [] + window.combinationEvents = [] + window.art = new window.Artplayer({ + container: '.player', + url: '/assets/sample/video.mp4', + muted: true, + plugins: [window.artplayerPluginDanmuku({ danmuku: [], heatmap: true, emitter: true, speed: 4 }), window.dpipFactory({ fallbackToVideoPiP: false })], + }) + window.danmuku = window.art.plugins.artplayerPluginDanmuku + window.danmukuOwner = window.danmuku.config({}) + window.pip = window.art.plugins.artplayerPluginDocumentPip + window.combinationPlayer = window.art.template.$player + window.combinationLayer = window.art.template.$danmuku + window.combinationParent = window.combinationPlayer.parentNode + window.art.on('document-pip', value => window.combinationEvents.push(value)) + window.art.on('artplayerPluginDanmuku:error', error => window.combinationErrors.push(String(error))) + window.art.on('artplayerPluginDanmuku:visible', row => window.combinationVisible.push({ text: row.text, ref: row.$ref, time: window.art.currentTime })) + document.querySelector('#play').onclick = () => window.art.play() + const open = document.createElement('button') + open.id = 'danmuku-open-pip' + open.textContent = 'Open Danmuku PiP' + open.onclick = () => { + window.openingDanmukuPip = window.pip.open() + } + document.body.append(open) + }) + try { + await expect.poll(() => page.evaluate(() => window.art.isReady)).toBe(true) + await page.click('#play') + await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThan(0.1) + for (let round = 0; round < 2; round++) { + const popupPromise = context.waitForEvent('page', { timeout: 8000 }) + await page.click('#danmuku-open-pip') + const popup = await popupPromise + await page.evaluate(() => window.openingDanmukuPip) + await expect(popup.locator('video.art-video')).toBeVisible() + await expect(popup.locator('.artplayer-plugin-danmuku')).toHaveCount(1) + const text = `PiP row ${round}` + await page.evaluate(async (text) => { + await window.danmuku.load([{ text, time: window.art.currentTime + 0.5, mode: 1 }]) + }, text) + await expect.poll(() => page.evaluate(text => window.combinationVisible.some(row => row.text === text), text)).toBe(true) + await expect(popup.getByText(text, { exact: true }).and(popup.locator(':visible'))).toBeVisible() + const snapshot = await page.evaluate((text) => { + const row = window.combinationVisible.find(row => row.text === text) + const rect = row.ref.getBoundingClientRect() + const popup = window.documentPictureInPicture.window + return { + time: window.art.currentTime, + rowTime: row.time, + width: rect.width, + height: rect.height, + adopted: row.ref.ownerDocument === popup.document && window.combinationLayer.ownerDocument === popup.document, + inLayer: window.combinationLayer.contains(row.ref), + position: popup.getComputedStyle(row.ref).position, + player: window.combinationPlayer.ownerDocument === popup.document, + heatmap: window.art.controls.heatmap.ownerDocument === popup.document && !!window.art.controls.heatmap.querySelector('svg'), + workers: window.combinationWorkers.map(worker => ({ ...worker })), + } + }, text) + evidence.rounds.push(snapshot) + expect(snapshot.adopted && snapshot.inLayer && snapshot.player && snapshot.heatmap).toBe(true) + expect(snapshot.width).toBeGreaterThan(0) + expect(snapshot.height).toBeGreaterThan(0) + expect(snapshot.position).toBe('absolute') + expect(snapshot.workers).toHaveLength(1) + expect(snapshot.workers[0].replies).toBeGreaterThan(0) + if (round === 0) + await testInfo.attach('native-danmuku-page', { contentType: 'image/png', body: await popup.screenshot() }) + if (ending === 'load') + evidence.loads.push(await observeDanmukuLoad(page, { label: `PiP ${round}`, requireComplete: implementation === 'candidate' })) + evidence.beforeDestroy = await page.evaluate(() => ({ nodes: window.combinationLayer.children.length })) + if (round === 1 && ending === 'destroy') { + await page.evaluate(() => window.art.destroy(false)) + } + else { + await page.evaluate(ending => ending === 'native-close' ? window.documentPictureInPicture.window.close() : window.pip.close(), ending) + await expect.poll(() => page.evaluate(() => window.pip.isActive)).toBe(false) + expect(await page.evaluate(() => window.combinationPlayer.parentNode === window.combinationParent && window.combinationLayer.ownerDocument === document)).toBe(true) + await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThan(snapshot.time + 0.1) + } + } + if (ending !== 'destroy') await page.evaluate(() => window.art.destroy(false)) + await expect.poll(() => page.evaluate(() => !window.documentPictureInPicture.window || window.documentPictureInPicture.window.closed)).toBe(true) + evidence.final = await page.evaluate(() => ({ + active: window.pip.isActive, + workers: window.combinationWorkers, + errors: window.combinationErrors, + events: window.combinationEvents, + frame: window.danmukuOwner.scheduler?.frame, + operation: window.danmukuOwner.scheduler?.operation, + nodes: window.combinationLayer.children.length, + settings: document.querySelectorAll('.artplayer-plugin-danmuku').length, + placeholders: document.querySelectorAll('.artplayer-document-pip-placeholder').length, + })) + expect(evidence.final.active).toBe(false) + expect(evidence.final.workers).toHaveLength(1) + expect(evidence.final.workers[0].terminated).toBe(1) + expect(evidence.final.errors).toEqual([]) + // Destroy suppresses further public events, as in the existing native PiP contract. + expect(evidence.final.events).toEqual(ending === 'destroy' ? [true, false, true] : [true, false, true, false]) + if (implementation === 'candidate') { + expect(evidence.final.frame).toBeNull() + expect(evidence.final.operation).toBeNull() + expect(evidence.final.nodes + evidence.final.settings + evidence.final.placeholders).toBe(0) + evidence.outcome = 'native-playback-danmuku-and-cleanup-passed' } else { - await page.evaluate(ending => ending === 'native-close' ? window.documentPictureInPicture.window.close() : window.pip.close(), ending) - await expect.poll(() => page.evaluate(() => window.pip.isActive)).toBe(false) - expect(await page.evaluate(() => window.combinationPlayer.parentNode === window.combinationParent && window.combinationLayer.ownerDocument === document)).toBe(true) - await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThan(snapshot.time + 0.1) + // Frozen npm 5.3.0 destroy(false) retains its renderer and Setting nodes. + expect(evidence.final.nodes).toBe(ending === 'load' ? evidence.beforeDestroy.nodes : 3) + expect(evidence.final.nodes).toBeGreaterThan(0) + expect(evidence.final.settings).toBe(1) + expect(evidence.final.placeholders).toBe(0) + evidence.outcome = 'native-playback-with-published-retained-dom' } } - if (ending !== 'destroy') - await page.evaluate(() => window.art.destroy(false)) - await expect.poll(() => page.evaluate(() => !window.documentPictureInPicture.window || window.documentPictureInPicture.window.closed)).toBe(true) - evidence.final = await page.evaluate(() => ({ - active: window.pip.isActive, - workers: window.combinationWorkers, - errors: window.combinationErrors, - events: window.combinationEvents, - frame: window.danmukuOwner.scheduler.frame, - operation: window.danmukuOwner.scheduler.operation, - nodes: window.combinationLayer.children.length, - settings: document.querySelectorAll('.artplayer-plugin-danmuku').length, - placeholders: document.querySelectorAll('.artplayer-document-pip-placeholder').length, - })) - expect(evidence.final.active).toBe(false) - expect(evidence.final.workers).toHaveLength(1) - expect(evidence.final.workers[0].terminated).toBe(1) - expect(evidence.final.errors).toEqual([]) - // Destroy suppresses further public events, as in the existing native PiP contract. - expect(evidence.final.events).toEqual(ending === 'destroy' ? [true, false, true] : [true, false, true, false]) - expect(evidence.final.frame).toBeNull() - expect(evidence.final.operation).toBeNull() - expect(evidence.final.nodes + evidence.final.settings + evidence.final.placeholders).toBe(0) - evidence.outcome = 'native-playback-danmuku-and-cleanup-passed' - } - finally { - await testInfo.attach('danmuku-dpip', { contentType: 'application/json', body: JSON.stringify(evidence) }) - await page.evaluate(() => { - if (window.art && !window.art.isDestroy) - window.art.destroy(false) - }) - } - }) + finally { + evidence.incompleteLoad = await page.evaluate(() => window.danmukuCombinationLoadResult) + await testInfo.attach('danmuku-dpip', { contentType: 'application/json', body: JSON.stringify(evidence) }) + await page.evaluate(() => { + if (window.art && !window.art.isDestroy) + window.art.destroy(false) + }) + } + }) + } } } diff --git a/test/browser/danmuku-mask-native.spec.js b/test/browser/danmuku-mask-native.spec.js index d6b46a4a3..6ec2d2b28 100644 --- a/test/browser/danmuku-mask-native.spec.js +++ b/test/browser/danmuku-mask-native.spec.js @@ -1,7 +1,8 @@ import assert from 'node:assert/strict' import fs from 'node:fs' import process from 'node:process' -import { hash } from '../../refactor/scripts/releases.mjs' +import { ensureArchive, hash, readMember } from '../../refactor/scripts/releases.mjs' +import { observeDanmukuLoad } from '../helpers/danmuku-combination-load.js' import { compilePackage } from '../helpers/load.js' import { expect, test } from './fixtures.js' @@ -20,11 +21,18 @@ const assets = baseline.sdk.assets.map(({ file, sha256 }) => { const media = 'docs/assets/sample/steve-jobs.mp4' const danmukuFile = process.env.ARTPLAYER_DANMUKU_ARTIFACT || 'source UMD' let danmukuCode +const danmukuImplementations = new Map() test.beforeAll(async () => { ;[code, danmukuCode] = await Promise.all([ process.env.ARTPLAYER_MASK_ARTIFACT ? fs.readFileSync(artifact, 'utf8') : compilePackage('artplayer-plugin-danmuku-mask', 'umd'), process.env.ARTPLAYER_DANMUKU_ARTIFACT ? fs.readFileSync(danmukuFile, 'utf8') : compilePackage('artplayer-plugin-danmuku', 'umd'), ]) + const release = JSON.parse(fs.readFileSync('refactor/baselines/danmuku-release.json', 'utf8')).release + const member = 'package/dist/artplayer-plugin-danmuku.js' + const published = readMember(await ensureArchive(release), member) + assert.equal(hash(published), release.files[member]) + danmukuImplementations.set('published', { file: `npm ${release.version}`, code: published.toString() }) + danmukuImplementations.set('candidate', { file: danmukuFile, code: danmukuCode }) }) for (const core of ['candidate', 'published', 'published-5.3.1-beta.1']) { @@ -132,138 +140,146 @@ for (const core of ['candidate', 'published', 'published-5.3.1-beta.1']) { } }) - test(`Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with ${core} core`, async ({ page }, testInfo) => { - test.setTimeout(90000) - await page.goto(`/test/player.html?core=${core}`) - await page.addScriptTag({ content: danmukuCode }) - await page.addScriptTag({ content: code }) - const unexpected = [] - const origin = new URL(testInfo.project.use.baseURL).origin - await page.route('**/*', (route) => { - if (new URL(route.request().url()).origin !== origin) { - unexpected.push(route.request().url()) - return route.abort() - } - return route.continue() - }) - await page.evaluate(() => { - window.maskCombination = { times: [], visible: [], snapshots: [], samples: [] } - const encode = HTMLCanvasElement.prototype.toDataURL - HTMLCanvasElement.prototype.toDataURL = function (...args) { - const result = encode.apply(this, args) - window.maskCombination.times.push(window.art?.currentTime) - return result - } - window.art = new window.Artplayer({ - container: '.player', - url: '/assets/sample/steve-jobs.mp4', - muted: true, - fullscreenWeb: true, - plugins: [window.artplayerPluginDanmuku({ danmuku: [{ text: 'Native mask combination', time: 6, mode: 1 }], heatmap: false }), window.artplayerPluginDanmukuMask({ solutionPath: '/assets/@mediapipe/selfie_segmentation' })], + for (const implementation of ['published', 'candidate']) { + test(`Mask actual model and Danmuku share the layer through pause, seek and web fullscreen with ${core} core / ${implementation} plugin`, async ({ page }, testInfo) => { + const danmuku = danmukuImplementations.get(implementation) + test.setTimeout(90000) + await page.goto(`/test/player.html?core=${core}`) + await page.addScriptTag({ content: danmuku.code }) + await page.addScriptTag({ content: code }) + const unexpected = [] + let load + const origin = new URL(testInfo.project.use.baseURL).origin + await page.route('**/*', (route) => { + if (new URL(route.request().url()).origin !== origin) { + unexpected.push(route.request().url()) + return route.abort() + } + return route.continue() }) - window.maskCombination.layer = window.art.template.$danmuku - const owner = window.art.plugins.artplayerPluginDanmuku.config({}) - const ready = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(owner), 'readys').get - Object.defineProperty(owner, 'readys', { configurable: true, get() { - const rows = ready.call(this) - window.maskCombination.samples.push({ time: window.art.currentTime, wall: performance.now(), rows: rows.map(row => ({ time: row.time, text: row.text })) }) - return rows - } }) - window.art.on('artplayerPluginDanmuku:visible', (row) => { - const node = row.$ref - const rect = node?.getBoundingClientRect() - window.maskCombination.visible.push({ text: row.text, connected: node?.isConnected, inLayer: node ? window.maskCombination.layer.contains(node) : false, width: rect?.width, height: rect?.height, display: node ? getComputedStyle(node).display : null }) + await page.evaluate(() => { + window.maskCombination = { times: [], visible: [], snapshots: [], samples: [] } + const encode = HTMLCanvasElement.prototype.toDataURL + HTMLCanvasElement.prototype.toDataURL = function (...args) { + const result = encode.apply(this, args) + window.maskCombination.times.push(window.art?.currentTime) + return result + } + window.art = new window.Artplayer({ + container: '.player', + url: '/assets/sample/steve-jobs.mp4', + muted: true, + fullscreenWeb: true, + plugins: [window.artplayerPluginDanmuku({ danmuku: [{ text: 'Native mask combination', time: 6, mode: 1 }], heatmap: false }), window.artplayerPluginDanmukuMask({ solutionPath: '/assets/@mediapipe/selfie_segmentation' })], + }) + window.maskCombination.layer = window.art.template.$danmuku + const owner = window.art.plugins.artplayerPluginDanmuku.config({}) + const ready = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(owner), 'readys').get + Object.defineProperty(owner, 'readys', { configurable: true, get() { + const rows = ready.call(this) + window.maskCombination.samples.push({ time: window.art.currentTime, wall: performance.now(), rows: rows.map(row => ({ time: row.time, text: row.text })) }) + return rows + } }) + window.art.on('artplayerPluginDanmuku:visible', (row) => { + const node = row.$ref + const rect = node?.getBoundingClientRect() + window.maskCombination.visible.push({ text: row.text, connected: node?.isConnected, inLayer: node ? window.maskCombination.layer.contains(node) : false, width: rect?.width, height: rect?.height, display: node ? getComputedStyle(node).display : null }) + }) + document.querySelector('#play').onclick = () => window.art.play() + document.querySelector('#pause').onclick = () => window.art.pause() + window.maskSnapshot = (phase) => { + const layer = window.art.template.$danmuku + const rect = layer.getBoundingClientRect() + const snapshot = { phase, time: window.art.currentTime, outputs: window.maskCombination.times.length, sameLayer: layer === window.maskCombination.layer, mask: layer.style.maskImage.startsWith('url('), mode: getComputedStyle(layer).maskMode, width: rect.width, height: rect.height, fullscreenWeb: window.art.fullscreenWeb } + window.maskCombination.snapshots.push(snapshot) + return snapshot + } }) - document.querySelector('#play').onclick = () => window.art.play() - document.querySelector('#pause').onclick = () => window.art.pause() - window.maskSnapshot = (phase) => { - const layer = window.art.template.$danmuku - const rect = layer.getBoundingClientRect() - const snapshot = { phase, time: window.art.currentTime, outputs: window.maskCombination.times.length, sameLayer: layer === window.maskCombination.layer, mask: layer.style.maskImage.startsWith('url('), mode: getComputedStyle(layer).maskMode, width: rect.width, height: rect.height, fullscreenWeb: window.art.fullscreenWeb } - window.maskCombination.snapshots.push(snapshot) - return snapshot + try { + await expect.poll(() => page.evaluate(() => window.art.duration)).toBeGreaterThan(20) + await page.evaluate(() => { + window.art.currentTime = 5 + }) + await page.locator('#play').click() + await expect.poll(() => page.evaluate(() => window.maskCombination.times.length), { timeout: 30000 }).toBeGreaterThan(2) + // Keep the startup row and sampling history as diagnostics: native model + // initialization may block its narrow existing timestamp window. Exercise + // the ongoing combination after the real model has become operational. + await page.evaluate(async () => { + const time = window.art.currentTime + 1 + window.maskCombination.scheduled = time + await window.art.plugins.artplayerPluginDanmuku.load([{ text: 'Ready mask combination', time, mode: 1 }]) + }) + await expect.poll(() => page.evaluate(() => window.maskCombination.visible.map(row => row.text))).toContain('Ready mask combination') + const row = await page.evaluate(() => window.maskCombination.visible.find(row => row.text === 'Ready mask combination')) + expect(row.connected && row.inLayer).toBe(true) + expect(row.width).toBeGreaterThan(0) + expect(row.height).toBeGreaterThan(0) + expect(row.display).not.toBe('none') + const initial = await page.evaluate(() => window.maskSnapshot('playing')) + expect(initial.mask).toBe(true) + expect(initial.sameLayer).toBe(true) + await page.locator('#pause').click() + await expect.poll(() => page.evaluate(() => window.art.video.paused)).toBe(true) + // Wait native frames for the already-running SDK frame to finish. Compare + // its media timestamp, rather than forbidding one legitimate late encode. + const paused = await page.evaluate(async () => { + const time = window.art.currentTime + const beforeOutputs = window.maskCombination.times.length + await new Promise(resolve => setTimeout(resolve, 500)) + return { before: time, after: window.art.currentTime, extraOutputs: window.maskCombination.times.length - beforeOutputs, snapshot: window.maskSnapshot('paused') } + }) + expect(Math.abs(paused.after - paused.before)).toBeLessThan(0.01) + expect(paused.extraOutputs).toBeLessThanOrEqual(1) + await page.evaluate(async () => { + const seeked = new Promise(resolve => window.art.video.addEventListener('seeked', resolve, { once: true })) + window.art.currentTime = 20 + window.art.fullscreenWeb = true + await seeked + window.maskCombination.seeked = { time: window.art.currentTime, outputs: window.maskCombination.times.length } + }) + await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThanOrEqual(19.9) + const full = await page.evaluate(() => window.maskSnapshot('fullscreen-paused')) + expect(full.sameLayer).toBe(true) + expect(full.fullscreenWeb).toBe(true) + expect(full.width).toBeGreaterThan(initial.width) + await page.evaluate(() => window.art.play()) + await expect.poll(() => page.evaluate(() => window.maskCombination.times.length - window.maskCombination.seeked.outputs), { timeout: 30000 }).toBeGreaterThanOrEqual(2) + expect(await page.evaluate(() => window.maskCombination.times.at(-1))).toBeGreaterThan(20) + await page.evaluate(async () => { + window.art.fullscreenWeb = false + window.art.plugins.artplayerPluginDanmuku.hide() + window.art.plugins.artplayerPluginDanmuku.show() + await window.art.plugins.artplayerPluginDanmuku.load([{ text: 'After seek and visibility', time: window.art.currentTime + 1, mode: 1 }]) + }) + await expect.poll(() => page.evaluate(() => window.maskCombination.visible.map(row => row.text))).toContain('After seek and visibility') + const afterRow = await page.evaluate(() => window.maskCombination.visible.find(row => row.text === 'After seek and visibility')) + expect(afterRow.connected && afterRow.inLayer).toBe(true) + expect(afterRow.width).toBeGreaterThan(0) + expect(afterRow.height).toBeGreaterThan(0) + expect(afterRow.display).not.toBe('none') + const restored = await page.evaluate(() => window.maskSnapshot('restored')) + expect(restored.sameLayer).toBe(true) + expect(restored.mask).toBe(true) + expect(restored.width).toBe(initial.width) + expect(restored.mode).toBe('alpha') + await testInfo.attach('actual-combination-page', { body: await page.screenshot(), contentType: 'image/png' }) + const outputsBeforeLoad = await page.evaluate(() => window.maskCombination.times.length) + load = await observeDanmukuLoad(page, { label: 'Mask load', requireComplete: implementation === 'candidate' }) + load.modelOutputs = await page.evaluate(before => window.maskCombination.times.length - before, outputsBeforeLoad) + expect(load.modelOutputs).toBeGreaterThan(1) + await page.evaluate(() => window.art.destroy(false)) + expect(await page.evaluate(() => window.maskCombination.layer.style.maskImage)).toBe('none') + expect(unexpected).toEqual([]) + } + finally { + const state = await page.evaluate(() => ({ times: window.maskCombination.times, visible: window.maskCombination.visible, snapshots: window.maskCombination.snapshots, scheduled: window.maskCombination.scheduled, samples: window.maskCombination.samples, seeked: window.maskCombination.seeked, incompleteLoad: window.danmukuCombinationLoadResult })) + await testInfo.attach('actual-combination-evidence', { body: JSON.stringify({ core, implementation, mask: { file: artifact, sha256: hash(code) }, danmuku: { file: danmuku.file, sha256: hash(danmuku.code) }, unexpected, state, load, limitation: 'Actual model, native media, timestamp-delivered Danmuku and CSS web fullscreen. Bounded 20 rows/s after model readiness. No OS fullscreen, GPU completion or device coverage claim.' }, null, 2), contentType: 'application/json' }) + await page.evaluate(() => { + if (window.art && !window.art.isDestroy) + window.art.destroy() + }) } }) - try { - await expect.poll(() => page.evaluate(() => window.art.duration)).toBeGreaterThan(20) - await page.evaluate(() => { - window.art.currentTime = 5 - }) - await page.locator('#play').click() - await expect.poll(() => page.evaluate(() => window.maskCombination.times.length), { timeout: 30000 }).toBeGreaterThan(2) - // Keep the startup row and sampling history as diagnostics: native model - // initialization may block its narrow existing timestamp window. Exercise - // the ongoing combination after the real model has become operational. - await page.evaluate(async () => { - const time = window.art.currentTime + 1 - window.maskCombination.scheduled = time - await window.art.plugins.artplayerPluginDanmuku.load([{ text: 'Ready mask combination', time, mode: 1 }]) - }) - await expect.poll(() => page.evaluate(() => window.maskCombination.visible.map(row => row.text))).toContain('Ready mask combination') - const row = await page.evaluate(() => window.maskCombination.visible.find(row => row.text === 'Ready mask combination')) - expect(row.connected && row.inLayer).toBe(true) - expect(row.width).toBeGreaterThan(0) - expect(row.height).toBeGreaterThan(0) - expect(row.display).not.toBe('none') - const initial = await page.evaluate(() => window.maskSnapshot('playing')) - expect(initial.mask).toBe(true) - expect(initial.sameLayer).toBe(true) - await page.locator('#pause').click() - await expect.poll(() => page.evaluate(() => window.art.video.paused)).toBe(true) - // Wait native frames for the already-running SDK frame to finish. Compare - // its media timestamp, rather than forbidding one legitimate late encode. - const paused = await page.evaluate(async () => { - const time = window.art.currentTime - const beforeOutputs = window.maskCombination.times.length - await new Promise(resolve => setTimeout(resolve, 500)) - return { before: time, after: window.art.currentTime, extraOutputs: window.maskCombination.times.length - beforeOutputs, snapshot: window.maskSnapshot('paused') } - }) - expect(Math.abs(paused.after - paused.before)).toBeLessThan(0.01) - expect(paused.extraOutputs).toBeLessThanOrEqual(1) - await page.evaluate(async () => { - const seeked = new Promise(resolve => window.art.video.addEventListener('seeked', resolve, { once: true })) - window.art.currentTime = 20 - window.art.fullscreenWeb = true - await seeked - window.maskCombination.seeked = { time: window.art.currentTime, outputs: window.maskCombination.times.length } - }) - await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThanOrEqual(19.9) - const full = await page.evaluate(() => window.maskSnapshot('fullscreen-paused')) - expect(full.sameLayer).toBe(true) - expect(full.fullscreenWeb).toBe(true) - expect(full.width).toBeGreaterThan(initial.width) - await page.evaluate(() => window.art.play()) - await expect.poll(() => page.evaluate(() => window.maskCombination.times.length - window.maskCombination.seeked.outputs), { timeout: 30000 }).toBeGreaterThanOrEqual(2) - expect(await page.evaluate(() => window.maskCombination.times.at(-1))).toBeGreaterThan(20) - await page.evaluate(async () => { - window.art.fullscreenWeb = false - window.art.plugins.artplayerPluginDanmuku.hide() - window.art.plugins.artplayerPluginDanmuku.show() - await window.art.plugins.artplayerPluginDanmuku.load([{ text: 'After seek and visibility', time: window.art.currentTime + 1, mode: 1 }]) - }) - await expect.poll(() => page.evaluate(() => window.maskCombination.visible.map(row => row.text))).toContain('After seek and visibility') - const afterRow = await page.evaluate(() => window.maskCombination.visible.find(row => row.text === 'After seek and visibility')) - expect(afterRow.connected && afterRow.inLayer).toBe(true) - expect(afterRow.width).toBeGreaterThan(0) - expect(afterRow.height).toBeGreaterThan(0) - expect(afterRow.display).not.toBe('none') - const restored = await page.evaluate(() => window.maskSnapshot('restored')) - expect(restored.sameLayer).toBe(true) - expect(restored.mask).toBe(true) - expect(restored.width).toBe(initial.width) - expect(restored.mode).toBe('alpha') - await testInfo.attach('actual-combination-page', { body: await page.screenshot(), contentType: 'image/png' }) - await page.evaluate(() => window.art.destroy(false)) - expect(await page.evaluate(() => window.maskCombination.layer.style.maskImage)).toBe('none') - expect(unexpected).toEqual([]) - } - finally { - const state = await page.evaluate(() => ({ times: window.maskCombination.times, visible: window.maskCombination.visible, snapshots: window.maskCombination.snapshots, scheduled: window.maskCombination.scheduled, samples: window.maskCombination.samples, seeked: window.maskCombination.seeked })) - await testInfo.attach('actual-combination-evidence', { body: JSON.stringify({ core, mask: { file: artifact, sha256: hash(code) }, danmuku: { file: danmukuFile, sha256: hash(danmukuCode) }, unexpected, state, limitation: 'Actual model, native media, timestamp-delivered Danmuku and CSS web fullscreen. No OS fullscreen, GPU completion or device coverage claim.' }, null, 2), contentType: 'application/json' }) - await page.evaluate(() => { - if (window.art && !window.art.isDestroy) - window.art.destroy() - }) - } - }) + } } diff --git a/test/helpers/danmuku-combination-load.js b/test/helpers/danmuku-combination-load.js new file mode 100644 index 000000000..a9ed7aa86 --- /dev/null +++ b/test/helpers/danmuku-combination-load.js @@ -0,0 +1,60 @@ +import { expect } from '@playwright/test' + +// Observe real media/RAF delivery after a companion plugin has become operational. +export async function observeDanmukuLoad(page, { label, requireComplete, rate = 20, seconds = 6 }) { + let result + try { + await page.evaluate(async ({ label, rate, seconds }) => { + const art = window.art + const plugin = art.plugins.artplayerPluginDanmuku + const owner = plugin.config({ speed: 1, antiOverlap: false }) + const host = art.template.$player.ownerDocument.defaultView + const base = art.currentTime + const rows = Array.from({ length: rate * seconds }, (_, index) => ({ + id: `${label}-${index}`, + text: `${label} ${index}`, + time: base + 0.5 + index / rate, + mode: index % 3, + })) + const ids = new Set(rows.map(row => row.id)) + const state = window.danmukuCombinationLoad = { base, end: base + seconds + 2, rows, visible: [], frames: [], errors: [], startWall: host.performance.now() } + const visible = (row) => { + if (ids.has(row.id)) + state.visible.push({ id: row.id, time: art.currentTime, wall: host.performance.now() }) + } + const error = error => state.errors.push(String(error)) + let frame + const sample = () => { + state.frames.push({ time: art.currentTime, wall: host.performance.now() }) + frame = host.requestAnimationFrame(sample) + } + frame = host.requestAnimationFrame(sample) + art.on('artplayerPluginDanmuku:visible', visible) + art.on('artplayerPluginDanmuku:error', error) + window.finishDanmukuCombinationLoad = () => { + host.cancelAnimationFrame(frame) + art.off('artplayerPluginDanmuku:visible', visible) + art.off('artplayerPluginDanmuku:error', error) + const loaded = owner.queue.filter(row => ids.has(row.id)) + const result = { ...state, endWall: host.performance.now(), time: art.currentTime, loaded: loaded.length, waiting: loaded.filter(row => row.$state === 'wait').length, referenced: loaded.filter(row => row.$ref).length, nodes: art.template.$danmuku.children.length, pooled: owner.$refs.length, uniquePool: new Set(owner.$refs).size, decodedWidth: art.video.videoWidth } + window.danmukuCombinationLoadResult = result + return result + } + await plugin.load(rows) + }, { label, rate, seconds }) + await expect.poll(() => page.evaluate(() => window.art.currentTime >= window.danmukuCombinationLoad.end), { timeout: 16000 }).toBe(true) + } + finally { + result = await page.evaluate(() => window.finishDanmukuCombinationLoad?.()) + } + expect(result.decodedWidth).toBeGreaterThan(0) + expect(result.loaded).toBe(rate * seconds) + expect(result.errors).toEqual([]) + if (requireComplete) { + expect(result.visible.map(row => row.id).sort()).toEqual(result.rows.map(row => row.id).sort()) + expect(result.waiting).toBe(rate * seconds) + expect(result.referenced).toBe(0) + expect(result.uniquePool).toBe(result.pooled) + } + return { ...result, requireComplete, rate, seconds } +}