diff --git a/packages/artplayer-plugin-vtt-thumbnail/ARCHITECTURE.md b/packages/artplayer-plugin-vtt-thumbnail/ARCHITECTURE.md index 0d8c7e99a..48fe7c058 100644 --- a/packages/artplayer-plugin-vtt-thumbnail/ARCHITECTURE.md +++ b/packages/artplayer-plugin-vtt-thumbnail/ARCHITECTURE.md @@ -110,8 +110,13 @@ plugin. Empty or comment-only input remains a valid empty preview. The exported callable has a writable self `.default` alias, restoring the usable 1.0.x CommonJS default access while retaining direct calls. It does not add a name property to the -registration Promise. Earlier `thumbnails` control names are separately frozen and remain -combination/distribution work for tasks 05-06. The approved declaration migration does not +registration Promise. The old 1.0.1 plugin uses `thumbnails`, which works with the +recorded 5.1.6 core. Core 5.1.7 already reserves that name, and the actual 1.0.1 +bundle rejects registration on 5.1.7, 5.4.0 and the candidate core. These reproduced +historical failures are not successful compatibility cells. Later plugins and +this candidate use `vtt-thumbnail`; do not silently replace the core's reserved +control or introduce an alias over it. This pairing remains part of task05/release +review. The approved declaration migration does not complete the remaining package or device acceptance. ## Verification and future changes @@ -123,14 +128,27 @@ yarn test:vtt-thumbnail yarn test:vtt-thumbnail-types-package yarn build:ts artplayer-plugin-vtt-thumbnail yarn test:browser test/browser/vtt-thumbnail-lifecycle.spec.js +yarn test:browser test/browser/vtt-thumbnail-combinations.spec.js yarn build artplayer-plugin-vtt-thumbnail ``` The unit helper can load actual main/legacy files with ARTPLAYER_VTT_THUMBNAIL_ARTIFACT or the frozen former implementation with ARTPLAYER_VTT_THUMBNAIL_BASELINE=1. Historical tests are distinct from candidate expectations. Browser tests use real published/candidate cores, -native fetch/abort, mouse hover, sprite decoding and cleanup. Their scope is not full old -core/device coverage, installed tarballs, mobile Safari or the online editor. +native fetch/abort, mouse hover, sprite decoding and cleanup. The task05 combination +checkpoint adds actual DOM screenshot pixels, Chapter coexistence, web/native +fullscreen and source switch against core 5.1.6, 5.1.7, 5.3.0, 5.4.0 and candidate. +The 5.3.0 archive is an adjacent stable comparison, not the unpublished 5.3.1 +source-associated version. Historical 1.0.2/1.0.3/1.1.0 main bundles run with +candidate core; 1.0.1 runs with 5.1.6 and retains its later-core failure tests. +Compact-arrow input for 1.0.x compiled artifacts is labeled explicitly; ordinary +arrow parser failures remain in the existing historical contract tests. + +Mobile integration uses an Android user agent and synthetic DOM touch payloads +through actual core handlers with real media seeking and the 500ms hide timer. +It is not trusted OS input, physical Android or Safari/iOS verification. Task05 +remains open for required device evidence and historical-pair disposition; +installed main/legacy/ESM consumers and the actual local editor remain task06/EX-03. Modify parsing in parseVtt, requests in request, layout/timers in preview, and ownership in lifetime. Preserve the normal/failure lifecycle tests alongside any parser improvements. diff --git a/packages/artplayer-plugin-vtt-thumbnail/README.md b/packages/artplayer-plugin-vtt-thumbnail/README.md index 405b4e6ad..f0a89ee61 100644 --- a/packages/artplayer-plugin-vtt-thumbnail/README.md +++ b/packages/artplayer-plugin-vtt-thumbnail/README.md @@ -57,6 +57,13 @@ JavaScript default access, the direct factory, and legacy distribution entrypoin See [ARCHITECTURE.md](ARCHITECTURE.md) for module ownership, testing commands and remaining compatibility validation. +The old 1.0.1 JavaScript bundle registers a control named `thumbnails`. It works +with the tested core 5.1.6, but conflicts with the built-in control reserved by +core 5.1.7 and later tested cores (5.4.0 and the refactor candidate). The current +plugin uses `vtt-thumbnail`; retain that name when integrating custom controls. +This documented historical combination failure predates the refactor. Native +desktop tests and emulated touch checks do not certify physical mobile devices. + ## License MIT © Harvey Zhao diff --git a/refactor/baselines/vtt-thumbnail-combinations.json b/refactor/baselines/vtt-thumbnail-combinations.json new file mode 100644 index 000000000..b836fb54a --- /dev/null +++ b/refactor/baselines/vtt-thumbnail-combinations.json @@ -0,0 +1,2370 @@ +{ + "task": "PKG-VTT-THUMB-05", + "status": "doing", + "baseline": "4fa5c68be9d2d0d60d725c2a87b8d92a4dc8a85a", + "node": "v24.21.0", + "yarn": "1.22.22", + "final": { + "file": "refactor/.cache/vtt-combinations-final/report.json", + "sha256": "ac0b574b23e7a408f566412ffbbcd7bc81e5aa5df5f31fd7ee686659ae162554", + "stats": { + "startTime": "2026-09-14T01:51:11.495Z", + "duration": 52487.413, + "expected": 69, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "versions": { + "chromium": "153.0.8010.12", + "firefox": "155.0", + "webkit": "26.6" + }, + "inputs": { + "/candidate/artplayer.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "d9aeee649395b78eb30b38dcaefb3c19c731c21b08e356485bac7cda08ead242", + "bytes": 378117 + }, + "/candidate/artplayer-plugin-chapter.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a", + "bytes": 8529 + }, + "/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 + }, + "/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 + }, + "/published-5.3.0/artplayer.js": { + "source": { + "kind": "npm-release", + "version": "5.3.0", + "integrity": "sha512-yExO39MpEg4P+bxgChxx1eJfiUPE4q1QQRLCmqGhlsj+ANuaoEkR8hF93LdI5ZyrAcIbJkuEndxEiUoKobifDw==", + "member": "package/dist/artplayer.js" + }, + "sha256": "54ffaf7598b910d5a88d2d2eec1aa6faa806583915b99b892dd32129c53e421a", + "bytes": 159238 + }, + "/published-5.1.6/artplayer.js": { + "source": { + "kind": "npm-release", + "version": "5.1.6", + "integrity": "sha512-cqnVVLKCKWCryKl6Pmop50/Di9IQwOeNNQs5qWGzJDPiM0qTC7Q/Enusa+8JQid8p09fvp4Vc32ViSSYutdEeQ==", + "member": "package/dist/artplayer.js" + }, + "sha256": "6a7b1f3007ecda9f399e6cff606490dd745c495e19ce10e864a401ff09996172", + "bytes": 155714 + }, + "/published-5.3.1-beta.1/artplayer.js": { + "source": { + "kind": "npm-release", + "version": "5.3.1-beta.1", + "integrity": "sha512-btjbQwXPl86U/Apja0WrCUF+AXLPacI60eUGAeJTx3EMuUKrVaOFrmWrIeeyMUi5aIzMSXM++tQjlSMJVnmhuQ==", + "member": "package/dist/artplayer.js" + }, + "sha256": "e91e64228c57bb97300c709789d5557ab07b133cab307267b4a2a4df3083c861", + "bytes": 159458 + } + }, + "cases": [ + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.1.0-main / candidate: legal old calls preserve preview and control identity", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.0.1-main / published-5.1.6: legal old calls preserve preview and control identity", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.0.2-main / candidate: legal old calls preserve preview and control identity", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.0.3-main / candidate: legal old calls preserve preview and control identity", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT 1.0.1 / published-5.1.7: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT 1.0.1 / published: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT 1.0.1 / candidate: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.1.0-main / candidate: legal old calls preserve preview and control identity", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.0.1-main / published-5.1.6: legal old calls preserve preview and control identity", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.0.2-main / candidate: legal old calls preserve preview and control identity", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.0.3-main / candidate: legal old calls preserve preview and control identity", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT 1.0.1 / published-5.1.7: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT 1.0.1 / published: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT 1.0.1 / candidate: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.1.0-main / candidate: legal old calls preserve preview and control identity", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.0.1-main / published-5.1.6: legal old calls preserve preview and control identity", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.0.2-main / candidate: legal old calls preserve preview and control identity", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT published-1.0.3-main / candidate: legal old calls preserve preview and control identity", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT 1.0.1 / published-5.1.7: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT 1.0.1 / published: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT 1.0.1 / candidate: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.1.6: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.1.7: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.3.0: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / candidate: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.1.6: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.1.7: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.3.0: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / candidate: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.1.6: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.1.7: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published-5.3.0: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / published: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT candidate / candidate: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native published core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native published core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native published core: destroy aborts a pending native fetch and settles registration", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native candidate core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native candidate core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native candidate core: destroy aborts a pending native fetch and settles registration", + "engine": "chromium", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native published core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native published core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native published core: destroy aborts a pending native fetch and settles registration", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native candidate core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native candidate core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native candidate core: destroy aborts a pending native fetch and settles registration", + "engine": "firefox", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native published core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native published core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native published core: destroy aborts a pending native fetch and settles registration", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native candidate core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native candidate core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "webkit", + "status": "passed", + "errors": [] + }, + { + "title": "VTT native candidate core: destroy aborts a pending native fetch and settles registration", + "engine": "webkit", + "status": "passed", + "errors": [] + } + ], + "attachments": [ + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.6", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-red-cell", + "sha256": "74b030da45d33bbd9fdf5330a9a1dbfc6a6f77ef2d790c05cbec222f51046cc3", + "bytes": 242 + }, + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-blue-cell", + "sha256": "189f4b9020a0019e7391624e37f6412184d25d95907f156fefe19d1f8d6842cc", + "bytes": 246 + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.7", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-red-cell", + "sha256": "74b030da45d33bbd9fdf5330a9a1dbfc6a6f77ef2d790c05cbec222f51046cc3", + "bytes": 242 + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-blue-cell", + "sha256": "189f4b9020a0019e7391624e37f6412184d25d95907f156fefe19d1f8d6842cc", + "bytes": 246 + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.3.0", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-red-cell", + "sha256": "74b030da45d33bbd9fdf5330a9a1dbfc6a6f77ef2d790c05cbec222f51046cc3", + "bytes": 242 + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-blue-cell", + "sha256": "189f4b9020a0019e7391624e37f6412184d25d95907f156fefe19d1f8d6842cc", + "bytes": 246 + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "published", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-red-cell", + "sha256": "74b030da45d33bbd9fdf5330a9a1dbfc6a6f77ef2d790c05cbec222f51046cc3", + "bytes": 242 + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-blue-cell", + "sha256": "189f4b9020a0019e7391624e37f6412184d25d95907f156fefe19d1f8d6842cc", + "bytes": 246 + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-red-cell", + "sha256": "74b030da45d33bbd9fdf5330a9a1dbfc6a6f77ef2d790c05cbec222f51046cc3", + "bytes": 242 + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "name": "vtt-blue-cell", + "sha256": "189f4b9020a0019e7391624e37f6412184d25d95907f156fefe19d1f8d6842cc", + "bytes": 246 + }, + { + "title": "VTT published-1.1.0-main / candidate: legal old calls preserve preview and control identity", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "published-1.1.0-main", + "sha256": "2d8e22cbd191bdac5a6c711b641590c2f8a90ba1aae185dd0e02a00baf000f8d", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT published-1.0.1-main / published-5.1.6: legal old calls preserve preview and control identity", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.6", + "implementation": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "cueFormat": "historical compact arrow; ordinary-space failures retained separately", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT published-1.0.2-main / candidate: legal old calls preserve preview and control identity", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "published-1.0.2-main", + "sha256": "d163ee19b42ea0236a94f3eccb402292c5ba9987db03accf967027cc163192b1", + "cueFormat": "historical compact arrow; ordinary-space failures retained separately", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT published-1.0.3-main / candidate: legal old calls preserve preview and control identity", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "published-1.0.3-main", + "sha256": "2c5a97f61cc2c94c7684e7c0fc0bdf3cfad8e641a73cec8e534a1854754d8066", + "cueFormat": "historical compact arrow; ordinary-space failures retained separately", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT 1.0.1 / published-5.1.7: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "chromium", + "name": "vtt-historical-conflict", + "data": { + "core": "published-5.1.7", + "plugin": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "state": { + "error": "Can't add an existing [thumbnails] to the [control]", + "sameReservedControl": true + }, + "scope": "Existing incompatibility, not successful old-plugin/new-core acceptance and not a newly introduced refactor regression" + } + }, + { + "title": "VTT 1.0.1 / published: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "chromium", + "name": "vtt-historical-conflict", + "data": { + "core": "published", + "plugin": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "state": { + "error": "Can't add an existing [thumbnails] to the [control]", + "sameReservedControl": true + }, + "scope": "Existing incompatibility, not successful old-plugin/new-core acceptance and not a newly introduced refactor regression" + } + }, + { + "title": "VTT 1.0.1 / candidate: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "chromium", + "name": "vtt-historical-conflict", + "data": { + "core": "candidate", + "plugin": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "state": { + "error": "Can't add an existing [thumbnails] to the [control]", + "sameReservedControl": true + }, + "scope": "Existing incompatibility, not successful old-plugin/new-core acceptance and not a newly introduced refactor regression" + } + }, + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.6", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-red-cell", + "sha256": "0df5f779b9341de9e398c9ae92e43cf2d6205d5b1a59e82525f78003a384be83", + "bytes": 274 + }, + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-blue-cell", + "sha256": "1911bb3ec606ac29c159d60f3a646892789633f42183a5ccf9617144e4d90c82", + "bytes": 313 + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.7", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-red-cell", + "sha256": "0df5f779b9341de9e398c9ae92e43cf2d6205d5b1a59e82525f78003a384be83", + "bytes": 274 + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-blue-cell", + "sha256": "1911bb3ec606ac29c159d60f3a646892789633f42183a5ccf9617144e4d90c82", + "bytes": 313 + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.3.0", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-red-cell", + "sha256": "0df5f779b9341de9e398c9ae92e43cf2d6205d5b1a59e82525f78003a384be83", + "bytes": 274 + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-blue-cell", + "sha256": "1911bb3ec606ac29c159d60f3a646892789633f42183a5ccf9617144e4d90c82", + "bytes": 313 + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "published", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-red-cell", + "sha256": "0df5f779b9341de9e398c9ae92e43cf2d6205d5b1a59e82525f78003a384be83", + "bytes": 274 + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-blue-cell", + "sha256": "1911bb3ec606ac29c159d60f3a646892789633f42183a5ccf9617144e4d90c82", + "bytes": 313 + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-red-cell", + "sha256": "0df5f779b9341de9e398c9ae92e43cf2d6205d5b1a59e82525f78003a384be83", + "bytes": 274 + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "firefox", + "name": "vtt-blue-cell", + "sha256": "1911bb3ec606ac29c159d60f3a646892789633f42183a5ccf9617144e4d90c82", + "bytes": 313 + }, + { + "title": "VTT published-1.1.0-main / candidate: legal old calls preserve preview and control identity", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "published-1.1.0-main", + "sha256": "2d8e22cbd191bdac5a6c711b641590c2f8a90ba1aae185dd0e02a00baf000f8d", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT published-1.0.1-main / published-5.1.6: legal old calls preserve preview and control identity", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.6", + "implementation": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "cueFormat": "historical compact arrow; ordinary-space failures retained separately", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT published-1.0.2-main / candidate: legal old calls preserve preview and control identity", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "published-1.0.2-main", + "sha256": "d163ee19b42ea0236a94f3eccb402292c5ba9987db03accf967027cc163192b1", + "cueFormat": "historical compact arrow; ordinary-space failures retained separately", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT published-1.0.3-main / candidate: legal old calls preserve preview and control identity", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "published-1.0.3-main", + "sha256": "2c5a97f61cc2c94c7684e7c0fc0bdf3cfad8e641a73cec8e534a1854754d8066", + "cueFormat": "historical compact arrow; ordinary-space failures retained separately", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT 1.0.1 / published-5.1.7: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "firefox", + "name": "vtt-historical-conflict", + "data": { + "core": "published-5.1.7", + "plugin": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "state": { + "error": "Can't add an existing [thumbnails] to the [control]", + "sameReservedControl": true + }, + "scope": "Existing incompatibility, not successful old-plugin/new-core acceptance and not a newly introduced refactor regression" + } + }, + { + "title": "VTT 1.0.1 / published: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "firefox", + "name": "vtt-historical-conflict", + "data": { + "core": "published", + "plugin": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "state": { + "error": "Can't add an existing [thumbnails] to the [control]", + "sameReservedControl": true + }, + "scope": "Existing incompatibility, not successful old-plugin/new-core acceptance and not a newly introduced refactor regression" + } + }, + { + "title": "VTT 1.0.1 / candidate: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "firefox", + "name": "vtt-historical-conflict", + "data": { + "core": "candidate", + "plugin": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "state": { + "error": "Can't add an existing [thumbnails] to the [control]", + "sameReservedControl": true + }, + "scope": "Existing incompatibility, not successful old-plugin/new-core acceptance and not a newly introduced refactor regression" + } + }, + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.6", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-red-cell", + "sha256": "94f3278184b434f1cb40ae6863beebaae565f41d92dff677032d9e2c895a9ff3", + "bytes": 890 + }, + { + "title": "VTT candidate / published-5.1.6: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-blue-cell", + "sha256": "1030f7362464dcd3496f9585dfd0e876630c7cc854e05cf89a96bdd5bf6904ed", + "bytes": 911 + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.7", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-red-cell", + "sha256": "94f3278184b434f1cb40ae6863beebaae565f41d92dff677032d9e2c895a9ff3", + "bytes": 890 + }, + { + "title": "VTT candidate / published-5.1.7: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-blue-cell", + "sha256": "1030f7362464dcd3496f9585dfd0e876630c7cc854e05cf89a96bdd5bf6904ed", + "bytes": 911 + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.3.0", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-red-cell", + "sha256": "94f3278184b434f1cb40ae6863beebaae565f41d92dff677032d9e2c895a9ff3", + "bytes": 890 + }, + { + "title": "VTT candidate / published-5.3.0: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-blue-cell", + "sha256": "1030f7362464dcd3496f9585dfd0e876630c7cc854e05cf89a96bdd5bf6904ed", + "bytes": 911 + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "published", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-red-cell", + "sha256": "94f3278184b434f1cb40ae6863beebaae565f41d92dff677032d9e2c895a9ff3", + "bytes": 890 + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-blue-cell", + "sha256": "1030f7362464dcd3496f9585dfd0e876630c7cc854e05cf89a96bdd5bf6904ed", + "bytes": 911 + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-red-cell", + "sha256": "94f3278184b434f1cb40ae6863beebaae565f41d92dff677032d9e2c895a9ff3", + "bytes": 890 + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "webkit", + "name": "vtt-blue-cell", + "sha256": "1030f7362464dcd3496f9585dfd0e876630c7cc854e05cf89a96bdd5bf6904ed", + "bytes": 911 + }, + { + "title": "VTT published-1.1.0-main / candidate: legal old calls preserve preview and control identity", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "published-1.1.0-main", + "sha256": "2d8e22cbd191bdac5a6c711b641590c2f8a90ba1aae185dd0e02a00baf000f8d", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT published-1.0.1-main / published-5.1.6: legal old calls preserve preview and control identity", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.6", + "implementation": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "cueFormat": "historical compact arrow; ordinary-space failures retained separately", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT published-1.0.2-main / candidate: legal old calls preserve preview and control identity", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "published-1.0.2-main", + "sha256": "d163ee19b42ea0236a94f3eccb402292c5ba9987db03accf967027cc163192b1", + "cueFormat": "historical compact arrow; ordinary-space failures retained separately", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT published-1.0.3-main / candidate: legal old calls preserve preview and control identity", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "published-1.0.3-main", + "sha256": "2c5a97f61cc2c94c7684e7c0fc0bdf3cfad8e641a73cec8e534a1854754d8066", + "cueFormat": "historical compact arrow; ordinary-space failures retained separately", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT 1.0.1 / published-5.1.7: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "webkit", + "name": "vtt-historical-conflict", + "data": { + "core": "published-5.1.7", + "plugin": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "state": { + "error": "Can't add an existing [thumbnails] to the [control]", + "sameReservedControl": true + }, + "scope": "Existing incompatibility, not successful old-plugin/new-core acceptance and not a newly introduced refactor regression" + } + }, + { + "title": "VTT 1.0.1 / published: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "webkit", + "name": "vtt-historical-conflict", + "data": { + "core": "published", + "plugin": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "state": { + "error": "Can't add an existing [thumbnails] to the [control]", + "sameReservedControl": true + }, + "scope": "Existing incompatibility, not successful old-plugin/new-core acceptance and not a newly introduced refactor regression" + } + }, + { + "title": "VTT 1.0.1 / candidate: pre-existing reserved thumbnails name conflict is retained as historical evidence", + "engine": "webkit", + "name": "vtt-historical-conflict", + "data": { + "core": "candidate", + "plugin": "published-1.0.1-main", + "sha256": "d247f01b72f6bc51e3107006296ae6d198f4478a6d3dd350bc8741221a1ea5ea", + "state": { + "error": "Can't add an existing [thumbnails] to the [control]", + "sameReservedControl": true + }, + "scope": "Existing incompatibility, not successful old-plugin/new-core acceptance and not a newly introduced refactor regression" + } + }, + { + "title": "VTT candidate / published-5.1.6: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.6", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.6: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published-5.1.6", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / published-5.1.7: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.7", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.7: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published-5.1.7", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / published-5.3.0: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.3.0", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.3.0: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published-5.3.0", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / published: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "published", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / candidate: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / candidate: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "chromium", + "name": "vtt-mobile-event-integration", + "data": { + "core": "candidate", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / published-5.1.6: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.6", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.6: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published-5.1.6", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / published-5.1.7: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.7", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.7: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published-5.1.7", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / published-5.3.0: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.3.0", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.3.0: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published-5.3.0", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / published: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "published", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / candidate: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / candidate: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "firefox", + "name": "vtt-mobile-event-integration", + "data": { + "core": "candidate", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / published-5.1.6: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.6", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.6: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published-5.1.6", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / published-5.1.7: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.1.7", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.1.7: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published-5.1.7", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / published-5.3.0: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "published-5.3.0", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published-5.3.0: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published-5.3.0", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / published: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "published", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / published: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "name": "vtt-mobile-event-integration", + "data": { + "core": "published", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT candidate / candidate: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "name": "vtt-combination-inputs", + "data": { + "core": "candidate", + "implementation": "candidate", + "sha256": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "cueFormat": "standard spaced arrow", + "mobile": "desktop unless test declares an emulated user agent; no physical-device inference" + } + }, + { + "title": "VTT candidate / candidate: emulated mobile drag routes through core progress and releases hiding timer", + "engine": "webkit", + "name": "vtt-mobile-event-integration", + "data": { + "core": "candidate", + "sample": { + "mobile": true, + "events": [ + { + "type": "played", + "percentage": 0.25, + "nativeType": "touchstart" + }, + { + "type": "played", + "percentage": 0.734375, + "nativeType": "touchmove" + } + ], + "position": "-80px 0px", + "display": "flex", + "time": 5.875, + "duration": 8 + }, + "scope": "Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance." + } + }, + { + "title": "VTT native published core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "chromium", + "name": "selected-sprite", + "sha256": "31e53420af42118d4824811656010e9154f814c35afe6fa4afea145572e76cf1", + "bytes": 971 + }, + { + "title": "VTT native published core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "chromium", + "name": "vtt-candidate", + "data": { + "core": "published", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "pixels": [ + [ + 255, + 0, + 0, + 255 + ], + [ + 0, + 0, + 255, + 255 + ] + ] + } + }, + { + "title": "VTT native published core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "chromium", + "name": "vtt-candidate", + "data": { + "core": "published", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "recoveredAfter": { + "name": "TypeError", + "message": "Invalid VTT thumbnail at line 4: rectangle coordinates must be finite non-negative decimals" + } + } + }, + { + "title": "VTT native published core: destroy aborts a pending native fetch and settles registration", + "engine": "chromium", + "name": "vtt-candidate", + "data": { + "core": "published", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "nativeAbort": true + } + }, + { + "title": "VTT native candidate core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "chromium", + "name": "selected-sprite", + "sha256": "31e53420af42118d4824811656010e9154f814c35afe6fa4afea145572e76cf1", + "bytes": 971 + }, + { + "title": "VTT native candidate core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "chromium", + "name": "vtt-candidate", + "data": { + "core": "candidate", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "pixels": [ + [ + 255, + 0, + 0, + 255 + ], + [ + 0, + 0, + 255, + 255 + ] + ] + } + }, + { + "title": "VTT native candidate core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "chromium", + "name": "vtt-candidate", + "data": { + "core": "candidate", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "recoveredAfter": { + "name": "TypeError", + "message": "Invalid VTT thumbnail at line 4: rectangle coordinates must be finite non-negative decimals" + } + } + }, + { + "title": "VTT native candidate core: destroy aborts a pending native fetch and settles registration", + "engine": "chromium", + "name": "vtt-candidate", + "data": { + "core": "candidate", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "nativeAbort": true + } + }, + { + "title": "VTT native published core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "firefox", + "name": "selected-sprite", + "sha256": "371f6856cc1c6b8b0dfe9adfc4ef32d5d6a7fcb7733a2714640a46428e4859e4", + "bytes": 1030 + }, + { + "title": "VTT native published core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "firefox", + "name": "vtt-candidate", + "data": { + "core": "published", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "pixels": [ + [ + 255, + 0, + 0, + 255 + ], + [ + 0, + 0, + 255, + 255 + ] + ] + } + }, + { + "title": "VTT native published core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "firefox", + "name": "vtt-candidate", + "data": { + "core": "published", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "recoveredAfter": { + "name": "TypeError", + "message": "Invalid VTT thumbnail at line 4: rectangle coordinates must be finite non-negative decimals" + } + } + }, + { + "title": "VTT native published core: destroy aborts a pending native fetch and settles registration", + "engine": "firefox", + "name": "vtt-candidate", + "data": { + "core": "published", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "nativeAbort": true + } + }, + { + "title": "VTT native candidate core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "firefox", + "name": "selected-sprite", + "sha256": "371f6856cc1c6b8b0dfe9adfc4ef32d5d6a7fcb7733a2714640a46428e4859e4", + "bytes": 1030 + }, + { + "title": "VTT native candidate core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "firefox", + "name": "vtt-candidate", + "data": { + "core": "candidate", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "pixels": [ + [ + 255, + 0, + 0, + 255 + ], + [ + 0, + 0, + 255, + 255 + ] + ] + } + }, + { + "title": "VTT native candidate core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "firefox", + "name": "vtt-candidate", + "data": { + "core": "candidate", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "recoveredAfter": { + "name": "TypeError", + "message": "Invalid VTT thumbnail at line 4: rectangle coordinates must be finite non-negative decimals" + } + } + }, + { + "title": "VTT native candidate core: destroy aborts a pending native fetch and settles registration", + "engine": "firefox", + "name": "vtt-candidate", + "data": { + "core": "candidate", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "nativeAbort": true + } + }, + { + "title": "VTT native published core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "webkit", + "name": "selected-sprite", + "sha256": "1813f0288c493ea00e5cbdf5a869876f7fd281f6b300c21756bda468578b2fe1", + "bytes": 2651 + }, + { + "title": "VTT native published core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "webkit", + "name": "vtt-candidate", + "data": { + "core": "published", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "pixels": [ + [ + 255, + 0, + 0, + 255 + ], + [ + 0, + 0, + 255, + 255 + ] + ] + } + }, + { + "title": "VTT native published core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "webkit", + "name": "vtt-candidate", + "data": { + "core": "published", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "recoveredAfter": { + "name": "TypeError", + "message": "Invalid VTT thumbnail at line 4: rectangle coordinates must be finite non-negative decimals" + } + } + }, + { + "title": "VTT native published core: destroy aborts a pending native fetch and settles registration", + "engine": "webkit", + "name": "vtt-candidate", + "data": { + "core": "published", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "nativeAbort": true + } + }, + { + "title": "VTT native candidate core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "webkit", + "name": "selected-sprite", + "sha256": "1813f0288c493ea00e5cbdf5a869876f7fd281f6b300c21756bda468578b2fe1", + "bytes": 2651 + }, + { + "title": "VTT native candidate core: real progress hover selects sprite regions and destroy removes owned UI", + "engine": "webkit", + "name": "vtt-candidate", + "data": { + "core": "candidate", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "pixels": [ + [ + 255, + 0, + 0, + 255 + ], + [ + 0, + 0, + 255, + 255 + ] + ] + } + }, + { + "title": "VTT native candidate core: malformed sprite rejects before mounting and a corrected registration recovers", + "engine": "webkit", + "name": "vtt-candidate", + "data": { + "core": "candidate", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "recoveredAfter": { + "name": "TypeError", + "message": "Invalid VTT thumbnail at line 4: rectangle coordinates must be finite non-negative decimals" + } + } + }, + { + "title": "VTT native candidate core: destroy aborts a pending native fetch and settles registration", + "engine": "webkit", + "name": "vtt-candidate", + "data": { + "core": "candidate", + "implementation": "04a472a60d199ea580490f5223d76de26bf25ca48134a4578446852d79dd9ac5", + "nativeAbort": true + } + } + ] + }, + "initialFailure": { + "file": "refactor/.cache/vtt-combinations-initial/report.json", + "sha256": "0a15f0c933f5da9633eeb87e172db3b5262d9262954423ea9709817ba0316d8b", + "stats": { + "startTime": "2026-09-14T01:42:14.517Z", + "duration": 43140.433000000005, + "expected": 9, + "skipped": 0, + "unexpected": 18, + "flaky": 0 + }, + "cases": [ + { + "title": "VTT candidate / published: actual sprite pixels, chapter, web fullscreen and source switch", + "engine": "chromium", + "status": "failed", + "errors": [ + "Error: page.evaluate: TypeError: Cannot read properties of undefined (reading 'composedPath')\n at R (http://127.0.0.1:8084/published/artplayer.js:7:7893)\n at C (http://127.0.0.1:8084/published/artplayer.js:7:6740)\n at http://127.0.0.1:8084/published/artplayer.js:7:19093\n at Kt.emit (http://127.0.0.1:8084/published/artplayer.js:7:130191)\n at eval (eval at evaluate (:311:30), :3:20)\n at UtilityScript.evaluate (:313:16)\n at UtilityScript. (:1:44)\n at R (http://127.0.0.1:8084/published/artplayer.js:7:7893)\n at C (http://127.0.0.1:8084/published/artplayer.js:7:6740)\n at http://127.0.0.1:8084/published/artplayer.js:7:19093\n at Kt.emit (http://127.0.0.1:8084/published/artplayer.js:7:130191)\n at eval (eval at evaluate (:311:30), :3:20)\n at UtilityScript.evaluate (:313:16)\n at UtilityScript. (:1:44)\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:61:18" + ] + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, web fullscreen and source switch", + "engine": "chromium", + "status": "failed", + "errors": [ + "Error: page.evaluate: TypeError: Cannot read properties of undefined (reading 'composedPath')\n at getComposedPath (http://127.0.0.1:8084/candidate/artplayer.js:477:15)\n at includeFromEvent (http://127.0.0.1:8084/candidate/artplayer.js:490:12)\n at setBar (http://127.0.0.1:8084/candidate/artplayer.js:2426:13)\n at guarded (http://127.0.0.1:8084/candidate/artplayer.js:461:16)\n at Artplayer.emit (http://127.0.0.1:8084/candidate/artplayer.js:9317:18)\n at eval (eval at evaluate (:311:30), :3:20)\n at UtilityScript.evaluate (:313:16)\n at UtilityScript. (:1:44)\n at getComposedPath (http://127.0.0.1:8084/candidate/artplayer.js:477:15)\n at includeFromEvent (http://127.0.0.1:8084/candidate/artplayer.js:490:12)\n at setBar (http://127.0.0.1:8084/candidate/artplayer.js:2426:13)\n at guarded (http://127.0.0.1:8084/candidate/artplayer.js:461:16)\n at Artplayer.emit (http://127.0.0.1:8084/candidate/artplayer.js:9317:18)\n at eval (eval at evaluate (:311:30), :3:20)\n at UtilityScript.evaluate (:313:16)\n at UtilityScript. (:1:44)\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:61:18" + ] + }, + { + "title": "VTT published-1.1.0-main / candidate core: legal old calls preserve preview and control identity", + "engine": "chromium", + "status": "failed", + "errors": [ + "Error: page.evaluate: TypeError: Cannot read properties of undefined (reading 'composedPath')\n at getComposedPath (http://127.0.0.1:8084/candidate/artplayer.js:477:15)\n at includeFromEvent (http://127.0.0.1:8084/candidate/artplayer.js:490:12)\n at setBar (http://127.0.0.1:8084/candidate/artplayer.js:2426:13)\n at guarded (http://127.0.0.1:8084/candidate/artplayer.js:461:16)\n at Artplayer.emit (http://127.0.0.1:8084/candidate/artplayer.js:9317:18)\n at eval (eval at evaluate (:311:30), :3:20)\n at async :337:30\n at getComposedPath (http://127.0.0.1:8084/candidate/artplayer.js:477:15)\n at includeFromEvent (http://127.0.0.1:8084/candidate/artplayer.js:490:12)\n at setBar (http://127.0.0.1:8084/candidate/artplayer.js:2426:13)\n at guarded (http://127.0.0.1:8084/candidate/artplayer.js:461:16)\n at Artplayer.emit (http://127.0.0.1:8084/candidate/artplayer.js:9317:18)\n at eval (eval at evaluate (:311:30), :3:20)\n at async :337:30\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:100:18" + ] + }, + { + "title": "VTT published-1.0.1-main / candidate core: legal old calls preserve preview and control identity", + "engine": "chromium", + "status": "failed", + "errors": [ + "Error: page.evaluate: ArtPlayerError: Can't add an existing [thumbnails] to the [control]\n at errorHandle (http://127.0.0.1:8084/candidate/artplayer.js:729:13)\n at Control.add (http://127.0.0.1:8084/candidate/artplayer.js:1349:7)\n at Control.add (http://127.0.0.1:8084/candidate/artplayer.js:3139:13)\n at Artplayer. (:8:1533)\n at async eval (eval at evaluate (:311:30), :3:5)\n at async :337:30\n at errorHandle (http://127.0.0.1:8084/candidate/artplayer.js:729:13)\n at Control.add (http://127.0.0.1:8084/candidate/artplayer.js:1349:7)\n at Control.add (http://127.0.0.1:8084/candidate/artplayer.js:3139:13)\n at Artplayer. (:8:1533)\n at async eval (eval at evaluate (:311:30), :3:5)\n at async :337:30\n at install (D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:27:14)\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:91:22" + ] + }, + { + "title": "VTT published-1.0.2-main / candidate core: legal old calls preserve preview and control identity", + "engine": "chromium", + "status": "failed", + "errors": [ + "Error: page.evaluate: TypeError: Cannot read properties of undefined (reading 'composedPath')\n at getComposedPath (http://127.0.0.1:8084/candidate/artplayer.js:477:15)\n at includeFromEvent (http://127.0.0.1:8084/candidate/artplayer.js:490:12)\n at setBar (http://127.0.0.1:8084/candidate/artplayer.js:2426:13)\n at guarded (http://127.0.0.1:8084/candidate/artplayer.js:461:16)\n at Artplayer.emit (http://127.0.0.1:8084/candidate/artplayer.js:9317:18)\n at eval (eval at evaluate (:311:30), :3:20)\n at async :337:30\n at getComposedPath (http://127.0.0.1:8084/candidate/artplayer.js:477:15)\n at includeFromEvent (http://127.0.0.1:8084/candidate/artplayer.js:490:12)\n at setBar (http://127.0.0.1:8084/candidate/artplayer.js:2426:13)\n at guarded (http://127.0.0.1:8084/candidate/artplayer.js:461:16)\n at Artplayer.emit (http://127.0.0.1:8084/candidate/artplayer.js:9317:18)\n at eval (eval at evaluate (:311:30), :3:20)\n at async :337:30\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:100:18" + ] + }, + { + "title": "VTT published-1.0.3-main / candidate core: legal old calls preserve preview and control identity", + "engine": "chromium", + "status": "failed", + "errors": [ + "Error: page.evaluate: TypeError: Cannot read properties of undefined (reading 'composedPath')\n at getComposedPath (http://127.0.0.1:8084/candidate/artplayer.js:477:15)\n at includeFromEvent (http://127.0.0.1:8084/candidate/artplayer.js:490:12)\n at setBar (http://127.0.0.1:8084/candidate/artplayer.js:2426:13)\n at guarded (http://127.0.0.1:8084/candidate/artplayer.js:461:16)\n at Artplayer.emit (http://127.0.0.1:8084/candidate/artplayer.js:9317:18)\n at eval (eval at evaluate (:311:30), :3:20)\n at async :337:30\n at getComposedPath (http://127.0.0.1:8084/candidate/artplayer.js:477:15)\n at includeFromEvent (http://127.0.0.1:8084/candidate/artplayer.js:490:12)\n at setBar (http://127.0.0.1:8084/candidate/artplayer.js:2426:13)\n at guarded (http://127.0.0.1:8084/candidate/artplayer.js:461:16)\n at Artplayer.emit (http://127.0.0.1:8084/candidate/artplayer.js:9317:18)\n at eval (eval at evaluate (:311:30), :3:20)\n at async :337:30\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:100:18" + ] + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, web fullscreen and source switch", + "engine": "firefox", + "status": "failed", + "errors": [ + "Error: page.evaluate: can't access property \"composedPath\", t is undefined\nR@http://127.0.0.1:8084/published/artplayer.js:7:7891\nC@http://127.0.0.1:8084/published/artplayer.js:7:6740\nmt/ eval:3:20\nevaluate@debugger eval code:313:16\n@debugger eval code:1:44\n@debugger eval code:1:62\n\n at R@http://127.0.0.1:8084/published/artplayer.js:7:7891\n at C@http://127.0.0.1:8084/published/artplayer.js:7:6740\n at mt/ eval:3:20\n at evaluate@debugger eval code:313:16\n at @debugger eval code:1:44\n at @debugger eval code:1:62\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:61:18" + ] + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, web fullscreen and source switch", + "engine": "firefox", + "status": "failed", + "errors": [ + "Error: page.evaluate: can't access property \"composedPath\", event is undefined\ngetComposedPath@http://127.0.0.1:8084/candidate/artplayer.js:477:9\nincludeFromEvent@http://127.0.0.1:8084/candidate/artplayer.js:490:12\nsetBar@http://127.0.0.1:8084/candidate/artplayer.js:2426:29\nguarded@http://127.0.0.1:8084/candidate/artplayer.js:461:16\nemit@http://127.0.0.1:8084/candidate/artplayer.js:9317:18\n@debugger eval code line 311 > eval:3:20\nevaluate@debugger eval code:313:16\n@debugger eval code:1:44\n@debugger eval code:1:62\n\n at getComposedPath@http://127.0.0.1:8084/candidate/artplayer.js:477:9\n at includeFromEvent@http://127.0.0.1:8084/candidate/artplayer.js:490:12\n at setBar@http://127.0.0.1:8084/candidate/artplayer.js:2426:29\n at guarded@http://127.0.0.1:8084/candidate/artplayer.js:461:16\n at emit@http://127.0.0.1:8084/candidate/artplayer.js:9317:18\n at @debugger eval code line 311 > eval:3:20\n at evaluate@debugger eval code:313:16\n at @debugger eval code:1:44\n at @debugger eval code:1:62\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:61:18" + ] + }, + { + "title": "VTT published-1.1.0-main / candidate core: legal old calls preserve preview and control identity", + "engine": "firefox", + "status": "failed", + "errors": [ + "Error: page.evaluate: can't access property \"composedPath\", event is undefined\ngetComposedPath@http://127.0.0.1:8084/candidate/artplayer.js:477:9\nincludeFromEvent@http://127.0.0.1:8084/candidate/artplayer.js:490:12\nsetBar@http://127.0.0.1:8084/candidate/artplayer.js:2426:29\nguarded@http://127.0.0.1:8084/candidate/artplayer.js:461:16\nemit@http://127.0.0.1:8084/candidate/artplayer.js:9317:18\n@debugger eval code line 311 > eval:3:20\nasync*evaluate@debugger eval code:313:16\n@debugger eval code:1:44\n@debugger eval code:1:62\n\n at getComposedPath@http://127.0.0.1:8084/candidate/artplayer.js:477:9\n at includeFromEvent@http://127.0.0.1:8084/candidate/artplayer.js:490:12\n at setBar@http://127.0.0.1:8084/candidate/artplayer.js:2426:29\n at guarded@http://127.0.0.1:8084/candidate/artplayer.js:461:16\n at emit@http://127.0.0.1:8084/candidate/artplayer.js:9317:18\n at @debugger eval code line 311 > eval:3:20\n at async*evaluate@debugger eval code:313:16\n at @debugger eval code:1:44\n at @debugger eval code:1:62\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:100:18" + ] + }, + { + "title": "VTT published-1.0.1-main / candidate core: legal old calls preserve preview and control identity", + "engine": "firefox", + "status": "failed", + "errors": [ + "Error: page.evaluate: Can't add an existing [thumbnails] to the [control]\nerrorHandle@http://127.0.0.1:8084/candidate/artplayer.js:729:13\nadd@http://127.0.0.1:8084/candidate/artplayer.js:1349:18\nadd@http://127.0.0.1:8084/candidate/artplayer.js:3139:13\n.YTqB2 injectedScript:8:1533\nasync*add@http://127.0.0.1:8084/candidate/artplayer.js:7213:29\n@debugger eval code line 311 > eval:3:30\nevaluate@debugger eval code:313:16\n@debugger eval code:1:44\n@debugger eval code:1:62\n\n at errorHandle@http://127.0.0.1:8084/candidate/artplayer.js:729:13\n at add@http://127.0.0.1:8084/candidate/artplayer.js:1349:18\n at add@http://127.0.0.1:8084/candidate/artplayer.js:3139:13\n at .YTqB2 injectedScript:8:1533\n at async*add@http://127.0.0.1:8084/candidate/artplayer.js:7213:29\n at @debugger eval code line 311 > eval:3:30\n at evaluate@debugger eval code:313:16\n at @debugger eval code:1:44\n at @debugger eval code:1:62\n at install (D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:27:14)\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:91:22" + ] + }, + { + "title": "VTT published-1.0.2-main / candidate core: legal old calls preserve preview and control identity", + "engine": "firefox", + "status": "failed", + "errors": [ + "Error: page.evaluate: can't access property \"composedPath\", event is undefined\ngetComposedPath@http://127.0.0.1:8084/candidate/artplayer.js:477:9\nincludeFromEvent@http://127.0.0.1:8084/candidate/artplayer.js:490:12\nsetBar@http://127.0.0.1:8084/candidate/artplayer.js:2426:29\nguarded@http://127.0.0.1:8084/candidate/artplayer.js:461:16\nemit@http://127.0.0.1:8084/candidate/artplayer.js:9317:18\n@debugger eval code line 311 > eval:3:20\nasync*evaluate@debugger eval code:313:16\n@debugger eval code:1:44\n@debugger eval code:1:62\n\n at getComposedPath@http://127.0.0.1:8084/candidate/artplayer.js:477:9\n at includeFromEvent@http://127.0.0.1:8084/candidate/artplayer.js:490:12\n at setBar@http://127.0.0.1:8084/candidate/artplayer.js:2426:29\n at guarded@http://127.0.0.1:8084/candidate/artplayer.js:461:16\n at emit@http://127.0.0.1:8084/candidate/artplayer.js:9317:18\n at @debugger eval code line 311 > eval:3:20\n at async*evaluate@debugger eval code:313:16\n at @debugger eval code:1:44\n at @debugger eval code:1:62\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:100:18" + ] + }, + { + "title": "VTT published-1.0.3-main / candidate core: legal old calls preserve preview and control identity", + "engine": "firefox", + "status": "failed", + "errors": [ + "Error: page.evaluate: can't access property \"composedPath\", event is undefined\ngetComposedPath@http://127.0.0.1:8084/candidate/artplayer.js:477:9\nincludeFromEvent@http://127.0.0.1:8084/candidate/artplayer.js:490:12\nsetBar@http://127.0.0.1:8084/candidate/artplayer.js:2426:29\nguarded@http://127.0.0.1:8084/candidate/artplayer.js:461:16\nemit@http://127.0.0.1:8084/candidate/artplayer.js:9317:18\n@debugger eval code line 311 > eval:3:20\nasync*evaluate@debugger eval code:313:16\n@debugger eval code:1:44\n@debugger eval code:1:62\n\n at getComposedPath@http://127.0.0.1:8084/candidate/artplayer.js:477:9\n at includeFromEvent@http://127.0.0.1:8084/candidate/artplayer.js:490:12\n at setBar@http://127.0.0.1:8084/candidate/artplayer.js:2426:29\n at guarded@http://127.0.0.1:8084/candidate/artplayer.js:461:16\n at emit@http://127.0.0.1:8084/candidate/artplayer.js:9317:18\n at @debugger eval code line 311 > eval:3:20\n at async*evaluate@debugger eval code:313:16\n at @debugger eval code:1:44\n at @debugger eval code:1:62\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:100:18" + ] + }, + { + "title": "VTT candidate / published: actual sprite pixels, chapter, web fullscreen and source switch", + "engine": "webkit", + "status": "failed", + "errors": [ + "Error: page.evaluate: TypeError: undefined is not an object (evaluating 't.composedPath')\n\n 59 | await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThan(0.1)\n 60 | await page.click('#pause')\n> 61 | await page.evaluate(() => {\n | ^\n 62 | window.art.fullscreenWeb = true\n 63 | window.art.emit('setBar', 'hover', 0.5)\n 64 | })\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:61:18" + ] + }, + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, web fullscreen and source switch", + "engine": "webkit", + "status": "failed", + "errors": [ + "Error: page.evaluate: TypeError: undefined is not an object (evaluating 'event.composedPath')\n\n 59 | await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThan(0.1)\n 60 | await page.click('#pause')\n> 61 | await page.evaluate(() => {\n | ^\n 62 | window.art.fullscreenWeb = true\n 63 | window.art.emit('setBar', 'hover', 0.5)\n 64 | })\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:61:18" + ] + }, + { + "title": "VTT published-1.1.0-main / candidate core: legal old calls preserve preview and control identity", + "engine": "webkit", + "status": "failed", + "errors": [ + "Error: page.evaluate: TypeError: undefined is not an object (evaluating 'event.composedPath')\n\n 98 | expect(centerPixel(await preview.screenshot())).toEqual([0, 0, 255, 255])\n 99 | expect(await page.evaluate(name => window.art.controls[name] === window.vttControl, name)).toBe(true)\n> 100 | await page.evaluate(async () => {\n | ^\n 101 | await window.art.switchUrl('/test/pattern.mp4?old-plugin')\n 102 | window.art.emit('setBar', 'hover', 0.25)\n 103 | })\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:100:18" + ] + }, + { + "title": "VTT published-1.0.1-main / candidate core: legal old calls preserve preview and control identity", + "engine": "webkit", + "status": "failed", + "errors": [ + "Error: page.evaluate: ArtPlayerError: Can't add an existing [thumbnails] to the [control]\n\n 25 | await page.goto(`/test/player.html?core=${core}`)\n 26 | await page.addScriptTag({ content: `(() => { const module = { exports: {} }; const exports = module.exports; ${implementation.code}; window.vttFactory = module.exports.default || module.exports; })();` })\n> 27 | await page.evaluate(async () => {\n | ^\n 28 | window.createPlayer('/test/pattern.mp4', true)\n 29 | await window.art.plugins.add(window.vttFactory({ vtt: '/test/vtt-combination/cues.vtt' }))\n 30 | window.vttControl = window.art.controls['vtt-thumbnail'] || window.art.controls.thumbnails\n at install (D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:27:14)\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:91:22" + ] + }, + { + "title": "VTT published-1.0.2-main / candidate core: legal old calls preserve preview and control identity", + "engine": "webkit", + "status": "failed", + "errors": [ + "Error: page.evaluate: TypeError: undefined is not an object (evaluating 'event.composedPath')\n\n 98 | expect(centerPixel(await preview.screenshot())).toEqual([0, 0, 255, 255])\n 99 | expect(await page.evaluate(name => window.art.controls[name] === window.vttControl, name)).toBe(true)\n> 100 | await page.evaluate(async () => {\n | ^\n 101 | await window.art.switchUrl('/test/pattern.mp4?old-plugin')\n 102 | window.art.emit('setBar', 'hover', 0.25)\n 103 | })\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:100:18" + ] + }, + { + "title": "VTT published-1.0.3-main / candidate core: legal old calls preserve preview and control identity", + "engine": "webkit", + "status": "failed", + "errors": [ + "Error: page.evaluate: TypeError: undefined is not an object (evaluating 'event.composedPath')\n\n 98 | expect(centerPixel(await preview.screenshot())).toEqual([0, 0, 255, 255])\n 99 | expect(await page.evaluate(name => window.art.controls[name] === window.vttControl, name)).toBe(true)\n> 100 | await page.evaluate(async () => {\n | ^\n 101 | await window.art.switchUrl('/test/pattern.mp4?old-plugin')\n 102 | window.art.emit('setBar', 'hover', 0.25)\n 103 | })\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:100:18" + ] + } + ], + "disposition": "15 test calls omitted the newer hover handler event argument; replaced with real pointer movement. Three VTT 1.0.1 reserved-control failures now have separate historical-pair assertions and remain an open compatibility boundary." + }, + "fullscreenFailure": { + "file": "refactor/.cache/vtt-combinations-fullscreen-initial/report.json", + "sha256": "3b6f94eac15d0d7a4107387773e233a484f093fa1fb8d85a6971f060094a49b2", + "stats": { + "startTime": "2026-09-14T01:48:33.902Z", + "duration": 48057.633, + "expected": 14, + "skipped": 0, + "unexpected": 1, + "flaky": 0 + }, + "cases": [ + { + "title": "VTT candidate / candidate: actual sprite pixels, chapter, native/web fullscreen and source switch", + "engine": "chromium", + "status": "timedOut", + "errors": [ + "\u001b[31mTest timeout of 20000ms exceeded.\u001b[39m", + "\u001b[31mTest timeout of 20000ms exceeded.\u001b[39m", + "Error: page.evaluate: Target page, context or browser has been closed\n\n 103 | }\n 104 | finally {\n> 105 | await page.evaluate(() => {\n | ^\n 106 | if (!window.art.isDestroy)\n 107 | window.art.destroy()\n 108 | })\n at D:\\github\\ArtPlayer\\test\\browser\\vtt-thumbnail-combinations.spec.js:105:18" + ] + } + ], + "disposition": "Chromium candidate native fullscreen entered, but screenshot began on a hidden preview and timed out. Stable/actionable progress hover and explicit visible/background assertions added. Final pass is not a production fix claim." + }, + "logs": { + "test-vtt-thumbnail": { + "file": "refactor/.cache/vtt-combinations-test-vtt-thumbnail.log", + "sha256": "b88962cddfba564b766f53419fbfb75e2e6bc33a9f83d0c2aa817e71d6e18ac3", + "exitCode": 0, + "pass": 252 + }, + "test-ci": { + "file": "refactor/.cache/vtt-combinations-test-ci.log", + "sha256": "39043cfb0f7bf8f8aa1f0e9945608c182f95c6d55af78cab4a4bbc48267688b1", + "exitCode": 0, + "pass": 50 + }, + "lint": { + "file": "refactor/.cache/vtt-combinations-lint.log", + "sha256": "1c10938a596c4460ac4cc741c953128b2251b60837ed7c8c0963746fab5a1fd6", + "exitCode": 0 + } + }, + "protectedPathsUnchanged": [ + "packages/artplayer/src", + "packages/artplayer/public", + "packages/artplayer-plugin-vtt-thumbnail/src", + "packages/artplayer-plugin-vtt-thumbnail/types", + "packages/artplayer-plugin-vtt-thumbnail/dist", + "package.json", + "yarn.lock" + ], + "changes": { + "newDependencies": 0, + "newCoreFixture": { + "file": "refactor/baselines/vtt-thumbnail-core.json", + "sha256": "8a6380a5c20069fe84369bcbf44ffe60ff76c3b09c9a670a4e51951002d350fc", + "version": "5.1.6", + "members": 197 + }, + "test": { + "file": "test/browser/vtt-thumbnail-combinations.spec.js", + "sha256": "c6775432b057dc099da7e84e1c0cede77faeef12e0ee518d8ea0a5a10717a6dc" + }, + "server": { + "file": "test/browser/server.mjs", + "sha256": "cefab86a57900a32999cb26e65bf13f6aa354fe0d46a92618174869311dd67c8" + } + }, + "counts": { + "finalPassingAssertions": 69, + "expectedHistoricalIncompatibilityCases": 9, + "successfulBehaviorCases": 60, + "physicalMobileProfiles": 0 + }, + "limitations": [ + "Synthetic DOM touch payloads under an Android UA are not trusted OS input or physical Android/iOS", + "No installed tarball/legacy/ESM/actual editor acceptance in this checkpoint", + "Core 5.3.0 is an adjacent stable control, not npm 5.3.1", + "VTT 1.0.1 reserved control conflict remains open; do not call its failure assertions compatible", + "Final core candidate contents must be revalidated before publication", + "One initial fullscreen screenshot timeout is retained; final pass does not identify every cause" + ] +} diff --git a/refactor/baselines/vtt-thumbnail-core.json b/refactor/baselines/vtt-thumbnail-core.json new file mode 100644 index 000000000..c997567d5 --- /dev/null +++ b/refactor/baselines/vtt-thumbnail-core.json @@ -0,0 +1,246 @@ +{ + "schemaVersion": 1, + "task": "PKG-VTT-THUMB-05", + "sourceCommit": "4fa5c68be9d2d0d60d725c2a87b8d92a4dc8a85a", + "capturedAt": "2026-09-14T01:40:29.729Z", + "metadata": { + "url": "https://registry.npmjs.org/artplayer/5.1.6", + "status": 200, + "sha256": "e1f9c3b9887fc4143a1b5b89f001cb05c013dee611dd427bfb89f5d27ac6641d" + }, + "association": "Published core corresponding to usable VTT 1.0.1 archive source association; not a claimed minimum supported core. Core 5.3.1 was previously confirmed absent, so 5.3.0 is an adjacent stable comparison only.", + "release": { + "name": "artplayer", + "version": "5.1.6", + "metadataUrl": "https://registry.npmjs.org/artplayer/5.1.6", + "tarball": "https://registry.npmjs.org/artplayer/-/artplayer-5.1.6.tgz", + "integrity": "sha512-cqnVVLKCKWCryKl6Pmop50/Di9IQwOeNNQs5qWGzJDPiM0qTC7Q/Enusa+8JQid8p09fvp4Vc32ViSSYutdEeQ==", + "sha256": "0cd1e52efdb08a9b4c0184df45a1828ac956abf6bb9775b75e62c27beffc8bbc", + "files": { + "package/README.md": "2070b94087839a80dc01616a3114cbe2d3a4950018188f433752880daf7843f8", + "package/dist/artplayer.js": "6a7b1f3007ecda9f399e6cff606490dd745c495e19ce10e864a401ff09996172", + "package/dist/artplayer.legacy.js": "73c9193a8903e196adb7107e0c54a259609b06532004eb4da6fa3199d0a3ecb0", + "package/dist/i18n/cs.js": "0e353e313076ab5bc812c69d95c65dd4f41304be8cd3248b4fb1e66cc96361ef", + "package/dist/i18n/es.js": "e95e0c3d9e67d9aa9560a1d4ad34d7e524bb654573af63b583b0e230f397a918", + "package/dist/i18n/fa.js": "9e491847bacba5115af6c436461cce7b62b27913d73201a25f1ab33357fac820", + "package/dist/i18n/fr.js": "47f8c2741b8c65a71d02061b4d9659d5c9634c9b4670d16852d649fe5ca3674c", + "package/dist/i18n/id.js": "eb485192730c9a23aafb6b82b71cb3440e66790b9527fa735e1a23e132597170", + "package/dist/i18n/pl.js": "1ca2be239bda3d652431e8d4d8e41170d737b90193c151bbbfe9c1716d67c4f8", + "package/dist/i18n/ru.js": "ff7d1323f5fb21ead2834ae140da9e4a35cc2f80070f213623795b63daad79e6", + "package/dist/i18n/tr.js": "3981931b76ade9f8b8c6a862a18e702aed2644445b18a338bf2b58f9b16cde87", + "package/dist/i18n/zh-tw.js": "e6ed01c7cf38d47f36027ee916181aa5a243de4872d2fbcb2bca91668df84aa3", + "package/package.json": "412253a67616ed94c058a4eefdb5f0e7b863f696a92e5ac9e3e82c87ce5aec0d", + "package/src/config/index.js": "6419ff29300032a0c3535a396d7c977cf4ac09d9edc6b3a04eeec7256ea5f6d4", + "package/src/contextmenu/aspectRatio.js": "2e880ea29ed71d6e05192f10de246e0646754817f8135ac71bc4f082c7f60ec1", + "package/src/contextmenu/close.js": "4df0e913b1755409f034cbb54027b4518f05490ef66ad84b6f0e995899f41bc4", + "package/src/contextmenu/flip.js": "6f7574f7b5dfb0464e86e5910cc7b6f64ae06cbbef8d9a2a30086050a3952404", + "package/src/contextmenu/index.js": "2d1503ff5cd0ff038bbbdc9e52b7d8fc6b2c8d836e0474306ec1bb04b00cdfa3", + "package/src/contextmenu/info.js": "b7286de4d650d115493ef98891b77ff0deddb7e6c5725d93c8874890304885c1", + "package/src/contextmenu/playbackRate.js": "2b470a632bba8c40ffc46c00374e80bd3ea2325cf0c9e5ddfad81a03fd149847", + "package/src/contextmenu/version.js": "d15f750e2af7c9de92ce85fd765541cd0deb00dbff6fa7544b90ba2e00354f40", + "package/src/control/airplay.js": "3f5a5c82edfd8e0104311d1bc6224a216e8823d977f4d3d2efd2230232f1096e", + "package/src/control/fullscreen.js": "fab9bd25ace5b85b643207cc781fc1ccf73bdc6abdeeb35d7863cfe21ce25da3", + "package/src/control/fullscreenWeb.js": "c4e8f2ed78556ed5a1fef61477d4fd4acd2bbf2226b0969604cabea3b8cf8152", + "package/src/control/index.js": "6fa98c681854b5d1870f44dda4a96605888cb3c2ccc47e2294f86a372f468fff", + "package/src/control/pip.js": "abf03561ccf8209e58b961c32d013a24e190b275f5c420f237eb5c9eea836de7", + "package/src/control/playAndPause.js": "e29d017f0c629a583b970d08ffe91169d43c573e2fa50e5467182a3e2ca06d34", + "package/src/control/progress.js": "8fe464a3cdb45323b8e080cf9e0d8b7ef9e3046e87deac011f14a9607945c8c9", + "package/src/control/screenshot.js": "66d1baddda0e7aeecfa13b345b95c388e9b030e56ed41b6ab5bd7fd65305fb8c", + "package/src/control/setting.js": "5aafdb3a26b0526d38c1de2a721d818a61ea06c1c3ef9fce54aa467cb3999c7e", + "package/src/control/thumbnails.js": "5a0614ca37d8668e4ed9af51ac09ee7f7fc2c69ac49b56a43b764c9db5bb20d6", + "package/src/control/time.js": "b29e4abdab8a52a120534d268b56ea502e7394a1d0a3ce0986b5f90a4251dded", + "package/src/control/volume.js": "4411722264c3f27adf65d2f3191e95ceb3b89734fc1afa436d5e40f4450a67a7", + "package/src/events/clickInit.js": "c71e5709da54b6dbd650744c3cfea43f74cbad39080da4db5c049452e4a8c595", + "package/src/events/documentInit.js": "3588e34c434555ac474c92519f1aba8d8f9b442b9cf32d15a12e136bcbca0ae2", + "package/src/events/gestureInit.js": "d11294980ffa4a5c68d9059d1fcf773c60ee4dcd3230ff1adb6de78b29d5da09", + "package/src/events/hoverInit.js": "e7ad02a7b3a2fa654b29d6016cc8b70950185a9fae422fa259b443046c9f0b5d", + "package/src/events/index.js": "9e89b16e3082c9d4c74accd8e58b8e5229bfd07a29e63018be1c3ce81f18ecda", + "package/src/events/moveInit.js": "396c374c161a62c7b74fc52ff8e8efe99016eac2b3ce9fa4f2476751b8f46d51", + "package/src/events/resizeInit.js": "c1cfb19f57bab631d5a6fe0691c4b1c26e1cc9d7f412069368aa2a467ecd9c1f", + "package/src/events/updateInit.js": "40cd0fd049e660ff58c83e20823409b9461077924a9a777406866c3aa345296e", + "package/src/events/viewInit.js": "b04b1356495e5edc19c435b3263665d8b0906a21329391a2e24051d1b5943868", + "package/src/hotkey.js": "ca9ecd041f2d2081fdc8f6bc2ba13c9eddc90afb1cdddef3bdb9907866efaa94", + "package/src/i18n/cs.js": "ebf7b10a0c1eab982935047019016e1e4e639c3184cf01805c651fa5473caf42", + "package/src/i18n/es.js": "90f2acedb4387b323ce57de3d693361caa130aa85f979f748ff3e5126b849b62", + "package/src/i18n/fa.js": "5b97bc2a038a4e75b56c2e5408412355c0eb54efae3033dcebce889442b3bb55", + "package/src/i18n/fr.js": "91901814ebcffc0c282e817fe7467c59406eb2d7c388fe5d6513078dd06db3a8", + "package/src/i18n/id.js": "7207ba2e88336d6342665ab8037e1ef1710c1ee09ac9d7c040237e4a3d5b8c5b", + "package/src/i18n/index.js": "5408964b30ab298ebfa8bdaa4c45a1bc5f517682a0032c15ac98fb11867b8855", + "package/src/i18n/pl.js": "1f0b0849c3de39faebcf5a14c068374344cfb9de5745f6e5abedc5d569aea529", + "package/src/i18n/ru.js": "44ec0ab1ba6794315069adf178ab9ac645922ba408aedfe09ef8b79daf70e776", + "package/src/i18n/tr.js": "f94e874dbe8e4a7aacbd4444a7040e9bf9ac140e442f33fed31e376ce8f52a41", + "package/src/i18n/zh-cn.js": "10707cf170c062e3450587d21cc12156cb88843a6766c61eedafed0d2cf34a12", + "package/src/i18n/zh-tw.js": "b7dedc5616f12345b17c8ec185853b08d0ef572fb7460df79fc0206f0c8b6d97", + "package/src/icons/airplay.svg": "095f71bbac1aabde07963c645cb2071f790873fb2730363224e004321a01242a", + "package/src/icons/arrow-left.svg": "ac8cb60bf1f9436b9fc27eef2c65787dd879f01fb7ed2070b74be8a4d3167e0e", + "package/src/icons/arrow-right.svg": "9e2aa8a84ee9879bb70fb4fbae8eeb2a020e9a02c7bde14dede819d33acdff3c", + "package/src/icons/aspect-ratio.svg": "a71df3064cba45f402698b4c11fe21798b9af9aa6c5d0d689262889ffa386ab1", + "package/src/icons/check.svg": "672230ecd40c42b5354aad702ba6b018a9b765655bc96a53ba003fee41d8413a", + "package/src/icons/close.svg": "bb9e23e5305d11ec3d8f75a50ecdf3150deab8614c7df2af588873f2d78f06c2", + "package/src/icons/config.svg": "adbe547dfde4b44399da319ccdfc29fca57bcdbec8c6af5e36a2eeb97ecc2041", + "package/src/icons/error.svg": "d85a72e27ceaa38221637405cb0a5be270a297da58f1b0428498f568fab7570a", + "package/src/icons/fast-forward.svg": "709887f67e76e76d17fec37025c7405d85e9be28466d49602c1aa18732c89cef", + "package/src/icons/flip.svg": "ea6d9328823bb8454af65250030f02584239fcf8fbc2fb937dd1a1bac7602c28", + "package/src/icons/fullscreen-off.svg": "612577a443da55433bef698f1f4a426d0223c70cf1bcec3b27221bff753ae621", + "package/src/icons/fullscreen-on.svg": "bbec64253a42ef5ea26f6289d58254a7e86af3c0d627b2eb2ae357ef47cd04db", + "package/src/icons/fullscreen-web-off.svg": "57fa0e8780baa7f27befdeeb9ec2e772a1185a469a5f7ce05ed760d93ac8c434", + "package/src/icons/fullscreen-web-on.svg": "c6283f3ef124ea47e27b725ef5757a0b586dd5371cbefcdf2180dfabfe6375a9", + "package/src/icons/index.js": "b0107676f57ad6d04e507976f5582e64d4dd71309ae395897f608f2591896320", + "package/src/icons/loading.svg": "ffcf5d814e6f3931a370bb4f0d2675381c2adb8f6d29dd1ee8f5df33d8175e75", + "package/src/icons/lock.svg": "1acb0566c08175200cdd47f0ce7f72ca1ae2761962cc3b134be4d44398cfcee2", + "package/src/icons/pause.svg": "9efe05ebf5610befddebcac51b3c9a491001189ff86204cb47928eb1617f6c7a", + "package/src/icons/pip.svg": "52d1e150d1364aed20917d83a2f7ab7589fb9df9655f3d3afaea3c4387800812", + "package/src/icons/play.svg": "c35562d20028d52ce329f35f90496a06d4dc5b6dc39df7ebcfb027f6f2393958", + "package/src/icons/playback-rate.svg": "cbc025c7780a5e5c31160182d70131202fa41a661d20ec2933e0bb1f488f1cd8", + "package/src/icons/screenshot.svg": "49f7d90198fb0bcbc29848f40b0a8c042b78c07ecef1cfc5184e2e84a61b4bd4", + "package/src/icons/setting.svg": "7f6454d1c7f037d5a7144a898abedc89ca339534166d620dfa45efcd4c74ee3c", + "package/src/icons/state.svg": "9d777729e9287c6dc7f8d0687a257ffd40bd817fa84f24eb98dfebb3256b6e35", + "package/src/icons/switch-off.svg": "0bf5803437823035b816fb8bec148c06b4e01f85ea987cedda87269da6aab412", + "package/src/icons/switch-on.svg": "1d87b42af5e7141f9defdc790567534288d84858d5068dd15093d5ef12f37f9c", + "package/src/icons/unlock.svg": "f341e80530c2b6b218495c7ed3b9e4f268d70d2c931c0bf76efed1add8bab745", + "package/src/icons/volume-close.svg": "b9dbeaf9043c8014cd29d0e4a21a82ce567bc6b85497c310cca5f68bceeb31b2", + "package/src/icons/volume.svg": "baebc4ede3013202a4b13202a8d961cb0e5e065ee03733816022b2541d13884f", + "package/src/index.js": "01ac24c9cc37f788995b0072769a46532bb569271ffdf4e3f734bab3fae2da67", + "package/src/info.js": "7fc50f9549ab4cc91422dea5182fe6250cf8273501425cb371a5870393bc39c1", + "package/src/layer.js": "ed576b5a805684852de55b56e65bf295ef8422e51e58a7f0fb7ad9987639f262", + "package/src/libs/screenfull.js": "3ff8b0abec9b100b4c25476627f7bd505466ae77a0700c95347e9e6e05f45bc6", + "package/src/loading.js": "f47a310ae4acfbd45bf34786901377844a08b4acc40d169f99b1af7ab02e4988", + "package/src/mask.js": "c28ab44ab96255f9357d39e184a048aa12f0822073d38a82c63d59b6cd2a0936", + "package/src/notice.js": "ef17bef61d6ff1e67f5e722a100ab5f5f9e4779f1297b06e16b5a9a32168cd67", + "package/src/player/airplayMix.js": "83346ea049d0a17b6943926f67e6c3a1e7242bcd978933dd77cd16ae3dca39ef", + "package/src/player/aspectRatioMix.js": "9f262f3fb47d23dc784aa31ea3264980567dcecdbfed592f2a26251d9473bdac", + "package/src/player/attrMix.js": "ae4103f3ede68f9ae87a16fa2c1e2b3bd3b03ec6190eb0ea8ace0c4b61216a29", + "package/src/player/autoHeightMix.js": "3c24c9b2a8ccc95f0b6b682e506565c0616f1b96f3d98bd20d219616d2dc4234", + "package/src/player/autoSizeMix.js": "65a480384c0939fda230e01b0deea43df757174d44828259f43abc3f63ed65c0", + "package/src/player/cssVarMix.js": "ea05acb553183ae60d42829ccf96deef06fbdb400424071777bd39c6ed6e683c", + "package/src/player/currentTimeMix.js": "41e5a6ac03d0dcd6883d5b08e2c74e0421b3d68e819f2b9c1e7f27aaf26bd7e8", + "package/src/player/durationMix.js": "87922cfb4a55db593e1c0187bf1912cf5b7c9b3b0136341723692a60f95efe01", + "package/src/player/eventInit.js": "f5f7412e652e8b2709443e2e2833d949e3563c002794d78cf466200e27af7be1", + "package/src/player/flipMix.js": "416485570461e7ef3c0346b528bedd8846bd24473d51ce6e33ac7abf61a24dfd", + "package/src/player/fullscreenMix.js": "44607d23d05d45816dd51503678d70dd73a212ec01caf66af8f2be5ab94ea271", + "package/src/player/fullscreenWebMix.js": "168aa2b5ddf6b0305a565bacb73ade7c49942d7e8abcbe3198d4089e071d17b3", + "package/src/player/index.js": "518d54576f7cf1a7cec6031743a19ad1a475df54e539546a722c174ee4c2cf1b", + "package/src/player/loadedMix.js": "cd984138d0bee78d8e822ae424a4f61adc5530327283e2db72b1942f6b464f22", + "package/src/player/miniMix.js": "37cba99a8a8b9ca666cf79f85d47096a4f475da376ada1adc9d5d39f905bf2fc", + "package/src/player/optionInit.js": "ca8978d55edd199a8ea6ccffdafa6d5ee0b1eebc818333b73d81574daadb0493", + "package/src/player/pauseMix.js": "f96b7d2f17a01144bb5299612a794b4e971d7e389444f3769a272fa164f82886", + "package/src/player/pipMix.js": "f6c1970557258374f1007b16eaea05a2ceaf4319ad1cc6c7c0e4971b080775a8", + "package/src/player/playMix.js": "1e37d4ff7d5a5508c9f656d391993ec28a5a4627aca7917d4601164f6fdc5d63", + "package/src/player/playbackRateMix.js": "51f862cfec9744b7414a75fd1cd2aaaaf41d240300a21d024320ca85ede71415", + "package/src/player/playedMix.js": "0d345bac5914a3403cc2b7f5c8d68ab61a4c53e9085602d8e28950dab7175936", + "package/src/player/playingMix.js": "2ba6c2c9e495bcabb91da43d0c8162742c80f9fe39ee60e15eb01e7c5761348f", + "package/src/player/posterMix.js": "b50ee061fa1ded74b77a2e0b0e7306d9f8f87854d8b72368e2e84f2a89568850", + "package/src/player/qualityMix.js": "3e43a8a6e0c0004e8f88a42457db61c20bb2184203675d19cd5761f936ae15a3", + "package/src/player/rectMix.js": "9f319e6d2cf20af90d9c5f8291099132c982e299034474e735ad5e8b1ddf7c6e", + "package/src/player/screenshotMix.js": "40bb2ae541ba41a60bdfe315c9fe35da25954132ad8c52f184281dc341e6af24", + "package/src/player/seekMix.js": "2bb1f1923aad7a989b4cadb3fe79e02176adb123425a356a93541eb8cd0885d4", + "package/src/player/stateMix.js": "ff8618ab6424f9d34337ebf5294449d2eea5cf76307b654cfff1e53e71c3ae54", + "package/src/player/subtitleOffsetMix.js": "5dfc80bce7921ce305259fe0a6f92a79f6bb09c1c7ca00132e3595a25fcdfca7", + "package/src/player/switchMix.js": "34bcc9d0c55ccb4b859583e22c0516171c719fa95c2b9b0af3232ad2455d789e", + "package/src/player/themeMix.js": "4f5394da3fc6fae0b5996a4d0a9d875fd8f9a9def759e946fc6a64af595dc3de", + "package/src/player/toggleMix.js": "9ec0e69ade2445e8e583eb94d226825efe2c109274eeed244c1e035e39b024a9", + "package/src/player/typeMix.js": "2a2284a7c1368c33054c8f8df473fa2cac71bb97dced04b3c61097854e05351e", + "package/src/player/urlMix.js": "f30f285ab3b071a47c3f82b6150f89664ab03fc8c403a8c953e197a7d457e5fd", + "package/src/player/volumeMix.js": "9847e9cdd994023db1ab1df7f71177ec52b9eea16105f9297cc0cfab0d5fe040", + "package/src/plugins/autoOrientation.js": "b334635916271821f15d5669c78bd54353c73f789e5f3881b3f42892c25e3887", + "package/src/plugins/autoPlayback.js": "9aaf05c22f7ca3c36fe4f8adcb1cc0374d4aceeef0e22d0f11b1c2cb99aebf35", + "package/src/plugins/fastForward.js": "77f2bf8f4d3b81328da0ca95bc74eb5f8b36ab70b0f0fa406d90ee5448ada697", + "package/src/plugins/index.js": "5a25986996ffa174cfd7678a072d2b703c4ab903b357c4635678703defdd03ef", + "package/src/plugins/lock.js": "e3aa7dfe8380cec6ff8f64fc6b97211dc3a2f6d0b6fd67d40cc6ecc176c8db0d", + "package/src/plugins/miniProgressBar.js": "8d22005b3a42820c7b6c53f0abaaed38f94a5fa12239e27f28efccd379c2c5eb", + "package/src/scheme/index.js": "42f14c584e0e663f8f0a111954fdb26e56ebabd4c5e45c455fa740f03d268b47", + "package/src/setting/aspectRatio.js": "b1cf508b7806776ac7e952cd1791da8dabce4177219f8c59e9fe4784be5aa1fa", + "package/src/setting/flip.js": "1ecf3b33579f8fb564763a83b2aaca1949fa582816f185b58684cc341aa39dee", + "package/src/setting/index.js": "259b5749eda09fbcb8ec3ffb300c2d7c25c87a5710fb58401b75745a0e771540", + "package/src/setting/playbackRate.js": "77826765484758cafab1d000baab857d856d38caca80d25cacfc52988d3a1259", + "package/src/setting/subtitleOffset.js": "7112aa437e203b4449eba9a95a5885fce9bb09c15c879bceb79536b3f152823b", + "package/src/storage.js": "416f090c331fa27ff49838e58967c77f334bff4bb000cdc116d2579f5ac56021", + "package/src/style/artplayer.less": "662cfc3f079e75e50c18199511d533f4e35f7eac21aaf8f1171cfc93dcca243d", + "package/src/style/aspectRatio.less": "5ab50ae065c4a21734f17a32f5838b940f97070083143dabe1070d45630a3aca", + "package/src/style/backdrop.less": "8530dcc3e390b7a1cd767463023aab2ca410478792dd5b4f00b24ae55967ed33", + "package/src/style/bottom.less": "447283e979e53e6c777dc8f513d0b42488ab98afb8f5f5bb8cb0d645df47a085", + "package/src/style/contextmenu.less": "3aca4d6f32e5fa7022b22bd2f7bc81d8b17224158a7de41ca9e6b8ed84837252", + "package/src/style/controls.less": "89d35e4154a82a99096df18bc01b1f7939a54b1823c12bd2c43e0ce67e91fa0c", + "package/src/style/danmuku.less": "e75aae6ff39b1d255d250486562e9db8324dada097552d62a0a85f2de7035caa", + "package/src/style/flip.less": "7b7be6602d1672c7d17a726051273c320eec83a925be509e2545df7a387123b7", + "package/src/style/fullscreen.less": "0ba5cddcd264a2750281a309916ab0f3d8b01131666e052a24bc0ec89e870e76", + "package/src/style/fullscreenWeb.less": "1e0bac3295e5269ac28888cdc9060f6720983792dead34bfad897e2d33f499bd", + "package/src/style/hideCursor.less": "fcf26ad3ca2ce28486594975a045304048bdd98996bc80ac74e36740fd7ef4e7", + "package/src/style/hint.less": "e29017145d831b23337b500b9ed5ff3706ce56f31dc4ac2720615c6ea3a9d97d", + "package/src/style/icon.less": "a75dcb23a859cb42fa50cadada36508ce752aed6ea03984a8f5947d8584d10b7", + "package/src/style/index.less": "1d9cecc59fe0d0b7f2d057c91998e3a2492ea52999369512ef355fc166781474", + "package/src/style/info.less": "ba577cbe605cd541d0171d4e0b2fe15333963da4bc040d466bfb347f9be79bcc", + "package/src/style/layers.less": "93791f5e52176a166835e1f4b3d24a07d305531f91647cc8aea75496ec72b8ab", + "package/src/style/loading.less": "7f211e95694e0d3aa64b6f8e25deb6f60c2c65303dff9df44b1acab6cbc30bcd", + "package/src/style/mask.less": "251ea4a6b4ca20de2baaa8b13b420a77180fb570ca1744a7bd757d646b5b3664", + "package/src/style/mini.less": "de25c47271e807fc311f33110e651ea0ee143e61b15ae92cdcbe4ea8d2e78683", + "package/src/style/mixins.less": "3bb2205bf2b2ff9c224010fc1a170f1e56614f6e710b222f2e8807747f772c04", + "package/src/style/mobile.less": "088a21666ebf5b631f2d15527c2a283890b25285d0d31ea5f60adfaf3689d936", + "package/src/style/notice.less": "98baf3481e7269bb8b4d399d561a15f6f5189e45f50225adf41aabb64d0e94d1", + "package/src/style/plugins.less": "97b4baef8a0493f152ae73ce1b988cab0d7eebbe4a6c119e944247d19bcfd2bc", + "package/src/style/poster.less": "939f33aa2a48806eb1da3bc4b49a8f9ab541ff2a53796260f475b2c7a98cba60", + "package/src/style/progress.less": "1440c2dee6edce1edf0dd41cb8efa03fd504d295e119af9c7735b1757db73a38", + "package/src/style/selector.less": "5320e35c670912a57534fdf4122aef566c9ca273e14b52af5d882c8cd4591f74", + "package/src/style/setting.less": "1951153c3fa2ae6541c0a046404db043a1287b80847a499c6386c49c3e929695", + "package/src/style/subtitle.less": "b26cdc6aa6e5a113a0197f08e895ce73f0557e54d0e4d1dc4cac03a2fd48b5c0", + "package/src/style/variables.less": "58f64242b0838815fc96083a698a44aea15ff876fd0a1154ba496171b4187e3c", + "package/src/style/video.less": "a2a7ca14711238c18acdfa7d094c5223f269618cbb884866a6cdc22af7579b8d", + "package/src/style/volume.less": "7593ef9f5e34713b30b5d690182c6510a0912dd659f3405f7f38242398fbdfcb", + "package/src/subtitle.js": "7847d732cbecd3fabb0683b69d22972d9c47b1b13a991fa6b46e2b95d3ba4a65", + "package/src/template.js": "6561ac281682a65f3423dffd232b56e14f10d88713743d6505e1fbe0cf5402a9", + "package/src/utils/compatibility.js": "079c4621b7856d2f34bfba27376048c47b538cfc3e07c9d019701bd05a8b62c8", + "package/src/utils/component.js": "1a96e1ce80fab7a2c88e0849bf8519edd2554e332a4d3461eb7de8d3c709d638", + "package/src/utils/dom.js": "6ec4e5bff93aa9a8203a8fafcc6fb0781f22f78bb38e85e230dd1d7c1c50077a", + "package/src/utils/emitter.js": "637c2b65c89a34ca3208335a892258540eefc49cb8f87f981c69496fe49efa89", + "package/src/utils/error.js": "3b395e07922fb3fcbb7de34e662ada1914b3499dac6f109e522c432bd705f3d1", + "package/src/utils/file.js": "c02139c54e569bf635f90d32b7ccb9d6cb8ba5ff126071e6c79b34a134b11cb2", + "package/src/utils/format.js": "318a9e844fdbb64168a1d076c45697e35b0f907103089bce94b414f132ab3e9c", + "package/src/utils/index.js": "585394c7bfda8e8548cfb92c73ae1e45cccc55c48d683ca9a48099debdf4b98e", + "package/src/utils/property.js": "48faa8d72daf7bea824146ecf9ccec0575fd32995d482cb94731d859b1f9a437", + "package/src/utils/subtitle.js": "4f5450fd6d4881d2499d2c4f54e8ddc39c5edb6d2bb2d6c6dd7555672bd28e5c", + "package/src/utils/time.js": "d471d1cbde1a108b908a083005a3af1e17a3df55b084cec1f1866368f1f3d07b", + "package/tsconfig.json": "bf1616499e177df22713d30f25dd255295c43d34310185403b2dfb1c4970c793", + "package/types/artplayer.d.ts": "ae6877ec208b09c9538e46b33eb80230690d7a3e04c69f14ea33a57557039143", + "package/types/component.d.ts": "7a4ea13e3f6400918190d2f34992b7de96e6145b4ebdf2030976594d5673f50d", + "package/types/config.d.ts": "3e2e3294802653fbab62f05d5d656411c657641d8f7a3ce64295eef44b37ef62", + "package/types/cssVar.d.ts": "a83429be37936c98850975c1a3a6896bb8a113a270b8cbe3994967f1d41458a3", + "package/types/events.d.ts": "f5b052edb9ef5fee846fe7aea9393e80df964226f1d4de21e6dfc0164662d0ce", + "package/types/i18n.d.ts": "75a61026bbc08cf29498700d1ed73b115734d9284085ab1ea0769d3d1a3c3d8b", + "package/types/icons.d.ts": "a4d2fa1a85755cc40d0ac9d0dadb7bedae1872b3306ba434f0fd817c0b2ac3b6", + "package/types/option.d.ts": "a336ee6381415fa7141edc1a1967db12e353b1cfad3af6f390a3c47f146faa3a", + "package/types/player.d.ts": "94dfcb837326954195cf38363ef8d8b909243549579c59fdde344cd8d8f1886f", + "package/types/quality.d.ts": "b07e6525dcadbbb6fcd7c5ccb5e24eca87d25b24b8a23b49891c032a479fe660", + "package/types/setting.d.ts": "fbf66bb3fd75e4d57052aafc41f752f8fca1c801ad502ff06ef11a6ab6b86200", + "package/types/subtitle.d.ts": "76d899e4f72aeafedfd8f063f9dcbe2ada9e367d0bb2dc6a01b9929d3ebbd58f", + "package/types/template.d.ts": "a6065449803fc0adca1b39a2588c01c4d82e4b2e3be73bb66f601d579aa2a583", + "package/types/utils.d.ts": "5cf2785edc48a462f28603b43f1176ee1f7bccc5be9d0824798cc9af32b5d45d" + }, + "manifest": { + "license": "MIT", + "name": "artplayer", + "version": "5.1.6", + "main": "dist/artplayer.js", + "legacy": "dist/artplayer.legacy.js", + "types": "types/artplayer.d.ts", + "homepage": "https://artplayer.org", + "author": "Harvey Zack ", + "browserslist": "last 1 Chrome version", + "description": "ArtPlayer.js is a modern and full featured HTML5 video player", + "repository": { + "type": "git", + "url": "git+https://github.com/zhw2590582/ArtPlayer.git" + }, + "bugs": { + "url": "https://github.com/zhw2590582/ArtPlayer/issues" + }, + "keywords": [ + "html5", + "video", + "player" + ], + "dependencies": { + "option-validator": "^2.0.6" + } + } + } +} diff --git a/refactor/changes/2026-09-14-PKG-VTT-THUMB-05-combinations.md b/refactor/changes/2026-09-14-PKG-VTT-THUMB-05-combinations.md new file mode 100644 index 000000000..42c1af9a9 --- /dev/null +++ b/refactor/changes/2026-09-14-PKG-VTT-THUMB-05-combinations.md @@ -0,0 +1,74 @@ +# PKG-VTT-THUMB-05: browser combination checkpoint + +Baseline: `4fa5c68be9d2d0d60d725c2a87b8d92a4dc8a85a`. Task05 remains doing; +this checkpoint does not claim physical-device or complete distribution acceptance. + +## Inputs and actual coverage + +The new 5.1.6 core snapshot verifies the registry SHA-512, archive SHA-256 and +197 archive members. The browser server verifies the actual main entry before +serving it. This is the source-associated core for usable VTT 1.0.1, not a newly +invented minimum-supported version. Existing frozen 5.1.7, 5.3.0 and 5.4.0 inputs +and the current candidate complete the five-core comparison. Npm 5.3.1 was +previously found absent; 5.3.0 is only an adjacent published stable comparison. + +`vtt-thumbnail-combinations.spec.js` covers: + +- Candidate plugin on all five cores: actual red/blue preview pixels from DOM + screenshots, real pointer positioning, Chapter progress coexistence, native + video play/pause, web and native fullscreen, source switching without refetch, + unchanged control identity and owned UI removal on destroy. +- Actual published 1.0.2/1.0.3/1.1.0 main bundles on candidate core, and 1.0.1 + on 5.1.6: historical callable/default exports, previews, control identities, + source switching and a single VTT fetch. The historical compact-arrow input + requirement is explicit; ordinary-arrow parser failures remain separate tests. +- Android user-agent profiles with synthetic DOM touch payloads: the actual core + gesture handlers emit setBar and perform native media seeking, the preview + follows the drag and its real 500ms timer hides it. This is not trusted OS input + or physical Android/iOS evidence. +- Existing native fetch/abort, malformed input/recovery and lifecycle tests remain. + +The current source build is the plugin input. This is not an installed tarball, +every old legacy bundle, a browser-device farm or the online editor. Those gates +remain task06/EX-03 and the relevant device/release tasks. No new dependencies, +runtime code, public types or shippable build artifacts change in this checkpoint. + +## Findings and failed runs + +VTT 1.0.1 registers `thumbnails`. Actual core 5.1.6 creates its built-in control +only when a thumbnail URL is configured, so the plugin can register normally. +Core 5.1.7 reserves the control unconditionally. The resulting duplicate-name +rejection reproduces on 5.1.7, 5.4.0 and candidate cores in all three engines. +The nine explicit failure assertions are historical evidence, not successful +old-plugin/new-core acceptance. Preserve the current reserved control; any +compatibility accommodation must account for its public identity and duplicate +registration behavior. The pairing is recorded as an open release-review issue. + +The initial 27-case run had nine passes and eighteen failures. Fifteen failures +came from test-only setBar calls without the event required by newer core hover +handlers; the tests now use real mouse movement. Three exposed the 1.0.1 collision. +Legal and incompatible combinations now have distinct explicit assertions. + +The expanded 69-case run passed. Adding native fullscreen then produced fourteen +passes and one Chromium candidate screenshot timeout. Trace showed actual +fullscreen ownership followed by a hidden preview at screenshot time; cleanup +also timed out after the interrupted screenshot. Mouse positioning now first +uses Playwright's stable/actionable progress hover, then computes the desired +position, and verifies visible preview/background before screenshot. The final +69-case run passes. This changes test interaction timing, not player code, and +does not prove a product fix for every prior timeout. Initial reports are retained; +no retry, skip, timeout increase or weaker pixel expectation was introduced. + +## Verification and handoff + +`../baselines/vtt-thumbnail-combinations.json` records exact browser versions, +input identities, passes/failures, screenshots/report fingerprints and Node/CI/lint +results. Nine passing assertions deliberately confirm historical incompatibility. +The task remains open for physical-device evidence, final candidate revalidation +and disposition of the old reserved-name pairing; controlled HTTP fixtures do +not establish external CDN or every sprite format's behavior. + +The package architecture and environment/browser guides describe actual scope. +Revert this checkpoint as one unit to remove the new route, frozen core snapshot, +combination tests and evidence without reverting the earlier VTT implementation. +Local checkpoint commit only; no push or publication. diff --git a/refactor/environment-matrix.md b/refactor/environment-matrix.md index ff3415673..f085a6966 100644 --- a/refactor/environment-matrix.md +++ b/refactor/environment-matrix.md @@ -57,7 +57,7 @@ Node10 是 TS 模块解析模式名,不代表支持 Node.js 10。现代 es2020 | artplayer-plugin-jassub / 1.1.0 | ASS、worker/WASM/font 加载、切源/销毁;短 ASS+明确来源字体 | 内嵌资源哈希已有;版本对应、跨源/worker 限制、实际渲染待 | PKG-JASSUB-01/02/05/06 | | artplayer-plugin-multiple-subtitles / 1.2.0 | VTT 合并/排序/解析错误、URL 回收;双语言/空/坏 VTT | parser 来源头已观察;特有行为和浏览器字幕待 | PKG-MULTI-SUB-01/02/05/06 | | artplayer-plugin-vast / 1.2.0 | Glomex/Google IMA、广告错误/恢复、重复初始化;供应商测试广告标签 | 依赖版本已记录;实际 IMA 网络/广告流程待,PR 用受控 adapter | PKG-VAST-01/02/05/06 | -| artplayer-plugin-vtt-thumbnail / 1.1.0 | WebVTT 时间和 sprite xywh、图片失败/跨源;本地 VTT+sprite | 五个实际发布归档和可控历史边界/故障已核对;原生图片、浏览器、核心组合仍待 05/06 | PKG-VTT-THUMB-01/02/05/06 | +| artplayer-plugin-vtt-thumbnail / 1.1.0 | WebVTT 时间和 sprite xywh、图片失败/跨源;本地 VTT+sprite | 05 检查点已有五核心桌面像素/Chapter/原生和网页全屏、切源及模拟触摸;1.0.1 控件重名历史失败和真机/分发仍开放,见 vtt-thumbnail-combinations.json | PKG-VTT-THUMB-01/02/05/06 | | artplayer-proxy-canvas / 1.1.0 | video-like 属性/事件、Canvas 绘制、seek/销毁;MP4 | shim 与实际媒体顺序、跨源/移动待 | PKG-CANVAS-01/02/05/06 | | artplayer-proxy-mediabunny / 1.2.0 | Mediabunny 1.56.1 当前解析;WebCodecs/AudioContext、HLS/轨道拓扑、AV 同步 | 库依赖不等于 codec 可用;准确 codec/profile、设备能力、长播放待 | PKG-MB-01/02/07/08/09/10 | | artplayer-tool-iframe / 1.1.0 | 跨窗协议、ready/错误/销毁;同源与两个受控不同 origin 页面 | 消息/嵌套浏览器及沙箱权限待 | PKG-IFRAME-01/02/05/06 | diff --git a/refactor/plan.md b/refactor/plan.md index e11f9d57e..430812b07 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -4,7 +4,7 @@ 基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 243 项,范围 22 个包及工作区/示例。 -状态:todo 58 / doing 15 / blocked 0 / done 170 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 +状态:todo 57 / doing 16 / blocked 0 / done 170 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。 @@ -190,7 +190,7 @@ | PKG-VTT-THUMB-02 | artplayer-plugin-vtt-thumbnail
建立特有行为与错误测试 | PKG-VTT-THUMB-01, ENG-03, ENG-05 | VTT 解析、xywh、相对 URL、时间边界、请求失败和定位 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | M | done | | PKG-VTT-THUMB-03 | artplayer-plugin-vtt-thumbnail
整理内部职责与资源 | PKG-VTT-THUMB-02, CORE-09, CORE-19 | 纯解析/区间查找与 DOM、请求/定时器生命周期分离 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | M | done | | PKG-VTT-THUMB-04 | artplayer-plugin-vtt-thumbnail
迁移自有源码和公开类型 | PKG-VTT-THUMB-03, ENG-04, ENG-06, CORE-07 | cue/rect/result 和参数可选性保持兼容 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容 | M | done | -| PKG-VTT-THUMB-05 | artplayer-plugin-vtt-thumbnail
验证新旧核心和组合 | PKG-VTT-THUMB-04, CORE-22 | 鼠标和移动进度、全屏、切源、chapter 组合 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | M | todo | +| PKG-VTT-THUMB-05 | artplayer-plugin-vtt-thumbnail
验证新旧核心和组合 | PKG-VTT-THUMB-04, CORE-22 | 鼠标和移动进度、全屏、切源、chapter 组合 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | M | doing | | PKG-VTT-THUMB-06 | artplayer-plugin-vtt-thumbnail
验证分发并同步文档 | PKG-VTT-THUMB-05, ENG-07 | vtt.thumbnail.js、VTT/图片资源解析和产物验证 | tarball 入口/资源、类型、8082 demo 和 README 一致,有回退记录 | M | todo | ## 5 包迁移:artplayer-plugin-hls-control @@ -533,6 +533,7 @@ - PKG-VTT-THUMB-02: [记录](baselines/vtt-thumbnail-failures.json) [记录](changes/2026-09-13-PKG-VTT-THUMB-02-failures.md) - PKG-VTT-THUMB-03: [记录](changes/2026-09-13-PKG-VTT-THUMB-03-resources.md) [记录](baselines/vtt-thumbnail-resources.json) [记录](changes/2026-09-13-PKG-VTT-THUMB-03-parser.md) [记录](baselines/vtt-thumbnail-parser.json) - PKG-VTT-THUMB-04: [记录](changes/2026-09-13-PKG-VTT-THUMB-04-runtime-types.md) [记录](baselines/vtt-thumbnail-runtime-types.json) [记录](changes/2026-09-13-PKG-VTT-THUMB-04-public-types.md) [记录](baselines/vtt-thumbnail-public-types.json) [记录](changes/2026-09-13-PKG-VTT-THUMB-04-module-forms.md) [记录](baselines/vtt-thumbnail-module-forms.json) [记录](type-compatibility-policy.md) [记录](baselines/vtt-thumbnail-approved-types.json) [记录](changes/2026-09-13-PKG-VTT-THUMB-04-approved-types.md) +- PKG-VTT-THUMB-05: [记录](changes/2026-09-14-PKG-VTT-THUMB-05-combinations.md) [记录](baselines/vtt-thumbnail-combinations.json) [记录](baselines/vtt-thumbnail-core.json) - PKG-HLS-01: [记录](baselines/hls-control-contract.md) [记录](baselines/hls-control-release.json) [记录](changes/2026-09-11-PKG-HLS-01-contract.md) - PKG-HLS-02: [记录](hls-validation.md) [记录](baselines/hls-sdk.json) [记录](baselines/hls-validation.json) [记录](changes/2026-09-11-PKG-HLS-02-tests.md) - PKG-HLS-03: [记录](changes/2026-09-12-PKG-HLS-03-modules.md) [记录](baselines/hls-modules-validation.json) [记录](hls-validation.md) diff --git a/refactor/progress.md b/refactor/progress.md index e305237d5..7c6bfe166 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,20 @@ # 进度与证据 +## VTT Thumbnail 五核心组合检查点 + +PKG-VTT-THUMB-05 进入 doing。冻结真实核心5.1.6的197成员,和已有5.1.7、 +5.3.0、5.4.0及候选核心验证实际预览截图像素、Chapter、网页/原生全屏、 +播放/暂停、切源不重抓VTT及销毁。移动分支为Android UA和合成DOM触摸事件, +不能当真机。最终三浏览器69项通过,其中9项确认1.0.1在5.1.7起的历史控件 +重名拒绝;其余60项行为通过。1.0.1/5.1.6合法组合及较新旧插件/新核心另测。 +初次漏传测试事件与Chromium全屏截图超时报告保留;后者通过稳定控件后定位 +鼠标并显式检查预览可见改善测试,不宣称生产修复。252项VTT、50项CI和lint +通过(1既有warning)。见[检查点](changes/2026-09-14-PKG-VTT-THUMB-05-combinations.md)和[证据](baselines/vtt-thumbnail-combinations.json)。 +生产源码/类型/分发及依赖未改,任务/历史重名风险保持开放,未完成真机或打包 +验收。243项保持170 done、16 doing、57 todo。下一步MOD-02剩余工程脚本与 +模板迁移可独立推进;VAST默认行为选择仍待用户答复。本地提交,无推送/发布。 + + ## Auto Thumbnail 首次 seek 诊断检查点 diff --git a/refactor/risk-table.md b/refactor/risk-table.md index 8c7a3aed0..40ba14464 100644 --- a/refactor/risk-table.md +++ b/refactor/risk-table.md @@ -260,3 +260,4 @@ | SITE-CODE-GROUP-01 | resolved / 已复现 | VitePress code-group random IDs make identical site inputs emit different output hashes | SITE-BUILD-01 | | SITE-EDITOR-FAILURE-01 | resolved / 已复现 | Desktop editor evaluates raw TypeScript and cannot settle FileReader errors or boot with denied storage | SITE-03 | | SITE-EDITOR-AMD-01 | resolved / 已复现 | Late Monaco language AMD initialization races with example dependency loading | SITE-03 | +| VTT-CORE-NAME-01 | open / 已复现 | Published VTT 1.0.1 control name conflicts with the core placeholder introduced in 5.1.7 | PKG-VTT-THUMB-05, REL-08 | diff --git a/refactor/risks.json b/refactor/risks.json index c7b83ac53..014586231 100644 --- a/refactor/risks.json +++ b/refactor/risks.json @@ -5873,6 +5873,25 @@ "test/browser/site-editor.spec.js" ], "resolutionRationale": "Initial real WebKit failure retained; await JS/TS language modules before Run and example dependencies. Delayed-module regression passes on all three engines." + }, + { + "id": "VTT-CORE-NAME-01", + "title": "Published VTT 1.0.1 control name conflicts with the core placeholder introduced in 5.1.7", + "confirmation": "reproduced", + "status": "open", + "owners": [ + "PKG-VTT-THUMB-05", + "REL-08" + ], + "evidence": [ + "refactor/changes/2026-09-14-PKG-VTT-THUMB-05-combinations.md", + "refactor/baselines/vtt-thumbnail-combinations.json", + "refactor/baselines/vtt-thumbnail-core.json", + "test/browser/vtt-thumbnail-combinations.spec.js" + ], + "compatibleResolution": "Preserve current vtt-thumbnail and reserved core control identities; distinguish the actual working 1.0.1/5.1.6 pair from the already failing 5.1.7/5.4.0/candidate pair. Decide the supported historical pairing/migration or a compatible accommodation during release review without hiding duplicate-control failures.", + "closureCriteria": "Historical working and failing browser pairs remain reproducible; any claimed accommodation preserves reserved-control ownership and duplicate-registration contracts, or an explicit reviewed historical support/migration boundary is recorded.", + "workspaceState": "Final three-engine suite passes nine assertions of this historical rejection, not nine successful compatibility cells. No production control behavior was changed." } ] } diff --git a/refactor/tasks.json b/refactor/tasks.json index 2617c1a3b..4597e7c33 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -1963,11 +1963,15 @@ "PKG-VTT-THUMB-04", "CORE-22" ], - "status": "todo", + "status": "doing", "risk": "M", "deliverable": "鼠标和移动进度、全屏、切源、chapter 组合", "acceptance": "最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成", - "evidence": [] + "evidence": [ + "changes/2026-09-14-PKG-VTT-THUMB-05-combinations.md", + "baselines/vtt-thumbnail-combinations.json", + "baselines/vtt-thumbnail-core.json" + ] }, { "id": "PKG-VTT-THUMB-06", diff --git a/test/browser/README.md b/test/browser/README.md index d3fb5f28a..357827a84 100644 --- a/test/browser/README.md +++ b/test/browser/README.md @@ -245,3 +245,14 @@ when diagnosing a timeout: the historical failure includes a single ~10-second evaluate returning an already-recorded restart, not seven seconds of fast empty reads. These observations do not expand the timeout or waive the open timing and physical-device acceptance in PKG-CHAPTER-05. + +VTT combination tests verify actual preview screenshot pixels, Chapter coexistence, +native/web fullscreen, source switching and cleanup across five recorded core +inputs. The 5.1.6 server route verifies its frozen npm archive/member fingerprints. +Historical 1.0.1 has a distinct valid 5.1.6 pair and explicit later-core name-conflict +tests; expected historical failures are not compatibility passes. Later 1.0.x +compiled bundles receive their documented compact-arrow fixture, while ordinary +syntax failures remain in the historical parser tests. Mobile cases use an Android +UA and synthetic DOM touches through the real core handlers, not trusted hardware +input. Fullscreen mouse placement first waits for the progress control to be stable; +the earlier hidden-preview screenshot timeout remains in the checkpoint evidence. diff --git a/test/browser/server.mjs b/test/browser/server.mjs index 75378159b..f04d0872f 100644 --- a/test/browser/server.mjs +++ b/test/browser/server.mjs @@ -79,6 +79,11 @@ const asrCoreMember = `package/${asrCore.manifest.main.replace(/^\.\//, '')}` const asrCoreBytes = readMember(await ensureArchive(asrCore), asrCoreMember) assert.equal(hash(asrCoreBytes), asrCore.files[asrCoreMember], 'Adjacent stable ASR core differs from frozen release') add('/published-5.3.0/artplayer.js', asrCoreBytes, { kind: 'npm-release', version: asrCore.version, integrity: asrCore.integrity, member: asrCoreMember }) +const vttCore = JSON.parse(fs.readFileSync(path.join(workspace, 'refactor/baselines/vtt-thumbnail-core.json'), 'utf8')).release +const vttCoreMember = `package/${vttCore.manifest.main.replace(/^\.\//, '')}` +const vttCoreBytes = readMember(await ensureArchive(vttCore), vttCoreMember) +assert.equal(hash(vttCoreBytes), vttCore.files[vttCoreMember], 'Historical VTT core differs from frozen archive') +add('/published-5.1.6/artplayer.js', vttCoreBytes, { kind: 'npm-release', version: vttCore.version, integrity: vttCore.integrity, member: vttCoreMember }) add('/test/audio-tone.m4a', fs.readFileSync(path.join(workspace, 'test/browser/media/audio-tone.m4a')), { kind: 'generated-media', file: 'test/browser/media/audio-tone.m4a' }) add('/test/thumbnail-pattern.mp4', fs.readFileSync(path.join(workspace, 'test/browser/media/thumbnail-pattern.mp4')), { kind: 'generated-media', file: 'test/browser/media/thumbnail-pattern.mp4' }) add('/test/auto-thumbnail-timeline.mp4', fs.readFileSync(path.join(workspace, 'test/browser/media/auto-thumbnail-timeline.mp4')), { kind: 'generated-media', file: 'test/browser/media/auto-thumbnail-timeline.mp4' }) @@ -165,7 +170,7 @@ const server = http.createServer((req, res) => { if (url.pathname === '/test/player.html') { const core = url.searchParams.get('core') || 'candidate' const chapter = url.searchParams.get('chapter') || 'candidate' - assert(['candidate', 'published', 'published-4.5.5', 'published-4.5.9', 'published-5.1.7', 'published-5.3.0', 'published-5.3.1-beta.1'].includes(core) && ['candidate', 'published'].includes(chapter), 'Invalid test combination') + assert(['candidate', 'published', 'published-4.5.5', 'published-4.5.9', 'published-5.1.6', 'published-5.1.7', 'published-5.3.0', 'published-5.3.1-beta.1'].includes(core) && ['candidate', 'published'].includes(chapter), 'Invalid test combination') const html = fs.readFileSync(path.join(workspace, 'test/browser/player.html'), 'utf8') .replace('__CORE__', core) .replace('__CHAPTER__', chapter) diff --git a/test/browser/vtt-thumbnail-combinations.spec.js b/test/browser/vtt-thumbnail-combinations.spec.js new file mode 100644 index 000000000..a36f88ba5 --- /dev/null +++ b/test/browser/vtt-thumbnail-combinations.spec.js @@ -0,0 +1,203 @@ +import { PNG } from 'pngjs' +import { hash } from '../../refactor/scripts/releases.mjs' +import { acceptedVttText, vttThumbnailCandidate, vttThumbnailHistorical } from '../helpers/vtt-thumbnail.js' +import { expect, test } from './fixtures.js' + +const candidate = await vttThumbnailCandidate() +const historical = (await vttThumbnailHistorical()).filter(item => /^published-.*-main$/.test(item.name)) +const cores = ['published-5.1.6', 'published-5.1.7', 'published-5.3.0', 'published', 'candidate'] +const cues = 'WEBVTT\n\n00:00.000 --> 00:04.000\nsprite.svg#xywh=0,0,80,45\n\n00:04.000 --> 00:08.000\nsprite.svg#xywh=80,0,80,45\n' +const sprite = '' + +function centerPixel(bytes) { + const { width, height, data } = PNG.sync.read(bytes) + const index = (Math.floor(height / 2) * width + Math.floor(width / 2)) * 4 + return [...data.subarray(index, index + 4)] +} + +async function install(page, core, implementation, testInfo) { + let requests = 0 + await page.route('**/test/vtt-combination/cues.vtt', (route) => { + requests++ + return route.fulfill({ contentType: 'text/vtt', body: acceptedVttText(implementation, cues) }) + }) + await page.route('**/test/vtt-combination/sprite.svg', route => route.fulfill({ contentType: 'image/svg+xml', body: sprite })) + await page.goto(`/test/player.html?core=${core}`) + await page.addScriptTag({ content: `(() => { const module = { exports: {} }; const exports = module.exports; ${implementation.code}; window.vttFactory = module.exports.default || module.exports; })();` }) + await page.evaluate(async () => { + window.createPlayer('/test/pattern.mp4', true) + await window.art.plugins.add(window.vttFactory({ vtt: '/test/vtt-combination/cues.vtt' })) + window.vttControl = window.art.controls['vtt-thumbnail'] || window.art.controls.thumbnails + }) + await expect.poll(() => page.evaluate(() => window.art.isReady)).toBe(true) + await testInfo.attach('vtt-combination-inputs', { + contentType: 'application/json', + body: JSON.stringify({ core, implementation: implementation.name, sha256: hash(implementation.code), cueFormat: /^published-1\.0\./.test(implementation.name) ? 'historical compact arrow; ordinary-space failures retained separately' : 'standard spaced arrow', mobile: 'desktop unless test declares an emulated user agent; no physical-device inference' }), + }) + return () => requests +} + +async function hover(page, percentage) { + const progress = page.locator('.art-control-progress') + await progress.hover() + const bounds = await progress.boundingBox() + await page.mouse.move(bounds.x + bounds.width * percentage, bounds.y + bounds.height / 2) +} + +for (const core of cores) { + test(`VTT candidate / ${core}: actual sprite pixels, chapter, native/web fullscreen and source switch`, async ({ page }, testInfo) => { + const requests = await install(page, core, candidate, testInfo) + try { + const preview = page.locator('.art-control-vtt-thumbnail') + const progress = page.locator('.art-control-progress') + const bounds = await progress.boundingBox() + await page.mouse.move(bounds.x + bounds.width * 0.25, bounds.y + bounds.height / 2) + await expect(preview).toHaveCSS('background-position', '0px 0px') + await expect(preview).toBeVisible() + const red = await preview.screenshot() + expect(centerPixel(red)).toEqual([255, 0, 0, 255]) + await testInfo.attach('vtt-red-cell', { contentType: 'image/png', body: red }) + await page.mouse.move(bounds.x + bounds.width * 0.75, bounds.y + bounds.height / 2) + await expect(preview).toHaveCSS('background-position', '-80px 0px') + const blue = await preview.screenshot() + expect(centerPixel(blue)).toEqual([0, 0, 255, 255]) + await testInfo.attach('vtt-blue-cell', { contentType: 'image/png', body: blue }) + await page.click('#play') + await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThan(0.1) + await page.click('#pause') + await page.evaluate(() => { + window.art.fullscreenWeb = true + }) + await expect.poll(() => page.evaluate(() => window.art.fullscreenWeb)).toBe(true) + await hover(page, 0.25) + await expect(preview).toHaveCSS('background-position', '0px 0px') + expect(centerPixel(await preview.screenshot())).toEqual([255, 0, 0, 255]) + await page.evaluate(async () => { + window.art.fullscreenWeb = false + await window.art.switchUrl('/test/pattern.mp4?second') + }) + await hover(page, 0.75) + await expect(preview).toHaveCSS('background-position', '-80px 0px') + expect(await page.evaluate(() => window.vttControl === window.art.controls['vtt-thumbnail'])).toBe(true) + expect(requests()).toBe(1) + expect(await page.evaluate(() => Boolean(window.art.plugins.artplayerPluginChapter))).toBe(true) + await expect(page.locator('.art-chapter')).toHaveCount(1) + await page.evaluate(() => { + window.vttFullscreen = [] + window.art.on('fullscreen', value => window.vttFullscreen.push(value)) + document.querySelector('#play').onclick = () => { + window.art.fullscreen = true + } + }) + expect(await page.evaluate(() => Boolean(document.fullscreenEnabled || document.webkitFullscreenEnabled))).toBe(true) + await page.locator('#play').click() + await expect.poll(() => page.evaluate(() => (document.fullscreenElement || document.webkitFullscreenElement) === window.art.template.$player)).toBe(true) + await hover(page, 0.75) + await expect(preview).toBeVisible() + await expect(preview).toHaveCSS('background-position', '-80px 0px') + expect(centerPixel(await preview.screenshot())).toEqual([0, 0, 255, 255]) + expect(await page.evaluate(() => (document.fullscreenElement || document.webkitFullscreenElement).contains(window.vttControl))).toBe(true) + await page.evaluate(() => { + window.art.fullscreen = false + }) + await expect.poll(() => page.evaluate(() => Boolean(document.fullscreenElement || document.webkitFullscreenElement))).toBe(false) + await expect.poll(() => page.evaluate(() => window.vttFullscreen)).toEqual([true, false]) + await page.evaluate(() => window.art.destroy(false)) + await expect(preview).toHaveCount(0) + } + finally { + await page.evaluate(() => { + if (!window.art.isDestroy) + window.art.destroy() + }) + } + }) +} + +for (const implementation of historical) { + const core = implementation.profile === 'old-control' ? 'published-5.1.6' : 'candidate' + test(`VTT ${implementation.name} / ${core}: legal old calls preserve preview and control identity`, async ({ page }, testInfo) => { + const requests = await install(page, core, implementation, testInfo) + try { + const name = implementation.profile === 'old-control' ? 'thumbnails' : 'vtt-thumbnail' + const preview = page.locator(`.art-control-${name}`) + const bounds = await page.locator('.art-control-progress').boundingBox() + await page.mouse.move(bounds.x + bounds.width * 0.75, bounds.y + bounds.height / 2) + await expect(preview).toHaveCSS('background-position', '-80px 0px') + expect(centerPixel(await preview.screenshot())).toEqual([0, 0, 255, 255]) + expect(await page.evaluate(name => window.art.controls[name] === window.vttControl, name)).toBe(true) + await page.evaluate(async () => { + await window.art.switchUrl('/test/pattern.mp4?old-plugin') + }) + await hover(page, 0.25) + await expect(preview).toHaveCSS('background-position', '0px 0px') + expect(requests()).toBe(1) + } + finally { await page.evaluate(() => window.art.destroy()) } + }) +} + +for (const core of ['published-5.1.7', 'published', 'candidate']) { + test(`VTT 1.0.1 / ${core}: pre-existing reserved thumbnails name conflict is retained as historical evidence`, async ({ page }, testInfo) => { + const implementation = historical.find(item => item.version === '1.0.1') + await page.route('**/test/vtt-conflict.vtt', route => route.fulfill({ contentType: 'text/vtt', body: acceptedVttText(implementation, cues) })) + await page.goto(`/test/player.html?core=${core}`) + await page.addScriptTag({ content: `(() => { const module = { exports: {} }; const exports = module.exports; ${implementation.code}; window.vttFactory = module.exports.default || module.exports; })();` }) + const state = await page.evaluate(async () => { + window.createPlayer('/test/pattern.mp4') + const original = window.art.controls.thumbnails + try { + await window.art.plugins.add(window.vttFactory({ vtt: '/test/vtt-conflict.vtt' })) + return { error: null } + } + catch (error) { + return { error: error.message, sameReservedControl: original === window.art.controls.thumbnails } + } + finally { window.art.destroy() } + }) + expect(state.error).toContain('Can\'t add an existing [thumbnails] to the [control]') + expect(state.sameReservedControl).toBe(true) + await testInfo.attach('vtt-historical-conflict', { contentType: 'application/json', body: JSON.stringify({ core, plugin: implementation.name, sha256: hash(implementation.code), state, scope: 'Existing incompatibility, not successful old-plugin/new-core acceptance and not a newly introduced refactor regression' }) }) + }) +} + +test.describe('VTT mobile event integration', () => { + test.use({ userAgent: 'Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 Chrome/120.0.0.0 Mobile Safari/537.36', hasTouch: true }) + for (const core of cores) { + test(`VTT candidate / ${core}: emulated mobile drag routes through core progress and releases hiding timer`, async ({ page }, testInfo) => { + await install(page, core, candidate, testInfo) + const sample = await page.evaluate(() => { + const art = window.art + const progress = art.template.$progress + const box = progress.getBoundingClientRect() + const events = [] + art.on('setBar', (type, percentage, event) => { + if (event) + events.push({ type, percentage, nativeType: event.type }) + }) + function touch(type, percentage) { + const x = box.left + box.width * percentage + const y = box.top + box.height / 2 + const point = { identifier: 1, target: progress, clientX: x, clientY: y, pageX: x + scrollX, pageY: y + scrollY } + const event = new Event(type, { bubbles: true, cancelable: true }) + Object.defineProperties(event, { touches: { value: type === 'touchend' ? [] : [point] }, changedTouches: { value: [point] } }) + progress.dispatchEvent(event) + } + touch('touchstart', 0.25) + touch('touchmove', 0.75) + touch('touchend', 0.75) + const control = art.controls['vtt-thumbnail'] + return { mobile: window.Artplayer.utils.isMobile, events, position: control.style.backgroundPosition, display: control.style.display, time: art.currentTime, duration: art.duration } + }) + expect(sample.mobile).toBe(true) + expect(sample.events.some(event => event.nativeType === 'touchmove' && event.type === 'played')).toBe(true) + expect(sample.display).toBe('flex') + expect(sample.position).toBe('-80px 0px') + expect(sample.time / sample.duration).toBeGreaterThan(0.5) + await expect(page.locator('.art-control-vtt-thumbnail')).toHaveCSS('display', 'none') + await page.evaluate(() => window.art.destroy(false)) + await expect(page.locator('.art-control-vtt-thumbnail')).toHaveCount(0) + await testInfo.attach('vtt-mobile-event-integration', { contentType: 'application/json', body: JSON.stringify({ core, sample, scope: 'Android user agent and synthetic DOM touch payloads through actual core handlers; native media seek and real hide timer. Not trusted OS touch, real Android, or iOS Safari acceptance.' }) }) + }) + } +})