From e0d47ea74b25e8fc999d53d27605bf5ed551c106 Mon Sep 17 00:00:00 2001 From: Harvey Zhao Date: Sat, 12 Sep 2026 04:16:32 +0800 Subject: [PATCH] fix(chapter): [PKG-CHAPTER-05] checkpoint composition tests and bounded title layout --- docs/compiled/artplayer-plugin-chapter.js | 2 +- .../artplayer-plugin-chapter.legacy.js | 2 +- docs/compiled/artplayer-plugin-chapter.mjs | 2 +- .../artplayer-plugin-chapter/ARCHITECTURE.md | 14 + .../dist/artplayer-plugin-chapter.js | 2 +- .../dist/artplayer-plugin-chapter.legacy.js | 2 +- .../dist/artplayer-plugin-chapter.mjs | 2 +- .../artplayer-plugin-chapter/src/style.less | 4 + .../chapter-combinations-checkpoint.json | 7602 +++++++++++++++++ .../2026-09-12-PKG-CHAPTER-05-combinations.md | 60 + refactor/plan.md | 5 +- refactor/progress.md | 15 + refactor/risk-table.md | 2 + refactor/risks.json | 37 + refactor/tasks.json | 7 +- test/browser/chapter-combinations.spec.js | 194 + 16 files changed, 7942 insertions(+), 10 deletions(-) create mode 100644 refactor/baselines/chapter-combinations-checkpoint.json create mode 100644 refactor/changes/2026-09-12-PKG-CHAPTER-05-combinations.md create mode 100644 test/browser/chapter-combinations.spec.js diff --git a/docs/compiled/artplayer-plugin-chapter.js b/docs/compiled/artplayer-plugin-chapter.js index 543d58460..af7b8bddf 100644 --- a/docs/compiled/artplayer-plugin-chapter.js +++ b/docs/compiled/artplayer-plugin-chapter.js @@ -4,4 +4,4 @@ * (c) 2017-2026 Harvey Zhao * Released under the MIT License. */ -!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginChapter=e(),define(function(){return t.artplayerPluginChapter})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginChapter=e()}(this,function(){"use strict";return function(){if("undefined"===typeof document)return;const t="artplayer-plugin-chapter",e=()=>{let e=document.getElementById(t);e||(e=document.createElement("style"),e.id=t,(document.head||document.documentElement).appendChild(e)),e.textContent=".artplayer-plugin-chapter .art-control-progress-inner{height:100%!important;background-color:transparent!important}.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-hover,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-loaded,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-played{display:none!important}.artplayer-plugin-chapter .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 64px)!important}.artplayer-plugin-chapter .art-chapters{position:absolute;z-index:0;inset:0;display:flex;align-items:center;gap:4px;height:100%;transform:scaleY(1.25)}.artplayer-plugin-chapter .art-chapters .art-chapter{display:flex;align-items:center;height:100%}.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner{position:relative;cursor:pointer;width:100%;height:50%;border-radius:10px;overflow:hidden;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner{height:100%}.artplayer-plugin-chapter .art-chapter-title{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:70;top:-50px;left:0;padding:3px 5px;line-height:1;font-size:14px;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.artplayer-plugin-chapter.art-progress-hover .art-chapter-title{transform:scale(1);opacity:1}"};document.getElementById(t)||"loading"!==document.readyState?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}(),function(t={}){return e=>{const r=e.template.$player,a=e.query(".art-control-progress-inner");if(!a)throw new Error("Missing ArtPlayer progress container");const n="artplayer-plugin-chapter";let o=function(t){const e=(e,r)=>{const a=t.ownerDocument.createElement("div");return a.className=r,e.appendChild(a),a},r=e(t,"art-chapters"),a=e(t,"art-chapter-title");let n=[];function o(){a.textContent="",a.style.left="0px",a.style.visibility="hidden"}function i(){n=[],r.textContent="",o()}return o(),{clear:i,render:function(t,a){n=t.map(t=>{const n=e(r,"art-chapter"),o=e(n,"art-chapter-inner"),i=t.end-t.start;return n.dataset.start=String(t.start),n.dataset.end=String(t.end),n.dataset.duration=String(i),n.dataset.title=t.title.trim(),n.style.width=i/a*100+"%",{start:t.start,end:t.end,title:t.title.trim(),bars:{hover:e(o,"art-progress-hover"),loaded:e(o,"art-progress-loaded"),played:e(o,"art-progress-played")}}})},setBar:function(e,i,s){if("hover"!==e&&"loaded"!==e&&"played"!==e)return;if(!Number.isFinite(i))return;const l=s*i;let p;for(const t of n)t.bars[e].style.width=lt.end?"100%":(l-t.start)/(t.end-t.start)*100+"%",l>=t.start&&l<=t.end&&(p=t);if("hover"!==e)return;o();const d=r.clientWidth*i;p?.title&&d>0&&(a.textContent=p.title,a.style.visibility="visible",a.style.left=`${Math.max(0,Math.min(d-a.clientWidth/2,t.clientWidth-a.clientWidth))}px`)},destroy:function(){i(),r.remove(),a.remove()}}}(a);function i(t){if(!o||e.isDestroy)return;o.clear(),r.classList.remove(n);const a=function(t=[],e){if(!Array.isArray(t)||!t.length||!Number.isFinite(e)||e<=0)return[];t.sort((t,e)=>t.start-e.start);for(const[n,o]of t.entries()){if(!o||"number"!==typeof o.start||"number"!==typeof o.end||"string"!==typeof o.title)throw new TypeError("Illegal chapter data type");o.end===1/0&&(o.end=e);const r=t[n+1];if(!Number.isFinite(o.start)||!Number.isFinite(o.end)||o.start<0||o.end>e||o.start>=o.end||r&&o.end>r.start)throw new Error("Illegal chapter time point")}const r=t[0],a=t[t.length-1];r&&r.start>0&&t.unshift({start:0,end:r.start,title:""}),a&&a.endi(t)}}}}); +!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginChapter=e(),define(function(){return t.artplayerPluginChapter})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginChapter=e()}(this,function(){"use strict";return function(){if("undefined"===typeof document)return;const t="artplayer-plugin-chapter",e=()=>{let e=document.getElementById(t);e||(e=document.createElement("style"),e.id=t,(document.head||document.documentElement).appendChild(e)),e.textContent=".artplayer-plugin-chapter .art-control-progress-inner{height:100%!important;background-color:transparent!important}.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-hover,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-loaded,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-played{display:none!important}.artplayer-plugin-chapter .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 64px)!important}.artplayer-plugin-chapter .art-chapters{position:absolute;z-index:0;inset:0;display:flex;align-items:center;gap:4px;height:100%;transform:scaleY(1.25)}.artplayer-plugin-chapter .art-chapters .art-chapter{display:flex;align-items:center;height:100%}.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner{position:relative;cursor:pointer;width:100%;height:50%;border-radius:10px;overflow:hidden;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner{height:100%}.artplayer-plugin-chapter .art-chapter-title{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:70;top:-50px;left:0;padding:3px 5px;line-height:1;font-size:14px;border-radius:var(--art-border-radius);white-space:nowrap;box-sizing:border-box;max-width:100%;overflow:hidden;text-overflow:ellipsis;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.artplayer-plugin-chapter.art-progress-hover .art-chapter-title{transform:scale(1);opacity:1}"};document.getElementById(t)||"loading"!==document.readyState?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}(),function(t={}){return e=>{const r=e.template.$player,a=e.query(".art-control-progress-inner");if(!a)throw new Error("Missing ArtPlayer progress container");const n="artplayer-plugin-chapter";let o=function(t){const e=(e,r)=>{const a=t.ownerDocument.createElement("div");return a.className=r,e.appendChild(a),a},r=e(t,"art-chapters"),a=e(t,"art-chapter-title");let n=[];function o(){a.textContent="",a.style.left="0px",a.style.visibility="hidden"}function i(){n=[],r.textContent="",o()}return o(),{clear:i,render:function(t,a){n=t.map(t=>{const n=e(r,"art-chapter"),o=e(n,"art-chapter-inner"),i=t.end-t.start;return n.dataset.start=String(t.start),n.dataset.end=String(t.end),n.dataset.duration=String(i),n.dataset.title=t.title.trim(),n.style.width=i/a*100+"%",{start:t.start,end:t.end,title:t.title.trim(),bars:{hover:e(o,"art-progress-hover"),loaded:e(o,"art-progress-loaded"),played:e(o,"art-progress-played")}}})},setBar:function(e,i,s){if("hover"!==e&&"loaded"!==e&&"played"!==e)return;if(!Number.isFinite(i))return;const l=s*i;let d;for(const t of n)t.bars[e].style.width=lt.end?"100%":(l-t.start)/(t.end-t.start)*100+"%",l>=t.start&&l<=t.end&&(d=t);if("hover"!==e)return;o();const p=r.clientWidth*i;d?.title&&p>0&&(a.textContent=d.title,a.style.visibility="visible",a.style.left=`${Math.max(0,Math.min(p-a.clientWidth/2,t.clientWidth-a.clientWidth))}px`)},destroy:function(){i(),r.remove(),a.remove()}}}(a);function i(t){if(!o||e.isDestroy)return;o.clear(),r.classList.remove(n);const a=function(t=[],e){if(!Array.isArray(t)||!t.length||!Number.isFinite(e)||e<=0)return[];t.sort((t,e)=>t.start-e.start);for(const[n,o]of t.entries()){if(!o||"number"!==typeof o.start||"number"!==typeof o.end||"string"!==typeof o.title)throw new TypeError("Illegal chapter data type");o.end===1/0&&(o.end=e);const r=t[n+1];if(!Number.isFinite(o.start)||!Number.isFinite(o.end)||o.start<0||o.end>e||o.start>=o.end||r&&o.end>r.start)throw new Error("Illegal chapter time point")}const r=t[0],a=t[t.length-1];r&&r.start>0&&t.unshift({start:0,end:r.start,title:""}),a&&a.endi(t)}}}}); diff --git a/docs/compiled/artplayer-plugin-chapter.legacy.js b/docs/compiled/artplayer-plugin-chapter.legacy.js index bca6e83f4..31087aeff 100644 --- a/docs/compiled/artplayer-plugin-chapter.legacy.js +++ b/docs/compiled/artplayer-plugin-chapter.legacy.js @@ -4,4 +4,4 @@ * (c) 2017-2026 Harvey Zhao * Released under the MIT License. */ -!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginChapter=e(),define(function(){return t.artplayerPluginChapter})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginChapter=e()}(this,function(){"use strict";return function(){if("undefined"===typeof document)return;const t="artplayer-plugin-chapter",e=()=>{let e=document.getElementById(t);e||(e=document.createElement("style"),e.id=t,(document.head||document.documentElement).appendChild(e)),e.textContent=".artplayer-plugin-chapter .art-control-progress-inner{height:100%!important;background-color:transparent!important}.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-hover,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-loaded,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-played{display:none!important}.artplayer-plugin-chapter .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 64px)!important}.artplayer-plugin-chapter .art-chapters{position:absolute;z-index:0;inset:0;display:flex;align-items:center;gap:4px;height:100%;transform:scaleY(1.25)}.artplayer-plugin-chapter .art-chapters .art-chapter{display:flex;align-items:center;height:100%}.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner{position:relative;cursor:pointer;width:100%;height:50%;border-radius:10px;overflow:hidden;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner{height:100%}.artplayer-plugin-chapter .art-chapter-title{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:70;top:-50px;left:0;padding:3px 5px;line-height:1;font-size:14px;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.artplayer-plugin-chapter.art-progress-hover .art-chapter-title{transform:scale(1);opacity:1}"};document.getElementById(t)||"loading"!==document.readyState?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}(),function(t={}){return e=>{const r=e.template.$player,a=e.query(".art-control-progress-inner");if(!a)throw new Error("Missing ArtPlayer progress container");const n="artplayer-plugin-chapter";let o=function(t){const e=(e,r)=>{const a=t.ownerDocument.createElement("div");return a.className=r,e.appendChild(a),a},r=e(t,"art-chapters"),a=e(t,"art-chapter-title");let n=[];function o(){a.textContent="",a.style.left="0px",a.style.visibility="hidden"}function i(){n=[],r.textContent="",o()}return o(),{clear:i,render:function(t,a){n=t.map(t=>{const n=e(r,"art-chapter"),o=e(n,"art-chapter-inner"),i=t.end-t.start;return n.dataset.start=String(t.start),n.dataset.end=String(t.end),n.dataset.duration=String(i),n.dataset.title=t.title.trim(),n.style.width=i/a*100+"%",{start:t.start,end:t.end,title:t.title.trim(),bars:{hover:e(o,"art-progress-hover"),loaded:e(o,"art-progress-loaded"),played:e(o,"art-progress-played")}}})},setBar:function(e,i,s){if("hover"!==e&&"loaded"!==e&&"played"!==e)return;if(!Number.isFinite(i))return;const l=s*i;let p;for(const t of n)t.bars[e].style.width=lt.end?"100%":(l-t.start)/(t.end-t.start)*100+"%",l>=t.start&&l<=t.end&&(p=t);if("hover"!==e)return;o();const d=r.clientWidth*i;(null==p?void 0:p.title)&&d>0&&(a.textContent=p.title,a.style.visibility="visible",a.style.left=`${Math.max(0,Math.min(d-a.clientWidth/2,t.clientWidth-a.clientWidth))}px`)},destroy:function(){i(),r.remove(),a.remove()}}}(a);function i(t){if(!o||e.isDestroy)return;o.clear(),r.classList.remove(n);const a=function(t=[],e){if(!Array.isArray(t)||!t.length||!Number.isFinite(e)||e<=0)return[];t.sort((t,e)=>t.start-e.start);for(const[n,o]of t.entries()){if(!o||"number"!==typeof o.start||"number"!==typeof o.end||"string"!==typeof o.title)throw new TypeError("Illegal chapter data type");o.end===1/0&&(o.end=e);const r=t[n+1];if(!Number.isFinite(o.start)||!Number.isFinite(o.end)||o.start<0||o.end>e||o.start>=o.end||r&&o.end>r.start)throw new Error("Illegal chapter time point")}const r=t[0],a=t[t.length-1];r&&r.start>0&&t.unshift({start:0,end:r.start,title:""}),a&&a.endi(t)}}}}); +!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginChapter=e(),define(function(){return t.artplayerPluginChapter})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginChapter=e()}(this,function(){"use strict";return function(){if("undefined"===typeof document)return;const t="artplayer-plugin-chapter",e=()=>{let e=document.getElementById(t);e||(e=document.createElement("style"),e.id=t,(document.head||document.documentElement).appendChild(e)),e.textContent=".artplayer-plugin-chapter .art-control-progress-inner{height:100%!important;background-color:transparent!important}.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-hover,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-loaded,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-played{display:none!important}.artplayer-plugin-chapter .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 64px)!important}.artplayer-plugin-chapter .art-chapters{position:absolute;z-index:0;inset:0;display:flex;align-items:center;gap:4px;height:100%;transform:scaleY(1.25)}.artplayer-plugin-chapter .art-chapters .art-chapter{display:flex;align-items:center;height:100%}.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner{position:relative;cursor:pointer;width:100%;height:50%;border-radius:10px;overflow:hidden;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner{height:100%}.artplayer-plugin-chapter .art-chapter-title{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:70;top:-50px;left:0;padding:3px 5px;line-height:1;font-size:14px;border-radius:var(--art-border-radius);white-space:nowrap;box-sizing:border-box;max-width:100%;overflow:hidden;text-overflow:ellipsis;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.artplayer-plugin-chapter.art-progress-hover .art-chapter-title{transform:scale(1);opacity:1}"};document.getElementById(t)||"loading"!==document.readyState?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}(),function(t={}){return e=>{const r=e.template.$player,a=e.query(".art-control-progress-inner");if(!a)throw new Error("Missing ArtPlayer progress container");const n="artplayer-plugin-chapter";let o=function(t){const e=(e,r)=>{const a=t.ownerDocument.createElement("div");return a.className=r,e.appendChild(a),a},r=e(t,"art-chapters"),a=e(t,"art-chapter-title");let n=[];function o(){a.textContent="",a.style.left="0px",a.style.visibility="hidden"}function i(){n=[],r.textContent="",o()}return o(),{clear:i,render:function(t,a){n=t.map(t=>{const n=e(r,"art-chapter"),o=e(n,"art-chapter-inner"),i=t.end-t.start;return n.dataset.start=String(t.start),n.dataset.end=String(t.end),n.dataset.duration=String(i),n.dataset.title=t.title.trim(),n.style.width=i/a*100+"%",{start:t.start,end:t.end,title:t.title.trim(),bars:{hover:e(o,"art-progress-hover"),loaded:e(o,"art-progress-loaded"),played:e(o,"art-progress-played")}}})},setBar:function(e,i,s){if("hover"!==e&&"loaded"!==e&&"played"!==e)return;if(!Number.isFinite(i))return;const l=s*i;let d;for(const t of n)t.bars[e].style.width=lt.end?"100%":(l-t.start)/(t.end-t.start)*100+"%",l>=t.start&&l<=t.end&&(d=t);if("hover"!==e)return;o();const p=r.clientWidth*i;(null==d?void 0:d.title)&&p>0&&(a.textContent=d.title,a.style.visibility="visible",a.style.left=`${Math.max(0,Math.min(p-a.clientWidth/2,t.clientWidth-a.clientWidth))}px`)},destroy:function(){i(),r.remove(),a.remove()}}}(a);function i(t){if(!o||e.isDestroy)return;o.clear(),r.classList.remove(n);const a=function(t=[],e){if(!Array.isArray(t)||!t.length||!Number.isFinite(e)||e<=0)return[];t.sort((t,e)=>t.start-e.start);for(const[n,o]of t.entries()){if(!o||"number"!==typeof o.start||"number"!==typeof o.end||"string"!==typeof o.title)throw new TypeError("Illegal chapter data type");o.end===1/0&&(o.end=e);const r=t[n+1];if(!Number.isFinite(o.start)||!Number.isFinite(o.end)||o.start<0||o.end>e||o.start>=o.end||r&&o.end>r.start)throw new Error("Illegal chapter time point")}const r=t[0],a=t[t.length-1];r&&r.start>0&&t.unshift({start:0,end:r.start,title:""}),a&&a.endi(t)}}}}); diff --git a/docs/compiled/artplayer-plugin-chapter.mjs b/docs/compiled/artplayer-plugin-chapter.mjs index 3282cec07..ee8cad7c8 100644 --- a/docs/compiled/artplayer-plugin-chapter.mjs +++ b/docs/compiled/artplayer-plugin-chapter.mjs @@ -105,7 +105,7 @@ function createProgress(inner) { clearTitle(); return { clear, render, setBar, destroy }; } -const style = ".artplayer-plugin-chapter .art-control-progress-inner {\n height: 100% !important;\n background-color: transparent !important;\n}\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-hover,\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-loaded,\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-played {\n display: none !important;\n}\n.artplayer-plugin-chapter .art-control-thumbnails {\n bottom: calc(var(--art-bottom-gap) + 64px) !important;\n}\n.artplayer-plugin-chapter .art-chapters {\n position: absolute;\n z-index: 0;\n inset: 0;\n display: flex;\n align-items: center;\n gap: 4px;\n height: 100%;\n transform: scaleY(1.25);\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter {\n display: flex;\n align-items: center;\n height: 100%;\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner {\n position: relative;\n cursor: pointer;\n width: 100%;\n height: 50%;\n border-radius: 10px;\n overflow: hidden;\n transition: height var(--art-transition-duration) ease;\n background-color: var(--art-progress-color);\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner {\n height: 100%;\n}\n.artplayer-plugin-chapter .art-chapter-title {\n transform-origin: bottom center;\n transform: scale(0.5);\n opacity: 0;\n position: absolute;\n z-index: 70;\n top: -50px;\n left: 0;\n padding: 3px 5px;\n line-height: 1;\n font-size: 14px;\n border-radius: var(--art-border-radius);\n white-space: nowrap;\n background-color: var(--art-tip-background);\n transition: transform var(--art-transition-duration) ease, opacity var(--art-transition-duration) ease;\n}\n.artplayer-plugin-chapter.art-progress-hover .art-chapter-title {\n transform: scale(1);\n opacity: 1;\n}\n"; +const style = ".artplayer-plugin-chapter .art-control-progress-inner {\n height: 100% !important;\n background-color: transparent !important;\n}\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-hover,\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-loaded,\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-played {\n display: none !important;\n}\n.artplayer-plugin-chapter .art-control-thumbnails {\n bottom: calc(var(--art-bottom-gap) + 64px) !important;\n}\n.artplayer-plugin-chapter .art-chapters {\n position: absolute;\n z-index: 0;\n inset: 0;\n display: flex;\n align-items: center;\n gap: 4px;\n height: 100%;\n transform: scaleY(1.25);\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter {\n display: flex;\n align-items: center;\n height: 100%;\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner {\n position: relative;\n cursor: pointer;\n width: 100%;\n height: 50%;\n border-radius: 10px;\n overflow: hidden;\n transition: height var(--art-transition-duration) ease;\n background-color: var(--art-progress-color);\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner {\n height: 100%;\n}\n.artplayer-plugin-chapter .art-chapter-title {\n transform-origin: bottom center;\n transform: scale(0.5);\n opacity: 0;\n position: absolute;\n z-index: 70;\n top: -50px;\n left: 0;\n padding: 3px 5px;\n line-height: 1;\n font-size: 14px;\n border-radius: var(--art-border-radius);\n white-space: nowrap;\n box-sizing: border-box;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n background-color: var(--art-tip-background);\n transition: transform var(--art-transition-duration) ease, opacity var(--art-transition-duration) ease;\n}\n.artplayer-plugin-chapter.art-progress-hover .art-chapter-title {\n transform: scale(1);\n opacity: 1;\n}\n"; function installStyle() { if (typeof document === "undefined") return; diff --git a/packages/artplayer-plugin-chapter/ARCHITECTURE.md b/packages/artplayer-plugin-chapter/ARCHITECTURE.md index cb31566f0..bbb79f33d 100644 --- a/packages/artplayer-plugin-chapter/ARCHITECTURE.md +++ b/packages/artplayer-plugin-chapter/ARCHITECTURE.md @@ -36,6 +36,9 @@ attributes. A successful update adds the historical player class, then emits `setBar('loaded', art.loaded || 0)` synchronously. Progress events update the three bars; a shared boundary belongs to the later chapter for hover title selection, matching the old traversal order. Titles use textContent, never caller HTML. +Title boxes are limited to the progress container width, including their padding, +and display an ellipsis for long text. Full textContent and data-title remain intact. +The renderer still clamps horizontal position; CSS owns text clipping, not normalization. `update({})` and non-array chapter input clear the view. Invalid types throw TypeError and invalid time ranges throw Error with the existing messages. NaN and @@ -83,6 +86,17 @@ For UI, start at progress.ts/style.less and verify real mouse interaction. For e or cleanup changes, start at index.ts and rerun early destroy/multiple-instance tests. Any public declaration change also needs new/old compiler and tarball consumers. +`test/browser/chapter-combinations.spec.js` adds old/new core and plugin combinations +with quality selection, actual thumbnail hover, narrow titles, element fullscreen, +web fullscreen reparenting and trusted taps. Quality menus must finish opening before +selection and lose pointer/focus before progress hover. The published core hides its +menu with opacity/pointer-events; it does not use the candidate visibility rule. +The published core also has a recorded Windows WebKit quality-position reset; keep +that historical observation separate from the candidate's position-restoration assertion. +The touch cases use a 390px viewport, hasTouch and an iPhone user agent on the desktop +engines. They validate the mobile branch and trusted input, not an actual iPhone. +See refactor/changes/2026-09-12-PKG-CHAPTER-05-combinations.md for current evidence and gaps. + The public declaration remains available to old compilers and exports Chapters, Option and Result as types. Modern import/require conditions select format-specific bridges; typesVersions provides the legacy subpath to old resolvers. All bridges diff --git a/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.js b/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.js index 543d58460..af7b8bddf 100644 --- a/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.js +++ b/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.js @@ -4,4 +4,4 @@ * (c) 2017-2026 Harvey Zhao * Released under the MIT License. */ -!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginChapter=e(),define(function(){return t.artplayerPluginChapter})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginChapter=e()}(this,function(){"use strict";return function(){if("undefined"===typeof document)return;const t="artplayer-plugin-chapter",e=()=>{let e=document.getElementById(t);e||(e=document.createElement("style"),e.id=t,(document.head||document.documentElement).appendChild(e)),e.textContent=".artplayer-plugin-chapter .art-control-progress-inner{height:100%!important;background-color:transparent!important}.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-hover,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-loaded,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-played{display:none!important}.artplayer-plugin-chapter .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 64px)!important}.artplayer-plugin-chapter .art-chapters{position:absolute;z-index:0;inset:0;display:flex;align-items:center;gap:4px;height:100%;transform:scaleY(1.25)}.artplayer-plugin-chapter .art-chapters .art-chapter{display:flex;align-items:center;height:100%}.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner{position:relative;cursor:pointer;width:100%;height:50%;border-radius:10px;overflow:hidden;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner{height:100%}.artplayer-plugin-chapter .art-chapter-title{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:70;top:-50px;left:0;padding:3px 5px;line-height:1;font-size:14px;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.artplayer-plugin-chapter.art-progress-hover .art-chapter-title{transform:scale(1);opacity:1}"};document.getElementById(t)||"loading"!==document.readyState?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}(),function(t={}){return e=>{const r=e.template.$player,a=e.query(".art-control-progress-inner");if(!a)throw new Error("Missing ArtPlayer progress container");const n="artplayer-plugin-chapter";let o=function(t){const e=(e,r)=>{const a=t.ownerDocument.createElement("div");return a.className=r,e.appendChild(a),a},r=e(t,"art-chapters"),a=e(t,"art-chapter-title");let n=[];function o(){a.textContent="",a.style.left="0px",a.style.visibility="hidden"}function i(){n=[],r.textContent="",o()}return o(),{clear:i,render:function(t,a){n=t.map(t=>{const n=e(r,"art-chapter"),o=e(n,"art-chapter-inner"),i=t.end-t.start;return n.dataset.start=String(t.start),n.dataset.end=String(t.end),n.dataset.duration=String(i),n.dataset.title=t.title.trim(),n.style.width=i/a*100+"%",{start:t.start,end:t.end,title:t.title.trim(),bars:{hover:e(o,"art-progress-hover"),loaded:e(o,"art-progress-loaded"),played:e(o,"art-progress-played")}}})},setBar:function(e,i,s){if("hover"!==e&&"loaded"!==e&&"played"!==e)return;if(!Number.isFinite(i))return;const l=s*i;let p;for(const t of n)t.bars[e].style.width=lt.end?"100%":(l-t.start)/(t.end-t.start)*100+"%",l>=t.start&&l<=t.end&&(p=t);if("hover"!==e)return;o();const d=r.clientWidth*i;p?.title&&d>0&&(a.textContent=p.title,a.style.visibility="visible",a.style.left=`${Math.max(0,Math.min(d-a.clientWidth/2,t.clientWidth-a.clientWidth))}px`)},destroy:function(){i(),r.remove(),a.remove()}}}(a);function i(t){if(!o||e.isDestroy)return;o.clear(),r.classList.remove(n);const a=function(t=[],e){if(!Array.isArray(t)||!t.length||!Number.isFinite(e)||e<=0)return[];t.sort((t,e)=>t.start-e.start);for(const[n,o]of t.entries()){if(!o||"number"!==typeof o.start||"number"!==typeof o.end||"string"!==typeof o.title)throw new TypeError("Illegal chapter data type");o.end===1/0&&(o.end=e);const r=t[n+1];if(!Number.isFinite(o.start)||!Number.isFinite(o.end)||o.start<0||o.end>e||o.start>=o.end||r&&o.end>r.start)throw new Error("Illegal chapter time point")}const r=t[0],a=t[t.length-1];r&&r.start>0&&t.unshift({start:0,end:r.start,title:""}),a&&a.endi(t)}}}}); +!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginChapter=e(),define(function(){return t.artplayerPluginChapter})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginChapter=e()}(this,function(){"use strict";return function(){if("undefined"===typeof document)return;const t="artplayer-plugin-chapter",e=()=>{let e=document.getElementById(t);e||(e=document.createElement("style"),e.id=t,(document.head||document.documentElement).appendChild(e)),e.textContent=".artplayer-plugin-chapter .art-control-progress-inner{height:100%!important;background-color:transparent!important}.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-hover,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-loaded,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-played{display:none!important}.artplayer-plugin-chapter .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 64px)!important}.artplayer-plugin-chapter .art-chapters{position:absolute;z-index:0;inset:0;display:flex;align-items:center;gap:4px;height:100%;transform:scaleY(1.25)}.artplayer-plugin-chapter .art-chapters .art-chapter{display:flex;align-items:center;height:100%}.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner{position:relative;cursor:pointer;width:100%;height:50%;border-radius:10px;overflow:hidden;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner{height:100%}.artplayer-plugin-chapter .art-chapter-title{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:70;top:-50px;left:0;padding:3px 5px;line-height:1;font-size:14px;border-radius:var(--art-border-radius);white-space:nowrap;box-sizing:border-box;max-width:100%;overflow:hidden;text-overflow:ellipsis;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.artplayer-plugin-chapter.art-progress-hover .art-chapter-title{transform:scale(1);opacity:1}"};document.getElementById(t)||"loading"!==document.readyState?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}(),function(t={}){return e=>{const r=e.template.$player,a=e.query(".art-control-progress-inner");if(!a)throw new Error("Missing ArtPlayer progress container");const n="artplayer-plugin-chapter";let o=function(t){const e=(e,r)=>{const a=t.ownerDocument.createElement("div");return a.className=r,e.appendChild(a),a},r=e(t,"art-chapters"),a=e(t,"art-chapter-title");let n=[];function o(){a.textContent="",a.style.left="0px",a.style.visibility="hidden"}function i(){n=[],r.textContent="",o()}return o(),{clear:i,render:function(t,a){n=t.map(t=>{const n=e(r,"art-chapter"),o=e(n,"art-chapter-inner"),i=t.end-t.start;return n.dataset.start=String(t.start),n.dataset.end=String(t.end),n.dataset.duration=String(i),n.dataset.title=t.title.trim(),n.style.width=i/a*100+"%",{start:t.start,end:t.end,title:t.title.trim(),bars:{hover:e(o,"art-progress-hover"),loaded:e(o,"art-progress-loaded"),played:e(o,"art-progress-played")}}})},setBar:function(e,i,s){if("hover"!==e&&"loaded"!==e&&"played"!==e)return;if(!Number.isFinite(i))return;const l=s*i;let d;for(const t of n)t.bars[e].style.width=lt.end?"100%":(l-t.start)/(t.end-t.start)*100+"%",l>=t.start&&l<=t.end&&(d=t);if("hover"!==e)return;o();const p=r.clientWidth*i;d?.title&&p>0&&(a.textContent=d.title,a.style.visibility="visible",a.style.left=`${Math.max(0,Math.min(p-a.clientWidth/2,t.clientWidth-a.clientWidth))}px`)},destroy:function(){i(),r.remove(),a.remove()}}}(a);function i(t){if(!o||e.isDestroy)return;o.clear(),r.classList.remove(n);const a=function(t=[],e){if(!Array.isArray(t)||!t.length||!Number.isFinite(e)||e<=0)return[];t.sort((t,e)=>t.start-e.start);for(const[n,o]of t.entries()){if(!o||"number"!==typeof o.start||"number"!==typeof o.end||"string"!==typeof o.title)throw new TypeError("Illegal chapter data type");o.end===1/0&&(o.end=e);const r=t[n+1];if(!Number.isFinite(o.start)||!Number.isFinite(o.end)||o.start<0||o.end>e||o.start>=o.end||r&&o.end>r.start)throw new Error("Illegal chapter time point")}const r=t[0],a=t[t.length-1];r&&r.start>0&&t.unshift({start:0,end:r.start,title:""}),a&&a.endi(t)}}}}); diff --git a/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.legacy.js b/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.legacy.js index bca6e83f4..31087aeff 100644 --- a/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.legacy.js +++ b/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.legacy.js @@ -4,4 +4,4 @@ * (c) 2017-2026 Harvey Zhao * Released under the MIT License. */ -!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginChapter=e(),define(function(){return t.artplayerPluginChapter})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginChapter=e()}(this,function(){"use strict";return function(){if("undefined"===typeof document)return;const t="artplayer-plugin-chapter",e=()=>{let e=document.getElementById(t);e||(e=document.createElement("style"),e.id=t,(document.head||document.documentElement).appendChild(e)),e.textContent=".artplayer-plugin-chapter .art-control-progress-inner{height:100%!important;background-color:transparent!important}.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-hover,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-loaded,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-played{display:none!important}.artplayer-plugin-chapter .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 64px)!important}.artplayer-plugin-chapter .art-chapters{position:absolute;z-index:0;inset:0;display:flex;align-items:center;gap:4px;height:100%;transform:scaleY(1.25)}.artplayer-plugin-chapter .art-chapters .art-chapter{display:flex;align-items:center;height:100%}.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner{position:relative;cursor:pointer;width:100%;height:50%;border-radius:10px;overflow:hidden;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner{height:100%}.artplayer-plugin-chapter .art-chapter-title{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:70;top:-50px;left:0;padding:3px 5px;line-height:1;font-size:14px;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.artplayer-plugin-chapter.art-progress-hover .art-chapter-title{transform:scale(1);opacity:1}"};document.getElementById(t)||"loading"!==document.readyState?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}(),function(t={}){return e=>{const r=e.template.$player,a=e.query(".art-control-progress-inner");if(!a)throw new Error("Missing ArtPlayer progress container");const n="artplayer-plugin-chapter";let o=function(t){const e=(e,r)=>{const a=t.ownerDocument.createElement("div");return a.className=r,e.appendChild(a),a},r=e(t,"art-chapters"),a=e(t,"art-chapter-title");let n=[];function o(){a.textContent="",a.style.left="0px",a.style.visibility="hidden"}function i(){n=[],r.textContent="",o()}return o(),{clear:i,render:function(t,a){n=t.map(t=>{const n=e(r,"art-chapter"),o=e(n,"art-chapter-inner"),i=t.end-t.start;return n.dataset.start=String(t.start),n.dataset.end=String(t.end),n.dataset.duration=String(i),n.dataset.title=t.title.trim(),n.style.width=i/a*100+"%",{start:t.start,end:t.end,title:t.title.trim(),bars:{hover:e(o,"art-progress-hover"),loaded:e(o,"art-progress-loaded"),played:e(o,"art-progress-played")}}})},setBar:function(e,i,s){if("hover"!==e&&"loaded"!==e&&"played"!==e)return;if(!Number.isFinite(i))return;const l=s*i;let p;for(const t of n)t.bars[e].style.width=lt.end?"100%":(l-t.start)/(t.end-t.start)*100+"%",l>=t.start&&l<=t.end&&(p=t);if("hover"!==e)return;o();const d=r.clientWidth*i;(null==p?void 0:p.title)&&d>0&&(a.textContent=p.title,a.style.visibility="visible",a.style.left=`${Math.max(0,Math.min(d-a.clientWidth/2,t.clientWidth-a.clientWidth))}px`)},destroy:function(){i(),r.remove(),a.remove()}}}(a);function i(t){if(!o||e.isDestroy)return;o.clear(),r.classList.remove(n);const a=function(t=[],e){if(!Array.isArray(t)||!t.length||!Number.isFinite(e)||e<=0)return[];t.sort((t,e)=>t.start-e.start);for(const[n,o]of t.entries()){if(!o||"number"!==typeof o.start||"number"!==typeof o.end||"string"!==typeof o.title)throw new TypeError("Illegal chapter data type");o.end===1/0&&(o.end=e);const r=t[n+1];if(!Number.isFinite(o.start)||!Number.isFinite(o.end)||o.start<0||o.end>e||o.start>=o.end||r&&o.end>r.start)throw new Error("Illegal chapter time point")}const r=t[0],a=t[t.length-1];r&&r.start>0&&t.unshift({start:0,end:r.start,title:""}),a&&a.endi(t)}}}}); +!function(t,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"==typeof define&&define.amd?(t.artplayerPluginChapter=e(),define(function(){return t.artplayerPluginChapter})):(t="undefined"!==typeof globalThis?globalThis:t||self).artplayerPluginChapter=e()}(this,function(){"use strict";return function(){if("undefined"===typeof document)return;const t="artplayer-plugin-chapter",e=()=>{let e=document.getElementById(t);e||(e=document.createElement("style"),e.id=t,(document.head||document.documentElement).appendChild(e)),e.textContent=".artplayer-plugin-chapter .art-control-progress-inner{height:100%!important;background-color:transparent!important}.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-hover,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-loaded,.artplayer-plugin-chapter .art-control-progress-inner>.art-progress-played{display:none!important}.artplayer-plugin-chapter .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 64px)!important}.artplayer-plugin-chapter .art-chapters{position:absolute;z-index:0;inset:0;display:flex;align-items:center;gap:4px;height:100%;transform:scaleY(1.25)}.artplayer-plugin-chapter .art-chapters .art-chapter{display:flex;align-items:center;height:100%}.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner{position:relative;cursor:pointer;width:100%;height:50%;border-radius:10px;overflow:hidden;transition:height var(--art-transition-duration) ease;background-color:var(--art-progress-color)}.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner{height:100%}.artplayer-plugin-chapter .art-chapter-title{transform-origin:bottom center;transform:scale(.5);opacity:0;position:absolute;z-index:70;top:-50px;left:0;padding:3px 5px;line-height:1;font-size:14px;border-radius:var(--art-border-radius);white-space:nowrap;box-sizing:border-box;max-width:100%;overflow:hidden;text-overflow:ellipsis;background-color:var(--art-tip-background);transition:transform var(--art-transition-duration) ease,opacity var(--art-transition-duration) ease}.artplayer-plugin-chapter.art-progress-hover .art-chapter-title{transform:scale(1);opacity:1}"};document.getElementById(t)||"loading"!==document.readyState?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}(),function(t={}){return e=>{const r=e.template.$player,a=e.query(".art-control-progress-inner");if(!a)throw new Error("Missing ArtPlayer progress container");const n="artplayer-plugin-chapter";let o=function(t){const e=(e,r)=>{const a=t.ownerDocument.createElement("div");return a.className=r,e.appendChild(a),a},r=e(t,"art-chapters"),a=e(t,"art-chapter-title");let n=[];function o(){a.textContent="",a.style.left="0px",a.style.visibility="hidden"}function i(){n=[],r.textContent="",o()}return o(),{clear:i,render:function(t,a){n=t.map(t=>{const n=e(r,"art-chapter"),o=e(n,"art-chapter-inner"),i=t.end-t.start;return n.dataset.start=String(t.start),n.dataset.end=String(t.end),n.dataset.duration=String(i),n.dataset.title=t.title.trim(),n.style.width=i/a*100+"%",{start:t.start,end:t.end,title:t.title.trim(),bars:{hover:e(o,"art-progress-hover"),loaded:e(o,"art-progress-loaded"),played:e(o,"art-progress-played")}}})},setBar:function(e,i,s){if("hover"!==e&&"loaded"!==e&&"played"!==e)return;if(!Number.isFinite(i))return;const l=s*i;let d;for(const t of n)t.bars[e].style.width=lt.end?"100%":(l-t.start)/(t.end-t.start)*100+"%",l>=t.start&&l<=t.end&&(d=t);if("hover"!==e)return;o();const p=r.clientWidth*i;(null==d?void 0:d.title)&&p>0&&(a.textContent=d.title,a.style.visibility="visible",a.style.left=`${Math.max(0,Math.min(p-a.clientWidth/2,t.clientWidth-a.clientWidth))}px`)},destroy:function(){i(),r.remove(),a.remove()}}}(a);function i(t){if(!o||e.isDestroy)return;o.clear(),r.classList.remove(n);const a=function(t=[],e){if(!Array.isArray(t)||!t.length||!Number.isFinite(e)||e<=0)return[];t.sort((t,e)=>t.start-e.start);for(const[n,o]of t.entries()){if(!o||"number"!==typeof o.start||"number"!==typeof o.end||"string"!==typeof o.title)throw new TypeError("Illegal chapter data type");o.end===1/0&&(o.end=e);const r=t[n+1];if(!Number.isFinite(o.start)||!Number.isFinite(o.end)||o.start<0||o.end>e||o.start>=o.end||r&&o.end>r.start)throw new Error("Illegal chapter time point")}const r=t[0],a=t[t.length-1];r&&r.start>0&&t.unshift({start:0,end:r.start,title:""}),a&&a.endi(t)}}}}); diff --git a/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.mjs b/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.mjs index 3282cec07..ee8cad7c8 100644 --- a/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.mjs +++ b/packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.mjs @@ -105,7 +105,7 @@ function createProgress(inner) { clearTitle(); return { clear, render, setBar, destroy }; } -const style = ".artplayer-plugin-chapter .art-control-progress-inner {\n height: 100% !important;\n background-color: transparent !important;\n}\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-hover,\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-loaded,\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-played {\n display: none !important;\n}\n.artplayer-plugin-chapter .art-control-thumbnails {\n bottom: calc(var(--art-bottom-gap) + 64px) !important;\n}\n.artplayer-plugin-chapter .art-chapters {\n position: absolute;\n z-index: 0;\n inset: 0;\n display: flex;\n align-items: center;\n gap: 4px;\n height: 100%;\n transform: scaleY(1.25);\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter {\n display: flex;\n align-items: center;\n height: 100%;\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner {\n position: relative;\n cursor: pointer;\n width: 100%;\n height: 50%;\n border-radius: 10px;\n overflow: hidden;\n transition: height var(--art-transition-duration) ease;\n background-color: var(--art-progress-color);\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner {\n height: 100%;\n}\n.artplayer-plugin-chapter .art-chapter-title {\n transform-origin: bottom center;\n transform: scale(0.5);\n opacity: 0;\n position: absolute;\n z-index: 70;\n top: -50px;\n left: 0;\n padding: 3px 5px;\n line-height: 1;\n font-size: 14px;\n border-radius: var(--art-border-radius);\n white-space: nowrap;\n background-color: var(--art-tip-background);\n transition: transform var(--art-transition-duration) ease, opacity var(--art-transition-duration) ease;\n}\n.artplayer-plugin-chapter.art-progress-hover .art-chapter-title {\n transform: scale(1);\n opacity: 1;\n}\n"; +const style = ".artplayer-plugin-chapter .art-control-progress-inner {\n height: 100% !important;\n background-color: transparent !important;\n}\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-hover,\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-loaded,\n.artplayer-plugin-chapter .art-control-progress-inner > .art-progress-played {\n display: none !important;\n}\n.artplayer-plugin-chapter .art-control-thumbnails {\n bottom: calc(var(--art-bottom-gap) + 64px) !important;\n}\n.artplayer-plugin-chapter .art-chapters {\n position: absolute;\n z-index: 0;\n inset: 0;\n display: flex;\n align-items: center;\n gap: 4px;\n height: 100%;\n transform: scaleY(1.25);\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter {\n display: flex;\n align-items: center;\n height: 100%;\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter .art-chapter-inner {\n position: relative;\n cursor: pointer;\n width: 100%;\n height: 50%;\n border-radius: 10px;\n overflow: hidden;\n transition: height var(--art-transition-duration) ease;\n background-color: var(--art-progress-color);\n}\n.artplayer-plugin-chapter .art-chapters .art-chapter:hover .art-chapter-inner {\n height: 100%;\n}\n.artplayer-plugin-chapter .art-chapter-title {\n transform-origin: bottom center;\n transform: scale(0.5);\n opacity: 0;\n position: absolute;\n z-index: 70;\n top: -50px;\n left: 0;\n padding: 3px 5px;\n line-height: 1;\n font-size: 14px;\n border-radius: var(--art-border-radius);\n white-space: nowrap;\n box-sizing: border-box;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n background-color: var(--art-tip-background);\n transition: transform var(--art-transition-duration) ease, opacity var(--art-transition-duration) ease;\n}\n.artplayer-plugin-chapter.art-progress-hover .art-chapter-title {\n transform: scale(1);\n opacity: 1;\n}\n"; function installStyle() { if (typeof document === "undefined") return; diff --git a/packages/artplayer-plugin-chapter/src/style.less b/packages/artplayer-plugin-chapter/src/style.less index 36fa114b3..48b272822 100644 --- a/packages/artplayer-plugin-chapter/src/style.less +++ b/packages/artplayer-plugin-chapter/src/style.less @@ -59,6 +59,10 @@ font-size: 14px; border-radius: var(--art-border-radius); white-space: nowrap; + box-sizing: border-box; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; background-color: var(--art-tip-background); transition: transform var(--art-transition-duration) ease, diff --git a/refactor/baselines/chapter-combinations-checkpoint.json b/refactor/baselines/chapter-combinations-checkpoint.json new file mode 100644 index 000000000..c1c4a8caa --- /dev/null +++ b/refactor/baselines/chapter-combinations-checkpoint.json @@ -0,0 +1,7602 @@ +{ + "schemaVersion": 1, + "task": "PKG-CHAPTER-05", + "baseCommit": "d18c5456", + "status": "incomplete", + "scope": "Real desktop engines, element/web fullscreen, mobile branch with emulated touch; not physical iPhone/Safari/Android or final installed package acceptance. Earlier WebKit quality timing remains unexplained.", + "inputs": [ + { + "file": "packages/artplayer-plugin-chapter/src/style.less", + "sha256": "17572a96b62ba5588549edd948b879d119b97c670b40dac428839dd1160db7a8", + "bytes": 1766 + }, + { + "file": "packages/artplayer-plugin-chapter/src/progress.ts", + "sha256": "4a18d19ed703772d73622ea3fa9d433dbc2c6092ba244c9bb1ec727368996951", + "bytes": 2777 + }, + { + "file": "test/browser/chapter-combinations.spec.js", + "sha256": "308596abf9156942f462ac050fa49c36d65ab443917b9a4bb4c352d90e470f41", + "bytes": 12425 + }, + { + "file": "test/browser/chapter.spec.js", + "sha256": "d1332c5264bea179d4fd4ec3274eb0db28340bffbda3ffd37d80fc6fb636dca2", + "bytes": 14420 + } + ], + "artifacts": [ + { + "file": "packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.js", + "sha256": "179c3ea90ddc85da27b46f000110e32d464dfa5c8c394e98316dc1b75d6f2a72", + "bytes": 5197 + }, + { + "file": "packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.legacy.js", + "sha256": "dade919ed044cbf46ac16e505f538f86a86edccf177da2e14d79d111559d4bef", + "bytes": 5229 + }, + { + "file": "packages/artplayer-plugin-chapter/dist/artplayer-plugin-chapter.mjs", + "sha256": "754fbcfc60add74d6b6ad3bc8db253df3eb14ace13ac8a5439be0592bd5512d0", + "bytes": 8032 + } + ], + "reports": [ + { + "file": "refactor/.cache/chapter05-first.json", + "sha256": "4f5c8f1bc944cb6e72d58589e1bde2fd50374264587aaf35659f945816e06fbe", + "resultDir": "refactor/.cache/chapter05-first-results", + "stats": { + "startTime": "2026-09-11T20:02:47.633Z", + "duration": 72031.62800000001, + "expected": 36, + "skipped": 0, + "unexpected": 12, + "flaky": 0 + }, + "manifest": { + "kind": "artplayer-browser-test", + "resources": { + "/candidate/artplayer.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040 + }, + "/compiled/artplayer.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040, + "aliasOf": "/candidate/artplayer.js" + }, + "/uncompiled/artplayer/index.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040, + "aliasOf": "/candidate/artplayer.js" + }, + "/candidate/artplayer-plugin-chapter.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "3e8d0b7e7a90b5dbadf4cb108fd770d294f8a8a92ea089c41d0766c98bbc8230", + "bytes": 8433 + }, + "/compiled/artplayer-plugin-chapter.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "3e8d0b7e7a90b5dbadf4cb108fd770d294f8a8a92ea089c41d0766c98bbc8230", + "bytes": 8433, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/uncompiled/artplayer-plugin-chapter/index.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "3e8d0b7e7a90b5dbadf4cb108fd770d294f8a8a92ea089c41d0766c98bbc8230", + "bytes": 8433, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/published/artplayer.js": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "/published/artplayer-plugin-chapter.js": { + "source": { + "kind": "npm-release", + "version": "1.1.0", + "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==", + "member": "package/dist/artplayer-plugin-chapter.js" + }, + "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0", + "bytes": 4973 + }, + "/test/pattern.mp4": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.mp4" + }, + "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "bytes": 251538 + }, + "/test/pattern.webm": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.webm" + }, + "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f", + "bytes": 162073 + }, + "/test/audio-tone.m4a": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/audio-tone.m4a" + }, + "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "bytes": 132436 + }, + "/test/declaration-cues.vtt": { + "source": { + "kind": "test-subtitles", + "file": "test/browser/media/declaration-cues.vtt" + }, + "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704", + "bytes": 54 + }, + "/test/thumbnail-grid.svg": { + "source": { + "kind": "test-thumbnail-grid", + "file": "test/browser/media/thumbnail-grid.svg" + }, + "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6", + "bytes": 14969 + }, + "/test/legacy-safe-area.js": { + "source": { + "kind": "frozen-own-source", + "file": "test/helpers/legacy-safe-area.js", + "commit": "ccf77c4e" + }, + "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a", + "bytes": 795 + }, + "/assets/sample/video.mp4": { + "source": { + "kind": "docs-media", + "file": "docs/assets/sample/video.mp4" + }, + "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980", + "bytes": 5818706 + }, + "/test/performance.js": { + "source": { + "kind": "adapted-baseline-fixture", + "file": "refactor/fixtures/performance.js" + }, + "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500", + "bytes": 8994 + } + } + }, + "cases": [ + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(locator).toHaveText(expected) failed\n\nLocator: locator('.art-chapter-title')\nExpected: \"Ending\"\nReceived: \"Middle\"\nTimeout: 7000ms\n\nCall log:\n - Expect \"toHaveText\" locator('.art-chapter-title') with timeout 7000ms\n - waiting for locator('.art-chapter-title')\n 18 × locator resolved to
Middle
\n - unexpected value \"Middle\"\n\n\n 35 | const x = Math.round(box.x + box.width * percentage)\n 36 | await page.mouse.move(x, box.y + box.height / 2)\n> 37 | await expect(page.locator('.art-chapter-title')).toHaveText(text)\n | ^\n 38 | await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1')\n 39 | await expect(page.locator('.art-control-thumbnails')).toBeVisible()\n 40 | await expect.poll(() => page.evaluate(() => window.art.controls.thumbnails.style.backgroundImage)).not.toBe('')\n at hoverChapter (D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:37:52)\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:93:7" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.006451 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.006451, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(locator).toHaveText(expected) failed\n\nLocator: locator('.art-chapter-title')\nExpected: \"Ending\"\nReceived: \"\"\nTimeout: 7000ms\n\nCall log:\n - Expect \"toHaveText\" locator('.art-chapter-title') with timeout 7000ms\n - waiting for locator('.art-chapter-title')\n 17 × locator resolved to
\n - unexpected value \"\"\n\n\n 35 | const x = Math.round(box.x + box.width * percentage)\n 36 | await page.mouse.move(x, box.y + box.height / 2)\n> 37 | await expect(page.locator('.art-chapter-title')).toHaveText(text)\n | ^\n 38 | await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1')\n 39 | await expect(page.locator('.art-control-thumbnails')).toBeVisible()\n 40 | await expect.poll(() => page.evaluate(() => window.art.controls.thumbnails.style.backgroundImage)).not.toBe('')\n at hoverChapter (D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:37:52)\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:93:7" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.006451 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.006451, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(locator).toHaveText(expected) failed\n\nLocator: locator('.art-chapter-title')\nExpected: \"Ending\"\nReceived: \"Middle\"\nTimeout: 7000ms\n\nCall log:\n - Expect \"toHaveText\" locator('.art-chapter-title') with timeout 7000ms\n - waiting for locator('.art-chapter-title')\n 17 × locator resolved to
Middle
\n - unexpected value \"Middle\"\n\n\n 35 | const x = Math.round(box.x + box.width * percentage)\n 36 | await page.mouse.move(x, box.y + box.height / 2)\n> 37 | await expect(page.locator('.art-chapter-title')).toHaveText(text)\n | ^\n 38 | await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1')\n 39 | await expect(page.locator('.art-control-thumbnails')).toBeVisible()\n 40 | await expect.poll(() => page.evaluate(() => window.art.controls.thumbnails.style.backgroundImage)).not.toBe('')\n at hoverChapter (D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:37:52)\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:93:7" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.006451 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.006451, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(locator).toHaveText(expected) failed\n\nLocator: locator('.art-chapter-title')\nExpected: \"Ending\"\nReceived: \"\"\nTimeout: 7000ms\n\nCall log:\n - Expect \"toHaveText\" locator('.art-chapter-title') with timeout 7000ms\n - waiting for locator('.art-chapter-title')\n 17 × locator resolved to
\n - unexpected value \"\"\n\n\n 35 | const x = Math.round(box.x + box.width * percentage)\n 36 | await page.mouse.move(x, box.y + box.height / 2)\n> 37 | await expect(page.locator('.art-chapter-title')).toHaveText(text)\n | ^\n 38 | await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1')\n 39 | await expect(page.locator('.art-control-thumbnails')).toBeVisible()\n 40 | await expect.poll(() => page.evaluate(() => window.art.controls.thumbnails.style.backgroundImage)).not.toBe('')\n at hoverChapter (D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:37:52)\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:93:7" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.006451 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.006451, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(locator).toHaveText(expected) failed\n\nLocator: locator('.art-chapter-title')\nExpected: \"Ending\"\nReceived: \"Middle\"\nTimeout: 7000ms\n\nCall log:\n - Expect \"toHaveText\" locator('.art-chapter-title') with timeout 7000ms\n - waiting for locator('.art-chapter-title')\n 18 × locator resolved to
Middle
\n - unexpected value \"Middle\"\n\n\n 35 | const x = Math.round(box.x + box.width * percentage)\n 36 | await page.mouse.move(x, box.y + box.height / 2)\n> 37 | await expect(page.locator('.art-chapter-title')).toHaveText(text)\n | ^\n 38 | await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1')\n 39 | await expect(page.locator('.art-control-thumbnails')).toBeVisible()\n 40 | await expect.poll(() => page.evaluate(() => window.art.controls.thumbnails.style.backgroundImage)).not.toBe('')\n at hoverChapter (D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:37:52)\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:93:7" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0064516129032257, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(locator).toHaveText(expected) failed\n\nLocator: locator('.art-chapter-title')\nExpected: \"Ending\"\nReceived: \"\"\nTimeout: 7000ms\n\nCall log:\n - Expect \"toHaveText\" locator('.art-chapter-title') with timeout 7000ms\n - waiting for locator('.art-chapter-title')\n 17 × locator resolved to
\n - unexpected value \"\"\n\n\n 35 | const x = Math.round(box.x + box.width * percentage)\n 36 | await page.mouse.move(x, box.y + box.height / 2)\n> 37 | await expect(page.locator('.art-chapter-title')).toHaveText(text)\n | ^\n 38 | await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1')\n 39 | await expect(page.locator('.art-control-thumbnails')).toBeVisible()\n 40 | await expect.poll(() => page.evaluate(() => window.art.controls.thumbnails.style.backgroundImage)).not.toBe('')\n at hoverChapter (D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:37:52)\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:93:7" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0064516129032257, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(locator).toHaveText(expected) failed\n\nLocator: locator('.art-chapter-title')\nExpected: \"Ending\"\nReceived: \"Middle\"\nTimeout: 7000ms\n\nCall log:\n - Expect \"toHaveText\" locator('.art-chapter-title') with timeout 7000ms\n - waiting for locator('.art-chapter-title')\n 18 × locator resolved to
Middle
\n - unexpected value \"Middle\"\n\n\n 35 | const x = Math.round(box.x + box.width * percentage)\n 36 | await page.mouse.move(x, box.y + box.height / 2)\n> 37 | await expect(page.locator('.art-chapter-title')).toHaveText(text)\n | ^\n 38 | await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1')\n 39 | await expect(page.locator('.art-control-thumbnails')).toBeVisible()\n 40 | await expect.poll(() => page.evaluate(() => window.art.controls.thumbnails.style.backgroundImage)).not.toBe('')\n at hoverChapter (D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:37:52)\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:93:7" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0064516129032257, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(locator).toHaveText(expected) failed\n\nLocator: locator('.art-chapter-title')\nExpected: \"Ending\"\nReceived: \"\"\nTimeout: 7000ms\n\nCall log:\n - Expect \"toHaveText\" locator('.art-chapter-title') with timeout 7000ms\n - waiting for locator('.art-chapter-title')\n 17 × locator resolved to
\n - unexpected value \"\"\n\n\n 35 | const x = Math.round(box.x + box.width * percentage)\n 36 | await page.mouse.move(x, box.y + box.height / 2)\n> 37 | await expect(page.locator('.art-chapter-title')).toHaveText(text)\n | ^\n 38 | await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1')\n 39 | await expect(page.locator('.art-control-thumbnails')).toBeVisible()\n 40 | await expect.poll(() => page.evaluate(() => window.art.controls.thumbnails.style.backgroundImage)).not.toBe('')\n at hoverChapter (D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:37:52)\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:93:7" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0064516129032257, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(received).toBeCloseTo(expected, precision)\n\nExpected: 3.0090506\nReceived: 0.0014054\n\nExpected precision: 1\nExpected difference: < 0.05\nReceived difference: 3.0076452000000002\n\n 88 | await expect.poll(() => page.evaluate(() => window.chapterEvents.filter(event => event.name === 'restart').map(event => event.value))).toEqual(['/test/pattern.mp4?quality=A'])\n 89 | await expect.poll(() => page.evaluate(() => !window.art.video.seeking && window.art.video.readyState >= 2)).toBe(true)\n> 90 | expect(await page.evaluate(() => window.art.currentTime)).toBeCloseTo(time, 1)\n | ^\n 91 | expect(await page.evaluate(() => window.art.video.paused)).toBe(true)\n 92 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 93 | await hoverChapter(page, 0.85, 'Ending')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:90:65" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 0.0014054, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(received).toBeCloseTo(expected, precision)\n\nExpected: 3.0085156\nReceived: 0.0012485\n\nExpected precision: 1\nExpected difference: < 0.05\nReceived difference: 3.0072671\n\n 88 | await expect.poll(() => page.evaluate(() => window.chapterEvents.filter(event => event.name === 'restart').map(event => event.value))).toEqual(['/test/pattern.mp4?quality=A'])\n 89 | await expect.poll(() => page.evaluate(() => !window.art.video.seeking && window.art.video.readyState >= 2)).toBe(true)\n> 90 | expect(await page.evaluate(() => window.art.currentTime)).toBeCloseTo(time, 1)\n | ^\n 91 | expect(await page.evaluate(() => window.art.video.paused)).toBe(true)\n 92 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 93 | await hoverChapter(page, 0.85, 'Ending')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:90:65" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 0.0012485, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(locator).toHaveText(expected) failed\n\nLocator: locator('.art-chapter-title')\nExpected: \"Ending\"\nReceived: \"Middle\"\nTimeout: 7000ms\n\nCall log:\n - Expect \"toHaveText\" locator('.art-chapter-title') with timeout 7000ms\n - waiting for locator('.art-chapter-title')\n 17 × locator resolved to
Middle
\n - unexpected value \"Middle\"\n\n\n 35 | const x = Math.round(box.x + box.width * percentage)\n 36 | await page.mouse.move(x, box.y + box.height / 2)\n> 37 | await expect(page.locator('.art-chapter-title')).toHaveText(text)\n | ^\n 38 | await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1')\n 39 | await expect(page.locator('.art-control-thumbnails')).toBeVisible()\n 40 | await expect.poll(() => page.evaluate(() => window.art.controls.thumbnails.style.backgroundImage)).not.toBe('')\n at hoverChapter (D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:37:52)\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:93:7" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0102866, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(locator).toHaveText(expected) failed\n\nLocator: locator('.art-chapter-title')\nExpected: \"Ending\"\nReceived: \"\"\nTimeout: 7000ms\n\nCall log:\n - Expect \"toHaveText\" locator('.art-chapter-title') with timeout 7000ms\n - waiting for locator('.art-chapter-title')\n 17 × locator resolved to
\n - unexpected value \"\"\n\n\n 35 | const x = Math.round(box.x + box.width * percentage)\n 36 | await page.mouse.move(x, box.y + box.height / 2)\n> 37 | await expect(page.locator('.art-chapter-title')).toHaveText(text)\n | ^\n 38 | await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1')\n 39 | await expect(page.locator('.art-control-thumbnails')).toBeVisible()\n 40 | await expect.poll(() => page.evaluate(() => window.art.controls.thumbnails.style.backgroundImage)).not.toBe('')\n at hoverChapter (D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:37:52)\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:93:7" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0076268, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + } + ] + }, + { + "file": "refactor/.cache/chapter05-quality-corrected.json", + "sha256": "3ec6666beca780467f70c5b9ed395fe4a8452f87d09fce9feeaae04a9cb28603", + "resultDir": "refactor/.cache/chapter05-quality-corrected-results", + "stats": { + "startTime": "2026-09-11T20:05:16.339Z", + "duration": 56382.548, + "expected": 0, + "skipped": 0, + "unexpected": 12, + "flaky": 0 + }, + "manifest": { + "kind": "artplayer-browser-test", + "resources": { + "/candidate/artplayer.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040 + }, + "/compiled/artplayer.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040, + "aliasOf": "/candidate/artplayer.js" + }, + "/uncompiled/artplayer/index.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040, + "aliasOf": "/candidate/artplayer.js" + }, + "/candidate/artplayer-plugin-chapter.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "3e8d0b7e7a90b5dbadf4cb108fd770d294f8a8a92ea089c41d0766c98bbc8230", + "bytes": 8433 + }, + "/compiled/artplayer-plugin-chapter.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "3e8d0b7e7a90b5dbadf4cb108fd770d294f8a8a92ea089c41d0766c98bbc8230", + "bytes": 8433, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/uncompiled/artplayer-plugin-chapter/index.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "3e8d0b7e7a90b5dbadf4cb108fd770d294f8a8a92ea089c41d0766c98bbc8230", + "bytes": 8433, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/published/artplayer.js": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "/published/artplayer-plugin-chapter.js": { + "source": { + "kind": "npm-release", + "version": "1.1.0", + "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==", + "member": "package/dist/artplayer-plugin-chapter.js" + }, + "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0", + "bytes": 4973 + }, + "/test/pattern.mp4": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.mp4" + }, + "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "bytes": 251538 + }, + "/test/pattern.webm": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.webm" + }, + "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f", + "bytes": 162073 + }, + "/test/audio-tone.m4a": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/audio-tone.m4a" + }, + "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "bytes": 132436 + }, + "/test/declaration-cues.vtt": { + "source": { + "kind": "test-subtitles", + "file": "test/browser/media/declaration-cues.vtt" + }, + "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704", + "bytes": 54 + }, + "/test/thumbnail-grid.svg": { + "source": { + "kind": "test-thumbnail-grid", + "file": "test/browser/media/thumbnail-grid.svg" + }, + "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6", + "bytes": 14969 + }, + "/test/legacy-safe-area.js": { + "source": { + "kind": "frozen-own-source", + "file": "test/helpers/legacy-safe-area.js", + "commit": "ccf77c4e" + }, + "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a", + "bytes": 795 + }, + "/assets/sample/video.mp4": { + "source": { + "kind": "docs-media", + "file": "docs/assets/sample/video.mp4" + }, + "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980", + "bytes": 5818706 + }, + "/test/performance.js": { + "source": { + "kind": "adapted-baseline-fixture", + "file": "refactor/fixtures/performance.js" + }, + "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500", + "bytes": 8994 + } + } + }, + "cases": [ + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 18 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 102 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 103 | await page.locator('video').hover({ position: { x: 10, y: 10 } })\n> 104 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 105 | await hoverChapter(page, 0.85, 'Ending')\n 106 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 107 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:104:77" + ], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.006451 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.006451, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 18 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 102 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 103 | await page.locator('video').hover({ position: { x: 10, y: 10 } })\n> 104 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 105 | await hoverChapter(page, 0.85, 'Ending')\n 106 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 107 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:104:77" + ], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.006451 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.006451, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 18 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 102 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 103 | await page.locator('video').hover({ position: { x: 10, y: 10 } })\n> 104 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 105 | await hoverChapter(page, 0.85, 'Ending')\n 106 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 107 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:104:77" + ], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.006451 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.006451, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 18 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 102 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 103 | await page.locator('video').hover({ position: { x: 10, y: 10 } })\n> 104 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 105 | await hoverChapter(page, 0.85, 'Ending')\n 106 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 107 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:104:77" + ], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.006451 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.006451, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 17 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 102 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 103 | await page.locator('video').hover({ position: { x: 10, y: 10 } })\n> 104 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 105 | await hoverChapter(page, 0.85, 'Ending')\n 106 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 107 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:104:77" + ], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0064516129032257, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 17 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 102 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 103 | await page.locator('video').hover({ position: { x: 10, y: 10 } })\n> 104 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 105 | await hoverChapter(page, 0.85, 'Ending')\n 106 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 107 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:104:77" + ], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0064516129032257, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 18 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 102 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 103 | await page.locator('video').hover({ position: { x: 10, y: 10 } })\n> 104 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 105 | await hoverChapter(page, 0.85, 'Ending')\n 106 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 107 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:104:77" + ], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0064516129032257, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 17 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 102 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 103 | await page.locator('video').hover({ position: { x: 10, y: 10 } })\n> 104 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 105 | await hoverChapter(page, 0.85, 'Ending')\n 106 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 107 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:104:77" + ], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0064516129032257, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 17 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 102 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 103 | await page.locator('video').hover({ position: { x: 10, y: 10 } })\n> 104 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 105 | await hoverChapter(page, 0.85, 'Ending')\n 106 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 107 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:104:77" + ], + "quality-position": { + "before": 3.0076677, + "restoredTime": 0.0004156, + "historicalReset": true + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 0.0004156, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 17 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 102 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 103 | await page.locator('video').hover({ position: { x: 10, y: 10 } })\n> 104 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 105 | await hoverChapter(page, 0.85, 'Ending')\n 106 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 107 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:104:77" + ], + "quality-position": { + "before": 3.0070677, + "restoredTime": 0.0017557, + "historicalReset": true + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 0.0017557, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 17 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 102 |\n 103 | test(`${core} core + ${chapter} chapter: quality switch preserves chapter/thumbnail interactions`, async ({ page, browserName }, testInfo) => {\n> 104 | await openChapter(page, core, chapter)\n | ^\n 105 | await page.locator('#play').click()\n 106 | await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThan(0.2)\n 107 | await page.locator('#pause').click()\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:104:77" + ], + "quality-position": { + "before": 3.0071428, + "restoredTime": 3.007844, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.007844, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(received).toEqual(expected) // deep equality\n\n- Expected - 3\n+ Received + 1\n\n- Array [\n- \"/test/pattern.mp4?quality=A\",\n- ]\n+ Array []\n\nCall Log:\n- Timeout 7000ms exceeded while waiting on the predicate\n\n 90 | return { left: title.left, right: title.right, width: title.width, progressLeft: progress.left, progressRight: progress.right, text: element.textContent, dataset: element.parentElement.querySelector('.art-chapter').dataset.title }\n 91 | })\n> 92 | await testInfo.attach('long-chapter-layout', { contentType: 'application/json', body: JSON.stringify(layout) })\n | ^\n 93 | await testInfo.attach('long-chapter-title', { contentType: 'image/png', body: await page.screenshot() })\n 94 | expect(layout.text).toBe(fullTitle.trim())\n 95 | expect(layout.dataset).toBe(fullTitle.trim())\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:92:142" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0159574, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + } + ] + }, + { + "file": "refactor/.cache/chapter05-long-before.json", + "sha256": "af957daeada40829c6fffbc1afccf64b546bdbd2996977d5cb8b9be03ff71822", + "resultDir": "refactor/.cache/chapter05-long-before-results", + "stats": { + "startTime": "2026-09-11T20:06:47.188Z", + "duration": 11232.953, + "expected": 6, + "skipped": 0, + "unexpected": 6, + "flaky": 0 + }, + "manifest": { + "kind": "artplayer-browser-test", + "resources": { + "/candidate/artplayer.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040 + }, + "/compiled/artplayer.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040, + "aliasOf": "/candidate/artplayer.js" + }, + "/uncompiled/artplayer/index.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040, + "aliasOf": "/candidate/artplayer.js" + }, + "/candidate/artplayer-plugin-chapter.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "3e8d0b7e7a90b5dbadf4cb108fd770d294f8a8a92ea089c41d0766c98bbc8230", + "bytes": 8433 + }, + "/compiled/artplayer-plugin-chapter.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "3e8d0b7e7a90b5dbadf4cb108fd770d294f8a8a92ea089c41d0766c98bbc8230", + "bytes": 8433, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/uncompiled/artplayer-plugin-chapter/index.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "3e8d0b7e7a90b5dbadf4cb108fd770d294f8a8a92ea089c41d0766c98bbc8230", + "bytes": 8433, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/published/artplayer.js": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "/published/artplayer-plugin-chapter.js": { + "source": { + "kind": "npm-release", + "version": "1.1.0", + "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==", + "member": "package/dist/artplayer-plugin-chapter.js" + }, + "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0", + "bytes": 4973 + }, + "/test/pattern.mp4": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.mp4" + }, + "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "bytes": 251538 + }, + "/test/pattern.webm": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.webm" + }, + "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f", + "bytes": 162073 + }, + "/test/audio-tone.m4a": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/audio-tone.m4a" + }, + "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "bytes": 132436 + }, + "/test/declaration-cues.vtt": { + "source": { + "kind": "test-subtitles", + "file": "test/browser/media/declaration-cues.vtt" + }, + "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704", + "bytes": 54 + }, + "/test/thumbnail-grid.svg": { + "source": { + "kind": "test-thumbnail-grid", + "file": "test/browser/media/thumbnail-grid.svg" + }, + "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6", + "bytes": 14969 + }, + "/test/legacy-safe-area.js": { + "source": { + "kind": "frozen-own-source", + "file": "test/helpers/legacy-safe-area.js", + "commit": "ccf77c4e" + }, + "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a", + "bytes": 795 + }, + "/assets/sample/video.mp4": { + "source": { + "kind": "docs-media", + "file": "docs/assets/sample/video.mp4" + }, + "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980", + "bytes": 5818706 + }, + "/test/performance.js": { + "source": { + "kind": "adapted-baseline-fixture", + "file": "refactor/fixtures/performance.js" + }, + "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500", + "bytes": 8994 + } + } + }, + "cases": [ + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 42.04638671875, + "right": 1853.42236328125, + "width": 1811.3759765625, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(received).toBeLessThanOrEqual(expected)\n\nExpected: <= 373\nReceived: 1877.46875\n\n 98 | expect(layout.right).toBeGreaterThan(layout.progressRight)\n 99 | else\n> 100 | expect(layout.right).toBeLessThanOrEqual(layout.progressRight + 1)\n | ^\n 101 | })\n 102 |\n 103 | test(`${core} core + ${chapter} chapter: quality switch preserves chapter/thumbnail interactions`, async ({ page, browserName }, testInfo) => {\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:100:30" + ], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + }, + "failureState": { + "events": [], + "time": 0, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + ] + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 42.0548095703125, + "right": 1853.4139404296875, + "width": 1811.359130859375, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(received).toBeLessThanOrEqual(expected)\n\nExpected: <= 373\nReceived: 1876.4349975585938\n\n 98 | expect(layout.right).toBeGreaterThan(layout.progressRight)\n 99 | else\n> 100 | expect(layout.right).toBeLessThanOrEqual(layout.progressRight + 1)\n | ^\n 101 | })\n 102 |\n 103 | test(`${core} core + ${chapter} chapter: quality switch preserves chapter/thumbnail interactions`, async ({ page, browserName }, testInfo) => {\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:100:30" + ], + "long-chapter-layout": { + "left": 19.03363037109375, + "right": 1876.4349975585938, + "width": 1857.4013671875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + }, + "failureState": { + "events": [], + "time": 0, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + ] + } + }, + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.8499755859375, + "width": 1859.8499755859375, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(received).toBeLessThanOrEqual(expected)\n\nExpected: <= 373\nReceived: 1877.8499755859375\n\n 98 | expect(layout.right).toBeGreaterThan(layout.progressRight)\n 99 | else\n> 100 | expect(layout.right).toBeLessThanOrEqual(layout.progressRight + 1)\n | ^\n 101 | })\n 102 |\n 103 | test(`${core} core + ${chapter} chapter: quality switch preserves chapter/thumbnail interactions`, async ({ page, browserName }, testInfo) => {\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:100:30" + ], + "long-chapter-layout": { + "left": 18, + "right": 1877.8499755859375, + "width": 1859.8499755859375, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + }, + "failureState": { + "events": [], + "time": 0, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + ] + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.8499755859375, + "width": 1859.8499755859375, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(received).toBeLessThanOrEqual(expected)\n\nExpected: <= 373\nReceived: 1877.8499755859375\n\n 98 | expect(layout.right).toBeGreaterThan(layout.progressRight)\n 99 | else\n> 100 | expect(layout.right).toBeLessThanOrEqual(layout.progressRight + 1)\n | ^\n 101 | })\n 102 |\n 103 | test(`${core} core + ${chapter} chapter: quality switch preserves chapter/thumbnail interactions`, async ({ page, browserName }, testInfo) => {\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:100:30" + ], + "long-chapter-layout": { + "left": 18, + "right": 1877.8499755859375, + "width": 1859.8499755859375, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + }, + "failureState": { + "events": [], + "time": 0, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + ] + } + }, + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(received).toBeLessThanOrEqual(expected)\n\nExpected: <= 373\nReceived: 1877.46875\n\n 98 | expect(layout.right).toBeGreaterThan(layout.progressRight)\n 99 | else\n> 100 | expect(layout.right).toBeLessThanOrEqual(layout.progressRight + 1)\n | ^\n 101 | })\n 102 |\n 103 | test(`${core} core + ${chapter} chapter: quality switch preserves chapter/thumbnail interactions`, async ({ page, browserName }, testInfo) => {\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:100:30" + ], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + }, + "failureState": { + "events": [], + "time": 0, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + ] + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(received).toBeLessThanOrEqual(expected)\n\nExpected: <= 373\nReceived: 1877.46875\n\n 98 | expect(layout.right).toBeGreaterThan(layout.progressRight)\n 99 | else\n> 100 | expect(layout.right).toBeLessThanOrEqual(layout.progressRight + 1)\n | ^\n 101 | })\n 102 |\n 103 | test(`${core} core + ${chapter} chapter: quality switch preserves chapter/thumbnail interactions`, async ({ page, browserName }, testInfo) => {\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:100:30" + ], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + }, + "failureState": { + "events": [], + "time": 0, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "8", + "duration": "8", + "title": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + ] + } + } + ] + }, + { + "file": "refactor/.cache/chapter05-quality-long-fixed.json", + "sha256": "889b28881ca8abb62e76c758b2c323f76054136740e098c9ead1de085c088b83", + "resultDir": "refactor/.cache/chapter05-quality-long-fixed-results", + "stats": { + "startTime": "2026-09-11T20:07:31.156Z", + "duration": 48410.413, + "expected": 17, + "skipped": 0, + "unexpected": 7, + "flaky": 0 + }, + "manifest": { + "kind": "artplayer-browser-test", + "resources": { + "/candidate/artplayer.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040 + }, + "/compiled/artplayer.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040, + "aliasOf": "/candidate/artplayer.js" + }, + "/uncompiled/artplayer/index.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040, + "aliasOf": "/candidate/artplayer.js" + }, + "/candidate/artplayer-plugin-chapter.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a", + "bytes": 8529 + }, + "/compiled/artplayer-plugin-chapter.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a", + "bytes": 8529, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/uncompiled/artplayer-plugin-chapter/index.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a", + "bytes": 8529, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/published/artplayer.js": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "/published/artplayer-plugin-chapter.js": { + "source": { + "kind": "npm-release", + "version": "1.1.0", + "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==", + "member": "package/dist/artplayer-plugin-chapter.js" + }, + "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0", + "bytes": 4973 + }, + "/test/pattern.mp4": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.mp4" + }, + "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "bytes": 251538 + }, + "/test/pattern.webm": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.webm" + }, + "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f", + "bytes": 162073 + }, + "/test/audio-tone.m4a": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/audio-tone.m4a" + }, + "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "bytes": 132436 + }, + "/test/declaration-cues.vtt": { + "source": { + "kind": "test-subtitles", + "file": "test/browser/media/declaration-cues.vtt" + }, + "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704", + "bytes": 54 + }, + "/test/thumbnail-grid.svg": { + "source": { + "kind": "test-thumbnail-grid", + "file": "test/browser/media/thumbnail-grid.svg" + }, + "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6", + "bytes": 14969 + }, + "/test/legacy-safe-area.js": { + "source": { + "kind": "frozen-own-source", + "file": "test/helpers/legacy-safe-area.js", + "commit": "ccf77c4e" + }, + "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a", + "bytes": 795 + }, + "/assets/sample/video.mp4": { + "source": { + "kind": "docs-media", + "file": "docs/assets/sample/video.mp4" + }, + "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980", + "bytes": 5818706 + }, + "/test/performance.js": { + "source": { + "kind": "adapted-baseline-fixture", + "file": "refactor/fixtures/performance.js" + }, + "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500", + "bytes": 8994 + } + } + }, + "cases": [ + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 18 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 127 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 128 | await page.locator('#pause').click()\n> 129 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 130 | await hoverChapter(page, 0.85, 'Ending')\n 131 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 132 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:129:77" + ], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.006451 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.006451, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "failed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 18 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 127 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 128 | await page.locator('#pause').click()\n> 129 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 130 | await hoverChapter(page, 0.85, 'Ending')\n 131 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 132 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:129:77" + ], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.006451 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.006451, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 55.527587890625, + "right": 1839.941162109375, + "width": 1784.41357421875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.8499755859375, + "width": 1859.8499755859375, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 17 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 127 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 128 | await page.locator('#pause').click()\n> 129 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 130 | await hoverChapter(page, 0.85, 'Ending')\n 131 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 132 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:129:77" + ], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0064516129032257, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "failed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 18 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 127 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 128 | await page.locator('#pause').click()\n> 129 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 130 | await hoverChapter(page, 0.85, 'Ending')\n 131 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 132 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:129:77" + ], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0064516129032257, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.8499755859375, + "width": 1859.8499755859375, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 20.183334350585938, + "right": 369.81666564941406, + "width": 349.6333312988281, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 17 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 127 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 128 | await page.locator('#pause').click()\n> 129 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 130 | await hoverChapter(page, 0.85, 'Ending')\n 131 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 132 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:129:77" + ], + "quality-position": { + "before": 3.0079177, + "restoredTime": 0.0023028, + "historicalReset": true + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 0.0023028, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(locator).toBeHidden() failed\n\nLocator: locator('.art-control-quality .art-selector-list')\nExpected: hidden\nReceived: visible\nTimeout: 7000ms\n\nCall log:\n - Expect \"toBeHidden\" locator('.art-control-quality .art-selector-list') with timeout 7000ms\n - waiting for locator('.art-control-quality .art-selector-list')\n 17 × locator resolved to
…
\n - unexpected value \"visible\"\n\n\n 127 | await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A')\n 128 | await page.locator('#pause').click()\n> 129 | await expect(page.locator('.art-control-quality .art-selector-list')).toBeHidden()\n | ^\n 130 | await hoverChapter(page, 0.85, 'Ending')\n 131 | await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] }))\n 132 | await hoverChapter(page, 0.5, 'Updated after quality')\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:129:77" + ], + "quality-position": { + "before": 3.0084229, + "restoredTime": 0.0010478, + "historicalReset": true + }, + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 0.0010478, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(received).toEqual(expected) // deep equality\n\n- Expected - 3\n+ Received + 1\n\n- Array [\n- \"/test/pattern.mp4?quality=A\",\n- ]\n+ Array []\n\nCall Log:\n- Timeout 7000ms exceeded while waiting on the predicate\n\n 115 | await page.locator('.art-control-quality').hover()\n 116 | await page.locator('.art-control-quality .art-selector-item').filter({ hasText: 'Quality A' }).click()\n> 117 | await expect.poll(() => page.evaluate(() => window.chapterEvents.filter(event => event.name === 'restart').map(event => event.value))).toEqual(['/test/pattern.mp4?quality=A'])\n | ^\n 118 | await expect.poll(() => page.evaluate(() => !window.art.video.seeking && window.art.video.readyState >= 2)).toBe(true)\n 119 | const restoredTime = await page.evaluate(() => window.art.currentTime)\n 120 | const historicalReset = core === 'published' && browserName === 'webkit'\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:117:142" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "time": 3.0115191, + "paused": true, + "mediaError": null, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0093409, + "restoredTime": 3.0135819, + "historicalReset": false + } + } + ] + }, + { + "file": "refactor/.cache/chapter05-quality-ready.json", + "sha256": "7e838f1809d5a6a37b78686521d5fe0066a6c6c82e1908f15b5b16b0b24ccf96", + "resultDir": "refactor/.cache/chapter05-quality-ready-results", + "stats": { + "startTime": "2026-09-11T20:09:14.622Z", + "duration": 34038.771, + "expected": 11, + "skipped": 0, + "unexpected": 1, + "flaky": 0 + }, + "manifest": { + "kind": "artplayer-browser-test", + "resources": { + "/candidate/artplayer.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040 + }, + "/compiled/artplayer.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040, + "aliasOf": "/candidate/artplayer.js" + }, + "/uncompiled/artplayer/index.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer\\src\\index.ts" + }, + "sha256": "df495dd386d32ea96be5006e1bbfda1ea91cfeb32aa21758197b46a155ebe0dc", + "bytes": 378040, + "aliasOf": "/candidate/artplayer.js" + }, + "/candidate/artplayer-plugin-chapter.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a", + "bytes": 8529 + }, + "/compiled/artplayer-plugin-chapter.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a", + "bytes": 8529, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/uncompiled/artplayer-plugin-chapter/index.js": { + "source": { + "kind": "workspace-build", + "entry": "packages\\artplayer-plugin-chapter\\src\\index.ts" + }, + "sha256": "1a8eb891d3690e2526e78a2e53183a25367b1d02a5fd349d821548edb731ee3a", + "bytes": 8529, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/published/artplayer.js": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "/published/artplayer-plugin-chapter.js": { + "source": { + "kind": "npm-release", + "version": "1.1.0", + "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==", + "member": "package/dist/artplayer-plugin-chapter.js" + }, + "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0", + "bytes": 4973 + }, + "/test/pattern.mp4": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.mp4" + }, + "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "bytes": 251538 + }, + "/test/pattern.webm": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.webm" + }, + "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f", + "bytes": 162073 + }, + "/test/audio-tone.m4a": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/audio-tone.m4a" + }, + "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "bytes": 132436 + }, + "/test/declaration-cues.vtt": { + "source": { + "kind": "test-subtitles", + "file": "test/browser/media/declaration-cues.vtt" + }, + "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704", + "bytes": 54 + }, + "/test/thumbnail-grid.svg": { + "source": { + "kind": "test-thumbnail-grid", + "file": "test/browser/media/thumbnail-grid.svg" + }, + "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6", + "bytes": 14969 + }, + "/test/legacy-safe-area.js": { + "source": { + "kind": "frozen-own-source", + "file": "test/helpers/legacy-safe-area.js", + "commit": "ccf77c4e" + }, + "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a", + "bytes": 795 + }, + "/assets/sample/video.mp4": { + "source": { + "kind": "docs-media", + "file": "docs/assets/sample/video.mp4" + }, + "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980", + "bytes": 5818706 + }, + "/test/performance.js": { + "source": { + "kind": "adapted-baseline-fixture", + "file": "refactor/fixtures/performance.js" + }, + "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500", + "bytes": 8994 + } + } + }, + "cases": [ + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0071684, + "restoredTime": 0.001508, + "historicalReset": true + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0075852, + "restoredTime": 0.0017081, + "historicalReset": true + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0091097, + "restoredTime": 3.0121734, + "historicalReset": false + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "failed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [ + "Error: expect(received).toEqual(expected) // deep equality\n\n- Expected - 3\n+ Received + 1\n\n- Array [\n- \"/test/pattern.mp4?quality=A\",\n- ]\n+ Array []\n\nCall Log:\n- Timeout 7000ms exceeded while waiting on the predicate\n\n 124 | await page.locator('.art-control-quality .art-selector-item').filter({ hasText: 'Quality A' }).click()\n 125 | await expect.poll(() => page.evaluate(() => window.art.url.includes('quality=A'))).toBe(true)\n> 126 | await expect.poll(() => page.evaluate(() => window.chapterEvents.filter(event => event.name === 'restart').map(event => event.value))).toEqual(['/test/pattern.mp4?quality=A'])\n | ^\n 127 | await expect.poll(() => page.evaluate(() => !window.art.video.seeking && window.art.video.readyState >= 2)).toBe(true)\n 128 | const restoredTime = await page.evaluate(() => window.art.currentTime)\n 129 | const historicalReset = core === 'published' && browserName === 'webkit'\n at D:\\github\\ArtPlayer\\test\\browser\\chapter-combinations.spec.js:126:142" + ], + "failureState": { + "events": [ + { + "name": "seek", + "value": 3.0064516129032257 + }, + { + "name": "restart", + "value": "/test/pattern.mp4?quality=A" + } + ], + "nativeEvents": [ + { + "name": "loadedmetadata", + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadeddata", + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "time": 0, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "playing", + "time": 0.0050301, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": false, + "readyState": 4 + }, + { + "name": "pause", + "time": 0.6299045, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "time": 3.0064516129032257, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "time": 3.0086859, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=B", + "paused": true, + "readyState": 4 + }, + { + "name": "loadedmetadata", + "time": 3.0086859, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 3 + }, + { + "name": "loadeddata", + "time": 3.0086859, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 3 + }, + { + "name": "canplay", + "time": 3.0086859, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 3 + }, + { + "name": "seeking", + "time": 3.0086859, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "time": 3.0086859, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "canplay", + "time": 3.0086859, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeking", + "time": 3.0086859, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 2 + }, + { + "name": "canplay", + "time": 3.0086859, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + }, + { + "name": "seeked", + "time": 3.0140197, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "paused": true, + "readyState": 4 + } + ], + "time": 3.0140197, + "paused": true, + "mediaError": null, + "source": "http://127.0.0.1:8084/test/pattern.mp4?quality=A", + "readyState": 4, + "mobileBranch": false, + "maxTouchPoints": 0, + "chapters": [ + { + "start": "0", + "end": "2", + "duration": "2", + "title": "Opening" + }, + { + "start": "2", + "end": "6", + "duration": "4", + "title": "Middle" + }, + { + "start": "6", + "end": "8", + "duration": "2", + "title": "Ending" + } + ] + } + } + ] + }, + { + "file": "refactor/.cache/chapter05-main-artifacts-report.json", + "sha256": "91181db968552e06b19b12e8f3b66c5011c7ea282dd880dfe804293e4049f890", + "resultDir": "refactor/.cache/chapter05-main-artifacts-results", + "stats": { + "startTime": "2026-09-11T20:11:31.886Z", + "duration": 70587.243, + "expected": 102, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "manifest": { + "kind": "artplayer-browser-test", + "resources": { + "/candidate/artplayer.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer\\dist\\artplayer.js" + }, + "sha256": "dc1460b77abdd401158e098b25a1abf280c53bb92d401fc387a4864dc7b18357", + "bytes": 208555 + }, + "/compiled/artplayer.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer\\dist\\artplayer.js" + }, + "sha256": "dc1460b77abdd401158e098b25a1abf280c53bb92d401fc387a4864dc7b18357", + "bytes": 208555, + "aliasOf": "/candidate/artplayer.js" + }, + "/uncompiled/artplayer/index.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer\\dist\\artplayer.js" + }, + "sha256": "dc1460b77abdd401158e098b25a1abf280c53bb92d401fc387a4864dc7b18357", + "bytes": 208555, + "aliasOf": "/candidate/artplayer.js" + }, + "/candidate/artplayer-plugin-chapter.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer-plugin-chapter\\dist\\artplayer-plugin-chapter.js" + }, + "sha256": "179c3ea90ddc85da27b46f000110e32d464dfa5c8c394e98316dc1b75d6f2a72", + "bytes": 5197 + }, + "/compiled/artplayer-plugin-chapter.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer-plugin-chapter\\dist\\artplayer-plugin-chapter.js" + }, + "sha256": "179c3ea90ddc85da27b46f000110e32d464dfa5c8c394e98316dc1b75d6f2a72", + "bytes": 5197, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/uncompiled/artplayer-plugin-chapter/index.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer-plugin-chapter\\dist\\artplayer-plugin-chapter.js" + }, + "sha256": "179c3ea90ddc85da27b46f000110e32d464dfa5c8c394e98316dc1b75d6f2a72", + "bytes": 5197, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/published/artplayer.js": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "/published/artplayer-plugin-chapter.js": { + "source": { + "kind": "npm-release", + "version": "1.1.0", + "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==", + "member": "package/dist/artplayer-plugin-chapter.js" + }, + "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0", + "bytes": 4973 + }, + "/test/pattern.mp4": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.mp4" + }, + "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "bytes": 251538 + }, + "/test/pattern.webm": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.webm" + }, + "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f", + "bytes": 162073 + }, + "/test/audio-tone.m4a": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/audio-tone.m4a" + }, + "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "bytes": 132436 + }, + "/test/declaration-cues.vtt": { + "source": { + "kind": "test-subtitles", + "file": "test/browser/media/declaration-cues.vtt" + }, + "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704", + "bytes": 54 + }, + "/test/thumbnail-grid.svg": { + "source": { + "kind": "test-thumbnail-grid", + "file": "test/browser/media/thumbnail-grid.svg" + }, + "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6", + "bytes": 14969 + }, + "/test/legacy-safe-area.js": { + "source": { + "kind": "frozen-own-source", + "file": "test/helpers/legacy-safe-area.js", + "commit": "ccf77c4e" + }, + "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a", + "bytes": 795 + }, + "/assets/sample/video.mp4": { + "source": { + "kind": "docs-media", + "file": "docs/assets/sample/video.mp4" + }, + "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980", + "bytes": 5818706 + }, + "/test/performance.js": { + "source": { + "kind": "adapted-baseline-fixture", + "file": "refactor/fixtures/performance.js" + }, + "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500", + "bytes": 8994 + } + } + }, + "cases": [ + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "published core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "published core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "candidate core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "candidate core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.8499755859375, + "width": 1859.8499755859375, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "published core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "published core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.8499755859375, + "width": 1859.8499755859375, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "candidate core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "candidate core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0086513, + "restoredTime": 0.0010377, + "historicalReset": true + } + }, + { + "title": "published core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0070767, + "restoredTime": 0.0017232, + "historicalReset": true + } + }, + { + "title": "published core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0076287, + "restoredTime": 3.0083888, + "historicalReset": false + } + }, + { + "title": "candidate core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0076277, + "restoredTime": 3.0096744, + "historicalReset": false + } + }, + { + "title": "candidate core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + } + ] + }, + { + "file": "refactor/.cache/chapter05-legacy-artifacts-report.json", + "sha256": "4f7d172034fe174f6edd9d8f33447523c6e3d07e7a2c7b0a8f848990aa5ca818", + "resultDir": "refactor/.cache/chapter05-legacy-artifacts-results", + "stats": { + "startTime": "2026-09-11T20:12:43.686Z", + "duration": 84047.924, + "expected": 102, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "manifest": { + "kind": "artplayer-browser-test", + "resources": { + "/candidate/artplayer.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer\\dist\\artplayer.legacy.js" + }, + "sha256": "49781a25f3d680c7964eec066b792966da71f03ccc3e7936cd5e0e9563e83008", + "bytes": 212814 + }, + "/compiled/artplayer.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer\\dist\\artplayer.legacy.js" + }, + "sha256": "49781a25f3d680c7964eec066b792966da71f03ccc3e7936cd5e0e9563e83008", + "bytes": 212814, + "aliasOf": "/candidate/artplayer.js" + }, + "/uncompiled/artplayer/index.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer\\dist\\artplayer.legacy.js" + }, + "sha256": "49781a25f3d680c7964eec066b792966da71f03ccc3e7936cd5e0e9563e83008", + "bytes": 212814, + "aliasOf": "/candidate/artplayer.js" + }, + "/candidate/artplayer-plugin-chapter.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer-plugin-chapter\\dist\\artplayer-plugin-chapter.legacy.js" + }, + "sha256": "dade919ed044cbf46ac16e505f538f86a86edccf177da2e14d79d111559d4bef", + "bytes": 5229 + }, + "/compiled/artplayer-plugin-chapter.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer-plugin-chapter\\dist\\artplayer-plugin-chapter.legacy.js" + }, + "sha256": "dade919ed044cbf46ac16e505f538f86a86edccf177da2e14d79d111559d4bef", + "bytes": 5229, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/uncompiled/artplayer-plugin-chapter/index.js": { + "source": { + "kind": "artifact", + "file": "D:\\github\\ArtPlayer\\packages\\artplayer-plugin-chapter\\dist\\artplayer-plugin-chapter.legacy.js" + }, + "sha256": "dade919ed044cbf46ac16e505f538f86a86edccf177da2e14d79d111559d4bef", + "bytes": 5229, + "aliasOf": "/candidate/artplayer-plugin-chapter.js" + }, + "/published/artplayer.js": { + "source": { + "kind": "npm-release", + "version": "5.4.0", + "integrity": "sha512-2B+plbx8N2yNsjK4nJU3+EOG8TULm1LRZk/QPkWRAMEX2Ee/MSnZG/WJYz8kcoZxZuLKcQ3uXifqLuPxZOH29A==", + "member": "package/dist/artplayer.js" + }, + "sha256": "f1db1fa3406aa6d41baa7c554749429a8e79f99d56a794bde23345eb9c07573f", + "bytes": 134037 + }, + "/published/artplayer-plugin-chapter.js": { + "source": { + "kind": "npm-release", + "version": "1.1.0", + "integrity": "sha512-ji66Lr2K2S+OjFMuMby3yq+pefWlOC51Sbpop/DIr2N6w3F0smrF+YZbshN1Dy8/Tx1TYpT7N6WkkZWy5Jix1w==", + "member": "package/dist/artplayer-plugin-chapter.js" + }, + "sha256": "c2aaee11bf1db765433b01d9f8dd3978e41fa4d39655db00ebd03fc0be3e35e0", + "bytes": 4973 + }, + "/test/pattern.mp4": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.mp4" + }, + "sha256": "0ad1d7ad286aec6e0fa9e27fc1e487e7277df2e603e30040fb942365763d0233", + "bytes": 251538 + }, + "/test/pattern.webm": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/pattern.webm" + }, + "sha256": "9d3c2b3dec9581a599de2d6732992ef7846790e0d1368e6e131bd339b39e984f", + "bytes": 162073 + }, + "/test/audio-tone.m4a": { + "source": { + "kind": "generated-media", + "file": "test/browser/media/audio-tone.m4a" + }, + "sha256": "83e6672b880b5d1c97093b1e26bdc40221c0b279615f40e99dbf9d2ade7b4d56", + "bytes": 132436 + }, + "/test/declaration-cues.vtt": { + "source": { + "kind": "test-subtitles", + "file": "test/browser/media/declaration-cues.vtt" + }, + "sha256": "5d149d4e641ce41cbb83376835c03daf1fb89f3b9f568fa59e064d51e2b57704", + "bytes": 54 + }, + "/test/thumbnail-grid.svg": { + "source": { + "kind": "test-thumbnail-grid", + "file": "test/browser/media/thumbnail-grid.svg" + }, + "sha256": "bb3f1ec9895d37def77ca4b192d3cd73577a2668558cc99de1588f511d65d3e6", + "bytes": 14969 + }, + "/test/legacy-safe-area.js": { + "source": { + "kind": "frozen-own-source", + "file": "test/helpers/legacy-safe-area.js", + "commit": "ccf77c4e" + }, + "sha256": "ce0368618ef6363b78271b8bcc7973abd0478e797cc464ddd912929e6dfa501a", + "bytes": 795 + }, + "/assets/sample/video.mp4": { + "source": { + "kind": "docs-media", + "file": "docs/assets/sample/video.mp4" + }, + "sha256": "30a2de667ba267b6bc605edcee1c4bd728c048ed76f500ea0e73d1f1a6f8f980", + "bytes": 5818706 + }, + "/test/performance.js": { + "source": { + "kind": "adapted-baseline-fixture", + "file": "refactor/fixtures/performance.js" + }, + "sha256": "2318f39bdb5f3a3348d755cb4335907ae4adc944be3a435839c1bba201e81500", + "bytes": 8994 + } + } + }, + "cases": [ + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "published core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "published core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 41.99896240234375, + "right": 1853.4696655273438, + "width": 1811.470703125, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "candidate core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.006451, + "restoredTime": 3.006451, + "historicalReset": false + } + }, + { + "title": "candidate core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.8499755859375, + "width": 1859.8499755859375, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "published core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "published core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.8499755859375, + "width": 1859.8499755859375, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "candidate core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0064516129032257, + "restoredTime": 3.0064516129032257, + "historicalReset": false + } + }, + { + "title": "candidate core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.5, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 654.5, + "right": 711.5, + "top": 645, + "bottom": 665 + }, + "thumbnail": { + "left": 633, + "right": 733, + "top": 579, + "bottom": 639 + }, + "progress": { + "left": 10, + "right": 1356, + "top": 695, + "bottom": 703 + } + } + }, + { + "title": "published core + published chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0070732, + "restoredTime": 0.0022925, + "historicalReset": true + } + }, + { + "title": "published core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "published core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0174943, + "restoredTime": 0.0019927, + "historicalReset": true + } + }, + { + "title": "published core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "published core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 1877.46875, + "width": 1859.46875, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + published chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0088498, + "restoredTime": 3.0114388, + "historicalReset": false + } + }, + { + "title": "candidate core + published chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + published chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: long titles retain text within a narrow player", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "long-chapter-layout": { + "left": 18, + "right": 372, + "width": 354, + "progressLeft": 18, + "progressRight": 372, + "text": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers.", + "dataset": "A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers. A long chapter title with complete metadata retained for consumers." + } + }, + { + "title": "candidate core + candidate chapter: quality switch preserves chapter/thumbnail interactions", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "quality-position": { + "before": 3.0075061, + "restoredTime": 3.0087456, + "historicalReset": false + } + }, + { + "title": "candidate core + candidate chapter: fullscreenWeb keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "candidate core + candidate chapter: fullscreen keeps hover geometry and exits cleanly", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [], + "chapter-fullscreen-layout": { + "title": { + "left": 611.5, + "right": 668.484375, + "top": 597, + "bottom": 617 + }, + "thumbnail": { + "left": 590, + "right": 690, + "top": 531, + "bottom": 591 + }, + "progress": { + "left": 10, + "right": 1270, + "top": 647, + "bottom": 655 + } + } + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "trusted taps seek through chapters before and after web fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "chromium", + "status": "passed", + "retry": 0, + "browser": "153.0.8010.12", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "firefox", + "status": "passed", + "retry": 0, + "browser": "155.0", + "platform": "win32", + "errors": [] + }, + { + "title": "factory, registration, input normalization and safe title text", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + }, + { + "title": "explicit source update and core-owned destruction", + "engine": "webkit", + "status": "passed", + "retry": 0, + "browser": "26.6", + "platform": "win32", + "errors": [] + } + ] + } + ], + "logs": [ + { + "file": "refactor/.cache/chapter05-build.log", + "sha256": "b88f24d6f608e9ad9ff3c85fac8f47bc1073ecb4e1bf313b467f594e56b63e3a", + "bytes": 1453 + }, + { + "file": "refactor/.cache/chapter05-ci.log", + "sha256": "667c058fdb944f7e9e5db74e4bfc84eed465fdf76b4c2d60741f5fd32506752b", + "bytes": 63241 + } + ], + "cacheNote": "Reports include inline screenshot bodies. Traces and failure screenshots are preserved in resultDir; raw report path attachments may still reference the shared output directory. Cache is local; rerun if missing.", + "remaining": [ + "CHAPTER-TIMING-01 native/driver/core timing attribution", + "Physical device evidence for supported mobile/fullscreen behavior", + "PKG-CHAPTER-06 installed distribution and 8082 example" + ] +} diff --git a/refactor/changes/2026-09-12-PKG-CHAPTER-05-combinations.md b/refactor/changes/2026-09-12-PKG-CHAPTER-05-combinations.md new file mode 100644 index 000000000..fa37e1426 --- /dev/null +++ b/refactor/changes/2026-09-12-PKG-CHAPTER-05-combinations.md @@ -0,0 +1,60 @@ +# PKG-CHAPTER-05:进度、清晰度、缩略图与全屏组合 + +状态:进行中。起点 d18c5456,工作区已核实干净;Chapter-04 和 CORE-22 前置已完成。 + +现有 chapter.spec.js 的全面章节用例固定旧核心。新增组合覆盖旧/新核心、旧/新 chapter, +使用本地固定 MP4 和缩略图网格验证真实 hover、seek、清晰度切换、显式章节更新、原生/ +网页全屏进出与缩略图/标题位置。触摸部分在 390px、hasTouch 与 iPhone UA 模拟环境中 +要求可信 touchstart,并检查进入/退出网页全屏后的章节 seek;不声称已在 iPhone 真机运行。 + +本阶段先保留实际测试结果;任何失败先核对原生能力、旧版行为、测试夹具与候选实现, +不改断言使候选假通过。物理设备和未覆盖场景继续作为未验收范围。 + +## 已确认的显示缺陷与源码修复 + +390px 的长标题在新旧插件都超过进度条右边界;真实页面显示文字被播放器外边缘直接裁切。 +先加入候选不越界的失败断言以及旧版溢出观察,三引擎分别两种核心:6 个候选失败、 +6 个历史观察通过。style.less 现使用 max-width:100%、border-box、overflow:hidden 和 +text-overflow:ellipsis,把显示宽度交给样式层;progress.ts/chapters.ts、同步 update、 +数组原地变更、事件以及声明不变。完整 textContent 与 data-title 仍按原样保留。 +正式 main/legacy/module 与 docs/compiled 已由 yarn build artplayer-plugin-chapter 生成。 + +## 夹具修正与尚未关闭的时序疑点 + +第一轮 48 项:36 个全屏/触摸组合通过,12 个 quality 场景失败。10 个卡在 hover 结束 +章节:鼠标点在展开的 quality 菜单覆盖区域,尚未进入进度条;两个旧核心 WebKit 的 +位置回到 0,已有 progress-quality.spec.js 复现该历史缺陷。该旧版观察保持显式分支, +候选核心仍必须恢复切换前位置,没有用旧缺陷放宽候选断言。 + +第二轮先移动鼠标,仍 12 项失败:候选菜单有焦点保持;旧 core CSS 原本只有 opacity=0 +和 pointer-events:none,并无 visibility:hidden,toBeHidden 不能表示它的视觉关闭。 +第三轮外部 Pause 按钮点击后,候选菜单退出,旧核心的 toBeHidden 仍失败。对照实际 +发布包样式后改为检查 opacity=0,选择前等待 opacity=1,随后仍要求真实标题与缩略图 +可见、位置不重叠。所有首轮报告均保留;这是菜单交互前提修正,不是删除章节断言。 + +第三轮 24 项中长标题全部通过;另有候选核心 WebKit 的 quality restart 等待超时。 +修正菜单后的一轮 12 quality 为 11 通过/1 失败,最后候选核心+候选章节仍在 7 秒 +轮询内未看到 restart,而 afterEach 已记录 restart、新源、恢复位置、readyState=4, +没有媒体错误。来源可能涉及原生 seek/事件耗时,尚未证明;不据此修改核心或提高超时, +也不因后续某次通过关闭这个疑点。原始事件序列和失败 trace 继续保留。 + +本次未安装依赖、未更改发布版本。触摸模拟不代替物理 Safari/iOS/Android,完整分发与 +8082 demo 属于 Chapter-06。任务仍 doing,源码修复与证据以独立 checkpoint 提交。 +回退本检查点会移除长标题显示限制,恢复旧显示;已发布的 npm 包没有发生变化。 + +## 本检查点验证结果 + +- 正式 main 和 legacy 分别 102 项通过,无重试/跳过;使用明确产物映射,核心与章节包 + 的浏览器服务指纹均与实际 dist 字节一致,不是冒用源码运行结果。 +- 每组包含原有 42 项章节用例与新增 60 项组合。新增部分为 12 个长标题(含 6 个历史 + 溢出观察)、12 个 quality/缩略图(含两项旧核心 WebKit 位置归零观察)、24 个真实元素/ + 网页全屏、12 个触摸模拟。不能把所有通过项都称为没有历史缺陷的候选验收。 +- 完整 CI 599 项(550 单元、14 工程、35 基线)通过;严格源码/类型消费、声明一致性、 + lint 通过,保留一条已知生成声明 warning。最终新增测试定向 lint 通过。 +- 长标题修复后截图已实际查看:文字省略且标题框在播放器内,完整内容保持在 DOM 数据。 +- 全部阶段包括 48 项首轮、12 项菜单修正失败、12 项长标题先红后绿、24 项第三轮 + 17 通过/7 失败及最后 quality 11/1 均保留,见 [冻结证据](../baselines/chapter-combinations-checkpoint.json)。 + +CHAPTER-LAYOUT-01 已按具体显示范围关闭;CHAPTER-TIMING-01 仍 open。最终产物两轮 +通过不解释早期时序超时,不能以它们消除待查证据。当前 217 项,70 done、3 doing、144 todo。 +下一步可推进独立包;Chapter-05 的物理设备和时序缺口继续随风险台账接续,不阻塞全局目标。 diff --git a/refactor/plan.md b/refactor/plan.md index c823704ab..42c7ad3b6 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -4,7 +4,7 @@ 基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 217 项,范围 22 个包及工作区/示例。 -状态:todo 145 / doing 2 / blocked 0 / done 70 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 +状态:todo 144 / doing 3 / blocked 0 / done 70 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。 @@ -138,7 +138,7 @@ | PKG-CHAPTER-02 | artplayer-plugin-chapter
建立特有行为与错误测试 | PKG-CHAPTER-01, ENG-03, ENG-05 | 区间重叠/空列表/边界 seek、hover 标题和 update 用例 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言;修正 BASE-TYPE-02 的可选参数声明并补正反例 | M | done | | PKG-CHAPTER-03 | artplayer-plugin-chapter
以 TypeScript 拆分内部职责与资源 | PKG-CHAPTER-02, ENG-07 | 以严格 TS 拆分区间计算、进度 DOM、事件生命周期与样式注入;公开声明消费在 04 闭环 | 不依赖新核心方法或大范围设置重构;旧 API/事件和资源通过,必要适配限包内 | M | done | | PKG-CHAPTER-04 | artplayer-plugin-chapter
迁移自有源码和公开类型 | PKG-CHAPTER-03, ENG-04, ENG-06 | 承接 03 的自有源码 TS 化,完善公开 Chapters/Option/Result 与 update 推导,关闭声明模块解析和旧消费差异 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容;处理 BASE-TYPE-01/03,保持运行时和新旧 TS 模块解析消费 | M | done | -| PKG-CHAPTER-05 | artplayer-plugin-chapter
验证新旧核心和组合 | PKG-CHAPTER-04, CORE-22 | chapter + quality/thumbnail、移动和全屏进度场景 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | M | todo | +| PKG-CHAPTER-05 | artplayer-plugin-chapter
验证新旧核心和组合 | PKG-CHAPTER-04, CORE-22 | chapter + quality/thumbnail、移动和全屏进度场景 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | M | doing | | PKG-CHAPTER-06 | artplayer-plugin-chapter
验证分发并同步文档 | PKG-CHAPTER-05, ENG-07 | chapter.js 示例、产物和变更记录 | tarball 入口/资源、类型、8082 demo 和 README 一致,有回退记录 | M | todo | ## 5 包迁移:artplayer-plugin-ambilight @@ -468,6 +468,7 @@ - PKG-CHAPTER-02: [记录](changes/2026-09-10-PKG-CHAPTER-02-tests.md) [记录](baselines/chapter-validation.json) - PKG-CHAPTER-03: [记录](changes/2026-09-10-PKG-CHAPTER-03-typescript-modules.md) [记录](baselines/chapter-migration-validation.json) - PKG-CHAPTER-04: [记录](changes/2026-09-10-PKG-CHAPTER-04-public-types.md) [记录](baselines/chapter-types-validation.json) +- PKG-CHAPTER-05: [记录](changes/2026-09-12-PKG-CHAPTER-05-combinations.md) [记录](baselines/chapter-combinations-checkpoint.json) - PKG-AUDIO-01: [记录](changes/2026-09-12-PKG-AUDIO-01-contract.md) [记录](baselines/audio-track-contract.md) [记录](baselines/audio-track-release.json) - PKG-AUDIO-02: [记录](changes/2026-09-12-PKG-AUDIO-02-tests.md) [记录](audio-validation.md) [记录](baselines/audio-validation.json) - PKG-AUDIO-03: [记录](changes/2026-09-12-PKG-AUDIO-03-lifecycle.md) [记录](baselines/audio-lifecycle-validation.json) diff --git a/refactor/progress.md b/refactor/progress.md index f85f785fc..fae58b2f9 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,20 @@ # 进度与证据 +## 当前实施:Chapter-05 组合验证与长标题修复检查点 + +正式 main/legacy 的章节基础及新旧核心/插件组合各 102 项通过,完整 CI 599 项通过。 +新增覆盖清晰度/缩略图、窄屏长标题、真实元素与网页全屏,以及 390px 可信触摸模拟。 +长标题超出进度条的显示缺陷已通过 CSS 修复,完整文本与公开接口不变;截图已查看。 + +保留菜单交互前提修正的失败记录、旧核心 WebKit 位置归零观察。一个早期 WebKit +quality restart 等待超时的确切原因尚未证明,CHAPTER-TIMING-01 保持 open;后续 +两种产物通过不能关闭它。触摸模拟没有替代手机真机。Chapter-05 仍 doing,尚未执行 06。 + +当前 217 项:70 done、3 doing、144 todo。Audio-05、HLS-SDK-01 的风险仍保留。 +本批为本地 checkpoint,未推送或发布。后续优先推进独立包的源码/契约迁移,并在有效 +环境中接续开放的媒体/设备验证。详见 [本次变更](changes/2026-09-12-PKG-CHAPTER-05-combinations.md) +和 [冻结证据](baselines/chapter-combinations-checkpoint.json)。 + ## 当前实施:Audio-05 恢复修复与真实缓冲检查点 已修复旧核心时间零 seek 后候选音频漏恢复,严格 TS 与公开接口不变;三格式 Node 97 项、 diff --git a/refactor/risk-table.md b/refactor/risk-table.md index 4806ba7c0..547603721 100644 --- a/refactor/risk-table.md +++ b/refactor/risk-table.md @@ -133,3 +133,5 @@ | CORE-SOURCE-01 | resolved / 已复现 | 候选核心连续切源丢失原播放意图 | CORE-24 | | AUDIO-RESUME-01 | resolved / 已复现 | WebKit 旧核心切源后候选音频保持暂停 | PKG-AUDIO-05 | | AUDIO-BUFFER-01 | open / 已复现 | Windows WebKit 原生媒体无法在受限响应下推进至真实缓冲 | PKG-AUDIO-05 | +| CHAPTER-LAYOUT-01 | resolved / 已复现 | 长章节标题超出窄播放器进度条宽度 | PKG-CHAPTER-05 | +| CHAPTER-TIMING-01 | open / 已复现 | Windows WebKit 清晰度切换曾在等待窗口内未见 restart,稍后状态恢复 | PKG-CHAPTER-05 | diff --git a/refactor/risks.json b/refactor/risks.json index bd1125d0b..58aa0c3f1 100644 --- a/refactor/risks.json +++ b/refactor/risks.json @@ -2791,6 +2791,43 @@ ], "compatibleResolution": "保留真实 waiting 断言;使用独立原生对照和其他实际支持环境/输入继续验证,不将没有播放推进的诊断当成缓冲通过,也不凭此改变插件 API 或否定真实 Safari 支持。", "closureCriteria": "受影响的缓冲/恢复得到真实媒体证据;与原生能力和测试夹具差异分开,发布环境的剩余范围经显式处理。" + }, + { + "id": "CHAPTER-LAYOUT-01", + "title": "长章节标题超出窄播放器进度条宽度", + "confirmation": "reproduced", + "status": "resolved", + "owners": [ + "PKG-CHAPTER-05" + ], + "evidence": [ + "refactor/baselines/chapter-combinations-checkpoint.json", + "test/browser/chapter-combinations.spec.js" + ], + "compatibleResolution": "样式限制最大宽度并省略溢出显示,保留完整 textContent/data-title、DOM hooks 和原有章节数据语义。", + "closureCriteria": "两种核心三引擎窄屏候选标题不越界,历史溢出观察和完整文本保留断言通过。", + "resolutionEvidence": [ + "refactor/baselines/chapter-combinations-checkpoint.json", + "packages/artplayer-plugin-chapter/src/style.less", + "packages/artplayer-plugin-chapter/ARCHITECTURE.md" + ], + "resolutionRationale": "先复现 6 个候选失败并保留截图,CSS 修复后正式 main/legacy 分别 12 个长标题用例通过(各含 6 历史溢出观察)。实际浏览器输入与产物指纹已冻结,API/类型未改变。" + }, + { + "id": "CHAPTER-TIMING-01", + "title": "Windows WebKit 清晰度切换曾在等待窗口内未见 restart,稍后状态恢复", + "confirmation": "reproduced", + "status": "open", + "owners": [ + "PKG-CHAPTER-05" + ], + "evidence": [ + "refactor/baselines/chapter-combinations-checkpoint.json", + "test/browser/chapter-combinations.spec.js", + "refactor/changes/2026-09-12-PKG-CHAPTER-05-combinations.md" + ], + "compatibleResolution": "记录原生事件和绝对/相对时序,进一步区分媒体驱动耗时、夹具和核心源操作;未证明原因前不改核心、不扩大超时或重复到绿灯。", + "closureCriteria": "确认先前超时的来源并有对应可靠回归;后续单次通过不足以关闭。" } ] } diff --git a/refactor/tasks.json b/refactor/tasks.json index 80dbea19e..dc40ef0bf 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -1351,11 +1351,14 @@ "PKG-CHAPTER-04", "CORE-22" ], - "status": "todo", + "status": "doing", "risk": "M", "deliverable": "chapter + quality/thumbnail、移动和全屏进度场景", "acceptance": "最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成", - "evidence": [] + "evidence": [ + "changes/2026-09-12-PKG-CHAPTER-05-combinations.md", + "baselines/chapter-combinations-checkpoint.json" + ] }, { "id": "PKG-CHAPTER-06", diff --git a/test/browser/chapter-combinations.spec.js b/test/browser/chapter-combinations.spec.js new file mode 100644 index 000000000..d8348e176 --- /dev/null +++ b/test/browser/chapter-combinations.spec.js @@ -0,0 +1,194 @@ +import { devices } from '@playwright/test' +import { expect, test } from './fixtures.js' + +async function openChapter(page, core, chapter) { + await page.goto(`/test/player.html?core=${core}&chapter=${chapter}`) + await page.evaluate(() => { + document.querySelector('.player').style.cssText = 'width:min(640px,100%);height:300px' + window.chapterEvents = [] + window.chapterMediaEvents = [] + window.art = new window.Artplayer({ + container: '.player', + url: '/test/pattern.mp4?quality=B', + muted: true, + fullscreen: true, + fullscreenWeb: true, + miniProgressBar: true, + quality: [ + { html: 'Quality A', url: '/test/pattern.mp4?quality=A' }, + { html: 'Quality B', url: '/test/pattern.mp4?quality=B', default: true }, + ], + thumbnails: { url: '/test/thumbnail-grid.svg', number: 100, column: 10, width: 100, height: 60 }, + plugins: [window.artplayerPluginChapter({ chapters: [ + { start: 0, end: 2, title: 'Opening' }, + { start: 2, end: 6, title: 'Middle' }, + { start: 6, end: 8, title: 'Ending' }, + ] })], + }) + for (const name of ['restart', 'seek', 'fullscreen', 'fullscreenWeb']) + window.art.on(name, value => window.chapterEvents.push({ name, value })) + for (const name of ['loadedmetadata', 'loadeddata', 'canplay', 'seeking', 'seeked', 'playing', 'pause', 'error']) + window.art.video.addEventListener(name, () => window.chapterMediaEvents.push({ name, time: window.art.currentTime, source: window.art.video.currentSrc, paused: window.art.video.paused, readyState: window.art.video.readyState })) + document.querySelector('#play').onclick = () => window.art.play() + document.querySelector('#pause').onclick = () => window.art.pause() + }) + await expect.poll(() => page.evaluate(() => window.art.isReady)).toBe(true) + await expect(page.locator('.art-chapter')).toHaveCount(3) +} + +async function hoverChapter(page, percentage, text) { + const inner = page.locator('.art-control-progress-inner') + const box = await inner.boundingBox() + const x = Math.round(box.x + box.width * percentage) + await page.mouse.move(x, box.y + box.height / 2) + await expect(page.locator('.art-chapter-title')).toHaveText(text) + await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1') + await expect(page.locator('.art-control-thumbnails')).toBeVisible() + await expect.poll(() => page.evaluate(() => window.art.controls.thumbnails.style.backgroundImage)).not.toBe('') + const layout = await page.evaluate(() => { + const rect = (element) => { + const box = element.getBoundingClientRect() + return { left: box.left, right: box.right, top: box.top, bottom: box.bottom } + } + return { + title: rect(document.querySelector('.art-chapter-title')), + thumbnail: rect(window.art.controls.thumbnails), + progress: rect(document.querySelector('.art-control-progress-inner')), + } + }) + expect(layout.title.left).toBeGreaterThanOrEqual(layout.progress.left - 1) + expect(layout.title.right).toBeLessThanOrEqual(layout.progress.right + 1) + expect(layout.thumbnail.bottom).toBeLessThanOrEqual(layout.title.top) + return { box, x, layout } +} + +test.afterEach(async ({ page }, testInfo) => { + const state = await page.evaluate(() => ({ + events: window.chapterEvents, + nativeEvents: window.chapterMediaEvents, + time: window.art?.currentTime, + paused: window.art?.video.paused, + mediaError: window.art?.video.error?.code || null, + source: window.art?.video.currentSrc, + readyState: window.art?.video.readyState, + mobileBranch: window.Artplayer?.utils.isMobile, + maxTouchPoints: navigator.maxTouchPoints, + chapters: [...document.querySelectorAll('.art-chapter')].map(node => ({ ...node.dataset })), + })).catch(error => ({ error: error.message })) + await testInfo.attach('chapter-combination-state', { contentType: 'application/json', body: JSON.stringify(state) }) + if (!page.isClosed()) + await page.evaluate(() => window.art?.destroy()) +}) + +for (const core of ['published', 'candidate']) { + for (const chapter of ['published', 'candidate']) { + test(`${core} core + ${chapter} chapter: long titles retain text within a narrow player`, async ({ page }, testInfo) => { + await page.setViewportSize({ width: 390, height: 844 }) + await openChapter(page, core, chapter) + const fullTitle = 'A long chapter title with complete metadata retained for consumers. '.repeat(4) + await page.evaluate(fullTitle => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: fullTitle }] }), fullTitle) + const box = await page.locator('.art-control-progress-inner').boundingBox() + await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2) + await expect(page.locator('.art-chapter-title')).toHaveText(fullTitle.trim()) + await expect(page.locator('.art-chapter-title')).toHaveCSS('opacity', '1') + const layout = await page.locator('.art-chapter-title').evaluate((element) => { + const title = element.getBoundingClientRect() + const progress = element.parentElement.getBoundingClientRect() + return { left: title.left, right: title.right, width: title.width, progressLeft: progress.left, progressRight: progress.right, text: element.textContent, dataset: element.parentElement.querySelector('.art-chapter').dataset.title } + }) + await testInfo.attach('long-chapter-layout', { contentType: 'application/json', body: JSON.stringify(layout) }) + await testInfo.attach('long-chapter-title', { contentType: 'image/png', body: await page.screenshot() }) + expect(layout.text).toBe(fullTitle.trim()) + expect(layout.dataset).toBe(fullTitle.trim()) + expect(layout.left).toBeGreaterThanOrEqual(layout.progressLeft - 1) + if (chapter === 'published') + expect(layout.right).toBeGreaterThan(layout.progressRight) + else + expect(layout.right).toBeLessThanOrEqual(layout.progressRight + 1) + }) + + test(`${core} core + ${chapter} chapter: quality switch preserves chapter/thumbnail interactions`, async ({ page, browserName }, testInfo) => { + await openChapter(page, core, chapter) + await page.locator('#play').click() + await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThan(0.2) + await page.locator('#pause').click() + const { box, x } = await hoverChapter(page, 0.375, 'Middle') + await page.mouse.click(x, box.y + box.height / 2) + await expect.poll(() => page.evaluate(() => !window.art.video.seeking)).toBe(true) + const time = await page.evaluate(() => window.art.currentTime) + expect(time).toBeCloseTo(3, 1) + await expect.poll(() => page.locator('.art-chapter .art-progress-played').nth(1).evaluate(node => Number.parseFloat(node.style.width))).toBeCloseTo(25, 0) + expect(await page.locator('.art-chapter .art-progress-played').evaluateAll(nodes => [nodes[0].style.width, nodes[2].style.width])).toEqual(['100%', '0px']) + await page.locator('.art-control-quality').hover() + await expect(page.locator('.art-control-quality .art-selector-list')).toHaveCSS('opacity', '1') + await page.locator('.art-control-quality .art-selector-item').filter({ hasText: 'Quality A' }).click() + await expect.poll(() => page.evaluate(() => window.art.url.includes('quality=A'))).toBe(true) + await expect.poll(() => page.evaluate(() => window.chapterEvents.filter(event => event.name === 'restart').map(event => event.value))).toEqual(['/test/pattern.mp4?quality=A']) + await expect.poll(() => page.evaluate(() => !window.art.video.seeking && window.art.video.readyState >= 2)).toBe(true) + const restoredTime = await page.evaluate(() => window.art.currentTime) + const historicalReset = core === 'published' && browserName === 'webkit' + if (historicalReset) + expect(restoredTime).toBeLessThan(0.05) + else + expect(restoredTime).toBeCloseTo(time, 1) + await testInfo.attach('quality-position', { contentType: 'application/json', body: JSON.stringify({ before: time, restoredTime, historicalReset }) }) + expect(await page.evaluate(() => window.art.video.paused)).toBe(true) + await expect(page.locator('.art-control-quality .art-selector-value')).toHaveText('Quality A') + await page.locator('#pause').click() + await expect(page.locator('.art-control-quality .art-selector-list')).toHaveCSS('opacity', '0') + await hoverChapter(page, 0.85, 'Ending') + await page.evaluate(() => window.art.plugins.artplayerPluginChapter.update({ chapters: [{ start: 0, end: Infinity, title: 'Updated after quality' }] })) + await hoverChapter(page, 0.5, 'Updated after quality') + await testInfo.attach('chapter-quality-thumbnail', { contentType: 'image/png', body: await page.locator('.art-video-player').screenshot() }) + await page.locator('#play').click() + await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeGreaterThan(restoredTime + 0.2) + expect(await page.evaluate(() => window.art.video.error)).toBeNull() + }) + + for (const mode of ['fullscreenWeb', 'fullscreen']) { + test(`${core} core + ${chapter} chapter: ${mode} keeps hover geometry and exits cleanly`, async ({ page }, testInfo) => { + await openChapter(page, core, chapter) + if (mode === 'fullscreenWeb') + await page.evaluate(() => { window.Artplayer.FULLSCREEN_WEB_IN_BODY = true }) + const control = page.locator(`.art-control-${mode}`) + const before = await page.locator('.art-control-progress-inner').boundingBox() + await control.click() + await expect.poll(() => page.evaluate(mode => window.art[mode], mode)).toBe(true) + const { box, layout } = await hoverChapter(page, 0.5, 'Middle') + expect(box.width).toBeGreaterThanOrEqual(before.width) + await testInfo.attach(`chapter-${mode}`, { contentType: 'image/png', body: await page.screenshot() }) + await testInfo.attach('chapter-fullscreen-layout', { contentType: 'application/json', body: JSON.stringify(layout) }) + await control.click() + await expect.poll(() => page.evaluate(mode => window.art[mode], mode)).toBe(false) + expect(await page.evaluate(() => window.art.template.$container.contains(window.art.template.$player))).toBe(true) + await hoverChapter(page, 0.99, 'Ending') + expect(await page.evaluate(mode => window.chapterEvents.filter(event => event.name === mode).map(event => event.value), mode)).toEqual([true, false]) + }) + } + + test.describe(`${core} core + ${chapter} chapter touch emulation`, () => { + test.use({ viewport: { width: 390, height: 844 }, hasTouch: true, userAgent: devices['iPhone 13'].userAgent }) + test('trusted taps seek through chapters before and after web fullscreen', async ({ page }, testInfo) => { + await openChapter(page, core, chapter) + expect(await page.evaluate(() => window.Artplayer.utils.isMobile)).toBe(true) + await page.evaluate(() => { + window.chapterTouches = [] + window.art.template.$progress.addEventListener('touchstart', event => window.chapterTouches.push({ trusted: event.isTrusted, touches: event.touches.length })) + }) + for (const fullscreen of [false, true, false]) { + if (await page.evaluate(() => window.art.fullscreenWeb) !== fullscreen) + await page.locator('.art-control-fullscreenWeb').tap() + await expect.poll(() => page.evaluate(() => window.art.fullscreenWeb)).toBe(fullscreen) + const progress = await page.locator('.art-control-progress-inner').boundingBox() + await page.touchscreen.tap(progress.x + progress.width * 0.375, progress.y + progress.height / 2) + await expect.poll(() => page.evaluate(() => window.art.currentTime)).toBeCloseTo(3, 1) + await expect.poll(() => page.evaluate(() => !window.art.video.seeking)).toBe(true) + await expect(page.locator('.art-chapter')).toHaveCount(3) + } + expect(await page.evaluate(() => window.chapterTouches)).toEqual(Array.from({ length: 3 }, () => ({ trusted: true, touches: 1 }))) + expect(await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth)).toBe(true) + await testInfo.attach('chapter-touch-emulation', { contentType: 'image/png', body: await page.screenshot() }) + }) + }) + } +}