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 }
+}