diff --git a/package.json b/package.json
index b634d5eab..065d5cdba 100644
--- a/package.json
+++ b/package.json
@@ -51,7 +51,7 @@
"ci:build": "yarn build:types && yarn build all && yarn build:i18n && yarn build:ts && yarn build:docs && yarn test:imports",
"test:imports": "node --test test/esm.test.js test/i18n.test.js test/ssr.test.js",
"typecheck": "node scripts/typecheck.mjs",
- "test:unit": "node --test test/multiple-subtitles.test.js test/multiple-subtitles-vendor.test.js test/vtt-thumbnail-parser.test.js test/vtt-thumbnail-lifecycle.test.js test/vtt-thumbnail.test.js test/auto-thumbnail-frames.test.js test/auto-thumbnail-lifecycle.test.js test/auto-thumbnail.test.js test/thumbnail-emitter.test.js test/thumbnail-runtime.test.js test/thumbnail-vendor.test.js test/thumbnail-lifecycle.test.js test/thumbnail-input.test.js test/thumbnail.test.js test/iframe-navigation.test.js test/iframe-boundaries.test.js test/iframe-lifecycle.test.js test/iframe.test.js test/mediabunny.test.js test/mediabunny-shim.test.js test/mediabunny-coordination.test.js test/mediabunny-video.test.js test/mediabunny-audio.test.js test/mediabunny-hls.test.js test/mediabunny-entry.test.js test/mediabunny-capability.test.js test/mediabunny-load.test.js test/mediabunny-input.test.js test/dpip.test.js test/dpip-lifecycle.test.js test/canvas.test.js test/canvas-lifecycle.test.js test/ambilight.test.js test/ambilight-lifecycle.test.js test/ambilight-proxy.test.js test/vast.test.js test/vast-lifecycle.test.js test/ads.test.js test/ads-lifecycle.test.js test/playback.test.js test/dash-control.test.js test/dash-contract.test.js test/dash-lifecycle.test.js test/dash-events.test.js test/hls-control.test.js test/audio-track.test.js test/public-behavior.test.js test/helpers.test.js test/chapter.test.js test/utils.test.js test/resource-scope.test.js test/instance-lifecycle.test.js test/options.test.js test/media-hosts.test.js test/plugins.test.js test/source.test.js test/playback-properties.test.js test/media-events.test.js test/template-resources.test.js test/core-vendor.test.js test/component-resources.test.js test/setting-model.test.js test/setting-layout.test.js test/setting-resources.test.js test/subtitle.test.js test/display-native.test.js test/display-video-fullscreen.test.js test/display-pip.test.js test/display-mini.test.js test/display-sizing.test.js test/display-orientation.test.js test/hotkey.test.js test/listener-registry.test.js test/global-events.test.js test/pointer-events.test.js test/gesture.test.js test/event-scheduling.test.js test/notice.test.js test/fast-forward.test.js test/auto-playback.test.js test/builtin-layers.test.js test/prompt-components.test.js test/screenshot.test.js test/thumbnails.test.js test/progress.test.js test/environment.test.js test/storage.test.js test/facade-properties.test.js test/dom-boundaries.test.js test/initialization.test.js test/entry.test.js test/accessibility-button.test.js test/accessibility-focus.test.js test/accessibility-slider.test.js",
+ "test:unit": "node --test test/multiple-subtitles-failures.test.js test/multiple-subtitles.test.js test/multiple-subtitles-vendor.test.js test/vtt-thumbnail-parser.test.js test/vtt-thumbnail-lifecycle.test.js test/vtt-thumbnail.test.js test/auto-thumbnail-frames.test.js test/auto-thumbnail-lifecycle.test.js test/auto-thumbnail.test.js test/thumbnail-emitter.test.js test/thumbnail-runtime.test.js test/thumbnail-vendor.test.js test/thumbnail-lifecycle.test.js test/thumbnail-input.test.js test/thumbnail.test.js test/iframe-navigation.test.js test/iframe-boundaries.test.js test/iframe-lifecycle.test.js test/iframe.test.js test/mediabunny.test.js test/mediabunny-shim.test.js test/mediabunny-coordination.test.js test/mediabunny-video.test.js test/mediabunny-audio.test.js test/mediabunny-hls.test.js test/mediabunny-entry.test.js test/mediabunny-capability.test.js test/mediabunny-load.test.js test/mediabunny-input.test.js test/dpip.test.js test/dpip-lifecycle.test.js test/canvas.test.js test/canvas-lifecycle.test.js test/ambilight.test.js test/ambilight-lifecycle.test.js test/ambilight-proxy.test.js test/vast.test.js test/vast-lifecycle.test.js test/ads.test.js test/ads-lifecycle.test.js test/playback.test.js test/dash-control.test.js test/dash-contract.test.js test/dash-lifecycle.test.js test/dash-events.test.js test/hls-control.test.js test/audio-track.test.js test/public-behavior.test.js test/helpers.test.js test/chapter.test.js test/utils.test.js test/resource-scope.test.js test/instance-lifecycle.test.js test/options.test.js test/media-hosts.test.js test/plugins.test.js test/source.test.js test/playback-properties.test.js test/media-events.test.js test/template-resources.test.js test/core-vendor.test.js test/component-resources.test.js test/setting-model.test.js test/setting-layout.test.js test/setting-resources.test.js test/subtitle.test.js test/display-native.test.js test/display-video-fullscreen.test.js test/display-pip.test.js test/display-mini.test.js test/display-sizing.test.js test/display-orientation.test.js test/hotkey.test.js test/listener-registry.test.js test/global-events.test.js test/pointer-events.test.js test/gesture.test.js test/event-scheduling.test.js test/notice.test.js test/fast-forward.test.js test/auto-playback.test.js test/builtin-layers.test.js test/prompt-components.test.js test/screenshot.test.js test/thumbnails.test.js test/progress.test.js test/environment.test.js test/storage.test.js test/facade-properties.test.js test/dom-boundaries.test.js test/initialization.test.js test/entry.test.js test/accessibility-button.test.js test/accessibility-focus.test.js test/accessibility-slider.test.js",
"test:coverage": "node --test test/coverage.test.js && node scripts/coverage.mjs",
"test": "yarn test:node && yarn test:baseline",
"test:browser": "playwright test",
@@ -88,7 +88,7 @@
"test:auto-thumbnail": "node --test test/auto-thumbnail-frames.test.js test/auto-thumbnail-lifecycle.test.js test/auto-thumbnail.test.js refactor/scripts/auto-thumbnail-contract.test.mjs",
"test:vtt-thumbnail": "node --test test/vtt-thumbnail-parser.test.js test/vtt-thumbnail-lifecycle.test.js test/vtt-thumbnail.test.js refactor/scripts/vtt-thumbnail-contract.test.mjs refactor/scripts/vtt-thumbnail-types.test.mjs",
"test:vtt-thumbnail-types-package": "node refactor/scripts/vtt-thumbnail-package-types.mjs",
- "test:multiple-subtitles": "node --test test/multiple-subtitles.test.js test/multiple-subtitles-vendor.test.js refactor/scripts/multiple-subtitles-contract.test.mjs"
+ "test:multiple-subtitles": "node --test test/multiple-subtitles-failures.test.js test/multiple-subtitles.test.js test/multiple-subtitles-vendor.test.js refactor/scripts/multiple-subtitles-contract.test.mjs"
},
"browserslist": "last 1 Chrome version",
"devDependencies": {
diff --git a/packages/artplayer-plugin-multiple-subtitles/ARCHITECTURE.md b/packages/artplayer-plugin-multiple-subtitles/ARCHITECTURE.md
index 48d72e881..bc526a9be 100644
--- a/packages/artplayer-plugin-multiple-subtitles/ARCHITECTURE.md
+++ b/packages/artplayer-plugin-multiple-subtitles/ARCHITECTURE.md
@@ -31,6 +31,13 @@ sets the live subtitle option's escape to false and calls subtitle.init with the
configuration plus URL/type/onVttLoad overrides. The latest URL and pending requests have
no destroy owner yet. These are explicit future fixes, not behavior to silently call safe.
+The failure baseline now reproduces late fetch/body installation, retained and newly allocated
+URLs after destroy, ignored HTTP failures, orphaned URLs after init failures, and revoking the
+old URL before a new allocation can fail. Async init rejection is currently unobserved by the
+plugin. Task 03 must handle these internal failures while retaining the void selection methods.
+Keep the current parser's best-effort behavior separate from these resource fixes: invalid-header
+diagnostics can coexist with usable cues, and metadata is intentionally read after download.
+
## Vendor boundary and validation
The comparison revision is w3c/webvtt.js `380cfcce34ba8b472d3a31474874eb72a0e5f460`.
@@ -43,6 +50,7 @@ Use the pinned Node and Yarn 1.22.22:
```sh
yarn test:multiple-subtitles
+yarn test:browser test/browser/multiple-subtitles-history.spec.js
yarn build artplayer-plugin-multiple-subtitles
```
@@ -50,6 +58,10 @@ Historical tests read verified npm bytes and frozen Git inputs. For current norm
set ARTPLAYER_MULTIPLE_SUBTITLES_CANDIDATE=1; optionally set
ARTPLAYER_MULTIPLE_SUBTITLES_ARTIFACT to an actual main/legacy file, then run
`node --test test/multiple-subtitles.test.js`. These tests use controlled subtitle hosts;
-they do not prove native rendering, decoder coverage or the online editor. Tasks 02 and
-05/06 own error/lifecycle reproduction, real core/device combinations and demo acceptance.
+they do not prove native rendering or the online editor. The separate historical browser suite
+uses actual 1.2.0 main with published/candidate cores: SRT display and selection, pending native
+fetch after destroy, and native Blob readability/late reset allocations. It covers Chromium,
+Firefox and Windows WebKit; it is not all historical cores, ASS display or physical Safari.
+The failure unit suite uses real current core converters and TextDecoder for SRT/ASS/encodings.
+Tasks 05/06 still own complete core/device combinations and demo acceptance.
See `../../refactor/baselines/multiple-subtitles-contract.md` for exact historical differences.
diff --git a/refactor/baselines/multiple-subtitles-failures.json b/refactor/baselines/multiple-subtitles-failures.json
new file mode 100644
index 000000000..4ab1617e3
--- /dev/null
+++ b/refactor/baselines/multiple-subtitles-failures.json
@@ -0,0 +1,4808 @@
+{
+ "schemaVersion": 1,
+ "task": "PKG-MULTI-SUB-02",
+ "status": "done",
+ "parentCommit": "5a0d94cb89aa1843b64072db838e212c9d043c30",
+ "historicalInputs": {
+ "manifest": "refactor/baselines/multiple-subtitles-release.json",
+ "sha256": "32cb20a06494bba80c71ea9eb3c4fe73b92e1c7231bbc4030b70c23fea722c87",
+ "implementations": 9,
+ "casesPerImplementation": 18
+ },
+ "checks": [
+ {
+ "command": "yarn test:multiple-subtitles",
+ "file": "refactor/.cache/multiple-subtitles02-package.log",
+ "sha256": "9dd3b020fa67975d8fb6cae74c989819905a6b5c9892594bc8ed63b0a376c65b",
+ "tests": 215,
+ "pass": 215,
+ "fail": 0,
+ "composition": "162 historical failure/boundary + 45 normal historical + 2 vendor + 6 contract tests"
+ },
+ {
+ "command": "node node_modules/eslint/bin/eslint.js test/helpers/multiple-subtitles.js test/multiple-subtitles-failures.test.js test/browser/multiple-subtitles-history.spec.js",
+ "file": "refactor/.cache/multiple-subtitles02-lint.log",
+ "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "command": "yarn ci:check",
+ "file": "refactor/.cache/multiple-subtitles02-ci.log",
+ "sha256": "3f074e47506f08ba18bb1e15d70697ba4e6e8f43c8928f1da01c14fa7c12cce9",
+ "tests": {
+ "unit": 1937,
+ "engineering": 14,
+ "baseline": 334,
+ "total": 2285
+ },
+ "strictProductionTypeScriptFiles": 346,
+ "warnings": [
+ "Existing generated docs/assets/ts/artplayer.d.ts unused ts/no-namespace suppression.",
+ "Yarn Classic DEP0169 url.parse deprecation."
+ ],
+ "registration": "The failure suite is explicitly included in test:unit and test:multiple-subtitles."
+ }
+ ],
+ "browser": {
+ "command": "yarn test:browser test/browser/multiple-subtitles-history.spec.js",
+ "file": "refactor/.cache/multiple-subtitles02-browser-final.json",
+ "sha256": "23f78b91a962417fe86e1b169412c1c7fa3ff60b944d146dd2cc6a095e0cfcfb",
+ "resultsDirectory": "refactor/.cache/multiple-subtitles02-browser-final-results",
+ "stats": {
+ "startTime": "2026-09-13T02:23:30.288Z",
+ "duration": 17898.586000000003,
+ "expected": 18,
+ "skipped": 0,
+ "unexpected": 0,
+ "flaky": 0
+ },
+ "cases": [
+ {
+ "title": "Multiple subtitles historical published core: real SRT captions select, clear and reset",
+ "project": "chromium",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "published",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": "Native SRT conversion, track cue loading, real playback and DOM text selection/reset passed; this does not verify all CSS/device combinations.",
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/10a3404b-4bfe-4baf-98c7-fdf7831c00d6",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/3184d944-db50-43e1-8ee0-aa77f23778ba",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/08b8e01a-b82f-460c-bcbd-04464777de22",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/f0e33b62-1be9-4e57-88ee-60a3ecb5fd16",
+ "destroyed": false
+ }
+ ],
+ "revoked": [
+ "",
+ "http://127.0.0.1:8084/test/player.html?core=published",
+ "blob:http://127.0.0.1:8084/10a3404b-4bfe-4baf-98c7-fdf7831c00d6",
+ "blob:http://127.0.0.1:8084/92a22ce2-67a1-462b-bb86-17b56aa32e7a",
+ "blob:http://127.0.0.1:8084/3184d944-db50-43e1-8ee0-aa77f23778ba",
+ "blob:http://127.0.0.1:8084/ac116f77-5942-429a-b431-82b5cdf87511",
+ "blob:http://127.0.0.1:8084/08b8e01a-b82f-460c-bcbd-04464777de22",
+ "blob:http://127.0.0.1:8084/f9190091-df1f-499d-94cc-b3869607482e"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "153.0.8010.12",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=published",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.8010.12 Safari/537.36",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "video:playing",
+ "video:pause",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": [
+ {
+ "url": "http://127.0.0.1:8084/test/pattern.mp4",
+ "resourceType": "media",
+ "failure": {
+ "errorText": "net::ERR_ABORTED"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "title": "Multiple subtitles historical published core: pending native fetch survives destroy and creates a retained Blob URL",
+ "project": "chromium",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "published",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "destroyedAtInit": true,
+ "retained": true,
+ "text": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-held\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/76914bad-b430-4150-b3df-4e2721f8e318",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ "",
+ "http://127.0.0.1:8084/test/player.html?core=published"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": true
+ }
+ },
+ "browser-evidence": {
+ "browser": "153.0.8010.12",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=published",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.8010.12 Safari/537.36",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": [
+ {
+ "url": "http://127.0.0.1:8084/test/pattern.mp4",
+ "resourceType": "media",
+ "failure": {
+ "errorText": "net::ERR_ABORTED"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "title": "Multiple subtitles historical published core: destroy retains the plugin URL and reset allocates another one",
+ "project": "chromium",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "published",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "beforeReset": true,
+ "retainedText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n",
+ "returnsUndefined": true,
+ "lateAfterDestroy": true,
+ "newURL": true,
+ "priorRevokedByReset": true,
+ "lateText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/78e9ba32-df14-4bcb-83cc-04bf4ecca001",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/b7db86c9-370d-42f1-add4-9caf933e9808",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ "",
+ "http://127.0.0.1:8084/test/player.html?core=published",
+ "blob:http://127.0.0.1:8084/78e9ba32-df14-4bcb-83cc-04bf4ecca001",
+ "blob:http://127.0.0.1:8084/f0108f41-26f2-46be-8b78-3ba454b4e15d"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "153.0.8010.12",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=published",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.8010.12 Safari/537.36",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": [
+ {
+ "url": "http://127.0.0.1:8084/test/pattern.mp4",
+ "resourceType": "media",
+ "failure": {
+ "errorText": "net::ERR_ABORTED"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "title": "Multiple subtitles historical candidate core: real SRT captions select, clear and reset",
+ "project": "chromium",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "candidate",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": "Native SRT conversion, track cue loading, real playback and DOM text selection/reset passed; this does not verify all CSS/device combinations.",
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/6f453e79-c7c8-4503-a81a-7ac433d1cf4d",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/3abb14c9-3d8c-47d2-abbc-2a0a5ebe30b1",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/e653289b-165b-447d-88a9-faa04914607b",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/b2614ba6-2010-4a26-9f0e-92c0d61333c9",
+ "destroyed": false
+ }
+ ],
+ "revoked": [
+ "",
+ "blob:http://127.0.0.1:8084/6f453e79-c7c8-4503-a81a-7ac433d1cf4d",
+ "blob:http://127.0.0.1:8084/91ecea1f-f5ea-41ec-a75a-7487c3568dc1",
+ "blob:http://127.0.0.1:8084/3abb14c9-3d8c-47d2-abbc-2a0a5ebe30b1",
+ "blob:http://127.0.0.1:8084/75dd5fee-6769-4bb9-bdf2-170b175626e1",
+ "blob:http://127.0.0.1:8084/e653289b-165b-447d-88a9-faa04914607b",
+ "blob:http://127.0.0.1:8084/ed8407ac-b7db-495f-9ffa-5b5b67626383",
+ "blob:http://127.0.0.1:8084/58153be4-9f21-44d5-bbfe-8675e758f6d2"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "153.0.8010.12",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=candidate",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.8010.12 Safari/537.36",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "video:playing",
+ "video:pause",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": [
+ {
+ "url": "http://127.0.0.1:8084/test/pattern.mp4",
+ "resourceType": "media",
+ "failure": {
+ "errorText": "net::ERR_ABORTED"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "title": "Multiple subtitles historical candidate core: pending native fetch survives destroy and creates a retained Blob URL",
+ "project": "chromium",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "candidate",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "destroyedAtInit": true,
+ "retained": true,
+ "text": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-held\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/c7747e3d-c99d-43ab-9210-9b5b063a2943",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ ""
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": true
+ }
+ },
+ "browser-evidence": {
+ "browser": "153.0.8010.12",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=candidate",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.8010.12 Safari/537.36",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": [
+ {
+ "url": "http://127.0.0.1:8084/test/pattern.mp4",
+ "resourceType": "media",
+ "failure": {
+ "errorText": "net::ERR_ABORTED"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "title": "Multiple subtitles historical candidate core: destroy retains the plugin URL and reset allocates another one",
+ "project": "chromium",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "candidate",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "beforeReset": true,
+ "retainedText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n",
+ "returnsUndefined": true,
+ "lateAfterDestroy": true,
+ "newURL": true,
+ "priorRevokedByReset": true,
+ "lateText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/2169d160-df58-43ea-a576-ab1da6ccada6",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/65e9f1c6-2a70-4132-9699-5cfde17203ea",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ "",
+ "blob:http://127.0.0.1:8084/c8a064e8-923b-4908-96ce-9c43ed220a92",
+ "blob:http://127.0.0.1:8084/2169d160-df58-43ea-a576-ab1da6ccada6"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "153.0.8010.12",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=candidate",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.8010.12 Safari/537.36",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": [
+ {
+ "url": "http://127.0.0.1:8084/test/pattern.mp4",
+ "resourceType": "media",
+ "failure": {
+ "errorText": "net::ERR_ABORTED"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "title": "Multiple subtitles historical published core: real SRT captions select, clear and reset",
+ "project": "firefox",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "published",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": "Native SRT conversion, track cue loading, real playback and DOM text selection/reset passed; this does not verify all CSS/device combinations.",
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/7f2e1ff1-2316-4106-95f3-ba2fd4f523ef",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/0480276b-5778-4f61-992d-b809f425018f",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/00c95e5d-5b7d-47ef-8579-cf310e017536",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/9a4f4f69-666d-4f65-b378-02c4b7e8437e",
+ "destroyed": false
+ }
+ ],
+ "revoked": [
+ "",
+ "http://127.0.0.1:8084/test/player.html?core=published",
+ "blob:http://127.0.0.1:8084/7f2e1ff1-2316-4106-95f3-ba2fd4f523ef",
+ "blob:http://127.0.0.1:8084/4c79c07d-86ce-4118-a531-9137c34d413f",
+ "blob:http://127.0.0.1:8084/0480276b-5778-4f61-992d-b809f425018f",
+ "blob:http://127.0.0.1:8084/be7922ed-d760-41e4-9dba-91f86e0ef2e7",
+ "blob:http://127.0.0.1:8084/00c95e5d-5b7d-47ef-8579-cf310e017536",
+ "blob:http://127.0.0.1:8084/a5a407ea-22f3-45f2-8030-e8962b5ee53e"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "155.0",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=published",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:155.0) Gecko/20100101 Firefox/155.0",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "video:playing",
+ "video:pause",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": []
+ }
+ },
+ {
+ "title": "Multiple subtitles historical published core: pending native fetch survives destroy and creates a retained Blob URL",
+ "project": "firefox",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "published",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "destroyedAtInit": true,
+ "retained": true,
+ "text": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-held\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/5845e445-9529-4398-866c-432883f2e009",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ "",
+ "http://127.0.0.1:8084/test/player.html?core=published"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": true
+ }
+ },
+ "browser-evidence": {
+ "browser": "155.0",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=published",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:155.0) Gecko/20100101 Firefox/155.0",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": []
+ }
+ },
+ {
+ "title": "Multiple subtitles historical published core: destroy retains the plugin URL and reset allocates another one",
+ "project": "firefox",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "published",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "beforeReset": true,
+ "retainedText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n",
+ "returnsUndefined": true,
+ "lateAfterDestroy": true,
+ "newURL": true,
+ "priorRevokedByReset": true,
+ "lateText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/520e5ae6-112d-4841-bd5c-f915eaac421f",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/6e61a760-7fee-4c38-ae7a-47a2a8365a19",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ "",
+ "http://127.0.0.1:8084/test/player.html?core=published",
+ "blob:http://127.0.0.1:8084/520e5ae6-112d-4841-bd5c-f915eaac421f",
+ "blob:http://127.0.0.1:8084/d000eeea-5bda-43a5-a2e5-91aa24423087"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "155.0",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=published",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:155.0) Gecko/20100101 Firefox/155.0",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": []
+ }
+ },
+ {
+ "title": "Multiple subtitles historical candidate core: real SRT captions select, clear and reset",
+ "project": "firefox",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "candidate",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": "Native SRT conversion, track cue loading, real playback and DOM text selection/reset passed; this does not verify all CSS/device combinations.",
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/5825e24e-2abf-4ab2-a0d1-cd0248f17e35",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/1eae2b46-4113-42b7-99a4-8bd43c1ef38f",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/5c49ed0e-78fc-4646-b28e-73f293746e20",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/8723eaa1-7855-4e08-b99c-3e5011488c7d",
+ "destroyed": false
+ }
+ ],
+ "revoked": [
+ "",
+ "blob:http://127.0.0.1:8084/5825e24e-2abf-4ab2-a0d1-cd0248f17e35",
+ "blob:http://127.0.0.1:8084/1280973b-68a1-4717-a158-b20374176ad4",
+ "blob:http://127.0.0.1:8084/1eae2b46-4113-42b7-99a4-8bd43c1ef38f",
+ "blob:http://127.0.0.1:8084/0e8aa120-dd25-4c50-86d6-282594019e26",
+ "blob:http://127.0.0.1:8084/5c49ed0e-78fc-4646-b28e-73f293746e20",
+ "blob:http://127.0.0.1:8084/712ff1f1-8ebe-4f79-a0f2-e2343d59649c",
+ "blob:http://127.0.0.1:8084/e00b094c-4bc1-49ba-9f73-f03ff767f6a9"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "155.0",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=candidate",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:155.0) Gecko/20100101 Firefox/155.0",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "video:playing",
+ "video:pause",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": []
+ }
+ },
+ {
+ "title": "Multiple subtitles historical candidate core: pending native fetch survives destroy and creates a retained Blob URL",
+ "project": "firefox",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "candidate",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "destroyedAtInit": true,
+ "retained": true,
+ "text": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-held\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/0844a9a0-b3f7-4c59-97e6-2cfe51c24c86",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ ""
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": true
+ }
+ },
+ "browser-evidence": {
+ "browser": "155.0",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=candidate",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:155.0) Gecko/20100101 Firefox/155.0",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": []
+ }
+ },
+ {
+ "title": "Multiple subtitles historical candidate core: destroy retains the plugin URL and reset allocates another one",
+ "project": "firefox",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "candidate",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "beforeReset": true,
+ "retainedText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n",
+ "returnsUndefined": true,
+ "lateAfterDestroy": true,
+ "newURL": true,
+ "priorRevokedByReset": true,
+ "lateText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/09c06758-6113-4a8a-a183-03245e10cc62",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/4efe0b29-9a8b-424f-8c76-9aed58ad9197",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ "",
+ "blob:http://127.0.0.1:8084/5addcc06-0388-45b0-94ea-e4c29eac0046",
+ "blob:http://127.0.0.1:8084/09c06758-6113-4a8a-a183-03245e10cc62"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "155.0",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=candidate",
+ "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:155.0) Gecko/20100101 Firefox/155.0",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": []
+ }
+ },
+ {
+ "title": "Multiple subtitles historical published core: real SRT captions select, clear and reset",
+ "project": "webkit",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "published",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": "Native SRT conversion, track cue loading, real playback and DOM text selection/reset passed; this does not verify all CSS/device combinations.",
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/9620b450-6429-403d-9a83-deeb548a91b0",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/2a52827f-f5f1-4f3a-9c84-6db585968d78",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/5bf2358e-e996-4bad-a917-c754d11cd4d8",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/e827a9ed-5826-43e4-add0-c2d2cb38dde2",
+ "destroyed": false
+ }
+ ],
+ "revoked": [
+ "",
+ "http://127.0.0.1:8084/test/player.html?core=published",
+ "blob:http://127.0.0.1:8084/9620b450-6429-403d-9a83-deeb548a91b0",
+ "blob:http://127.0.0.1:8084/9edf1af4-6280-4866-a603-022a5159b735",
+ "blob:http://127.0.0.1:8084/2a52827f-f5f1-4f3a-9c84-6db585968d78",
+ "blob:http://127.0.0.1:8084/0701982a-b161-49a6-8b49-d19fb9969d40",
+ "blob:http://127.0.0.1:8084/5bf2358e-e996-4bad-a917-c754d11cd4d8",
+ "blob:http://127.0.0.1:8084/d883543f-017c-4477-b982-a6e38ddac2ac"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "26.6",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=published",
+ "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Safari/605.1.15",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "video:playing",
+ "video:pause",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [
+ "Failed to load resource"
+ ],
+ "failedRequests": [
+ {
+ "url": "blob:http://127.0.0.1:8084/d883543f-017c-4477-b982-a6e38ddac2ac",
+ "resourceType": "other",
+ "failure": null
+ }
+ ]
+ }
+ },
+ {
+ "title": "Multiple subtitles historical published core: pending native fetch survives destroy and creates a retained Blob URL",
+ "project": "webkit",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "published",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "destroyedAtInit": true,
+ "retained": true,
+ "text": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-held\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/6012007a-4ad6-41f8-b70b-1c5b4c2c7b78",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ "",
+ "http://127.0.0.1:8084/test/player.html?core=published"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": true
+ }
+ },
+ "browser-evidence": {
+ "browser": "26.6",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=published",
+ "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Safari/605.1.15",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": []
+ }
+ },
+ {
+ "title": "Multiple subtitles historical published core: destroy retains the plugin URL and reset allocates another one",
+ "project": "webkit",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "published",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "beforeReset": true,
+ "retainedText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n",
+ "returnsUndefined": true,
+ "lateAfterDestroy": true,
+ "newURL": true,
+ "priorRevokedByReset": true,
+ "lateText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/6035d512-32ed-4836-8616-b3d716d7afe3",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/3eb7e9ea-d195-4417-ae7e-fe76cb2ac10e",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ "",
+ "http://127.0.0.1:8084/test/player.html?core=published",
+ "blob:http://127.0.0.1:8084/6035d512-32ed-4836-8616-b3d716d7afe3",
+ "blob:http://127.0.0.1:8084/786b75c6-7711-482f-802f-6ac341cd0b49"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "26.6",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=published",
+ "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Safari/605.1.15",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": []
+ }
+ },
+ {
+ "title": "Multiple subtitles historical candidate core: real SRT captions select, clear and reset",
+ "project": "webkit",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "candidate",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": "Native SRT conversion, track cue loading, real playback and DOM text selection/reset passed; this does not verify all CSS/device combinations.",
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/6e9a61cc-cb92-4de5-81c2-064839deb34c",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/8e6eec54-5202-4838-aac4-d480b274c305",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/444c7228-abbc-483a-929b-6b49b633835e",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/5afa9c40-b4dd-4f0d-a439-1a1decd9e55c",
+ "destroyed": false
+ }
+ ],
+ "revoked": [
+ "",
+ "blob:http://127.0.0.1:8084/6e9a61cc-cb92-4de5-81c2-064839deb34c",
+ "blob:http://127.0.0.1:8084/9d60685e-252e-41a4-89e6-1344b16d6f0e",
+ "blob:http://127.0.0.1:8084/8e6eec54-5202-4838-aac4-d480b274c305",
+ "blob:http://127.0.0.1:8084/76e90723-19f6-449a-bcd2-7174b85845bb",
+ "blob:http://127.0.0.1:8084/444c7228-abbc-483a-929b-6b49b633835e",
+ "blob:http://127.0.0.1:8084/d98f31cd-5b6a-496b-8db3-5263cf54e110",
+ "blob:http://127.0.0.1:8084/2754aa42-9d30-4615-8c7b-c4649c52374c"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "26.6",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=candidate",
+ "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Safari/605.1.15",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "video:playing",
+ "video:pause",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": []
+ }
+ },
+ {
+ "title": "Multiple subtitles historical candidate core: pending native fetch survives destroy and creates a retained Blob URL",
+ "project": "webkit",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "candidate",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "destroyedAtInit": true,
+ "retained": true,
+ "text": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-held\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/7ef98979-a6d8-4ef5-8183-3a4edd09aeef",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ ""
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": true
+ }
+ },
+ "browser-evidence": {
+ "browser": "26.6",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=candidate",
+ "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Safari/605.1.15",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": []
+ }
+ },
+ {
+ "title": "Multiple subtitles historical candidate core: destroy retains the plugin URL and reset allocates another one",
+ "project": "webkit",
+ "status": "passed",
+ "multiple-subtitles-history": {
+ "core": "candidate",
+ "implementation": {
+ "name": "published-1.2.0-main",
+ "sha256": "c1cb0b511da88347165cc855185de9450a44835bb34bb802281ccdb854ef603c"
+ },
+ "observation": {
+ "beforeReset": true,
+ "retainedText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n",
+ "returnsUndefined": true,
+ "lateAfterDestroy": true,
+ "newURL": true,
+ "priorRevokedByReset": true,
+ "lateText": "WEBVTT\n\n\n00:00.000 --> 00:08.000\n<div class=\"art-subtitle-ready\">Cached caption</div>\n\n"
+ },
+ "probe": {
+ "initialized": [
+ {
+ "url": "blob:http://127.0.0.1:8084/d0117182-b0f8-47ec-8cb1-b93e4c32e232",
+ "destroyed": false
+ },
+ {
+ "url": "blob:http://127.0.0.1:8084/4c6cd456-784c-42d9-83c3-ec837f86495e",
+ "destroyed": true
+ }
+ ],
+ "revoked": [
+ "",
+ "blob:http://127.0.0.1:8084/348be2b6-7049-4321-9937-9f6534e414fd",
+ "blob:http://127.0.0.1:8084/d0117182-b0f8-47ec-8cb1-b93e4c32e232"
+ ],
+ "errors": [],
+ "signal": false,
+ "settled": false
+ }
+ },
+ "browser-evidence": {
+ "browser": "26.6",
+ "platform": "win32",
+ "manifest": {
+ "kind": "artplayer-browser-test",
+ "resources": {
+ "/candidate/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073
+ },
+ "/compiled/artplayer.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/uncompiled/artplayer/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer\\src\\index.ts"
+ },
+ "sha256": "e8945bc9d3ff0a6e247772a662f874df13875f7dbeb949968943b9589f6e2946",
+ "bytes": 378073,
+ "aliasOf": "/candidate/artplayer.js"
+ },
+ "/candidate/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529
+ },
+ "/compiled/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/uncompiled/artplayer-plugin-chapter/index.js": {
+ "source": {
+ "kind": "workspace-build",
+ "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts"
+ },
+ "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a",
+ "bytes": 8529,
+ "aliasOf": "/candidate/artplayer-plugin-chapter.js"
+ },
+ "/published/artplayer.js": {
+ "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
+ },
+ "/published/artplayer-plugin-chapter.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "1.1.0",
+ "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==",
+ "member": "package/dist/artplayer-plugin-chapter.js"
+ },
+ "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0",
+ "bytes": 4973
+ },
+ "/test/pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.mp4"
+ },
+ "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233",
+ "bytes": 251538
+ },
+ "/test/pattern.webm": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/pattern.webm"
+ },
+ "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f",
+ "bytes": 162073
+ },
+ "/published-4.5.5/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.5",
+ "integrity": "sha512-HeAKbe3od9ZgFQVSBCg5FlixJsefDEBC8txVG19yZgvzlcJuiurxPlasap+GHuex/ftG+jmSXnTRtuNrTki2Kw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "3467e626ca29d2f7884e75eb75b8b90de74a25761ffa2e272576c9b5a98fa0a4",
+ "bytes": 153582
+ },
+ "/published-5.1.7/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "5.1.7",
+ "integrity": "sha512-N/QdNlTwsIHUsWOHMPj0pq97v3qmgXZHfhy1q7I+8YN3/XakJiJJyVJgGaeBjU+y/fUIrzBhwpBaX+NFwK9/qw==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "484ccc3f22446ec6fd0dd8b8a5602c740b601d55097a1ae043262d92aab35357",
+ "bytes": 155940
+ },
+ "/published-4.5.9/artplayer.js": {
+ "source": {
+ "kind": "npm-release",
+ "version": "4.5.9",
+ "integrity": "sha512-x5JzGdXkw4GFdztvPkVnm8TOWrGDcvGKKMPb9wuP6UfyftlLM3UQctmmalfAMnQSxugJwq2Kb9ix9OG2SgbJJA==",
+ "member": "package/dist/artplayer.js"
+ },
+ "sha256": "09a9f09e3a64a02ca7c27af710d7254f886f0bfb09fd54bf3a728ce863e5a497",
+ "bytes": 156408
+ },
+ "/test/audio-tone.m4a": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/audio-tone.m4a"
+ },
+ "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56",
+ "bytes": 132436
+ },
+ "/test/thumbnail-pattern.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/thumbnail-pattern.mp4"
+ },
+ "sha256": "4c977be04d97f6ac1342ac4959b8e61678f390d88a088430e4d0200137a03d1c",
+ "bytes": 752916
+ },
+ "/test/auto-thumbnail-timeline.mp4": {
+ "source": {
+ "kind": "generated-media",
+ "file": "test/browser/media/auto-thumbnail-timeline.mp4"
+ },
+ "sha256": "10370156cffada462d3ea00aae0caadd62752369cd6538cc55248b3ddd7bf994",
+ "bytes": 8602
+ },
+ "/test/declaration-cues.vtt": {
+ "source": {
+ "kind": "test-subtitles",
+ "file": "test/browser/media/declaration-cues.vtt"
+ },
+ "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704",
+ "bytes": 54
+ },
+ "/test/thumbnail-grid.svg": {
+ "source": {
+ "kind": "test-thumbnail-grid",
+ "file": "test/browser/media/thumbnail-grid.svg"
+ },
+ "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6",
+ "bytes": 14969
+ },
+ "/test/legacy-safe-area.js": {
+ "source": {
+ "kind": "frozen-own-source",
+ "file": "test/helpers/legacy-safe-area.js",
+ "commit": "ccf77c4e"
+ },
+ "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a",
+ "bytes": 795
+ },
+ "/test/iframe-boundary-child.html": {
+ "source": {
+ "kind": "iframe-fixture",
+ "file": "test/browser/iframe-boundary-child.html"
+ },
+ "sha256": "4721de185f606de7d576e71395127257e476765455e2a947ded79df4ebed901a",
+ "bytes": 1451
+ },
+ "/assets/sample/video.mp4": {
+ "source": {
+ "kind": "docs-media",
+ "file": "docs/assets/sample/video.mp4"
+ },
+ "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980",
+ "bytes": 5818706
+ },
+ "/test/performance.js": {
+ "source": {
+ "kind": "adapted-baseline-fixture",
+ "file": "refactor/fixtures/performance.js"
+ },
+ "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500",
+ "bytes": 8994
+ }
+ }
+ },
+ "state": {
+ "url": "http://127.0.0.1:8084/test/player.html?core=candidate",
+ "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.6 Safari/605.1.15",
+ "events": [
+ "video:loadedmetadata",
+ "ready",
+ "destroy"
+ ],
+ "media": {
+ "source": "http://127.0.0.1:8084/test/pattern.mp4",
+ "width": 0,
+ "height": 0,
+ "duration": null,
+ "currentTime": 0
+ }
+ },
+ "errors": [],
+ "consoleErrors": [],
+ "failedRequests": []
+ }
+ }
+ ]
+ },
+ "publicSourceAndTypes": {
+ "packages/artplayer-plugin-multiple-subtitles/src/index.js": {
+ "worktreeSha256": "02d7019e92bed7817d815f04df80605ae0bd94f03e2b8c52022b5f622ba2e2ba",
+ "gitSha256": "02d7019e92bed7817d815f04df80605ae0bd94f03e2b8c52022b5f622ba2e2ba",
+ "comparison": "Equal after CRLF-to-LF normalization; Git reports no change."
+ },
+ "packages/artplayer-plugin-multiple-subtitles/src/parser.js": {
+ "worktreeSha256": "ba582074d57fa2d72880e6e4253fe14646787916b2b68e2a1e748e685cf96ab1",
+ "gitSha256": "ba582074d57fa2d72880e6e4253fe14646787916b2b68e2a1e748e685cf96ab1",
+ "comparison": "Equal after CRLF-to-LF normalization; Git reports no change."
+ },
+ "packages/artplayer-plugin-multiple-subtitles/types/artplayer-plugin-multiple-subtitles.d.ts": {
+ "worktreeSha256": "ab5dae1d0bdfcf2515cb842b1d465edf21dd195fe2fc5b0cfe351a8c06eb965c",
+ "gitSha256": "6fc3107127b93b5107d679183dadd5740d4b7d5ea2cf2e51d877d576957e1386",
+ "comparison": "Equal after CRLF-to-LF normalization; Git reports no change."
+ }
+ },
+ "testInputs": {
+ "test/helpers/multiple-subtitles.js": "456c01521045a1b53ff09a4f1ce5aa02b43e9eb41b525785945103fd41314244",
+ "test/multiple-subtitles-failures.test.js": "12fe9445490e62df469cbaad20bc053ecc0faa42d9f9fad69f83a0029f18e132",
+ "test/browser/multiple-subtitles-history.spec.js": "4ada8873e5b302a017d2f21b27593a28288dbf700277478d03edf047fe1fcdaf"
+ },
+ "remaining": "This reproduces historical outcomes, not candidate fixes. Task 03 owns request/URL/host lifecycle fixes; task 04 owns TS and public declarations. Full supported-core combinations, ASS/encoding native display, physical Safari/mobile, style and editor consumers remain in 05/06. No production source, types or artifacts changed."
+}
diff --git a/refactor/changes/2026-09-13-PKG-MULTI-SUB-02-failures.md b/refactor/changes/2026-09-13-PKG-MULTI-SUB-02-failures.md
new file mode 100644
index 000000000..2789e3c9b
--- /dev/null
+++ b/refactor/changes/2026-09-13-PKG-MULTI-SUB-02-failures.md
@@ -0,0 +1,62 @@
+# PKG-MULTI-SUB-02 错误与资源生命周期复现
+
+在 01 的 9 份冻结实现上增加 18 类用例,共 162 项。测试读取真实 npm main/legacy
+及固定 Git 源码/产物,预期内容明确描述旧行为,不将这些通过结果解释成候选已修复。
+测试辅助宿主增加原始字节响应、独立 fetch/body 挂起、错误和真实活动 URL 计数;
+既有正常契约继续检查,未改生产源码、公开声明、parser 或构建产物。
+
+## 已复现的正常与边界行为
+
+- 使用当前核心的真实 getExt/srtToVtt/assToVtt 及原生 TextDecoder,验证 SRT/ASS、URL
+ query、大写扩展名、Windows-1252 和 UTF-16LE。不是将 converter stub 当作解码验收。
+- 请求并行发出,返回先后不会改变轨序;名称等元数据在下载后读取,restart 不重复下载。
+- 同名轨选择第一个匹配;未知名称抛 TypeError,保留原活动 URL,随后 reset 可以恢复。
+- 各轨内部排序,但 1.1.0 起合并后不再全局排序;重叠 cue 保留各自时间。
+- 1.0.0 遇到较短后轨会抛异常,较长后轨的尾 cue 会丢失;后续版本连接所有 cue。
+- 空轨/未知格式产生空 VTT;parser 的诊断没有向外传递,坏 header 后仍可保留可用 cue。
+ 这是旧 parser 的容错观察,不能未经评估就统一改成严格拒绝。
+
+## 已复现的问题
+
+| 问题 | 旧行为 | 03 应处理的边界 |
+| --- | --- | --- |
+| 请求失败 | 原异常拒绝,但其他请求继续读取 body,没有共享取消 | 保留异常身份并回收同一注册的挂起请求 |
+| HTTP 状态 | 404 配合可解析 body 仍安装字幕 | 显式处理原生 HTTP 失败,避免错误页面成为字幕 |
+| destroy 中 fetch/body | Promise 不因 destroy 结束,响应到达后继续 init 和创建 URL | 区分两段异步边界与过期结果 |
+| destroy 后方法 | 最后 URL 不释放,tracks/reset 仍创建新 URL 和调用 init | 关闭后不再写入或分配资源 |
+| 同步 init 失败 | 原异常拒绝,但新 Blob URL 泄漏,escape 已修改 | 安装失败回滚和资源所有权 |
+| 异步 init 失败 | 插件忽略实际返回的 Promise,注册仍成功 | 观察内部拒绝,同时保护 tracks/reset 的旧 void 接口 |
+| URL 分配失败 | 先 revoke 旧 URL,随后分配失败,宿主仍指向失效资源 | 新旧资源的替换顺序与失败恢复 |
+
+异步 init 失败用例由测试宿主观察真实 rejection,防止 Node 未处理拒绝结束测试;
+没有把假设的 future handler 当作旧插件已有能力。浏览器测试也仅记录真实 init 返回值和
+拒绝,不替换其实现;本次真实环境中的 init 错误数组为空。
+
+## 原生浏览器证据
+
+用真实 1.2.0 main 插件与发布/候选核心,在 Chromium、Firefox、Windows WebKit 上执行
+三场景,共 18 项。核心和插件指纹、浏览器版本、请求/错误记录及观察数据见
+[验证记录](../baselines/multiple-subtitles-failures.json)。三个场景为:
+
+1. 真实 SRT 转换、原生 textTrack cue、播放时间推进和 DOM 字幕文本,切换/清空/reset。
+2. 原生 fetch 挂起期间 destroy:没有 AbortSignal、没有及时结束,放行后在已销毁宿主
+ 调用 init;真实生成的 Blob URL 仍能被原生 fetch 读取。
+3. 正常加载后 destroy:插件 URL 仍可读取;保留的 reset 随后生成另一可读取 URL。
+
+成功显示场景通过真实 plugins.add;资源观察场景直接执行公开注册函数,以区分插件
+本身行为与核心插件管理器的结束保护。此证据不覆盖旧支持范围全部核心、ASS 原生显示、
+实体 Safari/移动设备、全部样式组合或在线编辑器;这些仍归 05/06。
+
+## 验证和接续
+
+本包命令新增失败文件,并接入主 test:unit。helper/用例显式 lint;最终完整 CI 和准确
+统计写入验证记录。包内维护文档同步。没有新依赖,不重建未改变的生产产物。
+LIFE 风险从源码观察提升为已复现;HTTP/宿主 Promise 问题单独登记,全部保持 open。
+
+最终本包 215 项、原生浏览器 18 项通过;完整 CI 2285 项通过(1937 单元、14 工程、
+334 基线),严格生产 TS 仍 346 文件。任务状态更新后另跑 9 项风险/契约元数据测试通过。
+声明字节与上次指纹的差异经 Git 对照确认仅为 CRLF;验证记录同时保留工作区和 Git 指纹。
+全量 lint 保留既有生成声明的 unused-disable 警告;新增测试文件的显式 lint 无警告。
+
+本任务独立本地提交,不推送、不发布。回退只移除新增复现和辅助宿主能力,生产行为不变。
+接下来 03 拆清获取/转换、纯 merge、注册与资源所有权,保持冻结契约并增加候选修复断言。
diff --git a/refactor/plan.md b/refactor/plan.md
index edced75b3..48ffe8ee1 100644
--- a/refactor/plan.md
+++ b/refactor/plan.md
@@ -4,7 +4,7 @@
基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 222 项,范围 22 个包及工作区/示例。
-状态:todo 91 / doing 13 / blocked 0 / done 118 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
+状态:todo 90 / doing 13 / blocked 0 / done 119 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。
@@ -217,7 +217,7 @@
| ID | 范围 / 步骤 | 前置依赖 | 交付物 | 验收条件 | 风险 | 状态 |
| --- | --- | --- | --- | --- | --- | --- |
| PKG-MULTI-SUB-01 | artplayer-plugin-multiple-subtitles
核对包契约与历史用法 | BASE-05 | subtitles/onParser、multipleSubtitles 名称及实际返回方法 | 源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结;接续 VENDOR-03,定位 WebVTT parser 来源/修订及 CC0 头,保留解析/序列化行为 | H | done |
-| PKG-MULTI-SUB-02 | artplayer-plugin-multiple-subtitles
建立特有行为与错误测试 | PKG-MULTI-SUB-01, ENG-03, ENG-05 | VTT/SRT/ASS、编码/重叠 cue/排序/空轨/失败与切换 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | H | todo |
+| PKG-MULTI-SUB-02 | artplayer-plugin-multiple-subtitles
建立特有行为与错误测试 | PKG-MULTI-SUB-01, ENG-03, ENG-05 | VTT/SRT/ASS、编码/重叠 cue/排序/空轨/失败与切换 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | H | done |
| PKG-MULTI-SUB-03 | artplayer-plugin-multiple-subtitles
整理内部职责与资源 | PKG-MULTI-SUB-02, CORE-15 | 解析与合并/获取/渲染分离,过期请求及对象 URL 清理 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | todo |
| PKG-MULTI-SUB-04 | artplayer-plugin-multiple-subtitles
迁移自有源码和公开类型 | PKG-MULTI-SUB-03, ENG-04, ENG-06, CORE-07 | 准确 parser/cue/tree/result 类型与真实异步形状 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容 | H | todo |
| PKG-MULTI-SUB-05 | artplayer-plugin-multiple-subtitles
验证新旧核心和组合 | PKG-MULTI-SUB-04, CORE-22 | 与核心字幕/偏移/全屏组合,旧名称调用不变 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | H | todo |
@@ -512,6 +512,7 @@
- PKG-DASH-04: [记录](changes/2026-09-12-PKG-DASH-04-types.md) [记录](baselines/dash-types-validation.json) [记录](dash-validation.md)
- PKG-DASH-05: [记录](changes/2026-09-12-PKG-DASH-05-sdk-checkpoint.md) [记录](baselines/dash-sdk.json) [记录](baselines/dash-sdk-checkpoint.json) [记录](dash-validation.md) [记录](changes/2026-09-12-PKG-DASH-05-sdk-types.md) [记录](baselines/dash-sdk-types-validation.json) [记录](changes/2026-09-12-PKG-DASH-05-sdk-events.md) [记录](baselines/dash-sdk-events-validation.json) [记录](changes/2026-09-12-PKG-DASH-05-seek-diagnosis.md) [记录](baselines/dash-seek-diagnosis.json)
- PKG-MULTI-SUB-01: [记录](baselines/multiple-subtitles-release.json) [记录](baselines/multiple-subtitles-contract.md) [记录](baselines/multiple-subtitles-contract-validation.json) [记录](changes/2026-09-13-PKG-MULTI-SUB-01-contract.md)
+- PKG-MULTI-SUB-02: [记录](baselines/multiple-subtitles-failures.json) [记录](changes/2026-09-13-PKG-MULTI-SUB-02-failures.md)
- PKG-ADS-01: [记录](baselines/ads-release.json) [记录](baselines/ads-contract.md) [记录](baselines/ads-contract-validation.json) [记录](changes/2026-09-12-PKG-ADS-01-contract.md) [记录](scripts/ads-contract.test.mjs)
- PKG-ADS-02: [记录](changes/2026-09-12-PKG-ADS-02-tests.md) [记录](ads-validation.md) [记录](baselines/ads-validation.json)
- PKG-ADS-03: [记录](changes/2026-09-12-PKG-ADS-03-lifecycle.md) [记录](ads-validation.md) [记录](baselines/ads-lifecycle-validation.json)
diff --git a/refactor/progress.md b/refactor/progress.md
index 07de61d60..3628f243e 100644
--- a/refactor/progress.md
+++ b/refactor/progress.md
@@ -1,5 +1,21 @@
# 进度与证据
+## PKG-MULTI-SUB-02 错误与生命周期复现完成
+
+9 份历史实现各 18 类异常/边界,共 162 项;本包命令及主 test:unit 已接入,
+本包 215 项通过。真实核心 converter 与 TextDecoder 覆盖 SRT/ASS/编码,另验证
+轨序、重叠、名称、空轨、坏 header 容错、错误身份、下载中销毁和保留方法。
+真实 1.2.0 插件配发布/候选核心,在 Chromium/Firefox/Windows WebKit 共 18 项通过:
+SRT 原生字幕显示与切换、挂起 fetch 销毁后继续安装、Blob URL 残留与 late reset。
+这是历史缺陷的复现成功,不代表已修复;LIFE/MERGE 保持 open,新增 HTTP/HOST 风险。
+完整 CI 2285 项通过(1937 单元、14 工程、334 基线),严格生产 TS 仍 346 文件;
+新增文件显式 lint 通过。声明指纹差异已核对仅为 CRLF,生产源码/声明/产物均未改。
+见[复现记录](changes/2026-09-13-PKG-MULTI-SUB-02-failures.md)和
+[验证证据](baselines/multiple-subtitles-failures.json)。实体设备、ASS 原生显示及完整组合仍待 05/06。
+222 项:119 done、13 doing、90 todo;196 项风险。独立本地任务提交,不推送、不发布。
+下一步 MULTI-SUB-03 拆分获取/解析合并/资源所有权并修复已复现缺陷;VTT 类型取舍继续待决。
+
+
## PKG-MULTI-SUB-01 历史契约与 parser 来源完成
冻结三个实际 npm 版本、20 成员与 9 份 Git 输入;53 项本包契约/vendor 测试通过,
diff --git a/refactor/risk-table.md b/refactor/risk-table.md
index e0fb2348e..57ba27bb8 100644
--- a/refactor/risk-table.md
+++ b/refactor/risk-table.md
@@ -196,5 +196,7 @@
| VTT-THUMB-EXPORT-01 | open / 已复现 | Older CommonJS default objects and thumbnails control names differ from latest direct export and vtt-thumbnail name | PKG-VTT-THUMB-04, PKG-VTT-THUMB-05, PKG-VTT-THUMB-06 |
| MULTI-SUB-TYPE-01 | open / 已复现 | Declarations omit async registration, tracks/reset and make the subtitles array required | PKG-MULTI-SUB-04 |
| MULTI-SUB-MERGE-01 | open / 已复现 | 1.0.0 merges cues by index while later versions concatenate independently timed track cues | PKG-MULTI-SUB-02, PKG-MULTI-SUB-03, PKG-MULTI-SUB-05 |
-| MULTI-SUB-LIFE-01 | open / 源码/产物事实 | Pending downloads and final object URL have no destroy owner | PKG-MULTI-SUB-02, PKG-MULTI-SUB-03, PKG-MULTI-SUB-05 |
+| MULTI-SUB-LIFE-01 | open / 已复现 | Pending downloads and final object URL have no destroy owner | PKG-MULTI-SUB-02, PKG-MULTI-SUB-03, PKG-MULTI-SUB-05 |
| MULTI-SUB-EXPORT-01 | open / 已复现 | Older CommonJS default objects conflict with export-assignment declarations; latest exports a direct factory | PKG-MULTI-SUB-04, PKG-MULTI-SUB-06 |
+| MULTI-SUB-HTTP-01 | open / 已复现 | HTTP error responses with parseable bodies are installed as subtitles | PKG-MULTI-SUB-03, PKG-MULTI-SUB-05 |
+| MULTI-SUB-HOST-01 | open / 已复现 | Subtitle init rejections are ignored and failed installation or URL replacement leaks or invalidates resources | PKG-MULTI-SUB-03, PKG-MULTI-SUB-05 |
diff --git a/refactor/risks.json b/refactor/risks.json
index f891a89fc..5a0e1495e 100644
--- a/refactor/risks.json
+++ b/refactor/risks.json
@@ -4275,7 +4275,11 @@
"refactor/baselines/multiple-subtitles-release.json",
"refactor/baselines/multiple-subtitles-contract.md",
"test/multiple-subtitles.test.js",
- "refactor/scripts/multiple-subtitles-contract.test.mjs"
+ "refactor/scripts/multiple-subtitles-contract.test.mjs",
+ "test/multiple-subtitles-failures.test.js",
+ "test/browser/multiple-subtitles-history.spec.js",
+ "refactor/baselines/multiple-subtitles-failures.json",
+ "refactor/changes/2026-09-13-PKG-MULTI-SUB-02-failures.md"
],
"compatibleResolution": "Keep historical merge profiles explicit and test real overlap/timing before choosing compatibility behavior.",
"closureCriteria": "Unaligned lengths, overlap, sorting, names and real subtitle display across supported cores are verified."
@@ -4283,7 +4287,7 @@
{
"id": "MULTI-SUB-LIFE-01",
"title": "Pending downloads and final object URL have no destroy owner",
- "confirmation": "source-observed",
+ "confirmation": "reproduced",
"status": "open",
"owners": [
"PKG-MULTI-SUB-02",
@@ -4294,7 +4298,11 @@
"refactor/baselines/multiple-subtitles-release.json",
"refactor/baselines/multiple-subtitles-contract.md",
"test/multiple-subtitles.test.js",
- "refactor/scripts/multiple-subtitles-contract.test.mjs"
+ "refactor/scripts/multiple-subtitles-contract.test.mjs",
+ "test/multiple-subtitles-failures.test.js",
+ "test/browser/multiple-subtitles-history.spec.js",
+ "refactor/baselines/multiple-subtitles-failures.json",
+ "refactor/changes/2026-09-13-PKG-MULTI-SUB-02-failures.md"
],
"compatibleResolution": "Reproduce stale completion and own requests and URLs without changing public selection methods.",
"closureCriteria": "Cancellation, failures, source changes, repeated selection and destroy are verified with native core coverage."
@@ -4316,6 +4324,42 @@
],
"compatibleResolution": "Preserve valid historical runtime import forms and explicitly assess type-only extraction conflicts.",
"closureCriteria": "Actual installed CJS/ESM/global/legacy consumers and their declarations are verified."
+ },
+ {
+ "id": "MULTI-SUB-HTTP-01",
+ "title": "HTTP error responses with parseable bodies are installed as subtitles",
+ "compatibleResolution": "Reject actual HTTP failures with explicit diagnostics while preserving successful conversion and original transport errors.",
+ "closureCriteria": "Native HTTP errors, transport/body failures, sibling cancellation and successful requests have candidate regressions.",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "PKG-MULTI-SUB-03",
+ "PKG-MULTI-SUB-05"
+ ],
+ "evidence": [
+ "test/multiple-subtitles-failures.test.js",
+ "test/browser/multiple-subtitles-history.spec.js",
+ "refactor/baselines/multiple-subtitles-failures.json",
+ "refactor/changes/2026-09-13-PKG-MULTI-SUB-02-failures.md"
+ ]
+ },
+ {
+ "id": "MULTI-SUB-HOST-01",
+ "title": "Subtitle init rejections are ignored and failed installation or URL replacement leaks or invalidates resources",
+ "compatibleResolution": "Own installation results and URL rollback while preserving void selection methods and normal registration timing.",
+ "closureCriteria": "Synchronous and asynchronous host failures, stale rejection, allocation failure and destroy leave no plugin-owned live resources.",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "PKG-MULTI-SUB-03",
+ "PKG-MULTI-SUB-05"
+ ],
+ "evidence": [
+ "test/multiple-subtitles-failures.test.js",
+ "test/browser/multiple-subtitles-history.spec.js",
+ "refactor/baselines/multiple-subtitles-failures.json",
+ "refactor/changes/2026-09-13-PKG-MULTI-SUB-02-failures.md"
+ ]
}
]
}
diff --git a/refactor/tasks.json b/refactor/tasks.json
index bd6f0f79f..c139a2c31 100644
--- a/refactor/tasks.json
+++ b/refactor/tasks.json
@@ -2277,11 +2277,14 @@
"ENG-03",
"ENG-05"
],
- "status": "todo",
+ "status": "done",
"risk": "H",
"deliverable": "VTT/SRT/ASS、编码/重叠 cue/排序/空轨/失败与切换",
"acceptance": "旧版本行为可重跑,成功/失败/切源/销毁有必要断言",
- "evidence": []
+ "evidence": [
+ "baselines/multiple-subtitles-failures.json",
+ "changes/2026-09-13-PKG-MULTI-SUB-02-failures.md"
+ ]
},
{
"id": "PKG-MULTI-SUB-03",
diff --git a/test/browser/multiple-subtitles-history.spec.js b/test/browser/multiple-subtitles-history.spec.js
new file mode 100644
index 000000000..7e8574165
--- /dev/null
+++ b/test/browser/multiple-subtitles-history.spec.js
@@ -0,0 +1,136 @@
+import { hash } from '../../refactor/scripts/releases.mjs'
+import { multipleSubtitlesHistorical } from '../helpers/multiple-subtitles.js'
+import { expect, test } from './fixtures.js'
+
+const implementation = (await multipleSubtitlesHistorical()).find(item => item.name === 'published-1.2.0-main')
+const srt = text => `1\n00:00:00,000 --> 00:00:08,000\n${text}\n`
+const vtt = 'WEBVTT\n\n00:00.000 --> 00:08.000\nCached caption\n'
+
+async function prepare(page, core) {
+ await page.goto(`/test/player.html?core=${core}`)
+ await page.addScriptTag({ content: implementation.code })
+ await page.evaluate(() => {
+ window.createPlayer('/test/pattern.mp4')
+ window.multipleProbe = { initialized: [], revoked: [], errors: [], signal: false, settled: false }
+ window.multipleNativeFetch = window.fetch.bind(window)
+ window.fetch = (url, options) => {
+ if (url === '/test/multiple-held.vtt')
+ window.multipleProbe.signal = Boolean(options?.signal)
+ return window.multipleNativeFetch(url, options)
+ }
+ const revoke = URL.revokeObjectURL.bind(URL)
+ URL.revokeObjectURL = (url) => {
+ window.multipleProbe.revoked.push(url)
+ revoke(url)
+ }
+ const init = window.art.subtitle.init.bind(window.art.subtitle)
+ window.art.subtitle.init = (option) => {
+ window.multipleProbe.initialized.push({ url: option.url, destroyed: window.art.isDestroy })
+ const pending = init(option)
+ // Observe the real host rejection without replacing its behavior or return value.
+ Promise.resolve(pending).catch(error => window.multipleProbe.errors.push({ name: error.name, message: error.message }))
+ return pending
+ }
+ })
+ await expect.poll(() => page.evaluate(() => window.art.isReady)).toBe(true)
+}
+
+async function evidence(page, testInfo, core, observation) {
+ const probe = await page.evaluate(() => window.multipleProbe)
+ expect(probe.errors).toEqual([])
+ await testInfo.attach('multiple-subtitles-history', { body: JSON.stringify({ core, implementation: { name: implementation.name, sha256: hash(implementation.code) }, observation, probe }), contentType: 'application/json' })
+}
+
+for (const core of ['published', 'candidate']) {
+ test(`Multiple subtitles historical ${core} core: real SRT captions select, clear and reset`, async ({ page }, testInfo) => {
+ await page.route('**/test/multiple-en.srt', route => route.fulfill({ body: srt('English'), contentType: 'text/plain' }))
+ await page.route('**/test/multiple-jp.srt', route => route.fulfill({ body: srt('日本語'), contentType: 'text/plain' }))
+ await prepare(page, core)
+ await page.evaluate(async () => {
+ window.multipleResult = await window.art.plugins.add(window.artplayerPluginMultipleSubtitles({ subtitles: [{ name: 'en', url: '/test/multiple-en.srt' }, { name: 'jp', url: '/test/multiple-jp.srt' }] }))
+ })
+ await expect.poll(() => page.evaluate(() => window.art.subtitle.cues.length)).toBe(2)
+ await page.locator('#play').click()
+ await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThan(0.1)
+ await page.locator('#pause').click()
+ await expect(page.locator('.art-subtitle-en')).toHaveText('English')
+ await expect(page.locator('.art-subtitle-jp')).toHaveText('日本語')
+ await page.evaluate(() => window.art.plugins.multipleSubtitles.tracks(['jp']))
+ await expect(page.locator('.art-subtitle-en')).toHaveCount(0)
+ await expect(page.locator('.art-subtitle-jp')).toHaveText('日本語')
+ await page.evaluate(() => window.art.plugins.multipleSubtitles.tracks([]))
+ await expect(page.locator('.art-subtitle-jp')).toHaveCount(0)
+ await page.evaluate(() => window.art.plugins.multipleSubtitles.reset())
+ await expect(page.locator('.art-subtitle-en')).toHaveText('English')
+ await expect(page.locator('.art-subtitle-jp')).toHaveText('日本語')
+ await page.evaluate(() => window.art.destroy(false))
+ await evidence(page, testInfo, core, 'Native SRT conversion, track cue loading, real playback and DOM text selection/reset passed; this does not verify all CSS/device combinations.')
+ })
+
+ test(`Multiple subtitles historical ${core} core: pending native fetch survives destroy and creates a retained Blob URL`, async ({ page }, testInfo) => {
+ let release
+ let requested
+ const started = new Promise((resolve) => {
+ requested = resolve
+ })
+ const pending = new Promise((resolve) => {
+ release = resolve
+ })
+ await page.route('**/test/multiple-held.vtt', async (route) => {
+ requested()
+ await pending
+ await route.fulfill({ body: vtt, contentType: 'text/vtt' })
+ })
+ try {
+ await prepare(page, core)
+ await page.evaluate(() => {
+ window.multiplePending = window.artplayerPluginMultipleSubtitles({ subtitles: [{ url: '/test/multiple-held.vtt', name: 'held' }] })(window.art).then((result) => {
+ window.multipleResult = result
+ window.multipleProbe.settled = true
+ })
+ })
+ await started
+ await page.evaluate(() => window.art.destroy(false))
+ expect(await page.evaluate(() => ({ settled: window.multipleProbe.settled, signal: window.multipleProbe.signal, initialized: window.multipleProbe.initialized.length }))).toEqual({ settled: false, signal: false, initialized: 0 })
+ release()
+ await page.evaluate(() => window.multiplePending)
+ const state = await page.evaluate(async () => {
+ const [late] = window.multipleProbe.initialized
+ const text = await (await window.multipleNativeFetch(late.url)).text()
+ return { destroyedAtInit: late.destroyed, retained: !window.multipleProbe.revoked.includes(late.url), text }
+ })
+ expect(state.destroyedAtInit).toBe(true)
+ expect(state.retained).toBe(true)
+ expect(state.text).toContain('Cached caption')
+ await evidence(page, testInfo, core, state)
+ }
+ finally { release() }
+ })
+
+ test(`Multiple subtitles historical ${core} core: destroy retains the plugin URL and reset allocates another one`, async ({ page }, testInfo) => {
+ await page.route('**/test/multiple-ready.vtt', route => route.fulfill({ body: vtt, contentType: 'text/vtt' }))
+ await prepare(page, core)
+ await page.evaluate(async () => {
+ window.multipleResult = await window.artplayerPluginMultipleSubtitles({ subtitles: [{ url: '/test/multiple-ready.vtt', name: 'ready' }] })(window.art)
+ })
+ await expect.poll(() => page.evaluate(() => window.art.subtitle.cues.length)).toBe(1)
+ const state = await page.evaluate(async () => {
+ const first = window.multipleProbe.initialized[0].url
+ window.art.destroy(false)
+ const retainedText = await (await window.multipleNativeFetch(first)).text()
+ const beforeReset = !window.multipleProbe.revoked.includes(first)
+ const result = window.multipleResult.reset()
+ const late = window.multipleProbe.initialized.at(-1)
+ const lateText = await (await window.multipleNativeFetch(late.url)).text()
+ return { beforeReset, retainedText, returnsUndefined: result === undefined, lateAfterDestroy: late.destroyed, newURL: late.url !== first, priorRevokedByReset: window.multipleProbe.revoked.includes(first), lateText }
+ })
+ expect(state.beforeReset).toBe(true)
+ expect(state.retainedText).toContain('Cached caption')
+ expect(state.returnsUndefined).toBe(true)
+ expect(state.lateAfterDestroy).toBe(true)
+ expect(state.newURL).toBe(true)
+ expect(state.priorRevokedByReset).toBe(true)
+ expect(state.lateText).toContain('Cached caption')
+ await evidence(page, testInfo, core, state)
+ })
+}
diff --git a/test/helpers/multiple-subtitles.js b/test/helpers/multiple-subtitles.js
index fcb247b7f..bb416dae0 100644
--- a/test/helpers/multiple-subtitles.js
+++ b/test/helpers/multiple-subtitles.js
@@ -28,12 +28,16 @@ export async function multipleSubtitlesHistorical() {
return implementations
}
-export function multipleSubtitlesEnvironment(implementation, { script = false, responses = {} } = {}) {
+export function multipleSubtitlesEnvironment(implementation, { script = false, responses = {}, fetchResponse, coreUtils, onInit, onCreate } = {}) {
const requests = []
+ const requestOptions = []
const blobs = new Map()
+ const liveBlobs = new Map()
const revoked = []
const initialized = []
+ const initStates = []
const converted = []
+ const listeners = new Map()
const module = { exports: {} }
const utils = {
getExt: url => url.split('.').pop(),
@@ -46,11 +50,32 @@ export function multipleSubtitlesEnvironment(implementation, { script = false, r
converted.push(['ass', text])
return subtitleVtt('ASS')
},
+ ...coreUtils,
}
const art = {
+ isDestroy: false,
constructor: { utils },
option: { subtitle: { escape: true, style: { color: 'red' } } },
- subtitle: { init(option) { initialized.push(option) } },
+ subtitle: { init(option) {
+ initialized.push(option)
+ initStates.push({ destroyed: art.isDestroy })
+ return onInit?.(option)
+ } },
+ on(name, callback) {
+ if (!listeners.has(name))
+ listeners.set(name, new Set())
+ listeners.get(name).add(callback)
+ return art
+ },
+ off(name, callback) {
+ listeners.get(name)?.delete(callback)
+ return art
+ },
+ }
+ function responseFor(url) {
+ const value = responses[url] ?? subtitleVtt(url)
+ const bytes = typeof value === 'string' ? new TextEncoder().encode(value) : value
+ return { ok: true, status: 200, arrayBuffer: async () => bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) }
}
const context = {
Blob,
@@ -58,16 +83,21 @@ export function multipleSubtitlesEnvironment(implementation, { script = false, r
console: { log() {}, warn() {}, error() {} },
URL: {
createObjectURL(blob) {
+ onCreate?.(blob)
const url = `blob:subtitle-${blobs.size + 1}`
blobs.set(url, blob)
+ liveBlobs.set(url, blob)
return url
},
- revokeObjectURL(url) { revoked.push(url) },
+ revokeObjectURL(url) {
+ revoked.push(url)
+ liveBlobs.delete(url)
+ },
},
- fetch: async (url) => {
+ fetch: async (url, options) => {
requests.push(url)
- const bytes = new TextEncoder().encode(responses[url] ?? subtitleVtt(url))
- return { ok: true, arrayBuffer: async () => bytes.buffer }
+ requestOptions.push(options)
+ return fetchResponse ? fetchResponse(url, options, responseFor) : responseFor(url)
},
}
context.window = context
@@ -79,5 +109,11 @@ export function multipleSubtitlesEnvironment(implementation, { script = false, r
const exported = script ? context.artplayerPluginMultipleSubtitles : module.exports
const factory = exported?.default || exported
const latestText = async () => blobs.get(initialized.at(-1).url).text()
- return { factory, exported, art, utils, requests, blobs, revoked, initialized, converted, latestText }
+ function emit(name, ...args) {
+ if (name === 'destroy')
+ art.isDestroy = true
+ for (const callback of [...(listeners.get(name) || [])])
+ callback(...args)
+ }
+ return { factory, exported, art, utils, requests, requestOptions, blobs, liveBlobs, revoked, initialized, initStates, converted, listeners, emit, responseFor, latestText }
}
diff --git a/test/multiple-subtitles-failures.test.js b/test/multiple-subtitles-failures.test.js
new file mode 100644
index 000000000..20e7c6ab5
--- /dev/null
+++ b/test/multiple-subtitles-failures.test.js
@@ -0,0 +1,260 @@
+import assert from 'node:assert/strict'
+import { Buffer } from 'node:buffer'
+// eslint-disable-next-line test/no-import-node-test -- Historical failures use the repository Node runner.
+import test from 'node:test'
+import { loadModules } from './helpers/load.js'
+import { multipleSubtitlesEnvironment, multipleSubtitlesHistorical, subtitleVtt } from './helpers/multiple-subtitles.js'
+
+const implementations = await multipleSubtitlesHistorical()
+const coreUtils = await loadModules({
+ getExt: { file: 'packages/artplayer/src/utils/file', name: 'getExt' },
+ srtToVtt: { file: 'packages/artplayer/src/utils/subtitle', name: 'srtToVtt' },
+ assToVtt: { file: 'packages/artplayer/src/utils/subtitle', name: 'assToVtt' },
+})
+const subtitle = (url = 'a.vtt', name = 'a') => ({ url, name })
+const options = (...subtitles) => ({ subtitles })
+function deferred() {
+ let resolve
+ let reject
+ const promise = new Promise((yes, no) => {
+ resolve = yes
+ reject = no
+ })
+ return { promise, resolve, reject }
+}
+async function flush() {
+ for (let step = 0; step < 6; step++)
+ await Promise.resolve()
+}
+const cues = rows => `WEBVTT\n\n${rows.map(([start, end, text]) => `00:0${start}.000 --> 00:0${end}.000\n${text}\n`).join('\n')}`
+const starts = text => [...text.matchAll(/^(\d{2}:\d{2}\.\d{3}) -->/gm)].map(match => match[1])
+
+for (const implementation of implementations) {
+ const create = setup => multipleSubtitlesEnvironment(implementation, setup)
+ const oldMerge = implementation.version === '1.0.0'
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: actual core converters accept SRT, ASS and encoded VTT`, async () => {
+ const responses = {
+ 'srt.SRT?track=1': '1\n00:00:00,000 --> 00:00:02,000\nSRT text\n',
+ 'a.ass': 'Dialogue: 0,0:00:00.00,0:00:02.00,Default,,0,0,0,,ASS text',
+ 'latin.vtt': Buffer.from(subtitleVtt('café'), 'latin1'),
+ 'utf16.vtt': Buffer.from(subtitleVtt('日本語'), 'utf16le'),
+ }
+ const env = create({ responses, coreUtils })
+ await env.factory(options(subtitle('srt.SRT?track=1', 'srt'), subtitle('a.ass', 'ass'), { ...subtitle('latin.vtt', 'latin'), encoding: 'windows-1252' }, { ...subtitle('utf16.vtt', 'utf16'), encoding: 'utf-16le' }))(env.art)
+ const text = env.utils.unescape(await env.latestText())
+ for (const expected of ['SRT text', 'ASS text', 'café', '日本語'])
+ assert(text.includes(expected))
+ assert.equal(starts(text).length, oldMerge ? 1 : 4)
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: response order does not reorder tracks`, async () => {
+ const first = deferred()
+ const second = deferred()
+ const env = create({ fetchResponse: url => url === 'a.vtt' ? first.promise : second.promise })
+ const pending = env.factory(options(subtitle(), subtitle('b.vtt', 'b')))(env.art)
+ second.resolve(env.responseFor('b.vtt'))
+ await flush()
+ assert.equal(env.initialized.length, 0)
+ first.resolve(env.responseFor('a.vtt'))
+ await pending
+ const text = env.utils.unescape(await env.latestText())
+ assert(text.indexOf('art-subtitle-a') < text.indexOf('art-subtitle-b'))
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: fetch rejection preserves error while sibling work continues`, async () => {
+ const error = new Error('fetch failed')
+ const sibling = deferred()
+ let bodyRead = false
+ const env = create({ fetchResponse: url => url === 'a.vtt' ? Promise.reject(error) : sibling.promise })
+ await assert.rejects(env.factory(options(subtitle(), subtitle('b.vtt', 'b')))(env.art), caught => caught === error)
+ assert.equal(env.initialized.length, 0)
+ assert.deepEqual(env.requestOptions, [undefined, undefined])
+ sibling.resolve({ arrayBuffer: async () => {
+ bodyRead = true
+ return new TextEncoder().encode(subtitleVtt('late')).buffer
+ } })
+ await flush()
+ assert.equal(bodyRead, true)
+ assert.equal(env.blobs.size, 0)
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: HTTP errors with parseable bodies still mount`, async () => {
+ const env = create({ fetchResponse: (_url, _options, responseFor) => ({ ...responseFor('a.vtt'), ok: false, status: 404 }) })
+ await env.factory(options(subtitle()))(env.art)
+ assert.equal(env.initialized.length, 1)
+ assert((await env.latestText()).includes('a.vtt'))
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: body and decoder errors reject before allocating URLs`, async () => {
+ const error = new Error('body failed')
+ const env = create({ fetchResponse: () => ({ arrayBuffer: async () => {
+ throw error
+ } }) })
+ await assert.rejects(env.factory(options(subtitle()))(env.art), caught => caught === error)
+ assert.equal(env.blobs.size, 0)
+ const invalid = create()
+ await assert.rejects(invalid.factory(options({ ...subtitle(), encoding: 'invalid-encoding-label' }))(invalid.art), { name: 'RangeError' })
+ assert.equal(invalid.blobs.size, 0)
+ assert.equal(invalid.initialized.length, 0)
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: missing names throw before replacing the active URL`, async () => {
+ const env = create()
+ const result = await env.factory(options(subtitle()))(env.art)
+ assert.throws(() => result.tracks(['missing']), { name: 'TypeError' })
+ assert.deepEqual(env.revoked, [''])
+ assert.equal(env.liveBlobs.has('blob:subtitle-1'), true)
+ result.reset()
+ assert.equal(env.initialized.length, 2)
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: duplicate names select the first parsed track`, async () => {
+ const env = create({ responses: { 'a.vtt': subtitleVtt('First text'), 'b.vtt': subtitleVtt('Second text') } })
+ const result = await env.factory(options(subtitle('a.vtt', 'same'), subtitle('b.vtt', 'same')))(env.art)
+ result.tracks(['same'])
+ const text = await env.latestText()
+ assert(text.includes('First text'))
+ assert(!text.includes('Second text'))
+ result.reset()
+ assert((await env.latestText()).includes('Second text'))
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: a shorter later track exposes the old index merge failure`, async () => {
+ const env = create({ responses: { 'a.vtt': cues([[0, 2, 'A'], [3, 5, 'B']]), 'b.vtt': subtitleVtt('C') } })
+ const pending = env.factory(options(subtitle(), subtitle('b.vtt', 'b')))(env.art)
+ if (oldMerge) {
+ await assert.rejects(pending, { name: 'TypeError' })
+ assert.equal(env.blobs.size, 0)
+ }
+ else {
+ await pending
+ assert.equal(starts(await env.latestText()).length, 3)
+ }
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: a longer later track used to lose its tail`, async () => {
+ const env = create({ responses: { 'a.vtt': subtitleVtt('A'), 'b.vtt': cues([[0, 2, 'B'], [3, 5, 'Tail']]) } })
+ await env.factory(options(subtitle(), subtitle('b.vtt', 'b')))(env.art)
+ const text = await env.latestText()
+ assert.equal(text.includes('Tail'), !oldMerge)
+ assert.equal(starts(text).length, oldMerge ? 1 : 3)
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: each track sorts internally without globally sorting the merge`, async () => {
+ const env = create({ responses: { 'a.vtt': cues([[2, 6, 'A2'], [0, 4, 'A0']]), 'b.vtt': cues([[5, 7, 'B5'], [1, 3, 'B1']]) } })
+ await env.factory(options(subtitle(), subtitle('b.vtt', 'b')))(env.art)
+ assert.deepEqual(starts(await env.latestText()), oldMerge
+ ? ['00:00.000', '00:02.000']
+ : ['00:00.000', '00:02.000', '00:01.000', '00:05.000'])
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: parser diagnostics are discarded but usable cues survive`, async () => {
+ const env = create({ responses: { 'a.vtt': subtitleVtt('usable').replace('WEBVTT', 'BAD HEADER') } })
+ await env.factory(options(subtitle()))(env.art)
+ assert((await env.latestText()).includes('usable'))
+ const empty = create({ responses: { 'a.vtt': 'WEBVTT\n\n', 'unknown.bin': 'not subtitles' } })
+ await empty.factory(options(subtitle(), subtitle('unknown.bin', 'unknown')))(empty.art)
+ assert.equal(await empty.latestText(), 'WEBVTT\n\n')
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: destroy while fetching still permits late registration and leaks its URL`, async () => {
+ const request = deferred()
+ const env = create({ fetchResponse: () => request.promise })
+ let settled = false
+ const pending = env.factory(options(subtitle()))(env.art).then((result) => {
+ settled = true
+ return result
+ })
+ env.emit('destroy')
+ await flush()
+ assert.equal(settled, false)
+ assert.equal(env.requestOptions[0], undefined)
+ request.resolve(env.responseFor('a.vtt'))
+ assert.equal((await pending).name, 'multipleSubtitles')
+ assert.deepEqual(env.initStates, [{ destroyed: true }])
+ assert.equal(env.liveBlobs.size, 1)
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: destroy during body decoding also permits late installation`, async () => {
+ const body = deferred()
+ const started = deferred()
+ const env = create({ fetchResponse: () => ({ arrayBuffer: () => {
+ started.resolve()
+ return body.promise
+ } }) })
+ const pending = env.factory(options(subtitle()))(env.art)
+ await started.promise
+ env.emit('destroy')
+ body.resolve(new TextEncoder().encode(subtitleVtt('late body')).buffer)
+ await pending
+ assert.deepEqual(env.initStates, [{ destroyed: true }])
+ assert.equal(env.liveBlobs.size, 1)
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: retained methods allocate new URLs after destroy`, async () => {
+ const env = create()
+ const result = await env.factory(options(subtitle()))(env.art)
+ env.emit('destroy')
+ assert.equal(env.liveBlobs.has('blob:subtitle-1'), true)
+ assert.equal(result.tracks([]), undefined)
+ result.reset()
+ assert.deepEqual(env.initStates, [{ destroyed: false }, { destroyed: true }, { destroyed: true }])
+ assert.equal(env.liveBlobs.has('blob:subtitle-3'), true)
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: synchronous subtitle init failure leaves its new URL owned by nobody`, async () => {
+ const error = new Error('init failed')
+ const env = create({ onInit: () => {
+ throw error
+ } })
+ await assert.rejects(env.factory(options(subtitle()))(env.art), caught => caught === error)
+ assert.equal(env.liveBlobs.size, 1)
+ assert.equal(env.art.option.subtitle.escape, false)
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: registration ignores an observed asynchronous init rejection`, async () => {
+ const error = new Error('async init failed')
+ const errors = []
+ const env = create({ onInit: () => {
+ const rejected = Promise.reject(error)
+ rejected.catch(caught => errors.push(caught))
+ return rejected
+ } })
+ assert.equal((await env.factory(options(subtitle()))(env.art)).name, 'multipleSubtitles')
+ await flush()
+ assert.deepEqual(errors, [error])
+ assert.equal(env.liveBlobs.size, 1)
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: URL allocation failure happens after revoking the prior active URL`, async () => {
+ const error = new Error('allocation failed')
+ let calls = 0
+ const env = create({ onCreate: () => {
+ if (++calls === 2)
+ throw error
+ } })
+ const result = await env.factory(options(subtitle()))(env.art)
+ assert.throws(() => result.reset(), caught => caught === error)
+ assert.equal(env.liveBlobs.size, 0)
+ assert.equal(env.initialized.length, 1)
+ assert.deepEqual(env.revoked, ['', 'blob:subtitle-1'])
+ result.reset()
+ assert.equal(env.liveBlobs.size, 1)
+ })
+
+ test(`Multiple-subtitles ${implementation.name} failure baseline: metadata remains live after download and restart does not reload`, async () => {
+ const request = deferred()
+ const env = create({ fetchResponse: () => request.promise })
+ const entry = subtitle()
+ const pending = env.factory(options(entry))(env.art)
+ entry.name = 'renamed'
+ request.resolve(env.responseFor('a.vtt'))
+ const result = await pending
+ env.art.option.url = 'next.mp4'
+ env.emit('restart')
+ result.tracks(['renamed'])
+ assert(env.utils.unescape(await env.latestText()).includes('art-subtitle-renamed'))
+ assert.deepEqual(env.requests, ['a.vtt'])
+ })
+}